-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathGfx.h
373 lines (317 loc) · 14 KB
/
Gfx.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
//========================================================================
//
// Gfx.h
//
// Copyright 1996-2003 Glyph & Cog, LLC
//
//========================================================================
//========================================================================
//
// Modified under the Poppler project - http://poppler.freedesktop.org
//
// All changes made under the Poppler project to this file are licensed
// under GPL version 2 or later
//
// Copyright (C) 2005 Jonathan Blandford <[email protected]>
// Copyright (C) 2007 Iñigo Martínez <[email protected]>
// Copyright (C) 2008 Brad Hards <[email protected]>
// Copyright (C) 2008, 2010 Carlos Garcia Campos <[email protected]>
// Copyright (C) 2009-2013, 2017, 2018, 2021, 2024 Albert Astals Cid <[email protected]>
// Copyright (C) 2009, 2010, 2012, 2013 Thomas Freitag <[email protected]>
// Copyright (C) 2010 David Benjamin <[email protected]>
// Copyright (C) 2010 Christian Feuersänger <[email protected]>
// Copyright (C) 2013 Fabio D'Urso <[email protected]>
// Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich
// Copyright (C) 2018 Adam Reichold <[email protected]>
// Copyright (C) 2019, 2022, 2024 Oliver Sander <[email protected]>
// Copyright (C) 2019 Volker Krause <[email protected]>
//
// To see a description of the changes please see the Changelog file that
// came with your tarball or type make ChangeLog if you are building from git
//
//========================================================================
#ifndef GFX_H
#define GFX_H
#include "poppler-config.h"
#include "poppler_private_export.h"
#include "GfxState.h"
#include "Object.h"
#include "PopplerCache.h"
#include <vector>
class GooString;
class PDFDoc;
class XRef;
class Array;
class Stream;
class Parser;
class Dict;
class Function;
class OutputDev;
class GfxFontDict;
class GfxFont;
class GfxPattern;
class GfxTilingPattern;
class GfxShadingPattern;
class GfxShading;
class GfxFunctionShading;
class GfxAxialShading;
class GfxRadialShading;
class GfxGouraudTriangleShading;
class GfxPatchMeshShading;
struct GfxPatch;
class GfxState;
struct GfxColor;
class GfxColorSpace;
class Gfx;
class PDFRectangle;
class AnnotBorder;
class AnnotColor;
class Catalog;
struct MarkedContentStack;
//------------------------------------------------------------------------
enum GfxClipType
{
clipNone,
clipNormal,
clipEO
};
enum TchkType
{
tchkBool, // boolean
tchkInt, // integer
tchkNum, // number (integer or real)
tchkString, // string
tchkName, // name
tchkArray, // array
tchkProps, // properties (dictionary or name)
tchkSCN, // scn/SCN args (number of name)
tchkNone // used to avoid empty initializer lists
};
#define maxArgs 33
struct Operator
{
char name[4];
int numArgs;
TchkType tchk[maxArgs];
void (Gfx::*func)(Object args[], int numArgs);
};
//------------------------------------------------------------------------
class POPPLER_PRIVATE_EXPORT GfxResources
{
public:
GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA);
~GfxResources();
GfxResources(const GfxResources &) = delete;
GfxResources &operator=(const GfxResources &other) = delete;
std::shared_ptr<GfxFont> lookupFont(const char *name);
std::shared_ptr<const GfxFont> lookupFont(const char *name) const;
Object lookupXObject(const char *name);
Object lookupXObjectNF(const char *name);
Object lookupMarkedContentNF(const char *name);
Object lookupColorSpace(const char *name);
std::unique_ptr<GfxPattern> lookupPattern(const char *name, OutputDev *out, GfxState *state);
std::unique_ptr<GfxShading> lookupShading(const char *name, OutputDev *out, GfxState *state);
Object lookupGState(const char *name);
Object lookupGStateNF(const char *name);
GfxResources *getNext() const { return next; }
private:
std::shared_ptr<GfxFont> doLookupFont(const char *name) const;
std::unique_ptr<GfxFontDict> fonts;
Object xObjDict;
Object colorSpaceDict;
Object patternDict;
Object shadingDict;
Object gStateDict;
PopplerCache<Ref, Object> gStateCache;
XRef *xref;
Object propertiesDict;
GfxResources *next;
};
//------------------------------------------------------------------------
// Gfx
//------------------------------------------------------------------------
class POPPLER_PRIVATE_EXPORT Gfx
{
public:
// Constructor for regular output.
Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict, double hDPI, double vDPI, const PDFRectangle *box, const PDFRectangle *cropBox, int rotate, bool (*abortCheckCbkA)(void *data) = nullptr, void *abortCheckCbkDataA = nullptr,
XRef *xrefA = nullptr);
// Constructor for a sub-page object.
Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict, const PDFRectangle *box, const PDFRectangle *cropBox, bool (*abortCheckCbkA)(void *data) = nullptr, void *abortCheckCbkDataA = nullptr, Gfx *gfxA = nullptr);
#ifdef USE_CMS
void initDisplayProfile();
#endif
~Gfx();
Gfx(const Gfx &) = delete;
Gfx &operator=(const Gfx &other) = delete;
XRef *getXRef() { return xref; }
// Interpret a stream or array of streams.
void display(Object *obj, bool topLevel = true);
// Display an annotation, given its appearance (a Form XObject),
// border style, and bounding box (in default user space).
void drawAnnot(Object *str, AnnotBorder *border, AnnotColor *aColor, double xMin, double yMin, double xMax, double yMax, int rotate);
// Save graphics state.
void saveState();
// Push a new state guard
void pushStateGuard();
// Restore graphics state.
void restoreState();
// Pop to state guard and pop guard
void popStateGuard();
// Get the current graphics state object.
GfxState *getState() { return state; }
bool checkTransparencyGroup(Dict *resDict);
void drawForm(Object *str, Dict *resDict, const double *matrix, const double *bbox, bool transpGroup = false, bool softMask = false, GfxColorSpace *blendingColorSpace = nullptr, bool isolated = false, bool knockout = false,
bool alpha = false, Function *transferFunc = nullptr, GfxColor *backdropColor = nullptr);
void pushResources(Dict *resDict);
void popResources();
private:
PDFDoc *doc;
XRef *xref; // the xref table for this PDF file
Catalog *catalog; // the Catalog for this PDF file
OutputDev *out; // output device
bool subPage; // is this a sub-page object?
const bool printCommands; // print the drawing commands (for debugging)
const bool profileCommands; // profile the drawing commands (for debugging)
bool commandAborted; // did the previous command abort the drawing?
GfxResources *res; // resource stack
int updateLevel;
GfxState *state; // current graphics state
int stackHeight; // the height of the current graphics stack
std::vector<int> stateGuards; // a stack of state limits; to guard against unmatched pops
bool fontChanged; // set if font or text matrix has changed
GfxClipType clip; // do a clip?
int ignoreUndef; // current BX/EX nesting level
double baseMatrix[6]; // default matrix for most recent
// page/form/pattern
int displayDepth;
bool ocState; // true if drawing is enabled, false if
// disabled
MarkedContentStack *mcStack; // current BMC/EMC stack
Parser *parser; // parser for page content stream(s)
std::set<int> formsDrawing; // the forms/patterns that are being drawn
std::set<int> charProcDrawing; // the charProc that are being drawn
bool // callback to check for an abort
(*abortCheckCbk)(void *data);
void *abortCheckCbkData;
static const Operator opTab[]; // table of operators
void go(bool topLevel);
void execOp(Object *cmd, Object args[], int numArgs);
const Operator *findOp(const char *name);
bool checkArg(Object *arg, TchkType type);
Goffset getPos();
int bottomGuard();
// graphics state operators
void opSave(Object args[], int numArgs);
void opRestore(Object args[], int numArgs);
void opConcat(Object args[], int numArgs);
void opSetDash(Object args[], int numArgs);
void opSetFlat(Object args[], int numArgs);
void opSetLineJoin(Object args[], int numArgs);
void opSetLineCap(Object args[], int numArgs);
void opSetMiterLimit(Object args[], int numArgs);
void opSetLineWidth(Object args[], int numArgs);
void opSetExtGState(Object args[], int numArgs);
void doSoftMask(Object *str, bool alpha, GfxColorSpace *blendingColorSpace, bool isolated, bool knockout, Function *transferFunc, GfxColor *backdropColor);
void opSetRenderingIntent(Object args[], int numArgs);
// color operators
void opSetFillGray(Object args[], int numArgs);
void opSetStrokeGray(Object args[], int numArgs);
void opSetFillCMYKColor(Object args[], int numArgs);
void opSetStrokeCMYKColor(Object args[], int numArgs);
void opSetFillRGBColor(Object args[], int numArgs);
void opSetStrokeRGBColor(Object args[], int numArgs);
void opSetFillColorSpace(Object args[], int numArgs);
void opSetStrokeColorSpace(Object args[], int numArgs);
void opSetFillColor(Object args[], int numArgs);
void opSetStrokeColor(Object args[], int numArgs);
void opSetFillColorN(Object args[], int numArgs);
void opSetStrokeColorN(Object args[], int numArgs);
// path segment operators
void opMoveTo(Object args[], int numArgs);
void opLineTo(Object args[], int numArgs);
void opCurveTo(Object args[], int numArgs);
void opCurveTo1(Object args[], int numArgs);
void opCurveTo2(Object args[], int numArgs);
void opRectangle(Object args[], int numArgs);
void opClosePath(Object args[], int numArgs);
// path painting operators
void opEndPath(Object args[], int numArgs);
void opStroke(Object args[], int numArgs);
void opCloseStroke(Object args[], int numArgs);
void opFill(Object args[], int numArgs);
void opEOFill(Object args[], int numArgs);
void opFillStroke(Object args[], int numArgs);
void opCloseFillStroke(Object args[], int numArgs);
void opEOFillStroke(Object args[], int numArgs);
void opCloseEOFillStroke(Object args[], int numArgs);
void doPatternFill(bool eoFill);
void doPatternStroke();
void doPatternText();
void doPatternImageMask(Object *ref, Stream *str, int width, int height, bool invert, bool inlineImg);
void doTilingPatternFill(GfxTilingPattern *tPat, bool stroke, bool eoFill, bool text);
void doShadingPatternFill(GfxShadingPattern *sPat, bool stroke, bool eoFill, bool text);
void opShFill(Object args[], int numArgs);
void doFunctionShFill(GfxFunctionShading *shading);
void doFunctionShFill1(GfxFunctionShading *shading, double x0, double y0, double x1, double y1, GfxColor *colors, int depth);
void doAxialShFill(GfxAxialShading *shading);
void doRadialShFill(GfxRadialShading *shading);
void doGouraudTriangleShFill(GfxGouraudTriangleShading *shading);
void gouraudFillTriangle(double x0, double y0, GfxColor *color0, double x1, double y1, GfxColor *color1, double x2, double y2, GfxColor *color2, int nComps, int depth, GfxState::ReusablePathIterator *path);
void gouraudFillTriangle(double x0, double y0, double color0, double x1, double y1, double color1, double x2, double y2, double color2, double refineColorThreshold, int depth, GfxGouraudTriangleShading *shading,
GfxState::ReusablePathIterator *path);
void doPatchMeshShFill(GfxPatchMeshShading *shading);
void fillPatch(const GfxPatch *patch, int colorComps, int patchColorComps, double refineColorThreshold, int depth, const GfxPatchMeshShading *shading);
void doEndPath();
// path clipping operators
void opClip(Object args[], int numArgs);
void opEOClip(Object args[], int numArgs);
// text object operators
void opBeginText(Object args[], int numArgs);
void opEndText(Object args[], int numArgs);
// text state operators
void opSetCharSpacing(Object args[], int numArgs);
void opSetFont(Object args[], int numArgs);
void opSetTextLeading(Object args[], int numArgs);
void opSetTextRender(Object args[], int numArgs);
void opSetTextRise(Object args[], int numArgs);
void opSetWordSpacing(Object args[], int numArgs);
void opSetHorizScaling(Object args[], int numArgs);
// text positioning operators
void opTextMove(Object args[], int numArgs);
void opTextMoveSet(Object args[], int numArgs);
void opSetTextMatrix(Object args[], int numArgs);
void opTextNextLine(Object args[], int numArgs);
// text string operators
void opShowText(Object args[], int numArgs);
void opMoveShowText(Object args[], int numArgs);
void opMoveSetShowText(Object args[], int numArgs);
void opShowSpaceText(Object args[], int numArgs);
void doShowText(const GooString *s);
void doIncCharCount(const GooString *s);
// XObject operators
void opXObject(Object args[], int numArgs);
void doImage(Object *ref, Stream *str, bool inlineImg);
void doForm(Object *str);
// in-line image operators
void opBeginImage(Object args[], int numArgs);
Stream *buildImageStream();
void opImageData(Object args[], int numArgs);
void opEndImage(Object args[], int numArgs);
// type 3 font operators
void opSetCharWidth(Object args[], int numArgs);
void opSetCacheDevice(Object args[], int numArgs);
// compatibility operators
void opBeginIgnoreUndef(Object args[], int numArgs);
void opEndIgnoreUndef(Object args[], int numArgs);
// marked content operators
void opBeginMarkedContent(Object args[], int numArgs);
void opEndMarkedContent(Object args[], int numArgs);
void opMarkPoint(Object args[], int numArgs);
GfxState *saveStateStack();
void restoreStateStack(GfxState *oldState);
bool contentIsHidden();
void pushMarkedContent();
void popMarkedContent();
};
#endif