diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-12-08 09:46:49 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-09 08:24:28 +0100 |
commit | 45374d088606cbbb9776d75ecf995b608ff55c17 (patch) | |
tree | 86dc26773b2fa4eebce38e372377d9e6c2da4a82 /tests/auto/gui/image | |
parent | a479e0cfae967f8320acba4773b3b44e18bd08ec (diff) |
QPixmap test: Re-enable tests of Windows bitmap/icon conversion.
- QPixmap::to/fromWinHICON/BITMAP() became free internal
functions (see b8d330904b279de57d70caef70ab2d2a6770f0cc)
- Improve QImage check function similar to
11732d133b6a1e367b43d6a2853b3e297eafbf9f
Change-Id: I80ff066964ce6c339a6b9bfa5a0e10421dca162a
Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
Diffstat (limited to 'tests/auto/gui/image')
-rw-r--r-- | tests/auto/gui/image/qpixmap/tst_qpixmap.cpp | 88 |
1 files changed, 48 insertions, 40 deletions
diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp index 6f14ecef60..c15d1e6976 100644 --- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp +++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp @@ -57,7 +57,7 @@ #include <QSet> -#ifdef Q_WS_WIN +#ifdef Q_OS_WIN #include <windows.h> #endif @@ -117,7 +117,7 @@ private slots: void convertFromImageNoDetach(); void convertFromImageDetach(); -#if defined(Q_WS_WIN) +#if defined(Q_OS_WIN) void toWinHBITMAP_data(); void toWinHBITMAP(); void fromWinHBITMAP_data(); @@ -851,7 +851,15 @@ void tst_QPixmap::convertFromImageDetach() QVERIFY(copy.isDetached()); } -#if defined(Q_WS_WIN) +#if defined(Q_OS_WIN) + +Q_GUI_EXPORT HBITMAP qt_createIconMask(const QBitmap &bitmap); +Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0); +Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0); +Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &p); +Q_GUI_EXPORT QImage qt_imageFromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h); +Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon); + void tst_QPixmap::toWinHBITMAP_data() { QTest::addColumn<int>("red"); @@ -872,7 +880,7 @@ void tst_QPixmap::toWinHBITMAP() QPixmap pm(100, 100); pm.fill(QColor(red, green, blue)); - HBITMAP bitmap = pm.toWinHBITMAP(); + HBITMAP bitmap = qt_pixmapToWinHBITMAP(pm); QVERIFY(bitmap != 0); @@ -927,7 +935,7 @@ void tst_QPixmap::fromWinHBITMAP() #ifdef Q_OS_WINCE //the device context has to be deleted before QPixmap::fromWinHBITMAP() DeleteDC(bitmap_dc); #endif - QPixmap pixmap = QPixmap::fromWinHBITMAP(bitmap); + QPixmap pixmap = qt_pixmapFromWinHBITMAP(bitmap); QCOMPARE(pixmap.width(), 100); QCOMPARE(pixmap.height(), 100); @@ -945,30 +953,39 @@ void tst_QPixmap::fromWinHBITMAP() ReleaseDC(0, display_dc); } -static void compareImages(const QImage &image1, const QImage &image2) +static bool compareImages(const QImage &actualImage, const QImage &expectedImage) { - QCOMPARE(image1.width(), image2.width()); - QCOMPARE(image1.height(), image2.height()); - QCOMPARE(image1.format(), image2.format()); + if (actualImage.width() != expectedImage.width() + || actualImage.height() != expectedImage.height()) { + qWarning("Image size comparison failed: expected: %dx%d, got %dx%d", + expectedImage.size().width(), expectedImage.size().height(), + actualImage.size().width(), actualImage.size().height()); + return false; + } + if (actualImage.format() != expectedImage.format()) { + qWarning("Image format comparison failed: expected: %d, got %d", + expectedImage.format(), actualImage.format()); + return false; + } static const int fuzz = 1; - for (int y = 0; y < image1.height(); y++) - { - for (int x = 0; x < image2.width(); x++) - { - QRgb p1 = image1.pixel(x, y); - QRgb p2 = image2.pixel(x, y); - - bool pixelMatches = - qAbs(qRed(p1) - qRed(p2)) <= fuzz - && qAbs(qGreen(p1) - qGreen(p2)) <= fuzz - && qAbs(qBlue(p1) - qBlue(p2)) <= fuzz - && qAbs(qAlpha(p1) - qAlpha(p2)) <= fuzz; - - QVERIFY(pixelMatches); + for (int y = 0; y < actualImage.height(); ++y) { + for (int x = 0; x < expectedImage.width(); ++x) { + const QRgb p1 = actualImage.pixel(x, y); + const QRgb p2 = expectedImage.pixel(x, y); + + if (qAbs(qRed(p1) - qRed(p2)) > fuzz + || qAbs(qGreen(p1) - qGreen(p2)) > fuzz + || qAbs(qBlue(p1) - qBlue(p2)) > fuzz + || qAbs(qAlpha(p1) - qAlpha(p2)) > fuzz) { + qWarning("Color mismatch at pixel %d,%d: Expected: 0x%x. got 0x%x", + x, y, p2, p1); + return false; + } } } + return true; } void tst_QPixmap::toWinHICON_data() @@ -991,9 +1008,7 @@ void tst_QPixmap::toWinHICON_data() void tst_QPixmap::toWinHICON() { -#ifdef Q_OS_WINCE - QSKIP("Test shall be enabled for Windows CE shortly."); -#endif + enum { Alpha = 2 }; QFETCH(int, width); QFETCH(int, height); @@ -1004,28 +1019,27 @@ void tst_QPixmap::toWinHICON() HDC display_dc = GetDC(0); HDC bitmap_dc = CreateCompatibleDC(display_dc); - HBITMAP bitmap = empty.toWinHBITMAP(QPixmap::Alpha); + HBITMAP bitmap = qt_pixmapToWinHBITMAP(empty, Alpha); SelectObject(bitmap_dc, bitmap); QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height)); imageFromFile = imageFromFile.convertToFormat(QImage::Format_ARGB32_Premultiplied); - HICON icon = QPixmap::fromImage(imageFromFile).toWinHICON(); + HICON icon = qt_pixmapToWinHICON(QPixmap::fromImage(imageFromFile)); DrawIconEx(bitmap_dc, 0, 0, icon, width, height, 0, 0, DI_NORMAL); DestroyIcon(icon); DeleteDC(bitmap_dc); - QImage imageFromHICON = QPixmap::fromWinHBITMAP(bitmap, QPixmap::Alpha).toImage(); + QImage imageFromHICON = qt_pixmapFromWinHBITMAP(bitmap, Alpha).toImage(); ReleaseDC(0, display_dc); // fuzzy comparison must be used, as the pixel values change slightly during conversion // between QImage::Format_ARGB32 and QImage::Format_ARGB32_Premultiplied, or elsewhere - // QVERIFY(imageFromHICON == imageFromFile); - compareImages(imageFromHICON, imageFromFile); + QVERIFY(compareImages(imageFromHICON, imageFromFile)); } void tst_QPixmap::fromWinHICON_data() @@ -1035,16 +1049,12 @@ void tst_QPixmap::fromWinHICON_data() void tst_QPixmap::fromWinHICON() { -#ifdef Q_OS_WINCE - QSKIP("Test shall be enabled for Windows CE shortly."); - -#else QFETCH(int, width); QFETCH(int, height); QFETCH(QString, image); HICON icon = (HICON)LoadImage(0, (wchar_t*)(image + QLatin1String(".ico")).utf16(), IMAGE_ICON, width, height, LR_LOADFROMFILE); - QImage imageFromHICON = QPixmap::fromWinHICON(icon).toImage(); + QImage imageFromHICON = qt_pixmapFromWinHICON(icon).toImage(); DestroyIcon(icon); QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height)); @@ -1053,12 +1063,10 @@ void tst_QPixmap::fromWinHICON() // fuzzy comparison must be used, as the pixel values change slightly during conversion // between QImage::Format_ARGB32 and QImage::Format_ARGB32_Premultiplied, or elsewhere - // QVERIFY(imageFromHICON == imageFromFile); - compareImages(imageFromHICON, imageFromFile); -#endif + QVERIFY(compareImages(imageFromHICON, imageFromFile)); } -#endif // Q_WS_WIN +#endif // Q_OS_WIN void tst_QPixmap::onlyNullPixmapsOutsideGuiThread() { |