summaryrefslogtreecommitdiff
path: root/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp')
-rw-r--r--tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp86
1 files changed, 77 insertions, 9 deletions
diff --git a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
index cf19213..b8ce632 100644
--- a/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
+++ b/tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp
@@ -59,11 +59,13 @@ private slots:
void testStrokeWidth();
void testMapViewBoxToTarget();
void testRenderElement();
+ void testRenderElementToBounds();
+ void testRenderDocumentWithSizeToBounds();
void constructorQXmlStreamReader() const;
void loadQXmlStreamReader() const;
void nestedQXmlStreamReader() const;
void stylePropagation() const;
- void matrixForElement() const;
+ void transformForElement() const;
void boundsOnElement() const;
void gradientStops() const;
void gradientRefs();
@@ -268,15 +270,16 @@ 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
- // however the box is centered at 375, 250
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(375, 250, 750, 750));
+ QCOMPARE(picture.boundingRect(), QRect(500, 375, 750, 750));
}
}
@@ -337,6 +340,71 @@ void tst_QSvgRenderer::testRenderElement()
}
+void tst_QSvgRenderer::testRenderElementToBounds()
+{
+ // QTBUG-79933
+ QImage reference(400, 200, QImage::Format_ARGB32);
+ {
+ reference.fill(Qt::transparent);
+ QPainter p(&reference);
+ p.fillRect( 0, 0, 200, 100, Qt::blue);
+ p.fillRect(200, 100, 200, 100, Qt::blue);
+ p.fillRect( 0, 0, 100, 50, Qt::red);
+ p.fillRect(100, 50, 100, 50, Qt::red);
+ p.fillRect(200, 100, 100, 50, Qt::red);
+ p.fillRect(300, 150, 100, 50, Qt::red);
+ }
+
+ QImage rendering(400, 200, QImage::Format_ARGB32);
+ {
+ const char *const src =
+ "<svg viewBox=\"0 0 100 100\">" // Presence of a viewBox triggered QTBUG-79933
+ "<path id=\"el1\" d=\"M 80,10 H 0 V 0 h 40 v 20 h 40 z\" fill=\"red\" />"
+ "<path id=\"el2\" d=\"M 90,100 V 20 h 10 V 60 H 80 v 40 z\" fill=\"blue\" />"
+ "</svg>";
+ const QByteArray data(src);
+ QSvgRenderer rend(data);
+ rendering.fill(Qt::transparent);
+ QPainter p(&rendering);
+ rend.render(&p, "el1", QRectF( 0, 0, 200, 100));
+ rend.render(&p, "el2", QRectF( 0, 0, 200, 100));
+ rend.render(&p, "el1", QRectF(200, 100, 200, 100));
+ rend.render(&p, "el2", QRectF(200, 100, 200, 100));
+ }
+
+ QCOMPARE(reference, rendering);
+}
+
+void tst_QSvgRenderer::testRenderDocumentWithSizeToBounds()
+{
+ // QTBUG-80888
+ QImage reference(400, 200, QImage::Format_ARGB32);
+ {
+ reference.fill(Qt::transparent);
+ QPainter p(&reference);
+ p.fillRect(100, 100, 100, 50, Qt::blue);
+ p.fillRect(200, 50, 100, 50, Qt::blue);
+ }
+
+ QImage rendering(400, 200, QImage::Format_ARGB32);
+ {
+ const char *const src = R"src(
+ <svg width="20" height="80">
+ <g transform="translate(-100,-100)">
+ <path d="m 110,180 v -80 h 10 v 40 h -20 v 40 z" fill="blue" />
+ </g>
+ </svg>
+ )src";
+ const QByteArray data(src);
+ QSvgRenderer rend(data);
+ rendering.fill(Qt::transparent);
+ QPainter p(&rendering);
+ rend.render(&p, QRectF(100, 50, 200, 100));
+ }
+
+ QCOMPARE(reference, rendering);
+}
+
void tst_QSvgRenderer::constructorQXmlStreamReader() const
{
const QByteArray data(src);
@@ -477,7 +545,7 @@ static void compareTransforms(const QTransform &m1, const QTransform &m2)
QVERIFY(diffIsSmallEnough(diffNorm, qMin(norm1, norm2)));
}
-void tst_QSvgRenderer::matrixForElement() const
+void tst_QSvgRenderer::transformForElement() const
{
QByteArray data("<svg>"
"<g id='ichi' transform='translate(-3,1)'>"
@@ -495,15 +563,15 @@ void tst_QSvgRenderer::matrixForElement() const
QPainter painter(&image);
QSvgRenderer renderer(data);
- compareTransforms(painter.worldTransform(), QTransform(renderer.matrixForElement(QLatin1String("ichi"))));
+ compareTransforms(painter.worldTransform(), renderer.transformForElement(QLatin1String("ichi")));
painter.translate(-3, 1);
- compareTransforms(painter.worldTransform(), QTransform(renderer.matrixForElement(QLatin1String("ni"))));
+ compareTransforms(painter.worldTransform(), renderer.transformForElement(QLatin1String("ni")));
painter.rotate(45);
- compareTransforms(painter.worldTransform(), QTransform(renderer.matrixForElement(QLatin1String("san"))));
+ compareTransforms(painter.worldTransform(), renderer.transformForElement(QLatin1String("san")));
painter.scale(4, 2);
- compareTransforms(painter.worldTransform(), QTransform(renderer.matrixForElement(QLatin1String("yon"))));
+ compareTransforms(painter.worldTransform(), renderer.transformForElement(QLatin1String("yon")));
painter.setWorldTransform(QTransform(1, 2, 3, 4, 5, 6), true);
- compareTransforms(painter.worldTransform(), QTransform(renderer.matrixForElement(QLatin1String("firkant"))));
+ compareTransforms(painter.worldTransform(), renderer.transformForElement(QLatin1String("firkant")));
}
void tst_QSvgRenderer::boundsOnElement() const