Coverage Report

Created: 2026-06-14 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/qtbase/src/gui/painting/qpaintengine.h
Line
Count
Source
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 QPAINTENGINE_H
6
#define QPAINTENGINE_H
7
8
#include <QtGui/qtguiglobal.h>
9
#include <QtCore/qnamespace.h>
10
#include <QtCore/qobjectdefs.h>
11
#include <QtCore/qscopedpointer.h>
12
#include <QtGui/qpainter.h>
13
14
QT_BEGIN_NAMESPACE
15
16
17
class QFontEngine;
18
class QLineF;
19
class QPaintDevice;
20
class QPaintEnginePrivate;
21
class QPainterPath;
22
class QPointF;
23
class QPolygonF;
24
class QRectF;
25
struct QGlyphLayout;
26
class QTextItemInt;
27
class QPaintEngineState;
28
29
class Q_GUI_EXPORT QTextItem {
30
public:
31
    enum RenderFlag {
32
        RightToLeft = 0x1,
33
        Overline = 0x10,
34
        Underline = 0x20,
35
        StrikeOut = 0x40,
36
37
        Dummy = 0xffffffff
38
    };
39
    Q_DECLARE_FLAGS(RenderFlags, RenderFlag)
40
    qreal descent() const;
41
    qreal ascent() const;
42
    qreal width() const;
43
44
    RenderFlags renderFlags() const;
45
    QString text() const;
46
    QFont font() const;
47
};
48
Q_DECLARE_TYPEINFO(QTextItem, Q_PRIMITIVE_TYPE);
49
50
51
class Q_GUI_EXPORT QPaintEngine
52
{
53
    Q_DECLARE_PRIVATE(QPaintEngine)
54
public:
55
    enum PaintEngineFeature {
56
        PrimitiveTransform          = 0x00000001, // Can transform primitives brushes
57
        PatternTransform            = 0x00000002, // Can transform pattern brushes
58
        PixmapTransform             = 0x00000004, // Can transform pixmaps
59
        PatternBrush                = 0x00000008, // Can fill with pixmaps and standard patterns
60
        LinearGradientFill          = 0x00000010, // Can fill gradient areas
61
        RadialGradientFill          = 0x00000020, // Can render radial gradients
62
        ConicalGradientFill         = 0x00000040, // Can render conical gradients
63
        AlphaBlend                  = 0x00000080, // Can do source over alpha blend
64
        PorterDuff                  = 0x00000100, // Can do general porter duff compositions
65
        PainterPaths                = 0x00000200, // Can fill, outline and clip paths
66
        Antialiasing                = 0x00000400, // Can antialias lines
67
        BrushStroke                 = 0x00000800, // Can render brush based pens
68
        ConstantOpacity             = 0x00001000, // Can render at constant opacity
69
        MaskedBrush                 = 0x00002000, // Can fill with textures that has an alpha channel or mask
70
        PerspectiveTransform        = 0x00004000, // Can do perspective transformations
71
        BlendModes                  = 0x00008000, // Can do extended Porter&Duff composition
72
        ObjectBoundingModeGradients = 0x00010000, // Can do object bounding mode gradients
73
        RasterOpModes               = 0x00020000, // Can do logical raster operations
74
        PaintOutsidePaintEvent      = 0x20000000, // Engine is capable of painting outside paint events
75
        /*                          0x10000000, // Used for emulating
76
                                    QGradient::StretchToDevice,
77
                                    defined in qpainter.cpp
78
79
                                    0x40000000, // Used internally for emulating opaque backgrounds
80
        */
81
82
        AllFeatures               = 0xffffffff  // For convenience
83
    };
84
    Q_DECLARE_FLAGS(PaintEngineFeatures, PaintEngineFeature)
85
86
    enum DirtyFlag {
87
        DirtyPen                = 0x0001,
88
        DirtyBrush              = 0x0002,
89
        DirtyBrushOrigin        = 0x0004,
90
        DirtyFont               = 0x0008,
91
        DirtyBackground         = 0x0010,
92
        DirtyBackgroundMode     = 0x0020,
93
        DirtyTransform          = 0x0040,
94
        DirtyClipRegion         = 0x0080,
95
        DirtyClipPath           = 0x0100,
96
        DirtyHints              = 0x0200,
97
        DirtyCompositionMode    = 0x0400,
98
        DirtyClipEnabled        = 0x0800,
99
        DirtyOpacity            = 0x1000,
100
101
        AllDirty                = 0xffff
102
    };
103
    Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag)
104
105
    enum PolygonDrawMode {
106
        OddEvenMode,
107
        WindingMode,
108
        ConvexMode,
109
        PolylineMode
110
    };
111
112
    explicit QPaintEngine(PaintEngineFeatures features=PaintEngineFeatures());
113
    virtual ~QPaintEngine();
114
115
4.23M
    bool isActive() const { return active; }
