new fast algoritm for undo,

optimize code

git-svn-id: svn://kolibrios.org@6355 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2016-03-17 19:03:33 +00:00
parent ac1294b91a
commit 5f7bdd499c
3 changed files with 97 additions and 308 deletions

View File

@ -3,7 +3,7 @@
;---------------------------------------------
mouse:
or ecx,-1
mcall 9,procinfo
mcall SF_THREAD_INFO,procinfo
mov eax,[procinfo+70] ;staus of window
test eax,100b
@ -210,47 +210,28 @@ mouse_in_work_arrea:
cmp [Activate_instrument],0
jnz no_undo___
;------------begin copy for undo-------------
inc [number_undo]
cmp [number_undo],1
jne no_one__
mov edi,[PointerToCopyPicture]
no_one__:
cmp [number_undo],2
jne no_two__
mov edi,[PointerToCopyPicture2]
no_two__:
cmp [number_undo],3
jne no_three__
;copy bufer number two to bufer number one
mov esi,[PointerToCopyPicture2]
mov edi,[PointerToCopyPicture]
mov ecx,[Picture_SizeX]
imul ecx,[Picture_SizeY]
lea ecx,[ecx+ecx*2]
add ecx,4
shr ecx,2
inc ecx
;copy bufer number 2 to bufer number 0
mov edi,[PointerToCopyPicture2]
mov esi,[PointerToPicture]
mov ecx,[Picture_SizeX]
imul ecx,[Picture_SizeY]
lea ecx,[ecx+ecx*2]
mov ebx,ecx
shr ecx,2
cld
rep movsd
;end copy
dec [number_undo]
mov edi,[PointerToCopyPicture2]
no_three__:
mov esi,[PointerToPicture]
mov ecx,[Picture_SizeX]
imul ecx,[Picture_SizeY]
lea ecx,[ecx+ecx*2]
add ecx,4
shr ecx,2
inc ecx
cld
rep movsd
rep movsd
mov ecx,ebx
and ecx,3
rep movsb
;call MovePictureToWorkScreen
;rotate bufers +1
and [number_undo],0 ;erase all undo
mov eax,[PointerToPicture]
mov ebx,[PointerToCopyPicture]
mov ecx,[PointerToCopyPicture2]
mov [PointerToPicture],ecx
mov [PointerToCopyPicture],eax
mov [PointerToCopyPicture2],ebx
;--------------end copy for undo-------------
no_undo___:
call TakeButtonInstruments
@ -263,7 +244,7 @@ no_use_instruments:
;---------get mouse cordinats-------------------
;-----------------------------------------------
GetMouseCoordinats:
mcall 37,1
mcall SF_MOUSE_GET,SSF_WINDOW_POSITION
mov ebx,eax
shr eax,16
and ebx,0xffff
@ -274,5 +255,5 @@ GetMouseCoordinats:
;-------get mouse attributs----------------------
;------------------------------------------------
GetMouseClick:
mcall 37,2
mcall SF_MOUSE_GET,SSF_BUTTON
ret

View File

