summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dist/changes-5.14.128
-rw-r--r--src/svg/qsvgrenderer.cpp35
-rw-r--r--src/svg/qsvgrenderer.h4
-rw-r--r--src/svg/qsvgtinydocument.cpp20
-rw-r--r--src/svg/qsvgtinydocument_p.h4
-rw-r--r--tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp2
6 files changed, 85 insertions, 8 deletions
diff --git a/dist/changes-5.14.1 b/dist/changes-5.14.1
new file mode 100644
index 0000000..093098c
--- /dev/null
+++ b/dist/changes-5.14.1
@@ -0,0 +1,28 @@
+Qt 5.14.1 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.14.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.14 series is binary compatible with the 5.13.x series.
+Applications compiled for 5.13 will continue to run with 5.14.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* QSVGRenderer *
+****************************************************************************
+
+ - In Qt 5.14.0, rendering would keep aspect ratio implied by the
+ viewbox, independently of the specified target area. This caused
+ many regressions with existing code, so is reverted now in
+ 5.14.1. The feature will instead be available as an opt-in in Qt
+ 5.15.
diff --git a/src/svg/qsvgrenderer.cpp b/src/svg/qsvgrenderer.cpp
index 40ae6ab..0097ec2 100644
--- a/src/svg/qsvgrenderer.cpp
+++ b/src/svg/qsvgrenderer.cpp
@@ -257,6 +257,41 @@ void QSvgRenderer::setFramesPerSecond(int num)
}
/*!
+ \property QSvgRenderer::aspectRatioMode
+
+ \brief how rendering adheres to the SVG view box aspect ratio
+
+ The accepted modes are:
+ \list
+ \li Qt::IgnoreAspectRatio (the default): the aspect ratio is ignored and the
+ rendering is stretched to the target bounds.
+ \li Qt::KeepAspectRatio: rendering is centered and scaled as large as possible
+ within the target bounds while preserving aspect ratio.
+ \endlist
+
+ \since 5.15
+*/
+
+Qt::AspectRatioMode QSvgRenderer::aspectRatioMode() const
+{
+ Q_D(const QSvgRenderer);
+ if (d->render && d->render->preserveAspectRatio())
+ return Qt::KeepAspectRatio;
+ return Qt::IgnoreAspectRatio;
+}
+
+void QSvgRenderer::setAspectRatioMode(Qt::AspectRatioMode mode)
+{
+ Q_D(QSvgRenderer);
+ if (d->render) {
+ if (mode == Qt::KeepAspectRatio)
+ d->render->setPreserveAspectRatio(true);
+ else if (mode == Qt::IgnoreAspectRatio)
+ d->render->setPreserveAspectRatio(false);
+ }
+}
+
+/*!
\property QSvgRenderer::currentFrame
\brief the current frame of the document's animation, or 0 if the document is not animated
\internal
diff --git a/src/svg/qsvgrenderer.h b/src/svg/qsvgrenderer.h
index c7da2fb..3703b1c 100644
--- a/src/svg/qsvgrenderer.h
+++ b/src/svg/qsvgrenderer.h
@@ -65,6 +65,7 @@ class Q_SVG_EXPORT QSvgRenderer : public QObject
Q_PROPERTY(QRectF viewBox READ viewBoxF WRITE setViewBox)
Q_PROPERTY(int framesPerSecond READ framesPerSecond WRITE setFramesPerSecond)
Q_PROPERTY(int currentFrame READ currentFrame WRITE setCurrentFrame)
+ Q_PROPERTY(Qt::AspectRatioMode aspectRatioMode READ aspectRatioMode WRITE setAspectRatioMode)
public:
QSvgRenderer(QObject *parent = nullptr);
QSvgRenderer(const QString &filename, QObject *parent = nullptr);
@@ -81,6 +82,9 @@ public:
void setViewBox(const QRect &viewbox);
void setViewBox(const QRectF &viewbox);
+ Qt::AspectRatioMode aspectRatioMode() const;
+ void setAspectRatioMode(Qt::AspectRatioMode mode);
+
bool animated() const;
int framesPerSecond() const;
void setFramesPerSecond(int num);
diff --git a/src/svg/qsvgtinydocument.cpp b/src/svg/qsvgtinydocument.cpp
index eb6b6b0..b4b9526 100644
--- a/src/svg/qsvgtinydocument.cpp
+++ b/src/svg/qsvgtinydocument.cpp
@@ -336,6 +336,11 @@ void QSvgTinyDocument::setHeight(int len, bool percent)
m_heightPercent = percent;
}
+void QSvgTinyDocument::setPreserveAspectRatio(bool on)
+{
+ m_preserveAspectRatio = on;
+}
+
void QSvgTinyDocument::setViewBox(const QRectF &rect)
{
m_viewBox = rect;
@@ -421,10 +426,10 @@ void QSvgTinyDocument::mapSourceToTarget(QPainter *p, const QRectF &targetRect,
source = viewBox();
if (source != target && !source.isNull()) {
- if (m_implicitViewBox || !sourceRect.isNull() || !targetRect.isNull()) {
- // Code path used when no view box is set, or when an explicit source size is given which
- // overrides it (which is the case when we're rendering only a specific element by id),
- // or when user has given explicit target bounds that overrides viebox aspect ratio
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
+ if (m_implicitViewBox || !preserveAspectRatio()) {
+ // Code path used when no view box is set, or IgnoreAspectRatio requested
+#endif
QTransform transform;
transform.scale(target.width() / source.width(),
target.height() / source.height());
@@ -433,10 +438,10 @@ void QSvgTinyDocument::mapSourceToTarget(QPainter *p, const QRectF &targetRect,
target.y() - c2.y());
p->scale(target.width() / source.width(),
target.height() / source.height());
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
} else {
- // Code path used when a view box is specified and we're not rendering a specific element by id
- // but the entire document. This attempts to emulate the default values of the <preserveAspectRatio>
- // tag that's implicitly defined when <viewbox> is used.
+ // Code path used when KeepAspectRatio is requested. This attempts to emulate the default values
+ // of the <preserveAspectRatio tag that's implicitly defined when <viewbox> is used.
// Scale the view box into the view port (target) by preserve the aspect ratio.
QSizeF viewBoxSize = source.size();
@@ -452,6 +457,7 @@ void QSvgTinyDocument::mapSourceToTarget(QPainter *p, const QRectF &targetRect,
// Apply the view box translation if specified.
p->translate(-source.x(), -source.y());
}
+#endif
}
}
diff --git a/src/svg/qsvgtinydocument_p.h b/src/svg/qsvgtinydocument_p.h
index d0c5cae..d4b92e8 100644
--- a/src/svg/qsvgtinydocument_p.h
+++ b/src/svg/qsvgtinydocument_p.h
@@ -89,6 +89,7 @@ public:
bool heightPercent() const;
bool preserveAspectRatio() const;
+ void setPreserveAspectRatio(bool on);
QRectF viewBox() const;
void setViewBox(const QRectF &rect);
@@ -128,6 +129,7 @@ private:
mutable bool m_implicitViewBox = true;
mutable QRectF m_viewBox;
+ bool m_preserveAspectRatio = false;
QHash<QString, QSvgRefCounter<QSvgFont> > m_fonts;
QHash<QString, QSvgNode *> m_namedNodes;
@@ -185,7 +187,7 @@ inline QRectF QSvgTinyDocument::viewBox() const
inline bool QSvgTinyDocument::preserveAspectRatio() const
{
- return false;
+ return m_preserveAspectRatio;
}
inline int QSvgTinyDocument::currentElapsed() const
diff --git a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
index 4a4a287..686c854 100644
--- a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
+++ b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
@@ -270,11 +270,13 @@ void tst_QSvgRenderer::testMapViewBoxToTarget()
QCOMPARE(picture.boundingRect(), QRect(125, 125, 250, 250));
}
+ // Requires keep-aspectratio feature
{ // Viewport and viewBox specified -> scale 500x500 square to 1000x750 while preserving aspect ratio gives 750x750
data = "<svg width=\"1000\" height=\"750\" viewBox=\"-250 -250 500 500\"><g><rect x=\"0\" y=\"0\" width=\"500\" height=\"500\" /></g></svg>";
QPicture picture;
QPainter painter(&picture);
QSvgRenderer rend(data);
+ rend.setAspectRatioMode(Qt::KeepAspectRatio);
rend.render(&painter);
painter.end();
QCOMPARE(picture.boundingRect(), QRect(500, 375, 750, 750));