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