Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qpainter_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QPAINTER_P_H
5#define QPAINTER_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qspan.h>
19#include <QtCore/qvarlengtharray.h>
20#include <QtGui/private/qtguiglobal_p.h>
21#include "QtGui/qbrush.h"
22#include "QtGui/qcolorspace.h"
23#include "QtGui/qcolortransform.h"
24#include "QtGui/qfont.h"
25#include "QtGui/qpen.h"
26#include "QtGui/qregion.h"
27#include "QtGui/qpainter.h"
28#include "QtGui/qpainterpath.h"
29#include "QtGui/qpaintengine.h"
30
31#include <private/qpen_p.h>
32
33#include <memory>
34#include <stack>
35
36QT_BEGIN_NAMESPACE
37
38class QPaintEngine;
39class QEmulationPaintEngine;
40class QPaintEngineEx;
41struct QFixedPoint;
42
43struct QTLWExtra;
44
46 void *ptr;
47};
48
49inline const void *data_ptr(const QTransform &t) { return (const DataPtrContainer *) &t; }
50inline bool qtransform_fast_equals(const QTransform &a, const QTransform &b) { return data_ptr(a) == data_ptr(b); }
51
52// QPen inline functions...
53inline QPen::DataPtr &data_ptr(const QPen &p) { return const_cast<QPen &>(p).data_ptr(); }
54inline bool qpen_fast_equals(const QPen &a, const QPen &b) { return data_ptr(a) == data_ptr(b); }
55inline QBrush qpen_brush(const QPen &p) { return data_ptr(p)->brush; }
56inline qreal qpen_widthf(const QPen &p) { return data_ptr(p)->width; }
57inline Qt::PenStyle qpen_style(const QPen &p) { return data_ptr(p)->style; }
58inline Qt::PenCapStyle qpen_capStyle(const QPen &p) { return data_ptr(p)->capStyle; }
59inline Qt::PenJoinStyle qpen_joinStyle(const QPen &p) { return data_ptr(p)->joinStyle; }
60
61// QBrush inline functions...
62inline QBrush::DataPtr &data_ptr(const QBrush &p) { return const_cast<QBrush &>(p).data_ptr(); }
63inline bool qbrush_fast_equals(const QBrush &a, const QBrush &b) { return data_ptr(a) == data_ptr(b); }
64inline Qt::BrushStyle qbrush_style(const QBrush &b) { return data_ptr(b)->style; }
65inline const QColor &qbrush_color(const QBrush &b) { return data_ptr(b)->color; }
66inline bool qbrush_has_transform(const QBrush &b) { return data_ptr(b)->transform.type() > QTransform::TxNone; }
67
69{
70public:
71 QPainterClipInfo() { } // for QList, don't use
73
74 QPainterClipInfo(const QPainterPath &p, Qt::ClipOperation op, const QTransform &m) :
76
77 QPainterClipInfo(const QRegion &r, Qt::ClipOperation op, const QTransform &m) :
79
80 QPainterClipInfo(const QRect &r, Qt::ClipOperation op, const QTransform &m) :
82
83 QPainterClipInfo(const QRectF &r, Qt::ClipOperation op, const QTransform &m) :
85
89 QPainterPath path;
92 QRectF rectf;
93
94 // ###
95// union {
96// QRegionData *d;
97// QPainterPathPrivate *pathData;
98
99// struct {
100// int x, y, w, h;
101// } rectData;
102// struct {
103// qreal x, y, w, h;
104// } rectFData;
105// };
106
107};
108
110
111class Q_GUI_EXPORT QPainterState : public QPaintEngineState
112{
113public:
114 QPainterState();
115 QPainterState(const QPainterState *s);
116 virtual ~QPainterState();
117 void init(QPainter *p);
118
119 QPointF brushOrigin;
120 QFont font;
121 QFont deviceFont;
122 QPen pen;
123 QBrush brush;
124 QBrush bgBrush = Qt::white; // background brush
125 QRegion clipRegion;
126 QPainterPath clipPath;
127 Qt::ClipOperation clipOperation = Qt::NoClip;
128 QPainter::RenderHints renderHints;
129 QList<QPainterClipInfo> clipInfo; // ### Make me smaller and faster to copy around...
130 QTransform worldMatrix; // World transformation matrix, not window and viewport
131 QTransform matrix; // Complete transformation matrix,
132 QTransform redirectionMatrix;
133 int wx = 0, wy = 0, ww = 0, wh = 0; // window rectangle
134 int vx = 0, vy = 0, vw = 0, vh = 0; // viewport rectangle
135 qreal opacity = 1;
136
137 uint WxF:1; // World transformation
138 uint VxF:1; // View transformation
139 uint clipEnabled:1;
140
141 Qt::BGMode bgMode = Qt::TransparentMode;
142 QPainter *painter = nullptr;
143 Qt::LayoutDirection layoutDirection;
144 QPainter::CompositionMode composition_mode = QPainter::CompositionMode_SourceOver;
145 uint emulationSpecifier = 0;
146 uint changeFlags = 0;
147};
148
156
157class QRawFont;
159{
160 Q_DECLARE_PUBLIC(QPainter)
161public:
164
166 // Allocate space for 4 d-pointers (enough for up to 4 sub-sequent
167 // redirections within the same paintEvent(), which should be enough
168 // in 99% of all cases). E.g: A renders B which renders C which renders D.
169 static constexpr qsizetype NDPtrs = 4;
171
173 template <typename T, std::size_t N = 8>
175 void clear() { this->c.clear(); }
176 };
178
180
185
190
192 if (!dummyState)
193 dummyState = std::make_unique<QPainterDummyState>();
194 return dummyState.get();
195 }
196
197 void updateEmulationSpecifier(QPainterState *s);
198 void updateStateImpl(QPainterState *state);
199 void updateState(QPainterState *state);
200 void updateState(std::unique_ptr<QPainterState> &state) { updateState(state.get()); }
201
202 void draw_helper(const QPainterPath &path, DrawOperation operation = StrokeAndFillDraw);
203 void drawStretchedGradient(const QPainterPath &path, DrawOperation operation);
204 void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation);
205 void drawTextItem(const QPointF &p, const QTextItem &_ti, QTextEngine *textEngine);
206
207#if !defined(QT_NO_RAWFONT)
208 void drawGlyphs(const QPointF &decorationPosition, const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount,
209 QFontEngine *fontEngine, bool overline = false, bool underline = false,
210 bool strikeOut = false);
211#endif
212
213 void updateMatrix();
214 void updateInvMatrix();
215
216 void checkEmulation();
217
218 static QPainterPrivate *get(QPainter *painter)
219 {
220 return painter->d_ptr.get();
221 }
222
226 static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev);
228 void initFrom(const QPaintDevice *device);
229
230 QPaintDevice *device = nullptr;
231 QPaintDevice *original_device = nullptr;
232 QPaintDevice *helper_device = nullptr;
233
235 void operator()(QPaintEngine *pe) const noexcept
236 {
237 if (pe && pe->autoDestruct())
238 delete pe;
239 }
240 };
242
244 QPaintEngineEx *extended = nullptr;
245 QBrush colorBrush; // for fill with solid color
246
247 Q_GUI_EXPORT void setEngineDirtyFlags(QSpan<const QPaintEngine::DirtyFlags>);
248};
249
250Q_GUI_EXPORT void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivate::DrawOperation operation);
251
252QString qt_generate_brush_key(const QBrush &brush);
253
254
255QT_END_NAMESPACE
256
257#endif // QPAINTER_P_H
QObject * q_ptr
Definition qobject.h:72
void setSystemViewport(const QRegion &region)
void setSystemTransform(const QTransform &xform)
QPaintDevice * currentClipDevice
QTransform systemTransform
static QPaintEnginePrivate * get(QPaintEngine *paintEngine)
virtual void systemStateChanged()
void setSystemTransformAndViewport(const QTransform &xform, const QRegion &region)
QPaintDevice * pdev
void drawBoxTextItem(const QPointF &p, const QTextItemInt &ti)
virtual Qt::HANDLE nativeHandle()
virtual QPaintEngine * aggregateEngine()
friend class QPainter
QPainterClipInfo(const QRectF &r, Qt::ClipOperation op, const QTransform &m)
Definition qpainter_p.h:83
QTransform matrix
Definition qpainter_p.h:87
ClipType clipType
Definition qpainter_p.h:86
QPainterClipInfo(const QRegion &r, Qt::ClipOperation op, const QTransform &m)
Definition qpainter_p.h:77
QPainterPath path
Definition qpainter_p.h:89
Qt::ClipOperation operation
Definition qpainter_p.h:88
QPainterClipInfo(const QPainterPath &p, Qt::ClipOperation op, const QTransform &m)
Definition qpainter_p.h:74
void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation)
Definition qpainter.cpp:474
void updateEmulationSpecifier(QPainterState *s)
Definition qpainter.cpp:656
QTransform invMatrix
Definition qpainter_p.h:181
QPaintDevice * original_device
Definition qpainter_p.h:231
QPainterDummyState * fakeState() const
Definition qpainter_p.h:191
QPaintEngineEx * extended
Definition qpainter_p.h:244
QPaintDevice * helper_device
Definition qpainter_p.h:232
void initFrom(const QPaintDevice *device)
static constexpr qsizetype NDPtrs
Definition qpainter_p.h:169
void updateMatrix()
Definition qpainter.cpp:627
void updateInvMatrix()
Definition qpainter.cpp:647
SmallStack< std::unique_ptr< QPainterState > > savedStates
Definition qpainter_p.h:177
static QPainterPrivate * get(QPainter *painter)
Definition qpainter_p.h:218
std::unique_ptr< QPaintEngine, QPaintEngineDestructor > engine
Definition qpainter_p.h:241
void updateState(QPainterState *state)
Definition qpainter.cpp:893
std::unique_ptr< QEmulationPaintEngine > emulationEngine
Definition qpainter_p.h:243
void draw_helper(const QPainterPath &path, DrawOperation operation=StrokeAndFillDraw)
Definition qpainter.cpp:318
QPainter * q_ptr
Definition qpainter_p.h:165
void drawTextItem(const QPointF &p, const QTextItem &_ti, QTextEngine *textEngine)
Q_GUI_EXPORT void setEngineDirtyFlags(QSpan< const QPaintEngine::DirtyFlags >)
void drawStretchedGradient(const QPainterPath &path, DrawOperation operation)
Definition qpainter.cpp:512
void updateState(std::unique_ptr< QPainterState > &state)
Definition qpainter_p.h:200
QTransform hidpiScaleTransform() const
Definition qpainter.cpp:229
void detachPainterPrivate(QPainter *q)
Definition qpainter.cpp:291
QPaintDevice * device
Definition qpainter_p.h:230
QTransform viewTransform() const
Definition qpainter.cpp:209
qreal effectiveDevicePixelRatio() const
Definition qpainter.cpp:220
std::unique_ptr< QPainterDummyState > dummyState
Definition qpainter_p.h:179
void checkEmulation()
Definition qpainter.cpp:173
std::unique_ptr< QPainterState > state
Definition qpainter_p.h:172
void updateStateImpl(QPainterState *state)
Definition qpainter.cpp:861
static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev)
Definition qpainter.cpp:239
void drawGlyphs(const QPointF &decorationPosition, const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount, QFontEngine *fontEngine, bool overline=false, bool underline=false, bool strikeOut=false)
QVarLengthArray< std::unique_ptr< QPainterPrivate >, NDPtrs > d_ptrs
Definition qpainter_p.h:170
friend class QFontEngine
Definition qpainter.h:432
friend class QPaintEngine
Definition qpainter.h:437
\inmodule QtCore\reentrant
Definition qpoint.h:231
Internal QTextItem.
Combined button and popup list for selecting options.
Q_DECLARE_TYPEINFO(QT_PointF, Q_PRIMITIVE_TYPE)
Q_GUI_EXPORT void qt_draw_tile(QPaintEngine *gc, qreal x, qreal y, qreal w, qreal h, const QPixmap &pixmap, qreal xOffset, qreal yOffset)
void qt_fill_tile(QPixmap *tile, const QPixmap &pixmap)
Q_DECLARE_TYPEINFO(QT_Point, Q_PRIMITIVE_TYPE)
static QPaintEngine * qt_polygon_recursion
qreal qpen_widthf(const QPen &p)
Definition qpainter_p.h:56
Qt::BrushStyle qbrush_style(const QBrush &b)
Definition qpainter_p.h:64
bool qpen_fast_equals(const QPen &a, const QPen &b)
Definition qpainter_p.h:54
Qt::PenStyle qpen_style(const QPen &p)
Definition qpainter_p.h:57
const QColor & qbrush_color(const QBrush &b)
Definition qpainter_p.h:65
const void * data_ptr(const QTransform &t)
Definition qpainter_p.h:49
QString qt_generate_brush_key(const QBrush &brush)
Q_DECLARE_TYPEINFO(QPainterClipInfo, Q_RELOCATABLE_TYPE)
Qt::PenCapStyle qpen_capStyle(const QPen &p)
Definition qpainter_p.h:58
Qt::PenJoinStyle qpen_joinStyle(const QPen &p)
Definition qpainter_p.h:59
QBrush qpen_brush(const QPen &p)
Definition qpainter_p.h:55
bool qbrush_fast_equals(const QBrush &a, const QBrush &b)
Definition qpainter_p.h:63
bool qtransform_fast_equals(const QTransform &a, const QTransform &b)
Definition qpainter_p.h:50
Q_GUI_EXPORT void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivate::DrawOperation operation)
bool qbrush_has_transform(const QBrush &b)
Definition qpainter_p.h:66
QTransform transform
Definition qpainter_p.h:154
void operator()(QPaintEngine *pe) const noexcept
Definition qpainter_p.h:235