4 /* this mess is jeong's */
6 typedef struct pdf_tensorpatch_s pdf_tensorpatch
;
7 struct pdf_tensorpatch_s
{
9 float color
[4][FZ_MAXCOLORS
];
13 pdf_loadtype4shade(fz_shade
*shade
, pdf_xref
*xref
, fz_obj
*shading
, fz_obj
*ref
)
22 float c0
[FZ_MAXCOLORS
];
23 float c1
[FZ_MAXCOLORS
];
39 bpcoord
= fz_toint(fz_dictgets(shading
, "BitsPerCoordinate"));
40 bpcomp
= fz_toint(fz_dictgets(shading
, "BitsPerComponent"));
41 bpflag
= fz_toint(fz_dictgets(shading
, "BitsPerFlag"));
43 obj
= fz_dictgets(shading
, "Decode");
46 pdf_logshade("decode array\n");
47 x0
= fz_toreal(fz_arrayget(obj
, 0));
48 x1
= fz_toreal(fz_arrayget(obj
, 1));
49 y0
= fz_toreal(fz_arrayget(obj
, 2));
50 y1
= fz_toreal(fz_arrayget(obj
, 3));
51 for (i
=0; i
< fz_arraylen(obj
) / 2; ++i
) {
52 c0
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+4));
53 c1
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+5));
57 error
= fz_throw("syntaxerror: No Decode key in Type 4 Shade");
61 obj
= fz_dictgets(shading
, "Function");
64 pdf_loadshadefunction(shade
, xref
, shading
, c0
[0], c1
[0]);
67 bitspervertex
= bpflag
+ bpcoord
* 2 + bpcomp
* ncomp
;
68 bytepervertex
= (bitspervertex
+7) / 8;
70 error
= pdf_loadstream(&buf
, xref
, fz_tonum(ref
), fz_togen(ref
));
71 if (error
) goto cleanup
;
73 shade
->usefunction
= 0;
78 for (z
= 0; z
< (buf
->ep
- buf
->bp
) / bytepervertex
; ++z
)
83 t
= (t
<< 8) + *buf
->rp
++;
84 t
= (t
<< 8) + *buf
->rp
++;
85 x
= x0
+ (t
* (x1
- x0
) / (pow(2, 24) - 1));
88 t
= (t
<< 8) + *buf
->rp
++;
89 t
= (t
<< 8) + *buf
->rp
++;
90 y
= y0
+ (t
* (y1
- y0
) / (pow(2, 24) - 1));
92 for (i
=0; i
< ncomp
; ++i
) {
94 t
= (t
<< 8) + *buf
->rp
++;
100 if (flag
== 1 || flag
== 2) {
106 shade
->mesh
= (float*) malloc(sizeof(float) * j
);
109 for (z
= 0; z
< (buf
->ep
- buf
->bp
) / bytepervertex
; ++z
)
114 t
= (t
<< 8) + *buf
->rp
++;
115 t
= (t
<< 8) + *buf
->rp
++;
116 x
= x0
+ (t
* (x1
- x0
) / (pow(2, 24) - 1));
119 t
= (t
<< 8) + *buf
->rp
++;
120 t
= (t
<< 8) + *buf
->rp
++;
121 y
= y0
+ (t
* (y1
- y0
) / (pow(2, 24) - 1));
123 for (i
=0; i
< ncomp
; ++i
) {
125 t
= (t
<< 8) + *buf
->rp
++;
126 cval
[i
] = t
/ (double)(pow(2, 16) - 1);
130 shade
->mesh
[j
++] = x
;
131 shade
->mesh
[j
++] = y
;
132 for (i
=0; i
< ncomp
; ++i
) {
133 shade
->mesh
[j
++] = cval
[i
];
137 memcpy(&(shade
->mesh
[j
]), &(shade
->mesh
[j
- 2 * n
]), n
* sizeof(float));
138 memcpy(&(shade
->mesh
[j
+ 1 * n
]), &(shade
->mesh
[j
- 1 * n
]), n
* sizeof(float));
140 shade
->mesh
[j
++] = x
;
141 shade
->mesh
[j
++] = y
;
142 for (i
=0; i
< ncomp
; ++i
) {
143 shade
->mesh
[j
++] = cval
[i
];
147 memcpy(&(shade
->mesh
[j
]), &(shade
->mesh
[j
- 3 * n
]), n
* sizeof(float));
148 memcpy(&(shade
->mesh
[j
+ 1 * n
]), &(shade
->mesh
[j
- 1 * n
]), n
* sizeof(float));
150 shade
->mesh
[j
++] = x
;
151 shade
->mesh
[j
++] = y
;
152 for (i
=0; i
< ncomp
; ++i
) {
153 shade
->mesh
[j
++] = cval
[i
];
157 shade
->meshlen
= j
/ n
/ 3;
167 getdata(fz_stream
*stream
, int bps
)
169 unsigned int bitmask
= (1 << bps
) - 1;
170 unsigned int buf
= 0;
176 buf
= (buf
<< 8) | (fz_readbyte(stream
) & 0xff);
179 s
= buf
>> (bits
- bps
);
188 pdf_loadtype5shade(fz_shade
*shade
, pdf_xref
*xref
, fz_obj
*shading
, fz_obj
*ref
)
199 float x0
, x1
, y0
, y1
;
201 float c0
[FZ_MAXCOLORS
];
202 float c1
[FZ_MAXCOLORS
];
208 float *x
, *y
, *c
[FZ_MAXCOLORS
];
212 ncomp
= shade
->cs
->n
;
213 bpcoord
= fz_toint(fz_dictgets(shading
, "BitsPerCoordinate"));
214 bpcomp
= fz_toint(fz_dictgets(shading
, "BitsPerComponent"));
215 vpr
= fz_toint(fz_dictgets(shading
, "VerticesPerRow"));
217 error
= fz_throw("VerticesPerRow must be greater than or equal to 2");
221 obj
= fz_dictgets(shading
, "Decode");
224 pdf_logshade("decode array\n");
225 x0
= fz_toreal(fz_arrayget(obj
, 0));
226 x1
= fz_toreal(fz_arrayget(obj
, 1));
227 y0
= fz_toreal(fz_arrayget(obj
, 2));
228 y1
= fz_toreal(fz_arrayget(obj
, 3));
229 for (i
=0; i
< fz_arraylen(obj
) / 2; ++i
) {
230 c0
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+4));
231 c1
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+5));
235 error
= fz_throw("syntaxerror: No Decode key in Type 4 Shade");
239 obj
= fz_dictgets(shading
, "Function");
242 pdf_loadshadefunction(shade
, xref
, shading
, c0
[0], c1
[0]);
243 shade
->usefunction
= 1;
246 shade
->usefunction
= 0;
248 n
= 2 + shade
->cs
->n
;
253 x
= fz_malloc(sizeof(float) * vpr
* BIGNUM
);
254 y
= fz_malloc(sizeof(float) * vpr
* BIGNUM
);
255 for (i
= 0; i
< ncomp
; ++i
) {
256 c
[i
] = fz_malloc(sizeof(float) * vpr
* BIGNUM
);
260 error
= pdf_openstream(&stream
, xref
, fz_tonum(ref
), fz_togen(ref
));
261 if (error
) goto cleanup
;
263 while (fz_peekbyte(stream
) != EOF
)
265 for (p
= 0; p
< vpr
; ++p
) {
269 t
= getdata(stream
, bpcoord
);
270 x
[idx
] = x0
+ (t
* (x1
- x0
) / ((float)pow(2, bpcoord
) - 1));
271 t
= getdata(stream
, bpcoord
);
272 y
[idx
] = y0
+ (t
* (y1
- y0
) / ((float)pow(2, bpcoord
) - 1));
274 for (i
=0; i
< ncomp
; ++i
) {
275 t
= getdata(stream
, bpcomp
);
276 c
[i
][idx
] = c0
[i
] + (t
* (c1
[i
] - c0
[i
]) / (float)(pow(2, bpcomp
) - 1));
282 fz_dropstream(stream
);
284 #define ADD_VERTEX(idx) \
287 shade->mesh[j++] = x[idx];\
288 shade->mesh[j++] = y[idx];\
289 for (z = 0; z < shade->cs->n; ++z) {\
290 shade->mesh[j++] = c[z][idx];\
297 shade
->mesh
= fz_malloc(sizeof(float) * 1024);
304 for (p
= 0; p
< vpr
-1; ++p
) {
305 for (q
= 0; q
< vpc
-1; ++q
) {
306 ADD_VERTEX(q
* vpr
+ p
);
307 ADD_VERTEX(q
* vpr
+ p
+ 1);
308 ADD_VERTEX((q
+ 1) * vpr
+ p
+ 1);
310 ADD_VERTEX(q
* vpr
+ p
);
311 ADD_VERTEX((q
+ 1) * vpr
+ p
+ 1);
312 ADD_VERTEX((q
+ 1) * vpr
+ p
);
316 shade
->meshlen
= j
/ n
/ 3;
320 for (i
= 0; i
< ncomp
; ++i
) {
330 #define SEGMENTATION_DEPTH 2
332 static inline void copyvert(float *dst
, float *src
, int n
)
339 static inline void copycolor(float *c
, const float *s
)
342 for (i
= 0; i
<FZ_MAXCOLORS
; ++i
)
346 static inline void midcolor(float *c
, const float *c1
, const float *c2
)
349 for (i
= 0; i
<FZ_MAXCOLORS
; ++i
)
350 c
[i
] = (float)((c1
[i
] + c2
[i
]) / 2.0);
355 filltensorinterior(pdf_tensorpatch
*p
)
357 #define lcp1(p0, p3)\
358 ((p0 + p0 + p3) / 3.0f)
360 #define lcp2(p0, p3)\
361 ((p0 + p3 + p3) / 3.0f)
363 p
->pole
[1][1].x
= lcp1(p
->pole
[0][1].x
, p
->pole
[3][1].x
) +
364 lcp1(p
->pole
[1][0].x
, p
->pole
[1][3].x
) -
365 lcp1(lcp1(p
->pole
[0][0].x
, p
->pole
[0][3].x
),
366 lcp1(p
->pole
[3][0].x
, p
->pole
[3][3].x
));
367 p
->pole
[1][2].x
= lcp1(p
->pole
[0][2].x
, p
->pole
[3][2].x
) +
368 lcp2(p
->pole
[1][0].x
, p
->pole
[1][3].x
) -
369 lcp1(lcp2(p
->pole
[0][0].x
, p
->pole
[0][3].x
),
370 lcp2(p
->pole
[3][0].x
, p
->pole
[3][3].x
));
371 p
->pole
[2][1].x
= lcp2(p
->pole
[0][1].x
, p
->pole
[3][1].x
) +
372 lcp1(p
->pole
[2][0].x
, p
->pole
[2][3].x
) -
373 lcp2(lcp1(p
->pole
[0][0].x
, p
->pole
[0][3].x
),
374 lcp1(p
->pole
[3][0].x
, p
->pole
[3][3].x
));
375 p
->pole
[2][2].x
= lcp2(p
->pole
[0][2].x
, p
->pole
[3][2].x
) +
376 lcp2(p
->pole
[2][0].x
, p
->pole
[2][3].x
) -
377 lcp2(lcp2(p
->pole
[0][0].x
, p
->pole
[0][3].x
),
378 lcp2(p
->pole
[3][0].x
, p
->pole
[3][3].x
));
380 p
->pole
[1][1].y
= lcp1(p
->pole
[0][1].y
, p
->pole
[3][1].y
) +
381 lcp1(p
->pole
[1][0].y
, p
->pole
[1][3].y
) -
382 lcp1(lcp1(p
->pole
[0][0].y
, p
->pole
[0][3].y
),
383 lcp1(p
->pole
[3][0].y
, p
->pole
[3][3].y
));
384 p
->pole
[1][2].y
= lcp1(p
->pole
[0][2].y
, p
->pole
[3][2].y
) +
385 lcp2(p
->pole
[1][0].y
, p
->pole
[1][3].y
) -
386 lcp1(lcp2(p
->pole
[0][0].y
, p
->pole
[0][3].y
),
387 lcp2(p
->pole
[3][0].y
, p
->pole
[3][3].y
));
388 p
->pole
[2][1].y
= lcp2(p
->pole
[0][1].y
, p
->pole
[3][1].y
) +
389 lcp1(p
->pole
[2][0].y
, p
->pole
[2][3].y
) -
390 lcp2(lcp1(p
->pole
[0][0].y
, p
->pole
[0][3].y
),
391 lcp1(p
->pole
[3][0].y
, p
->pole
[3][3].y
));
392 p
->pole
[2][2].y
= lcp2(p
->pole
[0][2].y
, p
->pole
[3][2].y
) +
393 lcp2(p
->pole
[2][0].y
, p
->pole
[2][3].y
) -
394 lcp2(lcp2(p
->pole
[0][0].y
, p
->pole
[0][3].y
),
395 lcp2(p
->pole
[3][0].y
, p
->pole
[3][3].y
));
402 split_curve_s(const fz_point
*pole
, fz_point
*q0
, fz_point
*q1
, int pole_step
)
404 #define midpoint(a,b)\
405 ((a)/2.0f + (b)/2.0f) // to avoid overflow
406 float x12
= midpoint(pole
[1 * pole_step
].x
, pole
[2 * pole_step
].x
);
407 float y12
= midpoint(pole
[1 * pole_step
].y
, pole
[2 * pole_step
].y
);
409 q0
[1 * pole_step
].x
= midpoint(pole
[0 * pole_step
].x
, pole
[1 * pole_step
].x
);
410 q0
[1 * pole_step
].y
= midpoint(pole
[0 * pole_step
].y
, pole
[1 * pole_step
].y
);
411 q1
[2 * pole_step
].x
= midpoint(pole
[2 * pole_step
].x
, pole
[3 * pole_step
].x
);
412 q1
[2 * pole_step
].y
= midpoint(pole
[2 * pole_step
].y
, pole
[3 * pole_step
].y
);
413 q0
[2 * pole_step
].x
= midpoint(q0
[1 * pole_step
].x
, x12
);
414 q0
[2 * pole_step
].y
= midpoint(q0
[1 * pole_step
].y
, y12
);
415 q1
[1 * pole_step
].x
= midpoint(x12
, q1
[2 * pole_step
].x
);
416 q1
[1 * pole_step
].y
= midpoint(y12
, q1
[2 * pole_step
].y
);
417 q0
[0 * pole_step
].x
= pole
[0 * pole_step
].x
;
418 q0
[0 * pole_step
].y
= pole
[0 * pole_step
].y
;
419 q0
[3 * pole_step
].x
= q1
[0 * pole_step
].x
= midpoint(q0
[2 * pole_step
].x
, q1
[1 * pole_step
].x
);
420 q0
[3 * pole_step
].y
= q1
[0 * pole_step
].y
= midpoint(q0
[2 * pole_step
].y
, q1
[1 * pole_step
].y
);
421 q1
[3 * pole_step
].x
= pole
[3 * pole_step
].x
;
422 q1
[3 * pole_step
].y
= pole
[3 * pole_step
].y
;
427 split_patch(pdf_tensorpatch
*s0
, pdf_tensorpatch
*s1
, const pdf_tensorpatch
*p
)
429 split_curve_s(&p
->pole
[0][0], &s0
->pole
[0][0], &s1
->pole
[0][0], 4);
430 split_curve_s(&p
->pole
[0][1], &s0
->pole
[0][1], &s1
->pole
[0][1], 4);
431 split_curve_s(&p
->pole
[0][2], &s0
->pole
[0][2], &s1
->pole
[0][2], 4);
432 split_curve_s(&p
->pole
[0][3], &s0
->pole
[0][3], &s1
->pole
[0][3], 4);
434 copycolor(s0
->color
[0], p
->color
[0]);
435 midcolor(s0
->color
[1], p
->color
[0], p
->color
[1]);
436 midcolor(s0
->color
[2], p
->color
[2], p
->color
[3]);
437 copycolor(s0
->color
[3], p
->color
[3]);
439 copycolor(s1
->color
[0], s0
->color
[1]);
440 copycolor(s1
->color
[1], p
->color
[1]);
441 copycolor(s1
->color
[2], p
->color
[2]);
442 copycolor(s1
->color
[3], s0
->color
[2]);
446 split_stripe(pdf_tensorpatch
*s0
, pdf_tensorpatch
*s1
, const pdf_tensorpatch
*p
)
449 split_curve_s(p
->pole
[0], s0
->pole
[0], s1
->pole
[0], 1);
450 split_curve_s(p
->pole
[1], s0
->pole
[1], s1
->pole
[1], 1);
451 split_curve_s(p
->pole
[2], s0
->pole
[2], s1
->pole
[2], 1);
452 split_curve_s(p
->pole
[3], s0
->pole
[3], s1
->pole
[3], 1);
454 copycolor(s0
->color
[0], p
->color
[0]);
455 copycolor(s0
->color
[1], p
->color
[1]);
456 midcolor(s0
->color
[2], p
->color
[1], p
->color
[2]);
457 midcolor(s0
->color
[3], p
->color
[0], p
->color
[3]);
459 copycolor(s1
->color
[0], s0
->color
[3]);
460 copycolor(s1
->color
[1], s0
->color
[2]);
461 copycolor(s1
->color
[2], p
->color
[2]);
462 copycolor(s1
->color
[3], p
->color
[3]);
466 growshademesh(fz_shade
*shade
, int amount
)
471 newcap
= shade
->meshcap
+ amount
;
472 newmesh
= fz_realloc(shade
->mesh
, sizeof(float) * newcap
);
476 shade
->mesh
= newmesh
;
477 shade
->meshcap
= newcap
;
482 static inline int setvertex(float *mesh
, fz_point pt
, float *color
, int ptr
, int ncomp
)
488 for (i
=0; i
< ncomp
; ++i
) {
489 mesh
[ptr
++] = color
[i
];
496 triangulatepatch(pdf_tensorpatch p
, fz_shade
*shade
, int ptr
, int ncomp
)
500 ptr
= setvertex(shade
->mesh
, p
.pole
[0][0], p
.color
[0], ptr
, ncomp
);
501 ptr
= setvertex(shade
->mesh
, p
.pole
[3][0], p
.color
[1], ptr
, ncomp
);
502 ptr
= setvertex(shade
->mesh
, p
.pole
[3][3], p
.color
[2], ptr
, ncomp
);
503 ptr
= setvertex(shade
->mesh
, p
.pole
[0][0], p
.color
[0], ptr
, ncomp
);
504 ptr
= setvertex(shade
->mesh
, p
.pole
[3][3], p
.color
[2], ptr
, ncomp
);
505 ptr
= setvertex(shade
->mesh
, p
.pole
[0][3], p
.color
[3], ptr
, ncomp
);
507 if (shade
->meshcap
- 1024 < ptr
) {
508 error
= growshademesh(shade
, 1024);
509 if (error
) goto cleanup
;
520 drawstripe(pdf_tensorpatch patch
, fz_shade
*shade
, int ptr
, int ncomp
, int depth
)
522 pdf_tensorpatch s0
, s1
;
524 split_stripe(&s0
, &s1
, &patch
);
528 if (depth
>= SEGMENTATION_DEPTH
)
530 ptr
= triangulatepatch(s0
, shade
, ptr
, ncomp
);
531 ptr
= triangulatepatch(s1
, shade
, ptr
, ncomp
);
534 ptr
= drawstripe(s0
, shade
, ptr
, ncomp
, depth
);
535 ptr
= drawstripe(s1
, shade
, ptr
, ncomp
, depth
);
542 drawpatch(pdf_tensorpatch patch
, fz_shade
*shade
, int ptr
, int ncomp
, int depth
)
544 pdf_tensorpatch s0
, s1
;
546 split_patch(&s0
, &s1
, &patch
);
549 if (depth
> SEGMENTATION_DEPTH
)
551 ptr
= drawstripe(s0
, shade
, ptr
, ncomp
, 0);
552 ptr
= drawstripe(s1
, shade
, ptr
, ncomp
, 0);
555 ptr
= drawpatch(s0
, shade
, ptr
, ncomp
, depth
);
556 ptr
= drawpatch(s1
, shade
, ptr
, ncomp
, depth
);
563 pdf_loadtype6shade(fz_shade
*shade
, pdf_xref
*xref
, fz_obj
*shading
, fz_obj
*ref
)
576 float c0
[FZ_MAXCOLORS
];
577 float c1
[FZ_MAXCOLORS
];
585 pdf_tensorpatch patch
;
589 ncomp
= shade
->cs
->n
;
590 bpcoord
= fz_toint(fz_dictgets(shading
, "BitsPerCoordinate"));
591 bpcomp
= fz_toint(fz_dictgets(shading
, "BitsPerComponent"));
592 bpflag
= fz_toint(fz_dictgets(shading
, "BitsPerFlag"));
594 obj
= fz_dictgets(shading
, "Decode");
597 pdf_logshade("decode array\n");
598 p0
.x
= fz_toreal(fz_arrayget(obj
, 0));
599 p1
.x
= fz_toreal(fz_arrayget(obj
, 1));
600 p0
.y
= fz_toreal(fz_arrayget(obj
, 2));
601 p1
.y
= fz_toreal(fz_arrayget(obj
, 3));
602 for (i
=0; i
< fz_arraylen(obj
) / 2; ++i
) {
603 c0
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+4));
604 c1
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+5));
608 error
= fz_throw("syntaxerror: No Decode key in Type 6 Shade");
612 obj
= fz_dictgets(shading
, "Function");
615 pdf_loadshadefunction(shade
, xref
, shading
, c0
[0], c1
[0]);
616 shade
->usefunction
= 1;
619 shade
->usefunction
= 0;
623 error
= growshademesh(shade
, 1024);
624 if (error
) goto cleanup
;
626 n
= 2 + shade
->cs
->n
;
629 error
= pdf_openstream(&stream
, xref
, fz_tonum(ref
), fz_togen(ref
));
630 if (error
) goto cleanup
;
632 while (fz_peekbyte(stream
) != EOF
)
634 flag
= getdata(stream
, bpflag
);
636 for (i
= 0; i
< 12; ++i
) {
637 t
= getdata(stream
, bpcoord
);
638 p
[i
].x
= (float)(p0
.x
+ (t
* (p1
.x
- p0
.x
) / (pow(2, bpcoord
) - 1.)));
639 t
= getdata(stream
, bpcoord
);
640 p
[i
].y
= (float)(p0
.y
+ (t
* (p1
.y
- p0
.y
) / (pow(2, bpcoord
) - 1.)));
643 for (i
= 0; i
< 4; ++i
) {
645 for (k
=0; k
< ncomp
; ++k
) {
646 t
= getdata(stream
, bpcomp
);
648 c0
[k
] + (t
* (c1
[k
] - c0
[k
]) / (pow(2, bpcomp
) - 1.0f
));
652 patch
.pole
[0][0] = p
[0];
653 patch
.pole
[1][0] = p
[1];
654 patch
.pole
[2][0] = p
[2];
655 patch
.pole
[3][0] = p
[3];
656 patch
.pole
[3][1] = p
[4];
657 patch
.pole
[3][2] = p
[5];
658 patch
.pole
[3][3] = p
[6];
659 patch
.pole
[2][3] = p
[7];
660 patch
.pole
[1][3] = p
[8];
661 patch
.pole
[0][3] = p
[9];
662 patch
.pole
[0][2] = p
[10];
663 patch
.pole
[0][1] = p
[11];
664 filltensorinterior(&patch
);
666 j
= drawpatch(patch
, shade
, j
, ncomp
, 0);
669 fz_dropstream(stream
);
671 shade
->meshlen
= j
/ n
/ 3;
679 pdf_loadtype7shade(fz_shade
*shade
, pdf_xref
*xref
, fz_obj
*shading
, fz_obj
*ref
)
690 float x0
, x1
, y0
, y1
;
692 float c0
[FZ_MAXCOLORS
];
693 float c1
[FZ_MAXCOLORS
];
700 pdf_tensorpatch patch
;
704 ncomp
= shade
->cs
->n
;
705 bpcoord
= fz_toint(fz_dictgets(shading
, "BitsPerCoordinate"));
706 bpcomp
= fz_toint(fz_dictgets(shading
, "BitsPerComponent"));
707 bpflag
= fz_toint(fz_dictgets(shading
, "BitsPerFlag"));
709 obj
= fz_dictgets(shading
, "Decode");
712 pdf_logshade("decode array\n");
713 x0
= fz_toreal(fz_arrayget(obj
, 0));
714 x1
= fz_toreal(fz_arrayget(obj
, 1));
715 y0
= fz_toreal(fz_arrayget(obj
, 2));
716 y1
= fz_toreal(fz_arrayget(obj
, 3));
717 for (i
=0; i
< fz_arraylen(obj
) / 2; ++i
) {
718 c0
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+4));
719 c1
[i
] = fz_toreal(fz_arrayget(obj
, i
*2+5));
723 error
= fz_throw("syntaxerror: No Decode key in Type 6 Shade");
727 obj
= fz_dictgets(shading
, "Function");
730 pdf_loadshadefunction(shade
, xref
, shading
, c0
[0], c1
[0]);
731 shade
->usefunction
= 1;
734 shade
->usefunction
= 0;
738 error
= growshademesh(shade
, 1024);
739 if (error
) goto cleanup
;
741 n
= 2 + shade
->cs
->n
;
744 error
= pdf_openstream(&stream
, xref
, fz_tonum(ref
), fz_togen(ref
));
745 if (error
) goto cleanup
;
747 while (fz_peekbyte(stream
) != EOF
)
749 flag
= getdata(stream
, bpflag
);
751 for (i
= 0; i
< 16; ++i
) {
752 t
= getdata(stream
, bpcoord
);
753 p
[i
].x
= x0
+ (t
* (x1
- x0
) / (pow(2, bpcoord
) - 1.));
754 t
= getdata(stream
, bpcoord
);
755 p
[i
].y
= y0
+ (t
* (y1
- y0
) / (pow(2, bpcoord
) - 1.));
758 for (i
= 0; i
< 4; ++i
) {
760 for (k
=0; k
< ncomp
; ++k
) {
761 t
= getdata(stream
, bpcomp
);
763 c0
[k
] + (t
* (c1
[k
] - c0
[k
]) / (pow(2, bpcomp
) - 1.0f
));
767 patch
.pole
[0][0] = p
[0];
768 patch
.pole
[0][1] = p
[1];
769 patch
.pole
[0][2] = p
[2];
770 patch
.pole
[0][3] = p
[3];
771 patch
.pole
[1][3] = p
[4];
772 patch
.pole
[2][3] = p
[5];
773 patch
.pole
[3][3] = p
[6];
774 patch
.pole
[3][2] = p
[7];
775 patch
.pole
[3][1] = p
[8];
776 patch
.pole
[3][0] = p
[9];
777 patch
.pole
[2][0] = p
[10];
778 patch
.pole
[1][0] = p
[11];
779 patch
.pole
[1][1] = p
[12];
780 patch
.pole
[1][2] = p
[13];
781 patch
.pole
[2][2] = p
[14];
782 patch
.pole
[2][1] = p
[15];
784 j
= drawpatch(patch
, shade
, j
, ncomp
, 0);
787 fz_dropstream(stream
);
789 shade
->meshlen
= j
/ n
/ 3;