fix selection rectangle

git-svn-id: svn://kolibrios.org@6379 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2016-03-26 19:14:00 +00:00
parent 50b7ed90e3
commit 7ddfc6356d
3 changed files with 231 additions and 98 deletions

View File

@ -269,19 +269,25 @@ Picture_SizeX rd 1
Picture_SizeY rd 1 Picture_SizeY rd 1
ScreenX rd 1 ;ª®®à¤¨­ â  x ªãàá®à  á ãç¥â®¬ ¬ áèâ ¡  ScreenX rd 1 ;ª®®à¤¨­ â  x ªãàá®à  á ãç¥â®¬ ¬ áèâ ¡ 
ScreenY rd 1 ;ª®®à¤¨­ â  y ªãàá®à  á ãç¥â®¬ ¬ áèâ ¡  ScreenY rd 1 ;ª®®à¤¨­ â  y ªãàá®à  á ãç¥â®¬ ¬ áèâ ¡ 
WorkScreen_SizeX rd 1 WorkScreen_SizeX rd 1 ;è¨à¨­  à ¡®ç¥£® íªà ­ 
WorkScreen_SizeY rd 1 WorkScreen_SizeY rd 1 ;¢ëá®â  à ¡®ç¥£® íªà ­ 
MaxWorkScreen_SizeX rd 1 MaxWorkScreen_SizeX rd 1
MaxWorkScreen_SizeY rd 1 MaxWorkScreen_SizeY rd 1
k rd 1 ;¬ áèâ ¡ k rd 1 ;¬ áèâ ¡
ReserveArray rd 1 ReserveArray rd 1 ;㪠§ â¥«ì ­  ¯ ¬ïâì ¨á¯®«ì§ã¥¬ãî ¯à¨ à¨á®¢ ­¨¨ 䨣ãà
register rd 1 ;¤«ï á®åà ­¥­¨ï ãç á⪮¢ ä®­  ¯®¤ 䨣ãà ¬¨,   â ª¦¥ ¤«ï § «¨¢ª¨
CounterX rd 1 CounterX rd 1 ;ç¨á«® ¯¨ªá¥«¥© ¨§®¡à ¦¥­¨ï ¯® è¨à¨­¥, ª®â®àë¥ ¯®¯ ¤ îâ
;¢ íªà ­ à ¡®ç¥© ®¡« áâ¨, á ãç¥â®¬ ⥪ã饣® ¬ áèâ ¡ 
CounterY rd 1 CounterY rd 1
OffsetYPicture rd 1 OffsetYPicture rd 1 ;ᤢ¨£ ¯® ®á¨ y ¢ ¡ãä¥à¥ ¨§®¡à ¦¥­¨ï ¯à¨ à¨á®¢ ­¨¨
OffsetYWorkScreen rd 1 ;á«¥¤ãî饩 «¨­¨¨ ¨§®¡à ¦¥­¨ï
OffsetYBigPixel rd 1 OffsetYWorkScreen rd 1 ;ᤢ¨£ ¯® ®á¨ y ¢ ¡ãä¥à¥ à ¡®ç¥© ®¡« á⨠¯à¨
;à¨á®¢ ­¨¨ á«¥¤ãî饩 «¨­¨¨ ¯¨ªá¥«¥©. —¥¬ ¡®«ìè¥ ¬ áèâ ¡, ⥬ ­¨¦¥
;­ã¦­® ®¯ã᪠âìáï ¯® à ¡®ç¥© ®¡« áâ¨.
OffsetYBigPixel rd 1 ;ᤢ¨£ ¯® ®á¨ y ¤«ï à¨á®¢ ­¨ï ¯¨ªá¥«¥© ­  ¡®«ì讬
;¬ áèâ ¡¥. <20>¨áã¥âáï 1-ï ¯®«®á  ¯¨ªá¥«ï,   ¯®â®¬ ­ã¦­® ¯¥à¥©â¨ ¢­¨§ ¨
;¢«¥¢® ¤«ï à¨á®¢ ­¨ï á«¥¤ãî饩 ¯®«®áë.
Icon_X rd 1 Icon_X rd 1
Icon_Y rd 1 Icon_Y rd 1

View File

