1 #include <dxconfig.h>
2 #include <dx/dx.h>
3 #include "render.h"
4 enum type {
5 type_colors,
6 type_fast,
7 type_big
8 };
9 static Error
shear(Pointer icstart,char cstc,RGBColor * cmap,Pointer iostart,char csto,float * omap,float cmul,float omul,int idx,int idy,int isx,int isy,int ikx,int iky,float osz,float dzdx,float dzdy,int clip,Pointer ocstart,enum type otype,float * oostart,int osx,float osy,int onx,int ony,int it,float scale,float skew,int ot)10 shear(Pointer icstart, char cstc, RGBColor *cmap,
11 Pointer iostart, char csto, float *omap,
12 float cmul, float omul,
13 int idx, int idy, int isx, int isy, int ikx, int iky,
14 float osz, float dzdx, float dzdy, int clip,
15 Pointer ocstart, enum type otype, float *oostart,
16 int osx, float osy, int onx, int ony,
17 int it, float scale, float skew, int ot
18 ) {
19 int odx, ody, oky;
20 int x, iy, oy, dip, dop, ky;
21 float f, f1, yy, df, iscale, y, z, dz;
22 float r, g, b, o, r0, g0, b0, o0, r1, g1, b1, o1, s0, s1, obar;
23 float *iop, *oop;
24 if (it) {
25 {int t=ikx; ikx=iky; iky=t;};
26 {int t=idx; idx=idy; idy=t;};
27 {int t=isx; isx=isy; isy=t;};
28 }
29 if (ot) {
30 {int t=onx; onx=ony; ony=t;};
31 ody = 1, odx = ony;
32 {float t=dzdx; dzdx=dzdy; dzdy=t;};
33 } else
34 odx = 1, ody = onx;
35 if (osx<0) {
36 osy-=skew*osx;
37 isx-=osx;
38 ikx+=osx;
39 osx=0;
40 }
41 if (onx-osx < ikx)
42 ikx = onx-osx;
43 oky = ony;
44 if (cmap && omap) {
45 unsigned char *icp;
46 RGBColor *ocp;
47 {if (!(otype==type_colors && oostart && iostart)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
48
49 if (((scale)<0? -(scale) : (scale)) > 1.0) {
50 {
51
52 iscale = 1.0 / scale;
53 dip = idy;
54 dop = scale>0? ody : -ody;
55 dz = scale>0? dzdy : -dzdy;
56 df = scale>0? iscale : -iscale;
57
58 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
59 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
60 if (oy<0) oy = 0;
61 if (oy>=oky) oy = oky-1;
62 f = (oy - yy) * iscale;
63 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
64 if (iy<0) continue;
65 if (iy>=iky) continue;
66 f = f - iy + 1.0;
67 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
68 if (1) oop = oostart + (x+osx)*odx + oy*ody;
69 ky = scale>0? oky-oy : oy+1;
70 icp = cstc ? (unsigned char *)icstart :
71 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
72 if (0) iop = csto ? (float *)iostart :
73 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
74 r1 = cmap[*icp].r * cmul, g1 = cmap[*icp].g * cmul, b1 = cmap[*icp].b * cmul;
75 o1 = omap[*icp] * omul;
76 r0 = g0 = b0 = o0 = 0;
77 z = osz + (osx+x)*dzdx + oy*dzdy;
78 while (ky>0) {
79 if (f > 1.0) {
80 f -= 1.0;
81 iy += 1;
82 if (iy>=iky) break;
83 r0 = r1, g0 = g1, b0 = b1;
84 if (1) o0 = o1;
85 if (!cstc) icp += dip;
86 if (!csto && 0) iop += dip;
87 r1 = cmap[*icp].r*cmul, g1 = cmap[*icp].g*cmul, b1 = cmap[*icp].b*cmul;
88 o1 = omap[*icp] * omul;
89 }
90 f1 = 1.0 - f;
91 if (!(1));
92 else if (1 && !1) {
93 obar = 1.0 - (o0*f1 + o1*f);
94 ocp->r = ocp->r*obar + r0*f1 + r1*f;
95 ocp->g = ocp->g*obar + g0*f1 + g1*f;
96 ocp->b = ocp->b*obar + b0*f1 + b1*f;
97 } else {
98 ocp->r = r0*f1 + r1*f;
99 ocp->g = g0*f1 + g1*f;
100 ocp->b = b0*f1 + b1*f;
101 if (1) *oop = o0*f1 + o1*f;
102 }
103 f += df;
104 ocp += dop;
105 if (1) oop += dop;
106 z += dz;
107 ky -= 1;
108 }
109 }
110 };
111 } else {
112 {
113
114 iscale = 1.0 / scale;
115 dip = idy;
116 dop = scale>0? ody : -ody;
117 dz = scale>0? dzdy : -dzdy;
118 df = scale>0? scale : -scale;
119
120 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
121 if (scale>0) {
122 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
123 if (oy<0) oy = 0;
124 if (oy>=oky) continue;
125 ky = oky-oy;
126 y = (oy - 1 - yy) * iscale;
127 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
128 } else {
129 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
130 if (oy<0) continue;
131 if (oy>=oky) oy = oky-1;
132 ky = oy+1;
133 y = (oy + 1 - yy) * iscale;
134 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
135 }
136 if (iy<0) iy = 0;
137 if (iy>=iky) continue;
138 f = scale>0? oy - (yy + (iy * scale))
139 : (yy + (iy * scale)) - oy;
140 f = 1 - f;
141 icp = cstc ? (unsigned char *)icstart :
142 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
143 if (0) iop = csto ? (float *)iostart :
144 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
145 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
146 if (1) oop = oostart + (x+osx)*odx + oy*ody;
147 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
148 while (f<1 && iy<iky) {
149 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
150 o = omap[*icp];
151 r0 += r * f, g0 += g * f, b0 += b * f;
152 if (1) o0 += o * f;
153 s0 += f;
154 f += df;
155 iy += 1;
156 if (! cstc) icp += dip;
157 if (!csto && 0) iop += dip;
158 }
159 f -= 1.0;
160 z = osz + (osx+x)*dzdx + oy*dzdy;
161 while (iy<iky && ky>0) {
162 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
163 o = omap[*icp];
164 f1 = (1.0 - f);
165 r0 += r*f1, g0 += g*f1, b0 += b*f1;
166 if (1) o0 += o*f1;
167 s0 += f1;
168 r1 += r*f, g1 += g*f, b1 += b*f;
169 if (1) o1 += o*f;
170 s1 += f;
171 f += df;
172 if (f >= 1.0) {
173 f -= 1.0;
174 s0 = s0? (float)1.0/s0 : 0.0;
175 if (!(1));
176 else if (1 && !1) {
177 obar = 1.0 - o0 * s0 * omul;
178 s0 *= cmul;
179 ocp->r = ocp->r*obar + r0*s0;
180 ocp->g = ocp->g*obar + g0*s0;
181 ocp->b = ocp->b*obar + b0*s0;
182 } else {
183 if (1) *oop = o0 * s0 * omul;
184 s0 *= cmul;
185 ocp->r = r0*s0;
186 ocp->g = g0*s0;
187 ocp->b = b0*s0;
188 }
189 r0 = r1, g0 = g1, b0 = b1;
190 if (1) o0 = o1;
191 s0 = s1;
192 r1 = g1 = b1 = s1 = 0;
193 if (1) o1 = 0;
194 ocp += dop;
195 if (1) oop += dop;
196 z += dz;
197 ky -= 1;
198 }
199 iy += 1;
200 if (! cstc) icp += dip;
201 if (!csto && 0) iop += dip;
202 }
203 if (ky>0 && f>df) {
204 s0 = s0? (float)1.0/s0 : 0.0;
205 if (!(1));
206 else if (1 && !1) {
207 obar = 1.0 - o0 * s0 * omul;
208 s0 *= cmul;
209 ocp->r = ocp->r*obar + r0*s0;
210 ocp->g = ocp->g*obar + g0*s0;
211 ocp->b = ocp->b*obar + b0*s0;
212 } else {
213 if (1) *oop = o0 * s0 * omul;
214 s0 *= cmul;
215 ocp->r = r0*s0;
216 ocp->g = g0*s0;
217 ocp->b = b0*s0;
218 }
219 }
220 }
221 };
222 };
223 } else if (cmap && !omap) {
224 unsigned char *icp;
225 RGBColor *ocp;
226 {if (!(otype==type_colors && oostart)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
227 if (iostart) {
228
229 if (((scale)<0? -(scale) : (scale)) > 1.0) {
230 {
231
232 iscale = 1.0 / scale;
233 dip = idy;
234 dop = scale>0? ody : -ody;
235 dz = scale>0? dzdy : -dzdy;
236 df = scale>0? iscale : -iscale;
237
238 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
239 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
240 if (oy<0) oy = 0;
241 if (oy>=oky) oy = oky-1;
242 f = (oy - yy) * iscale;
243 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
244 if (iy<0) continue;
245 if (iy>=iky) continue;
246 f = f - iy + 1.0;
247 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
248 if (1) oop = oostart + (x+osx)*odx + oy*ody;
249 ky = scale>0? oky-oy : oy+1;
250 icp = cstc ? (unsigned char *)icstart :
251 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
252 if (1) iop = csto ? (float *)iostart :
253 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
254 r1 = cmap[*icp].r * cmul, g1 = cmap[*icp].g * cmul, b1 = cmap[*icp].b * cmul;
255 o1 = *iop * omul;
256 r0 = g0 = b0 = o0 = 0;
257 z = osz + (osx+x)*dzdx + oy*dzdy;
258 while (ky>0) {
259 if (f > 1.0) {
260 f -= 1.0;
261 iy += 1;
262 if (iy>=iky) break;
263 r0 = r1, g0 = g1, b0 = b1;
264 if (1) o0 = o1;
265 if (!cstc) icp += dip;
266 if (!csto && 1) iop += dip;
267 r1 = cmap[*icp].r*cmul, g1 = cmap[*icp].g*cmul, b1 = cmap[*icp].b*cmul;
268 o1 = *iop * omul;
269 }
270 f1 = 1.0 - f;
271 if (!(1));
272 else if (1 && !1) {
273 obar = 1.0 - (o0*f1 + o1*f);
274 ocp->r = ocp->r*obar + r0*f1 + r1*f;
275 ocp->g = ocp->g*obar + g0*f1 + g1*f;
276 ocp->b = ocp->b*obar + b0*f1 + b1*f;
277 } else {
278 ocp->r = r0*f1 + r1*f;
279 ocp->g = g0*f1 + g1*f;
280 ocp->b = b0*f1 + b1*f;
281 if (1) *oop = o0*f1 + o1*f;
282 }
283 f += df;
284 ocp += dop;
285 if (1) oop += dop;
286 z += dz;
287 ky -= 1;
288 }
289 }
290 };
291 } else {
292 {
293
294 iscale = 1.0 / scale;
295 dip = idy;
296 dop = scale>0? ody : -ody;
297 dz = scale>0? dzdy : -dzdy;
298 df = scale>0? scale : -scale;
299
300 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
301 if (scale>0) {
302 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
303 if (oy<0) oy = 0;
304 if (oy>=oky) continue;
305 ky = oky-oy;
306 y = (oy - 1 - yy) * iscale;
307 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
308 } else {
309 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
310 if (oy<0) continue;
311 if (oy>=oky) oy = oky-1;
312 ky = oy+1;
313 y = (oy + 1 - yy) * iscale;
314 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
315 }
316 if (iy<0) iy = 0;
317 if (iy>=iky) continue;
318 f = scale>0? oy - (yy + (iy * scale))
319 : (yy + (iy * scale)) - oy;
320 f = 1 - f;
321 icp = cstc ? (unsigned char *)icstart :
322 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
323 if (1) iop = csto ? (float *)iostart :
324 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
325 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
326 if (1) oop = oostart + (x+osx)*odx + oy*ody;
327 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
328 while (f<1 && iy<iky) {
329 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
330 o = *iop;
331 r0 += r * f, g0 += g * f, b0 += b * f;
332 if (1) o0 += o * f;
333 s0 += f;
334 f += df;
335 iy += 1;
336 if (! cstc) icp += dip;
337 if (!csto && 1) iop += dip;
338 }
339 f -= 1.0;
340 z = osz + (osx+x)*dzdx + oy*dzdy;
341 while (iy<iky && ky>0) {
342 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
343 o = *iop;
344 f1 = (1.0 - f);
345 r0 += r*f1, g0 += g*f1, b0 += b*f1;
346 if (1) o0 += o*f1;
347 s0 += f1;
348 r1 += r*f, g1 += g*f, b1 += b*f;
349 if (1) o1 += o*f;
350 s1 += f;
351 f += df;
352 if (f >= 1.0) {
353 f -= 1.0;
354 s0 = s0? (float)1.0/s0 : 0.0;
355 if (!(1));
356 else if (1 && !1) {
357 obar = 1.0 - o0 * s0 * omul;
358 s0 *= cmul;
359 ocp->r = ocp->r*obar + r0*s0;
360 ocp->g = ocp->g*obar + g0*s0;
361 ocp->b = ocp->b*obar + b0*s0;
362 } else {
363 if (1) *oop = o0 * s0 * omul;
364 s0 *= cmul;
365 ocp->r = r0*s0;
366 ocp->g = g0*s0;
367 ocp->b = b0*s0;
368 }
369 r0 = r1, g0 = g1, b0 = b1;
370 if (1) o0 = o1;
371 s0 = s1;
372 r1 = g1 = b1 = s1 = 0;
373 if (1) o1 = 0;
374 ocp += dop;
375 if (1) oop += dop;
376 z += dz;
377 ky -= 1;
378 }
379 iy += 1;
380 if (! cstc) icp += dip;
381 if (!csto && 1) iop += dip;
382 }
383 if (ky>0 && f>df) {
384 s0 = s0? (float)1.0/s0 : 0.0;
385 if (!(1));
386 else if (1 && !1) {
387 obar = 1.0 - o0 * s0 * omul;
388 s0 *= cmul;
389 ocp->r = ocp->r*obar + r0*s0;
390 ocp->g = ocp->g*obar + g0*s0;
391 ocp->b = ocp->b*obar + b0*s0;
392 } else {
393 if (1) *oop = o0 * s0 * omul;
394 s0 *= cmul;
395 ocp->r = r0*s0;
396 ocp->g = g0*s0;
397 ocp->b = b0*s0;
398 }
399 }
400 }
401 };
402 };
403 } else {
404
405 if (((scale)<0? -(scale) : (scale)) > 1.0) {
406 {
407
408 iscale = 1.0 / scale;
409 dip = idy;
410 dop = scale>0? ody : -ody;
411 dz = scale>0? dzdy : -dzdy;
412 df = scale>0? iscale : -iscale;
413
414 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
415 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
416 if (oy<0) oy = 0;
417 if (oy>=oky) oy = oky-1;
418 f = (oy - yy) * iscale;
419 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
420 if (iy<0) continue;
421 if (iy>=iky) continue;
422 f = f - iy + 1.0;
423 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
424 if (1) oop = oostart + (x+osx)*odx + oy*ody;
425 ky = scale>0? oky-oy : oy+1;
426 icp = cstc ? (unsigned char *)icstart :
427 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
428 if (0) iop = csto ? (float *)iostart :
429 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
430 r1 = cmap[*icp].r * cmul, g1 = cmap[*icp].g * cmul, b1 = cmap[*icp].b * cmul;
431 o1 = 1 * omul;
432 r0 = g0 = b0 = o0 = 0;
433 z = osz + (osx+x)*dzdx + oy*dzdy;
434 while (ky>0) {
435 if (f > 1.0) {
436 f -= 1.0;
437 iy += 1;
438 if (iy>=iky) break;
439 r0 = r1, g0 = g1, b0 = b1;
440 if (1) o0 = o1;
441 if (!cstc) icp += dip;
442 if (!csto && 0) iop += dip;
443 r1 = cmap[*icp].r*cmul, g1 = cmap[*icp].g*cmul, b1 = cmap[*icp].b*cmul;
444 o1 = 1 * omul;
445 }
446 f1 = 1.0 - f;
447 if (!(1));
448 else if (1 && !1) {
449 obar = 1.0 - (o0*f1 + o1*f);
450 ocp->r = ocp->r*obar + r0*f1 + r1*f;
451 ocp->g = ocp->g*obar + g0*f1 + g1*f;
452 ocp->b = ocp->b*obar + b0*f1 + b1*f;
453 } else {
454 ocp->r = r0*f1 + r1*f;
455 ocp->g = g0*f1 + g1*f;
456 ocp->b = b0*f1 + b1*f;
457 if (1) *oop = o0*f1 + o1*f;
458 }
459 f += df;
460 ocp += dop;
461 if (1) oop += dop;
462 z += dz;
463 ky -= 1;
464 }
465 }
466 };
467 } else {
468 {
469
470 iscale = 1.0 / scale;
471 dip = idy;
472 dop = scale>0? ody : -ody;
473 dz = scale>0? dzdy : -dzdy;
474 df = scale>0? scale : -scale;
475
476 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
477 if (scale>0) {
478 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
479 if (oy<0) oy = 0;
480 if (oy>=oky) continue;
481 ky = oky-oy;
482 y = (oy - 1 - yy) * iscale;
483 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
484 } else {
485 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
486 if (oy<0) continue;
487 if (oy>=oky) oy = oky-1;
488 ky = oy+1;
489 y = (oy + 1 - yy) * iscale;
490 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
491 }
492 if (iy<0) iy = 0;
493 if (iy>=iky) continue;
494 f = scale>0? oy - (yy + (iy * scale))
495 : (yy + (iy * scale)) - oy;
496 f = 1 - f;
497 icp = cstc ? (unsigned char *)icstart :
498 (unsigned char *)icstart + (x+isx)*idx + (iy+isy)*idy;
499 if (0) iop = csto ? (float *)iostart :
500 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
501 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
502 if (1) oop = oostart + (x+osx)*odx + oy*ody;
503 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
504 while (f<1 && iy<iky) {
505 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
506 o = 1;
507 r0 += r * f, g0 += g * f, b0 += b * f;
508 if (1) o0 += o * f;
509 s0 += f;
510 f += df;
511 iy += 1;
512 if (! cstc) icp += dip;
513 if (!csto && 0) iop += dip;
514 }
515 f -= 1.0;
516 z = osz + (osx+x)*dzdx + oy*dzdy;
517 while (iy<iky && ky>0) {
518 r = cmap[*icp].r, g = cmap[*icp].g, b = cmap[*icp].b;
519 o = 1;
520 f1 = (1.0 - f);
521 r0 += r*f1, g0 += g*f1, b0 += b*f1;
522 if (1) o0 += o*f1;
523 s0 += f1;
524 r1 += r*f, g1 += g*f, b1 += b*f;
525 if (1) o1 += o*f;
526 s1 += f;
527 f += df;
528 if (f >= 1.0) {
529 f -= 1.0;
530 s0 = s0? (float)1.0/s0 : 0.0;
531 if (!(1));
532 else if (1 && !1) {
533 obar = 1.0 - o0 * s0 * omul;
534 s0 *= cmul;
535 ocp->r = ocp->r*obar + r0*s0;
536 ocp->g = ocp->g*obar + g0*s0;
537 ocp->b = ocp->b*obar + b0*s0;
538 } else {
539 if (1) *oop = o0 * s0 * omul;
540 s0 *= cmul;
541 ocp->r = r0*s0;
542 ocp->g = g0*s0;
543 ocp->b = b0*s0;
544 }
545 r0 = r1, g0 = g1, b0 = b1;
546 if (1) o0 = o1;
547 s0 = s1;
548 r1 = g1 = b1 = s1 = 0;
549 if (1) o1 = 0;
550 ocp += dop;
551 if (1) oop += dop;
552 z += dz;
553 ky -= 1;
554 }
555 iy += 1;
556 if (! cstc) icp += dip;
557 if (!csto && 0) iop += dip;
558 }
559 if (ky>0 && f>df) {
560 s0 = s0? (float)1.0/s0 : 0.0;
561 if (!(1));
562 else if (1 && !1) {
563 obar = 1.0 - o0 * s0 * omul;
564 s0 *= cmul;
565 ocp->r = ocp->r*obar + r0*s0;
566 ocp->g = ocp->g*obar + g0*s0;
567 ocp->b = ocp->b*obar + b0*s0;
568 } else {
569 if (1) *oop = o0 * s0 * omul;
570 s0 *= cmul;
571 ocp->r = r0*s0;
572 ocp->g = g0*s0;
573 ocp->b = b0*s0;
574 }
575 }
576 }
577 };
578 };
579 }
580 } else if (otype==type_colors) {
581 {
582 RGBColor *icp;
583 RGBColor *ocp;
584 if (iostart && oostart) {
585
586 if (((scale)<0? -(scale) : (scale)) > 1.0) {
587 {
588
589 iscale = 1.0 / scale;
590 dip = idy;
591 dop = scale>0? ody : -ody;
592 dz = scale>0? dzdy : -dzdy;
593 df = scale>0? iscale : -iscale;
594
595 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
596 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
597 if (oy<0) oy = 0;
598 if (oy>=oky) oy = oky-1;
599 f = (oy - yy) * iscale;
600 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
601 if (iy<0) continue;
602 if (iy>=iky) continue;
603 f = f - iy + 1.0;
604 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
605 if (1) oop = oostart + (x+osx)*odx + oy*ody;
606 ky = scale>0? oky-oy : oy+1;
607 icp = cstc ? (RGBColor *)icstart :
608 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
609 if (1) iop = csto ? (float *)iostart :
610 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
611 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
612 o1 = *iop * omul;
613 r0 = g0 = b0 = o0 = 0;
614 z = osz + (osx+x)*dzdx + oy*dzdy;
615 while (ky>0) {
616 if (f > 1.0) {
617 f -= 1.0;
618 iy += 1;
619 if (iy>=iky) break;
620 r0 = r1, g0 = g1, b0 = b1;
621 if (1) o0 = o1;
622 if (!cstc) icp += dip;
623 if (!csto && 1) iop += dip;
624 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
625 o1 = *iop * omul;
626 }
627 f1 = 1.0 - f;
628 if (!(1));
629 else if (1 && !1) {
630 obar = 1.0 - (o0*f1 + o1*f);
631 ocp->r = ocp->r*obar + r0*f1 + r1*f;
632 ocp->g = ocp->g*obar + g0*f1 + g1*f;
633 ocp->b = ocp->b*obar + b0*f1 + b1*f;
634 } else {
635 ocp->r = r0*f1 + r1*f;
636 ocp->g = g0*f1 + g1*f;
637 ocp->b = b0*f1 + b1*f;
638 if (1) *oop = o0*f1 + o1*f;
639 }
640 f += df;
641 ocp += dop;
642 if (1) oop += dop;
643 z += dz;
644 ky -= 1;
645 }
646 }
647 };
648 } else {
649 {
650
651 iscale = 1.0 / scale;
652 dip = idy;
653 dop = scale>0? ody : -ody;
654 dz = scale>0? dzdy : -dzdy;
655 df = scale>0? scale : -scale;
656
657 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
658 if (scale>0) {
659 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
660 if (oy<0) oy = 0;
661 if (oy>=oky) continue;
662 ky = oky-oy;
663 y = (oy - 1 - yy) * iscale;
664 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
665 } else {
666 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
667 if (oy<0) continue;
668 if (oy>=oky) oy = oky-1;
669 ky = oy+1;
670 y = (oy + 1 - yy) * iscale;
671 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
672 }
673 if (iy<0) iy = 0;
674 if (iy>=iky) continue;
675 f = scale>0? oy - (yy + (iy * scale))
676 : (yy + (iy * scale)) - oy;
677 f = 1 - f;
678 icp = cstc ? (RGBColor *)icstart :
679 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
680 if (1) iop = csto ? (float *)iostart :
681 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
682 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
683 if (1) oop = oostart + (x+osx)*odx + oy*ody;
684 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
685 while (f<1 && iy<iky) {
686 r = icp->r, g = icp->g, b = icp->b;
687 o = *iop;
688 r0 += r * f, g0 += g * f, b0 += b * f;
689 if (1) o0 += o * f;
690 s0 += f;
691 f += df;
692 iy += 1;
693 if (! cstc) icp += dip;
694 if (!csto && 1) iop += dip;
695 }
696 f -= 1.0;
697 z = osz + (osx+x)*dzdx + oy*dzdy;
698 while (iy<iky && ky>0) {
699 r = icp->r, g = icp->g, b = icp->b;
700 o = *iop;
701 f1 = (1.0 - f);
702 r0 += r*f1, g0 += g*f1, b0 += b*f1;
703 if (1) o0 += o*f1;
704 s0 += f1;
705 r1 += r*f, g1 += g*f, b1 += b*f;
706 if (1) o1 += o*f;
707 s1 += f;
708 f += df;
709 if (f >= 1.0) {
710 f -= 1.0;
711 s0 = s0? (float)1.0/s0 : 0.0;
712 if (!(1));
713 else if (1 && !1) {
714 obar = 1.0 - o0 * s0 * omul;
715 s0 *= cmul;
716 ocp->r = ocp->r*obar + r0*s0;
717 ocp->g = ocp->g*obar + g0*s0;
718 ocp->b = ocp->b*obar + b0*s0;
719 } else {
720 if (1) *oop = o0 * s0 * omul;
721 s0 *= cmul;
722 ocp->r = r0*s0;
723 ocp->g = g0*s0;
724 ocp->b = b0*s0;
725 }
726 r0 = r1, g0 = g1, b0 = b1;
727 if (1) o0 = o1;
728 s0 = s1;
729 r1 = g1 = b1 = s1 = 0;
730 if (1) o1 = 0;
731 ocp += dop;
732 if (1) oop += dop;
733 z += dz;
734 ky -= 1;
735 }
736 iy += 1;
737 if (! cstc) icp += dip;
738 if (!csto && 1) iop += dip;
739 }
740 if (ky>0 && f>df) {
741 s0 = s0? (float)1.0/s0 : 0.0;
742 if (!(1));
743 else if (1 && !1) {
744 obar = 1.0 - o0 * s0 * omul;
745 s0 *= cmul;
746 ocp->r = ocp->r*obar + r0*s0;
747 ocp->g = ocp->g*obar + g0*s0;
748 ocp->b = ocp->b*obar + b0*s0;
749 } else {
750 if (1) *oop = o0 * s0 * omul;
751 s0 *= cmul;
752 ocp->r = r0*s0;
753 ocp->g = g0*s0;
754 ocp->b = b0*s0;
755 }
756 }
757 }
758 };
759 };
760 } else if (iostart) {
761
762 if (((scale)<0? -(scale) : (scale)) > 1.0) {
763 {
764
765 iscale = 1.0 / scale;
766 dip = idy;
767 dop = scale>0? ody : -ody;
768 dz = scale>0? dzdy : -dzdy;
769 df = scale>0? iscale : -iscale;
770
771 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
772 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
773 if (oy<0) oy = 0;
774 if (oy>=oky) oy = oky-1;
775 f = (oy - yy) * iscale;
776 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
777 if (iy<0) continue;
778 if (iy>=iky) continue;
779 f = f - iy + 1.0;
780 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
781 if (0) oop = oostart + (x+osx)*odx + oy*ody;
782 ky = scale>0? oky-oy : oy+1;
783 icp = cstc ? (RGBColor *)icstart :
784 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
785 if (1) iop = csto ? (float *)iostart :
786 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
787 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
788 o1 = *iop * omul;
789 r0 = g0 = b0 = o0 = 0;
790 z = osz + (osx+x)*dzdx + oy*dzdy;
791 while (ky>0) {
792 if (f > 1.0) {
793 f -= 1.0;
794 iy += 1;
795 if (iy>=iky) break;
796 r0 = r1, g0 = g1, b0 = b1;
797 if (1) o0 = o1;
798 if (!cstc) icp += dip;
799 if (!csto && 1) iop += dip;
800 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
801 o1 = *iop * omul;
802 }
803 f1 = 1.0 - f;
804 if (!(1));
805 else if (1 && !0) {
806 obar = 1.0 - (o0*f1 + o1*f);
807 ocp->r = ocp->r*obar + r0*f1 + r1*f;
808 ocp->g = ocp->g*obar + g0*f1 + g1*f;
809 ocp->b = ocp->b*obar + b0*f1 + b1*f;
810 } else {
811 ocp->r = r0*f1 + r1*f;
812 ocp->g = g0*f1 + g1*f;
813 ocp->b = b0*f1 + b1*f;
814 if (0) *oop = o0*f1 + o1*f;
815 }
816 f += df;
817 ocp += dop;
818 if (0) oop += dop;
819 z += dz;
820 ky -= 1;
821 }
822 }
823 };
824 } else {
825 {
826
827 iscale = 1.0 / scale;
828 dip = idy;
829 dop = scale>0? ody : -ody;
830 dz = scale>0? dzdy : -dzdy;
831 df = scale>0? scale : -scale;
832
833 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
834 if (scale>0) {
835 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
836 if (oy<0) oy = 0;
837 if (oy>=oky) continue;
838 ky = oky-oy;
839 y = (oy - 1 - yy) * iscale;
840 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
841 } else {
842 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
843 if (oy<0) continue;
844 if (oy>=oky) oy = oky-1;
845 ky = oy+1;
846 y = (oy + 1 - yy) * iscale;
847 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
848 }
849 if (iy<0) iy = 0;
850 if (iy>=iky) continue;
851 f = scale>0? oy - (yy + (iy * scale))
852 : (yy + (iy * scale)) - oy;
853 f = 1 - f;
854 icp = cstc ? (RGBColor *)icstart :
855 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
856 if (1) iop = csto ? (float *)iostart :
857 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
858 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
859 if (0) oop = oostart + (x+osx)*odx + oy*ody;
860 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
861 while (f<1 && iy<iky) {
862 r = icp->r, g = icp->g, b = icp->b;
863 o = *iop;
864 r0 += r * f, g0 += g * f, b0 += b * f;
865 if (1) o0 += o * f;
866 s0 += f;
867 f += df;
868 iy += 1;
869 if (! cstc) icp += dip;
870 if (!csto && 1) iop += dip;
871 }
872 f -= 1.0;
873 z = osz + (osx+x)*dzdx + oy*dzdy;
874 while (iy<iky && ky>0) {
875 r = icp->r, g = icp->g, b = icp->b;
876 o = *iop;
877 f1 = (1.0 - f);
878 r0 += r*f1, g0 += g*f1, b0 += b*f1;
879 if (1) o0 += o*f1;
880 s0 += f1;
881 r1 += r*f, g1 += g*f, b1 += b*f;
882 if (1) o1 += o*f;
883 s1 += f;
884 f += df;
885 if (f >= 1.0) {
886 f -= 1.0;
887 s0 = s0? (float)1.0/s0 : 0.0;
888 if (!(1));
889 else if (1 && !0) {
890 obar = 1.0 - o0 * s0 * omul;
891 s0 *= cmul;
892 ocp->r = ocp->r*obar + r0*s0;
893 ocp->g = ocp->g*obar + g0*s0;
894 ocp->b = ocp->b*obar + b0*s0;
895 } else {
896 if (0) *oop = o0 * s0 * omul;
897 s0 *= cmul;
898 ocp->r = r0*s0;
899 ocp->g = g0*s0;
900 ocp->b = b0*s0;
901 }
902 r0 = r1, g0 = g1, b0 = b1;
903 if (1) o0 = o1;
904 s0 = s1;
905 r1 = g1 = b1 = s1 = 0;
906 if (1) o1 = 0;
907 ocp += dop;
908 if (0) oop += dop;
909 z += dz;
910 ky -= 1;
911 }
912 iy += 1;
913 if (! cstc) icp += dip;
914 if (!csto && 1) iop += dip;
915 }
916 if (ky>0 && f>df) {
917 s0 = s0? (float)1.0/s0 : 0.0;
918 if (!(1));
919 else if (1 && !0) {
920 obar = 1.0 - o0 * s0 * omul;
921 s0 *= cmul;
922 ocp->r = ocp->r*obar + r0*s0;
923 ocp->g = ocp->g*obar + g0*s0;
924 ocp->b = ocp->b*obar + b0*s0;
925 } else {
926 if (0) *oop = o0 * s0 * omul;
927 s0 *= cmul;
928 ocp->r = r0*s0;
929 ocp->g = g0*s0;
930 ocp->b = b0*s0;
931 }
932 }
933 }
934 };
935 };
936 } else if (oostart) {
937
938 if (((scale)<0? -(scale) : (scale)) > 1.0) {
939 {
940
941 iscale = 1.0 / scale;
942 dip = idy;
943 dop = scale>0? ody : -ody;
944 dz = scale>0? dzdy : -dzdy;
945 df = scale>0? iscale : -iscale;
946
947 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
948 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
949 if (oy<0) oy = 0;
950 if (oy>=oky) oy = oky-1;
951 f = (oy - yy) * iscale;
952 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
953 if (iy<0) continue;
954 if (iy>=iky) continue;
955 f = f - iy + 1.0;
956 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
957 if (1) oop = oostart + (x+osx)*odx + oy*ody;
958 ky = scale>0? oky-oy : oy+1;
959 icp = cstc ? (RGBColor *)icstart :
960 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
961 if (0) iop = csto ? (float *)iostart :
962 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
963 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
964 o1 = 1 * omul;
965 r0 = g0 = b0 = o0 = 0;
966 z = osz + (osx+x)*dzdx + oy*dzdy;
967 while (ky>0) {
968 if (f > 1.0) {
969 f -= 1.0;
970 iy += 1;
971 if (iy>=iky) break;
972 r0 = r1, g0 = g1, b0 = b1;
973 if (1) o0 = o1;
974 if (!cstc) icp += dip;
975 if (!csto && 0) iop += dip;
976 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
977 o1 = 1 * omul;
978 }
979 f1 = 1.0 - f;
980 if (!(1));
981 else if (1 && !1) {
982 obar = 1.0 - (o0*f1 + o1*f);
983 ocp->r = ocp->r*obar + r0*f1 + r1*f;
984 ocp->g = ocp->g*obar + g0*f1 + g1*f;
985 ocp->b = ocp->b*obar + b0*f1 + b1*f;
986 } else {
987 ocp->r = r0*f1 + r1*f;
988 ocp->g = g0*f1 + g1*f;
989 ocp->b = b0*f1 + b1*f;
990 if (1) *oop = o0*f1 + o1*f;
991 }
992 f += df;
993 ocp += dop;
994 if (1) oop += dop;
995 z += dz;
996 ky -= 1;
997 }
998 }
999 };
1000 } else {
1001 {
1002
1003 iscale = 1.0 / scale;
1004 dip = idy;
1005 dop = scale>0? ody : -ody;
1006 dz = scale>0? dzdy : -dzdy;
1007 df = scale>0? scale : -scale;
1008
1009 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1010 if (scale>0) {
1011 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1012 if (oy<0) oy = 0;
1013 if (oy>=oky) continue;
1014 ky = oky-oy;
1015 y = (oy - 1 - yy) * iscale;
1016 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1017 } else {
1018 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1019 if (oy<0) continue;
1020 if (oy>=oky) oy = oky-1;
1021 ky = oy+1;
1022 y = (oy + 1 - yy) * iscale;
1023 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1024 }
1025 if (iy<0) iy = 0;
1026 if (iy>=iky) continue;
1027 f = scale>0? oy - (yy + (iy * scale))
1028 : (yy + (iy * scale)) - oy;
1029 f = 1 - f;
1030 icp = cstc ? (RGBColor *)icstart :
1031 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1032 if (0) iop = csto ? (float *)iostart :
1033 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1034 ocp = (RGBColor *)ocstart + (x+osx)*odx + oy*ody;
1035 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1036 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1037 while (f<1 && iy<iky) {
1038 r = icp->r, g = icp->g, b = icp->b;
1039 o = 1;
1040 r0 += r * f, g0 += g * f, b0 += b * f;
1041 if (1) o0 += o * f;
1042 s0 += f;
1043 f += df;
1044 iy += 1;
1045 if (! cstc) icp += dip;
1046 if (!csto && 0) iop += dip;
1047 }
1048 f -= 1.0;
1049 z = osz + (osx+x)*dzdx + oy*dzdy;
1050 while (iy<iky && ky>0) {
1051 r = icp->r, g = icp->g, b = icp->b;
1052 o = 1;
1053 f1 = (1.0 - f);
1054 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1055 if (1) o0 += o*f1;
1056 s0 += f1;
1057 r1 += r*f, g1 += g*f, b1 += b*f;
1058 if (1) o1 += o*f;
1059 s1 += f;
1060 f += df;
1061 if (f >= 1.0) {
1062 f -= 1.0;
1063 s0 = s0? (float)1.0/s0 : 0.0;
1064 if (!(1));
1065 else if (1 && !1) {
1066 obar = 1.0 - o0 * s0 * omul;
1067 s0 *= cmul;
1068 ocp->r = ocp->r*obar + r0*s0;
1069 ocp->g = ocp->g*obar + g0*s0;
1070 ocp->b = ocp->b*obar + b0*s0;
1071 } else {
1072 if (1) *oop = o0 * s0 * omul;
1073 s0 *= cmul;
1074 ocp->r = r0*s0;
1075 ocp->g = g0*s0;
1076 ocp->b = b0*s0;
1077 }
1078 r0 = r1, g0 = g1, b0 = b1;
1079 if (1) o0 = o1;
1080 s0 = s1;
1081 r1 = g1 = b1 = s1 = 0;
1082 if (1) o1 = 0;
1083 ocp += dop;
1084 if (1) oop += dop;
1085 z += dz;
1086 ky -= 1;
1087 }
1088 iy += 1;
1089 if (! cstc) icp += dip;
1090 if (!csto && 0) iop += dip;
1091 }
1092 if (ky>0 && f>df) {
1093 s0 = s0? (float)1.0/s0 : 0.0;
1094 if (!(1));
1095 else if (1 && !1) {
1096 obar = 1.0 - o0 * s0 * omul;
1097 s0 *= cmul;
1098 ocp->r = ocp->r*obar + r0*s0;
1099 ocp->g = ocp->g*obar + g0*s0;
1100 ocp->b = ocp->b*obar + b0*s0;
1101 } else {
1102 if (1) *oop = o0 * s0 * omul;
1103 s0 *= cmul;
1104 ocp->r = r0*s0;
1105 ocp->g = g0*s0;
1106 ocp->b = b0*s0;
1107 }
1108 }
1109 }
1110 };
1111 };
1112 } else {
1113 {if (!(0)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
1114
1115
1116
1117 }
1118 };
1119 } else if (otype==type_fast) {
1120 {if (!(!clip)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
1121 {
1122 RGBColor *icp;
1123 struct fast *ocp;
1124 if (iostart && oostart) {
1125
1126 if (((scale)<0? -(scale) : (scale)) > 1.0) {
1127 {
1128
1129 iscale = 1.0 / scale;
1130 dip = idy;
1131 dop = scale>0? ody : -ody;
1132 dz = scale>0? dzdy : -dzdy;
1133 df = scale>0? iscale : -iscale;
1134
1135 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1136 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1137 if (oy<0) oy = 0;
1138 if (oy>=oky) oy = oky-1;
1139 f = (oy - yy) * iscale;
1140 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
1141 if (iy<0) continue;
1142 if (iy>=iky) continue;
1143 f = f - iy + 1.0;
1144 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1145 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1146 ky = scale>0? oky-oy : oy+1;
1147 icp = cstc ? (RGBColor *)icstart :
1148 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1149 if (1) iop = csto ? (float *)iostart :
1150 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1151 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
1152 o1 = *iop * omul;
1153 r0 = g0 = b0 = o0 = 0;
1154 z = osz + (osx+x)*dzdx + oy*dzdy;
1155 while (ky>0) {
1156 if (f > 1.0) {
1157 f -= 1.0;
1158 iy += 1;
1159 if (iy>=iky) break;
1160 r0 = r1, g0 = g1, b0 = b1;
1161 if (1) o0 = o1;
1162 if (!cstc) icp += dip;
1163 if (!csto && 1) iop += dip;
1164 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
1165 o1 = *iop * omul;
1166 }
1167 f1 = 1.0 - f;
1168 if (!((z>ocp->z)));
1169 else if (1 && !1) {
1170 obar = 1.0 - (o0*f1 + o1*f);
1171 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
1172 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
1173 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
1174 } else {
1175 ocp->c.r = r0*f1 + r1*f;
1176 ocp->c.g = g0*f1 + g1*f;
1177 ocp->c.b = b0*f1 + b1*f;
1178 if (1) *oop = o0*f1 + o1*f;
1179 }
1180 f += df;
1181 ocp += dop;
1182 if (1) oop += dop;
1183 z += dz;
1184 ky -= 1;
1185 }
1186 }
1187 };
1188 } else {
1189 {
1190
1191 iscale = 1.0 / scale;
1192 dip = idy;
1193 dop = scale>0? ody : -ody;
1194 dz = scale>0? dzdy : -dzdy;
1195 df = scale>0? scale : -scale;
1196
1197 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1198 if (scale>0) {
1199 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1200 if (oy<0) oy = 0;
1201 if (oy>=oky) continue;
1202 ky = oky-oy;
1203 y = (oy - 1 - yy) * iscale;
1204 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1205 } else {
1206 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1207 if (oy<0) continue;
1208 if (oy>=oky) oy = oky-1;
1209 ky = oy+1;
1210 y = (oy + 1 - yy) * iscale;
1211 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1212 }
1213 if (iy<0) iy = 0;
1214 if (iy>=iky) continue;
1215 f = scale>0? oy - (yy + (iy * scale))
1216 : (yy + (iy * scale)) - oy;
1217 f = 1 - f;
1218 icp = cstc ? (RGBColor *)icstart :
1219 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1220 if (1) iop = csto ? (float *)iostart :
1221 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1222 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1223 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1224 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1225 while (f<1 && iy<iky) {
1226 r = icp->r, g = icp->g, b = icp->b;
1227 o = *iop;
1228 r0 += r * f, g0 += g * f, b0 += b * f;
1229 if (1) o0 += o * f;
1230 s0 += f;
1231 f += df;
1232 iy += 1;
1233 if (! cstc) icp += dip;
1234 if (!csto && 1) iop += dip;
1235 }
1236 f -= 1.0;
1237 z = osz + (osx+x)*dzdx + oy*dzdy;
1238 while (iy<iky && ky>0) {
1239 r = icp->r, g = icp->g, b = icp->b;
1240 o = *iop;
1241 f1 = (1.0 - f);
1242 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1243 if (1) o0 += o*f1;
1244 s0 += f1;
1245 r1 += r*f, g1 += g*f, b1 += b*f;
1246 if (1) o1 += o*f;
1247 s1 += f;
1248 f += df;
1249 if (f >= 1.0) {
1250 f -= 1.0;
1251 s0 = s0? (float)1.0/s0 : 0.0;
1252 if (!((z>ocp->z)));
1253 else if (1 && !1) {
1254 obar = 1.0 - o0 * s0 * omul;
1255 s0 *= cmul;
1256 ocp->c.r = ocp->c.r*obar + r0*s0;
1257 ocp->c.g = ocp->c.g*obar + g0*s0;
1258 ocp->c.b = ocp->c.b*obar + b0*s0;
1259 } else {
1260 if (1) *oop = o0 * s0 * omul;
1261 s0 *= cmul;
1262 ocp->c.r = r0*s0;
1263 ocp->c.g = g0*s0;
1264 ocp->c.b = b0*s0;
1265 }
1266 r0 = r1, g0 = g1, b0 = b1;
1267 if (1) o0 = o1;
1268 s0 = s1;
1269 r1 = g1 = b1 = s1 = 0;
1270 if (1) o1 = 0;
1271 ocp += dop;
1272 if (1) oop += dop;
1273 z += dz;
1274 ky -= 1;
1275 }
1276 iy += 1;
1277 if (! cstc) icp += dip;
1278 if (!csto && 1) iop += dip;
1279 }
1280 if (ky>0 && f>df) {
1281 s0 = s0? (float)1.0/s0 : 0.0;
1282 if (!((z>ocp->z)));
1283 else if (1 && !1) {
1284 obar = 1.0 - o0 * s0 * omul;
1285 s0 *= cmul;
1286 ocp->c.r = ocp->c.r*obar + r0*s0;
1287 ocp->c.g = ocp->c.g*obar + g0*s0;
1288 ocp->c.b = ocp->c.b*obar + b0*s0;
1289 } else {
1290 if (1) *oop = o0 * s0 * omul;
1291 s0 *= cmul;
1292 ocp->c.r = r0*s0;
1293 ocp->c.g = g0*s0;
1294 ocp->c.b = b0*s0;
1295 }
1296 }
1297 }
1298 };
1299 };
1300 } else if (iostart) {
1301
1302 if (((scale)<0? -(scale) : (scale)) > 1.0) {
1303 {
1304
1305 iscale = 1.0 / scale;
1306 dip = idy;
1307 dop = scale>0? ody : -ody;
1308 dz = scale>0? dzdy : -dzdy;
1309 df = scale>0? iscale : -iscale;
1310
1311 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1312 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1313 if (oy<0) oy = 0;
1314 if (oy>=oky) oy = oky-1;
1315 f = (oy - yy) * iscale;
1316 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
1317 if (iy<0) continue;
1318 if (iy>=iky) continue;
1319 f = f - iy + 1.0;
1320 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1321 if (0) oop = oostart + (x+osx)*odx + oy*ody;
1322 ky = scale>0? oky-oy : oy+1;
1323 icp = cstc ? (RGBColor *)icstart :
1324 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1325 if (1) iop = csto ? (float *)iostart :
1326 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1327 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
1328 o1 = *iop * omul;
1329 r0 = g0 = b0 = o0 = 0;
1330 z = osz + (osx+x)*dzdx + oy*dzdy;
1331 while (ky>0) {
1332 if (f > 1.0) {
1333 f -= 1.0;
1334 iy += 1;
1335 if (iy>=iky) break;
1336 r0 = r1, g0 = g1, b0 = b1;
1337 if (1) o0 = o1;
1338 if (!cstc) icp += dip;
1339 if (!csto && 1) iop += dip;
1340 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
1341 o1 = *iop * omul;
1342 }
1343 f1 = 1.0 - f;
1344 if (!((z>ocp->z)));
1345 else if (1 && !0) {
1346 obar = 1.0 - (o0*f1 + o1*f);
1347 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
1348 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
1349 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
1350 } else {
1351 ocp->c.r = r0*f1 + r1*f;
1352 ocp->c.g = g0*f1 + g1*f;
1353 ocp->c.b = b0*f1 + b1*f;
1354 if (0) *oop = o0*f1 + o1*f;
1355 }
1356 f += df;
1357 ocp += dop;
1358 if (0) oop += dop;
1359 z += dz;
1360 ky -= 1;
1361 }
1362 }
1363 };
1364 } else {
1365 {
1366
1367 iscale = 1.0 / scale;
1368 dip = idy;
1369 dop = scale>0? ody : -ody;
1370 dz = scale>0? dzdy : -dzdy;
1371 df = scale>0? scale : -scale;
1372
1373 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1374 if (scale>0) {
1375 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1376 if (oy<0) oy = 0;
1377 if (oy>=oky) continue;
1378 ky = oky-oy;
1379 y = (oy - 1 - yy) * iscale;
1380 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1381 } else {
1382 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1383 if (oy<0) continue;
1384 if (oy>=oky) oy = oky-1;
1385 ky = oy+1;
1386 y = (oy + 1 - yy) * iscale;
1387 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1388 }
1389 if (iy<0) iy = 0;
1390 if (iy>=iky) continue;
1391 f = scale>0? oy - (yy + (iy * scale))
1392 : (yy + (iy * scale)) - oy;
1393 f = 1 - f;
1394 icp = cstc ? (RGBColor *)icstart :
1395 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1396 if (1) iop = csto ? (float *)iostart :
1397 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1398 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1399 if (0) oop = oostart + (x+osx)*odx + oy*ody;
1400 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1401 while (f<1 && iy<iky) {
1402 r = icp->r, g = icp->g, b = icp->b;
1403 o = *iop;
1404 r0 += r * f, g0 += g * f, b0 += b * f;
1405 if (1) o0 += o * f;
1406 s0 += f;
1407 f += df;
1408 iy += 1;
1409 if (! cstc) icp += dip;
1410 if (!csto && 1) iop += dip;
1411 }
1412 f -= 1.0;
1413 z = osz + (osx+x)*dzdx + oy*dzdy;
1414 while (iy<iky && ky>0) {
1415 r = icp->r, g = icp->g, b = icp->b;
1416 o = *iop;
1417 f1 = (1.0 - f);
1418 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1419 if (1) o0 += o*f1;
1420 s0 += f1;
1421 r1 += r*f, g1 += g*f, b1 += b*f;
1422 if (1) o1 += o*f;
1423 s1 += f;
1424 f += df;
1425 if (f >= 1.0) {
1426 f -= 1.0;
1427 s0 = s0? (float)1.0/s0 : 0.0;
1428 if (!((z>ocp->z)));
1429 else if (1 && !0) {
1430 obar = 1.0 - o0 * s0 * omul;
1431 s0 *= cmul;
1432 ocp->c.r = ocp->c.r*obar + r0*s0;
1433 ocp->c.g = ocp->c.g*obar + g0*s0;
1434 ocp->c.b = ocp->c.b*obar + b0*s0;
1435 } else {
1436 if (0) *oop = o0 * s0 * omul;
1437 s0 *= cmul;
1438 ocp->c.r = r0*s0;
1439 ocp->c.g = g0*s0;
1440 ocp->c.b = b0*s0;
1441 }
1442 r0 = r1, g0 = g1, b0 = b1;
1443 if (1) o0 = o1;
1444 s0 = s1;
1445 r1 = g1 = b1 = s1 = 0;
1446 if (1) o1 = 0;
1447 ocp += dop;
1448 if (0) oop += dop;
1449 z += dz;
1450 ky -= 1;
1451 }
1452 iy += 1;
1453 if (! cstc) icp += dip;
1454 if (!csto && 1) iop += dip;
1455 }
1456 if (ky>0 && f>df) {
1457 s0 = s0? (float)1.0/s0 : 0.0;
1458 if (!((z>ocp->z)));
1459 else if (1 && !0) {
1460 obar = 1.0 - o0 * s0 * omul;
1461 s0 *= cmul;
1462 ocp->c.r = ocp->c.r*obar + r0*s0;
1463 ocp->c.g = ocp->c.g*obar + g0*s0;
1464 ocp->c.b = ocp->c.b*obar + b0*s0;
1465 } else {
1466 if (0) *oop = o0 * s0 * omul;
1467 s0 *= cmul;
1468 ocp->c.r = r0*s0;
1469 ocp->c.g = g0*s0;
1470 ocp->c.b = b0*s0;
1471 }
1472 }
1473 }
1474 };
1475 };
1476 } else if (oostart) {
1477
1478 if (((scale)<0? -(scale) : (scale)) > 1.0) {
1479 {
1480
1481 iscale = 1.0 / scale;
1482 dip = idy;
1483 dop = scale>0? ody : -ody;
1484 dz = scale>0? dzdy : -dzdy;
1485 df = scale>0? iscale : -iscale;
1486
1487 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1488 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1489 if (oy<0) oy = 0;
1490 if (oy>=oky) oy = oky-1;
1491 f = (oy - yy) * iscale;
1492 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
1493 if (iy<0) continue;
1494 if (iy>=iky) continue;
1495 f = f - iy + 1.0;
1496 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1497 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1498 ky = scale>0? oky-oy : oy+1;
1499 icp = cstc ? (RGBColor *)icstart :
1500 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1501 if (0) iop = csto ? (float *)iostart :
1502 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1503 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
1504 o1 = 1 * omul;
1505 r0 = g0 = b0 = o0 = 0;
1506 z = osz + (osx+x)*dzdx + oy*dzdy;
1507 while (ky>0) {
1508 if (f > 1.0) {
1509 f -= 1.0;
1510 iy += 1;
1511 if (iy>=iky) break;
1512 r0 = r1, g0 = g1, b0 = b1;
1513 if (1) o0 = o1;
1514 if (!cstc) icp += dip;
1515 if (!csto && 0) iop += dip;
1516 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
1517 o1 = 1 * omul;
1518 }
1519 f1 = 1.0 - f;
1520 if (!((z>ocp->z)));
1521 else if (1 && !1) {
1522 obar = 1.0 - (o0*f1 + o1*f);
1523 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
1524 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
1525 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
1526 } else {
1527 ocp->c.r = r0*f1 + r1*f;
1528 ocp->c.g = g0*f1 + g1*f;
1529 ocp->c.b = b0*f1 + b1*f;
1530 if (1) *oop = o0*f1 + o1*f;
1531 }
1532 f += df;
1533 ocp += dop;
1534 if (1) oop += dop;
1535 z += dz;
1536 ky -= 1;
1537 }
1538 }
1539 };
1540 } else {
1541 {
1542
1543 iscale = 1.0 / scale;
1544 dip = idy;
1545 dop = scale>0? ody : -ody;
1546 dz = scale>0? dzdy : -dzdy;
1547 df = scale>0? scale : -scale;
1548
1549 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1550 if (scale>0) {
1551 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1552 if (oy<0) oy = 0;
1553 if (oy>=oky) continue;
1554 ky = oky-oy;
1555 y = (oy - 1 - yy) * iscale;
1556 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1557 } else {
1558 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1559 if (oy<0) continue;
1560 if (oy>=oky) oy = oky-1;
1561 ky = oy+1;
1562 y = (oy + 1 - yy) * iscale;
1563 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1564 }
1565 if (iy<0) iy = 0;
1566 if (iy>=iky) continue;
1567 f = scale>0? oy - (yy + (iy * scale))
1568 : (yy + (iy * scale)) - oy;
1569 f = 1 - f;
1570 icp = cstc ? (RGBColor *)icstart :
1571 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1572 if (0) iop = csto ? (float *)iostart :
1573 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1574 ocp = (struct fast *)ocstart + (x+osx)*odx + oy*ody;
1575 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1576 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1577 while (f<1 && iy<iky) {
1578 r = icp->r, g = icp->g, b = icp->b;
1579 o = 1;
1580 r0 += r * f, g0 += g * f, b0 += b * f;
1581 if (1) o0 += o * f;
1582 s0 += f;
1583 f += df;
1584 iy += 1;
1585 if (! cstc) icp += dip;
1586 if (!csto && 0) iop += dip;
1587 }
1588 f -= 1.0;
1589 z = osz + (osx+x)*dzdx + oy*dzdy;
1590 while (iy<iky && ky>0) {
1591 r = icp->r, g = icp->g, b = icp->b;
1592 o = 1;
1593 f1 = (1.0 - f);
1594 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1595 if (1) o0 += o*f1;
1596 s0 += f1;
1597 r1 += r*f, g1 += g*f, b1 += b*f;
1598 if (1) o1 += o*f;
1599 s1 += f;
1600 f += df;
1601 if (f >= 1.0) {
1602 f -= 1.0;
1603 s0 = s0? (float)1.0/s0 : 0.0;
1604 if (!((z>ocp->z)));
1605 else if (1 && !1) {
1606 obar = 1.0 - o0 * s0 * omul;
1607 s0 *= cmul;
1608 ocp->c.r = ocp->c.r*obar + r0*s0;
1609 ocp->c.g = ocp->c.g*obar + g0*s0;
1610 ocp->c.b = ocp->c.b*obar + b0*s0;
1611 } else {
1612 if (1) *oop = o0 * s0 * omul;
1613 s0 *= cmul;
1614 ocp->c.r = r0*s0;
1615 ocp->c.g = g0*s0;
1616 ocp->c.b = b0*s0;
1617 }
1618 r0 = r1, g0 = g1, b0 = b1;
1619 if (1) o0 = o1;
1620 s0 = s1;
1621 r1 = g1 = b1 = s1 = 0;
1622 if (1) o1 = 0;
1623 ocp += dop;
1624 if (1) oop += dop;
1625 z += dz;
1626 ky -= 1;
1627 }
1628 iy += 1;
1629 if (! cstc) icp += dip;
1630 if (!csto && 0) iop += dip;
1631 }
1632 if (ky>0 && f>df) {
1633 s0 = s0? (float)1.0/s0 : 0.0;
1634 if (!((z>ocp->z)));
1635 else if (1 && !1) {
1636 obar = 1.0 - o0 * s0 * omul;
1637 s0 *= cmul;
1638 ocp->c.r = ocp->c.r*obar + r0*s0;
1639 ocp->c.g = ocp->c.g*obar + g0*s0;
1640 ocp->c.b = ocp->c.b*obar + b0*s0;
1641 } else {
1642 if (1) *oop = o0 * s0 * omul;
1643 s0 *= cmul;
1644 ocp->c.r = r0*s0;
1645 ocp->c.g = g0*s0;
1646 ocp->c.b = b0*s0;
1647 }
1648 }
1649 }
1650 };
1651 };
1652 } else {
1653 {if (!(0)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
1654
1655
1656
1657 }
1658 };
1659 } else if (otype==type_big) {
1660 if (clip) {
1661 {
1662 RGBColor *icp;
1663 struct big *ocp;
1664 if (iostart && oostart) {
1665
1666 if (((scale)<0? -(scale) : (scale)) > 1.0) {
1667 {
1668
1669 iscale = 1.0 / scale;
1670 dip = idy;
1671 dop = scale>0? ody : -ody;
1672 dz = scale>0? dzdy : -dzdy;
1673 df = scale>0? iscale : -iscale;
1674
1675 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1676 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1677 if (oy<0) oy = 0;
1678 if (oy>=oky) oy = oky-1;
1679 f = (oy - yy) * iscale;
1680 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
1681 if (iy<0) continue;
1682 if (iy>=iky) continue;
1683 f = f - iy + 1.0;
1684 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
1685 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1686 ky = scale>0? oky-oy : oy+1;
1687 icp = cstc ? (RGBColor *)icstart :
1688 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1689 if (1) iop = csto ? (float *)iostart :
1690 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1691 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
1692 o1 = *iop * omul;
1693 r0 = g0 = b0 = o0 = 0;
1694 z = osz + (osx+x)*dzdx + oy*dzdy;
1695 while (ky>0) {
1696 if (f > 1.0) {
1697 f -= 1.0;
1698 iy += 1;
1699 if (iy>=iky) break;
1700 r0 = r1, g0 = g1, b0 = b1;
1701 if (1) o0 = o1;
1702 if (!cstc) icp += dip;
1703 if (!csto && 1) iop += dip;
1704 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
1705 o1 = *iop * omul;
1706 }
1707 f1 = 1.0 - f;
1708 if (!((z>ocp->z && z<ocp->front)));
1709 else if (1 && !1) {
1710 obar = 1.0 - (o0*f1 + o1*f);
1711 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
1712 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
1713 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
1714 } else {
1715 ocp->c.r = r0*f1 + r1*f;
1716 ocp->c.g = g0*f1 + g1*f;
1717 ocp->c.b = b0*f1 + b1*f;
1718 if (1) *oop = o0*f1 + o1*f;
1719 }
1720 f += df;
1721 ocp += dop;
1722 if (1) oop += dop;
1723 z += dz;
1724 ky -= 1;
1725 }
1726 }
1727 };
1728 } else {
1729 {
1730
1731 iscale = 1.0 / scale;
1732 dip = idy;
1733 dop = scale>0? ody : -ody;
1734 dz = scale>0? dzdy : -dzdy;
1735 df = scale>0? scale : -scale;
1736
1737 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1738 if (scale>0) {
1739 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1740 if (oy<0) oy = 0;
1741 if (oy>=oky) continue;
1742 ky = oky-oy;
1743 y = (oy - 1 - yy) * iscale;
1744 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1745 } else {
1746 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1747 if (oy<0) continue;
1748 if (oy>=oky) oy = oky-1;
1749 ky = oy+1;
1750 y = (oy + 1 - yy) * iscale;
1751 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1752 }
1753 if (iy<0) iy = 0;
1754 if (iy>=iky) continue;
1755 f = scale>0? oy - (yy + (iy * scale))
1756 : (yy + (iy * scale)) - oy;
1757 f = 1 - f;
1758 icp = cstc ? (RGBColor *)icstart :
1759 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1760 if (1) iop = csto ? (float *)iostart :
1761 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1762 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
1763 if (1) oop = oostart + (x+osx)*odx + oy*ody;
1764 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1765 while (f<1 && iy<iky) {
1766 r = icp->r, g = icp->g, b = icp->b;
1767 o = *iop;
1768 r0 += r * f, g0 += g * f, b0 += b * f;
1769 if (1) o0 += o * f;
1770 s0 += f;
1771 f += df;
1772 iy += 1;
1773 if (! cstc) icp += dip;
1774 if (!csto && 1) iop += dip;
1775 }
1776 f -= 1.0;
1777 z = osz + (osx+x)*dzdx + oy*dzdy;
1778 while (iy<iky && ky>0) {
1779 r = icp->r, g = icp->g, b = icp->b;
1780 o = *iop;
1781 f1 = (1.0 - f);
1782 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1783 if (1) o0 += o*f1;
1784 s0 += f1;
1785 r1 += r*f, g1 += g*f, b1 += b*f;
1786 if (1) o1 += o*f;
1787 s1 += f;
1788 f += df;
1789 if (f >= 1.0) {
1790 f -= 1.0;
1791 s0 = s0? (float)1.0/s0 : 0.0;
1792 if (!((z>ocp->z && z<ocp->front)));
1793 else if (1 && !1) {
1794 obar = 1.0 - o0 * s0 * omul;
1795 s0 *= cmul;
1796 ocp->c.r = ocp->c.r*obar + r0*s0;
1797 ocp->c.g = ocp->c.g*obar + g0*s0;
1798 ocp->c.b = ocp->c.b*obar + b0*s0;
1799 } else {
1800 if (1) *oop = o0 * s0 * omul;
1801 s0 *= cmul;
1802 ocp->c.r = r0*s0;
1803 ocp->c.g = g0*s0;
1804 ocp->c.b = b0*s0;
1805 }
1806 r0 = r1, g0 = g1, b0 = b1;
1807 if (1) o0 = o1;
1808 s0 = s1;
1809 r1 = g1 = b1 = s1 = 0;
1810 if (1) o1 = 0;
1811 ocp += dop;
1812 if (1) oop += dop;
1813 z += dz;
1814 ky -= 1;
1815 }
1816 iy += 1;
1817 if (! cstc) icp += dip;
1818 if (!csto && 1) iop += dip;
1819 }
1820 if (ky>0 && f>df) {
1821 s0 = s0? (float)1.0/s0 : 0.0;
1822 if (!((z>ocp->z && z<ocp->front)));
1823 else if (1 && !1) {
1824 obar = 1.0 - o0 * s0 * omul;
1825 s0 *= cmul;
1826 ocp->c.r = ocp->c.r*obar + r0*s0;
1827 ocp->c.g = ocp->c.g*obar + g0*s0;
1828 ocp->c.b = ocp->c.b*obar + b0*s0;
1829 } else {
1830 if (1) *oop = o0 * s0 * omul;
1831 s0 *= cmul;
1832 ocp->c.r = r0*s0;
1833 ocp->c.g = g0*s0;
1834 ocp->c.b = b0*s0;
1835 }
1836 }
1837 }
1838 };
1839 };
1840 } else if (iostart) {
1841
1842 if (((scale)<0? -(scale) : (scale)) > 1.0) {
1843 {
1844
1845 iscale = 1.0 / scale;
1846 dip = idy;
1847 dop = scale>0? ody : -ody;
1848 dz = scale>0? dzdy : -dzdy;
1849 df = scale>0? iscale : -iscale;
1850
1851 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1852 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1853 if (oy<0) oy = 0;
1854 if (oy>=oky) oy = oky-1;
1855 f = (oy - yy) * iscale;
1856 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
1857 if (iy<0) continue;
1858 if (iy>=iky) continue;
1859 f = f - iy + 1.0;
1860 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
1861 if (0) oop = oostart + (x+osx)*odx + oy*ody;
1862 ky = scale>0? oky-oy : oy+1;
1863 icp = cstc ? (RGBColor *)icstart :
1864 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1865 if (1) iop = csto ? (float *)iostart :
1866 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1867 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
1868 o1 = *iop * omul;
1869 r0 = g0 = b0 = o0 = 0;
1870 z = osz + (osx+x)*dzdx + oy*dzdy;
1871 while (ky>0) {
1872 if (f > 1.0) {
1873 f -= 1.0;
1874 iy += 1;
1875 if (iy>=iky) break;
1876 r0 = r1, g0 = g1, b0 = b1;
1877 if (1) o0 = o1;
1878 if (!cstc) icp += dip;
1879 if (!csto && 1) iop += dip;
1880 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
1881 o1 = *iop * omul;
1882 }
1883 f1 = 1.0 - f;
1884 if (!((z>ocp->z && z<ocp->front)));
1885 else if (1 && !0) {
1886 obar = 1.0 - (o0*f1 + o1*f);
1887 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
1888 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
1889 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
1890 } else {
1891 ocp->c.r = r0*f1 + r1*f;
1892 ocp->c.g = g0*f1 + g1*f;
1893 ocp->c.b = b0*f1 + b1*f;
1894 if (0) *oop = o0*f1 + o1*f;
1895 }
1896 f += df;
1897 ocp += dop;
1898 if (0) oop += dop;
1899 z += dz;
1900 ky -= 1;
1901 }
1902 }
1903 };
1904 } else {
1905 {
1906
1907 iscale = 1.0 / scale;
1908 dip = idy;
1909 dop = scale>0? ody : -ody;
1910 dz = scale>0? dzdy : -dzdy;
1911 df = scale>0? scale : -scale;
1912
1913 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
1914 if (scale>0) {
1915 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
1916 if (oy<0) oy = 0;
1917 if (oy>=oky) continue;
1918 ky = oky-oy;
1919 y = (oy - 1 - yy) * iscale;
1920 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1921 } else {
1922 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
1923 if (oy<0) continue;
1924 if (oy>=oky) oy = oky-1;
1925 ky = oy+1;
1926 y = (oy + 1 - yy) * iscale;
1927 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
1928 }
1929 if (iy<0) iy = 0;
1930 if (iy>=iky) continue;
1931 f = scale>0? oy - (yy + (iy * scale))
1932 : (yy + (iy * scale)) - oy;
1933 f = 1 - f;
1934 icp = cstc ? (RGBColor *)icstart :
1935 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
1936 if (1) iop = csto ? (float *)iostart :
1937 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
1938 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
1939 if (0) oop = oostart + (x+osx)*odx + oy*ody;
1940 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
1941 while (f<1 && iy<iky) {
1942 r = icp->r, g = icp->g, b = icp->b;
1943 o = *iop;
1944 r0 += r * f, g0 += g * f, b0 += b * f;
1945 if (1) o0 += o * f;
1946 s0 += f;
1947 f += df;
1948 iy += 1;
1949 if (! cstc) icp += dip;
1950 if (!csto && 1) iop += dip;
1951 }
1952 f -= 1.0;
1953 z = osz + (osx+x)*dzdx + oy*dzdy;
1954 while (iy<iky && ky>0) {
1955 r = icp->r, g = icp->g, b = icp->b;
1956 o = *iop;
1957 f1 = (1.0 - f);
1958 r0 += r*f1, g0 += g*f1, b0 += b*f1;
1959 if (1) o0 += o*f1;
1960 s0 += f1;
1961 r1 += r*f, g1 += g*f, b1 += b*f;
1962 if (1) o1 += o*f;
1963 s1 += f;
1964 f += df;
1965 if (f >= 1.0) {
1966 f -= 1.0;
1967 s0 = s0? (float)1.0/s0 : 0.0;
1968 if (!((z>ocp->z && z<ocp->front)));
1969 else if (1 && !0) {
1970 obar = 1.0 - o0 * s0 * omul;
1971 s0 *= cmul;
1972 ocp->c.r = ocp->c.r*obar + r0*s0;
1973 ocp->c.g = ocp->c.g*obar + g0*s0;
1974 ocp->c.b = ocp->c.b*obar + b0*s0;
1975 } else {
1976 if (0) *oop = o0 * s0 * omul;
1977 s0 *= cmul;
1978 ocp->c.r = r0*s0;
1979 ocp->c.g = g0*s0;
1980 ocp->c.b = b0*s0;
1981 }
1982 r0 = r1, g0 = g1, b0 = b1;
1983 if (1) o0 = o1;
1984 s0 = s1;
1985 r1 = g1 = b1 = s1 = 0;
1986 if (1) o1 = 0;
1987 ocp += dop;
1988 if (0) oop += dop;
1989 z += dz;
1990 ky -= 1;
1991 }
1992 iy += 1;
1993 if (! cstc) icp += dip;
1994 if (!csto && 1) iop += dip;
1995 }
1996 if (ky>0 && f>df) {
1997 s0 = s0? (float)1.0/s0 : 0.0;
1998 if (!((z>ocp->z && z<ocp->front)));
1999 else if (1 && !0) {
2000 obar = 1.0 - o0 * s0 * omul;
2001 s0 *= cmul;
2002 ocp->c.r = ocp->c.r*obar + r0*s0;
2003 ocp->c.g = ocp->c.g*obar + g0*s0;
2004 ocp->c.b = ocp->c.b*obar + b0*s0;
2005 } else {
2006 if (0) *oop = o0 * s0 * omul;
2007 s0 *= cmul;
2008 ocp->c.r = r0*s0;
2009 ocp->c.g = g0*s0;
2010 ocp->c.b = b0*s0;
2011 }
2012 }
2013 }
2014 };
2015 };
2016 } else if (oostart) {
2017
2018 if (((scale)<0? -(scale) : (scale)) > 1.0) {
2019 {
2020
2021 iscale = 1.0 / scale;
2022 dip = idy;
2023 dop = scale>0? ody : -ody;
2024 dz = scale>0? dzdy : -dzdy;
2025 df = scale>0? iscale : -iscale;
2026
2027 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2028 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2029 if (oy<0) oy = 0;
2030 if (oy>=oky) oy = oky-1;
2031 f = (oy - yy) * iscale;
2032 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
2033 if (iy<0) continue;
2034 if (iy>=iky) continue;
2035 f = f - iy + 1.0;
2036 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2037 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2038 ky = scale>0? oky-oy : oy+1;
2039 icp = cstc ? (RGBColor *)icstart :
2040 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2041 if (0) iop = csto ? (float *)iostart :
2042 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2043 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
2044 o1 = 1 * omul;
2045 r0 = g0 = b0 = o0 = 0;
2046 z = osz + (osx+x)*dzdx + oy*dzdy;
2047 while (ky>0) {
2048 if (f > 1.0) {
2049 f -= 1.0;
2050 iy += 1;
2051 if (iy>=iky) break;
2052 r0 = r1, g0 = g1, b0 = b1;
2053 if (1) o0 = o1;
2054 if (!cstc) icp += dip;
2055 if (!csto && 0) iop += dip;
2056 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
2057 o1 = 1 * omul;
2058 }
2059 f1 = 1.0 - f;
2060 if (!((z>ocp->z && z<ocp->front)));
2061 else if (1 && !1) {
2062 obar = 1.0 - (o0*f1 + o1*f);
2063 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
2064 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
2065 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
2066 } else {
2067 ocp->c.r = r0*f1 + r1*f;
2068 ocp->c.g = g0*f1 + g1*f;
2069 ocp->c.b = b0*f1 + b1*f;
2070 if (1) *oop = o0*f1 + o1*f;
2071 }
2072 f += df;
2073 ocp += dop;
2074 if (1) oop += dop;
2075 z += dz;
2076 ky -= 1;
2077 }
2078 }
2079 };
2080 } else {
2081 {
2082
2083 iscale = 1.0 / scale;
2084 dip = idy;
2085 dop = scale>0? ody : -ody;
2086 dz = scale>0? dzdy : -dzdy;
2087 df = scale>0? scale : -scale;
2088
2089 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2090 if (scale>0) {
2091 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
2092 if (oy<0) oy = 0;
2093 if (oy>=oky) continue;
2094 ky = oky-oy;
2095 y = (oy - 1 - yy) * iscale;
2096 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2097 } else {
2098 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2099 if (oy<0) continue;
2100 if (oy>=oky) oy = oky-1;
2101 ky = oy+1;
2102 y = (oy + 1 - yy) * iscale;
2103 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2104 }
2105 if (iy<0) iy = 0;
2106 if (iy>=iky) continue;
2107 f = scale>0? oy - (yy + (iy * scale))
2108 : (yy + (iy * scale)) - oy;
2109 f = 1 - f;
2110 icp = cstc ? (RGBColor *)icstart :
2111 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2112 if (0) iop = csto ? (float *)iostart :
2113 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2114 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2115 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2116 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
2117 while (f<1 && iy<iky) {
2118 r = icp->r, g = icp->g, b = icp->b;
2119 o = 1;
2120 r0 += r * f, g0 += g * f, b0 += b * f;
2121 if (1) o0 += o * f;
2122 s0 += f;
2123 f += df;
2124 iy += 1;
2125 if (! cstc) icp += dip;
2126 if (!csto && 0) iop += dip;
2127 }
2128 f -= 1.0;
2129 z = osz + (osx+x)*dzdx + oy*dzdy;
2130 while (iy<iky && ky>0) {
2131 r = icp->r, g = icp->g, b = icp->b;
2132 o = 1;
2133 f1 = (1.0 - f);
2134 r0 += r*f1, g0 += g*f1, b0 += b*f1;
2135 if (1) o0 += o*f1;
2136 s0 += f1;
2137 r1 += r*f, g1 += g*f, b1 += b*f;
2138 if (1) o1 += o*f;
2139 s1 += f;
2140 f += df;
2141 if (f >= 1.0) {
2142 f -= 1.0;
2143 s0 = s0? (float)1.0/s0 : 0.0;
2144 if (!((z>ocp->z && z<ocp->front)));
2145 else if (1 && !1) {
2146 obar = 1.0 - o0 * s0 * omul;
2147 s0 *= cmul;
2148 ocp->c.r = ocp->c.r*obar + r0*s0;
2149 ocp->c.g = ocp->c.g*obar + g0*s0;
2150 ocp->c.b = ocp->c.b*obar + b0*s0;
2151 } else {
2152 if (1) *oop = o0 * s0 * omul;
2153 s0 *= cmul;
2154 ocp->c.r = r0*s0;
2155 ocp->c.g = g0*s0;
2156 ocp->c.b = b0*s0;
2157 }
2158 r0 = r1, g0 = g1, b0 = b1;
2159 if (1) o0 = o1;
2160 s0 = s1;
2161 r1 = g1 = b1 = s1 = 0;
2162 if (1) o1 = 0;
2163 ocp += dop;
2164 if (1) oop += dop;
2165 z += dz;
2166 ky -= 1;
2167 }
2168 iy += 1;
2169 if (! cstc) icp += dip;
2170 if (!csto && 0) iop += dip;
2171 }
2172 if (ky>0 && f>df) {
2173 s0 = s0? (float)1.0/s0 : 0.0;
2174 if (!((z>ocp->z && z<ocp->front)));
2175 else if (1 && !1) {
2176 obar = 1.0 - o0 * s0 * omul;
2177 s0 *= cmul;
2178 ocp->c.r = ocp->c.r*obar + r0*s0;
2179 ocp->c.g = ocp->c.g*obar + g0*s0;
2180 ocp->c.b = ocp->c.b*obar + b0*s0;
2181 } else {
2182 if (1) *oop = o0 * s0 * omul;
2183 s0 *= cmul;
2184 ocp->c.r = r0*s0;
2185 ocp->c.g = g0*s0;
2186 ocp->c.b = b0*s0;
2187 }
2188 }
2189 }
2190 };
2191 };
2192 } else {
2193 {if (!(0)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
2194
2195
2196
2197 }
2198 };
2199 } else {
2200 {
2201 RGBColor *icp;
2202 struct big *ocp;
2203 if (iostart && oostart) {
2204
2205 if (((scale)<0? -(scale) : (scale)) > 1.0) {
2206 {
2207
2208 iscale = 1.0 / scale;
2209 dip = idy;
2210 dop = scale>0? ody : -ody;
2211 dz = scale>0? dzdy : -dzdy;
2212 df = scale>0? iscale : -iscale;
2213
2214 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2215 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2216 if (oy<0) oy = 0;
2217 if (oy>=oky) oy = oky-1;
2218 f = (oy - yy) * iscale;
2219 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
2220 if (iy<0) continue;
2221 if (iy>=iky) continue;
2222 f = f - iy + 1.0;
2223 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2224 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2225 ky = scale>0? oky-oy : oy+1;
2226 icp = cstc ? (RGBColor *)icstart :
2227 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2228 if (1) iop = csto ? (float *)iostart :
2229 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2230 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
2231 o1 = *iop * omul;
2232 r0 = g0 = b0 = o0 = 0;
2233 z = osz + (osx+x)*dzdx + oy*dzdy;
2234 while (ky>0) {
2235 if (f > 1.0) {
2236 f -= 1.0;
2237 iy += 1;
2238 if (iy>=iky) break;
2239 r0 = r1, g0 = g1, b0 = b1;
2240 if (1) o0 = o1;
2241 if (!cstc) icp += dip;
2242 if (!csto && 1) iop += dip;
2243 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
2244 o1 = *iop * omul;
2245 }
2246 f1 = 1.0 - f;
2247 if (!((z>ocp->z)));
2248 else if (1 && !1) {
2249 obar = 1.0 - (o0*f1 + o1*f);
2250 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
2251 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
2252 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
2253 } else {
2254 ocp->c.r = r0*f1 + r1*f;
2255 ocp->c.g = g0*f1 + g1*f;
2256 ocp->c.b = b0*f1 + b1*f;
2257 if (1) *oop = o0*f1 + o1*f;
2258 }
2259 f += df;
2260 ocp += dop;
2261 if (1) oop += dop;
2262 z += dz;
2263 ky -= 1;
2264 }
2265 }
2266 };
2267 } else {
2268 {
2269
2270 iscale = 1.0 / scale;
2271 dip = idy;
2272 dop = scale>0? ody : -ody;
2273 dz = scale>0? dzdy : -dzdy;
2274 df = scale>0? scale : -scale;
2275
2276 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2277 if (scale>0) {
2278 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
2279 if (oy<0) oy = 0;
2280 if (oy>=oky) continue;
2281 ky = oky-oy;
2282 y = (oy - 1 - yy) * iscale;
2283 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2284 } else {
2285 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2286 if (oy<0) continue;
2287 if (oy>=oky) oy = oky-1;
2288 ky = oy+1;
2289 y = (oy + 1 - yy) * iscale;
2290 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2291 }
2292 if (iy<0) iy = 0;
2293 if (iy>=iky) continue;
2294 f = scale>0? oy - (yy + (iy * scale))
2295 : (yy + (iy * scale)) - oy;
2296 f = 1 - f;
2297 icp = cstc ? (RGBColor *)icstart :
2298 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2299 if (1) iop = csto ? (float *)iostart :
2300 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2301 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2302 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2303 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
2304 while (f<1 && iy<iky) {
2305 r = icp->r, g = icp->g, b = icp->b;
2306 o = *iop;
2307 r0 += r * f, g0 += g * f, b0 += b * f;
2308 if (1) o0 += o * f;
2309 s0 += f;
2310 f += df;
2311 iy += 1;
2312 if (! cstc) icp += dip;
2313 if (!csto && 1) iop += dip;
2314 }
2315 f -= 1.0;
2316 z = osz + (osx+x)*dzdx + oy*dzdy;
2317 while (iy<iky && ky>0) {
2318 r = icp->r, g = icp->g, b = icp->b;
2319 o = *iop;
2320 f1 = (1.0 - f);
2321 r0 += r*f1, g0 += g*f1, b0 += b*f1;
2322 if (1) o0 += o*f1;
2323 s0 += f1;
2324 r1 += r*f, g1 += g*f, b1 += b*f;
2325 if (1) o1 += o*f;
2326 s1 += f;
2327 f += df;
2328 if (f >= 1.0) {
2329 f -= 1.0;
2330 s0 = s0? (float)1.0/s0 : 0.0;
2331 if (!((z>ocp->z)));
2332 else if (1 && !1) {
2333 obar = 1.0 - o0 * s0 * omul;
2334 s0 *= cmul;
2335 ocp->c.r = ocp->c.r*obar + r0*s0;
2336 ocp->c.g = ocp->c.g*obar + g0*s0;
2337 ocp->c.b = ocp->c.b*obar + b0*s0;
2338 } else {
2339 if (1) *oop = o0 * s0 * omul;
2340 s0 *= cmul;
2341 ocp->c.r = r0*s0;
2342 ocp->c.g = g0*s0;
2343 ocp->c.b = b0*s0;
2344 }
2345 r0 = r1, g0 = g1, b0 = b1;
2346 if (1) o0 = o1;
2347 s0 = s1;
2348 r1 = g1 = b1 = s1 = 0;
2349 if (1) o1 = 0;
2350 ocp += dop;
2351 if (1) oop += dop;
2352 z += dz;
2353 ky -= 1;
2354 }
2355 iy += 1;
2356 if (! cstc) icp += dip;
2357 if (!csto && 1) iop += dip;
2358 }
2359 if (ky>0 && f>df) {
2360 s0 = s0? (float)1.0/s0 : 0.0;
2361 if (!((z>ocp->z)));
2362 else if (1 && !1) {
2363 obar = 1.0 - o0 * s0 * omul;
2364 s0 *= cmul;
2365 ocp->c.r = ocp->c.r*obar + r0*s0;
2366 ocp->c.g = ocp->c.g*obar + g0*s0;
2367 ocp->c.b = ocp->c.b*obar + b0*s0;
2368 } else {
2369 if (1) *oop = o0 * s0 * omul;
2370 s0 *= cmul;
2371 ocp->c.r = r0*s0;
2372 ocp->c.g = g0*s0;
2373 ocp->c.b = b0*s0;
2374 }
2375 }
2376 }
2377 };
2378 };
2379 } else if (iostart) {
2380
2381 if (((scale)<0? -(scale) : (scale)) > 1.0) {
2382 {
2383
2384 iscale = 1.0 / scale;
2385 dip = idy;
2386 dop = scale>0? ody : -ody;
2387 dz = scale>0? dzdy : -dzdy;
2388 df = scale>0? iscale : -iscale;
2389
2390 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2391 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2392 if (oy<0) oy = 0;
2393 if (oy>=oky) oy = oky-1;
2394 f = (oy - yy) * iscale;
2395 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
2396 if (iy<0) continue;
2397 if (iy>=iky) continue;
2398 f = f - iy + 1.0;
2399 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2400 if (0) oop = oostart + (x+osx)*odx + oy*ody;
2401 ky = scale>0? oky-oy : oy+1;
2402 icp = cstc ? (RGBColor *)icstart :
2403 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2404 if (1) iop = csto ? (float *)iostart :
2405 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2406 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
2407 o1 = *iop * omul;
2408 r0 = g0 = b0 = o0 = 0;
2409 z = osz + (osx+x)*dzdx + oy*dzdy;
2410 while (ky>0) {
2411 if (f > 1.0) {
2412 f -= 1.0;
2413 iy += 1;
2414 if (iy>=iky) break;
2415 r0 = r1, g0 = g1, b0 = b1;
2416 if (1) o0 = o1;
2417 if (!cstc) icp += dip;
2418 if (!csto && 1) iop += dip;
2419 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
2420 o1 = *iop * omul;
2421 }
2422 f1 = 1.0 - f;
2423 if (!((z>ocp->z)));
2424 else if (1 && !0) {
2425 obar = 1.0 - (o0*f1 + o1*f);
2426 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
2427 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
2428 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
2429 } else {
2430 ocp->c.r = r0*f1 + r1*f;
2431 ocp->c.g = g0*f1 + g1*f;
2432 ocp->c.b = b0*f1 + b1*f;
2433 if (0) *oop = o0*f1 + o1*f;
2434 }
2435 f += df;
2436 ocp += dop;
2437 if (0) oop += dop;
2438 z += dz;
2439 ky -= 1;
2440 }
2441 }
2442 };
2443 } else {
2444 {
2445
2446 iscale = 1.0 / scale;
2447 dip = idy;
2448 dop = scale>0? ody : -ody;
2449 dz = scale>0? dzdy : -dzdy;
2450 df = scale>0? scale : -scale;
2451
2452 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2453 if (scale>0) {
2454 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
2455 if (oy<0) oy = 0;
2456 if (oy>=oky) continue;
2457 ky = oky-oy;
2458 y = (oy - 1 - yy) * iscale;
2459 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2460 } else {
2461 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2462 if (oy<0) continue;
2463 if (oy>=oky) oy = oky-1;
2464 ky = oy+1;
2465 y = (oy + 1 - yy) * iscale;
2466 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2467 }
2468 if (iy<0) iy = 0;
2469 if (iy>=iky) continue;
2470 f = scale>0? oy - (yy + (iy * scale))
2471 : (yy + (iy * scale)) - oy;
2472 f = 1 - f;
2473 icp = cstc ? (RGBColor *)icstart :
2474 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2475 if (1) iop = csto ? (float *)iostart :
2476 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2477 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2478 if (0) oop = oostart + (x+osx)*odx + oy*ody;
2479 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
2480 while (f<1 && iy<iky) {
2481 r = icp->r, g = icp->g, b = icp->b;
2482 o = *iop;
2483 r0 += r * f, g0 += g * f, b0 += b * f;
2484 if (1) o0 += o * f;
2485 s0 += f;
2486 f += df;
2487 iy += 1;
2488 if (! cstc) icp += dip;
2489 if (!csto && 1) iop += dip;
2490 }
2491 f -= 1.0;
2492 z = osz + (osx+x)*dzdx + oy*dzdy;
2493 while (iy<iky && ky>0) {
2494 r = icp->r, g = icp->g, b = icp->b;
2495 o = *iop;
2496 f1 = (1.0 - f);
2497 r0 += r*f1, g0 += g*f1, b0 += b*f1;
2498 if (1) o0 += o*f1;
2499 s0 += f1;
2500 r1 += r*f, g1 += g*f, b1 += b*f;
2501 if (1) o1 += o*f;
2502 s1 += f;
2503 f += df;
2504 if (f >= 1.0) {
2505 f -= 1.0;
2506 s0 = s0? (float)1.0/s0 : 0.0;
2507 if (!((z>ocp->z)));
2508 else if (1 && !0) {
2509 obar = 1.0 - o0 * s0 * omul;
2510 s0 *= cmul;
2511 ocp->c.r = ocp->c.r*obar + r0*s0;
2512 ocp->c.g = ocp->c.g*obar + g0*s0;
2513 ocp->c.b = ocp->c.b*obar + b0*s0;
2514 } else {
2515 if (0) *oop = o0 * s0 * omul;
2516 s0 *= cmul;
2517 ocp->c.r = r0*s0;
2518 ocp->c.g = g0*s0;
2519 ocp->c.b = b0*s0;
2520 }
2521 r0 = r1, g0 = g1, b0 = b1;
2522 if (1) o0 = o1;
2523 s0 = s1;
2524 r1 = g1 = b1 = s1 = 0;
2525 if (1) o1 = 0;
2526 ocp += dop;
2527 if (0) oop += dop;
2528 z += dz;
2529 ky -= 1;
2530 }
2531 iy += 1;
2532 if (! cstc) icp += dip;
2533 if (!csto && 1) iop += dip;
2534 }
2535 if (ky>0 && f>df) {
2536 s0 = s0? (float)1.0/s0 : 0.0;
2537 if (!((z>ocp->z)));
2538 else if (1 && !0) {
2539 obar = 1.0 - o0 * s0 * omul;
2540 s0 *= cmul;
2541 ocp->c.r = ocp->c.r*obar + r0*s0;
2542 ocp->c.g = ocp->c.g*obar + g0*s0;
2543 ocp->c.b = ocp->c.b*obar + b0*s0;
2544 } else {
2545 if (0) *oop = o0 * s0 * omul;
2546 s0 *= cmul;
2547 ocp->c.r = r0*s0;
2548 ocp->c.g = g0*s0;
2549 ocp->c.b = b0*s0;
2550 }
2551 }
2552 }
2553 };
2554 };
2555 } else if (oostart) {
2556
2557 if (((scale)<0? -(scale) : (scale)) > 1.0) {
2558 {
2559
2560 iscale = 1.0 / scale;
2561 dip = idy;
2562 dop = scale>0? ody : -ody;
2563 dz = scale>0? dzdy : -dzdy;
2564 df = scale>0? iscale : -iscale;
2565
2566 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2567 oy = scale>0? ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1) : ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2568 if (oy<0) oy = 0;
2569 if (oy>=oky) oy = oky-1;
2570 f = (oy - yy) * iscale;
2571 iy = ((f)>=0 || (int)(f)==f? (int)(f) : (int)(f)-1);
2572 if (iy<0) continue;
2573 if (iy>=iky) continue;
2574 f = f - iy + 1.0;
2575 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2576 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2577 ky = scale>0? oky-oy : oy+1;
2578 icp = cstc ? (RGBColor *)icstart :
2579 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2580 if (0) iop = csto ? (float *)iostart :
2581 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2582 r1 = icp->r * cmul, g1 = icp->g * cmul, b1 = icp->b * cmul;
2583 o1 = 1 * omul;
2584 r0 = g0 = b0 = o0 = 0;
2585 z = osz + (osx+x)*dzdx + oy*dzdy;
2586 while (ky>0) {
2587 if (f > 1.0) {
2588 f -= 1.0;
2589 iy += 1;
2590 if (iy>=iky) break;
2591 r0 = r1, g0 = g1, b0 = b1;
2592 if (1) o0 = o1;
2593 if (!cstc) icp += dip;
2594 if (!csto && 0) iop += dip;
2595 r1 = icp->r*cmul, g1 = icp->g*cmul, b1 = icp->b*cmul;
2596 o1 = 1 * omul;
2597 }
2598 f1 = 1.0 - f;
2599 if (!((z>ocp->z)));
2600 else if (1 && !1) {
2601 obar = 1.0 - (o0*f1 + o1*f);
2602 ocp->c.r = ocp->c.r*obar + r0*f1 + r1*f;
2603 ocp->c.g = ocp->c.g*obar + g0*f1 + g1*f;
2604 ocp->c.b = ocp->c.b*obar + b0*f1 + b1*f;
2605 } else {
2606 ocp->c.r = r0*f1 + r1*f;
2607 ocp->c.g = g0*f1 + g1*f;
2608 ocp->c.b = b0*f1 + b1*f;
2609 if (1) *oop = o0*f1 + o1*f;
2610 }
2611 f += df;
2612 ocp += dop;
2613 if (1) oop += dop;
2614 z += dz;
2615 ky -= 1;
2616 }
2617 }
2618 };
2619 } else {
2620 {
2621
2622 iscale = 1.0 / scale;
2623 dip = idy;
2624 dop = scale>0? ody : -ody;
2625 dz = scale>0? dzdy : -dzdy;
2626 df = scale>0? scale : -scale;
2627
2628 for (x=0, yy=osy; x<ikx; x++, yy+=skew) {
2629 if (scale>0) {
2630 oy = ((yy)<=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)+1);
2631 if (oy<0) oy = 0;
2632 if (oy>=oky) continue;
2633 ky = oky-oy;
2634 y = (oy - 1 - yy) * iscale;
2635 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2636 } else {
2637 oy = ((yy)>=0 || (int)(yy)==yy? (int)(yy) : (int)(yy)-1);
2638 if (oy<0) continue;
2639 if (oy>=oky) oy = oky-1;
2640 ky = oy+1;
2641 y = (oy + 1 - yy) * iscale;
2642 iy = ((y)<=0 || (int)(y)==y? (int)(y) : (int)(y)+1);
2643 }
2644 if (iy<0) iy = 0;
2645 if (iy>=iky) continue;
2646 f = scale>0? oy - (yy + (iy * scale))
2647 : (yy + (iy * scale)) - oy;
2648 f = 1 - f;
2649 icp = cstc ? (RGBColor *)icstart :
2650 (RGBColor *)icstart + (x+isx)*idx + (iy+isy)*idy;
2651 if (0) iop = csto ? (float *)iostart :
2652 (float *)iostart + (x+isx)*idx + (iy+isy)*idy;
2653 ocp = (struct big *)ocstart + (x+osx)*odx + oy*ody;
2654 if (1) oop = oostart + (x+osx)*odx + oy*ody;
2655 r0 = r1 = g0 = g1 = b0 = b1 = o0 = o1 = s0 = s1 = 0;
2656 while (f<1 && iy<iky) {
2657 r = icp->r, g = icp->g, b = icp->b;
2658 o = 1;
2659 r0 += r * f, g0 += g * f, b0 += b * f;
2660 if (1) o0 += o * f;
2661 s0 += f;
2662 f += df;
2663 iy += 1;
2664 if (! cstc) icp += dip;
2665 if (!csto && 0) iop += dip;
2666 }
2667 f -= 1.0;
2668 z = osz + (osx+x)*dzdx + oy*dzdy;
2669 while (iy<iky && ky>0) {
2670 r = icp->r, g = icp->g, b = icp->b;
2671 o = 1;
2672 f1 = (1.0 - f);
2673 r0 += r*f1, g0 += g*f1, b0 += b*f1;
2674 if (1) o0 += o*f1;
2675 s0 += f1;
2676 r1 += r*f, g1 += g*f, b1 += b*f;
2677 if (1) o1 += o*f;
2678 s1 += f;
2679 f += df;
2680 if (f >= 1.0) {
2681 f -= 1.0;
2682 s0 = s0? (float)1.0/s0 : 0.0;
2683 if (!((z>ocp->z)));
2684 else if (1 && !1) {
2685 obar = 1.0 - o0 * s0 * omul;
2686 s0 *= cmul;
2687 ocp->c.r = ocp->c.r*obar + r0*s0;
2688 ocp->c.g = ocp->c.g*obar + g0*s0;
2689 ocp->c.b = ocp->c.b*obar + b0*s0;
2690 } else {
2691 if (1) *oop = o0 * s0 * omul;
2692 s0 *= cmul;
2693 ocp->c.r = r0*s0;
2694 ocp->c.g = g0*s0;
2695 ocp->c.b = b0*s0;
2696 }
2697 r0 = r1, g0 = g1, b0 = b1;
2698 if (1) o0 = o1;
2699 s0 = s1;
2700 r1 = g1 = b1 = s1 = 0;
2701 if (1) o1 = 0;
2702 ocp += dop;
2703 if (1) oop += dop;
2704 z += dz;
2705 ky -= 1;
2706 }
2707 iy += 1;
2708 if (! cstc) icp += dip;
2709 if (!csto && 0) iop += dip;
2710 }
2711 if (ky>0 && f>df) {
2712 s0 = s0? (float)1.0/s0 : 0.0;
2713 if (!((z>ocp->z)));
2714 else if (1 && !1) {
2715 obar = 1.0 - o0 * s0 * omul;
2716 s0 *= cmul;
2717 ocp->c.r = ocp->c.r*obar + r0*s0;
2718 ocp->c.g = ocp->c.g*obar + g0*s0;
2719 ocp->c.b = ocp->c.b*obar + b0*s0;
2720 } else {
2721 if (1) *oop = o0 * s0 * omul;
2722 s0 *= cmul;
2723 ocp->c.r = r0*s0;
2724 ocp->c.g = g0*s0;
2725 ocp->c.b = b0*s0;
2726 }
2727 }
2728 }
2729 };
2730 };
2731 } else {
2732 {if (!(0)) DXErrorReturn(ERROR_ASSERTION, "assertion failure")};
2733
2734
2735
2736 }
2737 };
2738 }
2739 }
2740 return OK;
2741 }
2742 static Error
plane(Pointer ic,char cstc,RGBColor * cmap,Pointer io,char csto,float * omap,float cmul,float omul,int idx,int idy,int inx,int iny,float ux,float uy,float uz,float vx,float vy,float vz,Pointer oc,enum type otype,int onx,int ony,float osx,float osy,float osz,int clip)2743 plane(Pointer ic,
2744 char cstc,
2745 RGBColor *cmap,
2746 Pointer io,
2747 char csto,
2748 float *omap,
2749 float cmul, float omul,
2750 int idx, int idy, int inx, int iny,
2751 float ux, float uy, float uz, float vx, float vy, float vz,
2752 Pointer oc, enum type otype,
2753 int onx, int ony, float osx, float osy, float osz, int clip
2754 ) {
2755 float x, y, minx, miny, maxx, maxy, A, dzdx, dzdy;
2756 int isx, isy, ikx, iky;
2757 float scale1=0, skew1=0, scale2=0, skew2=0, osy1, osy2, best, extra;
2758 int ti1=0, to1, ti2, to2=0, contrary=0, osx2;
2759 int nx1, ny1, nk, nc;
2760 RGBColor *ic1=NULL;
2761 float *io1=NULL;
2762 Error rc;
2763 A = ux * vy - uy * vx;
2764 best = 0;
2765 if (((ux)<0? -(ux) : (ux))>best) ti1=1, scale1=ux, skew1=vx, scale2=A/ux, skew2=uy/ux, to2=0, best=((ux)<0? -(ux) : (ux));
2766 if (((uy)<0? -(uy) : (uy))>best) ti1=1, scale1=uy, skew1=vy, scale2=-A/uy, skew2=ux/uy, to2=1, best=((uy)<0? -(uy) : (uy));
2767 if (((vx)<0? -(vx) : (vx))>best) ti1=0, scale1=vx, skew1=ux, scale2=-A/vx, skew2=vy/vx, to2=0, best=((vx)<0? -(vx) : (vx));
2768 if (((vy)<0? -(vy) : (vy))>best) ti1=0, scale1=vy, skew1=uy, scale2=A/vy, skew2=vx/vy, to2=1, best=((vy)<0? -(vy) : (vy));
2769 if (scale1==0 || scale2==0)
2770 return OK;
2771 dzdx = (vy*uz - uy*vz) / A;
2772 dzdy = (ux*vz - vx*uz) / A;
2773 osz -= osx*dzdx + osy*dzdy;
2774 minx = miny = DXD_MAX_FLOAT;
2775 maxx = maxy = -DXD_MAX_FLOAT;
2776 x = ( (-osx)*vy - (-osy)*vx) / A; y = (- (-osx)*uy + (-osy)*ux) / A; if (x<minx) minx = x; if (x>maxx) maxx = x; if (y<miny) miny = y; if (y>maxy) maxy = y;;
2777 x = ( (-osx+onx)*vy - (-osy)*vx) / A; y = (- (-osx+onx)*uy + (-osy)*ux) / A; if (x<minx) minx = x; if (x>maxx) maxx = x; if (y<miny) miny = y; if (y>maxy) maxy = y;;
2778 x = ( (-osx)*vy - (-osy+ony-1)*vx) / A; y = (- (-osx)*uy + (-osy+ony-1)*ux) / A; if (x<minx) minx = x; if (x>maxx) maxx = x; if (y<miny) miny = y; if (y>maxy) maxy = y;;
2779 x = ( (-osx+onx)*vy - (-osy+ony-1)*vx) / A; y = (- (-osx+onx)*uy + (-osy+ony-1)*ux) / A; if (x<minx) minx = x; if (x>maxx) maxx = x; if (y<miny) miny = y; if (y>maxy) maxy = y;;
2780 extra = 1.0 / ((((scale1)<0? -(scale1) : (scale1)))<(((scale2)<0? -(scale2) : (scale2)))? (((scale1)<0? -(scale1) : (scale1))) : (((scale2)<0? -(scale2) : (scale2))));
2781 minx-=extra; maxx+=extra;
2782 miny-=extra; maxy+=extra;
2783 if (minx<0) minx = 0; else if (minx>inx-1) minx = inx-1;
2784 if (maxx<0) maxx = 0; else if (maxx>inx-1) maxx = inx-1;
2785 if (miny<0) miny = 0; else if (miny>iny-1) miny = iny-1;
2786 if (maxy<0) maxy = 0; else if (maxy>iny-1) maxy = iny-1;
2787 isx = ((minx)>=0 || (int)(minx)==minx? (int)(minx) : (int)(minx)-1);
2788 ikx = ((maxx)<=0 || (int)(maxx)==maxx? (int)(maxx) : (int)(maxx)+1) - isx + 1;
2789 isy = ((miny)>=0 || (int)(miny)==miny? (int)(miny) : (int)(miny)-1);
2790 iky = ((maxy)<=0 || (int)(maxy)==maxy? (int)(maxy) : (int)(maxy)+1) - isy + 1;
2791 if (ikx==0 || iky==0) return OK;
2792 osx += isx * ux + isy * vx;
2793 osy += isx * uy + isy * vy;
2794 if (contrary) to1=1, ti2=0;
2795 else to1=0, ti2=1;
2796 if (to2) {float t=osx; osx=osy; osy=t;};
2797 if (ti1) {int t=ikx; ikx=iky; iky=t;};
2798 nx1 = ikx;
2799 nk = ((((skew1)<0? -(skew1) : (skew1))*ikx)<=0 || (int)(((skew1)<0? -(skew1) : (skew1))*ikx)==((skew1)<0? -(skew1) : (skew1))*ikx? (int)(((skew1)<0? -(skew1) : (skew1))*ikx) : (int)(((skew1)<0? -(skew1) : (skew1))*ikx)+1);
2800 nc = ((((scale1)<0? -(scale1) : (scale1))*iky)<=0 || (int)(((scale1)<0? -(scale1) : (scale1))*iky)==((scale1)<0? -(scale1) : (scale1))*iky? (int)(((scale1)<0? -(scale1) : (scale1))*iky) : (int)(((scale1)<0? -(scale1) : (scale1))*iky)+1);
2801 ny1 = nk + nc + 1;
2802 osx2 = ((osx)>=0 || (int)(osx)==osx? (int)(osx) : (int)(osx)-1);
2803 osy1 = osx - osx2;
2804 if (scale1<0) osy1+=nc, osx2-=nc;
2805 if (skew1<0) osy1+=nk, osx2-=nk;
2806 if (ti1) {int t=ikx; ikx=iky; iky=t;};
2807 if (to1) {int t=nx1; nx1=ny1; ny1=t;};
2808 osy2 = osy - skew2 * osy1;
2809 ic1 = (RGBColor *) DXAllocateLocalZero(nx1 * ny1 * sizeof(*ic1));
2810 io1 = (float *) DXAllocateLocalZero(nx1 * ny1 * sizeof(*io1));
2811 if (!ic1 || !io1)
2812 return ERROR;
2813 DXMarkTimeLocal("overhead");
2814 rc = shear(ic, cstc, cmap,
2815 io, csto, omap,
2816 1.0,1.0,
2817 idx,idy,isx,isy,ikx,iky,
2818 0,0,0,0,
2819 (Pointer)ic1,type_colors,io1,
2820 0,osy1,nx1,ny1,
2821 ti1,scale1,skew1,to1);
2822 if (!rc) goto error;
2823 DXMarkTimeLocal("shear 1");
2824 rc = shear((Pointer)ic1, 0, NULL,
2825 (Pointer)io1, 0, NULL,
2826 cmul,omul,
2827 1,nx1,0,0,nx1,ny1,
2828 osz,dzdx,dzdy,clip,
2829 oc,otype,NULL,
2830 osx2,osy2,onx,ony,
2831 ti2,scale2,skew2,to2);
2832 if (!rc) goto error;
2833 DXMarkTimeLocal("shear 2");
2834 DXFree((Pointer)ic1);
2835 DXFree((Pointer)io1);
2836 return OK;
2837 error:
2838 DXFree((Pointer)ic1);
2839 DXFree((Pointer)io1);
2840 return ERROR;
2841 }
2842 Error
_dxf_CompositePlane(struct buffer * b,float osx,float osy,float osz,int clip,float ux,float uy,float uz,float vx,float vy,float vz,Pointer ic,char cstc,RGBColor * cmap,Pointer io,char csto,float * omap,float cmul,float omul,int idx,int idy,int inx,int iny)2843 _dxf_CompositePlane(struct buffer *b, float osx, float osy, float osz,
2844 int clip,
2845 float ux, float uy, float uz, float vx, float vy, float vz,
2846 Pointer ic, char cstc, RGBColor *cmap,
2847 Pointer io, char csto, float *omap,
2848 float cmul, float omul,
2849 int idx, int idy, int inx, int iny
2850 ) {
2851 return plane(ic, cstc, cmap, io, csto, omap, cmul, omul,
2852 idx, idy, inx, iny,
2853 ux, uy, uz, vx, vy, vz,
2854 (Pointer)b->u.big,
2855 b->pix_type==pix_fast? type_fast : type_big,
2856 b->width, b->height, osx, osy, osz, clip);
2857 }
2858