Code

Initial commit of native poppler-based PDF import.
[inkscape.git] / src / extension / internal / pdfinput / pdf-parser.h
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 */