gdi32: Simplify colour table generation.
diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c
index 38b95c3..07aa609 100644
--- a/dlls/gdi32/dib.c
+++ b/dlls/gdi32/dib.c
@@ -441,26 +441,6 @@
{ 0xff, 0xff, 0xff, 0x00 }
};
-static const RGBTRIPLE EGAColorsTriples[16] = {
-/* rgbBlue, rgbGreen, rgbRed */
- { 0x00, 0x00, 0x00 },
- { 0x00, 0x00, 0x80 },
- { 0x00, 0x80, 0x00 },
- { 0x00, 0x80, 0x80 },
- { 0x80, 0x00, 0x00 },
- { 0x80, 0x00, 0x80 },
- { 0x80, 0x80, 0x00 },
- { 0x80, 0x80, 0x80 },
- { 0xc0, 0xc0, 0xc0 },
- { 0x00, 0x00, 0xff },
- { 0x00, 0xff, 0x00 },
- { 0x00, 0xff, 0xff },
- { 0xff, 0x00, 0x00 } ,
- { 0xff, 0x00, 0xff },
- { 0xff, 0xff, 0x00 },
- { 0xff, 0xff, 0xff }
-};
-
static const RGBQUAD DefLogPaletteQuads[20] = { /* Copy of Default Logical Palette */
/* rgbBlue, rgbGreen, rgbRed, rgbReserved */
{ 0x00, 0x00, 0x00, 0x00 },
@@ -485,31 +465,6 @@
{ 0xff, 0xff, 0xff, 0x00 }
};
-static const RGBTRIPLE DefLogPaletteTriples[20] = { /* Copy of Default Logical Palette */
-/* rgbBlue, rgbGreen, rgbRed */
- { 0x00, 0x00, 0x00 },
- { 0x00, 0x00, 0x80 },
- { 0x00, 0x80, 0x00 },
- { 0x00, 0x80, 0x80 },
- { 0x80, 0x00, 0x00 },
- { 0x80, 0x00, 0x80 },
- { 0x80, 0x80, 0x00 },
- { 0xc0, 0xc0, 0xc0 },
- { 0xc0, 0xdc, 0xc0 },
- { 0xf0, 0xca, 0xa6 },
- { 0xf0, 0xfb, 0xff },
- { 0xa4, 0xa0, 0xa0 },
- { 0x80, 0x80, 0x80 },
- { 0x00, 0x00, 0xf0 },
- { 0x00, 0xff, 0x00 },
- { 0x00, 0xff, 0xff },
- { 0xff, 0x00, 0x00 },
- { 0xff, 0x00, 0xff },
- { 0xff, 0xff, 0x00 },
- { 0xff, 0xff, 0xff}
-};
-
-
/******************************************************************************
* GetDIBits [GDI32.@]
*
@@ -538,8 +493,8 @@
WORD planes, bpp;
DWORD compr, size;
void* colorPtr;
- RGBTRIPLE* rgbTriples;
- RGBQUAD* rgbQuads;
+ RGBQUAD quad_buf[256];
+ RGBQUAD* rgbQuads = quad_buf;
if (!info) return 0;
@@ -563,8 +518,7 @@
}
colorPtr = (LPBYTE) info + (WORD) info->bmiHeader.biSize;
- rgbTriples = colorPtr;
- rgbQuads = colorPtr;
+ if(!core_header) rgbQuads = colorPtr;
/* Transfer color info */
@@ -621,146 +575,104 @@
case 1:
case 4:
case 8:
+ {
+ unsigned int colors = 1 << bpp;
+
if (!core_header) info->bmiHeader.biClrUsed = 0;
- /* If the bitmap object already has a dib section at the
- same color depth then get the color map from it */
- if (bmp->dib && bmp->dib->dsBm.bmBitsPixel == bpp) {
- if(coloruse == DIB_RGB_COLORS) {
- unsigned int colors = min( bmp->nb_colors, 1 << bpp );
+ if (coloruse == DIB_PAL_COLORS)
+ {
+ WORD *index = colorPtr;
+ for (i = 0; i < colors; i++, index++)
+ *index = i;
- if (core_header)
- {
- /* Convert the color table (RGBQUAD to RGBTRIPLE) */
- RGBTRIPLE* index = rgbTriples;
+ break;
+ }
- for (i=0; i < colors; i++, index++)
- {
- index->rgbtRed = bmp->color_table[i].rgbRed;
- index->rgbtGreen = bmp->color_table[i].rgbGreen;
- index->rgbtBlue = bmp->color_table[i].rgbBlue;
- }
- }
- else
- {
- if (colors != 1 << bpp) info->bmiHeader.biClrUsed = colors;
- memcpy(colorPtr, bmp->color_table, colors * sizeof(RGBQUAD));
- }
+ /* If the bitmap object already has a dib section at the
+ same color depth then get the color map from it */
+
+ if (bmp->dib && bmp->dib->dsBm.bmBitsPixel == bpp)
+ {
+ colors = min( colors, bmp->nb_colors );
+
+ if (!core_header && colors != 1 << bpp) info->bmiHeader.biClrUsed = colors;
+
+ memcpy(rgbQuads, bmp->color_table, colors * sizeof(RGBQUAD));
+ }
+
+ /* For color DDBs in native depth (mono DDBs always have a black/white palette):
+ Generate the color map from the selected palette */
+
+ else if (bpp > 1 && bpp == bmp->bitmap.bmBitsPixel)
+ {
+ PALETTEENTRY palEntry[256];
+
+ memset( palEntry, 0, sizeof(palEntry) );
+ if (!GetPaletteEntries( dc->hPalette, 0, colors, palEntry ))
+ {
+ release_dc_ptr( dc );
+ GDI_ReleaseObj( hbitmap );
+ return 0;
}
- else {
- WORD *index = colorPtr;
- for(i = 0; i < 1 << info->bmiHeader.biBitCount; i++, index++)
- *index = i;
+ for (i = 0; i < colors; i++)
+ {
+ rgbQuads[i].rgbRed = palEntry[i].peRed;
+ rgbQuads[i].rgbGreen = palEntry[i].peGreen;
+ rgbQuads[i].rgbBlue = palEntry[i].peBlue;
+ rgbQuads[i].rgbReserved = 0;
}
}
- else {
- if (coloruse == DIB_PAL_COLORS) {
- for (i = 0; i < (1 << bpp); i++)
- ((WORD *)colorPtr)[i] = (WORD)i;
+ else
+ {
+ switch (bpp)
+ {
+ case 1:
+ rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen = rgbQuads[0].rgbBlue = 0;
+ rgbQuads[0].rgbReserved = 0;
+ rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen = rgbQuads[1].rgbBlue = 0xff;
+ rgbQuads[1].rgbReserved = 0;
+ break;
+
+ case 4:
+ memcpy(rgbQuads, EGAColorsQuads, sizeof(EGAColorsQuads));
+ break;
+
+ case 8:
+ {
+ INT r, g, b;
+ RGBQUAD *color;
+
+ memcpy(rgbQuads, DefLogPaletteQuads, 10 * sizeof(RGBQUAD));
+ memcpy(rgbQuads + 246, DefLogPaletteQuads + 10, 10 * sizeof(RGBQUAD));
+ color = rgbQuads + 10;
+ for(r = 0; r <= 5; r++) /* FIXME */
+ for(g = 0; g <= 5; g++)
+ for(b = 0; b <= 5; b++) {
+ color->rgbRed = (r * 0xff) / 5;
+ color->rgbGreen = (g * 0xff) / 5;
+ color->rgbBlue = (b * 0xff) / 5;
+ color->rgbReserved = 0;
+ color++;
+ }
}
- else if(bpp > 1 && bpp == bmp->bitmap.bmBitsPixel) {
- /* For color DDBs in native depth (mono DDBs always have
- a black/white palette):
- Generate the color map from the selected palette */
- PALETTEENTRY palEntry[256];
- memset( palEntry, 0, sizeof(palEntry) );
- if (!GetPaletteEntries( dc->hPalette, 0, 1 << bmp->bitmap.bmBitsPixel, palEntry ))
- {
- release_dc_ptr( dc );
- GDI_ReleaseObj( hbitmap );
- return 0;
- }
- for (i = 0; i < (1 << bmp->bitmap.bmBitsPixel); i++) {
- 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 {
- switch (bpp) {
- case 1:
- if (core_header)
- {
- rgbTriples[0].rgbtRed = rgbTriples[0].rgbtGreen =
- rgbTriples[0].rgbtBlue = 0;
- rgbTriples[1].rgbtRed = rgbTriples[1].rgbtGreen =
- rgbTriples[1].rgbtBlue = 0xff;
- }
- else
- {
- rgbQuads[0].rgbRed = rgbQuads[0].rgbGreen =
- rgbQuads[0].rgbBlue = 0;
- rgbQuads[0].rgbReserved = 0;
- rgbQuads[1].rgbRed = rgbQuads[1].rgbGreen =
- rgbQuads[1].rgbBlue = 0xff;
- rgbQuads[1].rgbReserved = 0;
- }
- break;
-
- case 4:
- if (core_header)
- memcpy(colorPtr, EGAColorsTriples, sizeof(EGAColorsTriples));
- else
- memcpy(colorPtr, EGAColorsQuads, sizeof(EGAColorsQuads));
-
- break;
-
- case 8:
- {
- if (core_header)
- {
- INT r, g, b;
- RGBTRIPLE *color;
-
- memcpy(rgbTriples, DefLogPaletteTriples,
- 10 * sizeof(RGBTRIPLE));
- memcpy(rgbTriples + 246, DefLogPaletteTriples + 10,
- 10 * sizeof(RGBTRIPLE));
- color = rgbTriples + 10;
- for(r = 0; r <= 5; r++) /* FIXME */
- for(g = 0; g <= 5; g++)
- for(b = 0; b <= 5; b++) {
- color->rgbtRed = (r * 0xff) / 5;
- color->rgbtGreen = (g * 0xff) / 5;
- color->rgbtBlue = (b * 0xff) / 5;
- color++;
- }
- }
- else
- {
- INT r, g, b;
- RGBQUAD *color;
-
- memcpy(rgbQuads, DefLogPaletteQuads,
- 10 * sizeof(RGBQUAD));
- memcpy(rgbQuads + 246, DefLogPaletteQuads + 10,
- 10 * sizeof(RGBQUAD));
- color = rgbQuads + 10;
- for(r = 0; r <= 5; r++) /* FIXME */
- for(g = 0; g <= 5; g++)
- for(b = 0; b <= 5; b++) {
- color->rgbRed = (r * 0xff) / 5;
- color->rgbGreen = (g * 0xff) / 5;
- color->rgbBlue = (b * 0xff) / 5;
- color->rgbReserved = 0;
- color++;
- }
- }
- }
- }
}
}
+
+ if(core_header)
+ {
+ RGBTRIPLE *triple = (RGBTRIPLE *)colorPtr;
+ for (i = 0; i < colors; i++)
+ {
+ triple[i].rgbtRed = rgbQuads[i].rgbRed;
+ triple[i].rgbtGreen = rgbQuads[i].rgbGreen;
+ triple[i].rgbtBlue = rgbQuads[i].rgbBlue;
+ }
+ }
+
break;
+ }
case 15:
if (info->bmiHeader.biCompression == BI_BITFIELDS)