5 pdf_newcsi(pdf_csi
**csip
, int maskonly
)
11 csi
= *csip
= fz_malloc(sizeof(pdf_csi
));
15 pdf_initgstate(&csi
->gstate
[0]);
22 error
= fz_newpathnode(&csi
->path
);
28 error
= fz_newtree(&csi
->tree
);
30 fz_dropnode((fz_node
*)csi
->path
);
35 error
= fz_newovernode(&node
);
36 csi
->tree
->root
= node
;
37 csi
->gstate
[0].head
= node
;
41 csi
->gstate
[0].fill
.kind
= PDF_MNONE
;
42 csi
->gstate
[0].stroke
.kind
= PDF_MNONE
;
50 csi
->tm
= fz_identity();
51 csi
->tlm
= fz_identity();
57 clearstack(pdf_csi
*csi
)
60 for (i
= 0; i
< csi
->top
; i
++)
61 fz_dropobj(csi
->stack
[i
]);
69 return fz_throw("gstate overflow in content stream");
71 memcpy(&csi
->gstate
[csi
->gtop
+ 1], &csi
->gstate
[csi
->gtop
], sizeof(pdf_gstate
));
75 if (csi
->gstate
[csi
->gtop
].fill
.cs
)
76 fz_keepcolorspace(csi
->gstate
[csi
->gtop
].fill
.cs
);
77 if (csi
->gstate
[csi
->gtop
].stroke
.cs
)
78 fz_keepcolorspace(csi
->gstate
[csi
->gtop
].stroke
.cs
);
84 grestore(pdf_csi
*csi
)
87 return fz_throw("gstate underflow in content stream");
89 if (csi
->gstate
[csi
->gtop
].fill
.cs
)
90 fz_dropcolorspace(csi
->gstate
[csi
->gtop
].fill
.cs
);
91 if (csi
->gstate
[csi
->gtop
].stroke
.cs
)
92 fz_dropcolorspace(csi
->gstate
[csi
->gtop
].stroke
.cs
);
100 pdf_dropcsi(pdf_csi
*csi
)
105 if (csi
->gstate
[csi
->gtop
].fill
.cs
)
106 fz_dropcolorspace(csi
->gstate
[csi
->gtop
].fill
.cs
);
107 if (csi
->gstate
[csi
->gtop
].stroke
.cs
)
108 fz_dropcolorspace(csi
->gstate
[csi
->gtop
].stroke
.cs
);
110 if (csi
->path
) fz_dropnode((fz_node
*)csi
->path
);
111 if (csi
->clip
) fz_dropnode((fz_node
*)csi
->clip
);
112 if (csi
->textclip
) fz_dropnode((fz_node
*)csi
->textclip
);
113 if (csi
->text
) fz_dropnode((fz_node
*)csi
->text
);
114 if (csi
->array
) fz_dropobj(csi
->array
);
122 * Do some magic to call the xobject subroutine.
123 * Push gstate, set transform, clip, run, pop gstate.
127 runxobject(pdf_csi
*csi
, pdf_xref
*xref
, pdf_xobject
*xobj
)
140 error
= fz_newtransformnode(&transform
, xobj
->matrix
);
144 error
= pdf_addtransform(csi
->gstate
+ csi
->gtop
, transform
);
147 fz_dropnode(transform
);
153 xobj
->contents
->rp
= xobj
->contents
->bp
;
155 error
= fz_openrbuffer(&file
, xobj
->contents
);
159 error
= pdf_runcsi(csi
, xref
, xobj
->resources
, file
);
167 error
= grestore(csi
);
175 * Decode inline image and insert into page.
179 runinlineimage(pdf_csi
*csi
, pdf_xref
*xref
, fz_obj
*rdb
, fz_stream
*file
, fz_obj
*dict
)
182 pdf_image
*img
= NULL
;
187 error
= pdf_loadinlineimage(&img
, xref
, rdb
, dict
, file
);
191 token
= pdf_lex(file
, buf
, sizeof buf
, &len
);
192 if (token
!= PDF_TKEYWORD
|| strcmp("EI", buf
))
193 fz_warn("syntaxerror: corrupt inline image");
195 error
= pdf_showimage(csi
, img
);
196 fz_dropimage((fz_image
*)img
);
201 * Set gstate params from an ExtGState dictionary.
205 runextgstate(pdf_gstate
*gstate
, pdf_xref
*xref
, fz_obj
*extgstate
)
209 for (i
= 0; i
< fz_dictlen(extgstate
); i
++)
211 fz_obj
*key
= fz_dictgetkey(extgstate
, i
);
212 fz_obj
*val
= fz_dictgetval(extgstate
, i
);
213 char *s
= fz_toname(key
);
215 if (!strcmp(s
, "Font"))
217 if (fz_isarray(val
) && fz_arraylen(val
) == 2)
219 gstate
->font
= pdf_finditem(xref
->store
, PDF_KFONT
, fz_arrayget(val
, 0));
221 return fz_throw("syntaxerror: missing font resource");
222 gstate
->size
= fz_toreal(fz_arrayget(val
, 1));
225 return fz_throw("syntaxerror in ExtGState/Font");
228 else if (!strcmp(s
, "LW"))
229 gstate
->linewidth
= fz_toreal(val
);
230 else if (!strcmp(s
, "LC"))
231 gstate
->linecap
= fz_toint(val
);
232 else if (!strcmp(s
, "LJ"))
233 gstate
->linejoin
= fz_toint(val
);
234 else if (!strcmp(s
, "ML"))
235 gstate
->miterlimit
= fz_toreal(val
);
237 else if (!strcmp(s
, "D"))
239 if (fz_isarray(val
) && fz_arraylen(val
) == 2)
241 fz_obj
*dashes
= fz_arrayget(val
, 0);
242 gstate
->dashlen
= MAX(fz_arraylen(dashes
), 32);
243 for (k
= 0; k
< gstate
->dashlen
; k
++)
244 gstate
->dashlist
[k
] = fz_toreal(fz_arrayget(dashes
, k
));
245 gstate
->dashphase
= fz_toreal(fz_arrayget(val
, 1));
248 return fz_throw("syntaxerror in ExtGState/D");
256 * The meat of the interpreter...
260 runkeyword(pdf_csi
*csi
, pdf_xref
*xref
, fz_obj
*rdb
, char *buf
)
262 pdf_gstate
*gstate
= csi
->gstate
+ csi
->gtop
;
264 float a
, b
, c
, d
, e
, f
;
267 float v
[FZ_MAXCOLORS
];
273 if (!strcmp(buf
, "BX"))
280 else if (!strcmp(buf
, "EX"))
287 else if (!strcmp(buf
, "MP"))
293 else if (!strcmp(buf
, "DP"))
299 else if (!strcmp(buf
, "BMC"))
305 else if (!strcmp(buf
, "BDC"))
311 else if (!strcmp(buf
, "EMC"))
317 else if (!strcmp(buf
, "cm"))
325 m
.a
= fz_toreal(csi
->stack
[0]);
326 m
.b
= fz_toreal(csi
->stack
[1]);
327 m
.c
= fz_toreal(csi
->stack
[2]);
328 m
.d
= fz_toreal(csi
->stack
[3]);
329 m
.e
= fz_toreal(csi
->stack
[4]);
330 m
.f
= fz_toreal(csi
->stack
[5]);
332 error
= fz_newtransformnode(&transform
, m
);
333 if (error
) return error
;
334 error
= pdf_addtransform(gstate
, transform
);
337 fz_dropnode(transform
);
342 else if (!strcmp(buf
, "ri"))
348 else if (!strcmp(buf
, "gs"))
356 dict
= fz_dictgets(rdb
, "ExtGState");
358 return fz_throw("syntaxerror: missing extgstate resource");
360 obj
= fz_dictget(dict
, csi
->stack
[0]);
362 return fz_throw("syntaxerror: missing extgstate resource");
364 runextgstate(gstate
, xref
, obj
);
367 else if (!strcmp(buf
, "re"))
371 x
= fz_toreal(csi
->stack
[0]);
372 y
= fz_toreal(csi
->stack
[1]);
373 w
= fz_toreal(csi
->stack
[2]);
374 h
= fz_toreal(csi
->stack
[3]);
375 error
= fz_moveto(csi
->path
, x
, y
);
376 if (error
) return error
;
377 error
= fz_lineto(csi
->path
, x
+ w
, y
);
378 if (error
) return error
;
379 error
= fz_lineto(csi
->path
, x
+ w
, y
+ h
);
380 if (error
) return error
;
381 error
= fz_lineto(csi
->path
, x
, y
+ h
);
382 if (error
) return error
;
383 error
= fz_closepath(csi
->path
);
384 if (error
) return error
;
387 else if (!strcmp(buf
, "f*"))
391 error
= pdf_showpath(csi
, 0, 1, 0, 1);
392 if (error
) return error
;
395 else if (!strcmp(buf
, "B*"))
399 error
= pdf_showpath(csi
, 0, 1, 1, 1);
400 if (error
) return error
;
403 else if (!strcmp(buf
, "b*"))
407 error
= pdf_showpath(csi
, 1, 1, 1, 1);
408 if (error
) return error
;
411 else if (!strcmp(buf
, "W*"))
418 else if (!strcmp(buf
, "cs"))
424 else if (!strcmp(buf
, "CS"))
437 if (!strcmp(fz_toname(obj
), "Pattern"))
439 error
= pdf_setpattern(csi
, what
, nil
, nil
);
440 if (error
) return error
;
445 if (!strcmp(fz_toname(obj
), "DeviceGray"))
447 else if (!strcmp(fz_toname(obj
), "DeviceRGB"))
449 else if (!strcmp(fz_toname(obj
), "DeviceCMYK"))
453 fz_obj
*dict
= fz_dictgets(rdb
, "ColorSpace");
455 return fz_throw("syntaxerror: missing colorspace resource");
456 obj
= fz_dictget(dict
, obj
);
458 return fz_throw("syntaxerror: missing colorspace resource");
460 cs
= pdf_finditem(xref
->store
, PDF_KCOLORSPACE
, obj
);
462 return fz_throw("syntaxerror: missing colorspace resource");
465 error
= pdf_setcolorspace(csi
, what
, cs
);
466 if (error
) return error
;
470 else if (!strcmp(buf
, "sc") || !strcmp(buf
, "scn"))
476 else if (!strcmp(buf
, "SC") || !strcmp(buf
, "SCN"))
487 mat
= what
== PDF_MSTROKE
? &gstate
->stroke
: &gstate
->fill
;
489 if (fz_isname(csi
->stack
[csi
->top
- 1]))
490 mat
->kind
= PDF_MPATTERN
;
495 return fz_throw("syntaxerror: cannot set color in mask objects");
500 v
[0] = fz_toreal(csi
->stack
[0]);
501 error
= pdf_setcolor(csi
, what
, v
);
502 if (error
) return error
;
507 if (csi
->top
!= mat
->cs
->n
)
509 for (i
= 0; i
< csi
->top
; i
++)
510 v
[i
] = fz_toreal(csi
->stack
[i
]);
511 error
= pdf_setcolor(csi
, what
, v
);
512 if (error
) return error
;
516 for (i
= 0; i
< csi
->top
- 1; i
++)
517 v
[i
] = fz_toreal(csi
->stack
[i
]);
519 dict
= fz_dictgets(rdb
, "Pattern");
521 return fz_throw("syntaxerror: missing pattern resource");
523 obj
= fz_dictget(dict
, csi
->stack
[csi
->top
- 1]);
525 return fz_throw("syntaxerror: missing pattern resource");
527 pat
= pdf_finditem(xref
->store
, PDF_KPATTERN
, obj
);
530 error
= pdf_setpattern(csi
, what
, pat
, csi
->top
== 1 ? nil
: v
);
531 if (error
) return error
;
534 shd
= pdf_finditem(xref
->store
, PDF_KSHADE
, obj
);
537 error
= pdf_setshade(csi
, what
, shd
);
538 if (error
) return error
;
542 return fz_throw("syntaxerror: missing pattern resource");
547 return fz_throw("syntaxerror: cannot set color in shade objects");
551 else if (!strcmp(buf
, "rg"))
556 v
[0] = fz_toreal(csi
->stack
[0]);
557 v
[1] = fz_toreal(csi
->stack
[1]);
558 v
[2] = fz_toreal(csi
->stack
[2]);
560 error
= pdf_setcolorspace(csi
, PDF_MFILL
, pdf_devicergb
);
561 if (error
) return error
;
562 error
= pdf_setcolor(csi
, PDF_MFILL
, v
);
563 if (error
) return error
;
566 else if (!strcmp(buf
, "RG"))
571 v
[0] = fz_toreal(csi
->stack
[0]);
572 v
[1] = fz_toreal(csi
->stack
[1]);
573 v
[2] = fz_toreal(csi
->stack
[2]);
575 error
= pdf_setcolorspace(csi
, PDF_MSTROKE
, pdf_devicergb
);
576 if (error
) return error
;
577 error
= pdf_setcolor(csi
, PDF_MSTROKE
, v
);
578 if (error
) return error
;
581 else if (!strcmp(buf
, "BT"))
585 csi
->tm
= fz_identity();
586 csi
->tlm
= fz_identity();
589 else if (!strcmp(buf
, "ET"))
594 error
= pdf_flushtext(csi
);
600 error
= pdf_addclipmask(gstate
, csi
->textclip
);
601 if (error
) return error
;
606 else if (!strcmp(buf
, "Tc"))
610 gstate
->charspace
= fz_toreal(csi
->stack
[0]);
613 else if (!strcmp(buf
, "Tw"))
617 gstate
->wordspace
= fz_toreal(csi
->stack
[0]);
620 else if (!strcmp(buf
, "Tz"))
625 error
= pdf_flushtext(csi
);
626 if (error
) return error
;
628 gstate
->scale
= fz_toreal(csi
->stack
[0]) / 100.0;
631 else if (!strcmp(buf
, "TL"))
635 gstate
->leading
= fz_toreal(csi
->stack
[0]);
638 else if (!strcmp(buf
, "Tf"))
646 dict
= fz_dictgets(rdb
, "Font");
648 return fz_throw("syntaxerror: missing font resource");
650 obj
= fz_dictget(dict
, csi
->stack
[0]);
652 return fz_throw("syntaxerror: missing font resource");
654 gstate
->font
= pdf_finditem(xref
->store
, PDF_KFONT
, obj
);
656 return fz_throw("syntaxerror: missing font resource");
658 gstate
->size
= fz_toreal(csi
->stack
[1]);
661 else if (!strcmp(buf
, "Tr"))
665 gstate
->render
= fz_toint(csi
->stack
[0]);
668 else if (!strcmp(buf
, "Ts"))
672 gstate
->rise
= fz_toreal(csi
->stack
[0]);
675 else if (!strcmp(buf
, "Td"))
679 m
= fz_translate(fz_toreal(csi
->stack
[0]), fz_toreal(csi
->stack
[1]));
680 csi
->tlm
= fz_concat(m
, csi
->tlm
);
684 else if (!strcmp(buf
, "TD"))
688 gstate
->leading
= -fz_toreal(csi
->stack
[1]);
689 m
= fz_translate(fz_toreal(csi
->stack
[0]), fz_toreal(csi
->stack
[1]));
690 csi
->tlm
= fz_concat(m
, csi
->tlm
);
694 else if (!strcmp(buf
, "Tm"))
699 error
= pdf_flushtext(csi
);
700 if (error
) return error
;
702 csi
->tm
.a
= fz_toreal(csi
->stack
[0]);
703 csi
->tm
.b
= fz_toreal(csi
->stack
[1]);
704 csi
->tm
.c
= fz_toreal(csi
->stack
[2]);
705 csi
->tm
.d
= fz_toreal(csi
->stack
[3]);
706 csi
->tm
.e
= fz_toreal(csi
->stack
[4]);
707 csi
->tm
.f
= fz_toreal(csi
->stack
[5]);
711 else if (!strcmp(buf
, "T*"))
715 m
= fz_translate(0, -gstate
->leading
);
716 csi
->tlm
= fz_concat(m
, csi
->tlm
);
720 else if (!strcmp(buf
, "Tj"))
724 error
= pdf_showtext(csi
, csi
->stack
[0]);
725 if (error
) return error
;
728 else if (!strcmp(buf
, "TJ"))
732 error
= pdf_showtext(csi
, csi
->stack
[0]);
733 if (error
) return error
;
736 else if (!strcmp(buf
, "Do"))
746 dict
= fz_dictgets(rdb
, "XObject");
750 return fz_throw("syntaxerror: missing xobject resource");
753 obj
= fz_dictget(dict
, csi
->stack
[0]);
755 return fz_throw("syntaxerror: missing xobject resource");
757 img
= pdf_finditem(xref
->store
, PDF_KIMAGE
, obj
);
758 xobj
= pdf_finditem(xref
->store
, PDF_KXOBJECT
, obj
);
761 return fz_throw("syntaxerror: missing xobject resource");
765 error
= pdf_showimage(csi
, img
);
773 error
= runxobject(csi
, xref
, xobj
);
779 else if (!strcmp(buf
, "sh"))
788 dict
= fz_dictgets(rdb
, "Shading");
790 return fz_throw("syntaxerror: missing shading resource");
792 obj
= fz_dictget(dict
, csi
->stack
[csi
->top
- 1]);
794 return fz_throw("syntaxerror: missing shading resource");
796 shd
= pdf_finditem(xref
->store
, PDF_KSHADE
, obj
);
798 return fz_throw("syntaxerror: missing shading resource");
800 error
= pdf_addshade(gstate
, shd
);
801 if (error
) return error
;
804 else if (!strcmp(buf
, "d0"))
806 fz_warn("unimplemented: d0 charprocs");
809 else if (!strcmp(buf
, "d1"))
814 if (!csi
->xbalance
) goto syntaxerror
;
831 error
= grestore(csi
);
839 gstate
->linewidth
= fz_toreal(csi
->stack
[0]);
845 gstate
->linecap
= fz_toint(csi
->stack
[0]);
851 gstate
->linejoin
= fz_toint(csi
->stack
[0]);
857 gstate
->miterlimit
= fz_toreal(csi
->stack
[0]);
865 fz_obj
*array
= csi
->stack
[0];
866 gstate
->dashlen
= fz_arraylen(array
);
867 if (gstate
->dashlen
> 32)
868 return fz_throw("rangecheck: too large dash pattern");
869 for (i
= 0; i
< gstate
->dashlen
; i
++)
870 gstate
->dashlist
[i
] = fz_toreal(fz_arrayget(array
, i
));
871 gstate
->dashphase
= fz_toreal(csi
->stack
[1]);
884 a
= fz_toreal(csi
->stack
[0]);
885 b
= fz_toreal(csi
->stack
[1]);
886 return fz_moveto(csi
->path
, a
, b
);
891 a
= fz_toreal(csi
->stack
[0]);
892 b
= fz_toreal(csi
->stack
[1]);
893 return fz_lineto(csi
->path
, a
, b
);
898 a
= fz_toreal(csi
->stack
[0]);
899 b
= fz_toreal(csi
->stack
[1]);
900 c
= fz_toreal(csi
->stack
[2]);
901 d
= fz_toreal(csi
->stack
[3]);
902 e
= fz_toreal(csi
->stack
[4]);
903 f
= fz_toreal(csi
->stack
[5]);
904 return fz_curveto(csi
->path
, a
, b
, c
, d
, e
, f
);
909 a
= fz_toreal(csi
->stack
[0]);
910 b
= fz_toreal(csi
->stack
[1]);
911 c
= fz_toreal(csi
->stack
[2]);
912 d
= fz_toreal(csi
->stack
[3]);
913 return fz_curvetov(csi
->path
, a
, b
, c
, d
);
918 a
= fz_toreal(csi
->stack
[0]);
919 b
= fz_toreal(csi
->stack
[1]);
920 c
= fz_toreal(csi
->stack
[2]);
921 d
= fz_toreal(csi
->stack
[3]);
922 return fz_curvetoy(csi
->path
, a
, b
, c
, d
);
927 return fz_closepath(csi
->path
);
932 error
= pdf_showpath(csi
, 0, 0, 1, 0);
933 if (error
) return error
;
939 error
= pdf_showpath(csi
, 1, 0, 1, 0);
940 if (error
) return error
;
947 error
= pdf_showpath(csi
, 0, 1, 0, 0);
948 if (error
) return error
;
954 error
= pdf_showpath(csi
, 0, 1, 1, 0);
955 if (error
) return error
;
961 error
= pdf_showpath(csi
, 1, 1, 1, 0);
962 if (error
) return error
;
968 error
= pdf_showpath(csi
, 0, 0, 0, 0);
969 if (error
) return error
;
982 v
[0] = fz_toreal(csi
->stack
[0]);
983 error
= pdf_setcolorspace(csi
, PDF_MFILL
, pdf_devicegray
);
984 if (error
) return error
;
985 error
= pdf_setcolor(csi
, PDF_MFILL
, v
);
986 if (error
) return error
;
993 v
[0] = fz_toreal(csi
->stack
[0]);
994 error
= pdf_setcolorspace(csi
, PDF_MSTROKE
, pdf_devicegray
);
995 if (error
) return error
;
996 error
= pdf_setcolor(csi
, PDF_MSTROKE
, v
);
997 if (error
) return error
;
1004 v
[0] = fz_toreal(csi
->stack
[0]);
1005 v
[1] = fz_toreal(csi
->stack
[1]);
1006 v
[2] = fz_toreal(csi
->stack
[2]);
1007 v
[3] = fz_toreal(csi
->stack
[3]);
1009 error
= pdf_setcolorspace(csi
, PDF_MFILL
, pdf_devicecmyk
);
1010 if (error
) return error
;
1011 error
= pdf_setcolor(csi
, PDF_MFILL
, v
);
1012 if (error
) return error
;
1019 v
[0] = fz_toreal(csi
->stack
[0]);
1020 v
[1] = fz_toreal(csi
->stack
[1]);
1021 v
[2] = fz_toreal(csi
->stack
[2]);
1022 v
[3] = fz_toreal(csi
->stack
[3]);
1024 error
= pdf_setcolorspace(csi
, PDF_MSTROKE
, pdf_devicecmyk
);
1025 if (error
) return error
;
1026 error
= pdf_setcolor(csi
, PDF_MSTROKE
, v
);
1027 if (error
) return error
;
1034 m
= fz_translate(0, -gstate
->leading
);
1035 csi
->tlm
= fz_concat(m
, csi
->tlm
);
1038 error
= pdf_showtext(csi
, csi
->stack
[0]);
1039 if (error
) return error
;
1046 gstate
->wordspace
= fz_toreal(csi
->stack
[0]);
1047 gstate
->charspace
= fz_toreal(csi
->stack
[1]);
1049 m
= fz_translate(0, -gstate
->leading
);
1050 csi
->tlm
= fz_concat(m
, csi
->tlm
);
1053 error
= pdf_showtext(csi
, csi
->stack
[2]);
1054 if (error
) return error
;
1058 if (!csi
->xbalance
) goto syntaxerror
;
1064 return fz_throw("syntaxerror in content stream: '%s'", buf
);
1068 pdf_runcsi(pdf_csi
*csi
, pdf_xref
*xref
, fz_obj
*rdb
, fz_stream
*file
)
1078 return fz_throw("stack overflow in content stream");
1080 token
= pdf_lex(file
, buf
, sizeof buf
, &len
);
1084 if (token
== PDF_TCARRAY
)
1086 csi
->stack
[csi
->top
] = csi
->array
;
1090 else if (token
== PDF_TINT
|| token
== PDF_TREAL
)
1092 error
= fz_newreal(&obj
, atof(buf
));
1093 if (error
) return error
;
1094 error
= fz_arraypush(csi
->array
, obj
);
1096 if (error
) return error
;
1098 else if (token
== PDF_TSTRING
)
1100 error
= fz_newstring(&obj
, buf
, len
);
1101 if (error
) return error
;
1102 error
= fz_arraypush(csi
->array
, obj
);
1104 if (error
) return error
;
1106 else if (token
== PDF_TEOF
)
1113 return fz_throw("syntaxerror in content stream");
1122 /* optimize text-object array parsing */
1124 error
= fz_newarray(&csi
->array
, 8);
1125 if (error
) return error
;
1129 error
= pdf_parsedict(&csi
->stack
[csi
->top
], file
, buf
, sizeof buf
);
1130 if (error
) return error
;
1135 error
= fz_newname(&csi
->stack
[csi
->top
], buf
);
1136 if (error
) return error
;
1141 error
= fz_newint(&csi
->stack
[csi
->top
], atoi(buf
));
1142 if (error
) return error
;
1147 error
= fz_newreal(&csi
->stack
[csi
->top
], atof(buf
));
1148 if (error
) return error
;
1153 error
= fz_newstring(&csi
->stack
[csi
->top
], buf
, len
);
1154 if (error
) return error
;
1159 error
= fz_newbool(&csi
->stack
[csi
->top
], 1);
1160 if (error
) return error
;
1165 error
= fz_newbool(&csi
->stack
[csi
->top
], 0);
1166 if (error
) return error
;
1171 error
= fz_newnull(&csi
->stack
[csi
->top
]);
1172 if (error
) return error
;
1177 if (!strcmp(buf
, "BI"))
1181 error
= pdf_parsedict(&obj
, file
, buf
, sizeof buf
);
1185 /* read whitespace after ID keyword */
1188 error
= runinlineimage(csi
, xref
, rdb
, file
, obj
);
1195 error
= runkeyword(csi
, xref
, rdb
, buf
);
1196 if (error
) return error
;
1203 return fz_throw("syntaxerror in content stream");