Rein Klazes : winex11: GetPixel() on a monochrome bitmap should return black or white, not dark red.
Alexandre Julliard
julliard at winehq.org
Wed Apr 29 10:20:21 CDT 2009
Module: wine
Branch: master
Commit: 5265e0f2e5c99d0b218115b5f0cb50fb4bb7aed8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5265e0f2e5c99d0b218115b5f0cb50fb4bb7aed8
Author: Rein Klazes <wijn at online.nl>
Date: Tue Apr 28 14:11:04 2009 +0200
winex11: GetPixel() on a monochrome bitmap should return black or white, not dark red.
---
dlls/gdi32/tests/dc.c | 76 +++++++++++++++++++++++++++++++++++++++++++
dlls/winex11.drv/graphics.c | 7 +++-
2 files changed, 82 insertions(+), 1 deletions(-)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 661246c..1efde38 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -253,10 +253,86 @@ static void test_CreateCompatibleDC(void)
ok(hNewDC == NULL, "CreateCompatibleDC returned %p\n", hNewDC);
}
+static void test_DC_bitmap(void)
+{
+ HDC hdc, hdcmem;
+ DWORD bits[64];
+ HBITMAP hbmp, oldhbmp;
+ COLORREF col;
+ int i, bitspixel;
+
+ /* fill bitmap data with b&w pattern */
+ for( i = 0; i < 64; i++) bits[i] = i & 1 ? 0 : 0xffffff;
+
+ hdc = GetDC(0);
+ ok( hdc != NULL, "CreateDC rets %p\n", hdc);
+ bitspixel = GetDeviceCaps( hdc, BITSPIXEL);
+ /* create a memory dc */
+ hdcmem = CreateCompatibleDC( hdc);
+ ok( hdcmem != NULL, "CreateCompatibleDC rets %p\n", hdcmem);
+ /* tests */
+ /* test monochrome bitmap: should always work */
+ hbmp = CreateBitmap(32, 32, 1, 1, bits);
+ ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
+ oldhbmp = SelectObject( hdcmem, hbmp);
+ ok( oldhbmp != NULL, "SelectObject returned NULL\n" ); /* a memdc always has a bitmap selected */
+ col = GetPixel( hdcmem, 0, 0);
+ ok( col == 0xffffff, "GetPixel returned %08x, expected 00ffffff\n", col);
+ col = GetPixel( hdcmem, 1, 1);
+ ok( col == 0x000000, "GetPixel returned %08x, expected 00000000\n", col);
+ col = GetPixel( hdcmem, 100, 1);
+ ok( col == CLR_INVALID, "GetPixel returned %08x, expected ffffffff\n", col);
+ SelectObject( hdcmem, oldhbmp);
+ DeleteObject( hbmp);
+
+ /* test with 2 bits color depth, not likely to succeed */
+ hbmp = CreateBitmap(16, 16, 1, 2, bits);
+ ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
+ oldhbmp = SelectObject( hdcmem, hbmp);
+ if( bitspixel != 2)
+ ok( !oldhbmp, "SelectObject of a bitmap with 2 bits/pixel should return NULL\n");
+ if( oldhbmp) SelectObject( hdcmem, oldhbmp);
+ DeleteObject( hbmp);
+
+ /* test with 16 bits color depth, might succeed */
+ hbmp = CreateBitmap(6, 6, 1, 16, bits);
+ ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
+ oldhbmp = SelectObject( hdcmem, hbmp);
+ if( bitspixel == 16) {
+ ok( oldhbmp != NULL, "SelectObject returned NULL\n" );
+ col = GetPixel( hdcmem, 0, 0);
+ ok( col == 0xffffff,
+ "GetPixel of a bitmap with 16 bits/pixel returned %08x, expected 00ffffff\n", col);
+ col = GetPixel( hdcmem, 1, 1);
+ ok( col == 0x000000,
+ "GetPixel of a bitmap with 16 bits/pixel returned returned %08x, expected 00000000\n", col);
+ }
+ if( oldhbmp) SelectObject( hdcmem, oldhbmp);
+ DeleteObject( hbmp);
+
+ /* test with 32 bits color depth, probably succeed */
+ hbmp = CreateBitmap(4, 4, 1, 32, bits);
+ ok( hbmp != NULL, "CreateBitmap returns %p\n", hbmp);
+ oldhbmp = SelectObject( hdcmem, hbmp);
+ if( bitspixel == 32) {
+ ok( oldhbmp != NULL, "SelectObject returned NULL\n" );
+ col = GetPixel( hdcmem, 0, 0);
+ ok( col == 0xffffff,
+ "GetPixel of a bitmap with 32 bits/pixel returned %08x, expected 00ffffff\n", col);
+ col = GetPixel( hdcmem, 1, 1);
+ ok( col == 0x000000,
+ "GetPixel of a bitmap with 32 bits/pixel returned returned %08x, expected 00000000\n", col);
+ }
+ if( oldhbmp) SelectObject( hdcmem, oldhbmp);
+ DeleteObject( hbmp);
+ ReleaseDC( 0, hdc );
+}
+
START_TEST(dc)
{
test_savedc();
test_savedc_2();
test_GdiConvertToDevmodeW();
test_CreateCompatibleDC();
+ test_DC_bitmap();
}
diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index a44de11..8d74c77 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -1082,8 +1082,13 @@ X11DRV_GetPixel( X11DRV_PDEVICE *physDev, INT x, INT y )
/* Update the DIBSection from the pixmap */
X11DRV_UnlockDIBSection(physDev, FALSE);
+ if( physDev->depth > 1)
+ pixel = X11DRV_PALETTE_ToLogical(pixel);
+ else
+ /* monochrome bitmaps return black or white */
+ if( pixel) pixel = 0xffffff;
+ return pixel;
- return X11DRV_PALETTE_ToLogical(pixel);
}
More information about the wine-cvs
mailing list