1 /****************************************************************************
3 ** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtGui module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #ifndef QPAINTENGINE_H
43 #define QPAINTENGINE_H
45 #include <QtCore/qnamespace.h>
46 #include <QtCore/qobjectdefs.h>
47 #include <QtCore/qscopedpointer.h>
48 #include <QtGui/qpainter.h>
59 class QPaintEnginePrivate;
66 class QPaintEngineState;
68 class Q_GUI_EXPORT QTextItem {
78 Q_DECLARE_FLAGS(RenderFlags, RenderFlag)
79 qreal descent() const;
83 RenderFlags renderFlags() const;
87 Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE);
90 class Q_GUI_EXPORT QPaintEngine
92 Q_DECLARE_PRIVATE(QPaintEngine)
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
118 0x40000000, // Used internally for emulating opaque backgrounds
121 AllFeatures = 0xffffffff // For convenience
123 Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature)
128 DirtyBrushOrigin = 0x0004,
130 DirtyBackground = 0x0010,
131 DirtyBackgroundMode = 0x0020,
132 DirtyTransform = 0x0040,
133 DirtyClipRegion = 0x0080,
134 DirtyClipPath = 0x0100,
136 DirtyCompositionMode = 0x0400,
137 DirtyClipEnabled = 0x0800,
138 DirtyOpacity = 0x1000,
142 Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
144 enum PolygonDrawMode {
151 explicit QPaintEngine(PaintEngineFeatures features=0);
152 virtual ~QPaintEngine();
154 bool isActive() const { return active; }
155 void setActive(bool newState) { active = newState; }
157 virtual bool begin(QPaintDevice *pdev) = 0;
158 virtual bool end() = 0;
160 virtual void updateState(const QPaintEngineState &state) = 0;
162 virtual void drawRects(const QRect *rects, int rectCount);
163 virtual void drawRects(const QRectF *rects, int rectCount);
165 virtual void drawLines(const QLine *lines, int lineCount);
166 virtual void drawLines(const QLineF *lines, int lineCount);
168 virtual void drawEllipse(const QRectF &r);
169 virtual void drawEllipse(const QRect &r);
171 virtual void drawPath(const QPainterPath &path);
173 virtual void drawPoints(const QPointF *points, int pointCount);
174 virtual void drawPoints(const QPoint *points, int pointCount);
176 virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
177 virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
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);
185 void setPaintDevice(QPaintDevice *device);
186 QPaintDevice *paintDevice() const;
188 void setSystemClip(const QRegion &baseClip);
189 QRegion systemClip() const;
191 void setSystemRect(const QRect &rect);
192 QRect systemRect() const;
195 virtual HDC getDC() const;
196 virtual void releaseDC(HDC hdc) const;
199 virtual QPoint coordinateOffset() const;
204 QuickDraw, CoreGraphics, MacPrinter,
218 User = 50, // first user type id
219 MaxUser = 100 // last user type id
221 virtual Type type() const = 0;
223 inline void fix_neg_rect(int *x, int *y, int *w, int *h);
225 inline bool testDirty(DirtyFlags df);
226 inline void setDirty(DirtyFlags df);
227 inline void clearDirty(DirtyFlags df);
229 bool hasFeature(PaintEngineFeatures feature) const { return (gccaps & feature) != 0; }
231 QPainter *painter() const;
234 inline bool isExtended() const { return extended; }
237 QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=0);
239 QPaintEngineState *state;
240 PaintEngineFeatures gccaps;
243 uint selfDestruct : 1;
246 QScopedPointer<QPaintEnginePrivate> d_ptr;
249 void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }
250 bool autoDestruct() const { return selfDestruct; }
251 Q_DISABLE_COPY(QPaintEngine)
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;
260 #ifndef QT_NO_QWS_QPF
261 friend class QFontEngineQPF1;
263 #ifndef QT_NO_QWS_QPF2
264 friend class QFontEngineQPF;
266 friend class QPSPrintEngine;
267 friend class QMacPrintEngine;
268 friend class QMacPrintEnginePrivate;
270 friend class QtopiaPrintEngine;
271 friend class QtopiaPrintEnginePrivate;
272 friend class QProxyFontEngine;
275 friend class QFontEngineQPA;
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;
289 class Q_GUI_EXPORT QPaintEngineState
292 QPaintEngine::DirtyFlags state() const { return dirtyFlags; }
295 QBrush brush() const;
296 QPointF brushOrigin() const;
297 QBrush backgroundBrush() const;
298 Qt::BGMode backgroundMode() const;
300 QMatrix matrix() const;
301 QTransform transform() const;
303 Qt::ClipOperation clipOperation() const;
304 QRegion clipRegion() const;
305 QPainterPath clipPath() const;
306 bool isClipEnabled() const;
308 QPainter::RenderHints renderHints() const;
309 QPainter::CompositionMode compositionMode() const;
310 qreal opacity() const;
312 QPainter *painter() const;
314 bool brushNeedsResolving() const;
315 bool penNeedsResolving() const;
318 friend class QPaintEngine;
319 friend class QRasterPaintEngine;
320 friend class QWidget;
321 friend class QPainter;
322 friend class QPainterPrivate;
323 friend class QMacPrintEnginePrivate;
325 QPaintEngine::DirtyFlags dirtyFlags;
332 inline void QPaintEngine::fix_neg_rect(int *x, int *y, int *w, int *h)
344 inline bool QPaintEngine::testDirty(DirtyFlags df) {
346 return ((state->dirtyFlags & df) != 0);
349 inline void QPaintEngine::setDirty(DirtyFlags df) {
351 state->dirtyFlags |= df;
354 inline void QPaintEngine::clearDirty(DirtyFlags df)
357 state->dirtyFlags &= ~static_cast<uint>(df);
360 Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags)
361 Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures)
362 Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags)
368 #endif // QPAINTENGINE_H