kolibrios/programs/media/zsea/zoom.inc
Marat Zakiyanov (Mario79) d250796055 zSea rc4
1) background image to the proportional stretching with cropping
2) optimize scaling.obj
3) scaling.obj and convert.obj support RAW header to all cases is now

git-svn-id: svn://kolibrios.org@2163 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-09-07 16:34:44 +00:00

735 lines
14 KiB
PHP
Raw Blame History

;---------------------------------------------------------------------
invert_left_to_right:
mov ebx,3
jmp rotate_counter_clockwise.1
;---------------------------------------------------------------------
invert_up_to_down:
mov ebx,4
jmp rotate_counter_clockwise.1
;---------------------------------------------------------------------
rotate_clockwise:
mov ebx,1
jmp rotate_counter_clockwise.1
;---------------------------------------------------------------------
rotate_counter_clockwise:
mov ebx,2
.1:
mov eax,[soi]
test eax,eax
jz still
mov eax,[RAW1_pointer]
test eax,eax
jz @f
cmp [Total_Repeat_N],1
ja still
@@:
push ebx
call proc_position_correct
mov eax,[vertical_position_coorect]
mov ebx,[horizontal_position_coorect]
mov [horizontal_position_coorect],eax
mov [vertical_position_coorect],ebx
pop ebx
; mov eax,image_file
; ebx - direction
; 1 - clockwise, 2 - counter clockwise
; 3 - Left&Right, 4 - Up&Down
push ebx
push dword image_file
; call [plugin_rotate]
call [rotate_Start]
mov ebx,[raw_pointer]
mov eax,[ebx+4]
mov [img_width],eax
mov eax,[ebx+8]
mov [img_high],eax
call convert.img_resolution_ok
jmp kopen.1
;---------------------------------------------------------------------
calculate_arrows_offset:
mov eax,[arrows_offset]
imul eax,[scaling_mode]
mov ebx,100
xor edx,edx
div ebx
mov [scroll_bar_data_vertical.ar_offset],eax
mov [scroll_bar_data_horizontal.ar_offset],eax
ret
;---------------------------------------------------------------------
no_scaling:
mov eax,scaling_mode
cmp [eax],dword 100
je still
.1:
mov [eax],dword 100
mov [zoom_factors],dword zoom_factors.100
mov eax,[eax]
jmp zoom_plus.2
;---------------------------------------------------------------------
scaling:
mov eax,[soi]
test eax,eax
jz still
mov eax,scaling_mode
xor ebx,ebx
cmp [eax],ebx ;dword 0
je still
mov [eax],ebx ;dword 0
mov [zoom_factors],dword zoom_factors.1
call .1
call draw_zoom_factors
jmp still
;---------------------------
.compens_x:
call .get_x_y
xor ecx,ecx
mov cx,[wa_high_1]
imul eax,ecx
xor edx,edx
div ebx
ret
;---------------------------
.compens_y:
call .get_x_y
xchg eax,ebx
xor ecx,ecx
mov cx,[wa_width_1]
imul eax,ecx
xor edx,edx
div ebx
ret
;---------------------------
.get_x_y:
mov ebx,[raw_pointer]
mov eax,[ebx+4]
mov ebx,[ebx+8]
ret
;---------------------------
.fill_for_L_R:
cmp [no_fill],1
je @f
pusha
mov ebx,[image_start_coordinates]
mov ecx,ebx
shl ecx,16
mov bx,ax
mov cx,[wa_high_1]
mcall 13,,,[fill_color] ;0xffffff
mov ax,bx
ror ebx,16
add bx,ax
add bx,[wa_width_2]
mov ax,[wa_width_1]
sub ax,bx
rol ebx,16
mov bx,ax
mcall 13,,,[fill_color] ;0xffffff
popa
@@:
ret
;---------------------------
.fill_for_U_D:
cmp [no_fill],1
je @f
pusha
mov ebx,[image_start_coordinates]
mov ecx,ebx
shl ecx,16
mov cx,ax
mov bx,[wa_width_1]
mcall 13,,,[fill_color] ;0xffffff
mov ax,cx
ror ecx,16
add cx,ax
add cx,[wa_high_2]
mov ax,[wa_high_1]
add ax,28 ;50
sub ax,cx
rol ecx,16
mov cx,ax
mcall 13,,,[fill_color] ;0xffffff
popa
@@:
ret
;---------------------------
.1:
call .get_x_y
cmp eax,ebx
jb .y
;---------------------------
.x:
call .compens_y
cmp ax,[wa_high_1]
jbe @f
call .compens_x
mov [wa_width_2],ax
jmp .4
@@:
mov [wa_high_2],ax
jmp .4
;---------------------------
.y:
call .compens_x
cmp ax,[wa_width_1]
jbe @f
call .compens_y
mov [wa_high_2],ax
jmp .4
@@:
mov [wa_width_2],ax
;---------------------------
.4:
mov bx,[wa_width_2]
shl ebx,16
mov bx,[wa_high_2]
xor ecx,ecx
.5:
; mov eax,ebx
; and eax,0xffff
; mov [test1],eax
; mov eax,ebx
; shr eax,16
; mov [test2],eax
; mov eax,ecx
; and eax,0xffff
; mov [test3],eax
; mov eax,ecx
; shr eax,16
; mov [test4],eax
; mov eax,image_file
; mov edx,[scaling_mode]
movzx esi,byte [filtering_flag]
; mov edi,[background_color]
push dword 0 ; eax - crop size
push dword [background_color] ; edi - background color
push esi ; esi - filtering
push dword [scaling_mode] ; edx - scaling mode
push ecx ; ecx - start_coordinates
push ebx ; ebx - new_size
push dword image_file ; eax - convert data table
; pusha
; mcall 26,9
; mov [test1],eax
; popa
call [Scaling_Start]
; pusha
; mcall 26,9
; mov ebx,[test1]
; sub eax,ebx
; cmp [test2],0
; je @f
; add eax,[test2]
; shr eax,1
; cmp eax,[test3]
; jbe @f
; mov [test3],eax
;@@:
; mov [test2],eax
; popa
mov ecx,ebx
mov edx,[image_start_coordinates]
mov eax,edx
shl eax,16
mov ax,cx
mov [scroll_bar_data_vertical.y],eax
mov eax,edx
mov ebx,ecx
shr ebx,16
mov ax,bx
mov [scroll_bar_data_horizontal.x],eax
; call correct_cur_area
; movzx eax,[wa_width_1]
; mov [test1],eax
; movzx eax,[wa_width_2]
; mov [test2],eax
; movzx eax,[wa_high_1]
; mov [test3],eax
; movzx eax,[wa_high_2]
; mov [test4],eax
xor eax,eax
mov ax,[wa_width_1]
sub ax,[wa_width_2]
shr ax,1
test ax,ax
jz @f
shl eax,16
add edx,eax
shr eax,16
call .fill_for_L_R
@@:
mov ax,[wa_high_1]
sub ax,[wa_high_2]
shr ax,1
test ax,ax
jz @f
add edx,eax
call .fill_for_U_D
@@:
; mov esi,[img_resolution]
; cmp [img_resolution_2],15
; jne @f
; mov esi,15
;@@:
mov eax,[raw_pointer_2]
mov esi,[eax+12]
mov eax,[raw_pointer]
mov edi,[eax+20]
add edi,eax
; mov edi,[img_palette]
xor ebp,ebp
mov ebx,[raw_pointer_2]
mov eax,[ebx+28]
add ebx,eax
mov eax,ecx
test ax,ax
jz .no_draw ;@f
shr eax,16
test eax,eax
jz .no_draw ;@f
; cmp [filtering_flag],0
; je @f
; cmp esi,8
; jne @f
; mov esi,24
;@@:
mcall 65
.no_draw:
; mov eax,ecx
; shr eax,16
; mov [test1],eax
;
; mov eax,ecx
; and eax,0xffff
; mov [test2],eax
;
; mov eax,edx
; shr eax,16
; mov [test3],eax
;
; mov eax,edx
; and eax,0xffff
; mov [test4],eax
call draw_file_name_to_work_area
mcall 68,13,[raw_pointer_2]
xor eax,eax
mov ax,[wa_width_2]
mov ebx,[img_width]
; imul eax,100
call calculate_relation
mov [zoom_auto_factor],eax
ret
;---------------------------------------------------------------------
calculate_relation:
; relation = X*100/Y
; eax = eax*100/ebx
; <EFBFBD><EFBFBD><EFBFBD> = <EFBFBD><EFBFBD><EFBFBD> * 100
shl eax,2 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 4
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
integer_division:
; eax = eax/ebx
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
; shl edx,1
; cmp ebx,edx
; jb @f
; inc eax
;@@:
ret
;---------------------------------------------------------------------
calculation_next_value_plus:
mov ebx,[zoom_auto_factor]
mov ecx,zoom_factors.min
sub ecx,4
@@:
add ecx,4
cmp ecx,dword zoom_factors.max
jae .max
mov eax,[ecx]
cmp eax,ebx
jb @r
@@:
mov eax,zoom_factors
mov [eax],ecx
; jmp zoom_plus.1
ret
.max:
mov ecx,dword zoom_factors.max
jmp @r
;---------------------------------------------------------------------
calculation_next_value_minus:
mov ebx,[zoom_auto_factor]
mov ecx,zoom_factors.max
add ecx,4
@@:
sub ecx,4
cmp ecx,dword zoom_factors.min
jbe .min
mov eax,[ecx]
cmp eax,ebx
ja @r
@@:
mov eax,zoom_factors
mov [eax],ecx
; jmp zoom_plus.1
ret
.min:
mov ecx,dword zoom_factors.min
jmp @r
;---------------------------------------------------------------------
proc_position_correct:
mov [position_coorect],1
mov eax,[scroll_bar_data_vertical.max_area]
xor ebx,ebx
mov bx,[wa_high_1]
shr ebx,1
shl eax,8
add ebx,[scroll_bar_data_vertical.position]
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
mov [vertical_position_coorect],eax
mov eax,[scroll_bar_data_horizontal.max_area]
xor ebx,ebx
mov bx,[wa_width_1]
shr ebx,1
shl eax,8
add ebx,[scroll_bar_data_horizontal.position]
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
mov [horizontal_position_coorect],eax
ret
;---------------------------------------------------------------------
zoom_plus:
; cmp [scaling_mode],dword 0
mov eax,[scaling_mode]
test eax,eax
; jz no_scaling.1
; jz calculation_next_value_plus
jnz @f
call calculation_next_value_plus
jmp .1
@@:
; jne @f
; mov [scaling_mode],dword 100
; mov [zoom_factors],dword zoom_factors.100
; call draw_zoom_factors
; jmp red
;@@:
mov eax,zoom_factors
cmp [eax],dword zoom_factors.max
jae still
add [eax],dword 4
.1:
mov eax,[eax]
mov eax,[eax]
.2:
mov [scaling_mode],eax
mov [correct_scrollbar_100_flag],1
call calculate_arrows_offset
call proc_position_correct
call drawimage
call set_draw_scrollbar_all
call draw_scrollbars
call set_nodraw_scrollbar_all
call draw_zoom_factors
jmp still
zoom_all:
;******************************
mov eax,wa_width_1
mov eax,[eax]
push eax
mov eax,wa_high_1
mov eax,[eax]
push eax
;******************************
cmp [position_coorect],0
je .correct_end
mov [position_coorect],0
mov eax,[scroll_bar_data_vertical.max_area]
; xor ebx,ebx
; mov bx,[wa_high_1]
; shr ebx,1
; add eax,ebx ;[scroll_bar_data_vertical.cur_area]
shl eax,8
mov ebx,[vertical_position_coorect]
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
; shr eax,8
xor ebx,ebx
mov bx,[wa_high_1]
shr ebx,1
cmp eax,ebx
jae @f
xor eax,eax
jmp .position_vertical_correct
@@:
sub eax,ebx
.position_vertical_correct:
mov [scroll_bar_data_vertical.position],eax
mov eax,[scroll_bar_data_horizontal.max_area]
; xor ebx,ebx
; mov bx,[wa_width_1]
; shr ebx,1
; add eax,ebx ;[scroll_bar_data_horizontal.cur_area]
shl eax,8
mov ebx,[horizontal_position_coorect]
test ebx,ebx
jnz @f
inc ebx
@@:
xor edx,edx
div ebx
; shr eax,8
xor ebx,ebx
mov bx,[wa_width_1]
shr ebx,1
cmp eax,ebx
jae @f
xor eax,eax
jmp .position_horizontal_correct
@@:
sub eax,ebx
.position_horizontal_correct:
mov [scroll_bar_data_horizontal.position],eax
.correct_end:
;****************************************************************************
; Vertical SCROLLBAR
; At a case of resizing of the window
; Check the position of a runner has crossed a limit
;****************************************************************************
mov eax,[scroll_bar_data_vertical.max_area]
xor ebx,ebx
mov bx,[wa_high_1]
cmp eax,ebx
ja @f
xor eax,eax
jmp .p_5
@@:
sub eax,ebx ;[scroll_bar_data_vertical.cur_area]
cmp eax,[scroll_bar_data_vertical.position]
jae @f
.p_5:
mov [scroll_bar_data_vertical.position],eax
@@:
;****************************************************************************
; Horizontal SCROLLBAR
; At a case of resizing of the window
; Check the position of a runner has crossed a limit
;****************************************************************************
mov eax,[scroll_bar_data_horizontal.max_area]
xor ebx,ebx
mov bx,[wa_width_1]
cmp eax,ebx
ja @f
xor eax,eax
jmp .p_6
@@:
sub eax,ebx ;[scroll_bar_data_horizontal.cur_area]
cmp eax,[scroll_bar_data_horizontal.position]
jae @f
.p_6:
mov [scroll_bar_data_horizontal.position],eax
@@:
;****************************************************************************
mov eax,[scroll_bar_data_horizontal.max_area]
mov ebx,[scroll_bar_data_vertical.max_area]
sub eax,[scroll_bar_data_horizontal.position] ;100
sub ebx,[scroll_bar_data_vertical.position] ;100
xor ecx,ecx
mov cx,word [wa_width_1]
cmp eax,ecx
jbe @f
xor eax,eax
mov ax,[wa_width_1]
@@:
mov [wa_width_2],ax
mov ecx,eax
shl ecx,16
xchg eax,ebx
xor edx,edx
mov dx,word [wa_high_1]
cmp eax,edx
jbe @f
xor eax,eax
mov ax,[wa_high_1]
@@:
mov [wa_high_2],ax
mov cx,ax
call correct_cur_area
mov ebx,ecx
push eax
mov eax,[scroll_bar_data_vertical.max_area]
cmp eax,[scroll_bar_data_vertical.cur_area]
jbe .horizontal ;@f
mov ax,[wa_width_1]
sub ax,[scroll_bar_data_vertical.size_x]
mov [wa_width_1],ax
cmp ax,[wa_width_2]
jae .horizontal
mov [wa_width_2],ax
.horizontal:
mov eax,[scroll_bar_data_horizontal.max_area]
cmp eax,[scroll_bar_data_horizontal.cur_area]
jbe .finish ;@f
mov ax,[wa_high_1]
sub ax,[scroll_bar_data_horizontal.size_y]
mov [wa_high_1],ax
cmp ax,[wa_high_2]
jae .finish
mov [wa_high_2],ax
.finish: ;@@:
pop eax
mov cx,[wa_width_2]
shl ecx,16
mov cx,[wa_high_2]
call correct_cur_area
mov ebx,ecx
mov eax,[scroll_bar_data_horizontal.position]
; imul eax,100
; <EFBFBD><EFBFBD><EFBFBD> = <EFBFBD><EFBFBD><EFBFBD> * 100
shl eax,2 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 4
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
push ebx
mov ebx,[scaling_mode]
xor edx,edx
div ebx
; shl edx,1
; cmp edx,ebx
; jb @f
; inc eax
;@@:
pop ebx
mov ecx,eax
shl ecx,16
mov eax,[scroll_bar_data_vertical.position]
; imul eax,100
; <EFBFBD><EFBFBD><EFBFBD> = <EFBFBD><EFBFBD><EFBFBD> * 100
shl eax,2 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 4
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
lea eax,[eax+eax*4] ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> 5
push ebx
mov ebx,[scaling_mode]
xor edx,edx
div ebx
; shl edx,1
; cmp edx,ebx
; jb @f
; inc eax
;@@:
pop ebx
mov cx,ax
call scaling.5
;******************************
pop eax
mov ebx,wa_high_1
mov [ebx],eax
pop eax
mov ebx,wa_width_1
mov [ebx],eax
;******************************
ret
;---------------------------------------------------------------------
zoom_minus:
; cmp [scaling_mode],dword 0
mov eax,[scaling_mode]
test eax,eax
; jz no_scaling.1
; jz calculation_next_value_minus
jnz @f
call calculation_next_value_minus
jmp zoom_plus.1
@@:
; je no_scaling.1
; jne @f
; mov [scaling_mode],dword 100
; mov [zoom_factors],dword zoom_factors.100
; call draw_zoom_factors
; jmp red
;@@:
mov eax,zoom_factors
cmp [eax],dword zoom_factors.min
jbe still
sub [eax],dword 4
jmp zoom_plus.1
;---------------------------------------------------------------------