@ -1164,24 +1164,24 @@ TakeButtonInstruments:
mov edi,[rectangular_shade_y] mov edi,[rectangular_shade_y]
sub esi,eax sub esi,eax
jns no_sign_sprite_size_x jns @f
neg esi neg esi ;sign sprite size x
no_sign_sprite_size_x: @@:
sub edi,ebx sub edi,ebx
jns no_sign_sprite_size_y jns @f
neg edi neg edi ;sign sprite size y
no_sign_sprite_size_y: @@:
test esi,esi test esi,esi
jnz no_null_sprite_x jnz @f
mov esi,1 mov esi,1 ;null sprite x
no_null_sprite_x: @@:
test edi,edi test edi,edi
jnz no_null_sprite_y jnz @f
mov edi,1 mov edi,1 ;null sprite y
no_null_sprite_y: @@:
mov [SpriteSizeX],esi mov [SpriteSizeX],esi
mov [SpriteSizeY],edi mov [SpriteSizeY],edi
@ -1213,7 +1213,6 @@ TakeButtonInstruments:
test eax,eax test eax,eax
jnz crossing_with_work_area jnz crossing_with_work_area
mov [finishing_crossing],1 mov [finishing_crossing],1
mov [register],1
crossing_with_work_area: crossing_with_work_area:
pop [ScreenY] pop [ScreenY]
@ -1245,68 +1244,66 @@ TakeButtonInstruments:
mov [SpriteCoordinatY],ebx mov [SpriteCoordinatY],ebx
cmp [SpriteCoordinatX],0 cmp [SpriteCoordinatX],0
jns no_null_sprite_coordinat_x jns @f
mov [SpriteCoordinatX],1 mov [SpriteCoordinatX],1 ;null sprite coordinat x
no_null_sprite_coordinat_x: @@:
cmp [SpriteCoordinatY],0 cmp [SpriteCoordinatY],0
jns no_null_sprite_coordinat_y jns @f
mov [SpriteCoordinatY],1 mov [SpriteCoordinatY],1 ;null sprite coordinat y
no_null_sprite_coordinat_y: @@:
mov esi,[rectangular_shade_x] mov esi,[rectangular_shade_x]
mov edi,[rectangular_shade_y] mov edi,[rectangular_shade_y]
sub esi,[OldX] sub esi,[OldX]
jns no_znak_size_of_rectangulare_crossing_x jns @f
neg esi neg esi
no_znak_size_of_rectangulare_crossing_x: @@:
sub edi,[OldY] sub edi,[OldY]
jns no_znak_size_of_rectangulare_crossing_y jns @f
neg edi neg edi
no_znak_size_of_rectangulare_crossing_y: @@:
mov ecx,[OldX] mov ecx,[OldX]
mov edx,[OldY] mov edx,[OldY]
sub ecx,[PosX] sub ecx,[PosX]
jns no_minimum_x_crossing jns @f
mov ecx,0 xor ecx,ecx
add ecx,[PosX] add ecx,[PosX]
mov [OldX],ecx mov [OldX],ecx
add ecx,esi add ecx,esi
mov [rectangular_shade_x],ecx mov [rectangular_shade_x],ecx
no_minimum_x_crossing: @@:
sub edx,[PosY] sub edx,[PosY]
jns no_minimum_y_crossing jns @f
mov edx,0 xor edx,edx
add edx,[PosY] add edx,[PosY]
mov [OldY],edx mov [OldY],edx
add edx,edi add edx,edi
mov [rectangular_shade_y],edx mov [rectangular_shade_y],edx
no_minimum_y_crossing: @@:
mov ecx,[Picture_SizeX] mov ecx,[Picture_SizeX]
sub ecx,esi sub ecx,esi
cmp [OldX],ecx cmp [OldX],ecx
jl no_maximum_x_crossing jl @f
dec ecx dec ecx
mov [OldX],ecx mov [OldX],ecx
add ecx,esi add ecx,esi
mov [rectangular_shade_x],ecx mov [rectangular_shade_x],ecx
no_maximum_x_crossing: @@:
mov edx,[Picture_SizeY] mov edx,[Picture_SizeY]
sub edx,edi sub edx,edi
cmp [OldY],edx cmp [OldY],edx
jl no_maximum_y_crossing jl @f
dec edx dec edx
mov [OldY],edx mov [OldY],edx
add edx,edi add edx,edi
mov [rectangular_shade_y],edx mov [rectangular_shade_y],edx
no_maximum_y_crossing: @@:
mov eax,[rectangular_shade_x] mov eax,[rectangular_shade_x]
mov ebx,[rectangular_shade_y] mov ebx,[rectangular_shade_y]
@ -1323,9 +1320,9 @@ TakeButtonInstruments:
jne no_activate_put_fon_ jne no_activate_put_fon_
cmp [Paste_flag],1 cmp [Paste_flag],1
je no_put_fon___ je @f
call PutFonForSprite call PutFonForSprite
no_put_fon___: @@:
and [Paste_flag],0 and [Paste_flag],0
no_activate_put_fon_: no_activate_put_fon_:
@ -1355,16 +1352,16 @@ TakeButtonInstruments:
mov ebp,[Picture_SizeX] mov ebp,[Picture_SizeX]
dec ebp dec ebp
cmp esi,ebp cmp esi,ebp
jl no_minimum_x_allocation jl @f
mov esi,ebp mov esi,ebp ;minimum x allocation
no_minimum_x_allocation: @@:
mov ebp,[Picture_SizeY] mov ebp,[Picture_SizeY]
dec ebp dec ebp
cmp edi,ebp cmp edi,ebp
jl no_minimum_y_allocation jl @f
mov edi,ebp mov edi,ebp ;minimum y allocation
no_minimum_y_allocation: @@:
call calculate_rectangle call calculate_rectangle
@ -1372,7 +1369,7 @@ TakeButtonInstruments:
square_width_save square_width_save
cmp [DrawSprite_flag],1 cmp [DrawSprite_flag],1
jne no_save_fon_for_sprite_ jne @f
;save current coordinats as old ;save current coordinats as old
mov eax,[SpriteCoordinatX] mov eax,[SpriteCoordinatX]
mov ebx,[SpriteCoordinatY] mov ebx,[SpriteCoordinatY]
@ -1381,40 +1378,12 @@ TakeButtonInstruments:
call SaveFonForSprite call SaveFonForSprite
no_save_fon_for_sprite_: @@:
;draw calculated pixels on work arrea
mov ebx,[ReserveArray]
mov ecx,[ebx]
add ebx,4
next_pixel_put_allocation:
mov edx,0x1f3fff
mov esi,edx
shr edx,16
mov ebp,ecx
and ebp,8
cmp ebp,8
jne black_color
mov si,0xffff
mov dl,0xff
black_color:
mov eax,[ebx]
mov [eax],si
mov [eax+2],dl
add ebx,4
dec ecx
jnz next_pixel_put_allocation
cmp [DrawSprite_flag],1 cmp [DrawSprite_flag],1
jne no_activate_draw_sprite_ jne @f
call DrawSprite
call DrawSprite @@:
no_activate_draw_sprite_:
mov al,[instrument_used] mov al,[instrument_used]
test al,al test al,al

