source: trunk/poppler/mypoppler/poppler/CairoOutputDev.h @ 250

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

PDF plugin: poppler library updated to version 0.8.3

File size: 11.3 KB
Line 
1//========================================================================
2//
3// CairoOutputDev.h
4//
5// Copyright 2003 Glyph & Cog, LLC
6// Copyright 2004 Red Hat, INC
7//
8//========================================================================
9
10#ifndef CAIROOUTPUTDEV_H
11#define CAIROOUTPUTDEV_H
12
13#ifdef USE_GCC_PRAGMAS
14#pragma interface
15#endif
16
17#include "goo/gtypes.h"
18#include <cairo-ft.h>
19#include "OutputDev.h"
20#include "GfxState.h"
21
22class GfxState;
23class GfxPath;
24class Gfx8BitFont;
25struct GfxRGB;
26class CairoFontEngine;
27class CairoFont;
28
29//------------------------------------------------------------------------
30
31//------------------------------------------------------------------------
32// CairoImage
33//------------------------------------------------------------------------
34class CairoImage {
35public:
36  // Constructor.
37  CairoImage (double x1, double y1, double x2, double y2);
38
39  // Destructor.
40  ~CairoImage ();
41
42  // Set the image cairo surface
43  void setImage (cairo_surface_t *image);
44 
45  // Get the image cairo surface
46  cairo_surface_t *getImage () const { return image; }
47
48  // Get the image rectangle
49  void getRect (double *xa1, double *ya1, double *xa2, double *ya2)
50          { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; }
51 
52private:
53  cairo_surface_t *image;  // image cairo surface
54  double x1, y1;          // upper left corner
55  double x2, y2;          // lower right corner
56};
57
58
59//------------------------------------------------------------------------
60// CairoOutputDev
61//------------------------------------------------------------------------
62
63class CairoOutputDev: public OutputDev {
64public:
65
66  // Constructor.
67  CairoOutputDev();
68
69  // Destructor.
70  virtual ~CairoOutputDev();
71
72  //----- get info about output device
73
74  // Does this device use upside-down coordinates?
75  // (Upside-down means (0,0) is the top left corner of the page.)
76  virtual GBool upsideDown() { return gTrue; }
77
78  // Does this device use drawChar() or drawString()?
79  virtual GBool useDrawChar() { return gTrue; }
80
81  // Does this device use beginType3Char/endType3Char?  Otherwise,
82  // text in Type 3 fonts will be drawn with drawChar/drawString.
83  virtual GBool interpretType3Chars() { return gTrue; }
84
85  //----- initialization and control
86
87  // Start a page.
88  virtual void startPage(int pageNum, GfxState *state);
89
90  // End a page.
91  virtual void endPage() { }
92
93  //----- link borders
94  virtual void drawLink(Link *link, Catalog *catalog);
95
96  //----- save/restore graphics state
97  virtual void saveState(GfxState *state);
98  virtual void restoreState(GfxState *state);
99
100  //----- update graphics state
101  virtual void updateAll(GfxState *state);
102  virtual void setDefaultCTM(double *ctm);
103  virtual void updateCTM(GfxState *state, double m11, double m12,
104                         double m21, double m22, double m31, double m32);
105  virtual void updateLineDash(GfxState *state);
106  virtual void updateFlatness(GfxState *state);
107  virtual void updateLineJoin(GfxState *state);
108  virtual void updateLineCap(GfxState *state);
109  virtual void updateMiterLimit(GfxState *state);
110  virtual void updateLineWidth(GfxState *state);
111  virtual void updateFillColor(GfxState *state);
112  virtual void updateStrokeColor(GfxState *state);
113  virtual void updateFillOpacity(GfxState *state);
114  virtual void updateStrokeOpacity(GfxState *state);
115
116  //----- update text state
117  virtual void updateFont(GfxState *state);
118
119  //----- path painting
120  virtual void stroke(GfxState *state);
121  virtual void fill(GfxState *state);
122  virtual void eoFill(GfxState *state);
123
124  //----- path clipping
125  virtual void clip(GfxState *state);
126  virtual void eoClip(GfxState *state);
127
128  //----- text drawing
129  void beginString(GfxState *state, GooString *s);
130  void endString(GfxState *state);
131  void drawChar(GfxState *state, double x, double y,
132                double dx, double dy,
133                double originX, double originY,
134                CharCode code, int nBytes, Unicode *u, int uLen);
135
136  virtual GBool beginType3Char(GfxState *state, double x, double y,
137                               double dx, double dy,
138                               CharCode code, Unicode *u, int uLen);
139  virtual void endType3Char(GfxState *state);
140  virtual void endTextObject(GfxState *state);
141
142  //----- image drawing
143  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
144                             int width, int height, GBool invert,
145                             GBool inlineImg);
146  void drawImageMaskPrescaled(GfxState *state, Object *ref, Stream *str,
147                             int width, int height, GBool invert,
148                             GBool inlineImg);
149  void drawImageMaskRegular(GfxState *state, Object *ref, Stream *str,
150                             int width, int height, GBool invert,
151                             GBool inlineImg);
152
153  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
154                         int width, int height, GfxImageColorMap *colorMap,
155                         int *maskColors, GBool inlineImg);
156  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
157                                int width, int height,
158                                GfxImageColorMap *colorMap,
159                                Stream *maskStr,
160                                int maskWidth, int maskHeight,
161                                GfxImageColorMap *maskColorMap);
162
163  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
164                                int width, int height,
165                                GfxImageColorMap *colorMap,
166                                Stream *maskStr,
167                                int maskWidth, int maskHeight,
168                                GBool maskInvert);
169
170
171  //----- transparency groups and soft masks
172  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
173                                      GfxColorSpace * /*blendingColorSpace*/,
174                                      GBool /*isolated*/, GBool /*knockout*/,
175                                      GBool /*forSoftMask*/);
176  virtual void endTransparencyGroup(GfxState * /*state*/);
177  void popTransparencyGroup();
178  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/);
179  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
180                           Function * /*transferFunc*/, GfxColor * /*backdropColor*/);
181  virtual void clearSoftMask(GfxState * /*state*/);
182
183  //----- Type 3 font operators
184  virtual void type3D0(GfxState *state, double wx, double wy);
185  virtual void type3D1(GfxState *state, double wx, double wy,
186      double llx, double lly, double urx, double ury);
187
188  //----- special access
189
190  // Called to indicate that a new PDF document has been loaded.
191  void startDoc(XRef *xrefA);
192 
193  GBool isReverseVideo() { return gFalse; }
194 
195  void setCairo (cairo_t *cr);
196  void setPrinting (GBool printing) { this->printing = printing; }
197
198protected:
199  void doPath(cairo_t *cairo, GfxState *state, GfxPath *path);
200 
201  GfxRGB fill_color, stroke_color;
202  cairo_pattern_t *fill_pattern, *stroke_pattern;
203  double fill_opacity;
204  double stroke_opacity;
205  CairoFont *currentFont;
206 
207  XRef *xref;                   // xref table for current document
208
209  FT_Library ft_lib;
210  CairoFontEngine *fontEngine;
211  cairo_t *cairo;
212  cairo_matrix_t orig_matrix;
213  GBool needFontUpdate;                // set when the font needs to be updated
214  GBool printing;
215  cairo_surface_t *surface;
216  cairo_glyph_t *glyphs;
217  int glyphCount;
218  cairo_path_t *textClipPath;
219
220  GBool prescaleImages;
221
222  cairo_pattern_t *group;
223  cairo_pattern_t *shape;
224  cairo_pattern_t *mask;
225  cairo_surface_t *cairo_shape_surface;
226  cairo_t *cairo_shape;
227  int knockoutCount;
228  struct ColorSpaceStack {
229    GBool knockout;
230    GfxColorSpace *cs;
231    struct ColorSpaceStack *next;
232  } * groupColorSpaceStack;
233};
234
235//------------------------------------------------------------------------
236// CairoImageOutputDev
237//------------------------------------------------------------------------
238
239//XXX: this should ideally not inherit from CairoOutputDev but use it instead perhaps
240class CairoImageOutputDev: public CairoOutputDev {
241public:
242
243  // Constructor.
244  CairoImageOutputDev();
245
246  // Destructor.
247  virtual ~CairoImageOutputDev();
248
249  //----- get info about output device
250
251  // Does this device use upside-down coordinates?
252  // (Upside-down means (0,0) is the top left corner of the page.)
253  virtual GBool upsideDown() { return gTrue; }
254
255  // Does this device use drawChar() or drawString()?
256  virtual GBool useDrawChar() { return gFalse; }
257
258  // Does this device use beginType3Char/endType3Char?  Otherwise,
259  // text in Type 3 fonts will be drawn with drawChar/drawString.
260  virtual GBool interpretType3Chars() { return gFalse; }
261
262  // Does this device need non-text content?
263  virtual GBool needNonText() { return gTrue; }
264
265    //----- link borders
266  virtual void drawLink(Link *link, Catalog *catalog) { }
267
268  //----- save/restore graphics state
269  virtual void saveState(GfxState *state) { }
270  virtual void restoreState(GfxState *state) { }
271
272  //----- update graphics state
273  virtual void updateAll(GfxState *state) { }
274  virtual void setDefaultCTM(double *ctm) { }
275  virtual void updateCTM(GfxState *state, double m11, double m12,
276                                 double m21, double m22, double m31, double m32) { }
277  virtual void updateLineDash(GfxState *state) { }
278  virtual void updateFlatness(GfxState *state) { }
279  virtual void updateLineJoin(GfxState *state) { }
280  virtual void updateLineCap(GfxState *state) { }
281  virtual void updateMiterLimit(GfxState *state) { }
282  virtual void updateLineWidth(GfxState *state) { }
283  virtual void updateFillColor(GfxState *state) { }
284  virtual void updateStrokeColor(GfxState *state) { }
285  virtual void updateFillOpacity(GfxState *state) { }
286  virtual void updateStrokeOpacity(GfxState *state) { }
287
288  //----- update text state
289  virtual void updateFont(GfxState *state) { }
290
291  //----- path painting
292  virtual void stroke(GfxState *state) { }
293  virtual void fill(GfxState *state) { }
294  virtual void eoFill(GfxState *state) { }
295
296  //----- path clipping
297  virtual void clip(GfxState *state) { }
298  virtual void eoClip(GfxState *state) { }
299
300  //----- image drawing
301  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
302                             int width, int height, GBool invert,
303                             GBool inlineImg);
304  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
305                         int width, int height, GfxImageColorMap *colorMap,
306                         int *maskColors, GBool inlineImg);
307  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
308                                   int width, int height,
309                                   GfxImageColorMap *colorMap,
310                                   Stream *maskStr,
311                                   int maskWidth, int maskHeight,
312                                   GfxImageColorMap *maskColorMap);
313  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
314                               int width, int height,
315                               GfxImageColorMap *colorMap,
316                               Stream *maskStr,
317                               int maskWidth, int maskHeight,
318                               GBool maskInvert);
319
320  //----- transparency groups and soft masks
321  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
322                                      GfxColorSpace * /*blendingColorSpace*/,
323                                      GBool /*isolated*/, GBool /*knockout*/,
324                                      GBool /*forSoftMask*/) {}
325  virtual void endTransparencyGroup(GfxState * /*state*/) {}
326  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {}
327  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
328                           Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {}
329  virtual void clearSoftMask(GfxState * /*state*/) {}
330
331  //----- Image list
332  // By default images are not rendred
333  void setImageDrawDecideCbk(GBool (*cbk)(int img_id, void *data),
334                             void *data) { imgDrawCbk = cbk; imgDrawCbkData = data; }
335  // Iterate through list of images.
336  int getNumImages() const { return numImages; }
337  CairoImage *getImage(int i) const { return images[i]; }
338
339private:
340  void saveImage(CairoImage *image);
341 
342  CairoImage **images;
343  int numImages;
344  int size;
345  GBool (*imgDrawCbk)(int img_id, void *data);
346  void *imgDrawCbkData;
347};
348
349#endif
Note: See TracBrowser for help on using the repository browser.