forked from KolibriOS/kolibrios
206 lines
3.9 KiB
Plaintext
206 lines
3.9 KiB
Plaintext
|
draw_triangle:
|
||
|
;----------in - eax - x1 shl 16 + y1
|
||
|
;------------- -ebx - x2 shl 16 + y2
|
||
|
;---------------ecx - x3 shl 16 + y3
|
||
|
;---------------edx - color 0x00rrggbb
|
||
|
;---------------edi - pointer to screen buffer
|
||
|
|
||
|
.col equ ebp-4 ;dd ?
|
||
|
.x1 equ ebp-6 ;dw ?
|
||
|
.y1 equ ebp-8 ;dw ?;+8
|
||
|
.x2 equ ebp-10 ;dw ?
|
||
|
.y2 equ ebp-12 ;dw ?
|
||
|
.x3 equ ebp-14 ;dw ?
|
||
|
.y3 equ ebp-16 ;dw ?;+16
|
||
|
.dx12 equ ebp-20 ; dd ?
|
||
|
.dx13 equ ebp-24 ; dd ?;+24
|
||
|
.dx23 equ ebp-28 ; dd ?
|
||
|
|
||
|
mov ebp,esp
|
||
|
; sub esp,28
|
||
|
push edx
|
||
|
.ch3:
|
||
|
cmp ax,bx
|
||
|
jg .ch1
|
||
|
.ch4: ; sort parameters
|
||
|
cmp bx,cx
|
||
|
jg .ch2
|
||
|
jle .chEnd
|
||
|
.ch1:
|
||
|
xchg eax,ebx
|
||
|
jmp .ch4
|
||
|
.ch2:
|
||
|
xchg ebx,ecx
|
||
|
jmp .ch3
|
||
|
.chEnd:
|
||
|
; mov dword[.y1],eax ; ..and store to user friendly variables
|
||
|
; mov dword[.y2],ebx
|
||
|
; mov dword[.y3],ecx
|
||
|
; mov [.col],edx
|
||
|
push eax
|
||
|
push ebx
|
||
|
push ecx
|
||
|
sub esp,12
|
||
|
mov edx,eax ; eax,ebx,ecx are ORd together into edx which means that
|
||
|
or edx,ebx ; if any *one* of them is negative a sign flag is raised
|
||
|
or edx,ecx
|
||
|
test edx,80008000h ; Check both X&Y at once
|
||
|
jne .end_triangle
|
||
|
|
||
|
cmp word[.x1],SIZE_X ; {
|
||
|
jg .end_triangle
|
||
|
cmp word[.x2],SIZE_X ; This can be optimized with effort
|
||
|
jg .end_triangle
|
||
|
cmp word[.x3],SIZE_X
|
||
|
jg .end_triangle ; }
|
||
|
|
||
|
shr eax,16
|
||
|
shr ebx,16
|
||
|
shr ecx,16
|
||
|
|
||
|
neg ax ; calculate delta 12
|
||
|
add ax,bx
|
||
|
cwde
|
||
|
shl eax,ROUND
|
||
|
cdq
|
||
|
mov bx,[.y2]
|
||
|
mov cx,[.y1]
|
||
|
sub bx,cx
|
||
|
;cmp ebx,0
|
||
|
jne .noZero1
|
||
|
mov dword[.dx12],0
|
||
|
jmp .yesZero1
|
||
|
.noZero1:
|
||
|
idiv ebx
|
||
|
mov [.dx12],eax
|
||
|
.yesZero1:
|
||
|
|
||
|
mov ax,[.x3] ; calculate delta 13
|
||
|
sub ax,[.x1]
|
||
|
cwde
|
||
|
shl eax,ROUND
|
||
|
cdq
|
||
|
mov bx,[.y3]
|
||
|
mov cx,[.y1]
|
||
|
sub bx,cx
|
||
|
;cmp ebx,0
|
||
|
jne .noZero2
|
||
|
mov dword[.dx13],0
|
||
|
jmp .yesZero2
|
||
|
.noZero2:
|
||
|
idiv ebx
|
||
|
mov [.dx13],eax
|
||
|
.yesZero2:
|
||
|
|
||
|
mov ax,[.x3] ; calculate delta 23 [dx23]
|
||
|
sub ax,[.x2]
|
||
|
cwde
|
||
|
shl eax,ROUND
|
||
|
cdq
|
||
|
mov bx,[.y3]
|
||
|
mov cx,[.y2]
|
||
|
sub bx,cx
|
||
|
;cmp ebx,0
|
||
|
jne .noZero3
|
||
|
mov dword[.dx23],0
|
||
|
jmp .yesZero3
|
||
|
.noZero3:
|
||
|
idiv ebx
|
||
|
mov [.dx23],eax
|
||
|
.yesZero3:
|
||
|
|
||
|
movsx eax,word[.x1] ; eax - xk1 ;;;
|
||
|
shl eax,ROUND
|
||
|
mov ebx,eax ; ebx - xk2 ;;;
|
||
|
movsx esi,word[.y1] ; esi - y
|
||
|
.next_line1:
|
||
|
mov ecx,eax ; ecx - x11
|
||
|
sar ecx,ROUND
|
||
|
mov edx,ebx ; edx - x12
|
||
|
sar edx,ROUND
|
||
|
cmp ecx,edx
|
||
|
jle .nochg
|
||
|
xchg ecx,edx
|
||
|
.nochg:
|
||
|
pusha
|
||
|
mov ebx,ecx
|
||
|
sub edx,ecx
|
||
|
mov ecx,edx
|
||
|
mov edx,esi
|
||
|
mov eax,[.col]
|
||
|
call .horizontal_line
|
||
|
popa
|
||
|
add eax,[.dx13]
|
||
|
add ebx,[.dx12]
|
||
|
inc esi
|
||
|
cmp si,[.y2]
|
||
|
jl .next_line1
|
||
|
|
||
|
movzx esi,word[.y2]
|
||
|
movzx ebx,word[.x2]
|
||
|
shl ebx,ROUND
|
||
|
.next_line2:
|
||
|
mov ecx,eax
|
||
|
sar ecx,ROUND
|
||
|
mov edx,ebx
|
||
|
sar edx,ROUND
|
||
|
cmp ecx,edx
|
||
|
jle .nochg1
|
||
|
xchg ecx,edx
|
||
|
.nochg1:
|
||
|
pusha
|
||
|
mov ebx,ecx
|
||
|
sub edx,ecx
|
||
|
mov ecx,edx
|
||
|
mov edx,esi
|
||
|
mov eax,[.col]
|
||
|
call .horizontal_line
|
||
|
popa
|
||
|
add eax,[.dx13]
|
||
|
add ebx,[.dx23]
|
||
|
inc esi
|
||
|
cmp si,[.y3]
|
||
|
jl .next_line2
|
||
|
.end_triangle:
|
||
|
|
||
|
mov esp,ebp
|
||
|
ret
|
||
|
|
||
|
.horizontal_line:
|
||
|
;---------in
|
||
|
;---------eax - color of line, 0x00RRGGBB
|
||
|
;---------ebx - x1 - x position of line begin
|
||
|
;---------ecx - lenght of line
|
||
|
;---------edx - y position of line
|
||
|
;---------edi - pointer to buffer
|
||
|
jcxz .end_hor_l
|
||
|
; or edx,edx
|
||
|
; jl .end_hor_l
|
||
|
cmp edx,SIZE_Y
|
||
|
jg .end_hor_l
|
||
|
push eax
|
||
|
mov eax,SIZE_X*3
|
||
|
mul edx
|
||
|
add edi,eax ; calculate line begin adress
|
||
|
;add edi,ebx
|
||
|
;shl ebx,1
|
||
|
lea edi,[edi+ebx*2]
|
||
|
add edi,ebx
|
||
|
pop eax
|
||
|
cld
|
||
|
;mov dword[edi-3],0000FF00h
|
||
|
dec ecx
|
||
|
jecxz .last_pix
|
||
|
.ddraw: ; Drawing horizontally:
|
||
|
;push eax
|
||
|
stosd ; 4 bytes at a time
|
||
|
dec edi ; point to the 4th
|
||
|
loop .ddraw
|
||
|
.last_pix:
|
||
|
stosw
|
||
|
shr eax,16
|
||
|
stosb
|
||
|
; mov byte[edi],0 ; The last 4th will be reset
|
||
|
.end_hor_l:
|
||
|
ret
|