Commit 53339232 authored by Michael Karcher's avatar Michael Karcher Committed by Alexandre Julliard

gdi32: Respect DIB_PAL_COLORS in every case.

parent b73b2eca
...@@ -701,7 +701,11 @@ INT WINAPI GetDIBits( ...@@ -701,7 +701,11 @@ INT WINAPI GetDIBits(
} }
} }
else { 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 */ /* Generate the color map from the selected palette */
PALETTEENTRY palEntry[256]; PALETTEENTRY palEntry[256];
...@@ -713,22 +717,19 @@ INT WINAPI GetDIBits( ...@@ -713,22 +717,19 @@ INT WINAPI GetDIBits(
return 0; return 0;
} }
for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++) { for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++) {
if (coloruse == DIB_RGB_COLORS) { if (core_header)
if (core_header) {
{ rgbTriples[i].rgbtRed = palEntry[i].peRed;
rgbTriples[i].rgbtRed = palEntry[i].peRed; rgbTriples[i].rgbtGreen = palEntry[i].peGreen;
rgbTriples[i].rgbtGreen = palEntry[i].peGreen; rgbTriples[i].rgbtBlue = palEntry[i].peBlue;
rgbTriples[i].rgbtBlue = palEntry[i].peBlue; }
} else
else {
{ rgbQuads[i].rgbRed = palEntry[i].peRed;
rgbQuads[i].rgbRed = palEntry[i].peRed; rgbQuads[i].rgbGreen = palEntry[i].peGreen;
rgbQuads[i].rgbGreen = palEntry[i].peGreen; rgbQuads[i].rgbBlue = palEntry[i].peBlue;
rgbQuads[i].rgbBlue = palEntry[i].peBlue; rgbQuads[i].rgbReserved = 0;
rgbQuads[i].rgbReserved = 0;
}
} }
else ((WORD *)colorPtr)[i] = (WORD)i;
} }
} else { } else {
switch (bpp) { switch (bpp) {
......
...@@ -1315,6 +1315,28 @@ static void test_GetDIBits_selected_DDB(BOOL monochrome) ...@@ -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"); 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, bits2);
HeapFree(GetProcessHeap(), 0, bits); HeapFree(GetProcessHeap(), 0, bits);
DeleteDC(dc); DeleteDC(dc);
...@@ -1496,6 +1518,16 @@ todo_wine ...@@ -1496,6 +1518,16 @@ todo_wine
todo_wine todo_wine
ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n"); 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 */ /* retrieve 24-bit DIB data */
memset(bi, 0, sizeof(*bi)); memset(bi, 0, sizeof(*bi));
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
...@@ -1596,6 +1628,16 @@ todo_wine ...@@ -1596,6 +1628,16 @@ todo_wine
todo_wine todo_wine
ok(!memcmp(buf, dib_bits_1, sizeof(dib_bits_1)), "DIB bits don't match\n"); 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 */ /* retrieve 24-bit DIB data */
memset(bi, 0, sizeof(*bi)); memset(bi, 0, sizeof(*bi));
bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment