kolibrios/programs/media/animage/trunk/menu_instruments.inc
IgorA c0324e5907 Обновить programs/media/animage/trunk/menu_instruments.inc
animage use system buffer ClipBoard from Copy | Paste
2024-06-09 21:19:46 +02:00

704 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 dword[edx+4],1 ;type image
mov [edx+8],eax ;image.w
mov eax,[rectangular_shade_y]
sub eax,[crossing_old_y]
mov [edx+12],eax ;image.h
mov dword[edx+16],24 ;bit in pixel
xor eax,eax
mov dword[edx+20],eax ;palette
mov dword[edx+24],eax ;palette size
add edx,28 ;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
;use system buffer
mov edx,[PointerToEditBufer]
mov ecx,[edx+8] ;image.w
imul ecx,[edx+12] ;image.h
lea ecx,[ecx+ecx*2]
add ecx,28
mov [edx],ecx ;buffer size
mcall SF_CLIPBOARD,SSF_WRITE_CB
call MovePictureToWorkScreen
mov [DrawSprite_flag],1
jmp end_menu
;---------------------------------------------------------------------
no_copy:
; <<< Paste >>>
cmp [number_menu],4
jne no_paste
call ReadCB_Img
or eax,eax
jz 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+16],24 ;bit in pixel
jne end_menu
mov eax,[edx+8] ;image.w
add eax,[crossing_old_x]
mov [paste_img_w],eax
mov eax,[edx+12] ;image.h
add eax,[crossing_old_y]
mov [paste_img_h],eax
add edx,28 ;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
sub eax,[paste_img_w]
jge no_paste_data_x
neg eax
lea eax,[eax+eax*2]
add edx,eax ;пропуск пикселей изображения которые не влазят в rectangle
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
;---------------------------------------------------------------------
;output:
; eax - 0 если изображение не прочитано, 1 если успешно прочитано
align 16
proc ReadCB_Img uses ebx ecx edi esi
mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT
cmp eax,1
jl .no_buf_r
mov esi,eax
.cycle: ;обратный цикл по слотам
dec esi ;номер текущего, проверяемого слота
mcall SF_CLIPBOARD,SSF_READ_CB,esi
cmp eax,1
je .no_buf_r
cmp eax,-1
je .no_buf_r
mov ecx,[eax]
cmp ecx,1 ;size
jl .no_buf_r
cmp dword[eax+4],1 ;image
je @f
cmp esi,1
jge .cycle ;если в буфере не изображение, а слотов в буфере несколько, пробуем перейти к верхнему слоту
jmp .no_buf_r
@@:
cmp dword[eax+16],24 ;bit in pixel
je @f
cmp esi,1
jge .cycle ;если в буфере не 24 битное изображение
jmp .no_buf_r
@@:
;копирование изображения из системного буфера во внутренний
mov edi,[PointerToEditBufer]
mov esi,eax
mov ecx,[eax]
shr ecx,2
rep movsd
xor eax,eax
inc eax
jmp .end_f
.no_buf_r:
xor eax,eax
.end_f:
ret
endp