116
4.23M
    void setActive(bool newState) { active = newState; }
117
118
    virtual bool begin(QPaintDevice *pdev) = 0;
119
    virtual bool end() = 0;
120
121
    virtual void updateState(const QPaintEngineState &state) = 0;
122
123
    virtual void drawRects(const QRect *rects, int rectCount);
124
    virtual void drawRects(const QRectF *rects, int rectCount);
125
126
    virtual void drawLines(const QLine *lines, int lineCount);
127
    virtual void drawLines(const QLineF *lines, int lineCount);
128
129
    virtual void drawEllipse(const QRectF &r);
130
    virtual void drawEllipse(const QRect &r);
131
132
    virtual void drawPath(const QPainterPath &path);
133
134
    virtual void drawPoints(const QPointF *points, int pointCount);
135
    virtual void drawPoints(const QPoint *points, int pointCount);
136
137
    virtual void drawPolygon(const QPointF *points, int pointCount, PolygonDrawMode mode);
138
    virtual void drawPolygon(const QPoint *points, int pointCount, PolygonDrawMode mode);
139
140
    virtual void drawPixmap(const QRectF &r, const QPixmap &pm, const QRectF &sr) = 0;
141
    virtual void drawTextItem(const QPointF &p, const QTextItem &textItem);
142
    virtual void drawTiledPixmap(const QRectF &r, const QPixmap &pixmap, const QPointF &s);
143
    virtual void drawImage(const QRectF &r, const QImage &pm, const QRectF &sr,
144
                           Qt::ImageConversionFlags flags = Qt::AutoColor);
145
146
    void setPaintDevice(QPaintDevice *device);
147
    QPaintDevice *paintDevice() const;
148
149
    void setSystemClip(const QRegion &baseClip);
150
    QRegion systemClip() const;
151
152
    void setSystemRect(const QRect &rect);
153
    QRect systemRect() const;
154
155
156
    virtual QPoint coordinateOffset() const;
157
158
    enum Type {
159
        X11,
160
        Windows,
161
        QuickDraw, CoreGraphics, MacPrinter,
162
        QWindowSystem,
163
        OpenGL,
164
        Picture,
165
        SVG,
166
        Raster,
167
        Direct3D,
168
        Pdf,
169
        OpenVG,
170
        OpenGL2,
171
        PaintBuffer,
172
        Blitter,
173
        Direct2D,
174
175
        User = 50,    // first user type id
176
        MaxUser = 100 // last user type id
177
    };
178
    virtual Type type() const = 0;
179
180
    inline void fix_neg_rect(int *x, int *y, int *w, int *h);
181
182
    inline bool testDirty(DirtyFlags df);
183
    inline void setDirty(DirtyFlags df);
184
    inline void clearDirty(DirtyFlags df);
185
186
0
    bool hasFeature(PaintEngineFeatures feature) const { return bool(gccaps & feature); }
187
188
    QPainter *painter() const;
189
190
    void syncState();
191
1.41M
    inline bool isExtended() const { return extended; }
192
193
    virtual QPixmap createPixmap(QSize size);
194
    virtual QPixmap createPixmapFromImage(QImage image, Qt::ImageConversionFlags flags = Qt::AutoColor);
195
196
protected:
197
    QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=PaintEngineFeatures());
198
199
    QPaintEngineState *state;
200
    PaintEngineFeatures gccaps;
201
202
    uint active : 1;
203
    uint selfDestruct : 1;
204
    uint extended : 1;
205
206
    QScopedPointer<QPaintEnginePrivate> d_ptr;
207
208
private:
209
0
    void setAutoDestruct(bool autoDestr) { selfDestruct = autoDestr; }
210
1.41M
    bool autoDestruct() const { return selfDestruct; }
211
    Q_DISABLE_COPY(QPaintEngine)
212
213
    friend class QPainterReplayer;
214
    friend class QFontEngineBox;
215
    friend class QFontEngineMac;
216
    friend class QFontEngineWin;
217
    friend class QMacPrintEngine;
218
    friend class QMacPrintEnginePrivate;
219
    friend class QFontEngineQPF2;
220
    friend class QPainter;
221
    friend class QPainterPrivate;
222
    friend class QWidget;
223
    friend class QWidgetPrivate;
224
    friend class QWin32PaintEngine;
225
    friend class QWin32PaintEnginePrivate;
226
    friend class QMacCGContext;
227
    friend class QPreviewPaintEngine;
228
    friend class QX11GLPlatformPixmap;
