Huw Davies : gdi32: Don't set the bitfields when the dib section is BI_RGB.

Alexandre Julliard julliard at winehq.org
Tue Apr 12 11:07:38 CDT 2011


Module: wine
Branch: master
Commit: 48f083b39d5ecb861329de9a77043c8075f30494
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=48f083b39d5ecb861329de9a77043c8075f30494

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Apr 12 13:06:34 2011 +0100

gdi32: Don't set the bitfields when the dib section is BI_RGB.

---

 dlls/gdi32/dib.c       |   35 ++++++++++++++++---------------
 dlls/gdi32/tests/dib.c |   52 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index b63eb13..38b95c3 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -1216,8 +1216,9 @@ HBITMAP WINAPI CreateDIBSection(HDC hdc, CONST BITMAPINFO *bmi, UINT usage,
 
     if (!(dib = HeapAlloc( GetProcessHeap(), 0, sizeof(*dib) ))) return 0;
 
-    TRACE("format (%d,%d), planes %d, bpp %d, size %d, %s\n",
-          width, height, planes, bpp, sizeImage, usage == DIB_PAL_COLORS? "PAL" : "RGB");
+    TRACE("format (%d,%d), planes %d, bpp %d, %s, size %d %s\n",
+          width, height, planes, bpp, compression == BI_BITFIELDS? "BI_BITFIELDS" : "BI_RGB",
+          sizeImage, usage == DIB_PAL_COLORS? "PAL" : "RGB");
 
     dib->dsBm.bmType       = 0;
     dib->dsBm.bmWidth      = width;
@@ -1255,24 +1256,24 @@ HBITMAP WINAPI CreateDIBSection(HDC hdc, CONST BITMAPINFO *bmi, UINT usage,
     dib->dsBmih.biSizeImage = dib->dsBm.bmWidthBytes * dib->dsBm.bmHeight;
 
     /* set dsBitfields values */
-    if (usage == DIB_PAL_COLORS || bpp <= 8)
+    dib->dsBitfields[0] = dib->dsBitfields[1] = dib->dsBitfields[2] = 0;
+
+    if((bpp == 15 || bpp == 16) && compression == BI_RGB)
     {
-        dib->dsBitfields[0] = dib->dsBitfields[1] = dib->dsBitfields[2] = 0;
+        /* In this case Windows changes biCompression to BI_BITFIELDS,
+           however for now we won't do this, as there are a lot
+           of places where BI_BITFIELDS is currently unsupported. */
+
+        /* dib->dsBmih.biCompression = compression = BI_BITFIELDS;*/
+        dib->dsBitfields[0] = 0x7c00;
+        dib->dsBitfields[1] = 0x03e0;
+        dib->dsBitfields[2] = 0x001f;
     }
-    else switch( bpp )
+    else if(compression == BI_BITFIELDS)
     {
-    case 15:
-    case 16:
-        dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? *(const DWORD *)bmi->bmiColors       : 0x7c00;
-        dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 1) : 0x03e0;
-        dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 2) : 0x001f;
-        break;
-    case 24:
-    case 32:
-        dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? *(const DWORD *)bmi->bmiColors       : 0xff0000;
-        dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 1) : 0x00ff00;
-        dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 2) : 0x0000ff;
-        break;
+        dib->dsBitfields[0] =  *(const DWORD *)bmi->bmiColors;
+        dib->dsBitfields[1] =  *((const DWORD *)bmi->bmiColors + 1);
+        dib->dsBitfields[2] =  *((const DWORD *)bmi->bmiColors + 2);
     }
 
     /* get storage location for DIB bits */
diff --git a/dlls/gdi32/tests/dib.c b/dlls/gdi32/tests/dib.c
index 784f0dd..d89a6fa 100644
--- a/dlls/gdi32/tests/dib.c
+++ b/dlls/gdi32/tests/dib.c
@@ -204,10 +204,14 @@ static void test_simple_graphics(void)
 {
     char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
     BITMAPINFO *bmi = (BITMAPINFO *)bmibuf;
+    DWORD *bit_fields = (DWORD*)(bmibuf + sizeof(BITMAPINFOHEADER));
     HDC mem_dc;
     BYTE *bits;
     HBITMAP dib, orig_bm;
     const char **sha1;
+    DIBSECTION ds;
+
+    mem_dc = CreateCompatibleDC(NULL);
 
     /* a8r8g8b8 */
     trace("8888\n");
@@ -221,7 +225,12 @@ static void test_simple_graphics(void)
 
     dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
     ok(dib != NULL, "ret NULL\n");
-    mem_dc = CreateCompatibleDC(NULL);
+    ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
+    ok(ds.dsBitfields[0] == 0, "got %08x\n", ds.dsBitfields[0]);
+    ok(ds.dsBitfields[1] == 0, "got %08x\n", ds.dsBitfields[1]);
+    ok(ds.dsBitfields[2] == 0, "got %08x\n", ds.dsBitfields[2]);
+    ok(ds.dsBmih.biCompression == BI_RGB, "got %x\n", ds.dsBmih.biCompression);
+
     orig_bm = SelectObject(mem_dc, dib);
 
     sha1 = sha1_graphics_a8r8g8b8;
@@ -229,6 +238,47 @@ static void test_simple_graphics(void)
 
     SelectObject(mem_dc, orig_bm);
     DeleteObject(dib);
+
+    /* a8r8g8b8 - bitfields.  Should be the same as the regular 32 bit case.*/
+    trace("8888 - bitfields\n");
+    bmi->bmiHeader.biBitCount = 32;
+    bmi->bmiHeader.biCompression = BI_BITFIELDS;
+    bit_fields[0] = 0xff0000;
+    bit_fields[1] = 0x00ff00;
+    bit_fields[2] = 0x0000ff;
+
+    dib = CreateDIBSection(mem_dc, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    ok(dib != NULL, "ret NULL\n");
+    ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
+    ok(ds.dsBitfields[0] == 0xff0000, "got %08x\n", ds.dsBitfields[0]);
+    ok(ds.dsBitfields[1] == 0x00ff00, "got %08x\n", ds.dsBitfields[1]);
+    ok(ds.dsBitfields[2] == 0x0000ff, "got %08x\n", ds.dsBitfields[2]);
+    ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
+
+    orig_bm = SelectObject(mem_dc, dib);
+
+    sha1 = sha1_graphics_a8r8g8b8;
+    draw_graphics(mem_dc, bmi, bits, &sha1);
+
+    SelectObject(mem_dc, orig_bm);
+    DeleteObject(dib);
+
+
+    /* r5g5b5 */
+    bmi->bmiHeader.biBitCount = 16;
+    bmi->bmiHeader.biCompression = BI_RGB;
+
+    dib = CreateDIBSection(0, bmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0);
+    ok(dib != NULL, "ret NULL\n");
+    ok(GetObjectW( dib, sizeof(ds), &ds ), "GetObject failed\n");
+    ok(ds.dsBitfields[0] == 0x7c00, "got %08x\n", ds.dsBitfields[0]);
+    ok(ds.dsBitfields[1] == 0x03e0, "got %08x\n", ds.dsBitfields[1]);
+    ok(ds.dsBitfields[2] == 0x001f, "got %08x\n", ds.dsBitfields[2]);
+todo_wine
+    ok(ds.dsBmih.biCompression == BI_BITFIELDS, "got %x\n", ds.dsBmih.biCompression);
+
+    DeleteObject(dib);
+
     DeleteDC(mem_dc);
 }
 




More information about the wine-cvs mailing list