From 0279e65c25b22066d15752267a6b5d1ba660e7d9 Mon Sep 17 00:00:00 2001 From: Frederik Christiani Date: Thu, 26 Apr 2018 12:57:19 +0200 Subject: Interpret width or height specified in percent as relative to viewport When width or height is specified in percent, it is supposed to be relative to the viewport. https://www.w3.org/TR/SVG/coords.html#Units Task-number: QTBUG-2279 Change-Id: Ia1597b88d4e1c705a6755db788a18cf790d5ee97 Reviewed-by: Friedemann Kleint Reviewed-by: Eirik Aavitsland --- src/svg/qsvgtinydocument_p.h | 9 ++++++--- tests/auto/qicon_svg/icons/rect_size_100percent.svg | 5 +++++ tests/auto/qicon_svg/tst_qicon_svg.cpp | 12 ++++++++++++ tests/auto/qicon_svg/tst_qicon_svg.qrc | 1 + 4 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 tests/auto/qicon_svg/icons/rect_size_100percent.svg diff --git a/src/svg/qsvgtinydocument_p.h b/src/svg/qsvgtinydocument_p.h index c69c5de..aa51751 100644 --- a/src/svg/qsvgtinydocument_p.h +++ b/src/svg/qsvgtinydocument_p.h @@ -141,11 +141,14 @@ private: inline QSize QSvgTinyDocument::size() const { - if (m_size.isEmpty()) { + if (m_size.isEmpty()) return viewBox().size().toSize(); - } else { - return m_size; + if (m_widthPercent || m_heightPercent) { + const int width = m_widthPercent ? qRound(0.01 * m_size.width() * viewBox().size().width()) : m_size.width(); + const int height = m_heightPercent ? qRound(0.01 * m_size.height() * viewBox().size().height()) : m_size.height(); + return QSize(width, height); } + return m_size; } inline int QSvgTinyDocument::width() const diff --git a/tests/auto/qicon_svg/icons/rect_size_100percent.svg b/tests/auto/qicon_svg/icons/rect_size_100percent.svg new file mode 100644 index 0000000..84dece7 --- /dev/null +++ b/tests/auto/qicon_svg/icons/rect_size_100percent.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/tests/auto/qicon_svg/tst_qicon_svg.cpp b/tests/auto/qicon_svg/tst_qicon_svg.cpp index 0875ee1..6eea018 100644 --- a/tests/auto/qicon_svg/tst_qicon_svg.cpp +++ b/tests/auto/qicon_svg/tst_qicon_svg.cpp @@ -44,6 +44,7 @@ private slots: void svg(); void availableSizes(); void isNull(); + void sizeInPercent(); private: @@ -172,5 +173,16 @@ void tst_QIcon_Svg::isNull() } +void tst_QIcon_Svg::sizeInPercent() +{ + QIcon icon(prefix + "rect_size_100percent.svg"); + QCOMPARE(icon.actualSize(QSize(16, 8)), QSize(16, 8)); + QCOMPARE(icon.pixmap(QSize(16, 8)).size(), QSize(16, 8)); + + QCOMPARE(icon.actualSize(QSize(8, 8)), QSize(8, 4)); + QCOMPARE(icon.pixmap(QSize(8, 8)).size(), QSize(8, 4)); +} + + QTEST_MAIN(tst_QIcon_Svg) #include "tst_qicon_svg.moc" diff --git a/tests/auto/qicon_svg/tst_qicon_svg.qrc b/tests/auto/qicon_svg/tst_qicon_svg.qrc index fd9422b..302b40b 100644 --- a/tests/auto/qicon_svg/tst_qicon_svg.qrc +++ b/tests/auto/qicon_svg/tst_qicon_svg.qrc @@ -5,5 +5,6 @@ ./icons/image.png ./icons/rect.svg ./icons/trash.svg +./icons/rect_size_100percent.svg -- cgit v1.2.1