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// Qt-Security score:significant reason:default
4
5#ifndef QPAINTER_P_H
6#define QPAINTER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtCore/qspan.h>
20#include <QtCore/qvarlengtharray.h>
21#include <QtGui/private/qtguiglobal_p.h>
22#include "QtGui/qbrush.h"
23#include "QtGui/qcolorspace.h"
24#include "QtGui/qcolortransform.h"
25#include "QtGui/qfont.h"
26#include "QtGui/qpen.h"
27#include "QtGui/qregion.h"
28#include "QtGui/qpainter.h"
29#include "QtGui/qpainterpath.h"
30#include "QtGui/qpaintengine.h"
31
32#include <private/qpen_p.h>
33
34#include <memory>
35#include <stack>
36
37QT_BEGIN_NAMESPACE
38
39class QPaintEngine;
40class QEmulationPaintEngine;
41class QPaintEngineEx;
42struct QFixedPoint;
43
44struct QTLWExtra;
45
47 void *ptr;
48};
49
50inline const void *data_ptr(const QTransform &t) { return (const DataPtrContainer *) &t; }
51inline bool qtransform_fast_equals(const QTransform &a, const QTransform &b) { return data_ptr(a) == data_ptr(b); }
52
53// QPen inline functions...
54inline QPen::DataPtr &data_ptr(const QPen &p) { return const_cast<QPen &>(p).data_ptr(); }
55inline bool qpen_fast_equals(const QPen &a, const QPen &b) { return data_ptr(a) == data_ptr(b); }
56inline QBrush qpen_brush(const QPen &p) { return data_ptr(p)->brush; }
57inline qreal qpen_widthf(const QPen &p) { return data_ptr(p)->width; }
58inline Qt::PenStyle qpen_style(const QPen &p) { return data_ptr(p)->style; }
59inline Qt::PenCapStyle qpen_capStyle(const QPen &p) { return data_ptr(p)->capStyle; }
60inline Qt::PenJoinStyle qpen_joinStyle(const QPen &p) { return data_ptr(p)->joinStyle; }
61
62// QBrush inline functions...
63inline QBrush::DataPtr &data_ptr(const QBrush &p) { return const_cast<QBrush &>(p).data_ptr(); }
64inline bool qbrush_fast_equals(const QBrush &a, const QBrush &b) { return data_ptr(a) == data_ptr(b); }
65inline Qt::BrushStyle qbrush_style(const QBrush &b) { return data_ptr(b)->style; }
66inline const QColor &qbrush_color(const QBrush &b) { return data_ptr(b)->color; }
67inline bool qbrush_has_transform(const QBrush &b) { return data_ptr(b)->transform.type() > QTransform::TxNone; }
68
70{
71public:
72 QPainterClipInfo() { } // for QList, don't use
74
75 QPainterClipInfo(const QPainterPath &p, Qt::ClipOperation op, const QTransform &m) :
77
78 QPainterClipInfo(const QRegion &r, Qt::ClipOperation op, const QTransform &m) :
80
81 QPainterClipInfo(const QRect &r, Qt::ClipOperation op, const QTransform &m) :
83
84 QPainterClipInfo(const QRectF &r, Qt::ClipOperation op, const QTransform &m) :
86
90 QPainterPath path;
93 QRectF rectf;
94
95 // ###
96// union {
97// QRegionData *d;
98// QPainterPathPrivate *pathData;
99
100// struct {
101// int x, y, w, h;
102// } rectData;
103// struct {
104// qreal x, y, w, h;
105// } rectFData;
106// };
107
108};
109
111
112class Q_GUI_EXPORT QPainterState : public QPaintEngineState
113{
114public:
115 QPainterState();
116 QPainterState(const QPainterState *s);
117 virtual ~QPainterState();
118 void init(QPainter *p);
119
120 QPointF brushOrigin;
121 QFont font;
122 QFont deviceFont;
123 QPen pen;
124 QBrush brush;
125 QBrush bgBrush = Qt::white; // background brush
126 QRegion clipRegion;
127 QPainterPath clipPath;
128 Qt::ClipOperation clipOperation = Qt::NoClip;
129 QPainter::RenderHints renderHints;
130 QList<QPainterClipInfo> clipInfo; // ### Make me smaller and faster to copy around...
131 QTransform worldMatrix; // World transformation matrix, not window and viewport
132 QTransform matrix; // Complete transformation matrix,
133 QTransform redirectionMatrix;
134 int wx = 0, wy = 0, ww = 0, wh = 0; // window rectangle
135 int vx = 0, vy = 0, vw = 0, vh = 0; // viewport rectangle
136 qreal opacity = 1;
137
138 uint WxF:1; // World transformation
139 uint VxF:1; // View transformation
140 uint clipEnabled:1;
141
142 Qt::BGMode bgMode = Qt::TransparentMode;
143 QPainter *painter = nullptr;
144 Qt::LayoutDirection layoutDirection;
145 QPainter::CompositionMode composition_mode = QPainter::CompositionMode_SourceOver;
146 uint emulationSpecifier = 0;
147 uint changeFlags = 0;
148};
149
157
158class QRawFont;
160{
161 Q_DECLARE_PUBLIC(QPainter)
162public:
165
167 // Allocate space for 4 d-pointers (enough for up to 4 sub-sequent
168 // redirections within the same paintEvent(), which should be enough
169 // in 99% of all cases). E.g: A renders B which renders C which renders D.
170 static constexpr qsizetype NDPtrs = 4;
172
174 template <typename T, std::size_t N = 8>
176 void clear() { this->c.clear(); }
177 };
179
181
186
191
193 if (!dummyState)
194 dummyState = std::make_unique<QPainterDummyState>();
195 return dummyState.get();
196 }
197
198 void updateEmulationSpecifier(QPainterState *s);
199 void updateStateImpl(QPainterState *state);
200 void updateState(QPainterState *state);
201 void updateState(std::unique_ptr<QPainterState> &state) { updateState(state.get()); }
202
203 void draw_helper(const QPainterPath &path, DrawOperation operation = StrokeAndFillDraw);
204 void drawStretchedGradient(const QPainterPath &path, DrawOperation operation);
205 void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation);
206 void drawTextItem(const QPointF &p, const QTextItem &_ti, QTextEngine *textEngine);
207
208#if !defined(QT_NO_RAWFONT)
209 void drawGlyphs(const QPointF &decorationPosition, const quint32 *glyphArray, QFixedPoint *positionArray, int glyphCount,
210 QFontEngine *fontEngine, bool overline = false, bool underline = false,
211 bool strikeOut = false);
212#endif
213
214 void updateMatrix();
215 void updateInvMatrix();
216
217 void checkEmulation();
218
219 static QPainterPrivate *get(QPainter *painter)
220 {
221 return painter->d_ptr.get();
222 }
223
227 static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev);
229 void initFrom(const QPaintDevice *device);
230
231 QPaintDevice *device = nullptr;
232 QPaintDevice *original_device = nullptr;
233 QPaintDevice *helper_device = nullptr;
234
236 void operator()(QPaintEngine *pe) const noexcept
237 {
238 if (pe && pe->autoDestruct())
239 delete pe;
240 }
241 };
243
245 QPaintEngineEx *extended = nullptr;
246 QBrush colorBrush; // for fill with solid color
247
248 Q_GUI_EXPORT void setEngineDirtyFlags(QSpan<const QPaintEngine::DirtyFlags>);
249};
250
251Q_GUI_EXPORT void qt_draw_helper(QPainterPrivate *p, const QPainterPath &path, QPainterPrivate::DrawOperation operation);
252
253QString qt_generate_brush_key(const QBrush &brush);
254
255
256QT_END_NAMESPACE
257
258#endif // QPAINTER_P_H
QObject * q_ptr
Definition qobject.h:73
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:84
QTransform matrix
Definition qpainter_p.h:88
ClipType clipType
Definition qpainter_p.h:87
QPainterClipInfo(const QRegion &r, Qt::ClipOperation op, const QTransform &m)
Definition qpainter_p.h:78
QPainterPath path
Definition qpainter_p.h:90
Qt::ClipOperation operation
Definition qpainter_p.h:89
QPainterClipInfo(const QPainterPath &p, Qt::ClipOperation op, const QTransform &m)
Definition qpainter_p.h:75
void drawOpaqueBackground(const QPainterPath &path, DrawOperation operation)
Definition qpainter.cpp:475
void updateEmulationSpecifier(QPainterState *s)
Definition qpainter.cpp:657
QTransform invMatrix
Definition qpainter_p.h:182
QPaintDevice * original_device
Definition qpainter_p.h:232
QPainterDummyState * fakeState() const
Definition qpainter_p.h:192
QPaintEngineEx * extended
Definition qpainter_p.h:245
QPaintDevice * helper_device
Definition qpainter_p.h:233
void initFrom(const QPaintDevice *device)
static constexpr qsizetype NDPtrs
Definition qpainter_p.h:170
void updateMatrix()
Definition qpainter.cpp:628
void updateInvMatrix()
Definition qpainter.cpp:648
SmallStack< std::unique_ptr< QPainterState > > savedStates
Definition qpainter_p.h:178
static QPainterPrivate * get(QPainter *painter)
Definition qpainter_p.h:219
std::unique_ptr< QPaintEngine, QPaintEngineDestructor > engine
Definition qpainter_p.h:242
void updateState(QPainterState *state)
Definition qpainter.cpp:894
std::unique_ptr< QEmulationPaintEngine > emulationEngine
Definition qpainter_p.h:244
void draw_helper(const QPainterPath &path, DrawOperation operation=StrokeAndFillDraw)
Definition qpainter.cpp:319
QPainter * q_ptr
Definition qpainter_p.h:166
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:513
void updateState(std::unique_ptr< QPainterState > &state)
Definition qpainter_p.h:201
QTransform hidpiScaleTransform() const
Definition qpainter.cpp:230
void detachPainterPrivate(QPainter *q)
Definition qpainter.cpp:292
QPaintDevice * device
Definition qpainter_p.h:231
QTransform viewTransform() const
Definition qpainter.cpp:210
qreal effectiveDevicePixelRatio() const
Definition qpainter.cpp:221
std::unique_ptr< QPainterDummyState > dummyState
Definition qpainter_p.h:180
void checkEmulation()
Definition qpainter.cpp:174
std::unique_ptr< QPainterState > state
Definition qpainter_p.h:173
void updateStateImpl(QPainterState *state)
Definition qpainter.cpp:862
static bool attachPainterPrivate(QPainter *q, QPaintDevice *pdev)
Definition qpainter.cpp:240
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:171
friend class QFontEngine
Definition qpainter.h:433
friend class QPaintEngine
Definition qpainter.h:438
\inmodule QtCore\reentrant
Definition qpoint.h:232
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:57
Qt::BrushStyle qbrush_style(const QBrush &b)
Definition qpainter_p.h:65
bool qpen_fast_equals(const QPen &a, const QPen &b)
Definition qpainter_p.h:55
Qt::PenStyle qpen_style(const QPen &p)
Definition qpainter_p.h:58
const QColor & qbrush_color(const QBrush &b)
Definition qpainter_p.h:66
const void * data_ptr(const QTransform &t)
Definition qpainter_p.h:50
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:59
Qt::PenJoinStyle qpen_joinStyle(const QPen &p)
Definition qpainter_p.h:60
QBrush qpen_brush(const QPen &p)
Definition qpainter_p.h:56
bool qbrush_fast_equals(const QBrush &a, const QBrush &b)
Definition qpainter_p.h:64
bool qtransform_fast_equals(const QTransform &a, const QTransform &b)
Definition qpainter_p.h:51
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:67
QTransform transform
Definition qpainter_p.h:155
void operator()(QPaintEngine *pe) const noexcept
Definition qpainter_p.h:236