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
50QT_BEGIN_HEADER
51
52QT_BEGIN_NAMESPACE
53
54QT_MODULE(Gui)
55
56class QFontEngine;
57class QLineF;
58class QPaintDevice;
59class QPaintEnginePrivate;
60class QPainterPath;
61class QPointF;
62class QPolygonF;
63class QRectF;
64struct QGlyphLayout;
65class QTextItemInt;
66class QPaintEngineState;
67
68class Q_GUI_EXPORT QTextItem {
69public:
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};
87Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE);
88
89
90class Q_GUI_EXPORT QPaintEngine
91{
92 Q_DECLARE_PRIVATE(QPaintEngine)
93public:
94 enum PaintEngineFeature {
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
144 enum PolygonDrawMode {
145 OddEvenMode,
146 WindingMode,
147 ConvexMode,
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 {
202 X11,
203 Windows,
204 QuickDraw, CoreGraphics, MacPrinter,
205 QWindowSystem,
206 PostScript,
207 OpenGL,
208 Picture,
209 SVG,
210 Raster,
211 Direct3D,
212 Pdf,
213 OpenVG,
214 OpenGL2,
215 PaintBuffer,
216 Blitter,
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
236protected:
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
246 QScopedPointer<QPaintEnginePrivate> d_ptr;
247
248private:
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
289class Q_GUI_EXPORT QPaintEngineState
290{
291public:
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
317protected:
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
332inline 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
344inline bool QPaintEngine::testDirty(DirtyFlags df) {
345 Q_ASSERT(state);
346 return ((state->dirtyFlags & df) != 0);
347}
348
349inline void QPaintEngine::setDirty(DirtyFlags df) {
350 Q_ASSERT(state);
351 state->dirtyFlags |= df;
352}
353
354inline void QPaintEngine::clearDirty(DirtyFlags df)
355{
356 Q_ASSERT(state);
357 state->dirtyFlags &= ~static_cast<uint>(df);
358}
359
360Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags)
361Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures)
362Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags)
363
364QT_END_NAMESPACE
365
366QT_END_HEADER
367
368#endif // QPAINTENGINE_H
369