6#ifndef QSVGGRAPHICS_P_H
7#define QSVGGRAPHICS_P_H
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"
32Q_DECLARE_LOGGING_CATEGORY(lcSvgDraw);
40 ~QSvgDummyNode() override;
42 void drawCommand(QPainter *, QSvgExtraStates &) override;
43 Type type()
const override;
49 QSvgEllipse(QSvgNode *parent,
const QRectF &rect);
50 ~QSvgEllipse() override;
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; }
66 QSvgCircle(QSvgNode *parent,
const QRectF &rect) : QSvgEllipse(parent, rect) { }
67 ~QSvgCircle() override;
69 Type type()
const override;
75 QSvgImage(QSvgNode *parent,
77 const QString &filename,
78 const QRectF &bounds);
79 ~QSvgImage() override;
81 void drawCommand(QPainter *p, QSvgExtraStates &states) override;
82 Type type()
const override;
83 QRectF internalBounds(QPainter *p, QSvgExtraStates &states)
const override;
85 QRectF rect()
const {
return m_bounds; }
86 const QImage &image()
const {
return m_image; }
87 QString filename()
const {
return m_filename; }
97 QSvgLine(QSvgNode *parent,
const QLineF &line);
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; }
108 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
115 QSvgPath(QSvgNode *parent,
const QPainterPath &qpath);
116 ~QSvgPath() override;
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; }
133 QSvgPolygon(QSvgNode *parent,
const QPolygonF &poly);
134 ~QSvgPolygon() override;
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; }
145 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
152 QSvgPolyline(QSvgNode *parent,
const QPolygonF &poly);
153 ~QSvgPolyline() override;
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; }
164 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
171 QSvgRect(QSvgNode *paren,
const QRectF &rect, qreal rx=0, qreal ry=0);
172 ~QSvgRect() override;
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 }; }
183 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
199 QSvgText(QSvgNode *parent,
const QPointF &coord);
200 ~QSvgText() override;
202 void setTextArea(
const QSizeF &size);
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;
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;}
215 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states)
const override;
216 QRectF internalBounds(QPainter *p, QSvgExtraStates &states)
const override;
218 QPointF position()
const {
return m_coord; }
219 QSizeF size()
const {
return m_size; }
220 WhitespaceMode whitespaceMode()
const {
return m_mode; }
223 void draw_helper(QPainter *p, QSvgExtraStates &states, QRectF *boundingRect =
nullptr)
const;
225 static QSvgTspan *
const LINEBREAK;
232 QList<QSvgTspan *> m_tspans;
235 WhitespaceMode m_mode;
237 mutable std::optional<QList<
const QSvgGlyph *> > m_glyphsToDraw;
244 QSvgTspan(QSvgNode *parent,
bool isProperTspan =
true)
245 : QSvgNode(parent), m_mode(QSvgText::Default), m_isTspan(isProperTspan)
248 ~QSvgTspan() override;
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;}
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; }
271 QSvgText::WhitespaceMode m_mode;
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; }
291 const QString &
linkId()
const {
return m_linkId; }
292 void setLink(QSvgNode *link) { m_link = link; }
293 QSvgNode *
link()
const {
return m_link; }
301 mutable bool m_recursing;
QRectF decoratedInternalBounds(QPainter *p, QSvgExtraStates &states) const override
void setLink(QSvgNode *link)
void drawCommand(QPainter *p, QSvgExtraStates &states) override
QRectF internalBounds(QPainter *p, QSvgExtraStates &states) const override
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.
Q_CORE_EXPORT QDebug operator<<(QDebug debug, QDir::Filters filters)
#define qPrintable(string)
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)