Subversion Repositories Kolibri OS

Rev

Rev 5153 | Rev 5187 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5153 Rev 5175
Line 4... Line 4...
4
	t dd ? ;ZBufferPoint*
4
	t dd ? ;ZBufferPoint*
5
	pr1 dd ? ;ZBufferPoint*
5
	pr1 dd ? ;ZBufferPoint*
6
	pr2 dd ? ;ZBufferPoint*
6
	pr2 dd ? ;ZBufferPoint*
7
	l1 dd ? ;ZBufferPoint*
7
	l1 dd ? ;ZBufferPoint*
8
	l2 dd ? ;ZBufferPoint*
8
	l2 dd ? ;ZBufferPoint*
9
	fdx1 dd ?
9
	fdx1 dd ? ;float
10
	fdx2 dd ?
10
	fdx2 dd ? ;float
11
	fdy1 dd ?
11
	fdy1 dd ? ;float
12
	fdy2 dd ?
12
	fdy2 dd ? ;float
13
	fz dd ?
13
	fz dd ? ;float
14
	d1 dd ?
14
	d1 dd ? ;float
15
	d2 dd ?
15
	d2 dd ? ;float
16
	pz1 dd ? ;unsigned short*
16
	pz1 dd ? ;unsigned short*
17
	pp1 dd ? ;PIXEL*
17
	pp1 dd ? ;PIXEL*
18
	part dd ?
18
	part dd ?
19
	update_left dd ?
19
	update_left dd ?
20
	update_right dd ?
20
	update_right dd ?
Line 21... Line 21...
21
 
21
 
22
	nb_lines dd ?
22
	nb_lines dd ?
23
	dx1 dd ?
23
	dx1 dd ?
24
	dy1 dd ?
-
 
25
	tmp dd ?
24
	dy1 dd ?
26
	dx2 dd ?
25
	dx2 dd ?
Line 27... Line 26...
27
	dy2 dd ?
26
	dy2 dd ?
28
 
27
 
Line 58... Line 57...
58
	dbdy dd ?
57
	dbdy dd ?
59
	dbdl_min dd ?
58
	dbdl_min dd ?
60
	dbdl_max dd ?
59
	dbdl_max dd ?
61
end if
60
end if
62
if INTERP_ST eq 1
61
if INTERP_ST eq 1
63
	;s1 dd ?
62
	s1 dd ?
64
	dsdx dd ?
63
	dsdx dd ?
65
	dsdy dd ?
64
	dsdy dd ?
66
	dsdl_min dd ?
65
	dsdl_min dd ?
67
	dsdl_max dd ?
66
	dsdl_max dd ?
68
	t1 dd ?
67
	t1 dd ?
Line 70... Line 69...
70
	dtdy dd ?
69
	dtdy dd ?
71
	dtdl_min dd ?
70
	dtdl_min dd ?
72
	dtdl_max dd ?
71
	dtdl_max dd ?
73
end if
72
end if
74
if INTERP_STZ eq 1
73
if INTERP_STZ eq 1
75
	sz1 dd ?
74
	sz1 dd ? ;float
76
	dszdx dd ?
75
	dszdx dd ? ;float
77
	dszdy dd ?
76
	dszdy dd ? ;float
78
	dszdl_min dd ?
77
	dszdl_min dd ? ;float
79
	dszdl_max dd ?
78
	dszdl_max dd ? ;float
80
	tz1 dd ?
79
	tz1 dd ? ;float
81
	dtzdx dd ?
80
	dtzdx dd ? ;float
82
	dtzdy dd ?
81
	dtzdy dd ? ;float
83
	dtzdl_min dd ?
82
	dtzdl_min dd ? ;float
84
	dtzdl_max dd ?
83
	dtzdl_max dd ? ;float
-
 
84
end if
-
 
85
 
-
 
86
if DRAW_LINE_M eq 1
-
 
87
	DRAW_LINE 0 ;переменные делаются в макросе
-
 
88
else
-
 
89
	;edi = pp dd ?
-
 
90
	n dd ? ;int
-
 
91
if INTERP_Z eq 1
-
 
92
	pz dd ? ;unsigned short *
-
 
93
	z dd ? ;uint
-
 
94
	zz dd ? ;uint
-
 
95
end if
-
 
96
if INTERP_RGB eq 1
-
 
97
	or1 dd ? ;uint
-
 
98
	og1 dd ? ;uint
-
 
99
	ob1 dd ? ;uint
-
 
100
end if
-
 
101
if INTERP_ST eq 1
-
 
102
	s dd ? ;uint
-
 
103
	t dd ? ;uint
-
 
104
end if
-
 
105
if INTERP_STZ eq 1
-
 
106
	s_z dd ? ;float
-
 
107
	t_z dd ? ;float
-
 
108
end if
85
end if
109
end if
Line 86... Line 110...
86
 
110
 
Line 87... Line 111...
87
endl
111
endl
-
 
112
 
-
 
113
	; we sort the vertex with increasing y
-
 
114
	mov ebx,[p0]
-
 
115
	mov ecx,[p1]
-
 
116
	mov eax,[ebx+offs_zbup_y]
88
 
117
	cmp [ecx+offs_zbup_y],eax
89
;  /* we sort the vertex with increasing y */
118
	jge @f
90
;  if (p1->y < p0->y) {
119
		;if (p1.y < p0.y)
91
;    t = p0;
120
		mov [p0],ecx
-
 
121
		mov [p1],ebx
92
;    p0 = p1;
122
		xchg ebx,ecx
-
 
123
		mov eax,[ebx+offs_zbup_y] ;обновляем p0.y для следующего сравнения
-
 
124
	@@:
-
 
125
	mov edx,[p2]
93
;    p1 = t;
126
	cmp [edx+offs_zbup_y],eax
-
 
127
	jge @f
-
 
128
		;if (p2.y < p0.y)
-
 
129
		mov [p0],edx
94
;  }
130
		mov [p1],ebx
