14,8 → 14,8 |
|
|
struct BLITTER |
dc RECT |
sc RECT |
dc BLITTER_BLOCK |
sc BLITTER_BLOCK |
dst_x dd ? ; 32 |
dst_y dd ? ; 36 |
src_x dd ? ; 40 |
28,84 → 28,145 |
ends |
|
|
|
align 4 |
block_clip: |
;esi= clip RECT ptr |
;edi= RECT ptr |
;return code: |
;eax= 0 - draw, 1 - don't draw |
|
__L1OutCode: |
push ebx |
mov ebx, 8 |
cmp edx, [eax] |
jl .L2 |
xor ebx, ebx |
cmp edx, [eax+8] |
setg bl |
sal ebx, 2 |
.L2: |
cmp ecx, [eax+4] |
jge .L3 |
or ebx, 1 |
jmp .L4 |
|
mov eax, [edi+RECT.left] |
mov ebx, [edi+RECT.right] |
mov ecx, [esi+RECT.left] ;clip.left |
mov edx, [esi+RECT.right] ;clip.right |
.L3: |
cmp ecx, [eax+12] |
jle .L4 |
or ebx, 2 |
.L4: |
mov eax, ebx |
pop ebx |
ret |
|
cmp eax, edx ;left >= clip.right |
jge .fail |
align 4 |
block_clip: |
push ebp |
push edi |
push esi |
push ebx |
sub esp, 4 |
|
cmp ebx, ecx ;right < clip.left |
jl .fail |
mov ebx, eax |
mov [esp], edx |
mov ebp, ecx |
mov ecx, [ecx] |
mov edx, [edx] |
call __L1OutCode |
|
cmp eax, ecx ;left >= clip.left |
jae @F |
mov esi, eax |
mov edx, [esp+28] |
mov ecx, [edx] |
.L21: |
mov eax, [esp+24] |
mov edx, [eax] |
mov eax, ebx |
call __L1OutCode |
|
mov eax, ecx |
@@: |
mov [edi+RECT.left], eax |
|
cmp ebx, edx ;right <= clip.right |
jle @f |
mov ebx, edx |
@@: |
mov [edi+RECT.right], ebx |
|
mov eax, [edi+RECT.top] |
mov ebx, [edi+RECT.bottom] |
mov ecx, [esi+RECT.top] ;clip.top |
mov edx, [esi+RECT.bottom] ;clip.bottom |
|
cmp eax, edx ;top >= clip.bottom |
jge .fail |
|
cmp ebx, ecx ;bottom < clip.top |
jl .fail |
|
cmp eax, ecx ;top >= clip.top |
jae @F |
|
mov eax, ecx |
@@: |
mov [edi+RECT.top], eax |
|
cmp ebx, edx ;bottom <= clip.bottom |
jle @f |
mov ebx, edx |
@@: |
mov [edi+RECT.bottom], ebx |
mov edi, eax |
.L20: |
mov eax, edi |
and eax, esi |
jne .L9 |
cmp esi, edi |
je .L9 |
test esi, esi |
jne .L10 |
test edi, 1 |
je .L11 |
mov eax, [ebx+4] |
jmp .L25 |
.L11: |
test edi, 2 |
je .L13 |
mov eax, [ebx+12] |
.L25: |
mov edx, [esp+28] |
jmp .L22 |
.L13: |
test edi, 4 |
je .L14 |
mov eax, [ebx+8] |
jmp .L26 |
.L14: |
and edi, 8 |
je .L12 |
mov eax, [ebx] |
.L26: |
mov edx, [esp+24] |
.L22: |
mov [edx], eax |
.L12: |
mov eax, [esp+28] |
mov ecx, [eax] |
jmp .L21 |
.L10: |
test esi, 1 |
je .L16 |
mov eax, [ebx+4] |
jmp .L23 |
.L16: |
test esi, 2 |
je .L18 |
mov eax, [ebx+12] |
.L23: |
mov [ebp+0], eax |
jmp .L17 |
.L18: |
test esi, 4 |
je .L19 |
mov eax, [ebx+8] |
jmp .L24 |
.L19: |
and esi, 8 |
je .L17 |
mov eax, [ebx] |
.L24: |
mov edx, [esp] |
mov [edx], eax |
.L17: |
mov ecx, [ebp+0] |
mov eax, [esp] |
mov edx, [eax] |
mov eax, ebx |
call __L1OutCode |
mov esi, eax |
jmp .L20 |
.L9: |
add esp, 4 |
pop ebx |
xor eax, eax |
pop esi |
pop edi |
pop ebp |
ret |
.fail: |
pop ebx |
mov eax, 1 |
ret |
|
|
align 4 |
blit_clip: |
|
.sx0 equ 8 |
.sy0 equ 12 |
.sx1 equ 16 |
.sy1 equ 20 |
.sx0 equ 36 |
.sy0 equ 32 |
.sx1 equ 28 |
.sy1 equ 24 |
|
.dx0 equ 24 |
.dy0 equ 28 |
.dx1 equ 32 |
.dy1 equ 36 |
.dx0 equ 20 |
.dy0 equ 16 |
.dx1 equ 12 |
.dy1 equ 8 |
|
|
push edi |
119,17 → 180,25 |
mov eax, [ecx+BLITTER.src_y] |
mov [esp+.sy0], eax |
add edx, [ecx+BLITTER.w] |
dec edx |
mov [esp+.sx1], edx |
add eax, [ecx+BLITTER.h] |
mov [esp+.sx1], edx |
dec eax |
mov [esp+.sy1], eax |
|
lea edi, [esp+.sx0] |
lea esi, [ebx+BLITTER.sc] |
lea ecx, [esp+.sy0] |
lea edx, [esp+.sx0] |
lea eax, [ebx+BLITTER.sc] |
lea esi, [esp+.sy1] |
|
mov [esp+4], esi |
lea esi, [esp+.sx1] |
mov [esp], esi |
call block_clip |
|
mov esi, 1 |
test eax, eax |
mov esi, 1 |
jnz .done |
jne .L28 |
|
mov edi, [esp+.sx0] |
mov edx, [ebx+BLITTER.dst_x] |
142,7 → 211,6 |
add eax, ecx |
sub eax, [ebx+BLITTER.src_y] |
mov [esp+.dy0], eax |
|
sub edx, edi |
add edx, [esp+.sx1] |
mov [esp+.dx1], edx |
151,20 → 219,26 |
add eax, [esp+.sy1] |
mov [esp+.dy1], eax |
|
lea edi, [esp+.dx0] |
lea esi, [ebx+BLITTER.dc] |
lea ecx, [esp+.dy0] |
lea edx, [esp+.dx0] |
lea eax, [esp+.dy1] |
mov [esp+4], eax |
lea eax, [esp+.dx1] |
mov [esp], eax |
mov eax, ebx |
call block_clip |
test eax, eax |
mov esi, 1 |
jnz .done |
jne .L28 |
|
mov edx, [esp+.dx0] |
mov eax, [esp+.dx1] |
inc eax |
sub eax, edx |
mov [ebx+BLITTER.w], eax |
|
mov eax, [esp+.dy0] |
mov ecx, [esp+.dy1] |
inc ecx |
sub ecx, eax |
mov [ebx+BLITTER.h], ecx |
|
180,7 → 254,7 |
mov [ebx+BLITTER.dst_x], edx |
mov [ebx+BLITTER.dst_y], eax |
xor esi, esi |
.done: |
.L28: |
mov eax, esi |
add esp, 40 |
pop ebx |
200,7 → 274,10 |
|
ret |
|
|
|
align 4 |
|
blit_32: |
push ebp |
push edi |
211,25 → 288,23 |
mov eax, [TASK_BASE] |
mov ebx, [eax-twdw + WDATA.box.width] |
mov edx, [eax-twdw + WDATA.box.height] |
inc ebx |
inc edx |
|
xor eax, eax |
|
mov [esp+BLITTER.dc.left], eax |
mov [esp+BLITTER.dc.top], eax |
mov [esp+BLITTER.dc.right], ebx |
mov [esp+BLITTER.dc.bottom], edx |
mov [esp+BLITTER.dc.xmin], eax |
mov [esp+BLITTER.dc.ymin], eax |
mov [esp+BLITTER.dc.xmax], ebx |
mov [esp+BLITTER.dc.ymax], edx |
|
mov [esp+BLITTER.sc.left], eax |
mov [esp+BLITTER.sc.top], eax |
mov [esp+BLITTER.sc.xmin], eax |
mov [esp+BLITTER.sc.ymin], eax |
mov eax, [ecx+24] |
|
mov [esp+BLITTER.sc.right], eax |
dec eax |
mov [esp+BLITTER.sc.xmax], eax |
mov eax, [ecx+28] |
dec eax |
mov [esp+BLITTER.sc.ymax], eax |
|
mov [esp+BLITTER.sc.bottom], eax |
|
mov eax, [ecx] |
mov [esp+BLITTER.dst_x], eax |
mov eax, [ecx+4] |
354,7 → 429,7 |
|
.done: |
; call [draw_pointer] |
; call __sys_draw_pointer |
call __sys_draw_pointer |
.L57: |
add esp, 72 |
pop ebx |