diff options
Diffstat (limited to 'tests/auto/qpixmap/tst_qpixmap.cpp')
-rw-r--r-- | tests/auto/qpixmap/tst_qpixmap.cpp | 302 |
1 files changed, 0 insertions, 302 deletions
diff --git a/tests/auto/qpixmap/tst_qpixmap.cpp b/tests/auto/qpixmap/tst_qpixmap.cpp deleted file mode 100644 index e16889d..0000000 --- a/tests/auto/qpixmap/tst_qpixmap.cpp +++ /dev/null @@ -1,302 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 <QtTest/QtTest> -#include <QtCore/qt_windows.h> -#include <QtCore/QFileInfo> -#include <QtGui/QPainter> -#include <QtGui/QPixmap> -#include <QtGui/QImage> -#include <QtWinExtras/QtWin> - -class tst_QPixmap : public QObject -{ - Q_OBJECT - -public: - tst_QPixmap() : m_dataDirectory(QFINDTESTDATA("data")) {} - -private slots: - void initTestCase(); - - void toHBITMAP_data(); - void toHBITMAP(); - void fromHBITMAP_data(); - void fromHBITMAP(); - - void toHICON_data(); - void toHICON(); - void fromHICON_data(); - void fromHICON(); - - void imageConversion(); - -private: - const QString m_dataDirectory; -}; - -void tst_QPixmap::initTestCase() -{ - QVERIFY(!m_dataDirectory.isEmpty()); -} - -void tst_QPixmap::toHBITMAP_data() -{ - QTest::addColumn<int>("red"); - QTest::addColumn<int>("green"); - QTest::addColumn<int>("blue"); - - QTest::newRow("red") << 255 << 0 << 0; - QTest::newRow("green") << 0 << 255 << 0; - QTest::newRow("blue") << 0 << 0 << 255; -} - -void tst_QPixmap::toHBITMAP() -{ - QFETCH(int, red); - QFETCH(int, green); - QFETCH(int, blue); - - QPixmap pm(100, 100); - pm.fill(QColor(red, green, blue)); - - const HBITMAP bitmap = QtWin::toHBITMAP(pm); - - QVERIFY(bitmap != nullptr); - - // Verify size - BITMAP bitmapInfo; - memset(&bitmapInfo, 0, sizeof(BITMAP)); - - QVERIFY(GetObject(bitmap, sizeof(BITMAP), &bitmapInfo)); - - QCOMPARE(LONG(100), bitmapInfo.bmWidth); - QCOMPARE(LONG(100), bitmapInfo.bmHeight); - - const HDC displayDc = GetDC(nullptr); - const HDC bitmapDc = CreateCompatibleDC(displayDc); - - const auto nullBitmap = static_cast<HBITMAP>(SelectObject(bitmapDc, bitmap)); - - const COLORREF pixel = GetPixel(bitmapDc, 0, 0); - QCOMPARE(int(GetRValue(pixel)), red); - QCOMPARE(int(GetGValue(pixel)), green); - QCOMPARE(int(GetBValue(pixel)), blue); - - // Clean up - SelectObject(bitmapDc, nullBitmap); - DeleteObject(bitmap); - DeleteDC(bitmapDc); - ReleaseDC(nullptr, displayDc); -} - -void tst_QPixmap::fromHBITMAP_data() -{ - toHBITMAP_data(); -} - -void tst_QPixmap::fromHBITMAP() -{ - QFETCH(int, red); - QFETCH(int, green); - QFETCH(int, blue); - - const HDC displayDc = GetDC(nullptr); - const HDC bitmapDc = CreateCompatibleDC(displayDc); - const HBITMAP bitmap = CreateCompatibleBitmap(displayDc, 100, 100); - SelectObject(bitmapDc, bitmap); - - SelectObject(bitmapDc, GetStockObject(NULL_PEN)); - const HGDIOBJ oldBrush = SelectObject(bitmapDc, CreateSolidBrush(RGB(red, green, blue))); - Rectangle(bitmapDc, 0, 0, 100, 100); - - const QPixmap pixmap = QtWin::fromHBITMAP(bitmap); - QCOMPARE(pixmap.width(), 100); - QCOMPARE(pixmap.height(), 100); - - const QImage image = pixmap.toImage(); - const QRgb pixel = image.pixel(0, 0); - QCOMPARE(qRed(pixel), red); - QCOMPARE(qGreen(pixel), green); - QCOMPARE(qBlue(pixel), blue); - - DeleteObject(SelectObject(bitmapDc, oldBrush)); - DeleteObject(SelectObject(bitmapDc, bitmap)); - DeleteDC(bitmapDc); - ReleaseDC(nullptr, displayDc); -} - -static bool compareImages(const QImage &actual, const QImage &expected, - QByteArray *errorMessage) -{ - if (actual.size() != expected.size()) { - QString s; - QDebug(&s) << "Size mismatch, actual: " << actual.size() << " expected: " << expected.size(); - *errorMessage = s.toLocal8Bit(); - return false; - } - if (actual.format() != expected.format()) { - *errorMessage = QByteArrayLiteral("Format mismatch, actual: ") - + QByteArray::number(actual.format()) - + QByteArrayLiteral(", expected: ") + QByteArray::number(expected.format()); - return false; - } - - static const int fuzz = 1; - - for (int y = 0; y < actual.height(); ++y) { - for (int x = 0; x < expected.width(); ++x) { - const QRgb actualRgb = actual.pixel(x, y); - const QRgb expectedRgb = expected.pixel(x, y); - const bool pixelMatches = - qAbs(qRed(actualRgb) - qRed(expectedRgb)) <= fuzz - && qAbs(qGreen(actualRgb) - qGreen(expectedRgb)) <= fuzz - && qAbs(qBlue(actualRgb) - qBlue(expectedRgb)) <= fuzz - && qAbs(qAlpha(actualRgb) - qAlpha(expectedRgb)) <= fuzz; - if (!pixelMatches) { - QString s; - QDebug(&s) << "Pixmal mismatch at " << x << ',' << y << " actual: " - << QColor(actualRgb) << " expected: " << QColor(expectedRgb); - *errorMessage = s.toLocal8Bit(); - return false; - } - } - } - return true; -} - -static inline QString pngFileName(const QString &image, int width, int height) -{ - return image + u'_' + QString::number(width) - + u'x' + QString::number(height) + QStringLiteral(".png"); -} - -void tst_QPixmap::toHICON_data() -{ - QTest::addColumn<QString>("image"); - QTest::addColumn<int>("width"); - QTest::addColumn<int>("height"); - - QTest::newRow("32bpp_16x16") << m_dataDirectory + QStringLiteral("/icon_32bpp") << 16 << 16; - QTest::newRow("32bpp_32x32") << m_dataDirectory + QStringLiteral("/icon_32bpp") << 32 << 32; - QTest::newRow("32bpp_48x48") << m_dataDirectory + QStringLiteral("/icon_32bpp") << 48 << 48; - QTest::newRow("32bpp_256x256") << m_dataDirectory + QStringLiteral("/icon_32bpp") << 256 << 256; - - QTest::newRow("8bpp_16x16") << m_dataDirectory + QStringLiteral("/icon_8bpp") << 16 << 16; - QTest::newRow("8bpp_32x32") << m_dataDirectory + QStringLiteral("/icon_8bpp") << 32 << 32; - QTest::newRow("8bpp_48x48") << m_dataDirectory + QStringLiteral("/icon_8bpp") << 48 << 48; -} - -void tst_QPixmap::toHICON() -{ - QFETCH(int, width); - QFETCH(int, height); - QFETCH(QString, image); - - QPixmap empty(width, height); - empty.fill(Qt::transparent); - - const HDC displayDc = GetDC(nullptr); - const HDC bitmapDc = CreateCompatibleDC(displayDc); - const HBITMAP bitmap = QtWin::toHBITMAP(empty, QtWin::HBitmapAlpha); - SelectObject(bitmapDc, bitmap); - - const QString imageFileName = pngFileName(image, width, height); - QVERIFY2(QFileInfo::exists(imageFileName), qPrintable(imageFileName)); - - const QImage imageFromFile = QImage(imageFileName).convertToFormat(QImage::Format_ARGB32_Premultiplied); - QVERIFY(!imageFromFile.isNull()); - - const HICON icon = QtWin::toHICON(QPixmap::fromImage(imageFromFile)); - - DrawIconEx(bitmapDc, 0, 0, icon, width, height, 0, nullptr, DI_NORMAL); - - DestroyIcon(icon); - DeleteDC(bitmapDc); - - const QImage imageFromHICON = QtWin::fromHBITMAP(bitmap, QtWin::HBitmapAlpha).toImage(); - QVERIFY(!imageFromHICON.isNull()); - - ReleaseDC(nullptr, displayDc); - - // fuzzy comparison must be used, as the pixel values change slightly during conversion - // between QImage::Format_ARGB32 and QImage::Format_ARGB32_Premultiplied, or elsewhere - QByteArray errorMessage; - QVERIFY2(compareImages(imageFromHICON, imageFromFile, &errorMessage), errorMessage.constData()); -} - -void tst_QPixmap::fromHICON_data() -{ - toHICON_data(); -} - -void tst_QPixmap::fromHICON() -{ - QFETCH(int, width); - QFETCH(int, height); - QFETCH(QString, image); - - const QString iconFileName = image + QStringLiteral(".ico"); - QVERIFY2(QFileInfo::exists(iconFileName), qPrintable(iconFileName)); - - const auto icon = - static_cast<HICON>(LoadImage(nullptr, reinterpret_cast<const wchar_t *>(iconFileName.utf16()), - IMAGE_ICON, width, height, LR_LOADFROMFILE)); - const QImage imageFromHICON = QtWin::fromHICON(icon).toImage(); - DestroyIcon(icon); - - const QString imageFileName = pngFileName(image, width, height); - QVERIFY2(QFileInfo::exists(imageFileName), qPrintable(imageFileName)); - - const QImage imageFromFile = QImage(imageFileName).convertToFormat(QImage::Format_ARGB32_Premultiplied); - QVERIFY(!imageFromFile.isNull()); - - // fuzzy comparison must be used, as the pixel values change slightly during conversion - // between QImage::Format_ARGB32 and QImage::Format_ARGB32_Premultiplied, or elsewhere - QByteArray errorMessage; - QVERIFY2(compareImages(imageFromHICON, imageFromFile, &errorMessage), errorMessage.constData()); -} - -void tst_QPixmap::imageConversion() -{ - // Extensive testing of all formats is done in QtGui; this merely tests - // the exports/linkage. - QImage image(73, 57, QImage::Format_ARGB32_Premultiplied); - image.fill(Qt::red); - QPainter painter(&image); - painter.drawLine(0, 0, image.width(), image.height()); - const HBITMAP hBitMap = QtWin::imageToHBITMAP(image); - QVERIFY(hBitMap); - const QImage fromHBitMap = QtWin::imageFromHBITMAP(hBitMap, QtWin::HBitmapPremultipliedAlpha); - QCOMPARE(fromHBitMap, image); - DeleteObject(hBitMap); -} - -QTEST_MAIN(tst_QPixmap) - -#include "tst_qpixmap.moc" |