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

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

PDF plugin: Poppler library updated to version 0.8.4

File size: 11.4 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  static FT_Library ft_lib;
210  static GBool ft_lib_initialized;
211
212  CairoFontEngine *fontEngine;
213  cairo_t *cairo;
214  cairo_matrix_t orig_matrix;
215  GBool needFontUpdate;                // set when the font needs to be updated
216  GBool printing;
217  cairo_surface_t *surface;
218  cairo_glyph_t *glyphs;
219  int glyphCount;
220  cairo_path_t *textClipPath;
221
222  GBool prescaleImages;
223
224  cairo_pattern_t *group;
225  cairo_pattern_t *shape;
226  cairo_pattern_t *mask;
227  cairo_surface_t *cairo_shape_surface;
228  cairo_t *cairo_shape;
229  int knockoutCount;
230  struct ColorSpaceStack {
231    GBool knockout;
232    GfxColorSpace *cs;
233    struct ColorSpaceStack *next;
234  } * groupColorSpaceStack;
235};
236
237//------------------------------------------------------------------------
238// CairoImageOutputDev
239//------------------------------------------------------------------------
240
241//XXX: this should ideally not inherit from CairoOutputDev but use it instead perhaps
242class CairoImageOutputDev: public CairoOutputDev {
243public:
244
245  // Constructor.
246  CairoImageOutputDev();
247
248  // Destructor.
249  virtual ~CairoImageOutputDev();
250
251  //----- get info about output device
252
253  // Does this device use upside-down coordinates?
254  // (Upside-down means (0,0) is the top left corner of the page.)
255  virtual GBool upsideDown() { return gTrue; }
256
257  // Does this device use drawChar() or drawString()?
258  virtual GBool useDrawChar() { return gFalse; }
259
260  // Does this device use beginType3Char/endType3Char?  Otherwise,
261  // text in Type 3 fonts will be drawn with drawChar/drawString.
262  virtual GBool interpretType3Chars() { return gFalse; }
263
264  // Does this device need non-text content?
265  virtual GBool needNonText() { return gTrue; }
266
267    //----- link borders
268  virtual void drawLink(Link *link, Catalog *catalog) { }
269
270  //----- save/restore graphics state
271  virtual void saveState(GfxState *state) { }
272  virtual void restoreState(GfxState *state) { }
273
274  //----- update graphics state
275  virtual void updateAll(GfxState *state) { }
276  virtual void setDefaultCTM(double *ctm) { }
277  virtual void updateCTM(GfxState *state, double m11, double m12,
278                                 double m21, double m22, double m31, double m32) { }
279  virtual void updateLineDash(GfxState *state) { }
280  virtual void updateFlatness(GfxState *state) { }
281  virtual void updateLineJoin(GfxState *state) { }
282  virtual void updateLineCap(GfxState *state) { }
283  virtual void updateMiterLimit(GfxState *state) { }
284  virtual void updateLineWidth(GfxState *state) { }
285  virtual void updateFillColor(GfxState *state) { }
286  virtual void updateStrokeColor(GfxState *state) { }
287  virtual void updateFillOpacity(GfxState *state) { }
288  virtual void updateStrokeOpacity(GfxState *state) { }
289
290  //----- update text state
291  virtual void updateFont(GfxState *state) { }
292
293  //----- path painting
294  virtual void stroke(GfxState *state) { }
295  virtual void fill(GfxState *state) { }
296  virtual void eoFill(GfxState *state) { }
297
298  //----- path clipping
299  virtual void clip(GfxState *state) { }
300  virtual void eoClip(GfxState *state) { }
301
302  //----- image drawing
303  virtual void drawImageMask(GfxState *state, Object *ref, Stream *str,
304                             int width, int height, GBool invert,
305                             GBool inlineImg);
306  virtual void drawImage(GfxState *state, Object *ref, Stream *str,
307                         int width, int height, GfxImageColorMap *colorMap,
308                         int *maskColors, GBool inlineImg);
309  virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
310                                   int width, int height,
311                                   GfxImageColorMap *colorMap,
312                                   Stream *maskStr,
313                                   int maskWidth, int maskHeight,
314                                   GfxImageColorMap *maskColorMap);
315  virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
316                               int width, int height,
317                               GfxImageColorMap *colorMap,
318                               Stream *maskStr,
319                               int maskWidth, int maskHeight,
320                               GBool maskInvert);
321
322  //----- transparency groups and soft masks
323  virtual void beginTransparencyGroup(GfxState * /*state*/, double * /*bbox*/,
324                                      GfxColorSpace * /*blendingColorSpace*/,
325                                      GBool /*isolated*/, GBool /*knockout*/,
326                                      GBool /*forSoftMask*/) {}
327  virtual void endTransparencyGroup(GfxState * /*state*/) {}
328  virtual void paintTransparencyGroup(GfxState * /*state*/, double * /*bbox*/) {}
329  virtual void setSoftMask(GfxState * /*state*/, double * /*bbox*/, GBool /*alpha*/,
330                           Function * /*transferFunc*/, GfxColor * /*backdropColor*/) {}
331  virtual void clearSoftMask(GfxState * /*state*/) {}
332
333  //----- Image list
334  // By default images are not rendred
335  void setImageDrawDecideCbk(GBool (*cbk)(int img_id, void *data),
336                             void *data) { imgDrawCbk = cbk; imgDrawCbkData = data; }
337  // Iterate through list of images.
338  int getNumImages() const { return numImages; }
339  CairoImage *getImage(int i) const { return images[i]; }
340
341private:
342  void saveImage(CairoImage *image);
343 
344  CairoImage **images;
345  int numImages;
346  int size;
347  GBool (*imgDrawCbk)(int img_id, void *data);
348  void *imgDrawCbkData;
349};
350
351#endif
Note: See TracBrowser for help on using the repository browser.