source: trunk/poppler/mypoppler/poppler/PSOutputDev.h @ 257

Last change on this file since 257 was 257, checked in by Eugene Romanenko, 13 years ago

PDF plugin: Poppler library updated to version 0.10.0

File size: 15.8 KB
Line 
1//========================================================================
2//
3// PSOutputDev.h
4//
5// Copyright 1996-2003 Glyph & Cog, LLC
6//
7//========================================================================
8
9//========================================================================
10//
11// Modified under the Poppler project - http://poppler.freedesktop.org
12//
13// All changes made under the Poppler project to this file are licensed
14// under GPL version 2 or later
15//
16// Copyright (C) 2005 Martin Kretzschmar <martink@gnome.org>
17// Copyright (C) 2005 Kristian HÞgsberg <krh@redhat.com>
18// Copyright (C) 2006, 2007 Albert Astals Cid <aacid@kde.org>
19// Copyright (C) 2007 Brad Hards <bradh@kde.org>
20//
21// To see a description of the changes please see the Changelog file that
22// came with your tarball or type make ChangeLog if you are building from git
23//
24//========================================================================
25
26#ifndef PSOUTPUTDEV_H
27#define PSOUTPUTDEV_H
28
29#ifdef USE_GCC_PRAGMAS
30#pragma interface
31#endif
32
33#include <poppler-config.h>
34#include <stddef.h>
35#include "Object.h"
36#include "GlobalParams.h"
37#include "OutputDev.h"
38
39class GfxPath;
40class GfxFont;
41class GfxColorSpace;
42class GfxSeparationColorSpace;
43class PDFRectangle;
44struct PSFont8Info;
45struct PSFont16Enc;
46class PSOutCustomColor;
47class Function;
48
49//------------------------------------------------------------------------
50// PSOutputDev
51//------------------------------------------------------------------------
52
53enum PSOutMode {
54  psModePS,
55  psModeEPS,
56  psModeForm
57};
58
59enum PSFileType {
60  psFile,                       // write to file
61  psPipe,                       // write to pipe
62  psStdout,                     // write to stdout
63  psGeneric                     // write to a generic stream
64};
65
66typedef void (*PSOutputFunc)(void *stream, char *data, int len);
67
68class PSOutputDev: public OutputDev {
69public:
70
71  // Open a PostScript output file, and write the prolog.
72  PSOutputDev(const char *fileName, XRef *xrefA, Catalog *catalog,
73              char *psTitle,
74              int firstPage, int lastPage, PSOutMode modeA,
75              int paperWidthA = -1, int paperHeightA = -1,
76              GBool duplexA = gTrue,
77              int imgLLXA = 0, int imgLLYA = 0,
78              int imgURXA = 0, int imgURYA = 0,
79              GBool forceRasterizeA = gFalse,
80              GBool manualCtrlA = gFalse);
81
82  // Open a PSOutputDev that will write to a generic stream.
83  PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
84              char *psTitle,
85              XRef *xrefA, Catalog *catalog,
86              int firstPage, int lastPage, PSOutMode modeA,
87              int paperWidthA = -1, int paperHeightA = -1,
88              GBool duplexA = gTrue,
89              int imgLLXA = 0, int imgLLYA = 0,
90              int imgURXA = 0, int imgURYA = 0,
91              GBool forceRasterizeA = gFalse,
92              GBool manualCtrlA = gFalse);
93
94  // Destructor -- writes the trailer and closes the file.
95  virtual ~PSOutputDev();
96
97  // Check if file was successfully created.
98  virtual GBool isOk() { return ok; }
99
100  //---- get info about output device
101
102  // Does this device use upside-down coordinates?
103  // (Upside-down means (0,0) is the top left corner of the page.)
104  virtual GBool upsideDown() { return gFalse; }
105
106  // Does this device use drawChar() or drawString()?
107  virtual GBool useDrawChar() { return gFalse; }
108
109  // Does this device use tilingPatternFill()?  If this returns false,
110  // tiling pattern fills will be reduced to a series of other drawing
111  // operations.
112  virtual GBool useTilingPatternFill() { return gTrue; }
113
114  // Does this device use functionShadedFill(), axialShadedFill(), and
115  // radialShadedFill()?  If this returns false, these shaded fills
116  // will be reduced to a series of other drawing operations.
117  virtual GBool useShadedFills()
118    { return level >= psLevel2; }
119
120  // Does this device use drawForm()?  If this returns false,
121  // form-type XObjects will be interpreted (i.e., unrolled).
122  virtual GBool useDrawForm() { return preload; }
123
124  // Does this device use beginType3Char/endType3Char?  Otherwise,
125  // text in Type 3 fonts will be drawn with drawChar/drawString.
126  virtual GBool interpretType3Chars() { return gFalse; }
127
128  //----- header/trailer (used only if manualCtrl is true)
129
130  // Write the document-level header.
131  void writeHeader(int firstPage, int lastPage,
132                   PDFRectangle *mediaBox, PDFRectangle *cropBox,
133                   int pageRotate, char *pstitle);
134
135  // Write the Xpdf procset.
136  void writeXpdfProcset();
137
138  // Write the document-level setup.
139  void writeDocSetup(Catalog *catalog, int firstPage, int lastPage, GBool duplexA);
140
141  // Write the trailer for the current page.
142  void writePageTrailer();
143
144  // Write the document trailer.
145  void writeTrailer();
146
147  //----- initialization and control
148
149  // Check to see if a page slice should be displayed.  If this
150  // returns false, the page display is aborted.  Typically, an
151  // OutputDev will use some alternate means to display the page
152  // before returning false.
153  virtual GBool checkPageSlice(Page *page, double hDPI, double vDPI,
154                               int rotate, GBool useMediaBox, GBool crop,
155                               int sliceX, int sliceY, int sliceW, int sliceH,
156                               GBool printing, Catalog *catalog,
157                               GBool (*abortCheckCbk)(void *data) = NULL,
158                               void *abortCheckCbkData = NULL);
159
160  // Start a page.
161  virtual void startPage(int pageNum, GfxState *state);
162
163  // End a page.
164  virtual void endPage();
165
166  //----- save/restore graphics state
167  virtual void saveState(GfxState *state);
168  virtual void restoreState(GfxState *state);
169
170  //----- update graphics state
171  virtual void updateCTM(GfxState *state, double m11, double m12,
172                         double m21, double m22, double m31, double m32);
173  virtual void updateLineDash(GfxState *state);
174  virtual void updateFlatness(GfxState *state);
175  virtual void updateLineJoin(GfxState *state);
176  virtual void updateLineCap(GfxState *state);
177  virtual void updateMiterLimit(GfxState *state);
178  virtual void updateLineWidth(GfxState *state);
179  virtual void updateFillColorSpace(GfxState *state);
180  virtual void updateStrokeColorSpace(GfxState *state);
181  virtual void updateFillColor(GfxState *state);
182  virtual void updateStrokeColor(GfxState *state);
183  virtual void updateFillOverprint(GfxState *state);
184  virtual void updateStrokeOverprint(GfxState *state);
185  virtual void updateTransfer(GfxState *state);
186
187  //----- update text state
188  virtual void updateFont(GfxState *state);
189  virtual void updateTextMat(GfxState *state);
190  virtual void updateCharSpace(GfxState *state);
191  virtual void updateRender(GfxState *state);
192  virtual void updateRise(GfxState *state);
193  virtual void updateWordSpace(GfxState *state);
194  virtual void updateHorizScaling(GfxState *state);
195  virtual void updateTextPos(GfxState *state);
196  virtual void updateTextShift(GfxState *state, double shift);
197
198  //----- path painting
199  virtual void stroke(GfxState *state);
200  virtual void fill(GfxState *state);
201  virtual void eoFill(GfxState *state);
202  virtual void tilingPatternFill(GfxState *state, Object *str,
203                                 int paintType, Dict *resDict,
204                                 double *mat, double *bbox,
205                                 int x0, int y0, int x1, int y1,
206                                 double xStep, double yStep);
207  virtual GBool functionShadedFill(GfxState *state,
208                                   GfxFunctionShading *shading);
209  virtual GBool axialShadedFill(GfxState *state, GfxAxialShading *shading);
210  virtual GBool radialShadedFill(GfxState *state, GfxRadialShading *shading);
211
212  //----- path clipping
213  virtual void clip(GfxState *state);
214  virtual void eoClip(GfxState *state);
215  virtual void clipToStrokePath(GfxState *state);
216
217  //----- text drawing
218  virtual void drawString(GfxState *state, GooString *s);
219  virtual void endTextObject(GfxState *state);
220
221  //----- image drawing
222  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
223                             int width, int height, GBool invert,
224                             GBool inlineImg);
225  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
226                         int width, int height, GfxImageColorMap *colorMap,
227                         int *maskColors, GBool inlineImg);
228  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
229                               int width, int height,
230                               GfxImageColorMap *colorMap,
231                               Stream *maskStr, int maskWidth, int maskHeight,
232                               GBool maskInvert);
233
234#if OPI_SUPPORT
235  //----- OPI functions
236  virtual void opiBegin(GfxState *state, Dict *opiDict);
237  virtual void opiEnd(GfxState *state, Dict *opiDict);
238#endif
239
240  //----- Type 3 font operators
241  virtual void type3D0(GfxState *state, double wx, double wy);
242  virtual void type3D1(GfxState *state, double wx, double wy,
243                       double llx, double lly, double urx, double ury);
244
245  //----- form XObjects
246  virtual void drawForm(Ref ref);
247
248  //----- PostScript XObjects
249  virtual void psXObject(Stream *psStream, Stream *level1Stream);
250
251  //----- miscellaneous
252  void setOffset(double x, double y)
253    { tx0 = x; ty0 = y; }
254  void setScale(double x, double y)
255    { xScale0 = x; yScale0 = y; }
256  void setRotate(int rotateA)
257    { rotate0 = rotateA; }
258  void setClip(double llx, double lly, double urx, double ury)
259    { clipLLX0 = llx; clipLLY0 = lly; clipURX0 = urx; clipURY0 = ury; }
260  void setUnderlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
261                      void *data)
262    { underlayCbk = cbk; underlayCbkData = data; }
263  void setOverlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
264                     void *data)
265    { overlayCbk = cbk; overlayCbkData = data; }
266  void setDisplayText(GBool display) { displayText = display; }
267
268private:
269
270  void init(PSOutputFunc outputFuncA, void *outputStreamA,
271            PSFileType fileTypeA, char *pstitle, XRef *xrefA, Catalog *catalog,
272            int firstPage, int lastPage, PSOutMode modeA,
273            int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
274            GBool manualCtrlA, int paperWidthA, int paperHeightA,
275            GBool duplexA);
276  void setupResources(Dict *resDict);
277  void setupFonts(Dict *resDict);
278  void setupFont(GfxFont *font, Dict *parentResDict);
279  void setupEmbeddedType1Font(Ref *id, GooString *psName);
280  void setupExternalType1Font(GooString *fileName, GooString *psName);
281  void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GooString *psName);
282  void setupEmbeddedOpenTypeT1CFont(GfxFont *font, Ref *id, GooString *psName);
283  void setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, GooString *psName);
284  GooString *setupExternalTrueTypeFont(GfxFont *font);
285  void setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, GooString *psName);
286  void setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, GooString *psName,
287                                    GBool needVerticalMetrics);
288  void setupEmbeddedOpenTypeCFFFont(GfxFont *font, Ref *id, GooString *psName);
289  GooString *setupExternalCIDTrueTypeFont(GfxFont *font, GooString *fileName, int faceIndex = 0);
290  void setupType3Font(GfxFont *font, GooString *psName, Dict *parentResDict);
291  void setupImages(Dict *resDict);
292  void setupImage(Ref id, Stream *str);
293  void setupForms(Dict *resDict);
294  void setupForm(Ref id, Object *strObj);
295  void addProcessColor(double c, double m, double y, double k);
296  void addCustomColor(GfxSeparationColorSpace *sepCS);
297  void doPath(GfxPath *path);
298  void doImageL1(Object *ref, GfxImageColorMap *colorMap,
299                 GBool invert, GBool inlineImg,
300                 Stream *str, int width, int height, int len);
301  void doImageL1Sep(GfxImageColorMap *colorMap,
302                    GBool invert, GBool inlineImg,
303                    Stream *str, int width, int height, int len);
304  void doImageL2(Object *ref, GfxImageColorMap *colorMap,
305                 GBool invert, GBool inlineImg,
306                 Stream *str, int width, int height, int len,
307                 int *maskColors, Stream *maskStr,
308                 int maskWidth, int maskHeight, GBool maskInvert);
309  void doImageL3(Object *ref, GfxImageColorMap *colorMap,
310                 GBool invert, GBool inlineImg,
311                 Stream *str, int width, int height, int len,
312                 int *maskColors, Stream *maskStr,
313                 int maskWidth, int maskHeight, GBool maskInvert);
314  void dumpColorSpaceL2(GfxColorSpace *colorSpace,
315                        GBool genXform, GBool updateColors,
316                        GBool map01);
317#if OPI_SUPPORT
318  void opiBegin20(GfxState *state, Dict *dict);
319  void opiBegin13(GfxState *state, Dict *dict);
320  void opiTransform(GfxState *state, double x0, double y0,
321                    double *x1, double *y1);
322#endif
323  void cvtFunction(Function *func);
324  void writePSChar(char c);
325  void writePS(char *s);
326  void writePSFmt(const char *fmt, ...);
327  void writePSString(GooString *s);
328  void writePSName(char *s);
329  GooString *filterPSName(GooString *name);
330  GooString *filterPSLabel(GooString *label, GBool *needParens=0);
331  void writePSTextLine(GooString *s);
332
333  PSLevel level;                // PostScript level (1, 2, separation)
334  PSOutMode mode;               // PostScript mode (PS, EPS, form)
335  int paperWidth;               // width of paper, in pts
336  int paperHeight;              // height of paper, in pts
337  int imgLLX, imgLLY,           // imageable area, in pts
338      imgURX, imgURY;
339  GBool preload;                // load all images into memory, and
340                                //   predefine forms
341
342  PSOutputFunc outputFunc;
343  void *outputStream;
344  PSFileType fileType;          // file / pipe / stdout
345  GBool manualCtrl;
346  int seqPage;                  // current sequential page number
347  void (*underlayCbk)(PSOutputDev *psOut, void *data);
348  void *underlayCbkData;
349  void (*overlayCbk)(PSOutputDev *psOut, void *data);
350  void *overlayCbkData;
351
352  XRef *xref;                   // the xref table for this PDF file
353  Catalog *m_catalog;           // the catalog for this PDF file
354
355  Ref *fontIDs;                 // list of object IDs of all used fonts
356  int fontIDLen;                // number of entries in fontIDs array
357  int fontIDSize;               // size of fontIDs array
358  Ref *fontFileIDs;             // list of object IDs of all embedded fonts
359  int fontFileIDLen;            // number of entries in fontFileIDs array
360  int fontFileIDSize;           // size of fontFileIDs array
361  GooString **fontFileNames;    // list of names of all embedded external fonts
362  GooString **psFileNames;      // list of names of all embedded external fonts
363  int fontFileNameLen;          // number of entries in fontFileNames array
364  int fontFileNameSize;         // size of fontFileNames array
365  int nextTrueTypeNum;          // next unique number to append to a TrueType
366                                //   font name
367  PSFont8Info *font8Info;       // info for 8-bit fonts
368  int font8InfoLen;             // number of entries in font8Info array
369  int font8InfoSize;            // size of font8Info array
370  PSFont16Enc *font16Enc;       // encodings for substitute 16-bit fonts
371  int font16EncLen;             // number of entries in font16Enc array
372  int font16EncSize;            // size of font16Enc array
373  Ref *imgIDs;                  // list of image IDs for in-memory images
374  int imgIDLen;                 // number of entries in imgIDs array
375  int imgIDSize;                // size of imgIDs array
376  Ref *formIDs;                 // list of IDs for predefined forms
377  int formIDLen;                // number of entries in formIDs array
378  int formIDSize;               // size of formIDs array
379  GooList *xobjStack;           // stack of XObject dicts currently being
380                                //   processed
381  int numSaves;                 // current number of gsaves
382  int numTilingPatterns;        // current number of nested tiling patterns
383  int nextFunc;                 // next unique number to use for a function
384
385  double tx0, ty0;              // global translation
386  double xScale0, yScale0;      // global scaling
387  int rotate0;                  // rotation angle (0, 90, 180, 270)
388  double clipLLX0, clipLLY0,
389         clipURX0, clipURY0;
390  double tx, ty;                // global translation for current page
391  double xScale, yScale;        // global scaling for current page
392  int rotate;                   // rotation angle for current page
393  double epsX1, epsY1,          // EPS bounding box (unrotated)
394         epsX2, epsY2;
395
396  GooString *embFontList;               // resource comments for embedded fonts
397
398  int processColors;            // used process colors
399  PSOutCustomColor              // used custom colors
400    *customColors;
401
402  GBool haveTextClip;           // set if text has been drawn with a
403                                //   clipping render mode
404
405  GBool inType3Char;            // inside a Type 3 CharProc
406  GooString *t3String;          // Type 3 content string
407  double t3WX, t3WY,            // Type 3 character parameters
408         t3LLX, t3LLY, t3URX, t3URY;
409  GBool t3Cacheable;            // cleared if char is not cacheable
410  GBool t3NeedsRestore;         // set if a 'q' operator was issued
411  GBool forceRasterize;         // forces the page to be rasterized into a image before printing
412  GBool displayText;            // displayText
413
414#if OPI_SUPPORT
415  int opi13Nest;                // nesting level of OPI 1.3 objects
416  int opi20Nest;                // nesting level of OPI 2.0 objects
417#endif
418
419  GBool ok;                     // set up ok?
420
421
422  friend class WinPDFPrinter;
423};
424
425#endif
Note: See TracBrowser for help on using the repository browser.