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

Last change on this file since 2 was 2, checked in by Eugene Romanenko, 15 years ago

First import

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