95
;  if (p2->y < p0->y) {
131
		mov [p2],ecx
96
;    t = p2;
132
		mov ebx,[p0]
97
;    p2 = p1;
133
		mov ecx,[p1]
-
 
134
		mov edx,[p2]
98
;    p1 = p0;
135
		jmp .end_e0
-
 
136
	@@:
99
;    p0 = t;
137
	mov eax,[ecx+offs_zbup_y]
-
 
138
	cmp [edx+offs_zbup_y],eax
100
;  } else if (p2->y < p1->y) {
139
	jge .end_e0
101
;    t = p1;
140
		;else if (p2.y < p1.y)
102
;    p1 = p2;
141
		mov [p1],edx
Line 103... Line 142...
103
;    p2 = t;
142
		mov [p2],ecx
Line -... Line 143...
-
 
143
	.end_e0:
-
 
144
 
104
;  }
145
	; we compute dXdx and dXdy for all interpolated values
-
 
146
 
-
 
147
	mov eax,[ecx+offs_zbup_x]
105
 
148
	sub eax,[ebx+offs_zbup_x]
106
	; we compute dXdx and dXdy for all interpolated values
149
	mov [fdx1],eax ;p1.x - p0.x
-
 
150
	mov eax,[ecx+offs_zbup_y]
-
 
151
	sub eax,[ebx+offs_zbup_y]
107
 
152
	mov [fdy1],eax ;p1.y - p0.y
-
 
153
 
-
 
154
	mov eax,[edx+offs_zbup_x]
108
;  fdx1 = p1->x - p0->x;
155
	sub eax,[ebx+offs_zbup_x]
109
;  fdy1 = p1->y - p0->y;
156
	mov [fdx2],eax ;p2.x - p0.x
-
 
157
	mov eax,[edx+offs_zbup_y]
-
 
158
	sub eax,[ebx+offs_zbup_y]
-
 
159
	mov [fdy2],eax ;p2.y - p0.y
-
 
160
 
-
 
161
	fild dword[fdx2]
-
 
162
	fst dword[fdx2]
-
 
163
	fild dword[fdy1]
-
 
164
	fst dword[fdy1]
-
 
165
	fmulp
-
 
166
	fild dword[fdx1]
-
 
167
	fst dword[fdx1]
110
 
168
	fild dword[fdy2]
-
 
169
	fst dword[fdy2]
111
;  fdx2 = p2->x - p0->x;
170
	fmulp
-
 
171
	fsubp ;st0 = st0-st1
-
 
172
	fst dword[fz] ;fz = fdx1 * fdy2 - fdx2 * fdy1
112
;  fdy2 = p2->y - p0->y;
173
	fldz
-
 
174
	fcompp ;if (fz == 0)
113
 
175
	fstsw ax
-
 
176
	sahf
114
;  fz = fdx1 * fdy2 - fdx2 * fdy1;
177
	je .end_f
-
 
178
	fld1
-
 
179
	fdiv dword[fz] ;fz = 1.0 / fz
115
;  if (fz == 0)
180
	fst dword[fz]  ;st0 = fz
-
 
181
 
-
 
182
	fld dword[fdx1]
116
;    return;
183
	fmul st0,st1
-
 
184
	fstp dword[fdx1] ;fdx1 *= fz
-
 
185
	fld dword[fdy1]
117
;  fz = 1.0 / fz;
186
	fmul st0,st1
-
 
187
	fstp dword[fdy1] ;fdy1 *= fz
-
 
188
	fld dword[fdx2]
118
 
189
	fmul st0,st1
-
 
190
	fstp dword[fdx2] ;fdx2 *= fz
-
 
191
	fld dword[fdy2]
Line 119... Line 192...
119
;  fdx1 *= fz;
192
	fmul st0,st1
-
 
193
	fstp dword[fdy2] ;fdy2 *= fz
-
 
194
	ffree st0
-
 
195
	fincstp
-
 
196
 
-
 
197
if INTERP_Z eq 1
-
 
198
	mov eax,[ecx+offs_zbup_z]
-
 
199
	sub eax,[ebx+offs_zbup_z]
120
;  fdy1 *= fz;
200
	mov [d1],eax
-
 
201
	mov eax,[edx+offs_zbup_z]
121
;  fdx2 *= fz;
202
	sub eax,[ebx+offs_zbup_z]
-
 
203
	mov [d2],eax
-
 
204
	fild dword[d1]
-
 
205
	fst dword[d1] ;d1 = p1.z - p0.z
-
 
206
	fild dword[d2]
-
 
207
	fst dword[d2] ;d2 = p2.z - p0.z
-
 
208
 
122
;  fdy2 *= fz;
209
	fld dword[fdy1]
-
 
210
	fmul st0,st1
-
 
211
	fld dword[fdy2]
-
 
212
	fmul st0,st3
-
 
213
	fsub st0,st1
-
 
214
	fistp dword[dzdx] ;dzdx = (int) (fdy2*d1 - fdy1*d2)
-
 
215
	ffree st0
-
 
216
	fincstp
123
 
217
	fld dword[fdx2]
-
 
218
	fmul st0,st2
-
 
219
	fld dword[fdx1]
124
if INTERP_Z eq 1
220
	fmul st0,st2
Line 125... Line 221...
125
;  d1 = p1->z - p0->z;
221
	fsub st0,st1
-
 
222
	fistp dword[dzdy] ;dzdy = (int) (fdx1*d2 - fdx2*d1)
-
 
223
	ffree st0
-
 
224
	fincstp
-
 
225
end if
-
 
226
 
-
 
227
if INTERP_RGB eq 1
-
 
228
	mov eax,[ecx+offs_zbup_r]
126
;  d2 = p2->z - p0->z;
229
	sub eax,[ebx+offs_zbup_r]
-
 
230
	mov [d1],eax
127
;  dzdx = (int) (fdy2 * d1 - fdy1 * d2);
231
	mov eax,[edx+offs_zbup_r]
-
 
232
	sub eax,[ebx+offs_zbup_r]
-
 
233
	mov [d2],eax
-
 
234
	fild dword[d1]
-
 
235
	fst dword[d1] ;d1 = p1.r - p0.r
-
 
