QtGui/qpaintengine.h Source File

qpaintengine.h
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtGui module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41 
42 #ifndef QPAINTENGINE_H
43 #define QPAINTENGINE_H
44 
45 #include <QtCore/qnamespace.h>
46 #include <QtCore/qobjectdefs.h>
47 #include <QtCore/qscopedpointer.h>
48 #include <QtGui/qpainter.h>
49 
51 
53 
54 QT_MODULE(Gui)
55 
56 class QFontEngine;
57 class QLineF;
58 class QPaintDevice;
59 class QPaintEnginePrivate;
60 class QPainterPath;
61 class QPointF;
62 class QPolygonF;
63 class QRectF;
64 struct QGlyphLayout;
65 class QTextItemInt;
66 class QPaintEngineState;
67 
68 class Q_GUI_EXPORT QTextItem {
69 public:
70  enum RenderFlag {
71  RightToLeft = 0x1,
72  Overline = 0x10,
73  Underline = 0x20,
74  StrikeOut = 0x40,
75 
76  Dummy = 0xffffffff
77  };
78  Q_DECLARE_FLAGS(RenderFlags, RenderFlag)
79  qreal descent() const;
80  qreal ascent() const;
81  qreal width() const;
82 
83  RenderFlags renderFlags() const;
84  QString text() const;
85  QFont font() const;
86 };
87 Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE);
88 
89 
90 class Q_GUI_EXPORT QPaintEngine
91 {
92  Q_DECLARE_PRIVATE(QPaintEngine)
93 public:
95  PrimitiveTransform = 0x00000001, // Can transform primitives brushes
96  PatternTransform = 0x00000002, // Can transform pattern brushes
97  PixmapTransform = 0x00000004, // Can transform pixmaps
98  PatternBrush = 0x00000008, // Can fill with pixmaps and standard patterns
99  LinearGradientFill = 0x00000010, // Can fill gradient areas
100  RadialGradientFill = 0x00000020, // Can render radial gradients
101  ConicalGradientFill = 0x00000040, // Can render conical gradients
102  AlphaBlend = 0x00000080, // Can do source over alpha blend
103  PorterDuff = 0x00000100, // Can do general porter duff compositions
104  PainterPaths = 0x00000200, // Can fill, outline and clip paths
105  Antialiasing = 0x00000400, // Can antialias lines
106  BrushStroke = 0x00000800, // Can render brush based pens
107  ConstantOpacity = 0x00001000, // Can render at constant opacity
108  MaskedBrush = 0x00002000, // Can fill with textures that has an alpha channel or mask
109  PerspectiveTransform = 0x00004000, // Can do perspective transformations
110  BlendModes = 0x00008000, // Can do extended Porter&Duff composition
111  ObjectBoundingModeGradients = 0x00010000, // Can do object bounding mode gradients
112  RasterOpModes = 0x00020000, // Can do logical raster operations
113  PaintOutsidePaintEvent = 0x20000000, // Engine is capable of painting outside paint events
114  /* 0x10000000, // Used for emulating
115  QGradient::StretchToDevice,
116  defined in qpainter.cpp
117 
118  0x40000000, // Used internally for emulating opaque backgrounds
119  */
120 
121  AllFeatures = 0xffffffff // For convenience
122  };
123  Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature)
124 
125  enum DirtyFlag {
126  DirtyPen = 0x0001,
127  DirtyBrush = 0x0002,
128  DirtyBrushOrigin = 0x0004,
129  DirtyFont = 0x0008,
130  DirtyBackground = 0x0010,
131  DirtyBackgroundMode = 0x0020,
132  DirtyTransform = 0x0040,
133  DirtyClipRegion = 0x0080,
134  DirtyClipPath = 0x0100,
135  DirtyHints = 0x0200,
136  DirtyCompositionMode = 0x0400,
137  DirtyClipEnabled = 0x0800,
138  DirtyOpacity = 0x1000,
139 
140  AllDirty = 0xffff
141  };
142  Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
143 
148  PolylineMode
149  };
150 
151  explicit QPaintEngine(PaintEngineFeatures features=0);
152  virtual ~QPaintEngine();
153 
154  bool isActive() const { return active; }
155  void setActive(bool newState) { active = newState; }
156 
157  virtual bool begin(QPaintDevice *pdev) = 0;
158  virtual bool end() = 0;
159 
160  virtual void updateState(const QPaintEngineState &state) = 0;
161 
162  virtual void drawRects(const QRect *rects, int rectCount);
163  virtual void drawRects(const QRectF *rects, int rectCount);
164 
165  virtual void drawLines(const QLine *lines, int lineCount);
166  virtual void drawLines(const QLineF *lines, int lineCount);
167 
168  virtual void drawEllipse(const QRectF &r);
169  virtual void drawEllipse(const QRect &r);
170 
171  virtual void drawPath(const QPainterPath &path);
172 
173  virtual void drawPoints(const QPointF *points, int pointCount);
174  virtual void drawPoints(const QPoint *points, int pointCount);
175 
176  virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
177  virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
178 
179  virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) = 0;
180  virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);
181  virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
182  virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
183  Qt::ImageConversionFlags flags = Qt::AutoColor);
184 
185  void setPaintDevice(QPaintDevice *device);
186  QPaintDevice *paintDevice() const;
187 
188  void setSystemClip(const QRegion &baseClip);
189  QRegion systemClip() const;
190 
191  void setSystemRect(const QRect &rect);
192  QRect systemRect() const;
193 
194 #ifdef Q_WS_WIN
195  virtual HDC getDC() const;
196  virtual void releaseDC(HDC hdc) const;
197 #endif
198 
199  virtual QPoint coordinateOffset() const;
200 
201  enum Type {
204  QuickDraw, CoreGraphics, MacPrinter,
217 
218  User = 50, // first user type id
219  MaxUser = 100 // last user type id
220  };
221  virtual Type type() const = 0;
222 
223  inline void fix_neg_rect(int *x, int *y, int *w, int *h);
224 
225  inline bool testDirty(DirtyFlags df);
226  inline void setDirty(DirtyFlags df);
227  inline void clearDirty(DirtyFlags df);
228 
229  bool hasFeature(PaintEngineFeatures feature) const { return (gccaps & feature) != 0; }
230 
231  QPainter *painter() const;
232 
233  void syncState();
234  inline bool isExtended() const { return extended; }
235 
236 protected:
237  QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=0);
238 
239  QPaintEngineState *state;
240  PaintEngineFeatures gccaps;
241 
242  uint active : 1;
243  uint selfDestruct : 1;
244  uint extended : 1;
245 
247 
248 private:
249  void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }
250  bool autoDestruct() const { return selfDestruct; }
251  Q_DISABLE_COPY(QPaintEngine)
252 
253  friend class QPainterReplayer;
254  friend class QFontEngineBox;
255  friend class QFontEngineMac;
256  friend class QFontEngineWin;
257 #ifndef QT_NO_FREETYPE
258  friend class QFontEngineFT;
259 #endif
260 #ifndef QT_NO_QWS_QPF
261  friend class QFontEngineQPF1;
262 #endif
263 #ifndef QT_NO_QWS_QPF2
264  friend class QFontEngineQPF;
265 #endif
266  friend class QPSPrintEngine;
267  friend class QMacPrintEngine;
268  friend class QMacPrintEnginePrivate;
269 #ifdef Q_WS_QWS
270  friend class QtopiaPrintEngine;
271  friend class QtopiaPrintEnginePrivate;
272  friend class QProxyFontEngine;
273 #endif
274 #ifdef Q_WS_QPA
275  friend class QFontEngineQPA;
276 #endif
277  friend class QPainter;
278  friend class QPainterPrivate;
279  friend class QWidget;
280  friend class QWidgetPrivate;
281  friend class QWin32PaintEngine;
282  friend class QWin32PaintEnginePrivate;
283  friend class QMacCGContext;
284  friend class QPreviewPaintEngine;
285  friend class QX11GLPixmapData;
286 };
287 
288 
289 class Q_GUI_EXPORT QPaintEngineState
290 {
291 public:
292  QPaintEngine::DirtyFlags state() const { return dirtyFlags; }
293 
294  QPen pen() const;
295  QBrush brush() const;
296  QPointF brushOrigin() const;
297  QBrush backgroundBrush() const;
298  Qt::BGMode backgroundMode() const;
299  QFont font() const;
300  QMatrix matrix() const;
301  QTransform transform() const;
302 
303  Qt::ClipOperation clipOperation() const;
304  QRegion clipRegion() const;
305  QPainterPath clipPath() const;
306  bool isClipEnabled() const;
307 
308  QPainter::RenderHints renderHints() const;
309  QPainter::CompositionMode compositionMode() const;
310  qreal opacity() const;
311 
312  QPainter *painter() const;
313 
314  bool brushNeedsResolving() const;
315  bool penNeedsResolving() const;
316 
317 protected:
318  friend class QPaintEngine;
319  friend class QRasterPaintEngine;
320  friend class QWidget;
321  friend class QPainter;
322  friend class QPainterPrivate;
323  friend class QMacPrintEnginePrivate;
324 
325  QPaintEngine::DirtyFlags dirtyFlags;
326 };
327 
328 //
329 // inline functions
330 //
331 
332 inline void QPaintEngine::fix_neg_rect(int *x, int *y, int *w, int *h)
333 {
334  if (*w < 0) {
335  *w = -*w;
336  *x -= *w - 1;
337  }
338  if (*h < 0) {
339  *h = -*h;
340  *y -= *h - 1;
341  }
342 }
343 
344 inline bool QPaintEngine::testDirty(DirtyFlags df) {
345  Q_ASSERT(state);
346  return ((state->dirtyFlags & df) != 0);
347 }
348 
349 inline void QPaintEngine::setDirty(DirtyFlags df) {
350  Q_ASSERT(state);
351  state->dirtyFlags |= df;
352 }
353 
354 inline void QPaintEngine::clearDirty(DirtyFlags df)
355 {
356  Q_ASSERT(state);
357  state->dirtyFlags &= ~static_cast<uint>(df);
358 }
359 
360 Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags)
361 Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures)
362 Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags)
363 
365 
367 
368 #endif // QPAINTENGINE_H
GLuint GLuint GLsizei GLenum type
Definition: GLee.h:872
ClipOperation
Definition: qnamespace.h:1495
GLdouble GLdouble GLdouble r
Definition: GLee.h:1189
GLuint GLenum matrix
Definition: GLee.h:6572
GLenum GLint GLint y
Definition: GLee.h:876
Definition: qline.h:57
GLint mode
Definition: GLee.h:4479
void setDirty(DirtyFlags df)
Definition: qpaintengine.h:349
#define QT_END_NAMESPACE
Definition: qglobal.h:128
QPaintEngineState * state
Definition: qpaintengine.h:239
bool isExtended() const
Definition: qpaintengine.h:234
#define QT_BEGIN_HEADER
Definition: qglobal.h:141
GLXFBConfig Pixmap pixmap
Definition: GLee.h:10237
bool hasFeature(PaintEngineFeatures feature) const
Definition: qpaintengine.h:229
QPaintEngine::DirtyFlags dirtyFlags
Definition: qpaintengine.h:325
GLenum GLsizei width
Definition: GLee.h:873
void clearDirty(DirtyFlags df)
Definition: qpaintengine.h:354
BGMode
Definition: qnamespace.h:588
QScopedPointer< QPaintEnginePrivate > d_ptr
Definition: qpaintengine.h:246
void setActive(bool newState)
Definition: qpaintengine.h:155
Definition: qpoint.h:53
#define QT_BEGIN_NAMESPACE
Definition: qglobal.h:127
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: GLee.h:880
Definition: qfont.h:64
Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE)
GLuint GLenum GLenum transform
Definition: GLee.h:6572
Definition: qimage.h:87
bool testDirty(DirtyFlags df)
Definition: qpaintengine.h:344
GLenum GLint x
Definition: GLee.h:876
bool isActive() const
Definition: qpaintengine.h:154
PaintEngineFeatures gccaps
Definition: qpaintengine.h:240
void fix_neg_rect(int *x, int *y, int *w, int *h)
Definition: qpaintengine.h:332
Definition: qline.h:212
GLuint GLuint end
Definition: GLee.h:872
Definition: qrect.h:58
Antialiasing
Type of the antialiasing applied to extracted textures. This is only valid if utilizer type is set to...
Definition: qrect.h:511
GLfloat GLfloat p
Definition: GLee.h:5416
Definition: qpen.h:64
int int int int int int h
Definition: GLee.h:10534
QPaintEngine::DirtyFlags state() const
Definition: qpaintengine.h:292
Definition: qbrush.h:76
GLsizei const GLfloat * points
Definition: GLee.h:3793
GLubyte GLubyte GLubyte GLubyte w
Definition: GLee.h:1775
GLdouble s
Definition: GLee.h:1173
#define QT_END_HEADER
Definition: qglobal.h:142
CompositionMode
Definition: qpainter.h:138