229
};
230
231
232
class Q_GUI_EXPORT QPaintEngineState
233
{
234
public:
235
0
    QPaintEngine::DirtyFlags state() const { return dirtyFlags; }
236
237
    QPen pen() const;
238
    QBrush brush() const;
239
    QPointF brushOrigin() const;
240
    QBrush backgroundBrush() const;
241
    Qt::BGMode backgroundMode() const;
242
    QFont font() const;
243
    QTransform transform() const;
244
245
    Qt::ClipOperation clipOperation() const;
246
    QRegion clipRegion() const;
247
    QPainterPath clipPath() const;
248
    bool isClipEnabled() const;
249
250
    QPainter::RenderHints renderHints() const;
251
    QPainter::CompositionMode compositionMode() const;
252
    qreal opacity() const;
253
254
    QPainter *painter() const;
255
256
    bool brushNeedsResolving() const;
257
    bool penNeedsResolving() const;
258
259
protected:
260
    friend class QPaintEngine;
261
    friend class QRasterPaintEngine;
262
    friend class QWidget;
263
    friend class QPainter;
264
    friend class QPainterPrivate;
265
    friend class QMacPrintEnginePrivate;
266
267
    QPaintEngine::DirtyFlags dirtyFlags;
268
};
269
270
//
271
// inline functions
272
//
273
274
inline void QPaintEngine::fix_neg_rect(int *x, int *y, int *w, int *h)
275
0
{
276
0
    if (*w < 0) {
277
0
        *w = -*w;
278
0
        *x -= *w - 1;
279
0
    }
280
0
    if (*h < 0) {
281
0
        *h = -*h;
282
0
        *y -= *h - 1;
283
0
    }
284
0
}
285
286
0
inline bool QPaintEngine::testDirty(DirtyFlags df) {
287
0
    Q_ASSERT(state);
288
0
    return bool(state->dirtyFlags & df);
289
0
}
290
291
1.41M
inline void QPaintEngine::setDirty(DirtyFlags df) {
292
1.41M
    Q_ASSERT(state);
293
1.41M
    state->dirtyFlags |= df;
294
1.41M
}
295
296
inline void QPaintEngine::clearDirty(DirtyFlags df)
297
0
{
298
0
    Q_ASSERT(state);
299
0
    state->dirtyFlags &= ~df;
300
0
}
301
302
0
Q_DECLARE_OPERATORS_FOR_FLAGS(QTextItem::RenderFlags)
Unexecuted instantiation: operator|(QTextItem::RenderFlag, QTextItem::RenderFlag)
Unexecuted instantiation: operator|(QTextItem::RenderFlag, QFlags<QTextItem::RenderFlag>)
Unexecuted instantiation: operator&(QTextItem::RenderFlag, QTextItem::RenderFlag)
Unexecuted instantiation: operator&(QTextItem::RenderFlag, QFlags<QTextItem::RenderFlag>)
Unexecuted instantiation: operator^(QTextItem::RenderFlag, QTextItem::RenderFlag)
Unexecuted instantiation: operator^(QTextItem::RenderFlag, QFlags<QTextItem::RenderFlag>)
Unexecuted instantiation: operator|(QTextItem::RenderFlag, int)
303
0
Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::PaintEngineFeatures)
Unexecuted instantiation: operator|(QPaintEngine::PaintEngineFeature, QPaintEngine::PaintEngineFeature)
Unexecuted instantiation: operator|(QPaintEngine::PaintEngineFeature, QFlags<QPaintEngine::PaintEngineFeature>)
Unexecuted instantiation: operator&(QPaintEngine::PaintEngineFeature, QPaintEngine::PaintEngineFeature)
Unexecuted instantiation: operator&(QPaintEngine::PaintEngineFeature, QFlags<QPaintEngine::PaintEngineFeature>)
Unexecuted instantiation: operator^(QPaintEngine::PaintEngineFeature, QPaintEngine::PaintEngineFeature)
Unexecuted instantiation: operator^(QPaintEngine::PaintEngineFeature, QFlags<QPaintEngine::PaintEngineFeature>)
Unexecuted instantiation: operator|(QPaintEngine::PaintEngineFeature, int)
304
Q_DECLARE_OPERATORS_FOR_FLAGS(QPaintEngine::DirtyFlags)
Unexecuted instantiation: operator|(QPaintEngine::DirtyFlag, QPaintEngine::DirtyFlag)
Unexecuted instantiation: operator|(QPaintEngine::DirtyFlag, QFlags<QPaintEngine::DirtyFlag>)
Unexecuted instantiation: operator&(QPaintEngine::DirtyFlag, QPaintEngine::DirtyFlag)
Unexecuted instantiation: operator&(QPaintEngine::DirtyFlag, QFlags<QPaintEngine::DirtyFlag>)
Unexecuted instantiation: operator^(QPaintEngine::DirtyFlag, QPaintEngine::DirtyFlag)
Unexecuted instantiation: operator^(QPaintEngine::DirtyFlag, QFlags<QPaintEngine::DirtyFlag>)
Unexecuted instantiation: operator|(QPaintEngine::DirtyFlag, int)
305
306
QT_END_NAMESPACE
307
308
#endif // QPAINTENGINE_H