Module: wine Branch: master Commit: 5333923253819ecf8dbbf7aaeec412c300b8a4ec URL: http://source.winehq.org/git/wine.git/?a=commit;h=5333923253819ecf8dbbf7aaee...
Author: Michael Karcher wine@mkarcher.dialup.fu-berlin.de Date: Sun Jun 8 01:44:10 2008 +0200
gdi32: Respect DIB_PAL_COLORS in every case.
---
dlls/gdi32/dib.c | 33 +++++++++++++++++---------------- dlls/gdi32/tests/bitmap.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index ffd6f31..46be0f0 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -701,7 +701,11 @@ INT WINAPI GetDIBits( } } else { - if(bpp >= bmp->bitmap.bmBitsPixel) { + if (coloruse == DIB_PAL_COLORS) { + for (i = 0; i < (1 << bpp); i++) + ((WORD *)colorPtr)[i] = (WORD)i; + } + else if(bpp >= bmp->bitmap.bmBitsPixel) { /* Generate the color map from the selected palette */ PALETTEENTRY palEntry[256];
@@ -713,22 +717,19 @@ INT WINAPI GetDIBits( return 0; } for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++) { - if (coloruse == DIB_RGB_COLORS) { - if (core_header) - { - rgbTriples[i].rgbtRed = palEntry[i].peRed; - rgbTriples[i].rgbtGreen = palEntry[i].peGreen; - rgbTriples[i].rgbtBlue = palEntry[i].peBlue; - } - else - { - rgbQuads[i].rgbRed = palEntry[i].peRed; - rgbQuads[i].rgbGreen = palEntry[i].peGreen; - rgbQuads[i].rgbBlue = palEntry[i].peBlue; - rgbQuads[i].rgbReserved = 0; - } + if (core_header) + { + rgbTriples[i].rgbtRed = palEntry[i].peRed; + rgbTriples[i].rgbtGreen = palEntry[i].peGreen; + rgbTriples[i].rgbtBlue = palEntry[i].peBlue; + } + else + { + rgbQuads[i].rgbRed = palEntry[i].peRed; + rgbQuads[i].rgbGreen = palEntry[i].peGreen; + rgbQuads[i].rgbBlue = palEntry[i].peBlue; + rgbQuads[i].rgbReserved = 0; } - else ((WORD *)colorPtr)[i] = (WORD)i; } } else { switch (bpp) { diff --git a/dlls/gdi32/tests/bitmap.c b/dlls/gdi32/tests/bitmap.c index 05f57e6..79f6003 100644 --- a/dlls/gdi32/tests/bitmap.c +++ b/dlls/gdi32/tests/bitmap.c @@ -1315,6 +1315,28 @@ static void test_GetDIBits_selected_DDB(BOOL monochrome) } ok(equalContents, "GetDIBits with DDB selected in DC: Got different DIB bits\n");
+ /* Test the palette */ + equalContents = TRUE; + if (info2->bmiHeader.biBitCount <= 8) + { + WORD *colors = (WORD*)info2->bmiColors; + + /* Get the palette indices */ + res = GetDIBits(dc, ddb, 0, 0, NULL, info2, DIB_PAL_COLORS); + ok(res, "GetDIBits failed\n"); + + for (i=0;i < 1 << info->bmiHeader.biSizeImage; i++) + { + if (colors[i] != i) + { + equalContents = FALSE; + break; + } + } + } + + ok(equalContents, "GetDIBits with DDB selected in DC: non 1:1 palette indices\n"); + HeapFree(GetProcessHeap(), 0, bits2); HeapFree(GetProcessHeap(), 0, bits); DeleteDC(dc); @@ -1496,6 +1518,16 @@ todo_wine todo_wine ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n");
+ /* Test the palette indices */ + memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256); + SetLastError(0xdeadbeef); + lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS); + + ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); + ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + for (i = 2; i < 256; i++) + ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[1]); + /* retrieve 24-bit DIB data */ memset(bi, 0, sizeof(*bi)); bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); @@ -1596,6 +1628,16 @@ todo_wine todo_wine ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n");
+ /* Test the palette indices */ + memset(bi->bmiColors, 0xAA, sizeof(RGBQUAD) * 256); + SetLastError(0xdeadbeef); + lines = GetDIBits(hdc, hbmp, 0, 0, NULL, bi, DIB_PAL_COLORS); + + ok(((WORD*)bi->bmiColors)[0] == 0, "Color 0 is %d\n", ((WORD*)bi->bmiColors)[0]); + ok(((WORD*)bi->bmiColors)[1] == 1, "Color 1 is %d\n", ((WORD*)bi->bmiColors)[1]); + for (i = 2; i < 256; i++) + ok(((WORD*)bi->bmiColors)[i] == 0xAAAA, "Color %d is %d\n", i, ((WORD*)bi->bmiColors)[i]); + /* retrieve 24-bit DIB data */ memset(bi, 0, sizeof(*bi)); bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);