236
	fild dword[d2]
-
 
237
	fst dword[d2] ;d2 = p2.r - p0.r
128
;  dzdy = (int) (fdx1 * d2 - fdx2 * d1);
238
 
-
 
239
	fld dword[fdy1]
-
 
240
	fmul st0,st1
-
 
241
	fld dword[fdy2]
-
 
242
	fmul st0,st3
-
 
243
	fsub st0,st1
-
 
244
	fistp dword[drdx] ;drdx = (int) (fdy2*d1 - fdy1*d2)
-
 
245
	ffree st0
129
end if
246
	fincstp
-
 
247
	fld dword[fdx2]
-
 
248
	fmul st0,st2
130
 
249
	fld dword[fdx1]
-
 
250
	fmul st0,st2
-
 
251
	fsub st0,st1
-
 
252
	fistp dword[drdy] ;drdy = (int) (fdx1*d2 - fdx2*d1)
-
 
253
	ffree st0
-
 
254
	fincstp
-
 
255
 
-
 
256
	mov eax,[ecx+offs_zbup_g]
131
if INTERP_RGB eq 1
257
	sub eax,[ebx+offs_zbup_g]
-
 
258
	mov [d1],eax
132
;  d1 = p1->r - p0->r;
259
	mov eax,[edx+offs_zbup_g]
-
 
260
	sub eax,[ebx+offs_zbup_g]
-
 
261
	mov [d2],eax
-
 
262
	fild dword[d1]
-
 
263
	fst dword[d1] ;d1 = p1.g - p0.g
-
 
264
	fild dword[d2]
-
 
265
	fst dword[d2] ;d2 = p2.g - p0.g
133
;  d2 = p2->r - p0->r;
266
 
-
 
267
	fld dword[fdy1]
-
 
268
	fmul st0,st1
-
 
269
	fld dword[fdy2]
-
 
270
	fmul st0,st3
-
 
271
	fsub st0,st1
-
 
272
	fistp dword[dgdx] ;dgdx = (int) (fdy2*d1 - fdy1*d2)
-
 
273
	ffree st0
134
;  drdx = (int) (fdy2 * d1 - fdy1 * d2);
274
	fincstp
-
 
275
	fld dword[fdx2]
-
 
276
	fmul st0,st2
135
;  drdy = (int) (fdx1 * d2 - fdx2 * d1);
277
	fld dword[fdx1]
-
 
278
	fmul st0,st2
-
 
279
	fsub st0,st1
-
 
280
	fistp dword[dgdy] ;dgdy = (int) (fdx1*d2 - fdx2*d1)
136
 
281
	ffree st0
137
;  d1 = p1->g - p0->g;
282
	fincstp
-
 
283
 
-
 
284
	mov eax,[ecx+offs_zbup_b]
138
;  d2 = p2->g - p0->g;
285
	sub eax,[ebx+offs_zbup_b]
-
 
286
	mov [d1],eax
139
;  dgdx = (int) (fdy2 * d1 - fdy1 * d2);
287
	mov eax,[edx+offs_zbup_b]
140
;  dgdy = (int) (fdx1 * d2 - fdx2 * d1);
288
	sub eax,[ebx+offs_zbup_b]
-
 
289
	mov [d2],eax
-
 
290
	fild dword[d1]
-
 
291
	fst dword[d1] ;d1 = p1.b - p0.b
-
 
292
	fild dword[d2]
-
 
293
	fst dword[d2] ;d2 = p2.b - p0.b
-
 
294
 
-
 
295
	fld dword[fdy1]
-
 
296
	fmul st0,st1
-
 
297
	fld dword[fdy2]
-
 
298
	fmul st0,st3
-
 
299
	fsub st0,st1
-
 
300
	fistp dword[dbdx] ;dbdx = (int) (fdy2*d1 - fdy1*d2)
-
 
301
	ffree st0
-
 
302
	fincstp
-
 
303
	fld dword[fdx2]
-
 
304
	fmul st0,st2
141
 
305
	fld dword[fdx1]
Line 142... Line 306...
142
;  d1 = p1->b - p0->b;
306
	fmul st0,st2
-
 
307
	fsub st0,st1
-
 
308
	fistp dword[dbdy] ;dbdy = (int) (fdx1*d2 - fdx2*d1)
-
 
309
	ffree st0
-
 
310
	fincstp
-
 
311
end if
-
 
312
 
-
 
313
if INTERP_ST eq 1
143
;  d2 = p2->b - p0->b;
314
	mov eax,[ecx+offs_zbup_s]
-
 
315
	sub eax,[ebx+offs_zbup_s]
144
;  dbdx = (int) (fdy2 * d1 - fdy1 * d2);
316
	mov [d1],eax
-
 
317
	mov eax,[edx+offs_zbup_s]
-
 
318
	sub eax,[ebx+offs_zbup_s]
-
 
319
	mov [d2],eax
-
 
320
	fild dword[d1]
-
 
321
	fst dword[d1] ;d1 = p1.s - p0.s
-
 
322
	fild dword[d2]
145
;  dbdy = (int) (fdx1 * d2 - fdx2 * d1);
323
	fst dword[d2] ;d2 = p2.s - p0.s
-
 
324
 
-
 
325
	fld dword[fdy1]
-
 
326
	fmul st0,st1
-
 
327
	fld dword[fdy2]
-
 
328
	fmul st0,st3
-
 
329
	fsub st0,st1
-
 
330
	fistp dword[dsdx] ;dsdx = (int) (fdy2*d1 - fdy1*d2)
146
 
331
	ffree st0
-
 
332
	fincstp
-
 
333
	fld dword[fdx2]
147
end if
334
	fmul st0,st2
-
 
335
	fld dword[fdx1]
-
 
336
	fmul st0,st2
-
 
337
	fsub st0,st1
-
 
338
	fistp dword[dsdy] ;dsdy = (int) (fdx1*d2 - fdx2*d1)
-
 
339
	ffree st0
-
 
340
	fincstp
-
 
341
 
148
 
342
	mov eax,[ecx+offs_zbup_t]