@ -95,6 +95,61 @@ local .horizontal_width_save
jnz .next_color_save
}
macro draw_calc_pixels brush
{
local .next_pixel_put
local .vertical_width
local .horizontal_width
local .no_draw_pixel
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
add edi,brush
.next_pixel_put:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
mov [counter2],5
.vertical_width:
mov [counter],5
.horizontal_width:
xor ecx,ecx
mov cl,byte[edi+ebp]
test cl,cl
jz .no_draw_pixel
mov [eax],si
mov [eax+2],dl
.no_draw_pixel:
add eax,3
inc ebp
dec [counter]
jnz .horizontal_width
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
dec [counter2]
jnz .vertical_width
pop ecx
pop eax
add ebx,4
dec ecx
jnz .next_pixel_put
}
;-----------------------------------------------------------
;-----instruments of panel(icon's instruments)--------------
;-----------------------------------------------------------
@ -723,56 +778,9 @@ TakeButtonInstruments:
square_width_save
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
next_pixel_put_line:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
and [counter2],0
vertical_width:
and [counter],0
horizontal_width:
xor ecx,ecx
mov cl,byte[width_pixels+edi+ebp]
test cl,cl
jz no_draw_pixel_line
mov [eax],si
mov [eax+2],dl
no_draw_pixel_line:
add eax,3
inc ebp
inc [counter]
cmp [counter],5
jne horizontal_width
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
inc [counter2]
cmp [counter2],5
jne vertical_width
pop ecx
pop eax
add ebx,4
dec ecx
jnz next_pixel_put_line
draw_calc_pixels width_pixels
call MovePictureToWorkScreen
jmp still
no_line:
@ -835,53 +843,7 @@ TakeButtonInstruments:
square_width_save
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
next_pixel_put_rectangle:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
and [counter2],0
vertical_width_rectangle:
and [counter],0
horizontal_width_rectangle:
xor ecx,ecx
mov cl,byte[width_pixels_rectangle+edi+ebp]
test cl,cl
jz no_draw_pixel_rectangle
mov [eax],si
mov [eax+2],dl
no_draw_pixel_rectangle:
add eax,3
inc ebp
inc [counter]
cmp [counter],5
jne horizontal_width_rectangle
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
inc [counter2]
cmp [counter2],5
jne vertical_width_rectangle
pop ecx
pop eax
add ebx,4
dec ecx
jnz next_pixel_put_rectangle
draw_calc_pixels width_pixels_rectangle
call MovePictureToWorkScreen
jmp still
@ -1033,53 +995,7 @@ TakeButtonInstruments:
square_width_save
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
next_pixel_put_circle:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
and [counter2],0
vertical_width_circle:
and [counter],0
horizontal_width_circle:
xor ecx,ecx
mov cl,byte[width_pixels+edi+ebp]
test cl,cl
jz no_draw_pixel_circle
mov [eax],si
mov [eax+2],dl
no_draw_pixel_circle:
add eax,3
inc ebp
inc [counter]
cmp [counter],5
jne horizontal_width_circle
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
inc [counter2]
cmp [counter2],5
jne vertical_width_circle
pop ecx
pop eax
add ebx,4
dec ecx
jnz next_pixel_put_circle
draw_calc_pixels width_pixels
call MovePictureToWorkScreen
jmp still
@ -1715,53 +1631,7 @@ TakeButtonInstruments:
square_width_save
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
next_pixel_put_konture:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
and [counter2],0
vertical_width_konture:
and [counter],0
horizontal_width_konture:
xor ecx,ecx
mov cl,byte[width_pixels+edi+ebp]
test cl,cl
jz no_draw_pixel_konture
mov [eax],si
mov [eax+2],dl
no_draw_pixel_konture:
add eax,3
inc ebp
inc [counter]
cmp [counter],5
jne horizontal_width_konture
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
inc [counter2]
cmp [counter2],5
jne vertical_width_konture
pop ecx
pop eax
add ebx,4
dec ecx
jnz next_pixel_put_konture
draw_calc_pixels width_pixels
mov eax,[ScreenX]
mov ebx,[ScreenY]
@ -1913,53 +1783,7 @@ TakeButtonInstruments:
square_width_save
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
mov edx,[Color]
mov esi,[Color]
shr edx,16
add ebx,4
mov edi,[line_width]
dec edi
imul edi,25
next_pixel_put_ellips:
mov eax,[ebx]
push eax
push ecx
xor ebp,ebp
and [counter2],0
vertical_width_ellips:
and [counter],0
horizontal_width_ellips:
xor ecx,ecx
mov cl,byte[width_pixels+edi+ebp]
test cl,cl
jz no_draw_pixel_ellips
mov [eax],si
mov [eax+2],dl
no_draw_pixel_ellips:
add eax,3
inc ebp
inc [counter]
cmp [counter],5
jne horizontal_width_ellips
mov ecx,[Picture_SizeX]
sub ecx,5
lea ecx,[ecx+ecx*2]
add eax,ecx
inc [counter2]
cmp [counter2],5
jne vertical_width_ellips
pop ecx
pop eax
add ebx,4
dec ecx
jnz next_pixel_put_ellips
draw_calc_pixels width_pixels
call MovePictureToWorkScreen
jmp still

View File

@ -255,47 +255,31 @@ no_save:
cmp [number_menu],5
jne no_exit_program
mov eax,-1
mcall
mcall SF_TERMINATE_PROCESS
;---------------------------------------------------------------------
no_exit_program:
no_file:
;|||||||||||||||||||||||||||||EDIT|||||||||||||||||||||||||
;<<<<<<<<<<UNDO>>>>>>>>>>
cmp [number_panel],6
jne still ;no_edit
jne still ;no_edit
cmp [number_menu],1
jne no_undo
cmp [number_undo],1
jne no_one____
cmp [number_undo],2 ;2 - maximum undo count
jge no_undo
mov esi,[PointerToCopyPicture]
;rotate bufers -1
inc [number_undo]
mov eax,[PointerToPicture]
mov ebx,[PointerToCopyPicture]
mov ecx,[PointerToCopyPicture2]
mov [PointerToPicture],ebx
mov [PointerToCopyPicture],ecx
mov [PointerToCopyPicture2],eax
no_one____:
cmp [number_undo],2
jne no_two____
mov esi,[PointerToCopyPicture2]
no_two____:
mov edi,[PointerToPicture]
mov ecx,[Picture_SizeX]
imul ecx,[Picture_SizeY]
lea ecx,[ecx+ecx*2]
add ecx,4
shr ecx,2
cld
rep movsd
call MovePictureToWorkScreen
dec [number_undo]
jnz no_null_undo
mov [number_undo],1
no_null_undo:
call MovePictureToWorkScreen
and [number_panel],0
and [number_menu],0
jmp still