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

Last change on this file since 461 was 277, checked in by rbri, 12 years ago

PDF plugin: Poppler library updated to version 0.12.3

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