From 9212e559dc3095d6c2328cf648e613ee1258365e Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Tue, 22 Dec 2009 16:17:44 +0000 Subject: [PATCH] [win32k] - Add support for DIBINDEX, PALETTERGB, PALETTEINDEX macros in SetPixel(V) - Before it did just take every COLORREF as a RGB color, while it could also mean (dib-)palette indices - Fixes several gdi32 bitmap winetests (depending on bit depth between 2 and ~500), 2 palette tests and some palette drawing issues - One problem with palette indices remains in true color bit modes (see bitmap test) svn path=/trunk/; revision=44712 --- .../subsystems/win32/win32k/objects/bitmaps.c | 68 ++++++++++++++++--- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/reactos/subsystems/win32/win32k/objects/bitmaps.c b/reactos/subsystems/win32/win32k/objects/bitmaps.c index 17a55dd7385..6b13392c9a3 100644 --- a/reactos/subsystems/win32/win32k/objects/bitmaps.c +++ b/reactos/subsystems/win32/win32k/objects/bitmaps.c @@ -16,7 +16,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* $Id$ */ #include @@ -656,6 +655,53 @@ NtGdiSetBitmapDimension( return Ret; } +VOID IntHandleSpecialColorType(HDC hDC, COLORREF* Color) +{ + PDC pdc = NULL; + RGBQUAD quad; + PALETTEENTRY palEntry; + UINT index; + + switch (*Color >> 24) + { + case 0x10: /* DIBINDEX */ + if (IntGetDIBColorTable(hDC, LOWORD(*Color), 1, &quad) == 1) + { + *Color = RGB(quad.rgbRed, quad.rgbGreen, quad.rgbBlue); + } + else + { + /* Out of color table bounds - use black */ + *Color = RGB(0, 0, 0); + } + break; + case 0x02: /* PALETTERGB */ + pdc = DC_LockDc(hDC); + index = NtGdiGetNearestPaletteIndex(pdc->dclevel.hpal, *Color); + if (IntGetPaletteEntries(pdc->dclevel.hpal, index, 1, &palEntry) == 1) + { + *Color = RGB(palEntry.peRed, palEntry.peGreen, palEntry.peBlue); + } + else + { + DPRINT1("no wai!\n"); + } + DC_UnlockDc(pdc); + break; + case 0x01: /* PALETTEINDEX */ + pdc = DC_LockDc(hDC); + if (IntGetPaletteEntries(pdc->dclevel.hpal, LOWORD(*Color), 1, &palEntry) == 1) + { + *Color = RGB(palEntry.peRed, palEntry.peGreen, palEntry.peBlue); + } + DC_UnlockDc(pdc); + break; + default: + DPRINT("Unsupported color type %d passed\n", *Color >> 24); + break; + } +} + BOOL APIENTRY GdiSetPixelV( HDC hDC, @@ -663,22 +709,28 @@ GdiSetPixelV( INT Y, COLORREF Color) { - HBRUSH hbrush = NtGdiCreateSolidBrush(Color, NULL); + HBRUSH hBrush; HGDIOBJ OldBrush; - if (hbrush == NULL) - return(FALSE); + if ((Color & 0xFF000000) != 0) + { + IntHandleSpecialColorType(hDC, &Color); + } - OldBrush = NtGdiSelectBrush(hDC, hbrush); + hBrush = NtGdiCreateSolidBrush(Color, NULL); + if (hBrush == NULL) + return FALSE; + + OldBrush = NtGdiSelectBrush(hDC, hBrush); if (OldBrush == NULL) { - GreDeleteObject(hbrush); - return(FALSE); + GreDeleteObject(hBrush); + return FALSE; } NtGdiPatBlt(hDC, X, Y, 1, 1, PATCOPY); NtGdiSelectBrush(hDC, OldBrush); - GreDeleteObject(hbrush); + GreDeleteObject(hBrush); return TRUE; }