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