ChangeSet ID: 21259 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/14 09:10:23
Modified files: dlls/gdi/tests : bitmap.c dlls/gdi : dib.c
Log message: Peter Beutner p.beutner@gmx.net When creating DIBs with a color depth <= 8, always set biClrUsed field to the number of entries in the color table.
Patch: http://cvs.winehq.org/patch.py?id=21259
Old revision New revision Changes Path 1.8 1.9 +27 -0 wine/dlls/gdi/tests/bitmap.c 1.14 1.15 +4 -0 wine/dlls/gdi/dib.c
Index: wine/dlls/gdi/tests/bitmap.c diff -u -p wine/dlls/gdi/tests/bitmap.c:1.8 wine/dlls/gdi/tests/bitmap.c:1.9 --- wine/dlls/gdi/tests/bitmap.c:1.8 14 Nov 2005 15:10:23 -0000 +++ wine/dlls/gdi/tests/bitmap.c 14 Nov 2005 15:10:23 -0000 @@ -194,6 +194,7 @@ static void test_dibsections(void) WORD *index; DWORD *bits32; HPALETTE hpal, oldpal; + DIBSECTION dibsec; COLORREF c0, c1; int i; int screen_depth; @@ -216,6 +217,9 @@ static void test_dibsections(void)
hdib = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); + ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIBSection\n"); + ok(dibsec.dsBmih.biClrUsed == 2, + "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 2);
/* Test if the old BITMAPCOREINFO structure is supported */
@@ -280,6 +284,19 @@ static void test_dibsections(void) SelectObject(hdcmem, oldbm); DeleteObject(hdib);
+ pbmi->bmiHeader.biBitCount = 4; + for (i = 0; i < 16; i++) { + pbmi->bmiColors[i].rgbRed = i; + pbmi->bmiColors[i].rgbGreen = 16-i; + pbmi->bmiColors[i].rgbBlue = 0; + } + hdib = CreateDIBSection(hdcmem, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); + ok(hdib != NULL, "CreateDIBSection failed\n"); + ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); + ok(dibsec.dsBmih.biClrUsed == 16, + "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 16); + DeleteObject(hdib); + pbmi->bmiHeader.biBitCount = 8;
for (i = 0; i < 128; i++) { @@ -292,6 +309,10 @@ static void test_dibsections(void) } hdib = CreateDIBSection(hdcmem, pbmi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); + ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); + ok(dibsec.dsBmih.biClrUsed == 256, + "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 256); + oldbm = SelectObject(hdcmem, hdib);
for (i = 0; i < 256; i++) { @@ -322,6 +343,9 @@ static void test_dibsections(void) oldpal = SelectPalette(hdc, hpal, TRUE); hdib = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); + ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); + ok(dibsec.dsBmih.biClrUsed == 2, + "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 2);
/* The colour table has already been grabbed from the dc, so we select back the old palette */ @@ -409,6 +433,9 @@ static void test_dibsections(void) oldpal = SelectPalette(hdc, hpal, TRUE); hdib = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, (void**)&bits, NULL, 0); ok(hdib != NULL, "CreateDIBSection failed\n"); + ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n"); + ok(dibsec.dsBmih.biClrUsed == 256, + "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 256);
SelectPalette(hdc, oldpal, TRUE); oldbm = SelectObject(hdcmem, hdib); Index: wine/dlls/gdi/dib.c diff -u -p wine/dlls/gdi/dib.c:1.14 wine/dlls/gdi/dib.c:1.15 --- wine/dlls/gdi/dib.c:1.14 14 Nov 2005 15:10:23 -0000 +++ wine/dlls/gdi/dib.c 14 Nov 2005 15:10:23 -0000 @@ -1180,6 +1180,10 @@ HBITMAP DIB_CreateDIBSection(HDC hdc, co dib->dsBmih.biSize = sizeof(BITMAPINFOHEADER); }
+ /* set number of entries in bmi.bmiColors table */ + if( bpp <= 8 ) + dib->dsBmih.biClrUsed = 1 << bpp; + /* only use sizeImage if it's valid and we're dealing with a compressed bitmap */ if (sizeImage && (compression == BI_RLE4 || compression == BI_RLE8)) dib->dsBmih.biSizeImage = sizeImage;