Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 5153 → Rev 5175

/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc
6,13 → 6,13
pr2 dd ? ;ZBufferPoint*
l1 dd ? ;ZBufferPoint*
l2 dd ? ;ZBufferPoint*
fdx1 dd ?
fdx2 dd ?
fdy1 dd ?
fdy2 dd ?
fz dd ?
d1 dd ?
d2 dd ?
fdx1 dd ? ;float
fdx2 dd ? ;float
fdy1 dd ? ;float
fdy2 dd ? ;float
fz dd ? ;float
d1 dd ? ;float
d2 dd ? ;float
pz1 dd ? ;unsigned short*
pp1 dd ? ;PIXEL*
part dd ?
22,7 → 22,6
nb_lines dd ?
dx1 dd ?
dy1 dd ?
tmp dd ?
dx2 dd ?
dy2 dd ?
 
60,7 → 59,7
dbdl_max dd ?
end if
if INTERP_ST eq 1
;s1 dd ?
s1 dd ?
dsdx dd ?
dsdy dd ?
dsdl_min dd ?
72,343 → 71,751
dtdl_max dd ?
end if
if INTERP_STZ eq 1
sz1 dd ?
dszdx dd ?
dszdy dd ?
dszdl_min dd ?
dszdl_max dd ?
tz1 dd ?
dtzdx dd ?
dtzdy dd ?
dtzdl_min dd ?
dtzdl_max dd ?
sz1 dd ? ;float
dszdx dd ? ;float
dszdy dd ? ;float
dszdl_min dd ? ;float
dszdl_max dd ? ;float
tz1 dd ? ;float
dtzdx dd ? ;float
dtzdy dd ? ;float
dtzdl_min dd ? ;float
dtzdl_max dd ? ;float
end if
 
if DRAW_LINE_M eq 1
DRAW_LINE 0 ;переменные делаются в макросе
else
;edi = pp dd ?
n dd ? ;int
if INTERP_Z eq 1
pz dd ? ;unsigned short *
z dd ? ;uint
zz dd ? ;uint
end if
if INTERP_RGB eq 1
or1 dd ? ;uint
og1 dd ? ;uint
ob1 dd ? ;uint
end if
if INTERP_ST eq 1
s dd ? ;uint
t dd ? ;uint
end if
if INTERP_STZ eq 1
s_z dd ? ;float
t_z dd ? ;float
end if
end if
 
endl
 
; /* we sort the vertex with increasing y */
; if (p1->y < p0->y) {
; t = p0;
; p0 = p1;
; p1 = t;
; }
; if (p2->y < p0->y) {
; t = p2;
; p2 = p1;
; p1 = p0;
; p0 = t;
; } else if (p2->y < p1->y) {
; t = p1;
; p1 = p2;
; p2 = t;
; }
; we sort the vertex with increasing y
mov ebx,[p0]
mov ecx,[p1]
mov eax,[ebx+offs_zbup_y]
cmp [ecx+offs_zbup_y],eax
jge @f
;if (p1.y < p0.y)
mov [p0],ecx
mov [p1],ebx
xchg ebx,ecx
mov eax,[ebx+offs_zbup_y] ;обновляем p0.y для следующего сравнения
@@:
mov edx,[p2]
cmp [edx+offs_zbup_y],eax
jge @f
;if (p2.y < p0.y)
mov [p0],edx
mov [p1],ebx
mov [p2],ecx
mov ebx,[p0]
mov ecx,[p1]
mov edx,[p2]
jmp .end_e0
@@:
mov eax,[ecx+offs_zbup_y]
cmp [edx+offs_zbup_y],eax
jge .end_e0
;else if (p2.y < p1.y)
mov [p1],edx
mov [p2],ecx
.end_e0:
 
; we compute dXdx and dXdy for all interpolated values
 
; fdx1 = p1->x - p0->x;
; fdy1 = p1->y - p0->y;
mov eax,[ecx+offs_zbup_x]
sub eax,[ebx+offs_zbup_x]
mov [fdx1],eax ;p1.x - p0.x
mov eax,[ecx+offs_zbup_y]
sub eax,[ebx+offs_zbup_y]
mov [fdy1],eax ;p1.y - p0.y
 
