From 3797704c4ff0d91f544efa791973eced07c3ef02 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Fri, 14 Jun 2019 13:08:56 +0200 Subject: [PATCH] Generalize image file name @2x suffix handling to higher scale factors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @3x is in use on iOS already, so extend the handling in QImageReader to all single-digit factors, like QIcon does. Fixes: QTBUG-76273 Change-Id: Ic9442731c0549dbe8f797e1ddb1a09d8447e8441 Reviewed-by: Morten Johan Sørvig --- src/gui/image/qimagereader.cpp | 10 ++++--- .../image/qimagereader/images/qticon16.png | Bin 0 -> 1884 bytes .../image/qimagereader/images/qticon16@2x.png | Bin 0 -> 3187 bytes .../image/qimagereader/images/qticon16@3x.png | Bin 0 -> 5307 bytes .../image/qimagereader/tst_qimagereader.cpp | 25 ++++++++++++++++++ 5 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/auto/gui/image/qimagereader/images/qticon16.png create mode 100644 tests/auto/gui/image/qimagereader/images/qticon16@2x.png create mode 100644 tests/auto/gui/image/qimagereader/images/qticon16@3x.png diff --git a/src/gui/image/qimagereader.cpp b/src/gui/image/qimagereader.cpp index 0fb1d808e5..0c75196612 100644 --- a/src/gui/image/qimagereader.cpp +++ b/src/gui/image/qimagereader.cpp @@ -1319,10 +1319,12 @@ bool QImageReader::read(QImage *image) } } - // successful read; check for "@2x" file name suffix and set device pixel ratio. - static bool disable2xImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING"); - if (!disable2xImageLoading && QFileInfo(fileName()).baseName().endsWith(QLatin1String("@2x"))) { - image->setDevicePixelRatio(2.0); + // successful read; check for "@Nx" file name suffix and set device pixel ratio. + static bool disableNxImageLoading = !qEnvironmentVariableIsEmpty("QT_HIGHDPI_DISABLE_2X_IMAGE_LOADING"); + if (!disableNxImageLoading) { + const QByteArray suffix = QFileInfo(fileName()).baseName().right(3).toLatin1(); + if (suffix.length() == 3 && suffix[0] == '@' && suffix[1] >= '2' && suffix[1] <= '9' && suffix[2] == 'x') + image->setDevicePixelRatio(suffix[1] - '0'); } if (autoTransform()) qt_imageTransform(*image, transformation()); diff --git a/tests/auto/gui/image/qimagereader/images/qticon16.png b/tests/auto/gui/image/qimagereader/images/qticon16.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b01a4d64819e588acf4e1472cb5fba56aca290 GIT binary patch literal 1884 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 Z{{`LiGof@cPh9{2002ovPDHLkV1fpr|L_0+ literal 0 HcmV?d00001 diff --git a/tests/auto/gui/image/qimagereader/images/qticon16@3x.png b/tests/auto/gui/image/qimagereader/images/qticon16@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..de9265824133542c6657e072d648835eb495b919 GIT binary patch literal 5307 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 IP_T~p7o_U>VE_OC literal 0 HcmV?d00001 diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp index c2ec5b8925..1eee2f273e 100644 --- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp +++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp @@ -164,6 +164,9 @@ private slots: void preserveTexts_data(); void preserveTexts(); + void devicePixelRatio_data(); + void devicePixelRatio(); + private: QString prefix; QTemporaryDir m_temporaryDir; @@ -1976,6 +1979,28 @@ void tst_QImageReader::preserveTexts() QCOMPARE(r.text(key3), text3.simplified()); } +void tst_QImageReader::devicePixelRatio_data() +{ + QTest::addColumn("fileName"); + QTest::addColumn("size"); + QTest::addColumn("dpr"); + + QTest::newRow("1x") << "qticon16.png" << QSize(16, 16) << 1.0; + QTest::newRow("2x") << "qticon16@2x.png" << QSize(32, 32) << 2.0; + QTest::newRow("3x") << "qticon16@3x.png" << QSize(48, 48) << 3.0; +} + +void tst_QImageReader::devicePixelRatio() +{ + QFETCH(QString, fileName); + QFETCH(QSize, size); + QFETCH(qreal, dpr); + + QImageReader r(":/images/" + fileName); + QImage img = r.read(); + QCOMPARE(img.size(), size); + QCOMPARE(img.devicePixelRatio(), dpr); +} QTEST_MAIN(tst_QImageReader) #include "tst_qimagereader.moc"