-
 
343
	sub eax,[ebx+offs_zbup_t]
149
if INTERP_ST eq 1
344
	mov [d1],eax
-
 
345
	mov eax,[edx+offs_zbup_t]
-
 
346
	sub eax,[ebx+offs_zbup_t]
-
 
347
	mov [d2],eax
-
 
348
	fild dword[d1]
-
 
349
	fst dword[d1] ;d1 = p1.t - p0.t
-
 
350
	fild dword[d2]
150
;  d1 = p1->s - p0->s;
351
	fst dword[d2] ;d2 = p2.t - p0.t
-
 
352
 
-
 
353
	fld dword[fdy1]
-
 
354
	fmul st0,st1
-
 
355
	fld dword[fdy2]
-
 
356
	fmul st0,st3
-
 
357
	fsub st0,st1
-
 
358
	fistp dword[dtdx] ;dtdx = (int) (fdy2*d1 - fdy1*d2)
151
;  d2 = p2->s - p0->s;
359
	ffree st0
-
 
360
	fincstp
-
 
361
	fld dword[fdx2]
152
;  dsdx = (int) (fdy2 * d1 - fdy1 * d2);
362
	fmul st0,st2
Line 153... Line 363...
153
;  dsdy = (int) (fdx1 * d2 - fdx2 * d1);
363
	fld dword[fdx1]
-
 
364
	fmul st0,st2
-
 
365
	fsub st0,st1
154
 
366
	fistp dword[dtdy] ;dtdy = (int) (fdx1*d2 - fdx2*d1)
-
 
367
	ffree st0
-
 
368
	fincstp
155
;  d1 = p1->t - p0->t;
369
end if
-
 
370
 
-
 
371
if INTERP_STZ eq 1
-
 
372
	fild dword[ebx+offs_zbup_z]
-
 
373
	fild dword[ebx+offs_zbup_s]
156
;  d2 = p2->t - p0->t;
374
	fmul st0,st1
157
;  dtdx = (int) (fdy2 * d1 - fdy1 * d2);
375
	fstp dword[ebx+offs_zbup_sz] ;p0.sz = (float) p0.s * p0.z
-
 
376
	fild dword[ebx+offs_zbup_t]
158
;  dtdy = (int) (fdx1 * d2 - fdx2 * d1);
377
	fmul st0,st1
159
end if
378
	fstp dword[ebx+offs_zbup_tz] ;p0.tz = (float) p0.t * p0.z
-
 
379
	ffree st0
160
 
380
	fincstp
-
 
381
 
-
 
382
	fild dword[ecx+offs_zbup_z]
-
 
383
	fild dword[ecx+offs_zbup_s]
161
if INTERP_STZ eq 1
384
	fmul st0,st1
162
;  {
385
	fstp dword[ecx+offs_zbup_sz] ;p1.sz = (float) p1.s * p1.z
-
 
386
	fild dword[ecx+offs_zbup_t]
163
;    float zz;
387
	fmul st0,st1
-
 
388
	fstp dword[ecx+offs_zbup_tz] ;p1.tz = (float) p1.t * p1.z
-
 
389
	ffree st0
164
;    zz=(float) p0->z;
390
	fincstp
-
 
391
 
-
 
392
	fild dword[edx+offs_zbup_z]
165
;    p0->sz= (float) p0->s * zz;
393
	fild dword[edx+offs_zbup_s]
-
 
394
	fmul st0,st1
-
 
395
	fstp dword[edx+offs_zbup_sz] ;p2.sz = (float) p2.s * p2.z
166
;    p0->tz= (float) p0->t * zz;
396
	fild dword[edx+offs_zbup_t]
-
 
397
	fmul st0,st1
-
 
398
	fstp dword[edx+offs_zbup_tz] ;p2.tz = (float) p2.t * p2.z
167
;    zz=(float) p1->z;
399
	ffree st0
-
 
400
	fincstp
-
 
401
 
-
 
402
	fld dword[ecx+offs_zbup_sz]
-
 
403
	fsub dword[ebx+offs_zbup_sz]
-
 
404
	fst dword[d1] ;d1 = p1.sz - p0.sz
-
 
405
	fld dword[edx+offs_zbup_sz]
168
;    p1->sz= (float) p1->s * zz;
406
	fsub dword[ebx+offs_zbup_sz]
-
 
407
	fst dword[d2] ;d2 = p2.sz - p0.sz
-
 
408
 
-
 
409
	fld dword[fdy1]
-
 
410
	fmul st0,st1
-
 
411
	fld dword[fdy2]
-
 
412
	fmul st0,st3
-
 
413
	fsub st0,st1
169
;    p1->tz= (float) p1->t * zz;
414
	fistp dword[dszdx] ;dszdx = (int) (fdy2*d1 - fdy1*d2)
-
 
415
	ffree st0
-
 
416
	fincstp
170
;    zz=(float) p2->z;
417
	fld dword[fdx2]
-
 
418
	fmul st0,st2
-
 
419
	fld dword[fdx1]
171
;    p2->sz= (float) p2->s * zz;
420
	fmul st0,st2
-
 
421
	fsub st0,st1
-
 
422
	fistp dword[dszdy] ;dszdy = (int) (fdx1*d2 - fdx2*d1)
172
;    p2->tz= (float) p2->t * zz;
423
	ffree st0
-
 
424
	fincstp
-
 
425
 
-
 
426
	fld dword[ecx+offs_zbup_tz]
-
 
427
	fsub dword[ebx+offs_zbup_tz]
-
 
428
	fst dword[d1] ;d1 = p1.tz - p0.tz
-
 
429
	fld dword[edx+offs_zbup_tz]
173
 
430
	fsub dword[ebx+offs_zbup_tz]
-
 
431
	fst dword[d2] ;d2 = p2.tz - p0.tz
-
 
432
 
-
 
433
	fld dword[fdy1]
-
 
434
	fmul st0,st1
-
 
435
	fld dword[fdy2]
-
 
436
	fmul st0,st3
-
 
437
	fsub st0,st1
174
;    d1 = p1->sz - p0->sz;
438
	fistp dword[dtzdx] ;dtzdx = (int) (fdy2*d1 - fdy1*d2)
-
 
439
	ffree st0
175
;    d2 = p2->sz - p0->sz;
440
	fincstp
176
;    dszdx = (fdy2 * d1 - fdy1 * d2);
441
	fld dword[fdx2]
Line 177... Line 442...
177
;    dszdy = (fdx1 * d2 - fdx2 * d1);
442
	fmul st0,st2
Line -... Line 443...
-
 
443
	fld dword[fdx1]
-
 
444
	fmul st0,st2
-
 
445
	fsub st0,st1
-
 
446
	fistp dword[dtzdy] ;dtzdy = (int) (fdx1*d2 - fdx2*d1)
178
 
447
	ffree st0
-
 
448
	fincstp
-
 
449
end if
-
 
450
 
-
 
451
	; screen coordinates
179
;    d1 = p1->tz - p0->tz;
452
 
Line 180... Line 453...
180
;    d2 = p2->tz - p0->tz;
453
	mov eax,[zb]
Line 181... Line 454...
181
;    dtzdx = (fdy2 * d1 - fdy1 * d2);
454
	mov edx,[eax+offs_zbuf_linesize]
-
 
455
	imul edx,[ebx+offs_zbup_y]
-
 
456
	add edx,[eax+offs_zbuf_pbuf]
-
 
457
	mov [pp1],edx ;pp1 = zb.pbuf + zb.linesize * p0.y
-
 
458
	mov edx,[eax+offs_zbuf_xsize]
182
;    dtzdy = (fdx1 * d2 - fdx2 * d1);
459
	imul edx,[ebx+offs_zbup_y]
183
;  }
460
	shl edx,1
