/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "../shared/util.h" #include "../shared/visualtestutil.h" using namespace QQuickVisualTestUtil; class tst_qquickninepatchimage : public QQmlDataTest { Q_OBJECT private slots: void ninePatch_data(); void ninePatch(); void padding_data(); void padding(); void inset_data(); void inset(); void implicitSize_data(); void implicitSize(); }; static QImage grabItemToImage(QQuickItem *item) { QSharedPointer result = item->grabToImage(); QSignalSpy spy(result.data(), SIGNAL(ready())); spy.wait(); return result->image(); } void tst_qquickninepatchimage::ninePatch_data() { QTest::addColumn("dpr"); QTest::addColumn("size"); // original size, downsized, stretched const QList sizes = QList() << QSize(40, 40) // original << QSize(10, 40) // downsized (h) << QSize(40, 10) // downsized (v) << QSize(10, 10) // downsized (h & v) << QSize(80, 40) // stretched (h) << QSize(40, 80) // stretched (v) << QSize(80, 80) // stretched (h & v) << QSize(8, 8); // minimal (borders only) for (const QSize &sz : sizes) { for (int dpr = 1; dpr <= 4; ++dpr) QTest::newRow(qPrintable(QString::fromLatin1("DPR=%1, %2x%3").arg(dpr).arg(sz.width()).arg(sz.height()))) << dpr << sz; } } void tst_qquickninepatchimage::ninePatch() { QFETCH(int, dpr); QFETCH(QSize, size); QHighDpiScaling::setGlobalFactor(dpr); QQuickView view(testFileUrl("ninepatchimage.qml")); QCOMPARE(view.status(), QQuickView::Ready); view.show(); view.requestActivate(); QVERIFY(QTest::qWaitForWindowActive(&view)); QQuickImage *ninePatchImage = qobject_cast(view.rootObject()); QVERIFY(ninePatchImage); ninePatchImage->setSource(testFileUrl("foo.9.png")); ninePatchImage->setSize(size); const QImage ninePatchImageGrab = grabItemToImage(ninePatchImage).scaled(size * dpr); // Generate an image to compare against the actual 9-patch image. QImage generatedImage(size * dpr, ninePatchImageGrab.format()); generatedImage.fill(Qt::red); QImage blueRect(4 * dpr, 4 * dpr, ninePatchImageGrab.format()); blueRect.fill(Qt::blue); QPainter painter(&generatedImage); // Top-left painter.drawImage(0, 0, blueRect); // Top-right painter.drawImage(generatedImage.width() - blueRect.width(), 0, blueRect); // Bottom-right painter.drawImage(generatedImage.width() - blueRect.width(), generatedImage.height() - blueRect.height(), blueRect); // Bottom-left painter.drawImage(0, generatedImage.height() - blueRect.height(), blueRect); if ((QGuiApplication::platformName() == QLatin1String("offscreen")) || (QGuiApplication::platformName() == QLatin1String("minimal"))) QEXPECT_FAIL("", "Grabbing does not work on offscreen/minimal platforms", Abort); QCOMPARE(ninePatchImageGrab, generatedImage); } void tst_qquickninepatchimage::padding_data() { QTest::addColumn("dpr"); for (int dpr = 1; dpr <= 4; ++dpr) QTest::newRow(qPrintable(QString::fromLatin1("DPR=%1").arg(dpr))) << dpr; } void tst_qquickninepatchimage::padding() { QFETCH(int, dpr); QHighDpiScaling::setGlobalFactor(dpr); QQuickView view(testFileUrl("ninepatchimage.qml")); QCOMPARE(view.status(), QQuickView::Ready); view.show(); view.requestActivate(); QVERIFY(QTest::qWaitForWindowActive(&view)); QQuickImage *ninePatchImage = qobject_cast(view.rootObject()); QVERIFY(ninePatchImage); ninePatchImage->setSource(testFileUrl("padding.9.png")); QCOMPARE(ninePatchImage->property("topPadding").toReal(), 8); QCOMPARE(ninePatchImage->property("leftPadding").toReal(), 18); QCOMPARE(ninePatchImage->property("rightPadding").toReal(), 20); QCOMPARE(ninePatchImage->property("bottomPadding").toReal(), 10); } void tst_qquickninepatchimage::inset_data() { QTest::addColumn("dpr"); QTest::addColumn("file"); QTest::addColumn("insets"); const QStringList files = QStringList() << "inset-all.9.png" << "inset-topleft.9.png" << "inset-bottomright.9.png"; const QList insets = QList() << QMarginsF(2, 1, 3, 4) << QMarginsF(2, 1, 0, 0) << QMarginsF(0, 0, 3, 4); for (int i = 0; i < files.count(); ++i) { QString file = files.at(i); for (int dpr = 1; dpr <= 4; ++dpr) QTest::newRow(qPrintable(QString::fromLatin1("%1 DPR=%2").arg(file).arg(dpr))) << dpr << file << insets.at(i); } } Q_DECLARE_METATYPE(QMarginsF) void tst_qquickninepatchimage::inset() { QFETCH(int, dpr); QFETCH(QString, file); QFETCH(QMarginsF, insets); QHighDpiScaling::setGlobalFactor(dpr); QQuickView view(testFileUrl("ninepatchimage.qml")); QCOMPARE(view.status(), QQuickView::Ready); view.show(); view.requestActivate(); QVERIFY(QTest::qWaitForWindowActive(&view)); QQuickImage *ninePatchImage = qobject_cast(view.rootObject()); QVERIFY(ninePatchImage); ninePatchImage->setSource(testFileUrl(file)); QCOMPARE(ninePatchImage->property("topInset").toReal(), insets.top()); QCOMPARE(ninePatchImage->property("leftInset").toReal(), insets.left()); QCOMPARE(ninePatchImage->property("rightInset").toReal(), insets.right()); QCOMPARE(ninePatchImage->property("bottomInset").toReal(), insets.bottom()); } void tst_qquickninepatchimage::implicitSize_data() { QTest::addColumn("dpr"); QTest::addColumn("file"); QTest::addColumn("implicitSize"); const struct TestFile { QString name; QSizeF sizeHint; } testFiles [] = { { "foo.9.png", QSizeF(40, 40) }, { "padding.9.png", QSizeF(40, 40) }, { "inset-all.9.png", QSizeF(45, 45) }, { "inset-topleft.9.png", QSizeF(42, 41) }, { "inset-bottomright.9.png", QSizeF(43, 44) } }; for (const TestFile &file : testFiles) { for (int dpr = 1; dpr <= 4; ++dpr) QTest::newRow(qPrintable(QString::fromLatin1("%1 DPR=%2").arg(file.name).arg(dpr))) << dpr << file.name << file.sizeHint; } } void tst_qquickninepatchimage::implicitSize() { QFETCH(int, dpr); QFETCH(QString, file); QFETCH(QSizeF, implicitSize); QHighDpiScaling::setGlobalFactor(dpr); QQuickView view(testFileUrl("ninepatchimage.qml")); QCOMPARE(view.status(), QQuickView::Ready); view.show(); view.requestActivate(); QVERIFY(QTest::qWaitForWindowActive(&view)); QQuickImage *ninePatchImage = qobject_cast(view.rootObject()); QVERIFY(ninePatchImage); ninePatchImage->setSource(testFileUrl(file)); QCOMPARE(ninePatchImage->implicitWidth(), implicitSize.width()); QCOMPARE(ninePatchImage->implicitHeight(), implicitSize.height()); } QTEST_MAIN(tst_qquickninepatchimage) #include "tst_qquickninepatchimage.moc"