]>
Commit | Line | Data |
---|---|---|
ef416fc2 | 1 | //======================================================================== |
2 | // | |
3 | // Gfx.h | |
4 | // | |
5 | // Copyright 1996-2003 Glyph & Cog, LLC | |
6 | // | |
7 | //======================================================================== | |
8 | ||
9 | #ifndef GFX_H | |
10 | #define GFX_H | |
11 | ||
12 | #include <config.h> | |
13 | ||
14 | #ifdef USE_GCC_PRAGMAS | |
15 | #pragma interface | |
16 | #endif | |
17 | ||
18 | #include "gtypes.h" | |
19 | ||
20 | class GString; | |
21 | class XRef; | |
22 | class Array; | |
23 | class Stream; | |
24 | class Parser; | |
25 | class Dict; | |
26 | class OutputDev; | |
27 | class GfxFontDict; | |
28 | class GfxFont; | |
29 | class GfxPattern; | |
30 | class GfxTilingPattern; | |
31 | class GfxShadingPattern; | |
32 | class GfxShading; | |
33 | class GfxFunctionShading; | |
34 | class GfxAxialShading; | |
35 | class GfxRadialShading; | |
36 | class GfxGouraudTriangleShading; | |
37 | class GfxPatchMeshShading; | |
38 | struct GfxPatch; | |
39 | class GfxState; | |
40 | struct GfxColor; | |
41 | class Gfx; | |
42 | class PDFRectangle; | |
43 | ||
44 | //------------------------------------------------------------------------ | |
45 | // Gfx | |
46 | //------------------------------------------------------------------------ | |
47 | ||
48 | enum GfxClipType { | |
49 | clipNone, | |
50 | clipNormal, | |
51 | clipEO | |
52 | }; | |
53 | ||
54 | enum TchkType { | |
55 | tchkBool, // boolean | |
56 | tchkInt, // integer | |
57 | tchkNum, // number (integer or real) | |
58 | tchkString, // string | |
59 | tchkName, // name | |
60 | tchkArray, // array | |
61 | tchkProps, // properties (dictionary or name) | |
62 | tchkSCN, // scn/SCN args (number of name) | |
63 | tchkNone // used to avoid empty initializer lists | |
64 | }; | |
65 | ||
66 | #define maxArgs 8 | |
67 | ||
68 | struct Operator { | |
69 | char name[4]; | |
70 | int numArgs; | |
71 | TchkType tchk[maxArgs]; | |
72 | void (Gfx::*func)(Object args[], int numArgs); | |
73 | }; | |
74 | ||
75 | class GfxResources { | |
76 | public: | |
77 | ||
78 | GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA); | |
79 | ~GfxResources(); | |
80 | ||
81 | GfxFont *lookupFont(char *name); | |
82 | GBool lookupXObject(char *name, Object *obj); | |
83 | GBool lookupXObjectNF(char *name, Object *obj); | |
84 | void lookupColorSpace(char *name, Object *obj); | |
85 | GfxPattern *lookupPattern(char *name); | |
86 | GfxShading *lookupShading(char *name); | |
87 | GBool lookupGState(char *name, Object *obj); | |
88 | ||
89 | GfxResources *getNext() { return next; } | |
90 | ||
91 | private: | |
92 | ||
93 | GfxFontDict *fonts; | |
94 | Object xObjDict; | |
95 | Object colorSpaceDict; | |
96 | Object patternDict; | |
97 | Object shadingDict; | |
98 | Object gStateDict; | |
99 | GfxResources *next; | |
100 | }; | |
101 | ||
102 | class Gfx { | |
103 | public: | |
104 | ||
105 | // Constructor for regular output. | |
106 | Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, | |
107 | double hDPI, double vDPI, PDFRectangle *box, | |
108 | PDFRectangle *cropBox, int rotate, | |
109 | GBool (*abortCheckCbkA)(void *data) = NULL, | |
110 | void *abortCheckCbkDataA = NULL); | |
111 | ||
112 | // Constructor for a sub-page object. | |
113 | Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, | |
114 | PDFRectangle *box, PDFRectangle *cropBox, | |
115 | GBool (*abortCheckCbkA)(void *data) = NULL, | |
116 | void *abortCheckCbkDataA = NULL); | |
117 | ||
118 | ~Gfx(); | |
119 | ||
120 | // Interpret a stream or array of streams. | |
121 | void display(Object *obj, GBool topLevel = gTrue); | |
122 | ||
123 | // Display an annotation, given its appearance (a Form XObject) and | |
124 | // bounding box (in default user space). | |
125 | void doAnnot(Object *str, double xMin, double yMin, | |
126 | double xMax, double yMax); | |
127 | ||
128 | // Save graphics state. | |
129 | void saveState(); | |
130 | ||
131 | // Restore graphics state. | |
132 | void restoreState(); | |
133 | ||
134 | // Get the current graphics state object. | |
135 | GfxState *getState() { return state; } | |
136 | ||
137 | private: | |
138 | ||
139 | XRef *xref; // the xref table for this PDF file | |
140 | OutputDev *out; // output device | |
141 | GBool subPage; // is this a sub-page object? | |
142 | GBool printCommands; // print the drawing commands (for debugging) | |
143 | GfxResources *res; // resource stack | |
144 | int updateLevel; | |
145 | ||
146 | GfxState *state; // current graphics state | |
147 | GBool fontChanged; // set if font or text matrix has changed | |
148 | GfxClipType clip; // do a clip? | |
149 | int ignoreUndef; // current BX/EX nesting level | |
150 | double baseMatrix[6]; // default matrix for most recent | |
151 | // page/form/pattern | |
152 | int formDepth; | |
153 | ||
154 | Parser *parser; // parser for page content stream(s) | |
155 | ||
156 | GBool // callback to check for an abort | |
157 | (*abortCheckCbk)(void *data); | |
158 | void *abortCheckCbkData; | |
159 | GBool renderThisPage; // Render this page? | |
160 | ||
161 | static Operator opTab[]; // table of operators | |
162 | ||
163 | void go(GBool topLevel); | |
164 | void execOp(Object *cmd, Object args[], int numArgs); | |
165 | Operator *findOp(char *name); | |
166 | GBool checkArg(Object *arg, TchkType type); | |
167 | int getPos(); | |
168 | ||
169 | // graphics state operators | |
170 | void opSave(Object args[], int numArgs); | |
171 | void opRestore(Object args[], int numArgs); | |
172 | void opConcat(Object args[], int numArgs); | |
173 | void opSetDash(Object args[], int numArgs); | |
174 | void opSetFlat(Object args[], int numArgs); | |
175 | void opSetLineJoin(Object args[], int numArgs); | |
176 | void opSetLineCap(Object args[], int numArgs); | |
177 | void opSetMiterLimit(Object args[], int numArgs); | |
178 | void opSetLineWidth(Object args[], int numArgs); | |
179 | void opSetExtGState(Object args[], int numArgs); | |
180 | void opSetRenderingIntent(Object args[], int numArgs); | |
181 | ||
182 | // color operators | |
183 | void opSetFillGray(Object args[], int numArgs); | |
184 | void opSetStrokeGray(Object args[], int numArgs); | |
185 | void opSetFillCMYKColor(Object args[], int numArgs); | |
186 | void opSetStrokeCMYKColor(Object args[], int numArgs); | |
187 | void opSetFillRGBColor(Object args[], int numArgs); | |
188 | void opSetStrokeRGBColor(Object args[], int numArgs); | |
189 | void opSetFillColorSpace(Object args[], int numArgs); | |
190 | void opSetStrokeColorSpace(Object args[], int numArgs); | |
191 | void opSetFillColor(Object args[], int numArgs); | |
192 | void opSetStrokeColor(Object args[], int numArgs); | |
193 | void opSetFillColorN(Object args[], int numArgs); | |
194 | void opSetStrokeColorN(Object args[], int numArgs); | |
195 | ||
196 | // path segment operators | |
197 | void opMoveTo(Object args[], int numArgs); | |
198 | void opLineTo(Object args[], int numArgs); | |
199 | void opCurveTo(Object args[], int numArgs); | |
200 | void opCurveTo1(Object args[], int numArgs); | |
201 | void opCurveTo2(Object args[], int numArgs); | |
202 | void opRectangle(Object args[], int numArgs); | |
203 | void opClosePath(Object args[], int numArgs); | |
204 | ||
205 | // path painting operators | |
206 | void opEndPath(Object args[], int numArgs); | |
207 | void opStroke(Object args[], int numArgs); | |
208 | void opCloseStroke(Object args[], int numArgs); | |
209 | void opFill(Object args[], int numArgs); | |
210 | void opEOFill(Object args[], int numArgs); | |
211 | void opFillStroke(Object args[], int numArgs); | |
212 | void opCloseFillStroke(Object args[], int numArgs); | |
213 | void opEOFillStroke(Object args[], int numArgs); | |
214 | void opCloseEOFillStroke(Object args[], int numArgs); | |
215 | void doPatternFill(GBool eoFill); | |
216 | void doTilingPatternFill(GfxTilingPattern *tPat, GBool eoFill); | |
217 | void doShadingPatternFill(GfxShadingPattern *sPat, GBool eoFill); | |
218 | void opShFill(Object args[], int numArgs); | |
219 | void doFunctionShFill(GfxFunctionShading *shading); | |
220 | void doFunctionShFill1(GfxFunctionShading *shading, | |
221 | double x0, double y0, | |
222 | double x1, double y1, | |
223 | GfxColor *colors, int depth); | |
224 | void doAxialShFill(GfxAxialShading *shading); | |
225 | void doRadialShFill(GfxRadialShading *shading); | |
226 | void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading); | |
227 | void gouraudFillTriangle(double x0, double y0, GfxColor *color0, | |
228 | double x1, double y1, GfxColor *color1, | |
229 | double x2, double y2, GfxColor *color2, | |
230 | int nComps, int depth); | |
231 | void doPatchMeshShFill(GfxPatchMeshShading *shading); | |
232 | void fillPatch(GfxPatch *patch, int nComps, int depth); | |
233 | void doEndPath(); | |
234 | ||
235 | // path clipping operators | |
236 | void opClip(Object args[], int numArgs); | |
237 | void opEOClip(Object args[], int numArgs); | |
238 | ||
239 | // text object operators | |
240 | void opBeginText(Object args[], int numArgs); | |
241 | void opEndText(Object args[], int numArgs); | |
242 | ||
243 | // text state operators | |
244 | void opSetCharSpacing(Object args[], int numArgs); | |
245 | void opSetFont(Object args[], int numArgs); | |
246 | void opSetTextLeading(Object args[], int numArgs); | |
247 | void opSetTextRender(Object args[], int numArgs); | |
248 | void opSetTextRise(Object args[], int numArgs); | |
249 | void opSetWordSpacing(Object args[], int numArgs); | |
250 | void opSetHorizScaling(Object args[], int numArgs); | |
251 | ||
252 | // text positioning operators | |
253 | void opTextMove(Object args[], int numArgs); | |
254 | void opTextMoveSet(Object args[], int numArgs); | |
255 | void opSetTextMatrix(Object args[], int numArgs); | |
256 | void opTextNextLine(Object args[], int numArgs); | |
257 | ||
258 | // text string operators | |
259 | void opShowText(Object args[], int numArgs); | |
260 | void opMoveShowText(Object args[], int numArgs); | |
261 | void opMoveSetShowText(Object args[], int numArgs); | |
262 | void opShowSpaceText(Object args[], int numArgs); | |
263 | void doShowText(GString *s); | |
264 | ||
265 | // XObject operators | |
266 | void opXObject(Object args[], int numArgs); | |
267 | void doImage(Object *ref, Stream *str, GBool inlineImg); | |
268 | void doForm(Object *str); | |
269 | void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox); | |
270 | ||
271 | // in-line image operators | |
272 | void opBeginImage(Object args[], int numArgs); | |
273 | Stream *buildImageStream(); | |
274 | void opImageData(Object args[], int numArgs); | |
275 | void opEndImage(Object args[], int numArgs); | |
276 | ||
277 | // type 3 font operators | |
278 | void opSetCharWidth(Object args[], int numArgs); | |
279 | void opSetCacheDevice(Object args[], int numArgs); | |
280 | ||
281 | // compatibility operators | |
282 | void opBeginIgnoreUndef(Object args[], int numArgs); | |
283 | void opEndIgnoreUndef(Object args[], int numArgs); | |
284 | ||
285 | // marked content operators | |
286 | void opBeginMarkedContent(Object args[], int numArgs); | |
287 | void opEndMarkedContent(Object args[], int numArgs); | |
288 | void opMarkPoint(Object args[], int numArgs); | |
289 | ||
290 | void pushResources(Dict *resDict); | |
291 | void popResources(); | |
292 | }; | |
293 | ||
294 | #endif |