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
qsvggraphics_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
6#ifndef QSVGGRAPHICS_P_H
7#define QSVGGRAPHICS_P_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include "qsvgnode_p.h"
21
22#include "QtGui/qpainterpath.h"
23#include "QtGui/qimage.h"
24#include "QtGui/qtextlayout.h"
25#include "QtCore/qloggingcategory.h"
26
27#include <optional>
28
30
31Q_DECLARE_LOGGING_CATEGORY(lcSvgDraw);
32
33class QSvgGlyph;
34class QTextCharFormat;
35
36class Q_SVG_EXPORT QSvgDummyNode : public QSvgNode
37{
38public:
39 ~QSvgDummyNode() override;
40
41 void drawCommand(QPainter *, QSvgExtraStates &) override;
42 Type type() const override;
43};
44
45class Q_SVG_EXPORT QSvgEllipse : public QSvgNode
46{
47public:
48 QSvgEllipse(QSvgNode *parent, const QRectF &rect);
49 ~QSvgEllipse() override;
50
51 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
52 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
53 Type type() const override;
54 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
55 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
56 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
57 QRectF rect() const { return m_bounds; }
58private:
59 QRectF m_bounds;
60};
61
62class Q_SVG_EXPORT QSvgCircle : public QSvgEllipse
63{
64public:
65 QSvgCircle(QSvgNode *parent, const QRectF &rect) : QSvgEllipse(parent, rect) { }
66 ~QSvgCircle() override;
67
68 Type type() const override;
69};
70
71class Q_SVG_EXPORT QSvgImage : public QSvgNode
72{
73public:
74 QSvgImage(QSvgNode *parent,
75 const QImage &image,
76 const QString &filename,
77 const QRectF &bounds);
78 ~QSvgImage() override;
79
80 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
81 Type type() const override;
82 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
83
84 QRectF rect() const { return m_bounds; }
85 const QImage &image() const { return m_image; }
86 QString filename() const { return m_filename; }
87private:
88 QString m_filename;
89 QImage m_image;
90 QRectF m_bounds;
91};
92
93class Q_SVG_EXPORT QSvgLine : public QSvgNode
94{
95public:
96 QSvgLine(QSvgNode *parent, const QLineF &line);
97 ~QSvgLine() override;
98
99 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
100 Type type() const override;
101 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
102 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
103 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
104 bool requiresGroupRendering() const override;
105 QLineF line() const { return m_line; }
106private:
107 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
108 QLineF m_line;
109};
110
111class Q_SVG_EXPORT QSvgPath : public QSvgNode
112{
113public:
114 QSvgPath(QSvgNode *parent, const QPainterPath &qpath);
115 ~QSvgPath() override;
116
117 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
118 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
119 Type type() const override;
120 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
121 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
122 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
123 bool requiresGroupRendering() const override;
124 const QPainterPath &path() const { return m_path; }
125private:
126 QPainterPath m_path;
127};
128
129class Q_SVG_EXPORT QSvgPolygon : public QSvgNode
130{
131public:
132 QSvgPolygon(QSvgNode *parent, const QPolygonF &poly);
133 ~QSvgPolygon() override;
134
135 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
136 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
137 Type type() const override;
138 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
139 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
140 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
141 bool requiresGroupRendering() const override;
142 const QPolygonF &polygon() const { return m_poly; }
143private:
144 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
145 QPolygonF m_poly;
146};
147
148class Q_SVG_EXPORT QSvgPolyline : public QSvgNode
149{
150public:
151 QSvgPolyline(QSvgNode *parent, const QPolygonF &poly);
152 ~QSvgPolyline() override;
153
154 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
155 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
156 Type type() const override;
157 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
158 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
159 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
160 bool requiresGroupRendering() const override;
161 const QPolygonF &polygon() const { return m_poly; }
162private:
163 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
164 QPolygonF m_poly;
165};
166
167class Q_SVG_EXPORT QSvgRect : public QSvgNode
168{
169public:
170 QSvgRect(QSvgNode *paren, const QRectF &rect, qreal rx=0, qreal ry=0);
171 ~QSvgRect() override;
172
173 Type type() const override;
174 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
175 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
176 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
177 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
178 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
179 QRectF rect() const { return m_rect; }
180 QPointF radius() const { return { m_rx, m_ry }; }
181private:
182 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
183 QRectF m_rect;
184 qreal m_rx, m_ry;
185};
186
187class QSvgTspan;
188
189class Q_SVG_EXPORT QSvgText : public QSvgNode
190{
191public:
192 enum WhitespaceMode
193 {
194 Default,
195 Preserve
196 };
197
198 QSvgText(QSvgNode *parent, const QPointF &coord);
199 ~QSvgText() override;
200
201 void setTextArea(const QSizeF &size);
202
203 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
204 bool shouldDrawNode(QPainter *p, QSvgExtraStates &states) const override;
205 Type type() const override;
206 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
207
208 void addTspan(QSvgTspan *tspan) {m_tspans.append(tspan);}
209 const QList<QSvgTspan *> tspans() const { return m_tspans; }
210 void addText(QStringView text);
211 void addLineBreak() {m_tspans.append(LINEBREAK);}
212 void setWhitespaceMode(WhitespaceMode mode) {m_mode = mode;}
213
214 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
215 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
216
217 QPointF position() const { return m_coord; }
218 QSizeF size() const { return m_size; }
219 WhitespaceMode whitespaceMode() const { return m_mode; }
220
221private:
222 void draw_helper(QPainter *p, QSvgExtraStates &states, QRectF *boundingRect = nullptr) const;
223
224 static QSvgTspan * const LINEBREAK;
225
226 QPointF m_coord;
227 QSizeF m_size;
228
229 // 'm_tspans' is also used to store characters outside tspans and line breaks.
230 // If a 'm_tspan' item is null, it indicates a line break.
231 QList<QSvgTspan *> m_tspans;
232
233 Type m_type;
234 WhitespaceMode m_mode;
235
236 mutable std::optional<QList<const QSvgGlyph *> > m_glyphsToDraw;
237};
238
239class Q_SVG_EXPORT QSvgTspan : public QSvgNode
240{
241public:
242 // tspans are also used to store normal text, so the 'isProperTspan' is used to separate text from tspan.
243 QSvgTspan(QSvgNode *parent, bool isProperTspan = true)
244 : QSvgNode(parent), m_mode(QSvgText::Default), m_isTspan(isProperTspan)
245 {
246 }
247 ~QSvgTspan() override;
248
249 Type type() const override { return Tspan; }
250 void drawCommand(QPainter *, QSvgExtraStates &) override { Q_ASSERT(!"Tspans should be drawn through QSvgText::draw()."); }
251 void addText(QStringView text) {m_text += text;}
252 const QString &text() const {return m_text;}
253 bool isTspan() const {return m_isTspan;}
254 void setWhitespaceMode(QSvgText::WhitespaceMode mode) {m_mode = mode;}
255 QSvgText::WhitespaceMode whitespaceMode() const {return m_mode;}
256private:
257 QString m_text;
258 QSvgText::WhitespaceMode m_mode;
259 bool m_isTspan;
260};
261
262class QSvgUse : public QSvgNode
263{
264public:
265 QSvgUse(const QPointF &start, QSvgNode *parent, QSvgNode *link);
266 QSvgUse(const QPointF &start, QSvgNode *parent, const QString &linkId)
267 : QSvgUse(start, parent, nullptr)
268 { m_linkId = linkId; }
270
271 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
272 Type type() const override;
273 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
274 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
275 bool isResolved() const { return m_link != nullptr; }
276 const QString &linkId() const { return m_linkId; }
277 void setLink(QSvgNode *link) { m_link = link; }
278 QSvgNode *link() const { return m_link; }
279 QPointF start() const { return m_start; }
280 bool isRecursing() const { return m_recursing; }
281
282private:
283 QSvgNode *m_link;
284 QPointF m_start;
285 QString m_linkId;
286 mutable bool m_recursing;
287};
288
289class QSvgVideo : public QSvgNode
290{
291public:
293
294 void drawCommand(QPainter *, QSvgExtraStates &) override {};
295 Type type() const override;
296};
297
298QT_END_NAMESPACE
299
300#endif // QSVGGRAPHICS_P_H
friend class QPainter
QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override
QSvgNode * link() const
void setLink(QSvgNode *link)
void drawCommand(QPainter *p, QSvgExtraStates &states) override
bool isResolved() const
~QSvgUse() override
QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override
bool isRecursing() const
QPointF start() const
const QString & linkId() const
QSvgUse(const QPointF &start, QSvgNode *parent, QSvgNode *link)
Type type() const override
~QSvgVideo() override
void drawCommand(QPainter *, QSvgExtraStates &) override
Type type() const override
Combined button and popup list for selecting options.
@ AssumeTrustedSource
Definition qtsvgglobal.h:20
@ DisableSMILAnimations
Definition qtsvgglobal.h:23
@ DisableCSSAnimations
Definition qtsvgglobal.h:24
@ Tiny12FeaturesOnly
Definition qtsvgglobal.h:19
@ NoOption
Definition qtsvgglobal.h:18
@ DisableAnimations
Definition qtsvgglobal.h:27
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
Definition qdir.cpp:2582
#define qPrintable(string)
Definition qstring.h:1683
static QByteArray qt_inflateSvgzDataFrom(QIODevice *device, bool doCheckContent=true)
static bool isValidMatrix(const QTransform &transform)
static bool hasSvgHeader(const QByteArray &buf)
std::optional< int > calculateSizeValue(bool isPercent, int sizeValue, qreal viewBoxSizeValue)
Q_AUTOTEST_EXPORT bool resolveColor(QStringView colorStr, QColor &color, QSvgHandler *handler)