kolibrios-fun/programs/media/zsea/backgrnd.inc
Marat Zakiyanov (Mario79) 7f3443a0b9 zSea - background image to the proportional stretching with inscribing
git-svn-id: svn://kolibrios.org@2236 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-09-25 03:34:00 +00:00

397 lines
8.3 KiB
PHP

;---------------------------------------------------------------------
; ÓÑÒÀÍÎÂÈÒÜ ÔÎÍ
background:
cmp [soi],0
je .end
cmp [bgrmode],dword 2
ja .stretch_crop
mov ecx,[img_width] ; øèðèíà
test ecx,ecx
jz .end
mov edx,[img_high] ; âûñîòà 
test edx,edx
jz .end
mcall 15,1 ; set size
mov esi,ecx
imul esi,edx
lea esi,[esi*3]
mov ecx,[soi]
xor edx,edx
cmp [img_resolution],24
je @f
push dword image_file
call [convert_Conv_24b]
mov ecx,[raw_pointer_2]
add ecx,44
mcall 15,5 ;15,5 set data
mcall 68,13,[raw_pointer_2]
jmp .set_mode
@@:
mcall 15,5 ; 15,5 set data
.set_mode:
mcall 15,4,[bgrmode] ; 15,4 set mode
dec ebx ; 15,3 redraw background
mcall
.end:
ret
;---------------------------------------------------------------------
.stretch_crop:
cmp [bgrmode],dword 3
jne .stretch_inscribe
xor eax,eax
mov [stretch_start_coordinates],eax
mcall 14
mov ebx,eax
and eax,0xffff
inc eax
mov [screen_high],eax
shr ebx,16
inc ebx
mov [screen_width],ebx
xchg eax,ebx
call calculate_relation
mov [screen_relation],eax
mov eax,[img_width]
mov ebx,[img_high]
call calculate_relation
mov [picture_relation],eax
cmp eax,[screen_relation]
jb @f
; Y = Yimg
; X = Yimg*Xscreen/Yscreen
mov eax,[img_high]
mov [stretch_img_high],eax
mov eax,[img_high]
imul eax,dword [screen_width]
mov ebx,[screen_high]
call integer_division
mov [stretch_img_width],eax
jmp .continue
@@:
; X = Ximg
; Y = Ximg*Yscreen/Xscreen
mov eax,[img_width]
mov [stretch_img_width],eax
mov eax,[img_width]
imul eax,dword [screen_high]
mov ebx,[screen_width]
call integer_division
mov [stretch_img_high],eax
.continue:
mov eax,[Stretch_Crop_Corner]
mov ebx,eax
shr eax,16
shl eax,2
mov eax,[eax+call_to_calculate_stretch_start_coordinates_Y]
call eax
and ebx,0xffff
shl ebx,2
mov ebx,[ebx+call_to_calculate_stretch_start_coordinates_X]
call ebx
mov ebx,[screen_width]
shl ebx,16
add ebx,[screen_high]
mov eax,[stretch_img_width]
shl eax,16
add eax,[stretch_img_high]
push dword eax ; eax - crop size
push dword 0 ; edi - background color
push dword 1 ; esi - filtering
push dword 0 ; edx - scaling mode
push dword [stretch_start_coordinates] ; ecx - start_coordinates
push ebx ; ebx - new_size
push dword image_file ; eax - convert data table
call [Scaling_Start]
call background_1
ret
;---------------------------------------------------------------------
.stretch_inscribe:
xor eax,eax
mov [stretch_start_coordinates],eax
mcall 14
mov ebx,eax
and eax,0xffff
inc eax
mov [screen_high],eax
shr ebx,16
inc ebx
mov [screen_width],ebx
xchg eax,ebx
call calculate_relation
mov [screen_relation],eax
mov eax,[img_width]
mov ebx,[img_high]
call calculate_relation
mov [picture_relation],eax
cmp eax,[screen_relation]
ja @f
; Y = Yimg
; X = Yimg*Xscreen/Yscreen
mov eax,[screen_high] ;[img_high]
mov [stretch_img_high],eax
mov eax,[screen_high] ;[img_high]
imul eax,dword [img_width] ;[screen_width]
mov ebx,[img_high] ;[screen_high]
call integer_division
mov [stretch_img_width],eax
jmp .continue_1
@@:
; X = Ximg
; Y = Ximg*Yscreen/Xscreen
mov eax,[screen_width] ;[img_width]
mov [stretch_img_width],eax
mov eax,[screen_width] ;[img_width]
imul eax,dword [img_high] ;[screen_high]
mov ebx,[img_width] ;[screen_width]
call integer_division
mov [stretch_img_high],eax
.continue_1:
; mov ebx,[screen_width]
; shl ebx,16
; add ebx,[screen_high]
mov ebx,[stretch_img_width]
shl ebx,16
add ebx,[stretch_img_high]
push dword 0 ; eax - crop size
push dword 0 ; edi - background color
push dword 1 ; esi - filtering
push dword 0 ; edx - scaling mode
push dword [stretch_start_coordinates] ; ecx - start_coordinates
push ebx ; ebx - new_size
push dword image_file ; eax - convert data table
call [Scaling_Start]
mov eax,[raw_pointer_2]
mov [crop_raw_pointer],eax
mov [crop_raw_pointer_2],eax
mov eax,[raw_pointer_2]
mov eax,[eax+12] ;overall depth of the pixel
cmp al,24
je @f
push dword crop_image_file
call [convert_Conv_24b]
mov ecx,[raw_pointer_2]
mcall 68,13
@@:
mov ecx,[screen_width]
imul ecx,[screen_high]
lea ecx,[ecx*3]
add ecx,44
; mcall 68,20,,[crop_raw_pointer_2]
; mov [crop_raw_pointer_2],eax
mov eax,[crop_raw_pointer_2]
mov [crop_raw_pointer],eax
mcall 68,12
mov [crop_raw_pointer_2],eax
; fill of color
sub ecx,44
mov edi,eax
add edi,44
mov eax,0xaaaaaa
cld
@@:
stosb
ror eax,8
stosb
ror eax,8
stosb
rol eax,16
sub ecx,2
loop @b
; copy of data
mov eax,[screen_width]
sub eax,[stretch_img_width]
mov ebx,eax
lea eax,[eax*3]
shr ebx,1
lea ebx,[ebx*3]
mov edi,[screen_high]
sub edi,[stretch_img_high]
shr edi,1
imul edi,[screen_width]
lea edi,[edi*3]
add edi,[crop_raw_pointer_2]
add edi,44
add edi,ebx
mov esi,[crop_raw_pointer]
add esi,44
mov ebx,[stretch_img_width]
lea ebx,[ebx*3]
mov ecx,[stretch_img_high]
@@:
push ecx
mov ecx,ebx
rep movsb
pop ecx
add edi,eax
loop @b
; header
mov esi,[crop_raw_pointer]
mov edi,[crop_raw_pointer_2]
mov ecx,44/4
rep stosd
mcall 68,13,[crop_raw_pointer]
;set the background
mov eax,[crop_raw_pointer_2]
mov ebx,[screen_width]
mov [eax+4],ebx
mov ebx,[screen_high]
mov [eax+8],ebx
mov ecx,[screen_width] ; øèðèíà
test ecx,ecx
jz @f
mov edx,[screen_high] ; âûñîòà 
test edx,edx
jz @f
mcall 15,1 ; set size
mov esi,ecx
imul esi,edx
lea esi,[esi*3]
xor edx,edx
mov ecx,[crop_raw_pointer_2]
add ecx,44
mcall 15,5 ;15,5 set data
xor ecx,ecx
inc ecx
mcall 15,4 ; 15,4 set mode
dec ebx ; 15,3 redraw background
mcall
@@:
mcall 68,13,[crop_raw_pointer_2]
ret
;---------------------------------------------------------------------
call_to_calculate_stretch_start_coordinates_X:
dd calculate_stretch_start_coordinates_XL
dd calculate_stretch_start_coordinates_XC
dd calculate_stretch_start_coordinates_XR
;---------------------------------------------------------------------
call_to_calculate_stretch_start_coordinates_Y:
dd calculate_stretch_start_coordinates_YU
dd calculate_stretch_start_coordinates_YC
dd calculate_stretch_start_coordinates_YD
;---------------------------------------------------------------------
calculate_stretch_start_coordinates_XC:
xor ecx,ecx
.1:
mov eax,[img_width]
sub eax,[stretch_img_width]
test ecx,ecx
jnz @f
shr eax,1
@@:
mov [stretch_start_coordinates.x],ax
calculate_stretch_start_coordinates_XL:
ret
;---------------------------------------------------------------------
calculate_stretch_start_coordinates_XR:
xor ecx,ecx
inc ecx
jmp calculate_stretch_start_coordinates_XC.1
;---------------------------------------------------------------------
calculate_stretch_start_coordinates_YC:
xor ecx,ecx
.1:
mov eax,[img_high]
sub eax,[stretch_img_high]
test ecx,ecx
jnz @f
shr eax,1
@@:
mov [stretch_start_coordinates.y],ax
calculate_stretch_start_coordinates_YU:
ret
;---------------------------------------------------------------------
calculate_stretch_start_coordinates_YD:
xor ecx,ecx
inc ecx
jmp calculate_stretch_start_coordinates_YC.1
;---------------------------------------------------------------------
background_1:
mov ecx,[screen_width] ;[crop_img_width] ; øèðèíà
test ecx,ecx
jz .end
mov edx,[screen_high] ;[crop_img_high] ; âûñîòà 
test edx,edx
jz .end
mcall 15,1 ; set size
.1:
mov esi,ecx
imul esi,edx
lea esi,[esi*3]
mov ecx,[raw_pointer_2] ;[soi]
mov eax,[ecx+28]
add ecx,eax
xor edx,edx
mov eax,[raw_pointer_2]
mov eax,[eax+12] ;overall depth of the pixel
cmp al,24
je @f
mov eax,[raw_pointer_2]
mov [crop_raw_pointer],eax
push dword crop_image_file
call [convert_Conv_24b]
mov ecx,[crop_raw_pointer_2]
add ecx,44
mcall 15,5 ;15,5 set data
mcall 68,13,[crop_raw_pointer_2]
jmp .set_mode
@@:
mcall 15,5 ; 15,5 set data
.set_mode:
xor ecx,ecx
inc ecx
; mov ecx,[bgrmode]
mcall 15,4 ; 15,4 set mode
dec ebx ; 15,3 redraw background
mcall
.end:
mov ecx,[raw_pointer_2]
mcall 68,13
ret
;---------------------------------------------------------------------