184
end if
461
	add edx,[eax+offs_zbuf_zbuf]
185
 
462
	mov [pz1],edx ;pz1 = zb.zbuf + zb.xsize * p0.y
186
	; screen coordinates
463
 
-
 
464
	DRAW_INIT
187
 
465
 
-
 
466
	mov dword[part],0
-
 
467
	.cycle_0:
188
;  pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
468
		mov ebx,[p0]
189
;  pz1 = zb->zbuf + p0->y * zb->xsize;
469
		mov ecx,[p1]
190
 
470
		mov edx,[p2]
191
	DRAW_INIT
471
		cmp dword[part],0
192
 
472
		jne .els_0
193
;  for(part=0;part<2;part++) {
473
			mov dword[update_left],1
194
;    if (part == 0) {
474
			mov dword[update_right],1
195
;      if (fz > 0) {
475
			mov [l1],ebx
196
;	update_left=1;
476
			mov [pr1],ebx
197
;	update_right=1;
477
			fldz
-
 
478
			fld dword[fz]
-
 
479
			fcompp ;if (fz > 0)
198
;	l1=p0;
480
			fstsw ax
-
 
481
			sahf
199
;	l2=p2;
482
			jbe .els_1
200
;	pr1=p0;
483
				mov [l2],edx
201
;	pr2=p1;
484
				mov [pr2],ecx
202
;      } else {
485
				jmp .end_1
-
 
486
			.els_1:
203
;	update_left=1;
487
				mov [l2],ecx
-
 
488
				mov [pr2],edx
204
;	update_right=1;
489
			.end_1:
205
;	l1=p0;
490
			mov eax,[ecx+offs_zbup_y]
206
;	l2=p1;
491
			sub eax,[ebx+offs_zbup_y]
207
;	pr1=p0;
492
			mov [nb_lines],eax ;nb_lines = p1.y - p0.y
208
;	pr2=p2;
493
			jmp .end_0
-
 
494
		.els_0:
209
;      }
495
			; second part
-
 
496
			mov dword[update_left],0
-
 
497
			mov dword[update_right],1
210
;      nb_lines = p1->y - p0->y;
498
			fldz
-
 
499
			fld dword[fz]
-
 
500
			fcompp ;if (fz > 0)
211
;    } else {
501
			fstsw ax
212
;      /* second part */
502
			sahf
213
;      if (fz > 0) {
503
			jbe .els_2
Line 214... Line 504...
214
;	update_left=0;
504
				mov [pr1],ecx
Line 215... Line 505...
215
;	update_right=1;
505
				mov [pr2],edx
-
 
506
				jmp .end_2
-
 
507
			.els_2:
-
 
508
				mov [l1],ecx
-
 
509
				mov [l2],edx
-
 
510
			.end_2:
216
;	pr1=p1;
511
			mov eax,[edx+offs_zbup_y]
-
 
512
			sub eax,[ecx+offs_zbup_y]
-
 
513
			inc eax
217
;	pr2=p2;
514
			mov [nb_lines],eax ;nb_lines = p2.y - p1.y + 1
218
;      } else {
515
		.end_0:
-
 
516
 
-
 
517
	; compute the values for the left edge
-
 
518
 
-
 
519
	cmp dword[update_left],0 ;if (update_left)
219
;	update_left=1;
520
	je .end_upd_l
-
 
521
		mov ebx,[l1]
-
 
522
		mov ecx,[l2]
220
;	update_right=0;
523
		mov eax,[ecx+offs_zbup_x]
221
;	l1=p1; 
524
		sub eax,[ebx+offs_zbup_x]
-
 
525
		mov [dx1],eax ;dx1 = l2.x - l1.x
222
;	l2=p2;
526
		mov eax,[ecx+offs_zbup_y]
223
;      }
527
		sub eax,[ebx+offs_zbup_y]
-
 
528
		mov [dy1],eax ;dy1 = l2.y - l1.y
224
;      nb_lines = p2->y - p1->y + 1;
529
		cmp eax,0 ;if (dy1 > 0) 
-
 
530
		jle .els_3
225
;    }
531
			mov eax,[dx1]
-
 
532
			shl eax,16
226
 
533
			xor edx,edx
Line 227... Line 534...
227
	; compute the values for the left edge
534
			div dword[dy1] ;eax = (dx1 << 16) / dy1
228
 
535
			jmp .end_3
-
 
536
		.els_3:
-
 
537
			xor eax,eax
-
 
538
		.end_3:
-
 
539
		mov edx,[ebx+offs_zbup_x]
-
 
540
		mov [x1],edx
229
;    if (update_left) {
541
		mov dword[error],0
-
 
542
		mov dword[derror],eax
230
;      dy1 = l2->y - l1->y;
543
		and dword[derror],0xffff
231
;      dx1 = l2->x - l1->x;
544
		shr eax,16
232
;      if (dy1 > 0) 
545
		mov [dxdy_min],eax
233
;	tmp = (dx1 << 16) / dy1;
546
		inc eax
234
;      else
547
		mov [dxdy_max],eax
235
;	tmp = 0;
548
 
236
;      x1 = l1->x;
-
 
237
;      error = 0;
549
if INTERP_Z eq 1
238
;      derror = tmp & 0x0000ffff;
-
 
239
;      dxdy_min = tmp >> 16;
550
	mov eax,[l1]
240
;      dxdy_max = dxdy_min + 1;
-
 
241
 
551
	mov eax,[eax+offs_zbup_z]
242
if INTERP_Z eq 1
552
	mov [z1],eax ;z1 = l1.z
243
;      z1=l1->z;
-
 
244
;      dzdl_min=(dzdy + dzdx * dxdy_min); 
-
 
245
;      dzdl_max=dzdl_min + dzdx;
-
 
246
end if
553
	mov eax,[dzdx]
247
if INTERP_RGB eq 1
-
 
248
;      r1=l1->r;
554
	imul eax,[dxdy_min]
249
;      drdl_min=(drdy + drdx * dxdy_min);
555
	add eax,[dzdy]
250
;      drdl_max=drdl_min + drdx;
-
 
251
 
556
	mov [dzdl_min],eax ;dzdl_min = (dzdy +dzdx*dxdy_min)
252
;      g1=l1->g;
557
	add eax,[dzdx]
253
;      dgdl_min=(dgdy + dgdx * dxdy_min);
558
	mov [dzdl_max],eax ;dzdl_max = dzdl_min +dzdx
254
;      dgdl_max=dgdl_min + dgdx;
559
end if
255
 
560
if INTERP_RGB eq 1
256
;      b1=l1->b;
561
	mov ebx,[l1]
257
;      dbdl_min=(dbdy + dbdx * dxdy_min);
-
 
258
;      dbdl_max=dbdl_min + dbdx;
-
 
259
end if
562
	mov eax,[ebx+offs_zbup_r]
260
if INTERP_ST eq 1
-
 
261
;      s1=l1->s;
563
	mov [r1],eax ;r1 = l1.r
262
;      dsdl_min=(dsdy + dsdx * dxdy_min);
-
 
263
;      dsdl_max=dsdl_min + dsdx;
-
 
264
 
-
 
265
;      t1=l1->t;
-
 
266
;      dtdl_min=(dtdy + dtdx * dxdy_min);
564
	mov eax,[drdx]
267
;      dtdl_max=dtdl_min + dtdx;
-
 
268
end if
565
	imul eax,[dxdy_min]
269
if INTERP_STZ eq 1
566
	add eax,[drdy]
270
;      sz1=l1->sz;
567
	mov [drdl_min],eax ;drdl_min = (drdy +drdx*dxdy_min)
271
;      dszdl_min=(dszdy + dszdx * dxdy_min);
568
	add eax,[drdx]
272
;      dszdl_max=dszdl_min + dszdx;
-
 
273
 
569
	mov [drdl_max],eax ;drdl_max = drdl_min +drdx
274
;      tz1=l1->tz;
570
 
275
;      dtzdl_min=(dtzdy + dtzdx * dxdy_min);
571
	mov eax,[ebx+offs_zbup_g]
276
;      dtzdl_max=dtzdl_min + dtzdx;
-
 
277
end if
572
	mov [g1],eax ;g1 = l1.g
278
;    }
573
	mov eax,[dgdx]
279
 
-
 
280
;    /* compute values for the right edge */
-
 
281
 
-
 
282
;    if (update_right) {
-
 
283
;      dx2 = (pr2->x - pr1->x);
-
 
284
;      dy2 = (pr2->y - pr1->y);
-
 
285
;      if (dy2>0) 
-
 
286
;	dx2dy2 = ( dx2 << 16) / dy2;
-
 
287
;      else
-
 
288
;	dx2dy2 = 0;
-
 
289
;      x2 = pr1->x << 16;
-
 
290
;    }
-
 
291
 
-
 
292
;    /* we draw all the scan line of the part */
574
	imul eax,[dxdy_min]
293
 
575
	add eax,[dgdy]
-
 
576
	mov [dgdl_min],eax ;dgdl_min = (dgdy +dgdx*dxdy_min)
-
 
577
	add eax,[dgdx]
-
 
578
	mov [dgdl_max],eax ;dgdl_max = dgdl_min +dgdx
-
 
579
 
-
 
580
	mov eax,[ebx+offs_zbup_b]
-
 
581
	mov [b1],eax ;b1 = l1.b
-
 
582
	mov eax,[dbdx]
-
 
583
	imul eax,[dxdy_min]
-
 
584
	add eax,[dbdy]
-
 
585
	mov [dbdl_min],eax ;dbdl_min = (dbdy +dbdx*dxdy_min)
-
 
586
	add eax,[dbdx]
-
 
587
	mov [dbdl_max],eax ;dbdl_max = dbdl_min +dbdx
-
 
588
 
-
 
589
end if
-
 
590
if INTERP_ST eq 1
-
 
591
	mov ebx,[l1]
-
 
592
	mov eax,[ebx+offs_zbup_s]
294
;    while (nb_lines>0) {
593
	mov [s1],eax ;s1 = l1.s
295
;      nb_lines--;
594
	mov eax,[dsdx]
296
;#ifndef DRAW_LINE
595
	imul eax,[dxdy_min]
-
 
596
	add eax,[dsdy]
-
 
597
	mov [dsdl_min],eax ;dsdl_min = (dsdy +dsdx*dxdy_min)
-
 
598
	add eax,[dsdx]
-
 
599
	mov [dsdl_max],eax ;dsdl_max = dsdl_min +dsdx
-
 
600
 
-
 
601
	mov eax,[ebx+offs_zbup_t]
-
 
602
	mov [t1],eax ;t1 = l1.t
-
 
603
	mov eax,[dtdx]
-
 
604
	imul eax,[dxdy_min]
-
 
605
	add eax,[dtdy]
297
;      /* generic draw line */
606
	mov [dtdl_min],eax ;dtdl_min = (dtdy +dtdx*dxdy_min)
-
 
607
	add eax,[dtdx]
-
 
608
	mov [dtdl_max],eax ;dtdl_max = dtdl_min +dtdx
-
 
609
end if
-
 
610
if INTERP_STZ eq 1
-
 
611
	mov ebx,[l1]
-
 
612
	mov eax,[ebx+offs_zbup_sz]
-
 
613
	mov [sz1],eax ;sz1 = l1.sz - преобразований нет, потому без сопроцессора
298
;      {
614
	fild dword[dxdy_min]
-
 
615
	fmul dword[dszdx]
-
 
616
	fadd dword[dszdy]
-
 
617
	fst dword[dszdl_min] ;dszdl_min = (dszdy +dszdx*dxdy_min)
-
 
618
	fadd dword[dszdx]
-
 
619
	fstp dword[dszdl_max] ;dszdl_max = dszdl_min +dszdx
-
 
620
 
-
 
621
	mov eax,[ebx+offs_zbup_tz]
-
 
622
	mov [tz1],eax ;tz1 = l1.tz - преобразований нет, потому без сопроцессора
-
 
623
	fild dword[dxdy_min]
-
 
624
	fmul dword[dtzdx]
-
 
625
	fadd dword[dtzdy]
-
 
626
	fst dword[dtzdl_min] ;dtzdl_min = (dtzdy +dtzdx*dxdy_min)
-
 
627
	fadd dword[dtzdx]
-
 
628
	fstp dword[dtzdl_max] ;dtzdl_max = dtzdl_min +dtzdx
-
 
629
end if
-
 
630
	.end_upd_l:
-
 
631
 
-
 
632
	; compute values for the right edge
-
 
633
 
-
 
634
	cmp dword[update_right],0 ;if(update_right)
-
 
635
	je .end_upd_r
-
 
636
		mov ebx,[pr1]
-
 
637
		mov ecx,[pr2]
-
 
638
		mov eax,[ecx+offs_zbup_x]
-
 
639
		sub eax,[ebx+offs_zbup_x]
-
 
640
		mov [dx2],eax ;dx2 = pr2.x - pr1.x
-
 
641
		mov eax,[ecx+offs_zbup_y]
-
 
642
		sub eax,[ebx+offs_zbup_y]
-
 
643
		mov [dy2],eax ;dy2 = pr2.y - pr1.y
-
 
644
		cmp eax,0 ;if (dy2 > 0) 
-
 
645
		jle .els_4
-
 
646
			mov eax,[dx2]
-
 
647
			shl eax,16
-
 
648
			xor edx,edx
-
 
649
			div dword[dy2] ;eax = (dx2 << 16) / dy2
-
 
650
			jmp .end_4
-
 
651
		.els_4:
-
 
652
			xor eax,eax
-
 
653
		.end_4:
-
 
654
		mov [dx2dy2],eax
-
 
655
		mov eax,[ebx+offs_zbup_x]
-
 
656
		shl eax,16
-
 
657
		mov [x2],eax ; x2 = pr1.x << 16
-
 
658
	.end_upd_r:
299
;          register PIXEL *pp;
659
 
-
 
660
	; we draw all the scan line of the part
300
;          register int n;
661
 
301
if INTERP_Z eq 1
662
	.beg_w_lin:
-
 
663
	cmp dword[nb_lines],0 ;while (nb_lines>0)
-
 
664
	jle .end_w_lin
302
;          register unsigned short *pz;
665
		dec dword[nb_lines]
-
 
666
if DRAW_LINE_M eq 1
303
;          register unsigned int z,zz;
667
		DRAW_LINE 1
-
 
668
else
304
end if
669
		; generic draw line
305
if INTERP_RGB eq 1
670
		mov eax,[x2]
-
 
671
		shr eax,16
306
;          register unsigned int or1,og1,ob1;
672
		mov edi,[x1]
-
 
673
		sub eax,edi
307
end if
674
		mov [n],eax ;n = (x2 >> 16) - x1
-
 
675
		imul edi,PSZB
308
if INTERP_ST eq 1
676
		add edi,[pp1] ;pp = pp1 + x1 * PSZB
309
;          register unsigned int s,t;
677
if INTERP_Z eq 1
310
end if
678
		mov eax,[x1]
311
if INTERP_STZ eq 1
679
		shl eax,1
-
 
680
		add eax,[pz1]
312
;          float sz,tz;
681
		mov [pz],eax
-
 
682
		mov eax,[z1]
313
end if
683
		mov [z],eax
314
;          n=(x2 >> 16) - x1;
684
end if
315
;          pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
685
if INTERP_RGB eq 1
-
 
686
		mov eax,[r1]
316
if INTERP_Z eq 1
687
		mov [or1],eax
-
 
688
		mov eax,[g1]
317
;          pz=pz1+x1;
689
		mov [og1],eax
318
;          z=z1;
690
		mov eax,[b1]
319
end if
691
		mov [ob1],eax
320
if INTERP_RGB eq 1
692
end if
321
;          or1 = r1;
693
if INTERP_ST eq 1
322
;          og1 = g1;
694
		mov eax,[s1]
323
;          ob1 = b1;
695
		mov [s],eax
324
end if
696
		mov eax,[t1]
325
if INTERP_ST eq 1
697
		mov [t],eax
326
;          s=s1;
698
end if
327
;          t=t1;
699
if INTERP_STZ eq 1
-
 
700
		mov eax,[sz1]
328
end if
701
		mov [s_z],eax
329
if INTERP_STZ eq 1
702
		mov eax,[tz1]
330
;          sz=sz1;
703
		mov [t_z],eax
331
;          tz=tz1;
704
end if
332
end if
705
		.cycle_1: ;while (n>=3)
333
;          while (n>=3) {
706
			PUT_PIXEL 0
334
;              PUT_PIXEL(0);
-
 
335
;              PUT_PIXEL(1);
707
			PUT_PIXEL 1
336
;              PUT_PIXEL(2);
708
			PUT_PIXEL 2
337
;              PUT_PIXEL(3);
709
			PUT_PIXEL 3
338
if INTERP_Z eq 1
-
 
339
;              pz+=4;
710
if INTERP_Z eq 1
340
end if
711
			add dword[pz],8 ;=4*sizeof(uint)
341
;              pp=(PIXEL *)((char *)pp + 4 * PSZB);
712
end if
342
;              n-=4;
713
			add edi,4*PSZB
343
;          }
714
			sub dword[n],4
-
 
715
			cmp dword[n],3
344
;          while (n>=0) {
716
		jge .cycle_1
-
 
717
		.cycle_2: ;while (n>=0)
345
;              PUT_PIXEL(0);
718
			PUT_PIXEL 0
346
if INTERP_Z eq 1
719
if INTERP_Z eq 1
-
 
720
			add dword[pz],2 ;=sizeof(uint)
347
;              pz+=1;
721
end if
348
end if
722
			add edi,PSZB
-
 
723
			dec dword[n]
349
;              pp=(PIXEL *)((char *)pp + PSZB);
724
			cmp dword[n],0
350
;              n-=1;
725
		jge .cycle_2
351
;          }
726
end if
-
 
727
 
352
;      }
728
	; left edge
-
 
729
	mov eax,[derror]
353
;#else
730
	add [error],eax
-
 
731
	cmp eax,0 ;if (error > 0)
354
;      DRAW_LINE();
732
	jle .els_er
355
;#endif
733
		sub dword[error],0x10000
356
;      
734
		mov eax,[dxdy_max]
-
 
735
		add [x1],eax
357
;      /* left edge */
736
if INTERP_Z eq 1
-
 
737
		mov eax,[dzdl_max]
358
;      error+=derror;
738
		add [z1],eax
359
;      if (error > 0) {
739
end if      
360
;	error-=0x10000;
740
if INTERP_RGB eq 1
-
 
741
		mov eax,[drdl_max]
-
 
742
		add [r1],eax
361
;	x1+=dxdy_max;
743
		mov eax,[dgdl_max]
-
 
744
		add [g1],eax
-
 
745
		mov eax,[dbdl_max]
362
if INTERP_Z eq 1
746
		add [b1],eax
363
;	z1+=dzdl_max;
747
end if
-
 
748
if INTERP_ST eq 1
364
end if      
749
		mov eax,[dsdl_max]
-
 
750
		add [s1],eax
365
if INTERP_RGB eq 1
751
		mov eax,[dtdl_max]
366
;	r1+=drdl_max;
752
		add [t1],eax
-
 
753
end if
367
;	g1+=dgdl_max;
754
if INTERP_STZ eq 1
368
;	b1+=dbdl_max;
755
		fld dword[dszdl_max]
369
end if
756
		fadd dword[sz1]
-
 
757
		fstp dword[sz1]
370
if INTERP_ST eq 1
758
		fld dword[dtzdl_max]
-
 
759
		fadd dword[tz1]
371
;	s1+=dsdl_max;
760
		fstp dword[tz1]
-
 
761
end if
372
;	t1+=dtdl_max;
762
		jmp .end_er
373
end if
763
	.els_er:
374
if INTERP_STZ eq 1
764
		mov eax,[dxdy_min]
-
 
765
		add [x1],eax
375
;	sz1+=dszdl_max;
766
if INTERP_Z eq 1
-
 
767
		mov eax,[dzdl_min]
376
;	tz1+=dtzdl_max;
768
		add [z1],eax
377
end if
769
end if
378
;      } else {
770
if INTERP_RGB eq 1
-
 
771
		mov eax,[drdl_min]
-
 
772
		add [r1],eax
379
;	x1+=dxdy_min;
773
		mov eax,[dgdl_min]
-
 
774
		add [g1],eax
-
 
775
		mov eax,[dbdl_min]
380
if INTERP_Z eq 1
776
		add [b1],eax
381
;	z1+=dzdl_min;
777
end if
382
end if
778
if INTERP_ST eq 1
383
if INTERP_RGB eq 1
779
		mov eax,[dsdl_min]
384
;	r1+=drdl_min;
780
		add [s1],eax
-
 
781
		mov eax,[dtdl_min]
385
;	g1+=dgdl_min;
782
		add [t1],eax
386
;	b1+=dbdl_min;
783
end if
-
 
784
if INTERP_STZ eq 1
387
end if
785
		fld dword[dszdl_min]
-
 
786
		fadd dword[sz1]
388
if INTERP_ST eq 1
787
		fstp dword[sz1]
-
 
788
		fld dword[dtzdl_min]
-
 
789
		fadd dword[tz1]
-
 
790
		fstp dword[tz1]
-
 
791
end if
-
 
792
	.end_er:
-
 
793
 
-
 
794
			; right edge
389
;	s1+=dsdl_min;
795
			mov eax,[dx2dy2]
390
;	t1+=dtdl_min;
796
			add [x2],eax
391
end if
797
 
Line 392... Line 798...
392
if INTERP_STZ eq 1
798
			; screen coordinates
393
;	sz1+=dszdl_min;
799
			mov ebx,[zb]
394
;	tz1+=dtzdl_min;
800
			mov eax,[ebx+offs_zbuf_linesize]
395
end if
801
			add [pp1],eax
-
 
802
			mov eax,[ebx+offs_zbuf_xsize]
Line 396... Line 803...
396
;      } 
803
			shl eax,1
397
;      
804
			add [pz1],eax
398
;      /* right edge */
805
			jmp .beg_w_lin