; fdx2 = p2->x - p0->x;
; fdy2 = p2->y - p0->y;
mov eax,[edx+offs_zbup_x]
sub eax,[ebx+offs_zbup_x]
mov [fdx2],eax ;p2.x - p0.x
mov eax,[edx+offs_zbup_y]
sub eax,[ebx+offs_zbup_y]
mov [fdy2],eax ;p2.y - p0.y
 
; fz = fdx1 * fdy2 - fdx2 * fdy1;
; if (fz == 0)
; return;
; fz = 1.0 / fz;
fild dword[fdx2]
fst dword[fdx2]
fild dword[fdy1]
fst dword[fdy1]
fmulp
fild dword[fdx1]
fst dword[fdx1]
fild dword[fdy2]
fst dword[fdy2]
fmulp
fsubp ;st0 = st0-st1
fst dword[fz] ;fz = fdx1 * fdy2 - fdx2 * fdy1
fldz
fcompp ;if (fz == 0)
fstsw ax
sahf
je .end_f
fld1
fdiv dword[fz] ;fz = 1.0 / fz
fst dword[fz] ;st0 = fz
 
; fdx1 *= fz;
; fdy1 *= fz;
; fdx2 *= fz;
; fdy2 *= fz;
fld dword[fdx1]
fmul st0,st1
fstp dword[fdx1] ;fdx1 *= fz
fld dword[fdy1]
fmul st0,st1
fstp dword[fdy1] ;fdy1 *= fz
fld dword[fdx2]
fmul st0,st1
fstp dword[fdx2] ;fdx2 *= fz
fld dword[fdy2]
fmul st0,st1
fstp dword[fdy2] ;fdy2 *= fz
ffree st0
fincstp
 
if INTERP_Z eq 1
; d1 = p1->z - p0->z;
; d2 = p2->z - p0->z;
; dzdx = (int) (fdy2 * d1 - fdy1 * d2);
; dzdy = (int) (fdx1 * d2 - fdx2 * d1);
mov eax,[ecx+offs_zbup_z]
sub eax,[ebx+offs_zbup_z]
mov [d1],eax
mov eax,[edx+offs_zbup_z]
sub eax,[ebx+offs_zbup_z]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.z - p0.z
fild dword[d2]
fst dword[d2] ;d2 = p2.z - p0.z
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dzdx] ;dzdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dzdy] ;dzdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
end if
 
if INTERP_RGB eq 1
; d1 = p1->r - p0->r;
; d2 = p2->r - p0->r;
; drdx = (int) (fdy2 * d1 - fdy1 * d2);
; drdy = (int) (fdx1 * d2 - fdx2 * d1);
mov eax,[ecx+offs_zbup_r]
sub eax,[ebx+offs_zbup_r]
mov [d1],eax
mov eax,[edx+offs_zbup_r]
sub eax,[ebx+offs_zbup_r]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.r - p0.r
fild dword[d2]
fst dword[d2] ;d2 = p2.r - p0.r
 
; d1 = p1->g - p0->g;
; d2 = p2->g - p0->g;
; dgdx = (int) (fdy2 * d1 - fdy1 * d2);
; dgdy = (int) (fdx1 * d2 - fdx2 * d1);
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[drdx] ;drdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[drdy] ;drdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
 
; d1 = p1->b - p0->b;
; d2 = p2->b - p0->b;
; dbdx = (int) (fdy2 * d1 - fdy1 * d2);
; dbdy = (int) (fdx1 * d2 - fdx2 * d1);
mov eax,[ecx+offs_zbup_g]
sub eax,[ebx+offs_zbup_g]
mov [d1],eax
mov eax,[edx+offs_zbup_g]
sub eax,[ebx+offs_zbup_g]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.g - p0.g
fild dword[d2]
fst dword[d2] ;d2 = p2.g - p0.g
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dgdx] ;dgdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dgdy] ;dgdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
 
mov eax,[ecx+offs_zbup_b]
sub eax,[ebx+offs_zbup_b]
mov [d1],eax
mov eax,[edx+offs_zbup_b]
sub eax,[ebx+offs_zbup_b]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.b - p0.b
fild dword[d2]
fst dword[d2] ;d2 = p2.b - p0.b
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dbdx] ;dbdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dbdy] ;dbdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
end if
 
