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