Stefan Dösinger : gdi32: Test bitmap depths.
Alexandre Julliard
julliard at winehq.org
Wed Dec 12 09:29:17 CST 2007
Module: wine
Branch: master
Commit: d5d8a5be48ce40e8f91a6d1b1d2ea2f5c0d1e0e0
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d5d8a5be48ce40e8f91a6d1b1d2ea2f5c0d1e0e0
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Dec 7 16:42:32 2007 +0100
gdi32: Test bitmap depths.
---
dlls/gdi32/bitmap.c | 13 ++++++++++
dlls/gdi32/tests/bitmap.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
dlls/winex11.drv/bitmap.c | 1 -
3 files changed, 67 insertions(+), 1 deletions(-)
diff --git a/dlls/gdi32/bitmap.c b/dlls/gdi32/bitmap.c
index e882442..3355541 100644
--- a/dlls/gdi32/bitmap.c
+++ b/dlls/gdi32/bitmap.c
@@ -263,6 +263,19 @@ HBITMAP WINAPI CreateBitmapIndirect( const BITMAP *bmp )
return NULL;
}
+ /* Windows only uses 1, 4, 8, 16, 24 and 32 bpp */
+ if(bm.bmBitsPixel == 1) bm.bmBitsPixel = 1;
+ else if(bm.bmBitsPixel <= 4) bm.bmBitsPixel = 4;
+ else if(bm.bmBitsPixel <= 8) bm.bmBitsPixel = 8;
+ else if(bm.bmBitsPixel <= 16) bm.bmBitsPixel = 16;
+ else if(bm.bmBitsPixel <= 24) bm.bmBitsPixel = 24;
+ else if(bm.bmBitsPixel <= 32) bm.bmBitsPixel = 32;
+ else {
+ WARN("Invalid bmBitsPixel %d, returning ERROR_INVALID_PARAMETER\n", bm.bmBitsPixel);
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+
/* Windows ignores the provided bm.bmWidthBytes */
bm.bmWidthBytes = BITMAP_GetWidthBytes( bm.bmWidth, bm.bmBitsPixel );
diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c
index 49dbb4e..7183e31 100644
--- a/dlls/gdi32/tests/bitmap.c
+++ b/dlls/gdi32/tests/bitmap.c
@@ -1557,6 +1557,8 @@ static void test_select_object(void)
HBITMAP hbm, hbm_old;
INT planes, bpp, i;
DWORD depths[] = {8, 15, 16, 24, 32};
+ BITMAP bm;
+ DWORD bytes;
hdc = GetDC(0);
ok(hdc != 0, "GetDC(0) failed\n");
@@ -1617,6 +1619,21 @@ static void test_select_object(void)
}
}
+ memset(&bm, 0xAA, sizeof(bm));
+ bytes = GetObject(hbm, sizeof(bm), &bm);
+ ok(bytes == sizeof(bm), "GetObject returned %d\n", bytes);
+ ok(bm.bmType == 0, "wrong bmType %d\n", bm.bmType);
+ ok(bm.bmWidth == 10, "wrong bmWidth %d\n", bm.bmWidth);
+ ok(bm.bmHeight == 10, "wrong bmHeight %d\n", bm.bmHeight);
+ ok(bm.bmWidthBytes == BITMAP_GetWidthBytes(bm.bmWidth, bm.bmBitsPixel), "wrong bmWidthBytes %d\n", bm.bmWidthBytes);
+ ok(bm.bmPlanes == planes, "wrong bmPlanes %u\n", bm.bmPlanes);
+ if(depths[i] == 15) {
+ ok(bm.bmBitsPixel == 16, "wrong bmBitsPixel %d(15 bpp special)\n", bm.bmBitsPixel);
+ } else {
+ ok(bm.bmBitsPixel == depths[i], "wrong bmBitsPixel %d\n", bm.bmBitsPixel);
+ }
+ ok(!bm.bmBits, "wrong bmBits %p\n", bm.bmBits);
+
DeleteObject(hbm);
}
@@ -1658,6 +1675,7 @@ static void test_CreateBitmap(void)
BITMAP bmp;
HDC screenDC = GetDC(0);
HDC hdc = CreateCompatibleDC(screenDC);
+ UINT i, expect;
/* all of these are the stock monochrome bitmap */
HBITMAP bm = CreateCompatibleBitmap(hdc, 0, 0);
@@ -1716,6 +1734,42 @@ static void test_CreateBitmap(void)
ok(bm != 0, "CreateBitmapIndirect error %u\n", GetLastError());
test_mono_1x1_bmp(bm);
DeleteObject(bm);
+
+ /* Test how the bmBitsPixel field is treated */
+ for(i = 1; i <= 33; i++) {
+ bmp.bmType = 0;
+ bmp.bmWidth = 1;
+ bmp.bmHeight = 1;
+ bmp.bmWidthBytes = 28;
+ bmp.bmPlanes = 1;
+ bmp.bmBitsPixel = i;
+ bmp.bmBits = NULL;
+ bm = CreateBitmapIndirect(&bmp);
+ if(i > 32) {
+ DWORD error = GetLastError();
+ ok(bm == 0, "CreateBitmapIndirect for %d bpp succeeded\n", i);
+ ok(error == ERROR_INVALID_PARAMETER, "Got error %d, expected ERROR_INVALID_PARAMETER\n", error);
+ continue;
+ }
+ ok(bm != 0, "CreateBitmapIndirect error %u\n", GetLastError());
+ GetObject(bm, sizeof(bmp), &bmp);
+ if(i == 1) {
+ expect = 1;
+ } else if(i <= 4) {
+ expect = 4;
+ } else if(i <= 8) {
+ expect = 8;
+ } else if(i <= 16) {
+ expect = 16;
+ } else if(i <= 24) {
+ expect = 24;
+ } else if(i <= 32) {
+ expect = 32;
+ }
+ ok(bmp.bmBitsPixel == expect, "CreateBitmapIndirect for a %d bpp bitmap created a %d bpp bitmap, expected %d\n",
+ i, bmp.bmBitsPixel, expect);
+ DeleteObject(bm);
+ }
}
static void test_bitmapinfoheadersize(void)
diff --git a/dlls/winex11.drv/bitmap.c b/dlls/winex11.drv/bitmap.c
index e1a26d4..98514d3 100644
--- a/dlls/winex11.drv/bitmap.c
+++ b/dlls/winex11.drv/bitmap.c
@@ -126,7 +126,6 @@ BOOL X11DRV_CreateBitmap( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, LPVOID bmBit
(bitmap.bmBitsPixel == screen_depth) ||
(bitmap.bmBitsPixel == 24 && screen_depth == 32) || /* FIXME: Not compatible */
(bitmap.bmBitsPixel == 32 && screen_depth == 24) || /* FIXME: Not compatible */
- (bitmap.bmBitsPixel == 15 && screen_depth == 16) || /* Confirmed by tests */
(bitmap.bmBitsPixel == 16 && screen_depth == 15))) /* TODO: Confirm this */
{
ERR("Trying to make bitmap with planes=%d, bpp=%d\n",
More information about the wine-cvs
mailing list