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 void drawCommand(QPainter *, QSvgExtraStates &) override;
40 Type type() const override;
41};
42
43class Q_SVG_EXPORT QSvgEllipse : public QSvgNode
44{
45public:
46 QSvgEllipse(QSvgNode *parent, const QRectF &rect);
47 bool separateFillStroke(const QSvgExtraStates &) const override;
48 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
49 Type type() const override;
50 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
51 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
52 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
53 QRectF rect() const { return m_bounds; }
54private:
55 QRectF m_bounds;
56};
57
58class Q_SVG_EXPORT QSvgCircle : public QSvgEllipse
59{
60public:
61 QSvgCircle(QSvgNode *parent, const QRectF &rect) : QSvgEllipse(parent, rect) { }
62 Type type() const override;
63};
64
65class Q_SVG_EXPORT QSvgImage : public QSvgNode
66{
67public:
68 QSvgImage(QSvgNode *parent,
69 const QImage &image,
70 const QString &filename,
71 const QRectF &bounds);
72 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
73 Type type() const override;
74 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
75
76 QRectF rect() const { return m_bounds; }
77 const QImage &image() const { return m_image; }
78 QString filename() const { return m_filename; }
79private:
80 QString m_filename;
81 QImage m_image;
82 QRectF m_bounds;
83};
84
85class Q_SVG_EXPORT QSvgLine : public QSvgNode
86{
87public:
88 QSvgLine(QSvgNode *parent, const QLineF &line);
89 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
90 Type type() const override;
91 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
92 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
93 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
94 bool requiresGroupRendering() const override;
95 QLineF line() const { return m_line; }
96private:
97 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
98 QLineF m_line;
99};
100
101class Q_SVG_EXPORT QSvgPath : public QSvgNode
102{
103public:
104 QSvgPath(QSvgNode *parent, const QPainterPath &qpath);
105 bool separateFillStroke(const QSvgExtraStates &) const override;
106 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
107 Type type() const override;
108 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
109 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
110 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
111 bool requiresGroupRendering() const override;
112 const QPainterPath &path() const { return m_path; }
113private:
114 QPainterPath m_path;
115};
116
117class Q_SVG_EXPORT QSvgPolygon : public QSvgNode
118{
119public:
120 QSvgPolygon(QSvgNode *parent, const QPolygonF &poly);
121 bool separateFillStroke(const QSvgExtraStates &) const override;
122 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
123 Type type() const override;
124 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
125 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
126 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
127 bool requiresGroupRendering() const override;
128 const QPolygonF &polygon() const { return m_poly; }
129private:
130 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
131 QPolygonF m_poly;
132};
133
134class Q_SVG_EXPORT QSvgPolyline : public QSvgNode
135{
136public:
137 QSvgPolyline(QSvgNode *parent, const QPolygonF &poly);
138 bool separateFillStroke(const QSvgExtraStates &) const override;
139 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
140 Type type() const override;
141 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
142 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
143 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
144 bool requiresGroupRendering() const override;
145 const QPolygonF &polygon() const { return m_poly; }
146private:
147 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
148 QPolygonF m_poly;
149};
150
151class Q_SVG_EXPORT QSvgRect : public QSvgNode
152{
153public:
154 QSvgRect(QSvgNode *paren, const QRectF &rect, qreal rx=0, qreal ry=0);
155 Type type() const override;
156 bool separateFillStroke(const QSvgExtraStates &) const override;
157 void drawCommand(QPainter *p, QSvgExtraStates &states) 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 QRectF rect() const { return m_rect; }
162 QPointF radius() const { return { m_rx, m_ry }; }
163private:
164 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode) const;
165 QRectF m_rect;
166 qreal m_rx, m_ry;
167};
168
169class QSvgTspan;
170
171class Q_SVG_EXPORT QSvgText : public QSvgNode
172{
173public:
174 enum WhitespaceMode
175 {
176 Default,
177 Preserve
178 };
179
180 QSvgText(QSvgNode *parent, const QPointF &coord);
181 ~QSvgText();
182 void setTextArea(const QSizeF &size);
183
184 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
185 bool shouldDrawNode(QPainter *p, QSvgExtraStates &states) const override;
186 Type type() const override;
187 bool separateFillStroke(const QSvgExtraStates &) const override;
188
189 void addTspan(QSvgTspan *tspan) {m_tspans.append(tspan);}
190 const QList<QSvgTspan *> tspans() const { return m_tspans; }
191 void addText(QStringView text);
192 void addLineBreak() {m_tspans.append(LINEBREAK);}
193 void setWhitespaceMode(WhitespaceMode mode) {m_mode = mode;}
194
195 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states) const override;
196 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
197
198 QPointF position() const { return m_coord; }
199 QSizeF size() const { return m_size; }
200 WhitespaceMode whitespaceMode() const { return m_mode; }
201
202private:
203 void draw_helper(QPainter *p, QSvgExtraStates &states, QRectF *boundingRect = nullptr) const;
204
205 static QSvgTspan * const LINEBREAK;
206
207 QPointF m_coord;
208 QSizeF m_size;
209
210 // 'm_tspans' is also used to store characters outside tspans and line breaks.
211 // If a 'm_tspan' item is null, it indicates a line break.
212 QList<QSvgTspan *> m_tspans;
213
214 Type m_type;
215 WhitespaceMode m_mode;
216
217 mutable std::optional<QList<const QSvgGlyph *> > m_glyphsToDraw;
218};
219
220class Q_SVG_EXPORT QSvgTspan : public QSvgNode
221{
222public:
223 // tspans are also used to store normal text, so the 'isProperTspan' is used to separate text from tspan.
224 QSvgTspan(QSvgNode *parent, bool isProperTspan = true)
225 : QSvgNode(parent), m_mode(QSvgText::Default), m_isTspan(isProperTspan)
226 {
227 }
228 ~QSvgTspan() { };
229 Type type() const override { return Tspan; }
230 void drawCommand(QPainter *, QSvgExtraStates &) override { Q_ASSERT(!"Tspans should be drawn through QSvgText::draw()."); }
231 void addText(QStringView text) {m_text += text;}
232 const QString &text() const {return m_text;}
233 bool isTspan() const {return m_isTspan;}
234 void setWhitespaceMode(QSvgText::WhitespaceMode mode) {m_mode = mode;}
235 QSvgText::WhitespaceMode whitespaceMode() const {return m_mode;}
236private:
237 QString m_text;
238 QSvgText::WhitespaceMode m_mode;
239 bool m_isTspan;
240};
241
242class QSvgUse : public QSvgNode
243{
244public:
245 QSvgUse(const QPointF &start, QSvgNode *parent, QSvgNode *link);
246 QSvgUse(const QPointF &start, QSvgNode *parent, const QString &linkId)
247 : QSvgUse(start, parent, nullptr)
248 { m_linkId = linkId; }
249 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
250 Type type() const override;
251 QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override;
252 QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override;
253 bool isResolved() const { return m_link != nullptr; }
254 const QString &linkId() const { return m_linkId; }
255 void setLink(QSvgNode *link) { m_link = link; }
256 QSvgNode *link() const { return m_link; }
257 QPointF start() const { return m_start; }
258 bool isRecursing() const { return m_recursing; }
259
260private:
261 QSvgNode *m_link;
262 QPointF m_start;
263 QString m_linkId;
264 mutable bool m_recursing;
265};
266
267class QSvgVideo : public QSvgNode
268{
269public:
270 void drawCommand(QPainter *, QSvgExtraStates &) override {};
271 Type type() const override;
272};
273
274QT_END_NAMESPACE
275
276#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
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
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)