2 /** \file
3 * PDF parsing module using libpoppler's facilities
4 *
5 * Derived from Gfx.h
6 *
7 * Copyright 1996-2003 Glyph & Cog, LLC
8 *
9 */
11 #ifndef PDF_PARSER_H
12 #define PDF_PARSER_H
14 #ifdef HAVE_POPPLER
16 #ifdef USE_GCC_PRAGMAS
17 #pragma interface
18 #endif
20 namespace Inkscape {
21 namespace Extension {
22 namespace Internal {
23 class SvgBuilder;
24 }
25 }
26 }
27 using Inkscape::Extension::Internal::SvgBuilder;
29 #include "goo/gtypes.h"
30 #include "Object.h"
32 class GooString;
33 class XRef;
34 class Array;
35 class Stream;
36 class Parser;
37 class Dict;
38 class Function;
39 class OutputDev;
40 class GfxFontDict;
41 class GfxFont;
42 class GfxPattern;
43 class GfxTilingPattern;
44 class GfxShadingPattern;
45 class GfxShading;
46 class GfxFunctionShading;
47 class GfxAxialShading;
48 class GfxRadialShading;
49 class GfxGouraudTriangleShading;
50 class GfxPatchMeshShading;
51 struct GfxPatch;
52 class GfxState;
53 struct GfxColor;
54 class GfxColorSpace;
55 class Gfx;
56 class GfxResources;
57 class PDFRectangle;
58 class AnnotBorderStyle;
60 class PdfParser;
62 //------------------------------------------------------------------------
64 #ifndef GFX_H
65 enum GfxClipType {
66 clipNone,
67 clipNormal,
68 clipEO
69 };
71 enum TchkType {
72 tchkBool, // boolean
73 tchkInt, // integer
74 tchkNum, // number (integer or real)
75 tchkString, // string
76 tchkName, // name
77 tchkArray, // array
78 tchkProps, // properties (dictionary or name)
79 tchkSCN, // scn/SCN args (number of name)
80 tchkNone // used to avoid empty initializer lists
81 };
82 #endif /* GFX_H */
84 #define maxOperatorArgs 33
86 struct PdfOperator {
87 char name[4];
88 int numArgs;
89 TchkType tchk[maxOperatorArgs];
90 void (PdfParser::*func)(Object args[], int numArgs);
91 };
93 #undef maxOperatorArgs
95 struct OpHistoryEntry {
96 const char *name; // operator's name
97 GfxState *state; // saved state, NULL if none
98 GBool executed; // whether the operator has been executed
100 OpHistoryEntry *next; // next entry on stack
101 unsigned depth; // total number of entries descending from this
102 };
104 //------------------------------------------------------------------------
105 // PdfParser
106 //------------------------------------------------------------------------
108 class PdfParser {
109 public:
111 // Constructor for regular output.
112 PdfParser(XRef *xrefA, SvgBuilder *builderA,
113 int pageNum, Dict *resDict, PDFRectangle *cropBox,
114 GBool (*abortCheckCbkA)(void *data) = NULL,
115 void *abortCheckCbkDataA = NULL);
117 ~PdfParser();
119 // Interpret a stream or array of streams.
120 void parse(Object *obj, GBool topLevel = gTrue);
122 // Save graphics state.
123 void saveState();
125 // Restore graphics state.
126 void restoreState();
128 // Get the current graphics state object.
129 GfxState *getState() { return state; }
131 private:
133 XRef *xref; // the xref table for this PDF file
134 SvgBuilder *builder; // SVG generator
135 GBool subPage; // is this a sub-page object?
136 GBool printCommands; // print the drawing commands (for debugging)
137 GfxResources *res; // resource stack
138 int updateLevel;
140 GfxState *state; // current graphics state
141 GBool fontChanged; // set if font or text matrix has changed
142 GfxClipType clip; // do a clip?
143 int ignoreUndef; // current BX/EX nesting level
144 double baseMatrix[6]; // default matrix for most recent
145 // page/form/pattern
146 int formDepth;
148 Parser *parser; // parser for page content stream(s)
150 GBool // callback to check for an abort
151 (*abortCheckCbk)(void *data);
152 void *abortCheckCbkData;
154 static PdfOperator opTab[]; // table of operators
156 OpHistoryEntry *operatorHistory; // list containing the last N operators
157 void pushOperator(const char *name);
158 OpHistoryEntry *popOperator();
159 const char *getPreviousOperator(); // returns the previous operator's name
161 void go(GBool topLevel);
162 void execOp(Object *cmd, Object args[], int numArgs);
163 PdfOperator *findOp(char *name);
164 GBool checkArg(Object *arg, TchkType type);
165 int getPos();
167 // graphics state operators
168 void opSave(Object args[], int numArgs);
169 void opRestore(Object args[], int numArgs);
170 void opConcat(Object args[], int numArgs);
171 void opSetDash(Object args[], int numArgs);
172 void opSetFlat(Object args[], int numArgs);
173 void opSetLineJoin(Object args[], int numArgs);
174 void opSetLineCap(Object args[], int numArgs);
175 void opSetMiterLimit(Object args[], int numArgs);
176 void opSetLineWidth(Object args[], int numArgs);
177 void opSetExtGState(Object args[], int numArgs);
178 void doSoftMask(Object *str, GBool alpha,
179 GfxColorSpace *blendingColorSpace,
180 GBool isolated, GBool knockout,
181 Function *transferFunc, GfxColor *backdropColor);
182 void opSetRenderingIntent(Object args[], int numArgs);
184 // color operators
185 void opSetFillGray(Object args[], int numArgs);
186 void opSetStrokeGray(Object args[], int numArgs);
187 void opSetFillCMYKColor(Object args[], int numArgs);
188 void opSetStrokeCMYKColor(Object args[], int numArgs);
189 void opSetFillRGBColor(Object args[], int numArgs);
190 void opSetStrokeRGBColor(Object args[], int numArgs);
191 void opSetFillColorSpace(Object args[], int numArgs);
192 void opSetStrokeColorSpace(Object args[], int numArgs);
193 void opSetFillColor(Object args[], int numArgs);
194 void opSetStrokeColor(Object args[], int numArgs);
195 void opSetFillColorN(Object args[], int numArgs);
196 void opSetStrokeColorN(Object args[], int numArgs);
198 // path segment operators
199 void opMoveTo(Object args[], int numArgs);
200 void opLineTo(Object args[], int numArgs);
201 void opCurveTo(Object args[], int numArgs);
202 void opCurveTo1(Object args[], int numArgs);
203 void opCurveTo2(Object args[], int numArgs);
204 void opRectangle(Object args[], int numArgs);
205 void opClosePath(Object args[], int numArgs);
207 // path painting operators
208 void opEndPath(Object args[], int numArgs);
209 void opStroke(Object args[], int numArgs);
210 void opCloseStroke(Object args[], int numArgs);
211 void opFill(Object args[], int numArgs);
212 void opEOFill(Object args[], int numArgs);
213 void opFillStroke(Object args[], int numArgs);
214 void opCloseFillStroke(Object args[], int numArgs);
215 void opEOFillStroke(Object args[], int numArgs);
216 void opCloseEOFillStroke(Object args[], int numArgs);
217 void doFillAndStroke(GBool eoFill);
218 void doPatternFillFallback(GBool eoFill);
219 void doPatternStrokeFallback();
220 void doShadingPatternFillFallback(GfxShadingPattern *sPat,
221 GBool stroke, GBool eoFill);
222 void opShFill(Object args[], int numArgs);
223 void doFunctionShFill(GfxFunctionShading *shading);
224 void doFunctionShFill1(GfxFunctionShading *shading,
225 double x0, double y0,
226 double x1, double y1,
227 GfxColor *colors, int depth);
228 void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading);
229 void gouraudFillTriangle(double x0, double y0, GfxColor *color0,
230 double x1, double y1, GfxColor *color1,
231 double x2, double y2, GfxColor *color2,
232 int nComps, int depth);
233 void doPatchMeshShFill(GfxPatchMeshShading *shading);
234 void fillPatch(GfxPatch *patch, int nComps, int depth);
235 void doEndPath();
237 // path clipping operators
238 void opClip(Object args[], int numArgs);
239 void opEOClip(Object args[], int numArgs);
241 // text object operators
242 void opBeginText(Object args[], int numArgs);
243 void opEndText(Object args[], int numArgs);
245 // text state operators
246 void opSetCharSpacing(Object args[], int numArgs);
247 void opSetFont(Object args[], int numArgs);
248 void opSetTextLeading(Object args[], int numArgs);
249 void opSetTextRender(Object args[], int numArgs);
250 void opSetTextRise(Object args[], int numArgs);
251 void opSetWordSpacing(Object args[], int numArgs);
252 void opSetHorizScaling(Object args[], int numArgs);
254 // text positioning operators
255 void opTextMove(Object args[], int numArgs);
256 void opTextMoveSet(Object args[], int numArgs);
257 void opSetTextMatrix(Object args[], int numArgs);
258 void opTextNextLine(Object args[], int numArgs);
260 // text string operators
261 void opShowText(Object args[], int numArgs);
262 void opMoveShowText(Object args[], int numArgs);
263 void opMoveSetShowText(Object args[], int numArgs);
264 void opShowSpaceText(Object args[], int numArgs);
265 void doShowText(GooString *s);
267 // XObject operators
268 void opXObject(Object args[], int numArgs);
269 void doImage(Object *ref, Stream *str, GBool inlineImg);
270 void doForm(Object *str);
271 void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox,
272 GBool transpGroup = gFalse, GBool softMask = gFalse,
273 GfxColorSpace *blendingColorSpace = NULL,
274 GBool isolated = gFalse, GBool knockout = gFalse,
275 GBool alpha = gFalse, Function *transferFunc = NULL,
276 GfxColor *backdropColor = NULL);
278 // in-line image operators
279 void opBeginImage(Object args[], int numArgs);
280 Stream *buildImageStream();
281 void opImageData(Object args[], int numArgs);
282 void opEndImage(Object args[], int numArgs);
284 // type 3 font operators
285 void opSetCharWidth(Object args[], int numArgs);
286 void opSetCacheDevice(Object args[], int numArgs);
288 // compatibility operators
289 void opBeginIgnoreUndef(Object args[], int numArgs);
290 void opEndIgnoreUndef(Object args[], int numArgs);
292 // marked content operators
293 void opBeginMarkedContent(Object args[], int numArgs);
294 void opEndMarkedContent(Object args[], int numArgs);
295 void opMarkPoint(Object args[], int numArgs);
297 void pushResources(Dict *resDict);
298 void popResources();
299 };
301 #endif /* HAVE_POPPLER */
303 #endif /* PDF_PARSER_H */