function 'buf2d_bit_blt_alpha' can take negative coordinates in the position of the copied buffer

update function 'buf2d_bit_blt_transp'

git-svn-id: svn://kolibrios.org@2383 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA
2012-02-23 14:01:56 +00:00
parent e6242dd229
commit 7ff1f2a29d
2 changed files with 52 additions and 15 deletions

View File

@@ -2111,6 +2111,19 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu
jne .copy_end ;<3B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ebx,buf2d_h ;ebx - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E1ADAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov ecx,[coord_y]
cmp ecx,0
jge @f
;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y<0 (1-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9>)
add edx,ecx ;㬥<><E3ACA5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
cmp edx,0
jle .copy_end ;<3B><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><><EFBFBD><E5AEA4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (coord_y<0 <20> |coord_y|>buf_source.h)
neg ecx
;inc ecx
imul ecx,eax
shl ecx,2 ;<3B><> 4 <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
add esi,ecx ;ᤢ<><E1A4A2><EFBFBD><EFBFBD><EFBFBD><><E3AAA0><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>㥬묨 <20><><EFBFBD><EFBFBD>묨, <20> <20><><EFBFBD><20><EFBFBD><EFBFBD><E8A5AD> <20><><EFBFBD><EFBFBD><EFBFBD>
xor ecx,ecx ;<3B><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y
@@:
cmp ecx,ebx
jge .copy_end ;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> 'y' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add ecx,edx ;ecx - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
@@ -2121,8 +2134,15 @@ proc buf_bit_blt_transp, buf_destination:dword, coord_x:dword, coord_y:dword, bu
@@:
mov ebx,buf2d_w
mov ecx,ebx ;ecx <20><EFBFBD><E1AFAE><EFBFBD><20><><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD><><E6A5AB>
cmp [coord_y],0
jg .end_otr_c_y
;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y<=0 (2-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9>)
mov ecx,[coord_x]
jmp @f
.end_otr_c_y:
imul ecx,[coord_y]
add ecx,[coord_x]
@@:
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
@@ -2226,7 +2246,7 @@ combine_colors_2:
align 4
proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf_source:dword, color:dword
locals
right_bytes dd ?
lost_bytes dd ? ;<3B><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFADAD> <20><><EFBFBD><20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD> (<28><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>)
dest_w_bytes dd ? ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E0A8A5><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFA5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
endl
pushad
@@ -2234,7 +2254,7 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
mov edi,[buf_source]
cmp buf2d_bits,8
jne .error1 ;<3B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov eax,buf2d_w
mov eax,buf2d_w ;<3B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
mov edx,buf2d_h ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
mov esi,buf2d_data ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
@@ -2250,6 +2270,8 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
jge @f
;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y<0 (1-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9>)
add edx,ecx ;㬥<><E3ACA5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
cmp edx,0
jle .copy_end ;<3B><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><><EFBFBD><E5AEA4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (coord_y<0 <20> |coord_y|>buf_source.h)
neg ecx
;inc ecx
imul ecx,eax
@@ -2267,8 +2289,8 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
mov ebx,buf2d_w
mov ecx,[coord_y] ;ecx <20><EFBFBD><E1AFAE><EFBFBD><20><><EFBFBD> <20><EFBFBD><E0A5AC><EFBFBD><EFBFBD><EFBFBD><><E6A5AB>
cmp ecx,0
jge .end_otr_c_y
;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y<0 (2-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9>)
jg .end_otr_c_y
;<3B><20><><EFBFBD><EFBFBD><E0A4A8><EFBFBD><EFBFBD> coord_y<=0 (2-<2D> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9>)
mov ecx,[coord_x]
jmp @f
.end_otr_c_y:
@@ -2276,19 +2298,33 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
add ecx,[coord_x]
@@:
lea ecx,[ecx+ecx*2]
add ecx,buf2d_data
sub ebx,eax
add ecx,buf2d_data ;buf2d_data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E1ADAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sub ebx,eax ;ebx - <20><><EFBFBD> <20><EFBFBD><E1ADAE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E3A5AC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
mov edi,ecx ;edi 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><20><EFBFBD> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>
mov [right_bytes],0
mov dword[lost_bytes],0
mov ecx,[coord_x]
cmp ecx,0
jge @f
neg ecx
;inc ecx
cmp eax,ecx ;eax - <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
jle .copy_end ;<3B><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><EFBFBD><E0A0A6><EFBFBD><EFBFBD> <20><><EFBFBD><E5AEA4><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (coord_x<0 <20> |coord_x|>buf_source.w)
add [lost_bytes],ecx
sub eax,ecx ;㪮<><E3AAAE><EFBFBD><E7A8A2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD>
add ebx,ecx ;㤫<><E3A4AB><EFBFBD><20><><EFBFBD> <20><><EFBFBD><><E1A4A2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
add esi,ecx
lea ecx,[ecx+ecx*2]
add edi,ecx ;edi 㪠<><E3AAA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><20><EFBFBD> <20><EFBFBD><E0AEA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>
xor ecx,ecx
@@:
cmp ecx,ebx
jl @f
jle @f
sub ecx,ebx
sub eax,ecx ;㪮<><E3AAAE><EFBFBD><E7A8A2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD>
add ebx,ecx ;㤫<><E3A4AB><EFBFBD><20><><EFBFBD> <20><><EFBFBD><><E1A4A2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E2A8AD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;ecx - <20><><20><><EFBFBD><EFBFBD><E1A5AB> <20> 1-<2D> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><E2A8AD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBABA0><EFBFBD> <20><> <20><EFBFBD><E0A0A2> <20><><EFBFBD><EFBFBD>
mov [right_bytes],ecx
add [lost_bytes],ecx
@@:
lea ebx,[ebx+ebx*2] ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20> 1-<2D> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD> <20> 1-<2D> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A5AC> <20><><EFBFBD><EFBFBD><E2A8AD>
@@ -2296,7 +2332,7 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
mov ebx,[color]
cld
cmp [right_bytes],0
cmp dword[lost_bytes],0
jg .copy_1
.copy_0: ;<3B><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD>
mov ecx,eax
@@ -2310,7 +2346,7 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
cmp edx,0
jg .copy_0
jmp .copy_end
.copy_1: ;<3B><> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><E2A8AD> <20><EFBFBD><EBABA0><EFBFBD> <20><> <20><EFBFBD><E0A0A2> <20><><EFBFBD><EFBFBD>)
.copy_1: ;<3B><> <20><><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><E0AEA2><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><E2A8AD> <20><EFBFBD><EBABA0><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20>/<2F><><EFBFBD> <20><EFBFBD><E0A0A2> <20><><EFBFBD><EFBFBD>)
mov ecx,eax
@@:
call combine_colors_2
@@ -2318,7 +2354,7 @@ proc buf_bit_blt_alpha, buf_destination:dword, coord_x:dword, coord_y:dword, buf
inc esi
loop @b
add edi,[dest_w_bytes]
add esi,[right_bytes] ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBABA0><EFBFBD> <20><> <20><EFBFBD><E0A0A2> <20><EFBFBD><E0A0AD><EFBFBD>
add esi,[lost_bytes] ;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><EBABA0><EFBFBD> <20><> <20><EFBFBD><E0A0A2> <20><EFBFBD><E0A0AD><EFBFBD>
dec edx
cmp edx,0
jg .copy_1