diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2020-02-12 09:54:18 +0100 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2020-02-12 09:54:18 +0100 |
commit | 41aa1dc3afa11c52d12cb5c2b7c69d0c8d36763e (patch) | |
tree | 92cd4c1a3d8532fe3e17ef6c5f85bdc595fc8b81 /tests/auto/qsvgrenderer | |
parent | cf932594dcc9fa3e701e6cd8f564aa9fc3277563 (diff) | |
parent | 0ecf1ff936e43f1d6978bdd2001acfabf3c7aaee (diff) | |
download | qtsvg-41aa1dc3afa11c52d12cb5c2b7c69d0c8d36763e.tar.gz |
Merge remote-tracking branch 'origin/dev' into wip/cmake
Change-Id: I35cfe1a52ec4a02dccc0895e3b4a40bd2ffe7295
Diffstat (limited to 'tests/auto/qsvgrenderer')
-rw-r--r-- | tests/auto/qsvgrenderer/tst_qsvgrenderer.cpp | 86 |
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 |