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