if INTERP_ST eq 1
; d1 = p1->s - p0->s;
; d2 = p2->s - p0->s;
; dsdx = (int) (fdy2 * d1 - fdy1 * d2);
; dsdy = (int) (fdx1 * d2 - fdx2 * d1);
mov eax,[ecx+offs_zbup_s]
sub eax,[ebx+offs_zbup_s]
mov [d1],eax
mov eax,[edx+offs_zbup_s]
sub eax,[ebx+offs_zbup_s]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.s - p0.s
fild dword[d2]
fst dword[d2] ;d2 = p2.s - p0.s
 
; d1 = p1->t - p0->t;
; d2 = p2->t - p0->t;
; dtdx = (int) (fdy2 * d1 - fdy1 * d2);
; dtdy = (int) (fdx1 * d2 - fdx2 * d1);
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dsdx] ;dsdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dsdy] ;dsdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
 
mov eax,[ecx+offs_zbup_t]
sub eax,[ebx+offs_zbup_t]
mov [d1],eax
mov eax,[edx+offs_zbup_t]
sub eax,[ebx+offs_zbup_t]
mov [d2],eax
fild dword[d1]
fst dword[d1] ;d1 = p1.t - p0.t
fild dword[d2]
fst dword[d2] ;d2 = p2.t - p0.t
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dtdx] ;dtdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dtdy] ;dtdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
end if
 
if INTERP_STZ eq 1
; {
; float zz;
; zz=(float) p0->z;
; p0->sz= (float) p0->s * zz;
; p0->tz= (float) p0->t * zz;
; zz=(float) p1->z;
; p1->sz= (float) p1->s * zz;
; p1->tz= (float) p1->t * zz;
; zz=(float) p2->z;
; p2->sz= (float) p2->s * zz;
; p2->tz= (float) p2->t * zz;
fild dword[ebx+offs_zbup_z]
fild dword[ebx+offs_zbup_s]
fmul st0,st1
fstp dword[ebx+offs_zbup_sz] ;p0.sz = (float) p0.s * p0.z
fild dword[ebx+offs_zbup_t]
fmul st0,st1
fstp dword[ebx+offs_zbup_tz] ;p0.tz = (float) p0.t * p0.z
ffree st0
fincstp
 
; d1 = p1->sz - p0->sz;
; d2 = p2->sz - p0->sz;
; dszdx = (fdy2 * d1 - fdy1 * d2);
; dszdy = (fdx1 * d2 - fdx2 * d1);
fild dword[ecx+offs_zbup_z]
fild dword[ecx+offs_zbup_s]
fmul st0,st1
fstp dword[ecx+offs_zbup_sz] ;p1.sz = (float) p1.s * p1.z
fild dword[ecx+offs_zbup_t]
fmul st0,st1
fstp dword[ecx+offs_zbup_tz] ;p1.tz = (float) p1.t * p1.z
ffree st0
fincstp
 
; d1 = p1->tz - p0->tz;
; d2 = p2->tz - p0->tz;
; dtzdx = (fdy2 * d1 - fdy1 * d2);
; dtzdy = (fdx1 * d2 - fdx2 * d1);
; }
fild dword[edx+offs_zbup_z]
fild dword[edx+offs_zbup_s]
fmul st0,st1
fstp dword[edx+offs_zbup_sz] ;p2.sz = (float) p2.s * p2.z
fild dword[edx+offs_zbup_t]
fmul st0,st1
fstp dword[edx+offs_zbup_tz] ;p2.tz = (float) p2.t * p2.z
ffree st0
fincstp
 
fld dword[ecx+offs_zbup_sz]
fsub dword[ebx+offs_zbup_sz]
fst dword[d1] ;d1 = p1.sz - p0.sz
fld dword[edx+offs_zbup_sz]
fsub dword[ebx+offs_zbup_sz]
fst dword[d2] ;d2 = p2.sz - p0.sz
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dszdx] ;dszdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dszdy] ;dszdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
 
fld dword[ecx+offs_zbup_tz]
fsub dword[ebx+offs_zbup_tz]
fst dword[d1] ;d1 = p1.tz - p0.tz
fld dword[edx+offs_zbup_tz]
fsub dword[ebx+offs_zbup_tz]
fst dword[d2] ;d2 = p2.tz - p0.tz
 
