diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp index fa4b4e01af..9b2e96d4b0 100644 --- a/src/gui/image/qicon.cpp +++ b/src/gui/image/qicon.cpp @@ -1469,8 +1469,13 @@ QString qt_findAtNxFile(const QString &baseFileName, qreal targetDevicePixelRati return baseFileName; int dotIndex = baseFileName.lastIndexOf(QLatin1Char('.')); - if (dotIndex == -1) /* no dot */ + if (dotIndex == -1) { /* no dot */ dotIndex = baseFileName.size(); /* append */ + } else if (dotIndex >= 2 && baseFileName[dotIndex - 1] == QLatin1Char('9') + && baseFileName[dotIndex - 2] == QLatin1Char('.')) { + // If the file has a .9.* (9-patch image) extension, we must ensure that the @nx goes before it. + dotIndex -= 2; + } QString atNxfileName = baseFileName; atNxfileName.insert(dotIndex, QLatin1String("@2x")); diff --git a/tests/auto/gui/image/qiconhighdpi/icons/misc/button.9.png b/tests/auto/gui/image/qiconhighdpi/icons/misc/button.9.png new file mode 100644 index 0000000000..1a560a1d74 Binary files /dev/null and b/tests/auto/gui/image/qiconhighdpi/icons/misc/button.9.png differ diff --git a/tests/auto/gui/image/qiconhighdpi/icons/misc/button@2x.9.png b/tests/auto/gui/image/qiconhighdpi/icons/misc/button@2x.9.png new file mode 100644 index 0000000000..f010dc55c7 Binary files /dev/null and b/tests/auto/gui/image/qiconhighdpi/icons/misc/button@2x.9.png differ diff --git a/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.cpp b/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.cpp index ce7f68a0a6..51892cca04 100644 --- a/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.cpp +++ b/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.cpp @@ -39,6 +39,7 @@ private slots: void initTestCase(); void fromTheme_data(); void fromTheme(); + void ninePatch(); }; tst_QIconHighDpi::tst_QIconHighDpi() @@ -182,6 +183,24 @@ void tst_QIconHighDpi::fromTheme() QCOMPARE(pixmap.devicePixelRatio(), expectedDpr); } +void tst_QIconHighDpi::ninePatch() +{ + const QIcon icon(":/icons/misc/button.9.png"); + const int dpr = qCeil(qApp->devicePixelRatio()); + + switch (dpr) { + case 1: + QCOMPARE(icon.availableSizes().size(), 1); + QCOMPARE(icon.availableSizes().at(0), QSize(42, 42)); + break; + case 2: + QCOMPARE(icon.availableSizes().size(), 2); + QCOMPARE(icon.availableSizes().at(0), QSize(42, 42)); + QCOMPARE(icon.availableSizes().at(1), QSize(82, 82)); + break; + } +} + int main(int argc, char *argv[]) { QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); diff --git a/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.qrc b/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.qrc index 80b5e38ee6..5cc1c6d9b1 100644 --- a/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.qrc +++ b/tests/auto/gui/image/qiconhighdpi/tst_qiconhighdpi.qrc @@ -4,5 +4,7 @@ icons/testtheme/22x22/actions/appointment-new.png icons/testtheme/index.theme icons/testtheme/22x22@2/actions/appointment-new.png + icons/misc/button.9.png + icons/misc/button@2x.9.png