forked from KolibriOS/kolibrios
e73f2a8659
fix in 'zlib.obj', animage can save '*.png' files git-svn-id: svn://kolibrios.org@6741 a494cfbc-eb01-0410-851d-a64ba20cac60
639 lines
13 KiB
PHP
639 lines
13 KiB
PHP
macro instrument_set m_num, code
|
|
{
|
|
local no_instrument
|
|
cmp [number_menu],m_num
|
|
jne no_instrument
|
|
mov [Current_instrument],code
|
|
call TakeButtonInstruments
|
|
jmp end_menu
|
|
no_instrument:
|
|
}
|
|
|
|
;-----------------------------------------------------------
|
|
;-----------instruments of menu-----------------------------
|
|
;-----------------------------------------------------------
|
|
align 4
|
|
TakeInstruments:
|
|
;|||||||||||||||||||FILE||||||||||||||||||||||
|
|
cmp [number_panel],7
|
|
jne no_file
|
|
|
|
; <<< New >>>
|
|
cmp [number_menu],1
|
|
jne no_new
|
|
|
|
call dialog2_draw
|
|
|
|
mov edx,1000000000000000000000000000000b+1000
|
|
mcall SF_DEFINE_BUTTON,<177,40>,<115,14>,
|
|
|
|
mov edx,1000000000000000000000000000000b+1001
|
|
mcall ,,<139,14>,
|
|
|
|
mov edx,1000000000000000000000000000000b+1002
|
|
mcall ,,<170,15>
|
|
|
|
no_activate_space:
|
|
mcall SF_SLEEP, 5 ;fix cpu use 100%
|
|
mcall SF_WAIT_EVENT
|
|
|
|
cmp eax,1 ;redraw window
|
|
jne @f
|
|
call dialog2_draw
|
|
jmp no_activate_space
|
|
@@:
|
|
|
|
cmp eax,3 ;press button
|
|
jne no_activate_space
|
|
|
|
mcall SF_GET_BUTTON
|
|
shr eax,8
|
|
|
|
cmp eax,1000
|
|
jl no_activate_space
|
|
|
|
cmp eax,1000
|
|
jne no_picture_size_x
|
|
|
|
mov eax,180
|
|
mov ebx,119
|
|
mov ecx,5
|
|
call dialog_line
|
|
|
|
mov eax,string_
|
|
mov ebx,13
|
|
call find_symvol
|
|
|
|
dec eax
|
|
mov [length_number],eax
|
|
mov eax,string_
|
|
call str_to_int
|
|
|
|
mov [Picture_SizeX],eax
|
|
jmp no_activate_space
|
|
;---------------------------------------------------------------------
|
|
no_picture_size_x:
|
|
cmp eax,1001
|
|
jne no_picture_size_y
|
|
|
|
mov eax,180
|
|
mov ebx,119+24
|
|
mov ecx,5
|
|
call dialog_line
|
|
|
|
mov eax,string_
|
|
mov ebx,13
|
|
call find_symvol
|
|
|
|
dec eax
|
|
mov [length_number],eax
|
|
mov eax,string_
|
|
call str_to_int
|
|
|
|
mov [Picture_SizeY],eax
|
|
jmp no_activate_space
|
|
;---------------------------------------------------------------------
|
|
no_picture_size_y:
|
|
cmp eax,1002
|
|
jne no_activate_space
|
|
|
|
exit_new:
|
|
mov edx,11100000000000000000000000000000b+1002
|
|
mcall SF_DEFINE_BUTTON,<177,40>,<170,15>
|
|
|
|
mov edx,11100000000000000000000000000000b+1001
|
|
mcall ,,<139,14>
|
|
|
|
mov edx,11100000000000000000000000000000b+1000
|
|
mcall ,,<115,14>
|
|
|
|
;get memory for new picture
|
|
call GetMemory
|
|
|
|
and [save_flag],0
|
|
|
|
call cleare_work_arrea
|
|
call drawwin
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_new:
|
|
; <<< Open >>>
|
|
cmp [number_menu],2
|
|
jne no_open
|
|
|
|
;---------------------------------------------------------------------
|
|
mov [OpenDialog_data.type],0 ; open
|
|
|
|
push dword OpenDialog_data
|
|
call [OpenDialog_Start]
|
|
|
|
cmp [OpenDialog_data.status],1
|
|
jne end_menu
|
|
;---------------------------------------------------------------------
|
|
mcall SF_SET_EVENTS_MASK,0x80000027 ;100111b
|
|
|
|
call load_picture
|
|
call drawwin
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_open:
|
|
; <<< Save >>>
|
|
cmp [number_menu],3
|
|
jne no_save_
|
|
|
|
mov al,[save_flag]
|
|
test al,al
|
|
jz end_menu
|
|
jmp save_enter
|
|
;---------------------------------------------------------------------
|
|
no_save_:
|
|
; <<< Save as >>>
|
|
cmp [number_menu],4
|
|
jne no_save
|
|
|
|
; savedialog drawwin,save1,save2,file_path
|
|
;---------------------------------------------------------------------
|
|
; replace extension to '.png'
|
|
push eax esi
|
|
mov esi,[OpenDialog_data.filename_area]
|
|
xor eax,eax
|
|
cld
|
|
@@:
|
|
lodsb
|
|
test eax,eax
|
|
jnz @r
|
|
sub esi,5
|
|
cmp [esi],byte '.'
|
|
jne @f
|
|
mov [esi],dword '.png'
|
|
@@:
|
|
pop esi eax
|
|
;---------------------------------------------------------------------
|
|
mov [OpenDialog_data.type],1 ; save
|
|
stdcall [OpenDialog_Start],OpenDialog_data
|
|
|
|
cmp [OpenDialog_data.status],1
|
|
jne end_menu
|
|
;---------------------------------------------------------------------
|
|
save1:
|
|
save_enter:
|
|
mcall SF_SET_EVENTS_MASK,0x80000027 ;100111b
|
|
|
|
xor al,al
|
|
mov edi,file_path
|
|
repne scasb
|
|
mov eax,[edi-5]
|
|
or eax,0x20202000 ;down register
|
|
cmp eax,'.png'
|
|
jne .end0
|
|
;create image struct
|
|
stdcall [img_create], [Picture_SizeX], [Picture_SizeY], Image.bpp24
|
|
test eax,eax
|
|
jz @f
|
|
;copy image
|
|
mov edi,[eax+Image.Data]
|
|
mov esi,[PointerToPicture]
|
|
mov ecx,[Picture_SizeX]
|
|
imul ecx,[Picture_SizeY]
|
|
imul ecx,3
|
|
rep movsb
|
|
|
|
;encode image
|
|
stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0
|
|
test eax,eax
|
|
jz @f
|
|
|
|
;copy output image
|
|
mov edi,[PointerToEditBufer]
|
|
mov esi,eax
|
|
mov eax,ecx
|
|
rep movsb
|
|
@@:
|
|
mov ecx,eax
|
|
mov eax,file_path
|
|
mov ebx,[PointerToEditBufer]
|
|
jmp .end1
|
|
.end0:
|
|
|
|
call analizing_picture_to_palette
|
|
|
|
;eax => number of colors in picture
|
|
mov ebx,[PointerToPicture]
|
|
mov ecx,[PointerToEditBufer]
|
|
mov edx,[PointerToPalette]
|
|
mov esi,[Picture_SizeX]
|
|
mov edi,[Picture_SizeY]
|
|
|
|
call coding_bmp
|
|
|
|
mov eax,file_path
|
|
mov ecx,ebx
|
|
mov ebx,[PointerToEditBufer]
|
|
|
|
.end1:
|
|
call save_file
|
|
|
|
mov [save_flag],1
|
|
call drawwin
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_save:
|
|
; <<< Exit >>>
|
|
cmp [number_menu],5
|
|
jne no_exit_program
|
|
|
|
mcall SF_TERMINATE_PROCESS
|
|
;---------------------------------------------------------------------
|
|
no_exit_program:
|
|
no_file:
|
|
;|||||||||||||||||||||||||||||EDIT|||||||||||||||||||||||||
|
|
cmp [number_panel],6
|
|
jne no_edit
|
|
|
|
; <<< Undo >>>
|
|
cmp [number_menu],1
|
|
jne no_undo
|
|
|
|
cmp [number_undo],2 ;2 - maximum undo count
|
|
jge end_menu
|
|
|
|
;rotate bufers -1
|
|
inc [number_undo]
|
|
mov eax,[PointerToPicture]
|
|
mov ebx,[PointerToCopyPicture]
|
|
mov ecx,[PointerToCopyPicture2]
|
|
mov [PointerToPicture],ebx
|
|
mov [PointerToCopyPicture],ecx
|
|
mov [PointerToCopyPicture2],eax
|
|
|
|
call MovePictureToWorkScreen
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_undo:
|
|
; <<< Redo >>>
|
|
cmp [number_menu],2
|
|
jne no_redo
|
|
|
|
cmp [number_undo],0
|
|
je end_menu
|
|
|
|
;rotate bufers +1
|
|
dec [number_undo]
|
|
mov eax,[PointerToPicture]
|
|
mov ebx,[PointerToCopyPicture]
|
|
mov ecx,[PointerToCopyPicture2]
|
|
mov [PointerToPicture],ecx
|
|
mov [PointerToCopyPicture],eax
|
|
mov [PointerToCopyPicture2],ebx
|
|
|
|
call MovePictureToWorkScreen
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_redo:
|
|
; <<< Copy >>>
|
|
cmp [number_menu],3
|
|
jne no_copy
|
|
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
|
|
cmp eax,[rectangular_shade_x]
|
|
jl no_remove_x_copy
|
|
|
|
mov ecx,[rectangular_shade_x]
|
|
mov [crossing_old_x],ecx ; crossing_old_x <-----> rectangulare_shade_x
|
|
mov [rectangular_shade_x],eax
|
|
|
|
no_remove_x_copy:
|
|
cmp ebx,[rectangular_shade_y]
|
|
jl no_remove_y_copy
|
|
|
|
mov ecx,[rectangular_shade_y]
|
|
mov [crossing_old_y],ecx ; crossing_old_y <-----> rectangulare_shade_y
|
|
mov [rectangular_shade_y],ebx
|
|
|
|
no_remove_y_copy:
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
mov ecx,[rectangular_shade_x]
|
|
mov edx,[rectangular_shade_y]
|
|
inc eax
|
|
inc ebx
|
|
dec ecx
|
|
dec edx
|
|
|
|
mov [x],eax
|
|
mov [y],ebx
|
|
mov esi,eax
|
|
mov edi,ebx
|
|
mov [Dx_],1
|
|
mov [Dy_],1
|
|
|
|
sub ecx,eax
|
|
jnz no_signum_fill_r_x_copy
|
|
|
|
mov [Dx_],-1
|
|
|
|
no_signum_fill_r_x_copy:
|
|
sub edx,ebx
|
|
jnz no_signum_fill_r_y_copy
|
|
|
|
mov [Dy_],-1
|
|
|
|
no_signum_fill_r_y_copy:
|
|
mov ebx,[rectangular_shade_y]
|
|
sub ebx,edi
|
|
|
|
mov edx,[PointerToEditBufer]
|
|
mov eax,[rectangular_shade_x]
|
|
sub eax,[crossing_old_x]
|
|
mov [edx],eax ;image.w
|
|
mov eax,[rectangular_shade_y]
|
|
sub eax,[crossing_old_y]
|
|
mov [edx+4],eax ;image.h
|
|
mov dword[edx+8],24 ;bit in pixel
|
|
add edx,12 ;copy image parametrs
|
|
mov [y],edi
|
|
|
|
loop_fill_rectangle_y_copy:
|
|
mov [x],esi
|
|
|
|
loop_fill_rectangle_x_copy:
|
|
push esi edi
|
|
mov eax,[PointerToPicture]
|
|
mov ebx,[Picture_SizeX]
|
|
mov esi,[x]
|
|
mov edi,[y]
|
|
call GetColorOfPixel
|
|
mov [edx],ax
|
|
shr eax,16
|
|
mov [edx+2],al
|
|
pop edi esi
|
|
|
|
add edx,3
|
|
mov eax,[x]
|
|
add eax,[Dx_]
|
|
mov [x],eax
|
|
|
|
cmp eax,[rectangular_shade_x]
|
|
jl loop_fill_rectangle_x_copy
|
|
|
|
mov eax,[y]
|
|
add eax,[Dy_]
|
|
mov [y],eax
|
|
|
|
cmp eax,[rectangular_shade_y]
|
|
jl loop_fill_rectangle_y_copy
|
|
|
|
;...todo use system buffer...
|
|
;mcall SF_CLIPBOARD,SSF_WRITE_CB,,[PointerToEditBufer]
|
|
|
|
call MovePictureToWorkScreen
|
|
mov [DrawSprite_flag],1
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_copy:
|
|
; <<< Paste >>>
|
|
cmp [number_menu],4
|
|
jne no_paste
|
|
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
|
|
cmp eax,[rectangular_shade_x]
|
|
jl no_remove_x_paste
|
|
|
|
mov ecx,[rectangular_shade_x]
|
|
mov [crossing_old_x],ecx ; crossing_old_x <-----> rectangulare_shade_x
|
|
mov [rectangular_shade_x],eax
|
|
|
|
no_remove_x_paste:
|
|
cmp ebx,[rectangular_shade_y]
|
|
jl no_remove_y_paste
|
|
|
|
mov ecx,[rectangular_shade_y]
|
|
mov [crossing_old_y],ecx ; crossing_old_y <-----> rectangulare_shade_y
|
|
mov [rectangular_shade_y],ebx
|
|
|
|
no_remove_y_paste:
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
mov ecx,[rectangular_shade_x]
|
|
mov edx,[rectangular_shade_y]
|
|
inc eax
|
|
inc ebx
|
|
dec ecx
|
|
dec edx
|
|
|
|
mov [x],eax
|
|
mov [y],ebx
|
|
mov esi,eax
|
|
mov edi,ebx
|
|
mov [Dx_],1
|
|
mov [Dy_],1
|
|
|
|
sub ecx,eax
|
|
jnz no_signum_fill_r_x_paste
|
|
|
|
mov [Dx_],-1
|
|
|
|
no_signum_fill_r_x_paste:
|
|
sub edx,ebx
|
|
jnz no_signum_fill_r_y_paste
|
|
|
|
mov [Dy_],-1
|
|
|
|
no_signum_fill_r_y_paste:
|
|
mov edx,[PointerToEditBufer]
|
|
cmp dword[edx+8],24
|
|
jne end_menu
|
|
mov eax,[edx]
|
|
add eax,[crossing_old_x]
|
|
mov [paste_img_w],eax
|
|
mov eax,[edx+4]
|
|
add eax,[crossing_old_y]
|
|
mov [paste_img_h],eax
|
|
add edx,12 ;copy image parametrs
|
|
mov [y],edi
|
|
|
|
loop_fill_rectangle_y_paste:
|
|
mov [x],esi
|
|
|
|
loop_fill_rectangle_x_paste:
|
|
push esi edi
|
|
mov ecx,[edx]
|
|
and ecx,0xffffff ;color
|
|
mov eax,[PointerToPicture]
|
|
mov ebx,[Picture_SizeX]
|
|
mov esi,[x]
|
|
mov edi,[y]
|
|
call PutPixel
|
|
pop edi esi
|
|
|
|
add edx,3
|
|
|
|
mov eax,[x]
|
|
add eax,[Dx_]
|
|
cmp eax,[paste_img_w]
|
|
je no_paste_data_x
|
|
mov [x],eax
|
|
cmp eax,[rectangular_shade_x]
|
|
jl loop_fill_rectangle_x_paste
|
|
no_paste_data_x:
|
|
|
|
mov eax,[y]
|
|
add eax,[Dy_]
|
|
cmp eax,[paste_img_h]
|
|
je no_paste_data_y
|
|
mov [y],eax
|
|
cmp eax,[rectangular_shade_y]
|
|
jl loop_fill_rectangle_y_paste
|
|
no_paste_data_y:
|
|
|
|
call MovePictureToWorkScreen
|
|
mov [Paste_flag],1
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_paste:
|
|
; <<< Cut >>>
|
|
cmp [number_menu],5
|
|
jne no_cut
|
|
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
|
|
cmp eax,[rectangular_shade_x]
|
|
jl no_remove_x_cut
|
|
|
|
mov ecx,[rectangular_shade_x]
|
|
mov [crossing_old_x],ecx ; crossing_old_x <-----> rectangulare_shade_x
|
|
mov [rectangular_shade_x],eax
|
|
|
|
no_remove_x_cut:
|
|
cmp ebx,[rectangular_shade_y]
|
|
jl no_remove_y_cut
|
|
|
|
mov ecx,[rectangular_shade_y]
|
|
mov [crossing_old_y],ecx ; crossing_old_y <-----> rectangulare_shade_y
|
|
mov [rectangular_shade_y],ebx
|
|
|
|
no_remove_y_cut:
|
|
mov eax,[crossing_old_x]
|
|
mov ebx,[crossing_old_y]
|
|
mov ecx,[rectangular_shade_x]
|
|
mov edx,[rectangular_shade_y]
|
|
inc eax
|
|
inc ebx
|
|
dec ecx
|
|
dec edx
|
|
|
|
mov [x],eax
|
|
mov [y],ebx
|
|
mov esi,eax
|
|
mov edi,ebx
|
|
mov [Dx_],1
|
|
mov [Dy_],1
|
|
|
|
sub ecx,eax
|
|
jnz no_signum_fill_r_x
|
|
|
|
mov [Dx_],-1
|
|
|
|
no_signum_fill_r_x:
|
|
sub edx,ebx
|
|
jnz no_signum_fill_r_y
|
|
|
|
mov [Dy_],-1
|
|
|
|
no_signum_fill_r_y:
|
|
mov [y],edi
|
|
|
|
loop_fill_rectangle_y:
|
|
mov [x],esi
|
|
|
|
loop_fill_rectangle_x:
|
|
push esi edi
|
|
mov eax,[PointerToPicture]
|
|
mov ebx,[Picture_SizeX]
|
|
mov ecx,dword 0xffffff
|
|
mov esi,[x]
|
|
mov edi,[y]
|
|
call PutPixel
|
|
pop edi esi
|
|
|
|
mov eax,[x]
|
|
add eax,[Dx_]
|
|
mov [x],eax
|
|
|
|
cmp eax,[rectangular_shade_x]
|
|
jl loop_fill_rectangle_x
|
|
|
|
mov eax,[y]
|
|
add eax,[Dy_]
|
|
mov [y],eax
|
|
|
|
cmp eax,[rectangular_shade_y]
|
|
jl loop_fill_rectangle_y
|
|
|
|
call MovePictureToWorkScreen
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_cut:
|
|
; <<< Cleare all >>>
|
|
cmp [number_menu],6
|
|
jne no_cleare_all
|
|
|
|
call cleare_work_arrea
|
|
call MovePictureToWorkScreen
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_cleare_all:
|
|
; <<< To allocate all >>>
|
|
cmp [number_menu],7
|
|
jne end_menu
|
|
|
|
mov [crossing_old_x],0
|
|
mov [crossing_old_y],0
|
|
mov eax,[Picture_SizeX]
|
|
mov ebx,[Picture_SizeY]
|
|
dec eax
|
|
dec ebx
|
|
mov [rectangular_shade_x],eax
|
|
mov [rectangular_shade_y],ebx
|
|
mov [Current_instrument],30
|
|
mov [crossing],2
|
|
;call MovePictureToWorkScreen
|
|
jmp end_menu
|
|
;---------------------------------------------------------------------
|
|
no_edit:
|
|
;|||||||||||||||||||||||||INSTRUMENTS||||||||||||||||||||||
|
|
cmp [number_panel],5
|
|
jne no_instruments
|
|
|
|
instrument_set 1,10 ; pensil
|
|
instrument_set 2,11 ; draw brush
|
|
instrument_set 3,12 ; spray
|
|
instrument_set 4,13 ; lastik
|
|
instrument_set 5,14 ; flood fill
|
|
instrument_set 6,15 ; pipetka
|
|
instrument_set 7,16 ; draw line
|
|
instrument_set 8,17 ; draw rectangle
|
|
instrument_set 9,18 ; draw circle
|
|
instrument_set 10,19 ; draw ellips
|
|
instrument_set 11,20 ; draw hard contour
|
|
|
|
no_instruments:
|
|
;|||||||||||||||||||||||||FILTERS||||||||||||||||||||||||||
|
|
cmp [number_panel],4
|
|
jne no_filters
|
|
|
|
instrument_set 1,23 ; reflection from left to right
|
|
instrument_set 2,24 ; reflection from up to down
|
|
|
|
no_filters:
|
|
|
|
end_menu:
|
|
and [number_panel],0
|
|
and [number_menu],0
|
|
jmp still
|
|
;--------------------------------------------------------------------- |