kolibrios-fun/programs/media/zsea/draw_img.inc
Marat Zakiyanov (Mario79) d7b0867c02 zSea - advanced image viewer for KolibriOS
v.1.0 rс3 12.06.2011

git-svn-id: svn://kolibrios.org@1951 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-06-11 22:16:26 +00:00

469 lines
12 KiB
PHP

;;****************************************************************************
;****************************************************************************
; Draw output part of the image and SCROLLBAR's
;****************************************************************************
;****************************************************************************
drawimage:
call get_window_param
;mov edx,5*65536+50
mov edx,0*65536+28
mov esi,[img_resolution] ;24
cmp esi,32
ja .exit_error ;.exit
mov edi,[img_palette]
;****************************************************************************
; Calculation of sizes of an output part of the image
;****************************************************************************
xor eax,eax
mov [draw_SB],al
mov [draw_SB1],al
mov eax,[window_width]
; sub eax,9
mov [wa_width],ax
mov [wa_width_1],ax
mov [wa_width_2],ax
mov ebx,[img_width]
test ebx,ebx
jz .exit_error ;.exit
cmp ax,bx
jae @f
sub ax,[scroll_bar_data_vertical.size_x]
mov [draw_SB],1
jmp .size_y
@@:
mov ax,bx
.size_y:
mov ebx,[img_high]
test ebx,ebx
jz .exit_error ;.exit
shl eax,16
add eax,[window_high]
cmp ax,50-22
jbe @f
sub ax,50-22
@@:
mov [wa_high],ax
mov [wa_high_1],ax
mov [wa_high_2],ax
cmp ax,bx
jae @f
sub ax,[scroll_bar_data_horizontal.size_y]
mov [draw_SB1],1
jmp .continue
@@:
mov ax,bx
.continue:
mov ecx,eax
;****************************************************************************
;
;****************************************************************************
cmp [draw_SB1],1
je @f
cmp [draw_SB],0
je @f
ror ecx,16
add cx,[scroll_bar_data_vertical.size_x]
rol ecx,16
@@:
cmp [draw_SB],1
je @f
cmp [draw_SB1],0
je @f
add cx,[scroll_bar_data_horizontal.size_y]
@@:
; call check_8bit_less
;.continue_1:
;****************************************************************************
; Prepare of data for SCROLLBAR's
;****************************************************************************
call correct_cur_area
mov eax,[img_width]
push edx
imul eax,[scaling_mode]
mov ebx,100
xor edx,edx
div ebx
mov [scroll_bar_data_horizontal.max_area],eax
pop edx
mov ebx,[img_high]
push eax edx
mov eax,ebx
imul eax,[scaling_mode]
mov ebx,100
xor edx,edx
div ebx
mov ebx,eax
pop edx eax
mov [scroll_bar_data_vertical.max_area],ebx
; cmp [scaling_mode],100
; jne .continue_1
call correct_width
call correct_cur_area
cmp [correct_w],0
je @f
call correct_high
call correct_cur_area
jmp .continue_1
@@:
call correct_high
call correct_cur_area
cmp [correct_h],0
je @f
call correct_width
call correct_cur_area
@@:
; call check_8bit_less
.continue_1:
; mov eax,[window_high]
; sub eax,55
; ror eax,16
; mov ax,dx
; rol eax,16
mov eax,edx
shl eax,16
mov ax,cx
mov [scroll_bar_data_vertical.y],eax
; mov eax,[window_width]
; sub eax,10
; ror eax,16
; ror edx,16
; mov ax,dx
; rol edx,16
; rol eax,16
mov eax,edx
mov ebx,ecx
shr ebx,16
mov ax,bx
mov [scroll_bar_data_horizontal.x],eax
; mov eax,edx
; mov ebx,ecx
; shr ebx,16
; shr eax,16
; add ax,bx
mov eax,[window_width]
sub ax,[scroll_bar_data_vertical.size_x]
; sub ax,4
mov [scroll_bar_data_vertical.start_x],ax
; mov eax,edx
; add ax,cx
mov eax,[window_high]
sub ax,[scroll_bar_data_horizontal.size_y]
; sub ax,4
mov [scroll_bar_data_horizontal.start_y],ax
;****************************************************************************
; Check necessity prepare of data
;****************************************************************************
mov eax,[scroll_bar_data_horizontal.max_area]
mov ebx,[scroll_bar_data_vertical.max_area]
cmp ebx,[scroll_bar_data_vertical.cur_area]
ja @f
cmp eax,[scroll_bar_data_horizontal.cur_area]
ja @f
mov ebp,0
mov ebx,[soi]
jmp .end
@@:
;****************************************************************************
; Calculate offset of next row data relative to previous row data
;****************************************************************************
mov ebp,eax
mov ebx,ecx
shr ebx,16
sub ebp,ebx
imul ebp,esi
mov eax,ebp
shr ebp,3
;****************************************************************************
; 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]
sub eax,[scroll_bar_data_vertical.cur_area]
cmp eax,[scroll_bar_data_vertical.position]
jae @f
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]
sub eax,[scroll_bar_data_horizontal.cur_area]
cmp eax,[scroll_bar_data_horizontal.position]
jae @f
mov [scroll_bar_data_horizontal.position],eax
@@:
;****************************************************************************
; Calculate offset from a beginning of a image
;****************************************************************************
mov ebx,[scroll_bar_data_horizontal.max_area]
imul ebx,esi
mov eax,ebx
shr ebx,3
imul ebx,[scroll_bar_data_vertical.position]
mov eax,[scroll_bar_data_horizontal.position]
imul eax,esi
shr eax,3
add ebx,eax
add ebx,[soi]
.end:
cmp [soi],0
je .exit_error ;.exit
;****************************************************************************
; Draw image
;****************************************************************************
cmp [img_resolution_2],15
jne @f
mov esi,15
@@:
mov [image_start_coordinates],edx
mov [image_draw_size],ecx
cmp [scaling_mode],dword 100
je .100
cmp [scaling_mode],dword 0
jne @f
call scaling.1
ret
@@:
mov [correct_scrollbar_100_flag],0
call zoom_all
ret
.100:
mov al,[correct_scrollbar_100_flag]
test al,al
jnz @r
;******************************
mov eax,wa_width_1
mov eax,[eax]
push eax
mov eax,wa_high_1
mov eax,[eax]
push eax
;******************************
rol ecx,16
mov eax,[scroll_bar_data_vertical.max_area]
cmp eax,[scroll_bar_data_vertical.cur_area]
mov ax,[wa_width_1]
jbe @f
sub ax,[scroll_bar_data_vertical.size_x]
mov [wa_width_1],ax
@@:
sub ax,cx
mov [wa_width_2],cx
ror ecx,16
shr ax,1
shl eax,16
add edx,eax
shr eax,16
test eax,eax
jz @f
call scaling.fill_for_L_R
@@:
mov eax,[scroll_bar_data_horizontal.max_area]
cmp eax,[scroll_bar_data_horizontal.cur_area]
mov ax,[wa_high_1]
jbe @f
sub ax,[scroll_bar_data_horizontal.size_y]
mov [wa_high_1],ax
@@:
sub ax,cx
mov [wa_high_2],cx
shr ax,1
add edx,eax
test eax,eax
jz @f
call scaling.fill_for_U_D
@@:
;******************************
mcall 65, ;[soi]
;******************************
pop eax
mov ebx,wa_high_1
mov [ebx],eax
pop eax
mov ebx,wa_width_1
mov [ebx],eax
;******************************
.exit:
call draw_file_name_to_work_area
ret
.exit_error:
xor eax,eax
mov [scroll_bar_data_vertical.cur_area],eax
mov [scroll_bar_data_horizontal.cur_area],eax
ret
;****************************************************************************
draw_file_name_to_work_area:
mov eax,[check1+32]
test eax,10b
jz @f
mov ebx,[file_name_length]
mov eax,ebx
lea ebx,[ebx*5]
add ebx,eax
add ebx,13 shl 16
mcall 13,,<59,11>,0xe5e5e5
mcall 4,<16,60>,0x80000000,file_name,,0xe5e5e5
@@:
ret
;****************************************************************************
;check_8bit_less:
; cmp esi,8
; jae .no_8bit_less
; mov eax,ecx
; ror eax,16
;; mov ebx,eax
; xor ecx,ecx
;
; inc ecx
; shr ax,1
;
; cmp esi,4
; je @f
;
; inc ecx
; shr ax,1
;
; cmp esi,2
; je @f
;
; inc ecx
; shr ax,1
;@@:
;; test ebx,ecx
;; jz @f
;; inc eax
;;@@:
; shl ax,cl
; rol eax,16
; mov ecx,eax
;.no_8bit_less:
; ret
;****************************************************************************
correct_width:
mov [correct_w],0
mov ebx,[scroll_bar_data_vertical.max_area]
cmp ebx,[scroll_bar_data_vertical.cur_area]
jbe @f
mov eax,ecx
shr eax,16
push eax
mov ax,[scroll_bar_data_vertical.size_x]
sub [wa_width],ax
pop eax
cmp [wa_width],ax
jae @f
ror ecx,16
mov cx,[wa_width]
rol ecx,16
mov [correct_w],1
@@:
ret
;****************************************************************************
correct_high:
mov [correct_h],0
mov eax,[scroll_bar_data_horizontal.max_area]
cmp eax,[scroll_bar_data_horizontal.cur_area]
jbe @f
push eax
mov ax,[scroll_bar_data_horizontal.size_y]
sub [wa_high],ax
pop eax
cmp [wa_high],cx
jae @f
mov cx,[wa_high]
mov [correct_h],1
@@:
ret
;****************************************************************************
correct_cur_area:
mov eax,ecx
xor ebx,ebx
mov bx,ax
mov [scroll_bar_data_vertical.cur_area],ebx
shr eax,16
mov [scroll_bar_data_horizontal.cur_area],eax
ret
;****************************************************************************
; Check draw vertical scrollbar
;****************************************************************************
draw_scrollbars:
xor eax,eax
mov [draw_scrollbar_counter],eax
mov eax,[scroll_bar_data_vertical.max_area]
cmp eax,[scroll_bar_data_vertical.cur_area]
jbe @f
cmp [scroll_bar_data_vertical.cur_area],0
je @f
push dword scroll_bar_data_vertical
call [scrollbar_ver_draw]
; draw_scroll_bar_vertical scroll_bar_data_vertical
inc [draw_scrollbar_counter]
@@:
;****************************************************************************
; Check draw horizontal scrollbar
;****************************************************************************
mov eax,[scroll_bar_data_horizontal.max_area]
cmp eax,[scroll_bar_data_horizontal.cur_area]
jbe @f
cmp [scroll_bar_data_horizontal.cur_area],0
je @f
push dword scroll_bar_data_horizontal
call [scrollbar_hor_draw]
; draw_scroll_bar_horizontal scroll_bar_data_horizontal
inc [draw_scrollbar_counter]
@@:
; nodrawimage:
cmp [draw_scrollbar_counter],2
jne @f
mov ebx,[scroll_bar_data_vertical.x]
mov ecx,[scroll_bar_data_horizontal.y]
mcall 13, , ,0xffffff
@@:
ret
;****************************************************************************
;debug_1:
; pushad
; mov eax,ecx
; shr eax,16
; mov ebx,ecx
; shl ebx,16
; shr ebx,16
; mov eax,[image_file]
; mov ebx,edi
; mov [temp_eax],eax
; mov [temp_ebx],ebx
; mcall 13,<90,500>,<2,20>,0
; mcall 47,0xa0000,[temp_eax],<100, 5>,0xffffff
; mcall 47,0xa0000,[temp_ebx],<300, 5>,0xffffff
; popad
; ret
;temp_eax dd 0
;temp_ebx dd 0
;****************************************************************************