fld dword[fdy1]
fmul st0,st1
fld dword[fdy2]
fmul st0,st3
fsub st0,st1
fistp dword[dtzdx] ;dtzdx = (int) (fdy2*d1 - fdy1*d2)
ffree st0
fincstp
fld dword[fdx2]
fmul st0,st2
fld dword[fdx1]
fmul st0,st2
fsub st0,st1
fistp dword[dtzdy] ;dtzdy = (int) (fdx1*d2 - fdx2*d1)
ffree st0
fincstp
end if
 
; screen coordinates
 
; pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
; pz1 = zb->zbuf + p0->y * zb->xsize;
mov eax,[zb]
mov edx,[eax+offs_zbuf_linesize]
imul edx,[ebx+offs_zbup_y]
add edx,[eax+offs_zbuf_pbuf]
mov [pp1],edx ;pp1 = zb.pbuf + zb.linesize * p0.y
mov edx,[eax+offs_zbuf_xsize]
imul edx,[ebx+offs_zbup_y]
shl edx,1
add edx,[eax+offs_zbuf_zbuf]
mov [pz1],edx ;pz1 = zb.zbuf + zb.xsize * p0.y
 
DRAW_INIT
 
; for(part=0;part<2;part++) {
; if (part == 0) {
; if (fz > 0) {
; update_left=1;
; update_right=1;
; l1=p0;
; l2=p2;
; pr1=p0;
; pr2=p1;
; } else {
; update_left=1;
; update_right=1;
; l1=p0;
; l2=p1;
; pr1=p0;
; pr2=p2;
; }
; nb_lines = p1->y - p0->y;
; } else {
; /* second part */
; if (fz > 0) {
; update_left=0;
; update_right=1;
; pr1=p1;
; pr2=p2;
; } else {
; update_left=1;
; update_right=0;
; l1=p1;
; l2=p2;
; }
; nb_lines = p2->y - p1->y + 1;
; }
mov dword[part],0
.cycle_0:
mov ebx,[p0]
mov ecx,[p1]
mov edx,[p2]
cmp dword[part],0
jne .els_0
mov dword[update_left],1
mov dword[update_right],1
mov [l1],ebx
mov [pr1],ebx
fldz
fld dword[fz]
fcompp ;if (fz > 0)
fstsw ax
sahf
jbe .els_1
mov [l2],edx
mov [pr2],ecx
jmp .end_1
.els_1:
mov [l2],ecx
mov [pr2],edx
.end_1:
mov eax,[ecx+offs_zbup_y]
sub eax,[ebx+offs_zbup_y]
mov [nb_lines],eax ;nb_lines = p1.y - p0.y
jmp .end_0
.els_0:
; second part
mov dword[update_left],0
mov dword[update_right],1
fldz
fld dword[fz]
fcompp ;if (fz > 0)
fstsw ax
sahf
jbe .els_2
mov [pr1],ecx
mov [pr2],edx
jmp .end_2
.els_2:
mov [l1],ecx
mov [l2],edx
.end_2:
mov eax,[edx+offs_zbup_y]
sub eax,[ecx+offs_zbup_y]
inc eax
mov [nb_lines],eax ;nb_lines = p2.y - p1.y + 1
.end_0:
 
; compute the values for the left edge
 
; if (update_left) {
; dy1 = l2->y - l1->y;
; dx1 = l2->x - l1->x;
; if (dy1 > 0)
; tmp = (dx1 << 16) / dy1;
; else
; tmp = 0;
; x1 = l1->x;
; error = 0;
; derror = tmp & 0x0000ffff;
; dxdy_min = tmp >> 16;
; dxdy_max = dxdy_min + 1;
cmp dword[update_left],0 ;if (update_left)
je .end_upd_l
mov ebx,[l1]
mov ecx,[l2]
mov eax,[ecx+offs_zbup_x]
sub eax,[ebx+offs_zbup_x]
mov [dx1],eax ;dx1 = l2.x - l1.x
mov eax,[ecx+offs_zbup_y]
sub eax,[ebx+offs_zbup_y]
mov [dy1],eax ;dy1 = l2.y - l1.y
cmp eax,0 ;if (dy1 > 0)
jle .els_3
mov eax,[dx1]
shl eax,16
xor edx,edx
div dword[dy1] ;eax = (dx1 << 16) / dy1
jmp .end_3
.els_3:
xor eax,eax
.end_3:
mov edx,[ebx+offs_zbup_x]
mov [x1],edx
mov dword[error],0
mov dword[derror],eax
and dword[derror],0xffff
shr eax,16
mov [dxdy_min],eax
inc eax
mov [dxdy_max],eax
 
if INTERP_Z eq 1
; z1=l1->z;
; dzdl_min=(dzdy + dzdx * dxdy_min);
; dzdl_max=dzdl_min + dzdx;
mov eax,[l1]
mov eax,[eax+offs_zbup_z]
mov [z1],eax ;z1 = l1.z
mov eax,[dzdx]
imul eax,[dxdy_min]
add eax,[dzdy]
mov [dzdl_min],eax ;dzdl_min = (dzdy +dzdx*dxdy_min)
add eax,[dzdx]
mov [dzdl_max],eax ;dzdl_max = dzdl_min +dzdx
end if
if INTERP_RGB eq 1
; r1=l1->r;
; drdl_min=(drdy + drdx * dxdy_min);
; drdl_max=drdl_min + drdx;
mov ebx,[l1]
mov eax,[ebx+offs_zbup_r]
mov [r1],eax ;r1 = l1.r
mov eax,[drdx]
imul eax,[dxdy_min]
add eax,[drdy]
mov [drdl_min],eax ;drdl_min = (drdy +drdx*dxdy_min)
add eax,[drdx]
mov [drdl_max],eax ;drdl_max = drdl_min +drdx
 
; g1=l1->g;
; dgdl_min=(dgdy + dgdx * dxdy_min);
; dgdl_max=dgdl_min + dgdx;
mov eax,[ebx+offs_zbup_g]
mov [g1],eax ;g1 = l1.g
mov eax,[dgdx]
imul eax,[dxdy_min]
add eax,[dgdy]
mov [dgdl_min],eax ;dgdl_min = (dgdy +dgdx*dxdy_min)
add eax,[dgdx]
mov [dgdl_max],eax ;dgdl_max = dgdl_min +dgdx
 
; b1=l1->b;
; dbdl_min=(dbdy + dbdx * dxdy_min);
; dbdl_max=dbdl_min + dbdx;
mov eax,[ebx+offs_zbup_b]
mov [b1],eax ;b1 = l1.b
mov eax,[dbdx]
imul eax,[dxdy_min]
add eax,[dbdy]
mov [dbdl_min],eax ;dbdl_min = (dbdy +dbdx*dxdy_min)
add eax,[dbdx]
mov [dbdl_max],eax ;dbdl_max = dbdl_min +dbdx
 
end if
if INTERP_ST eq 1
; s1=l1->s;
; dsdl_min=(dsdy + dsdx * dxdy_min);
; dsdl_max=dsdl_min + dsdx;
mov ebx,[l1]
mov eax,[ebx+offs_zbup_s]
mov [s1],eax ;s1 = l1.s
mov eax,[dsdx]
imul eax,[dxdy_min]
add eax,[dsdy]
mov [dsdl_min],eax ;dsdl_min = (dsdy +dsdx*dxdy_min)
add eax,[dsdx]
mov [dsdl_max],eax ;dsdl_max = dsdl_min +dsdx
 
; t1=l1->t;
; dtdl_min=(dtdy + dtdx * dxdy_min);
; dtdl_max=dtdl_min + dtdx;
mov eax,[ebx+offs_zbup_t]
mov [t1],eax ;t1 = l1.t
mov eax,[dtdx]
imul eax,[dxdy_min]
add eax,[dtdy]
mov [dtdl_min],eax ;dtdl_min = (dtdy +dtdx*dxdy_min)
add eax,[dtdx]
mov [dtdl_max],eax ;dtdl_max = dtdl_min +dtdx
end if
if INTERP_STZ eq 1
; sz1=l1->sz;
; dszdl_min=(dszdy + dszdx * dxdy_min);
; dszdl_max=dszdl_min + dszdx;
mov ebx,[l1]
mov eax,[ebx+offs_zbup_sz]
mov [sz1],eax ;sz1 = l1.sz - преобразований нет, потому без сопроцессора
fild dword[dxdy_min]
fmul dword[dszdx]
fadd dword[dszdy]
fst dword[dszdl_min] ;dszdl_min = (dszdy +dszdx*dxdy_min)
fadd dword[dszdx]
fstp dword[dszdl_max] ;dszdl_max = dszdl_min +dszdx
 
; tz1=l1->tz;
; dtzdl_min=(dtzdy + dtzdx * dxdy_min);
; dtzdl_max=dtzdl_min + dtzdx;
mov eax,[ebx+offs_zbup_tz]
mov [tz1],eax ;tz1 = l1.tz - преобразований нет, потому без сопроцессора
fild dword[dxdy_min]
fmul dword[dtzdx]
fadd dword[dtzdy]
fst dword[dtzdl_min] ;dtzdl_min = (dtzdy +dtzdx*dxdy_min)
fadd dword[dtzdx]
fstp dword[dtzdl_max] ;dtzdl_max = dtzdl_min +dtzdx
end if
; }
.end_upd_l:
 
; /* compute values for the right edge */
; compute values for the right edge
 
; if (update_right) {
; dx2 = (pr2->x - pr1->x);
; dy2 = (pr2->y - pr1->y);
; if (dy2>0)
; dx2dy2 = ( dx2 << 16) / dy2;
; else
; dx2dy2 = 0;
; x2 = pr1->x << 16;
; }
cmp dword[update_right],0 ;if(update_right)
je .end_upd_r
mov ebx,[pr1]
mov ecx,[pr2]
mov eax,[ecx+offs_zbup_x]
sub eax,[ebx+offs_zbup_x]
mov [dx2],eax ;dx2 = pr2.x - pr1.x
mov eax,[ecx+offs_zbup_y]
sub eax,[ebx+offs_zbup_y]
mov [dy2],eax ;dy2 = pr2.y - pr1.y
cmp eax,0 ;if (dy2 > 0)
jle .els_4
mov eax,[dx2]
shl eax,16
xor edx,edx
div dword[dy2] ;eax = (dx2 << 16) / dy2
jmp .end_4
.els_4:
xor eax,eax
.end_4:
mov [dx2dy2],eax
mov eax,[ebx+offs_zbup_x]
shl eax,16
mov [x2],eax ; x2 = pr1.x << 16
.end_upd_r:
 
; /* we draw all the scan line of the part */
; we draw all the scan line of the part
 
; while (nb_lines>0) {
; nb_lines--;
;#ifndef DRAW_LINE
; /* generic draw line */
; {
; register PIXEL *pp;
; register int n;
.beg_w_lin:
cmp dword[nb_lines],0 ;while (nb_lines>0)
jle .end_w_lin
dec dword[nb_lines]
if DRAW_LINE_M eq 1
DRAW_LINE 1
else
; generic draw line
mov eax,[x2]
shr eax,16
mov edi,[x1]
sub eax,edi
mov [n],eax ;n = (x2 >> 16) - x1
imul edi,PSZB
add edi,[pp1] ;pp = pp1 + x1 * PSZB
if INTERP_Z eq 1
; register unsigned short *pz;
; register unsigned int z,zz;
mov eax,[x1]
shl eax,1
add eax,[pz1]
mov [pz],eax
mov eax,[z1]
mov [z],eax
end if
if INTERP_RGB eq 1
; register unsigned int or1,og1,ob1;
mov eax,[r1]
mov [or1],eax
mov eax,[g1]
mov [og1],eax
mov eax,[b1]
mov [ob1],eax
end if
if INTERP_ST eq 1
; register unsigned int s,t;
mov eax,[s1]
mov [s],eax
mov eax,[t1]
mov [t],eax
end if
if INTERP_STZ eq 1
; float sz,tz;
mov eax,[sz1]
mov [s_z],eax
mov eax,[tz1]
mov [t_z],eax
end if
; n=(x2 >> 16) - x1;
; pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
.cycle_1: ;while (n>=3)
PUT_PIXEL 0
PUT_PIXEL 1
PUT_PIXEL 2
PUT_PIXEL 3
if INTERP_Z eq 1
; pz=pz1+x1;
; z=z1;
add dword[pz],8 ;=4*sizeof(uint)
end if
if INTERP_RGB eq 1
; or1 = r1;
; og1 = g1;
; ob1 = b1;
end if
if INTERP_ST eq 1
; s=s1;
; t=t1;
end if
if INTERP_STZ eq 1
; sz=sz1;
; tz=tz1;
end if
; while (n>=3) {
; PUT_PIXEL(0);
; PUT_PIXEL(1);
; PUT_PIXEL(2);
; PUT_PIXEL(3);
add edi,4*PSZB
sub dword[n],4
cmp dword[n],3
jge .cycle_1
.cycle_2: ;while (n>=0)
PUT_PIXEL 0
if INTERP_Z eq 1
; pz+=4;
add dword[pz],2 ;=sizeof(uint)
end if
; pp=(PIXEL *)((char *)pp + 4 * PSZB);
; n-=4;
; }
; while (n>=0) {
; PUT_PIXEL(0);
if INTERP_Z eq 1
; pz+=1;
add edi,PSZB
dec dword[n]
cmp dword[n],0
jge .cycle_2
end if
; pp=(PIXEL *)((char *)pp + PSZB);
; n-=1;
; }
; }
;#else
; DRAW_LINE();
;#endif
;
; /* left edge */
; error+=derror;
; if (error > 0) {
; error-=0x10000;
; x1+=dxdy_max;
 
; left edge
mov eax,[derror]
add [error],eax
cmp eax,0 ;if (error > 0)
jle .els_er
sub dword[error],0x10000
mov eax,[dxdy_max]
add [x1],eax
if INTERP_Z eq 1
; z1+=dzdl_max;
mov eax,[dzdl_max]
add [z1],eax
end if
if INTERP_RGB eq 1
; r1+=drdl_max;
; g1+=dgdl_max;
; b1+=dbdl_max;
mov eax,[drdl_max]
add [r1],eax
mov eax,[dgdl_max]
add [g1],eax
mov eax,[dbdl_max]
add [b1],eax
end if
if INTERP_ST eq 1
; s1+=dsdl_max;
; t1+=dtdl_max;
mov eax,[dsdl_max]
add [s1],eax
mov eax,[dtdl_max]
add [t1],eax
end if
if INTERP_STZ eq 1
; sz1+=dszdl_max;
; tz1+=dtzdl_max;
fld dword[dszdl_max]
fadd dword[sz1]
fstp dword[sz1]
fld dword[dtzdl_max]
fadd dword[tz1]
fstp dword[tz1]
end if
; } else {
; x1+=dxdy_min;
jmp .end_er
.els_er:
mov eax,[dxdy_min]
add [x1],eax
if INTERP_Z eq 1
; z1+=dzdl_min;
mov eax,[dzdl_min]
add [z1],eax
end if
if INTERP_RGB eq 1
; r1+=drdl_min;
; g1+=dgdl_min;
; b1+=dbdl_min;
mov eax,[drdl_min]
add [r1],eax
mov eax,[dgdl_min]
add [g1],eax
mov eax,[dbdl_min]
add [b1],eax
end if
if INTERP_ST eq 1
; s1+=dsdl_min;
; t1+=dtdl_min;
mov eax,[dsdl_min]
add [s1],eax
mov eax,[dtdl_min]
add [t1],eax
end if
if INTERP_STZ eq 1
; sz1+=dszdl_min;
; tz1+=dtzdl_min;
fld dword[dszdl_min]
fadd dword[sz1]
fstp dword[sz1]
fld dword[dtzdl_min]
fadd dword[tz1]
fstp dword[tz1]
end if
; }
;
; /* right edge */
; x2+=dx2dy2;
;
; /* screen coordinates */
; pp1=(PIXEL *)((char *)pp1 + zb->linesize);
; pz1+=zb->xsize;
; }
; }
;}
.end_er:
 
; right edge
mov eax,[dx2dy2]
add [x2],eax
 
; screen coordinates
mov ebx,[zb]
mov eax,[ebx+offs_zbuf_linesize]
add [pp1],eax
mov eax,[ebx+offs_zbuf_xsize]
shl eax,1
add [pz1],eax
jmp .beg_w_lin
.end_w_lin:
inc dword[part]
cmp dword[part],2
jl .cycle_0
.end_f:
ret
endp
 
restore INTERP_Z
restore INTERP_RGB
restore INTERP_ST
restore INTERP_STZ
restore DRAW_LINE_M
 
purge DRAW_INIT
purge DRAW_LINE