View File

@ -90,12 +90,11 @@ screen_y_1:
screen_x_1: screen_x_1:
mov ecx,[eax] mov ecx,[eax]
and ecx,0xffffff
mov ebp,ecx mov ebp,ecx
shr ecx,16 shr ecx,16
mov [ebx],bp mov [ebx],bp
mov [ebx+2],cl mov [ebx+2],cl
add ebx,3; add ebx,3
add eax,3 add eax,3
dec esi dec esi
jnz screen_x_1 jnz screen_x_1
@ -114,7 +113,6 @@ screen_y_2:
screen_x_2: screen_x_2:
mov ecx,[eax] mov ecx,[eax]
and ecx,0xffffff
mov ebp,ecx mov ebp,ecx
shr ecx,16 shr ecx,16
mov edx,ebx mov edx,ebx
@ -128,8 +126,6 @@ screen_x_2:
mov [edx+2],cl mov [edx+2],cl
mov [edx+3],bp mov [edx+3],bp
mov [edx+3+2],cl mov [edx+3+2],cl
add edx,3*2
add edx,[OffsetYBigPixel]
add ebx,3*2 add ebx,3*2
add eax,3 add eax,3
dec esi dec esi
@ -149,7 +145,6 @@ screen_y_4:
screen_x_4: screen_x_4:
mov ecx,[eax] mov ecx,[eax]
and ecx,0xffffff
mov ebp,ecx mov ebp,ecx
shr ecx,16 shr ecx,16
mov edx,ebx mov edx,ebx
@ -191,8 +186,6 @@ screen_x_4:
mov [edx+6+2],cl mov [edx+6+2],cl
mov [edx+9],bp mov [edx+9],bp
mov [edx+9+2],cl mov [edx+9+2],cl
add edx,3*4
add edx,[OffsetYBigPixel]
add ebx,4*3 add ebx,4*3
add eax,3 add eax,3
dec esi dec esi
@ -210,7 +203,6 @@ screen_y:
screen_x: screen_x:
mov ecx,[eax] mov ecx,[eax]
and ecx,0xffffff
mov ebp,ecx mov ebp,ecx
shr ecx,16 shr ecx,16
;--------------------------------------------------------- ;---------------------------------------------------------
@ -243,17 +235,183 @@ big_pixel_x:
jnz screen_y jnz screen_y
fps: fps:
mov ebx,[ScreenPointer] ;calculate selection rect
cmp [instrument_used],1
jne .no_selection_rect
mov edx,[rectangular_shade_y]
sub edx,[PosY]
mov ecx,[rectangular_shade_x]
sub ecx,[PosX]
mov ebx,[OldY]
sub ebx,[PosY]
mov eax,[OldX]
sub eax,[PosX]
cmp [k],1
je .zo_1
cmp eax,ecx
jle @f
xchg eax,ecx
@@:
cmp ebx,edx
jle @f
xchg ebx,edx
@@:
inc eax
inc ebx
imul eax,[k]
imul ebx,[k]
imul ecx,[k]
imul edx,[k]
dec eax
dec ebx
.zo_1:
stdcall draw_selection_rect, eax,ebx,ecx,edx
.no_selection_rect:
mov ecx,[WorkScreen_SizeX] mov ecx,[WorkScreen_SizeX]
shl ecx,16 shl ecx,16
add ecx,[WorkScreen_SizeY] add ecx,[WorkScreen_SizeY]
mov edx,((ci_edit_wnd_x_pos+ci_edit_wnd_border) shl 16)\ mov edx,((ci_edit_wnd_x_pos+ci_edit_wnd_border) shl 16)\
+ (ci_edit_wnd_y_pos+ci_edit_wnd_border) + (ci_edit_wnd_y_pos+ci_edit_wnd_border)
mcall SF_PUT_IMAGE mcall SF_PUT_IMAGE, [ScreenPointer]
ret
;----------------------------------------------------------
align 4
proc draw_selection_rect, x0:dword, y0:dword, x1:dword, y1:dword
mov eax,0xffff3fff ;2:2
mov edx,0xff1f ;1:1
mov edi,[x0]
mov ebx,[y0]
mov ecx,[x1]
cmp edi,ecx
jle @f
xchg edi,ecx
@@:
call draw_line_h
mov ebx,[y1]
call draw_line_h
mov edi,[x0]
mov ecx,[y0]
cmp ebx,ecx
jle @f
xchg ebx,ecx
@@:
call draw_line_w
mov edi,[x1]
call draw_line_w
ret
endp
;input:
; eax - color1(g,r):color2(g,r)
; dx - color1(b):color2(b)
; edi - x0
; ebx - y0
; ecx - x1 (x1 >= x0)
align 4
draw_line_h:
cmp edi,ecx
je .end_f
cmp ecx,1
jl .end_f
cmp edi,[WorkScreen_SizeX]
jge .end_f
cmp ebx,0
jl .end_f
cmp ebx,[WorkScreen_SizeY]
jge .end_f
push ebx ecx edi
cmp ecx,[WorkScreen_SizeX]
jl @f
mov ecx,[WorkScreen_SizeX]
@@:
cmp edi,0
jge @f
xor edi,edi
@@:
sub ecx,edi
imul ebx,[WorkScreen_SizeX]
add edi,ebx
lea edi,[edi+edi*2]
add edi,[ScreenPointer]
cld
.line_t:
stosw
mov byte[edi],dl
inc edi
bt ecx,1
jc @f
bt ecx,0
jc @f
ror eax,16
ror dx,8
@@:
dec ecx
jnz .line_t
pop edi ecx ebx
.end_f:
ret
;input:
; eax - color1(g,r):color2(g,r)
; dx - color1(b):color2(b)
; edi - x0
; ebx - y0
; ecx - y1 (y1 >= y0)
align 4
draw_line_w:
cmp edi,0
jl .end_f
cmp edi,[WorkScreen_SizeX]
jge .end_f
cmp ebx,ecx
je .end_f
cmp ebx,[WorkScreen_SizeY]
jge .end_f
cmp ecx,1
jl .end_f
push ebx ecx edi
cmp ecx,[WorkScreen_SizeY]
jl @f
mov ecx,[WorkScreen_SizeY]
@@:
cmp ebx,0
jge @f
xor ebx,ebx
@@:
sub ecx,ebx
cmp ecx,1
jl .end_f
imul ebx,[WorkScreen_SizeX]
add edi,ebx
lea edi,[edi+edi*2]
add edi,[ScreenPointer]
mov ebx,[WorkScreen_SizeX]
lea ebx,[ebx+ebx*2]
sub ebx,2
cld
.line_r:
stosw
mov byte[edi],dl
add edi,ebx
bt ecx,1
jc @f
bt ecx,0
jc @f
ror eax,16
ror dx,8
@@:
dec ecx
jnz .line_r
pop edi ecx ebx
.end_f:
ret ret
;---------------------------------------------------------- ;----------------------------------------------------------
;--------------------clear screen-------------------------- ;--------------------clear screen--------------------------
;---------------------------------------------------------- ;----------------------------------------------------------
align 4
cleare_screen: cleare_screen:
mov edi,[ScreenPointer] mov edi,[ScreenPointer]
mov ebx,[WorkScreen_SizeX] mov ebx,[WorkScreen_SizeX]