diff options
Diffstat (limited to 'tests/auto/gui')
43 files changed, 782 insertions, 177 deletions
diff --git a/tests/auto/gui/gui.pro b/tests/auto/gui/gui.pro index d7cda11513..e0c8123f26 100644 --- a/tests/auto/gui/gui.pro +++ b/tests/auto/gui/gui.pro @@ -14,6 +14,6 @@ SUBDIRS = \ util \ itemmodels \ -!qtConfig(opengl): SUBDIRS -= qopengl qopenglconfig +!qtConfig(opengl)|winrt: SUBDIRS -= qopengl qopenglconfig !qtConfig(vulkan): SUBDIRS -= qvulkan diff --git a/tests/auto/gui/image/qimage/images/jpeg_exif_utf8_comment.jpg b/tests/auto/gui/image/qimage/images/jpeg_exif_utf8_comment.jpg Binary files differnew file mode 100644 index 0000000000..42b305f5b8 --- /dev/null +++ b/tests/auto/gui/image/qimage/images/jpeg_exif_utf8_comment.jpg diff --git a/tests/auto/gui/image/qimage/qimage.pro b/tests/auto/gui/image/qimage/qimage.pro index 56618e0bfa..b40866892e 100644 --- a/tests/auto/gui/image/qimage/qimage.pro +++ b/tests/auto/gui/image/qimage/qimage.pro @@ -7,4 +7,7 @@ qtConfig(c++11): CONFIG += c++11 android:!android-embedded: RESOURCES += qimage.qrc +win32:!winrt: LIBS += -lgdi32 -luser32 +darwin: LIBS += -framework CoreGraphics + TESTDATA += images/* diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp index 34b20a5cca..5ffd75f931 100644 --- a/tests/auto/gui/image/qimage/tst_qimage.cpp +++ b/tests/auto/gui/image/qimage/tst_qimage.cpp @@ -44,6 +44,10 @@ #include <CoreGraphics/CoreGraphics.h> #endif +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) +# include <qt_windows.h> +#endif + Q_DECLARE_METATYPE(QImage::Format) Q_DECLARE_METATYPE(Qt::GlobalColor) @@ -116,6 +120,7 @@ private slots: void smoothScale2(); void smoothScale3_data(); void smoothScale3(); + void smoothScale4_data(); void smoothScale4(); void smoothScaleBig(); @@ -192,6 +197,7 @@ private slots: void exif_QTBUG45865(); void exifInvalidData_data(); void exifInvalidData(); + void exifReadComments(); void cleanupFunctions(); @@ -224,6 +230,11 @@ private slots: void convertColorTable(); +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) + void toWinHBITMAP_data(); + void toWinHBITMAP(); +#endif // Q_OS_WIN && !Q_OS_WINRT + private: const QString m_prefix; }; @@ -281,6 +292,12 @@ static QLatin1String formatToString(QImage::Format format) return QLatin1String("Alpha8"); case QImage::Format_Grayscale8: return QLatin1String("Grayscale8"); + case QImage::Format_RGBX64: + return QLatin1String("RGBx64"); + case QImage::Format_RGBA64: + return QLatin1String("RGBA64"); + case QImage::Format_RGBA64_Premultiplied: + return QLatin1String("RGBA64pm"); default: break; }; @@ -1665,29 +1682,30 @@ void tst_QImage::smoothScale() // test area sampling void tst_QImage::smoothScale2_data() { - QTest::addColumn<int>("format"); + QTest::addColumn<QImage::Format>("format"); QTest::addColumn<int>("size"); int sizes[] = { 2, 3, 4, 6, 7, 8, 10, 16, 20, 32, 40, 64, 100, 101, 128, 0 }; - QImage::Format formats[] = { QImage::Format_RGB32, QImage::Format_ARGB32_Premultiplied, QImage::Format_Invalid }; + QImage::Format formats[] = { QImage::Format_RGB32, QImage::Format_ARGB32_Premultiplied, QImage::Format_RGBX64, QImage::Format_RGBA64_Premultiplied, QImage::Format_Invalid }; for (int j = 0; formats[j] != QImage::Format_Invalid; ++j) { - QByteArray formatstr = formats[j] == QImage::Format_RGB32 ? QByteArrayLiteral("rgb32") : QByteArrayLiteral("argb32pm"); + QString formatstr = formatToString(formats[j]); for (int i = 0; sizes[i] != 0; ++i) { const QByteArray sizeB = QByteArray::number(sizes[i]); - QTest::newRow((formatstr + ' ' + sizeB + 'x' + sizeB).constData()) - << (int)formats[j] << sizes[i]; + QTest::newRow(QString("%1 %2x%2").arg(formatstr).arg(sizes[i]).toUtf8()) << formats[j] << sizes[i]; } } } void tst_QImage::smoothScale2() { - QFETCH(int, format); + QFETCH(QImage::Format, format); QFETCH(int, size); - QRgb expected = format == QImage::Format_RGB32 ? qRgb(63, 127, 255) : qRgba(31, 63, 127, 127); + bool opaque = (format == QImage::Format_RGB32 || format == QImage::Format_RGBX64); - QImage img(size, size, (QImage::Format)format); + QRgb expected = opaque ? qRgb(63, 127, 255) : qRgba(31, 63, 127, 127); + + QImage img(size, size, format); img.fill(expected); // scale x down, y down @@ -1824,21 +1842,31 @@ void tst_QImage::smoothScale3() } // Tests smooth upscale is smooth +void tst_QImage::smoothScale4_data() +{ + QTest::addColumn<QImage::Format>("format"); + + QTest::newRow("RGB32") << QImage::Format_RGB32; + QTest::newRow("RGBx64") << QImage::Format_RGBX64; +} + void tst_QImage::smoothScale4() { - QImage img(4, 4, QImage::Format_RGB32); + QFETCH(QImage::Format, format); + QImage img(4, 4, format); for (int y = 0; y < 4; ++y) { for (int x = 0; x < 4; ++x) { img.setPixel(x, y, qRgb(x * 255 / 3, y * 255 / 3, 0)); } } QImage scaled = img.scaled(37, 23, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + QCOMPARE(scaled.format(), format); for (int y = 0; y < scaled.height(); ++y) { for (int x = 0; x < scaled.width(); ++x) { if (x > 0) - QVERIFY(qRed(scaled.pixel(x, y)) >= qRed(scaled.pixel(x - 1, y))); + QVERIFY(scaled.pixelColor(x, y).redF() >= scaled.pixelColor(x - 1, y).redF()); if (y > 0) - QVERIFY(qGreen(scaled.pixel(x, y)) >= qGreen(scaled.pixel(x, y - 1))); + QVERIFY(scaled.pixelColor(x, y).greenF() >= scaled.pixelColor(x, y - 1).greenF()); } } } @@ -2337,7 +2365,9 @@ void tst_QImage::rgbSwapped_data() { QTest::addColumn<QImage::Format>("format"); - for (int i = QImage::Format_Indexed8; i < QImage::Format_Alpha8; ++i) { + for (int i = QImage::Format_Indexed8; i < QImage::NImageFormats; ++i) { + if (i == QImage::Format_Alpha8 || i == QImage::Format_Grayscale8) + continue; QTest::addRow("%s", formatToString(QImage::Format(i)).data()) << QImage::Format(i); } } @@ -2505,14 +2535,7 @@ void tst_QImage::mirrored() void tst_QImage::inplaceRgbSwapped_data() { - QTest::addColumn<QImage::Format>("format"); - - QTest::newRow("Format_ARGB32_Premultiplied") << QImage::Format_ARGB32_Premultiplied; - QTest::newRow("Format_RGBA8888") << QImage::Format_RGBA8888; - QTest::newRow("Format_A2RGB30_Premultiplied") << QImage::Format_A2RGB30_Premultiplied; - QTest::newRow("Format_RGB888") << QImage::Format_RGB888; - QTest::newRow("Format_RGB16") << QImage::Format_RGB16; - QTest::newRow("Format_Indexed8") << QImage::Format_Indexed8; + rgbSwapped_data(); } void tst_QImage::inplaceRgbSwapped() @@ -2543,9 +2566,9 @@ void tst_QImage::inplaceRgbSwapped() for (int i = 0; i < imageSwapped.width(); ++i) { QRgb referenceColor = testColor[i]; QRgb swappedColor = imageSwapped.pixel(i, 0); - QCOMPARE(qRed(swappedColor) & 0xf8, qBlue(referenceColor) & 0xf8); - QCOMPARE(qGreen(swappedColor) & 0xf8, qGreen(referenceColor) & 0xf8); - QCOMPARE(qBlue(swappedColor) & 0xf8, qRed(referenceColor) & 0xf8); + QCOMPARE(qRed(swappedColor) & 0xf0, qBlue(referenceColor) & 0xf0); + QCOMPARE(qGreen(swappedColor) & 0xf0, qGreen(referenceColor) & 0xf0); + QCOMPARE(qBlue(swappedColor) & 0xf0, qRed(referenceColor) & 0xf0); } QCOMPARE(imageSwapped.constScanLine(0), orginalPtr); @@ -2761,9 +2784,13 @@ void tst_QImage::genericRgbConversion_data() QTest::addColumn<QImage::Format>("format"); QTest::addColumn<QImage::Format>("dest_format"); - for (int i = QImage::Format_RGB32; i < QImage::Format_Alpha8; ++i) { + for (int i = QImage::Format_RGB32; i < QImage::NImageFormats; ++i) { + if (i == QImage::Format_Alpha8 || i == QImage::Format_Grayscale8) + continue; const QLatin1String formatI = formatToString(QImage::Format(i)); - for (int j = QImage::Format_RGB32; j < QImage::Format_Alpha8; ++j) { + for (int j = QImage::Format_RGB32; j < QImage::NImageFormats; ++j) { + if (j == QImage::Format_Alpha8 || j == QImage::Format_Grayscale8) + continue; if (i == j) continue; QTest::addRow("%s -> %s", formatI.data(), formatToString(QImage::Format(j)).data()) @@ -2800,8 +2827,12 @@ void tst_QImage::inplaceRgbConversion_data() QTest::addColumn<QImage::Format>("format"); QTest::addColumn<QImage::Format>("dest_format"); - for (int i = QImage::Format_RGB32; i < QImage::Format_Alpha8; ++i) { - for (int j = QImage::Format_RGB32; j < QImage::Format_Alpha8; ++j) { + for (int i = QImage::Format_RGB32; i < QImage::NImageFormats; ++i) { + if (i == QImage::Format_Alpha8 || i == QImage::Format_Grayscale8) + continue; + for (int j = QImage::Format_RGB32; j < QImage::NImageFormats; ++j) { + if (j == QImage::Format_Alpha8 || j == QImage::Format_Grayscale8) + continue; if (i == j) continue; QTest::addRow("%s -> %s", formatToString(QImage::Format(i)).data(), formatToString(QImage::Format(j)).data()) @@ -2834,10 +2865,10 @@ void tst_QImage::inplaceRgbConversion() QCOMPARE(qGreen(convertedColor) & 0xF0, i * 16); } } - if (image.depth() == imageConverted.depth()) + if (qt_depthForFormat(format) == qt_depthForFormat(dest_format)) QCOMPARE(imageConverted.constScanLine(0), originalPtr); - { + if (qt_depthForFormat(format) <= 32) { // Test attempted inplace conversion of images created on existing buffer static const quint32 readOnlyData[] = { 0xff0102ffU, 0xff0506ffU, 0xff0910ffU, 0xff1314ffU }; quint32 readWriteData[] = { 0xff0102ffU, 0xff0506ffU, 0xff0910ffU, 0xff1314ffU }; @@ -2970,7 +3001,9 @@ void tst_QImage::invertPixelsRGB_data() { QTest::addColumn<QImage::Format>("image_format"); - for (int i = QImage::Format_RGB32; i < QImage::Format_Alpha8; ++i) { + for (int i = QImage::Format_RGB32; i < QImage::NImageFormats; ++i) { + if (i == QImage::Format_Alpha8 || i == QImage::Format_Grayscale8) + continue; QTest::addRow("%s", formatToString(QImage::Format(i)).data()) << QImage::Format(i); } } @@ -3068,6 +3101,34 @@ void tst_QImage::exifInvalidData() QVERIFY(!image.isNull()); } +void tst_QImage::exifReadComments() +{ + QImage image; + QVERIFY(image.load(m_prefix + "jpeg_exif_utf8_comment.jpg")); + QVERIFY(!image.isNull()); + QCOMPARE(image.textKeys().size(), 1); + QCOMPARE(image.textKeys().first(), "Description"); + // check if exif comment is read as utf-8 + QCOMPARE(image.text("Description"), QString::fromUtf8("some unicode chars: ÖÄÜ€@")); + + QByteArray ba; + { + QBuffer buf(&ba); + QVERIFY(buf.open(QIODevice::WriteOnly)); + QVERIFY(image.save(&buf, "JPG")); + } + QVERIFY(!ba.isEmpty()); + image = QImage(); + QCOMPARE(image.textKeys().size(), 0); + { + QBuffer buf(&ba); + QVERIFY(buf.open(QIODevice::ReadOnly)); + QVERIFY(image.load(&buf, "JPG")); + } + // compare written (and reread) description text + QCOMPARE(image.text("Description"), QString::fromUtf8("some unicode chars: ÖÄÜ€@")); +} + static void cleanupFunction(void* info) { bool *called = static_cast<bool*>(info); @@ -3473,5 +3534,108 @@ void tst_QImage::convertColorTable() QCOMPARE(rgb32.pixel(0,0), 0xffffffff); } +#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT) +QT_BEGIN_NAMESPACE +Q_GUI_EXPORT HBITMAP qt_imageToWinHBITMAP(const QImage &p, int hbitmapFormat = 0); +Q_GUI_EXPORT QImage qt_imageFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0); +QT_END_NAMESPACE + +static inline QColor COLORREFToQColor(COLORREF cr) +{ + return QColor(GetRValue(cr), GetGValue(cr), GetBValue(cr)); +} + +void tst_QImage::toWinHBITMAP_data() +{ + QTest::addColumn<QImage::Format>("format"); + QTest::addColumn<QColor>("color"); + QTest::addColumn<QColor>("bottomRightColor"); + + const QColor red(Qt::red); + const QColor green(Qt::green); + const QColor blue(Qt::blue); + const QColor gray(Qt::gray); + const QColor gray555(0x5a, 0x5a, 0x5a); // Note: Interpolation 8<->5 bit occurs. + const QColor white(Qt::white); + const QColor black(Qt::black); + + QTest::newRow("argb32p-red") << QImage::Format_ARGB32_Premultiplied << red << gray; + QTest::newRow("argb32p-green") << QImage::Format_ARGB32_Premultiplied << green << gray; + QTest::newRow("argb32p-blue") << QImage::Format_ARGB32_Premultiplied << blue << gray; + QTest::newRow("rgb888-red") << QImage::Format_RGB888 << red << gray; + QTest::newRow("rgb888-green") << QImage::Format_RGB888 << green << gray; + QTest::newRow("rgb888-blue") << QImage::Format_RGB888 << blue << gray; + QTest::newRow("indexed8-red") << QImage::Format_Indexed8 << red << gray; + QTest::newRow("indexed8-green") << QImage::Format_Indexed8 << green << gray; + QTest::newRow("indexed8-blue") << QImage::Format_Indexed8 << blue << gray; + QTest::newRow("rgb555-red") << QImage::Format_RGB555 << red << gray555; + QTest::newRow("rgb555-green") << QImage::Format_RGB555 << green << gray555; + QTest::newRow("rgb555-blue") << QImage::Format_RGB555 << blue << gray555; + QTest::newRow("mono") << QImage::Format_Mono << white << black; +} + +// Test image filled with color, black pixel at botttom right corner. +static inline QImage createTestImage(QImage::Format format, int width, int height, + const QColor &fillColor, const QColor &bottomRightColor) +{ + QImage image(QSize(width, height), format); + image.fill(fillColor); + QPainter painter(&image); + QPen pen = painter.pen(); + pen.setColor(bottomRightColor); + painter.setPen(pen); + painter.drawPoint(width -1, height - 1); + return image; +} + +void tst_QImage::toWinHBITMAP() +{ + static const int width = 73; + static const int height = 57; + + QFETCH(QImage::Format, format); + QFETCH(QColor, color); + QFETCH(QColor, bottomRightColor); + + // Cannot paint on indexed/mono images. + const QImage image = format == QImage::Format_Indexed8 || format == QImage::Format_Mono + ? createTestImage(QImage::Format_RGB32, width, height, color, bottomRightColor).convertToFormat(format) + : createTestImage(format, width, height, color, bottomRightColor); + + const HBITMAP bitmap = qt_imageToWinHBITMAP(image); + + QVERIFY(bitmap != 0); + + // Verify size + BITMAP bitmapInfo; + memset(&bitmapInfo, 0, sizeof(BITMAP)); + + const int res = GetObject(bitmap, sizeof(BITMAP), &bitmapInfo); + QVERIFY(res); + QCOMPARE(width, int(bitmapInfo.bmWidth)); + QCOMPARE(height, int(bitmapInfo.bmHeight)); + + const HDC displayDc = GetDC(0); + const HDC bitmapDc = CreateCompatibleDC(displayDc); + + const HBITMAP nullBitmap = static_cast<HBITMAP>(SelectObject(bitmapDc, bitmap)); + + QCOMPARE(COLORREFToQColor(GetPixel(bitmapDc, 0, 0)), color); + QCOMPARE(COLORREFToQColor(GetPixel(bitmapDc, width - 1, 3)), color); + QCOMPARE(COLORREFToQColor(GetPixel(bitmapDc, 3, height - 1)), color); + QCOMPARE(COLORREFToQColor(GetPixel(bitmapDc, width - 1, height - 1)), bottomRightColor); + + const QImage convertedBack = qt_imageFromWinHBITMAP(bitmap); + QCOMPARE(convertedBack.convertToFormat(QImage::Format_ARGB32_Premultiplied), + image.convertToFormat(QImage::Format_ARGB32_Premultiplied)); + + // Clean up + SelectObject(bitmapDc, nullBitmap); + DeleteObject(bitmap); + DeleteDC(bitmapDc); + ReleaseDC(0, displayDc); +} +#endif // Q_OS_WIN && !Q_OS_WINRT + QTEST_GUILESS_MAIN(tst_QImage) #include "tst_qimage.moc" diff --git a/tests/auto/gui/image/qimagereader/images/basn0g16.png b/tests/auto/gui/image/qimagereader/images/basn0g16.png Binary files differnew file mode 100644 index 0000000000..318ebcadf4 --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/basn0g16.png diff --git a/tests/auto/gui/image/qimagereader/images/basn2c16.png b/tests/auto/gui/image/qimagereader/images/basn2c16.png Binary files differnew file mode 100644 index 0000000000..1bd4a4d0e2 --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/basn2c16.png diff --git a/tests/auto/gui/image/qimagereader/images/basn4a16.png b/tests/auto/gui/image/qimagereader/images/basn4a16.png Binary files differnew file mode 100644 index 0000000000..6dbee9fbdb --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/basn4a16.png diff --git a/tests/auto/gui/image/qimagereader/images/basn6a16.png b/tests/auto/gui/image/qimagereader/images/basn6a16.png Binary files differnew file mode 100644 index 0000000000..a9bf3cb461 --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/basn6a16.png diff --git a/tests/auto/gui/image/qimagereader/images/kollada-16bpc.png b/tests/auto/gui/image/qimagereader/images/kollada-16bpc.png Binary files differnew file mode 100644 index 0000000000..b99d5f8a6f --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/kollada-16bpc.png diff --git a/tests/auto/gui/image/qimagereader/images/tbwn0g16.png b/tests/auto/gui/image/qimagereader/images/tbwn0g16.png Binary files differnew file mode 100644 index 0000000000..99bdeed2b3 --- /dev/null +++ b/tests/auto/gui/image/qimagereader/images/tbwn0g16.png diff --git a/tests/auto/gui/image/qimagereader/qimagereader.pro b/tests/auto/gui/image/qimagereader/qimagereader.pro index b06f56dddf..623d45ffe2 100644 --- a/tests/auto/gui/image/qimagereader/qimagereader.pro +++ b/tests/auto/gui/image/qimagereader/qimagereader.pro @@ -3,7 +3,8 @@ TARGET = tst_qimagereader SOURCES += tst_qimagereader.cpp MOC_DIR=tmp QT += core-private gui-private network testlib -RESOURCES += qimagereader.qrc + +RESOURCES += $$files(images/*) android:!android-embedded { RESOURCES += android_testdata.qrc diff --git a/tests/auto/gui/image/qimagereader/qimagereader.qrc b/tests/auto/gui/image/qimagereader/qimagereader.qrc deleted file mode 100644 index 2522154b1f..0000000000 --- a/tests/auto/gui/image/qimagereader/qimagereader.qrc +++ /dev/null @@ -1,69 +0,0 @@ -<RCC> - <qresource prefix="/"> - <file>images/16bpp.bmp</file> - <file>images/4bpp-rle.bmp</file> - <file>images/YCbCr_cmyk.jpg</file> - <file>images/YCbCr_cmyk.png</file> - <file>images/YCbCr_rgb.jpg</file> - <file>images/away.png</file> - <file>images/bat1.gif</file> - <file>images/bat2.gif</file> - <file>images/beavis.jpg</file> - <file>images/black.png</file> - <file>images/black.xpm</file> - <file>images/colorful.bmp</file> - <file>images/corrupt-colors.xpm</file> - <file>images/corrupt-pixels.xpm</file> - <file>images/corrupt.bmp</file> - <file>images/corrupt.gif</file> - <file>images/corrupt.jpg</file> - <file>images/corrupt.png</file> - <file>images/corrupt.xbm</file> - <file>images/crash-signed-char.bmp</file> - <file>images/earth.gif</file> - <file>images/font.bmp</file> - <file>images/gnus.xbm</file> - <file>images/image.pbm</file> - <file>images/image.pgm</file> - <file>images/image.png</file> - <file>images/image.ppm</file> - <file>images/kollada.png</file> - <file>images/marble.xpm</file> - <file>images/namedcolors.xpm</file> - <file>images/negativeheight.bmp</file> - <file>images/noclearcode.bmp</file> - <file>images/noclearcode.gif</file> - <file>images/nontransparent.xpm</file> - <file>images/rgb32bf.bmp</file> - <file>images/runners.ppm</file> - <file>images/teapot.ppm</file> - <file>images/test.ppm</file> - <file>images/test.xpm</file> - <file>images/test32bfv4.bmp</file> - <file>images/test32v5.bmp</file> - <file>images/tst7.bmp</file> - <file>images/tst7.png</file> - <file>images/transparent.xpm</file> - <file>images/trolltech.gif</file> - <file>images/qt.gif</file> - <file>images/qt1.gif</file> - <file>images/qt2.gif</file> - <file>images/qt3.gif</file> - <file>images/qt4.gif</file> - <file>images/qt5.gif</file> - <file>images/qt6.gif</file> - <file>images/qt7.gif</file> - <file>images/qt8.gif</file> - <file>images/endless-anim.gif</file> - <file>images/four-frames.gif</file> - <file>images/qt-gif-anim.gif</file> - <file>images/qt-gif-noanim.gif</file> - <file>images/rect.svg</file> - <file>images/rect.svgz</file> - <file>images/corrupt.svg</file> - <file>images/corrupt.svgz</file> - <file>images/qtbug13653-no_eoi.jpg</file> - <file>images/txts.jpg</file> - <file>images/txts.png</file> - </qresource> -</RCC> diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp index 170f551dbf..aa9a990fef 100644 --- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp +++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp @@ -234,6 +234,7 @@ void tst_QImageReader::readImage_data() QTest::newRow("BMP: high mask bit set") << QString("rgb32bf.bmp") << true << QByteArray("bmp"); QTest::newRow("XPM: marble") << QString("marble.xpm") << true << QByteArray("xpm"); QTest::newRow("PNG: kollada") << QString("kollada.png") << true << QByteArray("png"); + QTest::newRow("PNG: kollada 16bpc") << QString("kollada-16bpc.png") << true << QByteArray("png"); QTest::newRow("PPM: teapot") << QString("teapot.ppm") << true << QByteArray("ppm"); QTest::newRow("PPM: runners") << QString("runners.ppm") << true << QByteArray("ppm"); QTest::newRow("PPM: test") << QString("test.ppm") << true << QByteArray("ppm"); @@ -523,6 +524,12 @@ void tst_QImageReader::imageFormat_data() QTest::newRow("bmp-4") << QString("test32v5.bmp") << QByteArray("bmp") << QImage::Format_RGB32; QTest::newRow("png") << QString("kollada.png") << QByteArray("png") << QImage::Format_ARGB32; QTest::newRow("png-2") << QString("YCbCr_cmyk.png") << QByteArray("png") << QImage::Format_RGB32; + QTest::newRow("png-3") << QString("kollada-16bpc.png") << QByteArray("png") << QImage::Format_RGBA64; + QTest::newRow("png-4") << QString("basn0g16.png") << QByteArray("png") << QImage::Format_RGBX64; // Grayscale16 + QTest::newRow("png-5") << QString("basn2c16.png") << QByteArray("png") << QImage::Format_RGBX64; + QTest::newRow("png-6") << QString("basn4a16.png") << QByteArray("png") << QImage::Format_RGBA64; // Grayscale16Alpha16 + QTest::newRow("png-7") << QString("basn6a16.png") << QByteArray("png") << QImage::Format_RGBA64; + QTest::newRow("png-8") << QString("tbwn0g16.png") << QByteArray("png") << QImage::Format_RGBA64; // Grayscale16+tRNS QTest::newRow("svg") << QString("rect.svg") << QByteArray("svg") << QImage::Format_ARGB32_Premultiplied; QTest::newRow("svgz") << QString("rect.svgz") << QByteArray("svgz") << QImage::Format_ARGB32_Premultiplied; } @@ -1850,6 +1857,8 @@ void tst_QImageReader::saveFormat_data() QTest::newRow("Format_RGB888") << QImage::Format_RGB888; QTest::newRow("Format_RGB444") << QImage::Format_RGB444; QTest::newRow("Format_ARGB4444_Premultiplied") << QImage::Format_ARGB4444_Premultiplied; + QTest::newRow("Format_RGBA64") << QImage::Format_RGBA64; + QTest::newRow("Format_RGBA64_Premultiplied") << QImage::Format_RGBA64_Premultiplied; } void tst_QImageReader::saveFormat() diff --git a/tests/auto/gui/image/qpicture/qpicture.pro b/tests/auto/gui/image/qpicture/qpicture.pro index 0fc851ce11..7f967f33b9 100644 --- a/tests/auto/gui/image/qpicture/qpicture.pro +++ b/tests/auto/gui/image/qpicture/qpicture.pro @@ -1,7 +1,6 @@ CONFIG += testcase TARGET = tst_qpicture QT += testlib -qtHaveModule(widgets): QT += widgets SOURCES += tst_qpicture.cpp diff --git a/tests/auto/gui/image/qpicture/tst_qpicture.cpp b/tests/auto/gui/image/qpicture/tst_qpicture.cpp index 5c812fd1b2..ec6bb8dcee 100644 --- a/tests/auto/gui/image/qpicture/tst_qpicture.cpp +++ b/tests/auto/gui/image/qpicture/tst_qpicture.cpp @@ -33,10 +33,8 @@ #include <qpainter.h> #include <qimage.h> #include <qpaintengine.h> -#ifndef QT_NO_WIDGETS -#include <qdesktopwidget.h> -#include <qapplication.h> -#endif +#include <qguiapplication.h> +#include <qscreen.h> #include <limits.h> class tst_QPicture : public QObject @@ -53,11 +51,7 @@ private slots: void boundingRect(); void swap(); void serialization(); - -#ifndef QT_NO_WIDGETS void save_restore(); -#endif - void boundaryValues_data(); void boundaryValues(); }; @@ -244,30 +238,23 @@ void tst_QPicture::serialization() } } - -#ifndef QT_NO_WIDGETS -static QPointF scalePoint(const QPointF &point, QPaintDevice *sourceDevice, QPaintDevice *destDevice) -{ - return QPointF(point.x() * qreal(destDevice->logicalDpiX()) / qreal(sourceDevice->logicalDpiX()), - point.y() * qreal(destDevice->logicalDpiY()) / qreal(sourceDevice->logicalDpiY())); -} - -static QRectF scaleRect(const QRectF &rect, QPaintDevice *sourceDevice, QPaintDevice *destDevice) +static QRectF scaleRect(const QRectF &rect, qreal xf, qreal yf) { - return QRectF(rect.left() * qreal(destDevice->logicalDpiX()) / qreal(sourceDevice->logicalDpiX()), - rect.top() * qreal(destDevice->logicalDpiY()) / qreal(sourceDevice->logicalDpiY()), - rect.width() * qreal(destDevice->logicalDpiX()) / qreal(sourceDevice->logicalDpiX()), - rect.height() * qreal(destDevice->logicalDpiY()) / qreal(sourceDevice->logicalDpiY())); + return QRectF(rect.left() * xf, rect.top() * yf, rect.width() * xf, rect.height() * yf); } static void paintStuff(QPainter *p) { - QPaintDevice *screenDevice = QApplication::desktop(); - p->drawRect(scaleRect(QRectF(100, 100, 100, 100), screenDevice, p->device())); + const QScreen *screen = QGuiApplication::primaryScreen(); + // Calculate factors from the screen resolution against QPicture's 96DPI + // (enforced by Qt::AA_Use96Dpi as set by QTEST_MAIN). + const qreal xf = qreal(p->device()->logicalDpiX()) / screen->logicalDotsPerInchX(); + const qreal yf = qreal(p->device()->logicalDpiY()) / screen->logicalDotsPerInchY(); + p->drawRect(scaleRect(QRectF(100, 100, 100, 100), xf, yf)); p->save(); - p->translate(scalePoint(QPointF(10, 10), screenDevice, p->device())); + p->translate(10 * xf, 10 * yf); p->restore(); - p->drawRect(scaleRect(QRectF(100, 100, 100, 100), screenDevice, p->device())); + p->drawRect(scaleRect(QRectF(100, 100, 100, 100), xf, yf)); } /* See task: 41469 @@ -298,7 +285,6 @@ void tst_QPicture::save_restore() QVERIFY( pix1.toImage() == pix2.toImage() ); } -#endif void tst_QPicture::boundaryValues_data() { diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp index e3bda6c2df..9a338ad55a 100644 --- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp +++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp @@ -90,6 +90,7 @@ private slots: void mask(); void bitmapMask(); + void bitmapFromImageRvalue(); void setGetMask_data(); void setGetMask(); void cacheKey(); @@ -596,6 +597,27 @@ void tst_QPixmap::bitmapMask() QVERIFY(image.pixel(1, 1)); } +void tst_QPixmap::bitmapFromImageRvalue() +{ + auto makeImage = [](){ + QImage image(3, 3, QImage::Format_MonoLSB); + image.setColor(0, Qt::color0); + image.setColor(1, Qt::color1); + image.fill(Qt::color0); + image.setPixel(1, 1, Qt::color1); + image.setPixel(0, 0, Qt::color1); + return image; + }; + + auto image1 = makeImage(); + auto image2 = makeImage(); + auto bitmap1 = QBitmap::fromImage(image1); + auto bitmap2 = QBitmap::fromImage(std::move(image2)); + QCOMPARE(bitmap1.toImage(), bitmap2.toImage()); + QVERIFY(!image1.isNull()); + QVERIFY(image2.isNull()); +} + void tst_QPixmap::setGetMask_data() { QTest::addColumn<QPixmap>("pixmap"); diff --git a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp index 8a2a35f86c..158530428d 100644 --- a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp +++ b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp @@ -92,6 +92,9 @@ void tst_QPixmapCache::cacheLimit() // it was between 2048 and 10240 last time I looked at it QVERIFY(originalCacheLimit >= 1024 && originalCacheLimit <= 20480); + QPixmapCache::setCacheLimit(std::numeric_limits<int>::max()); + QCOMPARE(QPixmapCache::cacheLimit(), std::numeric_limits<int>::max()); + QPixmapCache::setCacheLimit(100); QCOMPARE(QPixmapCache::cacheLimit(), 100); diff --git a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp index a45539a041..d19aa9b54f 100644 --- a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp +++ b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp @@ -69,8 +69,20 @@ private slots: void sortChildren(); void subclassing(); void lessThan(); + void clearData(); }; +void tst_QStandardItem::clearData() +{ + QStandardItem item; + item.setData(QStringLiteral("Test"), Qt::EditRole); + item.setData(5, Qt::UserRole); + item.clearData(); + QCOMPARE(item.data(Qt::EditRole), QVariant()); + QCOMPARE(item.data(Qt::UserRole), QVariant()); + QCOMPARE(item.data(Qt::DisplayRole), QVariant()); +} + void tst_QStandardItem::ctor() { QStandardItem item; diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp index 9399ebce34..e2d7a41bd1 100644 --- a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp +++ b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp @@ -98,6 +98,7 @@ private slots: void checkChildren(); void data(); void clear(); + void clearItemData(); void sort_data(); void sort(); void sortRole_data(); @@ -749,7 +750,32 @@ void tst_QStandardItemModel::data() QCOMPARE(m_model->data(m_model->index(0, 0), Qt::DisplayRole).toString(), QLatin1String("initialitem")); QCOMPARE(m_model->data(m_model->index(0, 0), Qt::ToolTipRole).toString(), QLatin1String("tooltip")); + const QMap<int, QVariant> itmData = m_model->itemData(m_model->index(0, 0)); + QCOMPARE(itmData.value(Qt::DisplayRole), QLatin1String("initialitem")); + QCOMPARE(itmData.value(Qt::ToolTipRole), QLatin1String("tooltip")); + QVERIFY(!itmData.contains(Qt::UserRole - 1)); + QVERIFY(m_model->itemData(QModelIndex()).isEmpty()); +} +void tst_QStandardItemModel::clearItemData() +{ + currentRoles.clear(); + QVERIFY(!m_model->clearItemData(QModelIndex())); + QCOMPARE(currentRoles, {}); + const QModelIndex idx = m_model->index(0, 0); + const QMap<int, QVariant> oldData = m_model->itemData(idx); + m_model->setData(idx, QLatin1String("initialitem"), Qt::DisplayRole); + m_model->setData(idx, QLatin1String("tooltip"), Qt::ToolTipRole); + m_model->setData(idx, 5, Qt::UserRole); + currentRoles.clear(); + QVERIFY(m_model->clearItemData(idx)); + QCOMPARE(idx.data(Qt::UserRole), QVariant()); + QCOMPARE(idx.data(Qt::ToolTipRole), QVariant()); + QCOMPARE(idx.data(Qt::DisplayRole), QVariant()); + QCOMPARE(idx.data(Qt::EditRole), QVariant()); + QCOMPARE(currentRoles, {}); + m_model->setItemData(idx, oldData); + currentRoles.clear(); } void tst_QStandardItemModel::clear() diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp index fc011d726d..a304981cd1 100644 --- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp +++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp @@ -374,6 +374,9 @@ public: void tst_QGuiApplication::changeFocusWindow() { +#ifdef Q_OS_WINRT + QSKIP("WinRt does not support multiple native windows."); +#endif int argc = 0; QGuiApplication app(argc, 0); @@ -594,6 +597,9 @@ public: void tst_QGuiApplication::modalWindow() { +#ifdef Q_OS_WINRT + QSKIP("WinRt does not support multiple native windows."); +#endif int argc = 0; QGuiApplication app(argc, 0); const QRect screenGeometry = QGuiApplication::primaryScreen()->availableVirtualGeometry(); diff --git a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp index ca6f677ba6..a0ac1b3631 100644 --- a/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp +++ b/tests/auto/gui/kernel/qpalette/tst_qpalette.cpp @@ -67,9 +67,10 @@ void tst_QPalette::roleValues_data() QTest::newRow("QPalette::NoRole") << int(QPalette::NoRole) << 17; QTest::newRow("QPalette::ToolTipBase") << int(QPalette::ToolTipBase) << 18; QTest::newRow("QPalette::ToolTipText") << int(QPalette::ToolTipText) << 19; + QTest::newRow("QPalette::PlaceholderText") << int(QPalette::PlaceholderText) << 20; // Change this value as you add more roles. - QTest::newRow("QPalette::NColorRoles") << int(QPalette::NColorRoles) << 20; + QTest::newRow("QPalette::NColorRoles") << int(QPalette::NColorRoles) << 21; } void tst_QPalette::roleValues() diff --git a/tests/auto/gui/kernel/qwindow/BLACKLIST b/tests/auto/gui/kernel/qwindow/BLACKLIST index df02b5b33e..e9a0d44ba7 100644 --- a/tests/auto/gui/kernel/qwindow/BLACKLIST +++ b/tests/auto/gui/kernel/qwindow/BLACKLIST @@ -1,12 +1,14 @@ [positioning:default] linux osx-10.12 ci +winrt [positioning:fake] osx-10.12 ci [modalWithChildWindow] ubuntu-16.04 # QTBUG-66851 opensuse +opensuse-leap # QTBUG-69160 android [setVisible] diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index 722405377e..7c24bbaadd 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -48,6 +48,12 @@ Q_DECLARE_METATYPE(Qt::ScreenOrientation) Q_DECLARE_METATYPE(QWindow::Visibility) +static bool isPlatformWinRT() +{ + static const bool isWinRT = !QGuiApplication::platformName().compare(QLatin1String("winrt"), Qt::CaseInsensitive); + return isWinRT; +} + class tst_QWindow: public QObject { Q_OBJECT @@ -97,6 +103,7 @@ private slots: void modalWindowPosition(); #ifndef QT_NO_CURSOR void modalWindowEnterEventOnHide_QTBUG35109(); + void spuriousMouseMove(); #endif void windowsTransientChildren(); void requestUpdate(); @@ -234,6 +241,8 @@ void tst_QWindow::setVisible() QVERIFY(h.handle()); i.setParent(&h); QVERIFY2(i.handle(), "Making a visible but not created child window child of a created window should create it"); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "Child windows are unsupported on winrt", Continue); QVERIFY(QTest::qWaitForWindowExposed(&i)); } @@ -398,11 +407,15 @@ void tst_QWindow::resizeEventAfterResize() // Make sure we get a resizeEvent after calling resize window.resize(m_testWindowSize); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "Winrt windows are fullscreen by default.", Continue); QTRY_COMPARE(window.received(QEvent::Resize), 2); } void tst_QWindow::exposeEventOnShrink_QTBUG54040() { + if (isPlatformWinRT()) + QSKIP("", "WinRT does not support non-maximized/non-fullscreen top level windows. QTBUG-54528", Continue); Window window; window.setGeometry(QRect(m_availableTopLeft + QPoint(80, 80), m_testWindowSize)); window.setTitle(QTest::currentTestFunction()); @@ -479,7 +492,7 @@ void tst_QWindow::positioning() } if (isPlatformWayland()) - QSKIP("Wayland: This fails. Figure out why."); + QSKIP("Wayland: This fails. See QTBUG-68660."); // Some platforms enforce minimum widths for windows, which can cause extra resize // events, so set the width to suitably large value to avoid those. @@ -590,6 +603,8 @@ void tst_QWindow::childWindowPositioning() { if (isPlatformWayland()) QSKIP("Wayland: This is flaky (protocol errors for xdg-shell v6). See QTBUG-67648."); + else if (isPlatformWinRT()) + QSKIP("WinRT does not support child windows."); const QPoint topLeftOrigin(0, 0); @@ -787,11 +802,10 @@ void tst_QWindow::isExposed() window.hide(); - if (isPlatformWayland()) - QSKIP("Wayland: This is flaky. Figure out why."); - QCoreApplication::processEvents(); QTRY_VERIFY(window.received(QEvent::Expose) > 1); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT does not destroy the window. Figure out why. QTBUG-68297", Continue); QTRY_VERIFY(!window.isExposed()); } @@ -825,6 +839,8 @@ void tst_QWindow::isActive() child.setGeometry(10, 10, 20, 20); child.show(); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT does not support native child windows.", Abort); QTRY_VERIFY(child.isExposed()); child.requestActivate(); @@ -895,7 +911,7 @@ void tst_QWindow::isActive() QVERIFY(child.isActive()); } -class InputTestWindow : public QWindow +class InputTestWindow : public ColoredWindow { public: void keyPressEvent(QKeyEvent *event) { @@ -989,7 +1005,9 @@ public: enterEventCount = leaveEventCount = 0; } - InputTestWindow() { + explicit InputTestWindow(const QColor &color = Qt::white, QWindow *parent = nullptr) + : ColoredWindow(color, parent) + { keyPressCode = keyReleaseCode = 0; mousePressButton = mouseReleaseButton = mouseMoveButton = 0; ignoreMouse = ignoreTouch = false; @@ -1843,7 +1861,7 @@ void tst_QWindow::mask() void tst_QWindow::initialSize() { if (isPlatformWayland()) - QSKIP("Wayland: This fails. Figure out why."); + QSKIP("Wayland: This fails. See QTBUG-66818."); QSize defaultSize(0,0); { @@ -1857,6 +1875,8 @@ void tst_QWindow::initialSize() Window w; w.setWidth(m_testWindowSize.width()); w.showNormal(); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT shows windows as fullscreen by default.", Continue); QTRY_COMPARE(w.width(), m_testWindowSize.width()); QTRY_VERIFY(w.height() > 0); } @@ -1867,6 +1887,8 @@ void tst_QWindow::initialSize() w.showNormal(); const QSize expectedSize = testSize; + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT shows windows as fullscreen by default.", Continue); QTRY_COMPARE(w.size(), expectedSize); } } @@ -1910,13 +1932,15 @@ void tst_QWindow::modalDialog() return; } + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT only support one native window.", Continue); QTRY_COMPARE(QGuiApplication::focusWindow(), &dialog); } void tst_QWindow::modalDialogClosingOneOfTwoModal() { - if (isPlatformWayland()) - QSKIP("Wayland: This fails. Figure out why."); + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("QWindow::requestActivate() is not supported."); QWindow normalWindow; normalWindow.setFramePosition(m_availableTopLeft + QPoint(80, 80)); @@ -1955,6 +1979,8 @@ void tst_QWindow::modalDialogClosingOneOfTwoModal() return; } + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT only support one native window.", Continue); QTRY_COMPARE(QGuiApplication::focusWindow(), &first_dialog); } @@ -1982,6 +2008,8 @@ void tst_QWindow::modalWithChildWindow() tlw_dialog.show(); QVERIFY(QTest::qWaitForWindowExposed(&tlw_dialog)); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT only support one native window.", Abort); QVERIFY(QTest::qWaitForWindowExposed(&sub_window)); QTRY_COMPARE(QGuiApplication::focusWindow(), &tlw_dialog); @@ -2034,6 +2062,8 @@ void tst_QWindow::modalWindowPosition() window.setModality(Qt::WindowModal); window.show(); QVERIFY(QTest::qWaitForWindowExposed(&window)); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT windows are fullscreen by default.", Continue); QCOMPARE(window.geometry(), origGeo); } @@ -2094,6 +2124,9 @@ void tst_QWindow::modalWindowEnterEventOnHide_QTBUG35109() root.resetCounters(); modal.close(); + if (isPlatformWinRT()) + QEXPECT_FAIL("", "WinRT does not trigger the enter event correctly" + "- QTBUG-68297.", Abort); // Check for the enter event QTRY_COMPARE(root.enterEventCount, 1); } @@ -2213,7 +2246,53 @@ void tst_QWindow::modalWindowEnterEventOnHide_QTBUG35109() QTRY_COMPARE(root.enterEventCount, 1); } } -#endif + +// Verify that no spurious mouse move events are received. On Windows, there is +// no enter event, the OS sends mouse move events instead. Test that the QPA +// plugin properly suppresses those since they can interfere with tests. +// Simulate a main window setup with a modal dialog on top, keep the cursor +// in the center and check that no mouse events are recorded. +void tst_QWindow::spuriousMouseMove() +{ + const QString &platformName = QGuiApplication::platformName(); + if (platformName == QLatin1String("offscreen") || platformName == QLatin1String("cocoa")) + QSKIP("No enter events sent"); + if (isPlatformWayland() || isPlatformWinRT()) + QSKIP("QCursor::setPos() is not supported on this platform"); + const QRect screenGeometry = QGuiApplication::primaryScreen()->geometry(); + const QPoint center = screenGeometry.center(); + QCursor::setPos(center); + QRect windowGeometry(QPoint(), 2 * m_testWindowSize); + windowGeometry.moveCenter(center); + QTRY_COMPARE(QCursor::pos(), center); + InputTestWindow topLevel; + topLevel.setTitle(QTest::currentTestFunction()); + topLevel.setGeometry(windowGeometry); + topLevel.show(); + QVERIFY(QTest::qWaitForWindowExposed(&topLevel)); + QTRY_VERIFY(topLevel.enterEventCount > 0); + InputTestWindow dialog(Qt::yellow); + dialog.setTransientParent(&topLevel); + dialog.setTitle("Dialog " + topLevel.title()); + dialog.setModality(Qt::ApplicationModal); + windowGeometry.setSize(m_testWindowSize); + windowGeometry.moveCenter(center); + dialog.setGeometry(windowGeometry); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + QTRY_VERIFY(dialog.enterEventCount > 0); + dialog.setVisible(false); + QCOMPARE(dialog.mousePressedCount, 0); + QCOMPARE(dialog.mouseReleasedCount, 0); + QCOMPARE(dialog.mouseMovedCount, 0); + QCOMPARE(dialog.mouseDoubleClickedCount, 0); + topLevel.setVisible(false); + QCOMPARE(topLevel.mousePressedCount, 0); + QCOMPARE(topLevel.mouseReleasedCount, 0); + QCOMPARE(topLevel.mouseMovedCount, 0); + QCOMPARE(topLevel.mouseDoubleClickedCount, 0); +} +#endif // !QT_NO_CURSOR static bool isNativeWindowVisible(const QWindow *window) { diff --git a/tests/auto/gui/painting/qbrush/tst_qbrush.cpp b/tests/auto/gui/painting/qbrush/tst_qbrush.cpp index 9098bb0f6e..cd3eaa1478 100644 --- a/tests/auto/gui/painting/qbrush/tst_qbrush.cpp +++ b/tests/auto/gui/painting/qbrush/tst_qbrush.cpp @@ -58,6 +58,7 @@ private slots: void testQGradientCopyConstructor(); void gradientStops(); + void gradientPresets(); void textures(); @@ -326,6 +327,26 @@ void tst_QBrush::gradientStops() QCOMPARE(gradient.stops().at(0).second, QColor()); } +void tst_QBrush::gradientPresets() +{ + QGradient gradient(QGradient::WarmFlame); + QCOMPARE(gradient.type(), QGradient::LinearGradient); + QCOMPARE(gradient.coordinateMode(), QGradient::ObjectMode); + + QLinearGradient *lg = static_cast<QLinearGradient *>(&gradient); + QCOMPARE(lg->start(), QPointF(0, 1)); + QCOMPARE(lg->finalStop(), QPointF(1, 0)); + + QCOMPARE(lg->stops().size(), 3); + QCOMPARE(lg->stops().at(0), QGradientStop(0, QColor(QLatin1Literal("#ff9a9e")))); + QCOMPARE(lg->stops().at(1), QGradientStop(0.99, QColor(QLatin1Literal("#fad0c4")))); + QCOMPARE(lg->stops().at(2), QGradientStop(1, QColor(QLatin1Literal("#fad0c4")))); + + + QGradient invalidPreset(QGradient::Preset(-1)); + QCOMPARE(invalidPreset.type(), QGradient::NoGradient); +} + void fill(QPaintDevice *pd) { QPainter p(pd); diff --git a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp index 67d30d7c9a..ece7a30830 100644 --- a/tests/auto/gui/painting/qcolor/tst_qcolor.cpp +++ b/tests/auto/gui/painting/qcolor/tst_qcolor.cpp @@ -1492,10 +1492,28 @@ void tst_QColor::unpremultiply_sse4() // Tests that qUnpremultiply_sse4 returns the same as qUnpremultiply. #if QT_COMPILER_SUPPORTS_HERE(SSE4_1) if (qCpuHasFeature(SSE4_1)) { + int minorDifferences = 0; + for (uint a = 0; a < 256; a++) { + for (uint c = 0; c <= a; c++) { + const QRgb p = qRgba(c, a-c, c/2, a); + const uint u = qUnpremultiply(p); + const uint usse4 = qUnpremultiply_sse4(p); + if (u != usse4) { + QCOMPARE(qAlpha(u), qAlpha(usse4)); + QVERIFY(qAbs(qRed(u) - qRed(usse4)) <= 1); + QVERIFY(qAbs(qGreen(u) - qGreen(usse4)) <= 1); + QVERIFY(qAbs(qBlue(u) - qBlue(usse4)) <= 1); + ++minorDifferences; + } + } + } + // Allow a few rounding differences as long as it still obeys + // the qPremultiply(qUnpremultiply(x)) == x invariant + QVERIFY(minorDifferences <= 16 * 255); for (uint a = 0; a < 256; a++) { for (uint c = 0; c <= a; c++) { QRgb p = qRgba(c, a-c, c, a); - QCOMPARE(qUnpremultiply(p), qUnpremultiply_sse4(p)); + QCOMPARE(p, qPremultiply(qUnpremultiply_sse4(p))); } } return; diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp index 181c609c6e..877306e8b8 100644 --- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp +++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp @@ -31,9 +31,9 @@ #include <qpainter.h> #ifndef QT_NO_WIDGETS #include <qdrawutil.h> -#include <qapplication.h> #include <qwidget.h> #endif +#include <qguiapplication.h> #include <qfontmetrics.h> #include <qbitmap.h> #include <qimage.h> @@ -41,26 +41,18 @@ #include <limits.h> #include <math.h> #include <qpaintengine.h> -#ifndef QT_NO_WIDGETS -#include <qdesktopwidget.h> -#endif #include <qpixmap.h> #include <qrandom.h> #include <private/qdrawhelper_p.h> #include <qpainter.h> - -#ifndef QT_NO_WIDGETS -#include <qlabel.h> -#endif - #include <qqueue.h> +#include <qscreen.h> #ifndef QT_NO_WIDGETS #include <qgraphicsview.h> #include <qgraphicsscene.h> #include <qgraphicsproxywidget.h> -#include <qlayout.h> #endif #include <qfontdatabase.h> @@ -404,7 +396,7 @@ void tst_QPainter::cleanupTestCase() #ifndef QT_NO_WIDGETS void tst_QPainter::drawPixmap_comp_data() { - if (qApp->desktop()->depth() < 24) + if (QGuiApplication::primaryScreen()->depth() < 24) QSKIP("Test only works on 32 bit displays"); QTest::addColumn<uint>("dest"); @@ -1099,6 +1091,7 @@ void tst_QPainter::fillRect_data() QTest::newRow("argb32pm") << QImage::Format_ARGB32_Premultiplied; QTest::newRow("rgba8888pm") << QImage::Format_RGBA8888_Premultiplied; + QTest::newRow("rgba64pm") << QImage::Format_RGBA64_Premultiplied; } void tst_QPainter::fillRect() @@ -2451,6 +2444,24 @@ void tst_QPainter::setOpacity_data() QTest::newRow("A2RGB30P on RGB30") << QImage::Format_RGB30 << QImage::Format_A2RGB30_Premultiplied; + QTest::newRow("RGBA64P on RGBA64P") << QImage::Format_RGBA64_Premultiplied + << QImage::Format_RGBA64_Premultiplied; + + QTest::newRow("RGBA64 on RGBA64") << QImage::Format_RGBA64 + << QImage::Format_RGBA64; + + QTest::newRow("RGBx64 on RGBx64") << QImage::Format_RGBX64 + << QImage::Format_RGBX64; + + QTest::newRow("RGBA64P on ARGB32P") << QImage::Format_ARGB32_Premultiplied + << QImage::Format_RGBA64_Premultiplied; + + QTest::newRow("RGBx64 on ARGB32P") << QImage::Format_ARGB32_Premultiplied + << QImage::Format_RGBX64; + + QTest::newRow("ARGB32P on RGBA64P") << QImage::Format_RGBA64_Premultiplied + << QImage::Format_ARGB32_Premultiplied; + } void tst_QPainter::setOpacity() @@ -3855,6 +3866,8 @@ void tst_QPainter::gradientPixelFormat_data() QTest::newRow("rgbx8888") << QImage::Format_RGBX8888; QTest::newRow("rgba8888") << QImage::Format_RGBA8888; QTest::newRow("rgba8888_pm") << QImage::Format_RGBA8888_Premultiplied; + QTest::newRow("rgbx64") << QImage::Format_RGBX64; + QTest::newRow("rgba64_pm") << QImage::Format_RGBA64_Premultiplied; } void tst_QPainter::gradientPixelFormat() @@ -4792,7 +4805,19 @@ void tst_QPainter::blendARGBonRGB_data() << QPainter::CompositionMode_SourceIn << qRgba(255, 0, 0, 127) << 255 ; QTest::newRow("ARGB_PM source-in ARGB32") << QImage::Format_ARGB32 << QImage::Format_ARGB32_Premultiplied << QPainter::CompositionMode_SourceIn << qRgba(127, 0, 0, 127) << 255; - // Only ARGB does inverse premultiply, on the rest over and source gives similar results: + QTest::newRow("ARGB over RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 + << QPainter::CompositionMode_SourceOver << qRgba(255, 0, 0, 127) << 127; + QTest::newRow("ARGB_PM over RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied + << QPainter::CompositionMode_SourceOver << qRgba(127, 0, 0, 127) << 127; + QTest::newRow("ARGB source RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 + << QPainter::CompositionMode_Source << qRgba(255, 0, 0, 127) << 255; + QTest::newRow("ARGB_PM source RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied + << QPainter::CompositionMode_Source << qRgba(127, 0, 0, 127) << 255; + QTest::newRow("ARGB source-in RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 + << QPainter::CompositionMode_SourceIn << qRgba(255, 0, 0, 127) << 255; + QTest::newRow("ARGB_PM source-in RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied + << QPainter::CompositionMode_SourceIn << qRgba(127, 0, 0, 127) << 255; + // Only ARGB32 and RGBA8888 does inverse premultiply, on the rest over and source gives similar results: QTest::newRow("ARGB over RGB32") << QImage::Format_RGB32 << QImage::Format_ARGB32 << QPainter::CompositionMode_SourceOver << qRgba(255, 0, 0, 127) << 127; QTest::newRow("ARGB_PM over RGB32") << QImage::Format_RGB32 << QImage::Format_ARGB32_Premultiplied @@ -4829,18 +4854,6 @@ void tst_QPainter::blendARGBonRGB_data() << QPainter::CompositionMode_SourceIn << qRgba(255, 0, 0, 127) << 127; QTest::newRow("ARGB_PM source-in RGBx8888") << QImage::Format_RGBX8888 << QImage::Format_ARGB32_Premultiplied << QPainter::CompositionMode_SourceIn << qRgba(127, 0, 0, 127) << 127; - QTest::newRow("ARGB over RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 - << QPainter::CompositionMode_SourceOver << qRgba(255, 0, 0, 127) << 127; - QTest::newRow("ARGB_PM over RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied - << QPainter::CompositionMode_SourceOver << qRgba(127, 0, 0, 127) << 127; - QTest::newRow("ARGB source RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 - << QPainter::CompositionMode_Source << qRgba(255, 0, 0, 127) << 255; - QTest::newRow("ARGB_PM source RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied - << QPainter::CompositionMode_Source << qRgba(127, 0, 0, 127) << 255; - QTest::newRow("ARGB source-in RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32 - << QPainter::CompositionMode_SourceIn << qRgba(255, 0, 0, 127) << 255; - QTest::newRow("ARGB_PM source-in RGBA8888") << QImage::Format_RGBA8888 << QImage::Format_ARGB32_Premultiplied - << QPainter::CompositionMode_SourceIn << qRgba(127, 0, 0, 127) << 255; QTest::newRow("ARGB over RGB16") << QImage::Format_RGB16 << QImage::Format_ARGB32 << QPainter::CompositionMode_SourceOver << qRgba(255, 0, 0, 127) << 123; QTest::newRow("ARGB_PM over RGB16") << QImage::Format_RGB16 << QImage::Format_ARGB32_Premultiplied diff --git a/tests/auto/gui/qopengl/tst_qopengl.cpp b/tests/auto/gui/qopengl/tst_qopengl.cpp index 5b1af9b6c9..f1360b9efe 100644 --- a/tests/auto/gui/qopengl/tst_qopengl.cpp +++ b/tests/auto/gui/qopengl/tst_qopengl.cpp @@ -82,6 +82,8 @@ private slots: void fboRendering(); void fboRenderingRGB30_data(); void fboRenderingRGB30(); + void fboRenderingRGB64_data(); + void fboRenderingRGB64(); void fboHandleNulledAfterContextDestroyed(); void fboMRT(); void fboMRT_differentFormats(); @@ -614,6 +616,10 @@ void tst_QOpenGL::fboRenderingRGB30_data() #define GL_RGB10_A2 0x8059 #endif +#ifndef GL_RGBA16 +#define GL_RGBA16 0x805B +#endif + #ifndef GL_FRAMEBUFFER_RENDERABLE #define GL_FRAMEBUFFER_RENDERABLE 0x8289 #endif @@ -622,7 +628,7 @@ void tst_QOpenGL::fboRenderingRGB30_data() #define GL_FULL_SUPPORT 0x82B7 #endif -static bool hasRGB10A2(QOpenGLContext *ctx) +static bool supportsInternalFboFormat(QOpenGLContext *ctx, int glFormat) { if (ctx->format().majorVersion() < 3) return false; @@ -631,7 +637,7 @@ static bool hasRGB10A2(QOpenGLContext *ctx) GLint value = -1; QOpenGLFunctions_4_2_Core* vFuncs = ctx->versionFunctions<QOpenGLFunctions_4_2_Core>(); if (vFuncs && vFuncs->initializeOpenGLFunctions()) { - vFuncs->glGetInternalformativ(GL_TEXTURE_2D, GL_RGB10_A2, GL_FRAMEBUFFER_RENDERABLE, 1, &value); + vFuncs->glGetInternalformativ(GL_TEXTURE_2D, glFormat, GL_FRAMEBUFFER_RENDERABLE, 1, &value); if (value != GL_FULL_SUPPORT) return false; } @@ -657,7 +663,7 @@ void tst_QOpenGL::fboRenderingRGB30() if (!QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()) QSKIP("QOpenGLFramebufferObject not supported on this platform"); - if (!hasRGB10A2(&ctx)) + if (!supportsInternalFboFormat(&ctx, GL_RGB10_A2)) QSKIP("An internal RGB30_A2 format is not guaranteed on this platform"); // No multisample with combined depth/stencil attachment: @@ -713,6 +719,71 @@ void tst_QOpenGL::fboRenderingRGB30() QVERIFY(((pixel >> 20) & 0x3f) > 0); } +void tst_QOpenGL::fboRenderingRGB64_data() +{ + common_data(); +} + +void tst_QOpenGL::fboRenderingRGB64() +{ +#if defined(Q_OS_LINUX) && defined(Q_CC_GNU) && !defined(__x86_64__) + QSKIP("QTBUG-22617"); +#endif + + QFETCH(int, surfaceClass); + QScopedPointer<QSurface> surface(createSurface(surfaceClass)); + + QOpenGLContext ctx; + QVERIFY(ctx.create()); + + QVERIFY(ctx.makeCurrent(surface.data())); + + if (!QOpenGLFramebufferObject::hasOpenGLFramebufferObjects()) + QSKIP("QOpenGLFramebufferObject not supported on this platform"); + + if (!supportsInternalFboFormat(&ctx, GL_RGBA16)) + QSKIP("An internal RGBA16 format is not guaranteed on this platform"); + + // No multisample with combined depth/stencil attachment: + QOpenGLFramebufferObjectFormat fboFormat; + fboFormat.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); + fboFormat.setInternalTextureFormat(GL_RGBA16); + + // Uncomplicate things by using POT: + const QSize size(256, 128); + QOpenGLFramebufferObject fbo(size, fboFormat); + + if (fbo.attachment() != QOpenGLFramebufferObject::CombinedDepthStencil) + QSKIP("FBOs missing combined depth~stencil support"); + + QVERIFY(fbo.bind()); + + QPainter fboPainter; + QOpenGLPaintDevice device(fbo.width(), fbo.height()); + bool painterBegun = fboPainter.begin(&device); + QVERIFY(painterBegun); + + qt_opengl_draw_test_pattern(&fboPainter, fbo.width(), fbo.height()); + + fboPainter.end(); + + QImage fb = fbo.toImage(); + QCOMPARE(fb.format(), QImage::Format_RGBA64_Premultiplied); + QCOMPARE(fb.size(), size); + + qt_opengl_check_test_pattern(fb); + + // Check rendering can handle precise 16 bit color values. + fboPainter.begin(&device); + fboPainter.fillRect(QRect(0, 0, 256, 128), QColor::fromRgba64(5, 1002, 8001, 65535)); + fboPainter.end(); + fb = fbo.toImage(); + QRgba64 pixel = ((QRgba64*)fb.bits())[0]; + QCOMPARE(pixel.red(), 5); + QCOMPARE(pixel.green(), 1002); + QCOMPARE(pixel.blue(), 8001); +} + void tst_QOpenGL::fboHandleNulledAfterContextDestroyed() { QWindow window; @@ -844,7 +915,7 @@ void tst_QOpenGL::fboMRT_differentFormats() if (!f->hasOpenGLFeature(QOpenGLFunctions::MultipleRenderTargets)) QSKIP("Multiple render targets not supported on this platform"); - if (!hasRGB10A2(&ctx)) + if (!supportsInternalFboFormat(&ctx, GL_RGB10_A2)) QSKIP("RGB10_A2 not supported on this platform"); // 3 color attachments, same size, different internal format, depth/stencil. diff --git a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp index 79058e5073..da2f100c0b 100644 --- a/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp +++ b/tests/auto/gui/text/qfontdatabase/tst_qfontdatabase.cpp @@ -65,6 +65,7 @@ private slots: void fallbackFonts(); void condensedFontWidth(); + void condensedFontWidthNoFontMerging(); void condensedFontMatching(); void rasterFonts(); @@ -297,6 +298,29 @@ static QString testString() return QStringLiteral("foo bar"); } +void tst_QFontDatabase::condensedFontWidthNoFontMerging() +{ + int regularFontId = QFontDatabase::addApplicationFont(m_testFont); + int condensedFontId = QFontDatabase::addApplicationFont(m_testFontCondensed); + + QVERIFY(!QFontDatabase::applicationFontFamilies(regularFontId).isEmpty()); + QVERIFY(!QFontDatabase::applicationFontFamilies(condensedFontId).isEmpty()); + + QString regularFontName = QFontDatabase::applicationFontFamilies(regularFontId).first(); + QString condensedFontName = QFontDatabase::applicationFontFamilies(condensedFontId).first(); + + QFont condensedFont1(condensedFontName); + if (regularFontName == condensedFontName) + condensedFont1.setStyleName(QStringLiteral("Condensed")); + condensedFont1.setStyleStrategy(QFont::PreferMatch); + + QFont condensedFont2 = condensedFont1; + condensedFont2.setStyleStrategy(QFont::StyleStrategy(QFont::NoFontMerging | QFont::PreferMatch)); + + QCOMPARE(QFontMetricsF(condensedFont2).horizontalAdvance(QStringLiteral("foobar")), + QFontMetricsF(condensedFont1).horizontalAdvance(QStringLiteral("foobar"))); + } + void tst_QFontDatabase::condensedFontWidth() { QFontDatabase db; diff --git a/tests/auto/gui/text/qglyphrun/BLACKLIST b/tests/auto/gui/text/qglyphrun/BLACKLIST new file mode 100644 index 0000000000..57f32c683d --- /dev/null +++ b/tests/auto/gui/text/qglyphrun/BLACKLIST @@ -0,0 +1,3 @@ +[mixedScripts] +ubuntu-18.04 +b2qt diff --git a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp index 21b2697b90..b7f014d0e2 100644 --- a/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp +++ b/tests/auto/gui/text/qglyphrun/tst_qglyphrun.cpp @@ -731,6 +731,9 @@ void tst_QGlyphRun::mixedScripts() layout.endLayout(); QList<QGlyphRun> glyphRuns = layout.glyphRuns(); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Hangul character not rendered on winrt", Continue); +#endif QCOMPARE(glyphRuns.size(), 2); } diff --git a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp index 0089aeb43e..d00dc251d8 100644 --- a/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp +++ b/tests/auto/gui/text/qstatictext/tst_qstatictext.cpp @@ -61,6 +61,8 @@ private slots: void drawToPoint(); void drawToRect_data(); void drawToRect(); + void compareToDrawText_data(); + void compareToDrawText(); void setFont(); void setTextWidth(); void prepareToCorrectData(); @@ -212,6 +214,66 @@ void tst_QStaticText::drawToRect() QCOMPARE(imageDrawStaticText, imageDrawText); } +void tst_QStaticText::compareToDrawText_data() +{ + QTest::addColumn<QFont>("font"); + + QTest::newRow("default") << QFont(); + QFont sansserif; sansserif.setStyleHint(QFont::SansSerif); + QFont serif; serif.setStyleHint(QFont::Serif); + QFont monospace; monospace.setStyleHint(QFont::Monospace); + QTest::newRow("sans-serif") << QFont(sansserif.defaultFamily()); + QTest::newRow("serif") << QFont(serif.defaultFamily()); + QTest::newRow("monospace") << QFont(monospace.defaultFamily()); +} + +void tst_QStaticText::compareToDrawText() +{ + QFETCH(QFont, font); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.setFont(font); + p.drawText(QRectF(11, 12, 30, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticPlainText(1000, 1000); + imageDrawStaticPlainText.fill(Qt::white); + { + QPainter p(&imageDrawStaticPlainText); + p.setFont(font); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextWidth(10), + p.setClipRect(QRectF(11, 12, 30, 500)); + text.setTextFormat(Qt::PlainText); + p.drawStaticText(QPointF(11, 12), text); + } + + QPixmap imageDrawStaticRichText(1000, 1000); + imageDrawStaticRichText.fill(Qt::white); + { + QPainter p(&imageDrawStaticRichText); + p.setFont(font); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextWidth(10), + p.setClipRect(QRectF(11, 12, 30, 500)); + text.setTextFormat(Qt::RichText); + p.drawStaticText(QPointF(11, 12), text); + } + +#if defined(DEBUG_SAVE_IMAGE) + imageDrawText.save("compareToDrawText_imageDrawText.png"); + imageDrawStaticText.save("compareToDrawText_imageDrawStaticPlainText.png"); + imageDrawStaticText.save("compareToDrawText_imageDrawStaticRichText.png"); +#endif + + QVERIFY(imageDrawText.toImage() != m_whiteSquare); + QCOMPARE(imageDrawStaticPlainText, imageDrawText); + QCOMPARE(imageDrawStaticRichText, imageDrawText); +} + void tst_QStaticText::prepareToCorrectData() { QTransform transform; diff --git a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp index ed69802d95..3e354b7523 100644 --- a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp +++ b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp @@ -1692,6 +1692,9 @@ void tst_QTextDocumentFragment::html_bodyBackground() const char html[] = "<body background=\"foo.png\">Foo</body>"; doc->setHtml(html); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on winrt. Investigate - QTBUG-68297", Continue); +#endif QCOMPARE(doc->rootFrame()->frameFormat().background().style(), Qt::TexturePattern); } @@ -1706,6 +1709,9 @@ void tst_QTextDocumentFragment::html_tableCellBackground() QVERIFY(table); QTextTableCell cell = table->cellAt(0, 0); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on winrt. Investigate - QTBUG-68297", Continue); +#endif QCOMPARE(cell.format().background().style(), Qt::TexturePattern); } @@ -1714,6 +1720,9 @@ void tst_QTextDocumentFragment::css_bodyBackground() const char html[] = "<body style=\"background-image:url('foo.png')\">Foo</body>"; doc->setHtml(html); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on winrt. Investigate - QTBUG-68297", Continue); +#endif QCOMPARE(doc->rootFrame()->frameFormat().background().style(), Qt::TexturePattern); } @@ -1728,6 +1737,9 @@ void tst_QTextDocumentFragment::css_tableCellBackground() QVERIFY(table); QTextTableCell cell = table->cellAt(0, 0); +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on winrt. Investigate - QTBUG-68297", Continue); +#endif QCOMPARE(cell.format().background().style(), Qt::TexturePattern); } diff --git a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp index 082d16f62d..c79f787547 100644 --- a/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp +++ b/tests/auto/gui/text/qtextdocumentlayout/tst_qtextdocumentlayout.cpp @@ -299,8 +299,11 @@ void tst_QTextDocumentLayout::imageAtRightAlignedTab() imgFormat.setName(name); cursor.insertImage(imgFormat); - // Everything should fit into the 300 pixels - QCOMPARE(doc->idealWidth(), 300.0); + // Everything should fit into the 300 pixels +#ifdef Q_OS_WINRT + QEXPECT_FAIL("", "Fails on winrt. Figure out why - QTBUG-68297", Continue); +#endif + QCOMPARE(doc->idealWidth(), 300.0); } void tst_QTextDocumentLayout::blockVisibility() diff --git a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp index fb92b5a20f..bbb90ec82a 100644 --- a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp +++ b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp @@ -131,7 +131,7 @@ void tst_QTextOdfWriter::testWriteParagraph_data() QTest::newRow("misc2") << "\t \tFoo" << "<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\"><text:tab/> <text:s text:c=\"4\"/><text:tab/>Foo</text:span></text:p>"; QTest::newRow("linefeed") << (QStringLiteral("line1") + QChar(0x2028) + QStringLiteral("line2")) << - "<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">line1<text:line-break/>line2</text:span></text:p>"; + "<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">line1<text:tab/><text:line-break/>line2</text:span></text:p>"; QTest::newRow("spaces") << "The quick brown fox jumped over the lazy dog" << "<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">The quick brown fox jumped over the lazy dog</text:span></text:p>"; } @@ -378,7 +378,7 @@ void tst_QTextOdfWriter::testWriteTable() odfWriter->writeFrame(*xmlWriter, document->rootFrame()); QString xml = QString::fromLatin1( "<text:p text:style-name=\"p1\"/>" - "<table:table>" + "<table:table table:style-name=\"Table2\">" "<table:table-column table:number-columns-repeated=\"3\"/>" "<table:table-row>" "<table:table-cell table:style-name=\"T3\">" diff --git a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp index 4705fc3ed7..012a7e2ce3 100644 --- a/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp +++ b/tests/auto/gui/util/qdoublevalidator/tst_qdoublevalidator.cpp @@ -155,6 +155,10 @@ void tst_QDoubleValidator::validate_data() QTest::newRow("data48") << "C" << 0.0 << 100.0 << 1 << QString("0.0") << ACC << ACC; QTest::newRow("data49") << "C" << 0.0 << 100.0 << 0 << QString(".") << ITM << ITM; QTest::newRow("data50") << "C" << 0.0 << 100.0 << 1 << QString(".") << ITM << ITM; + QTest::newRow("data51") << "C" << 0.0 << 2.0 << 2 << QString("9.99") << ITM << ITM; + QTest::newRow("data52") << "C" << 100.0 << 200.0 << 4 << QString("999.9999") << ITM << ITM; + QTest::newRow("data53") << "C" << 0.0 << 2.0 << 2 << QString("9.9999") << INV << INV; + QTest::newRow("data54") << "C" << 100.0 << 200.0 << 4 << QString("9999.9999") << ITM << INV; QTest::newRow("data_de0") << "de" << 0.0 << 100.0 << 1 << QString("50,0") << ACC << ACC; QTest::newRow("data_de1") << "de" << 00.0 << 100.0 << 1 << QString("500,0") << ITM << ITM; @@ -206,6 +210,10 @@ void tst_QDoubleValidator::validate_data() QTest::newRow("data_de43") << "de" << 0.01 << 0.09 << 2 << QString("0") << ITM << ITM; QTest::newRow("data_de44") << "de" << 0.0 << 10.0 << 1 << QString("11") << ITM << ITM; QTest::newRow("data_de45") << "de" << 0.0 << 10.0 << 2 << QString("11") << ITM << ITM; + QTest::newRow("data_de46") << "de" << 0.0 << 2.0 << 2 << QString("9,99") << ITM << ITM; + QTest::newRow("data_de47") << "de" << 100.0 << 200.0 << 4 << QString("999,9999") << ITM << ITM; + QTest::newRow("data_de48") << "de" << 0.0 << 2.0 << 2 << QString("9,9999") << INV << INV; + QTest::newRow("data_de49") << "de" << 100.0 << 200.0 << 4 << QString("9999,9999") << ITM << INV; QString arabicNum; arabicNum += QChar(1633); // "18.4" in arabic diff --git a/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp b/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp index 57f55c3121..ec0d63f67c 100644 --- a/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp +++ b/tests/auto/gui/util/qintvalidator/tst_qintvalidator.cpp @@ -54,7 +54,7 @@ void tst_QIntValidator::validate_data() QTest::addColumn<QValidator::State>("state"); QTest::newRow("data0") << 0 << 100 << QString("50") << ACC; - QTest::newRow("data1") << 0 << 100 << QString("500") << INV; + QTest::newRow("data1") << 0 << 100 << QString("500") << INT; QTest::newRow("data1a") << 0 << 100 << QString("5000") << INV; QTest::newRow("data1b") << -100 << 0 << QString("50") << INT; QTest::newRow("data1c") << -100 << 0 << QString("500") << INV; @@ -121,7 +121,7 @@ void tst_QIntValidator::validate_data() QTest::newRow("5.1") << 6 << 8 << QString("5") << INT; QTest::newRow("5.2") << 6 << 8 << QString("7") << ACC; - QTest::newRow("5.3") << 6 << 8 << QString("9") << INV; + QTest::newRow("5.3") << 6 << 8 << QString("9") << INT; QTest::newRow("5.3a") << 6 << 8 << QString("19") << INV; QTest::newRow("5.4") << -8 << -6 << QString("-5") << INT; QTest::newRow("5.5") << -8 << -6 << QString("-7") << ACC; @@ -129,13 +129,13 @@ void tst_QIntValidator::validate_data() QTest::newRow("5.6a") << -8 << -6 << QString("-19") << INV; QTest::newRow("5.7") << -8 << -6 << QString("5") << INT; QTest::newRow("5.8") << -8 << -6 << QString("7") << INT; - QTest::newRow("5.9") << -8 << -6 << QString("9") << INV; + QTest::newRow("5.9") << -8 << -6 << QString("9") << INT; QTest::newRow("5.10") << -6 << 8 << QString("-5") << ACC; QTest::newRow("5.11") << -6 << 8 << QString("5") << ACC; QTest::newRow("5.12") << -6 << 8 << QString("-7") << INV; QTest::newRow("5.13") << -6 << 8 << QString("7") << ACC; QTest::newRow("5.14") << -6 << 8 << QString("-9") << INV; - QTest::newRow("5.15") << -6 << 8 << QString("9") << INV; + QTest::newRow("5.15") << -6 << 8 << QString("9") << INT; QTest::newRow("6.1") << 100 << 102 << QString("11") << INT; QTest::newRow("6.2") << 100 << 102 << QString("-11") << INV; diff --git a/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.pro b/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.pro new file mode 100644 index 0000000000..43951fe722 --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.pro @@ -0,0 +1,5 @@ +CONFIG += testcase +QT += testlib gui-private +SOURCES += tst_qtexturefilereader.cpp +TARGET = tst_qtexturefilereader +RESOURCES += qtexturefilereader.qrc diff --git a/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc b/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc new file mode 100644 index 0000000000..ab882b5db2 --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/qtexturefilereader.qrc @@ -0,0 +1,7 @@ +<RCC> + <qresource prefix="/"> + <file>texturefiles/car.ktx</file> + <file>texturefiles/pattern.pkm</file> + <file>texturefiles/car_mips.ktx</file> + </qresource> +</RCC> diff --git a/tests/auto/gui/util/qtexturefilereader/texturefiles/car.ktx b/tests/auto/gui/util/qtexturefilereader/texturefiles/car.ktx Binary files differnew file mode 100644 index 0000000000..2aefdd306b --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/texturefiles/car.ktx diff --git a/tests/auto/gui/util/qtexturefilereader/texturefiles/car_mips.ktx b/tests/auto/gui/util/qtexturefilereader/texturefiles/car_mips.ktx Binary files differnew file mode 100644 index 0000000000..82822e6c0b --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/texturefiles/car_mips.ktx diff --git a/tests/auto/gui/util/qtexturefilereader/texturefiles/pattern.pkm b/tests/auto/gui/util/qtexturefilereader/texturefiles/pattern.pkm Binary files differnew file mode 100644 index 0000000000..d986e89b2d --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/texturefiles/pattern.pkm diff --git a/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp b/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp new file mode 100644 index 0000000000..9ff4f0ccf2 --- /dev/null +++ b/tests/auto/gui/util/qtexturefilereader/tst_qtexturefilereader.cpp @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2018 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 <private/qtexturefilereader_p.h> +#include <QtTest> + +class tst_qtexturefilereader : public QObject +{ + Q_OBJECT + +private slots: + void checkHandlers_data(); + void checkHandlers(); +}; + +void tst_qtexturefilereader::checkHandlers_data() +{ + QTest::addColumn<QString>("fileName"); + QTest::addColumn<QSize>("size"); + QTest::addColumn<quint32>("glFormat"); + QTest::addColumn<quint32>("glInternalFormat"); + QTest::addColumn<quint32>("glBaseInternalFormat"); + QTest::addColumn<int>("levels"); + QTest::addColumn<QList<int>>("dataOffsets"); + QTest::addColumn<QList<int>>("dataLengths"); + + QTest::addRow("pattern.pkm") << QStringLiteral(":/texturefiles/pattern.pkm") + << QSize(64, 64) + << quint32(0x0) + << quint32(0x8d64) + << quint32(0x0) + << 1 + << (QList<int>() << 16) + << (QList<int>() << 2048); + + QTest::addRow("car.ktx") << QStringLiteral(":/texturefiles/car.ktx") + << QSize(146, 80) + << quint32(0x0) + << quint32(0x9278) + << quint32(0x1908) + << 1 + << (QList<int>() << 68) + << (QList<int>() << 11840); + + QTest::addRow("car_mips.ktx") << QStringLiteral(":/texturefiles/car_mips.ktx") + << QSize(146, 80) + << quint32(0x0) + << quint32(0x9274) + << quint32(0x1907) + << 8 + << (QList<int>() << 68 << 5992 << 7516 << 7880 << 8004 << 8056 << 8068 << 8080) + << (QList<int>() << 5920 << 1520 << 360 << 120 << 48 << 8 << 8 << 8); + +} + +void tst_qtexturefilereader::checkHandlers() +{ + QFETCH(QString, fileName); + QFETCH(QSize, size); + QFETCH(quint32, glFormat); + QFETCH(quint32, glInternalFormat); + QFETCH(int, levels); + QFETCH(QList<int>, dataOffsets); + QFETCH(QList<int>, dataLengths); + + QFile f(fileName); + QVERIFY(f.open(QIODevice::ReadOnly)); + QTextureFileReader r(&f, fileName); + QVERIFY(r.canRead()); + + QTextureFileData tex = r.read(); + QVERIFY(!tex.isNull()); + QVERIFY(tex.isValid()); + QCOMPARE(tex.size(), size); + QCOMPARE(tex.glFormat(), glFormat); + QCOMPARE(tex.glInternalFormat(), glInternalFormat); + QCOMPARE(tex.numLevels(), levels); + for (int i = 0; i < tex.numLevels(); i++) { + QCOMPARE(tex.dataOffset(i), dataOffsets.at(i)); + QCOMPARE(tex.dataLength(i), dataLengths.at(i)); + } +} + +QTEST_MAIN(tst_qtexturefilereader) + +#include "tst_qtexturefilereader.moc" diff --git a/tests/auto/gui/util/util.pro b/tests/auto/gui/util/util.pro index 940e892e5f..2789ffb55d 100644 --- a/tests/auto/gui/util/util.pro +++ b/tests/auto/gui/util/util.pro @@ -10,4 +10,4 @@ SUBDIRS= \ qshadergraphloader \ qshadernodes \ qshadernodesloader \ - + qtexturefilereader |