Scribus
Open source desktop publishing at your fingertips
scpainter.h
1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 
8 #ifndef __SCPAINTER_H__
9 #define __SCPAINTER_H__
10 
11 #include <QPainterPath>
12 #include <QPainter>
13 #include <QVector>
14 #include <QStack>
15 #include <QColor>
16 #include <QTransform>
17 #include <QFont>
18 #include <QImage>
19 #include <QPointF>
20 #include "scribusapi.h"
21 #include "scconfig.h"
22 #include "fpoint.h"
23 #include "fpointarray.h"
24 #include "vgradient.h"
25 #include "mesh.h"
26 
27 class ScPattern;
28 
29 typedef struct _cairo cairo_t;
30 typedef struct _cairo_surface cairo_surface_t;
31 typedef struct _cairo_pattern cairo_pattern_t;
32 
33 class SCRIBUS_API ScPainter
34 {
35 public:
36  ScPainter( QImage *target, unsigned int w, unsigned int h, double transparency = 1.0, int blendmode = 0 );
37  virtual ~ScPainter();
38  enum FillMode { None, Solid, Gradient, Pattern, Hatch };
39  virtual void beginLayer(double transparency, int blendmode, FPointArray *clipArray = 0);
40  virtual void endLayer();
41  virtual void setAntialiasing(bool enable);
42  virtual void begin();
43  virtual void end();
44  void clear();
45  virtual void clear( const QColor & );
46 
47  // matrix manipulation
48  virtual void setWorldMatrix( const QTransform & );
49  virtual const QTransform worldMatrix();
50  virtual void setZoomFactor( double );
51  virtual double zoomFactor() { return m_zoomFactor; }
52  virtual void translate( double, double );
53  virtual void translate( const QPointF& offset );
54  virtual void rotate( double );
55  virtual void scale( double, double );
56 
57  // drawing
58  virtual void moveTo( const double &, const double & );
59  virtual void lineTo( const double &, const double & );
60  virtual void curveTo( FPoint p1, FPoint p2, FPoint p3 );
61  virtual void newPath();
62  virtual void closePath();
63  virtual void fillPath();
64  virtual void strokePath();
65  virtual void setFillRule( bool fillRule );
66  virtual bool fillRule() { return m_fillRule; }
67  virtual void setFillMode( int fill );
68  virtual void setStrokeMode( int stroke );
69  virtual void setGradient( VGradient::VGradientType mode, FPoint orig, FPoint vec, FPoint foc, double scale, double skew);
70  virtual void setPattern(ScPattern *pattern, double scaleX, double scaleY, double offsetX, double offsetY, double rotation, double skewX, double skewY, bool mirrorX, bool mirrorY);
71 
72  virtual void setMaskMode( int mask );
73  virtual void setGradientMask( VGradient::VGradientType mode, FPoint orig, FPoint vec, FPoint foc, double scale, double skew);
74  virtual void setPatternMask(ScPattern *pattern, double scaleX, double scaleY, double offsetX, double offsetY, double rotation, double skewX, double skewY, bool mirrorX, bool mirrorY);
75 
76  virtual void set4ColorGeometry(FPoint p1, FPoint p2, FPoint p3, FPoint p4, FPoint c1, FPoint c2, FPoint c3, FPoint c4);
77  virtual void set4ColorColors(QColor col1, QColor col2, QColor col3, QColor col4);
78  virtual void setDiamondGeometry(FPoint p1, FPoint p2, FPoint p3, FPoint p4, FPoint c1, FPoint c2, FPoint c3, FPoint c4, FPoint c5);
79  virtual void setMeshGradient(FPoint p1, FPoint p2, FPoint p3, FPoint p4, QList<QList<meshPoint> > meshArray);
80  virtual void setMeshGradient(FPoint p1, FPoint p2, FPoint p3, FPoint p4, QList<meshGradientPatch> meshPatches);
81 
82  virtual void setHatchParameters(int mode, double distance, double angle, bool useBackground, QColor background, QColor foreground, double width, double height);
83 
84  virtual void setClipPath();
85 
86  virtual void drawImage( QImage *image);
87  virtual void setupPolygon(FPointArray *points, bool closed = true);
88  virtual void setupSharpPolygon(FPointArray *points, bool closed = true);
89  virtual void sharpLineHelper(FPoint &pp);
90  virtual void sharpLineHelper(QPointF &pp);
91  virtual void drawPolygon();
92  virtual void drawPolyLine();
93  virtual void drawLine(FPoint start, FPoint end);
94  virtual void drawLine(const QPointF& start, const QPointF& end);
95  virtual void drawSharpLine(FPoint start, FPoint end);
96  virtual void drawSharpLine(QPointF start, QPointF end);
97  virtual void drawRect(double, double, double, double);
98  virtual void drawSharpRect(double x, double y, double w, double h);
99  virtual void drawText(QRectF area, QString text, bool filled = true, int align = 0);
100  virtual void drawShadeCircle(const QRectF &re, const QColor color, bool sunken, int lineWidth);
101  virtual void drawShadePanel(const QRectF &r, const QColor color, bool sunken, int lineWidth);
102  virtual void colorizeAlpha(QColor color);
103  virtual void colorize(QColor color);
104  virtual void blurAlpha(int radius);
105  virtual void blur(int radius);
106 
107  // pen + brush
108  virtual QColor pen();
109  virtual QColor brush();
110  virtual void setPen( const QColor & );
111  virtual void setPen( const QColor &c, double w, Qt::PenStyle st, Qt::PenCapStyle ca, Qt::PenJoinStyle jo );
112  virtual void setPenOpacity( double op );
113  virtual void setLineWidth( double w);
114  virtual void setDash(const QVector<double>& array, double ofs);
115  virtual void setBrush( const QColor & );
116  virtual void setBrushOpacity( double op );
117  virtual void setOpacity( double op );
118  virtual void setFont( const QFont &f );
119  virtual QFont font();
120 
121  // stack management
122  virtual void save();
123  virtual void restore();
124 
125 
126  virtual void setRasterOp( int blendMode );
127  virtual void setBlendModeFill( int blendMode );
128  virtual void setBlendModeStroke( int blendMode );
129 
130  VGradient fill_gradient;
131  VGradient stroke_gradient;
132  VGradient mask_gradient;
133  ScPattern *m_maskPattern;
134  ScPattern *m_pattern;
135 
136 private:
137  void fillPathHelper();
138  void strokePathHelper();
139 
140  cairo_t *m_cr;
141  struct layerProp
142  {
143  cairo_surface_t *data;
144  int blendmode;
145  double tranparency;
146  int maskMode; // 0 = none, 1 = gradient 2 = pattern
147  double mask_patternScaleX;
148  double mask_patternScaleY;
149  double mask_patternOffsetX;
150  double mask_patternOffsetY;
151  double mask_patternRotation;
152  double mask_patternSkewX;
153  double mask_patternSkewY;
154  bool mask_patternMirrorX;
155  bool mask_patternMirrorY;
156  double mask_gradientScale;
157  double mask_gradientSkew;
158  VGradient mask_gradient;
159  ScPattern *maskPattern;
160  FPointArray groupClip;
161  bool pushed;
162  bool fillRule;
163  };
164  cairo_pattern_t *getMaskPattern();
165  cairo_surface_t *imageMask;
166  QImage imageQ;
167 
168  QStack<layerProp> Layers;
169  QStack<double> zoomStack;
170  QImage *m_image;
171  double m_layerTransparency;
172  int m_blendMode;
173  int m_blendModeFill;
174  int m_blendModeStroke;
175  unsigned int m_width;
176  unsigned int m_height;
177  QTransform m_matrix;
178  QFont m_font;
179  bool mf_underline;
180  bool mf_strikeout;
181  bool mf_shadow;
182  bool mf_outlined;
184  QColor m_fill;
185  double fill_trans;
186  bool m_fillRule;
187  int fillMode; // 0 = none, 1 = solid, 2 = gradient 3 = pattern 4 = hatch
188  double patternScaleX;
189  double patternScaleY;
190  double patternOffsetX;
191  double patternOffsetY;
192  double patternRotation;
193  double patternSkewX;
194  double patternSkewY;
195  bool patternMirrorX;
196  bool patternMirrorY;
197  double gradientScale;
198  double gradientSkew;
199  FPoint gradPatchP1;
200  FPoint gradPatchP2;
201  FPoint gradPatchP3;
202  FPoint gradPatchP4;
203  FPoint gradControlP1;
204  FPoint gradControlP2;
205  FPoint gradControlP3;
206  FPoint gradControlP4;
207  FPoint gradControlP5;
208  QColor gradPatchColor1;
209  QColor gradPatchColor2;
210  QColor gradPatchColor3;
211  QColor gradPatchColor4;
212  QList<QList<meshPoint> > meshGradientArray;
213  QList<meshGradientPatch> meshGradientPatches;
214  double hatchAngle;
215  double hatchDistance;
216  int hatchType; // 0 = single 1 = double 2 = triple
217  bool hatchUseBackground;
218  QColor hatchBackground;
219  QColor hatchForeground;
220  double hatchWidth;
221  double hatchHeight;
223  QColor m_stroke;
224  double stroke_trans;
225  double LineWidth;
226  int strokeMode; // 0 = none, 1 = solid, 2 = gradient 3 = pattern
227  int maskMode; // 0 = none, 1 = gradient 2 = pattern
228  double mask_patternScaleX;
229  double mask_patternScaleY;
230  double mask_patternOffsetX;
231  double mask_patternOffsetY;
232  double mask_patternRotation;
233  double mask_patternSkewX;
234  double mask_patternSkewY;
235  bool mask_patternMirrorX;
236  bool mask_patternMirrorY;
237  double mask_gradientScale;
238  double mask_gradientSkew;
239 
241  Qt::PenCapStyle PLineEnd;
243  Qt::PenJoinStyle PLineJoin;
245  QVector<double> m_array;
246  double m_offset;
248  double m_zoomFactor;
249  bool imageMode;
250  bool layeredMode;
251  bool svgMode;
252 };
253 
254 #endif
Definition: scpattern.h:36
Definition: vgradient.h:78
A point with floating point precision.
Definition: fpoint.h:43
Definition: scpainter.h:33
Coord distance(Point const &a, Point const &b)
Definition: point.h:205
Definition: fpointarray.h:42