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#include "QtCore/qnumeric.h"
27
28#include <optional>
29
31
32Q_DECLARE_LOGGING_CATEGORY(lcSvgDraw);
33
34class QSvgGlyph;
35class QTextCharFormat;
36
37class Q_SVG_EXPORT QSvgDummyNode : public QSvgNode
38{
39public:
40 ~QSvgDummyNode() override;
41
42 void drawCommand(QPainter *, QSvgExtraStates &) override;
43 Type type() const override;
44};
45
46class Q_SVG_EXPORT QSvgEllipse : public QSvgNode
47{
48public:
49 QSvgEllipse(QSvgNode *parent, const QRectF &rect);
50 ~QSvgEllipse() override;
51
52 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
53 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
54 Type type() const override;
55 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
56 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
57 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
58 QRectF rect() const { return m_bounds; }
59private:
60 QRectF m_bounds;
61};
62
63class Q_SVG_EXPORT QSvgCircle : public QSvgEllipse
64{
65public:
66 QSvgCircle(QSvgNode *parent, const QRectF &rect) : QSvgEllipse(parent, rect) { }
67 ~QSvgCircle() override;
68
69 Type type() const override;
70};
71
72class Q_SVG_EXPORT QSvgImage : public QSvgNode
73{
74public:
75 QSvgImage(QSvgNode *parent,
76 const QImage &image,
77 const QString &filename,
78 const QRectF &bounds);
79 ~QSvgImage() override;
80
81 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
82 Type type() const override;
83 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
84
85 QRectF rect() const { return m_bounds; }
86 const QImage &image() const { return m_image; }
87 QString filename() const { return m_filename; }
88private:
89 QString m_filename;
90 QImage m_image;
91 QRectF m_bounds;
92};
93
94class Q_SVG_EXPORT QSvgLine : public QSvgNode
95{
96public:
97 QSvgLine(QSvgNode *parent, const QLineF &line);
98 ~QSvgLine() override;
99
100 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
101 Type type() const override;
102 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
103 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
104 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
105 bool requiresGroupRendering() const override;
106 QLineF line() const { return m_line; }
107private:
108 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
109 QLineF m_line;
110};
111
112class Q_SVG_EXPORT QSvgPath : public QSvgNode
113{
114public:
115 QSvgPath(QSvgNode *parent, const QPainterPath &qpath);
116 ~QSvgPath() override;
117
118 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
119 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
120 Type type() const override;
121 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
122 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
123 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
124 bool requiresGroupRendering() const override;
125 const QPainterPath &path() const { return m_path; }
126private:
127 QPainterPath m_path;
128};
129
130class Q_SVG_EXPORT QSvgPolygon : public QSvgNode
131{
132public:
133 QSvgPolygon(QSvgNode *parent, const QPolygonF &poly);
134 ~QSvgPolygon() override;
135
136 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
137 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
138 Type type() const override;
139 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
140 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
141 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
142 bool requiresGroupRendering() const override;
143 const QPolygonF &polygon() const { return m_poly; }
144private:
145 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
146 QPolygonF m_poly;
147};
148
149class Q_SVG_EXPORT QSvgPolyline : public QSvgNode
150{
151public:
152 QSvgPolyline(QSvgNode *parent, const QPolygonF &poly);
153 ~QSvgPolyline() override;
154
155 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
156 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
157 Type type() const override;
158 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
159 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
160 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
161 bool requiresGroupRendering() const override;
162 const QPolygonF &polygon() const { return m_poly; }
163private:
164 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
165 QPolygonF m_poly;
166};
167
168class Q_SVG_EXPORT QSvgRect : public QSvgNode
169{
170public:
171 QSvgRect(QSvgNode *paren, const QRectF &rect, qreal rx=0, qreal ry=0);
172 ~QSvgRect() override;
173
174 Type type() const override;
175 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
176 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
177 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
178 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
179 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
180 QRectF rect() const { return m_rect; }
181 QPointF radius() const { return { m_rx, m_ry }; }
182private:
183 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
184 QRectF m_rect;
185 qreal m_rx, m_ry;
186};
187
188class QSvgTspan;
189
190class Q_SVG_EXPORT QSvgText : public QSvgNode
191{
192public:
193 enum WhitespaceMode
194 {
195 Default,
196 Preserve
197 };
198
199 QSvgText(QSvgNode *parent, const QPointF &coord);
200 ~QSvgText() override;
201
202 void setTextArea(const QSizeF &size);
203
204 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
205 bool shouldDrawNode(QPainter *p, QSvgExtraStates &states) const override;
206 Type type() const override;
207 bool separateFillStroke(const QPainter *, const QSvgExtraStates &) const override;
208
209 void addTspan(QSvgTspan *tspan) {m_tspans.append(tspan);}
210 const QList<QSvgTspan *> tspans() const { return m_tspans; }
211 void addText(QStringView text);
212 void addLineBreak() {m_tspans.append(LINEBREAK);}
213 void setWhitespaceMode(WhitespaceMode mode) {m_mode = mode;}
214
215 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
216 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
217
218 QPointF position() const { return m_coord; }
219 QSizeF size() const { return m_size; }
220 WhitespaceMode whitespaceMode() const { return m_mode; }
221
222private:
223 void draw_helper(QPainter *p, QSvgExtraStates &states, QRectF *boundingRect = nullptr) const;
224
225 static QSvgTspan * const LINEBREAK;
226
227 QPointF m_coord;
228 QSizeF m_size;
229
230 // 'm_tspans' is also used to store characters outside tspans and line breaks.
231 // If a 'm_tspan' item is null, it indicates a line break.
232 QList<QSvgTspan *> m_tspans;
233
234 Type m_type;
235 WhitespaceMode m_mode;
236
237 mutable std::optional<QList<const QSvgGlyph *> > m_glyphsToDraw;
238};
239
240class Q_SVG_EXPORT QSvgTspan : public QSvgNode
241{
242public:
243 // tspans are also used to store normal text, so the 'isProperTspan' is used to separate text from tspan.
244 QSvgTspan(QSvgNode *parent, bool isProperTspan = true)
245 : QSvgNode(parent), m_mode(QSvgText::Default), m_isTspan(isProperTspan)
246 {
247 }
248 ~QSvgTspan() override;
249
250 Type type() const override { return Tspan; }
251 void drawCommand(QPainter *, QSvgExtraStates &) override { Q_ASSERT(!"Tspans should be drawn through QSvgText::draw()."); }
252 void addText(QStringView text) {m_text += text;}
253 const QString &text() const {return m_text;}
254 bool isTspan() const {return m_isTspan;}
255 void setWhitespaceMode(QSvgText::WhitespaceMode mode) {m_mode = mode;}
256 QSvgText::WhitespaceMode whitespaceMode() const {return m_mode;}
257
258 // Absolute x/y coordinates taken at face value from the tspan's attributes, in the
259 // current user coordinate system (same space as the enclosing <text> element's x/y).
260 // Unset axes are NaN and are filled in from the surrounding text flow at layout time.
261 // SVG allows a list of coordinates; only the first (the run's start) is kept.
262 void setX(qreal x) { m_x = x; }
263 void setY(qreal y) { m_y = y; }
264 bool hasX() const { return !qIsNaN(m_x); }
265 bool hasY() const { return !qIsNaN(m_y); }
266 bool hasPosition() const { return hasX() || hasY(); }
267 qreal x() const { return m_x; }
268 qreal y() const { return m_y; }
269private:
270 QString m_text;
271 QSvgText::WhitespaceMode m_mode;
272 bool m_isTspan;
273 qreal m_x = qQNaN();
274 qreal m_y = qQNaN();
275};
276
277class QSvgUse : public QSvgNode
278{
279public:
280 QSvgUse(const QPointF &start, QSvgNode *parent, QSvgNode *link);
281 QSvgUse(const QPointF &start, QSvgNode *parent, const QString &linkId)
282 : QSvgUse(start, parent, nullptr)
283 { m_linkId = linkId; }
285
286 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
287 Type type() const override;
288 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
289 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
290 bool isResolved() const { return m_link != nullptr; }
291 const QString &linkId() const { return m_linkId; }
292 void setLink(QSvgNode *link) { m_link = link; }
293 QSvgNode *link() const { return m_link; }
294 QPointF start() const { return m_start; }
295 bool isRecursing() const { return m_recursing; }
296
297private:
298 QSvgNode *m_link;
299 QPointF m_start;
300 QString m_linkId;
301 mutable bool m_recursing;
302};
303
304class QSvgVideo : public QSvgNode
305{
306public:
308
309 void drawCommand(QPainter *, QSvgExtraStates &) override {};
310 Type type() const override;
311};
312
313QT_END_NAMESPACE
314
315#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:2620
#define qPrintable(string)
Definition qstring.h:1718
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)