From f70392700c63d81ef8bcee7351d903e4823b4571 Mon Sep 17 00:00:00 2001 From: Eirik Aavitsland Date: Mon, 26 Feb 2018 12:00:04 +0100 Subject: Fix: Do not read texture files when backend is not opengl The software backend would assert for the compressed GL texture files. Autotests updated for this functionality. Moved tests of the optional texture-file support out of qmltest (where it did not belong) and into tst_qquickimage, side by side with the tests of the optional svg format. Change-Id: I98c407093ccebeb70ba5a93ff0882dbd0b8060d5 Reviewed-by: Laszlo Agocs --- src/quick/util/qquickpixmapcache.cpp | 26 +++++++++++++++++---- tests/auto/qmltest/image/car.ktx | Bin 11908 -> 0 bytes tests/auto/qmltest/image/logo.pkm | Bin 32784 -> 0 bytes tests/auto/qmltest/image/tst_image.qml | 20 ---------------- tests/auto/quick/qquickimage/data/car.ktx | Bin 0 -> 11908 bytes tests/auto/quick/qquickimage/data/logo.pkm | Bin 0 -> 32784 bytes tests/auto/quick/qquickimage/tst_qquickimage.cpp | 28 ++++++++++++++++++++--- 7 files changed, 46 insertions(+), 28 deletions(-) delete mode 100644 tests/auto/qmltest/image/car.ktx delete mode 100644 tests/auto/qmltest/image/logo.pkm create mode 100644 tests/auto/quick/qquickimage/data/car.ktx create mode 100644 tests/auto/quick/qquickimage/data/logo.pkm diff --git a/src/quick/util/qquickpixmapcache.cpp b/src/quick/util/qquickpixmapcache.cpp index e1937aeec2..4237ec3edf 100644 --- a/src/quick/util/qquickpixmapcache.cpp +++ b/src/quick/util/qquickpixmapcache.cpp @@ -423,6 +423,24 @@ static QStringList fromLatin1List(const QList &list) return res; } +class BackendSupport +{ +public: + BackendSupport() + { + delete QSGContext::createTextureFactoryFromImage(QImage()); // Force init of backend data + hasOpenGL = QQuickWindow::sceneGraphBackend().isEmpty(); // i.e. default + QList list; + if (hasOpenGL) + list.append(QSGTextureReader::supportedFileFormats()); + list.append(QImageReader::supportedImageFormats()); + fileSuffixes = fromLatin1List(list); + } + bool hasOpenGL; + QStringList fileSuffixes; +}; +Q_GLOBAL_STATIC(BackendSupport, backendSupport); + static QString existingImageFileForPath(const QString &localFile) { // Do nothing if given filepath exists or already has a suffix @@ -430,11 +448,9 @@ static QString existingImageFileForPath(const QString &localFile) if (!fi.suffix().isEmpty() || fi.exists()) return localFile; - static const QStringList suffixes = fromLatin1List(QSGTextureReader::supportedFileFormats() + - QImageReader::supportedImageFormats()); QString tryFile = localFile + QStringLiteral(".xxxx"); const int suffixIdx = localFile.length() + 1; - for (const QString &suffix : suffixes) { + for (const QString &suffix : backendSupport()->fileSuffixes) { tryFile.replace(suffixIdx, 10, suffix); if (QFileInfo::exists(tryFile)) return tryFile; @@ -801,7 +817,7 @@ void QQuickPixmapReader::processJob(QQuickPixmapReply *runningJob, const QUrl &u QSize readSize; if (f.open(QIODevice::ReadOnly)) { QSGTextureReader texReader(&f, localFile); - if (texReader.isTexture()) { + if (backendSupport()->hasOpenGL && texReader.isTexture()) { QQuickTextureFactory *factory = texReader.read(); if (factory) { readSize = factory->textureSize(); @@ -1284,7 +1300,7 @@ static QQuickPixmapData* createPixmapDataSync(QQuickPixmap *declarativePixmap, Q if (f.open(QIODevice::ReadOnly)) { QSGTextureReader texReader(&f, localFile); - if (texReader.isTexture()) { + if (backendSupport()->hasOpenGL && texReader.isTexture()) { QQuickTextureFactory *factory = texReader.read(); if (factory) { *ok = true; diff --git a/tests/auto/qmltest/image/car.ktx b/tests/auto/qmltest/image/car.ktx deleted file mode 100644 index 2aefdd306b..0000000000 Binary files a/tests/auto/qmltest/image/car.ktx and /dev/null differ diff --git a/tests/auto/qmltest/image/logo.pkm b/tests/auto/qmltest/image/logo.pkm deleted file mode 100644 index c0987c5c36..0000000000 Binary files a/tests/auto/qmltest/image/logo.pkm and /dev/null differ diff --git a/tests/auto/qmltest/image/tst_image.qml b/tests/auto/qmltest/image/tst_image.qml index 346bee6969..f8f0e7b53c 100644 --- a/tests/auto/qmltest/image/tst_image.qml +++ b/tests/auto/qmltest/image/tst_image.qml @@ -122,16 +122,6 @@ Item { fillMode: Image.TileHorizontally } - Image { - id: pkmImage - source: "logo.pkm" - } - - Image { - id: ktxImage - source: "car.ktx" - } - TestCase { name: "Image" @@ -231,15 +221,5 @@ Item { compare(tileModes3.height, 150) compare(tileModes3.fillMode, Image.TileHorizontally) } - - function test_pkmImage() { - compare(pkmImage.width, 256) - compare(pkmImage.height, 256) - } - - function test_ktxImage() { - compare(ktxImage.width, 146) - compare(ktxImage.height, 80) - } } } diff --git a/tests/auto/quick/qquickimage/data/car.ktx b/tests/auto/quick/qquickimage/data/car.ktx new file mode 100644 index 0000000000..2aefdd306b Binary files /dev/null and b/tests/auto/quick/qquickimage/data/car.ktx differ diff --git a/tests/auto/quick/qquickimage/data/logo.pkm b/tests/auto/quick/qquickimage/data/logo.pkm new file mode 100644 index 0000000000..c0987c5c36 Binary files /dev/null and b/tests/auto/quick/qquickimage/data/logo.pkm differ diff --git a/tests/auto/quick/qquickimage/tst_qquickimage.cpp b/tests/auto/quick/qquickimage/tst_qquickimage.cpp index 9a93bf8892..3613ba6d87 100644 --- a/tests/auto/quick/qquickimage/tst_qquickimage.cpp +++ b/tests/auto/quick/qquickimage/tst_qquickimage.cpp @@ -62,6 +62,7 @@ public: tst_qquickimage(); private slots: + void initTestCase(); void cleanup(); void noSource(); void imageSource(); @@ -97,12 +98,22 @@ private slots: private: QQmlEngine engine; + QSGRendererInterface::GraphicsApi graphicsApi = QSGRendererInterface::Unknown; }; tst_qquickimage::tst_qquickimage() { } +void tst_qquickimage::initTestCase() +{ + QQmlDataTest::initTestCase(); + QScopedPointer window(new QQuickView(0)); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); + graphicsApi = window->rendererInterface()->graphicsApi(); +} + void tst_qquickimage::cleanup() { QQuickWindow window; @@ -150,6 +161,11 @@ void tst_qquickimage::imageSource_data() QTest::newRow("remote svg") << "/heart.svg" << 595.0 << 841.0 << true << false << false << ""; if (QImageReader::supportedImageFormats().contains("svgz")) QTest::newRow("remote svgz") << "/heart.svgz" << 595.0 << 841.0 << true << false << false << ""; + if (graphicsApi == QSGRendererInterface::OpenGL) { + QTest::newRow("texturefile pkm format") << testFileUrl("logo.pkm").toString() << 256.0 << 256.0 << false << false << true << ""; + QTest::newRow("texturefile ktx format") << testFileUrl("car.ktx").toString() << 146.0 << 80.0 << false << false << true << ""; + QTest::newRow("texturefile async") << testFileUrl("logo.pkm").toString() << 256.0 << 256.0 << false << true << true << ""; + } QTest::newRow("remote not found") << "/no-such-file.png" << 0.0 << 0.0 << true << false << true << ":2:1: QML Image: Error transferring {{ServerBaseUrl}}/no-such-file.png - server replied: Not found"; QTest::newRow("extless") << testFileUrl("colors").toString() << 120.0 << 120.0 << false << false << true << ""; @@ -157,9 +173,15 @@ void tst_qquickimage::imageSource_data() QTest::newRow("extless async") << testFileUrl("colors1").toString() << 120.0 << 120.0 << false << true << true << ""; QTest::newRow("extless not found") << testFileUrl("no-such-file").toString() << 0.0 << 0.0 << false << false << true << ":2:1: QML Image: Cannot open: " + testFileUrl("no-such-file").toString(); - // Test that pkm is preferred over png. As pattern.pkm has different size than pattern.png, these tests verify that the right file has been loaded - QTest::newRow("extless prefer-tex") << testFileUrl("pattern").toString() << 64.0 << 64.0 << false << false << true << ""; - QTest::newRow("extless prefer-tex async") << testFileUrl("pattern").toString() << 64.0 << 64.0 << false << true << true << ""; + // Test that texture file is preferred over image file, when supported. + // Since pattern.pkm has different size than pattern.png, these tests verify that the right file has been loaded + if (graphicsApi == QSGRendererInterface::OpenGL) { + QTest::newRow("extless prefer-tex") << testFileUrl("pattern").toString() << 64.0 << 64.0 << false << false << true << ""; + QTest::newRow("extless prefer-tex async") << testFileUrl("pattern").toString() << 64.0 << 64.0 << false << true << true << ""; + } else { + QTest::newRow("extless ignore-tex") << testFileUrl("pattern").toString() << 200.0 << 200.0 << false << false << true << ""; + QTest::newRow("extless ignore-tex async") << testFileUrl("pattern").toString() << 200.0 << 200.0 << false << true << true << ""; + } } -- cgit v1.2.3