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"
31Q_DECLARE_LOGGING_CATEGORY(lcSvgDraw);
39 void drawCommand(QPainter *, QSvgExtraStates &) override;
40 Type type()
const override;
46 QSvgEllipse(QSvgNode *parent,
const QRectF &rect);
47 bool separateFillStroke(
const QPainter *,
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; }
61 QSvgCircle(QSvgNode *parent,
const QRectF &rect) : QSvgEllipse(parent, rect) { }
62 Type type()
const override;
68 QSvgImage(QSvgNode *parent,
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;
76 QRectF rect()
const {
return m_bounds; }
77 const QImage &image()
const {
return m_image; }
78 QString filename()
const {
return m_filename; }
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; }
97 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
104 QSvgPath(QSvgNode *parent,
const QPainterPath &qpath);
105 bool separateFillStroke(
const QPainter *,
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; }
120 QSvgPolygon(QSvgNode *parent,
const QPolygonF &poly);
121 bool separateFillStroke(
const QPainter *,
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; }
130 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
137 QSvgPolyline(QSvgNode *parent,
const QPolygonF &poly);
138 bool separateFillStroke(
const QPainter *,
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; }
147 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
154 QSvgRect(QSvgNode *paren,
const QRectF &rect, qreal rx=0, qreal ry=0);
155 Type type()
const override;
156 bool separateFillStroke(
const QPainter *,
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 }; }
164 QRectF internalBounds(QPainter *p, QSvgExtraStates &states, BoundsMode mode)
const;
180 QSvgText(QSvgNode *parent,
const QPointF &coord);
182 void setTextArea(
const QSizeF &size);
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 QPainter *,
const QSvgExtraStates &)
const override;
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;}
195 QRectF internalFastBounds(QPainter *p, QSvgExtraStates &states)
const override;
196 QRectF internalBounds(QPainter *p, QSvgExtraStates &states)
const override;
198 QPointF position()
const {
return m_coord; }
199 QSizeF size()
const {
return m_size; }
200 WhitespaceMode whitespaceMode()
const {
return m_mode; }
203 void draw_helper(QPainter *p, QSvgExtraStates &states, QRectF *boundingRect =
nullptr)
const;
205 static QSvgTspan *
const LINEBREAK;
212 QList<QSvgTspan *> m_tspans;
215 WhitespaceMode m_mode;
217 mutable std::optional<QList<
const QSvgGlyph *> > m_glyphsToDraw;
224 QSvgTspan(QSvgNode *parent,
bool isProperTspan =
true)
225 : QSvgNode(parent), m_mode(QSvgText::Default), m_isTspan(isProperTspan)
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;}
238 QSvgText::WhitespaceMode m_mode;
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; }
254 const QString &
linkId()
const {
return m_linkId; }
255 void setLink(QSvgNode *link) { m_link = link; }
256 QSvgNode *
link()
const {
return m_link; }
264 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)