diff --git a/reactos/subsys/win32k/include/palette.h b/reactos/subsys/win32k/include/palette.h index 5368f746429..073022a7920 100644 --- a/reactos/subsys/win32k/include/palette.h +++ b/reactos/subsys/win32k/include/palette.h @@ -33,6 +33,8 @@ HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, ULONG Red, ULONG Green, ULONG Blue); +HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, + CONST RGBQUAD *Colors); #define PALETTE_FreePalette(hPalette) GDIOBJ_FreeObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE, GDIOBJFLAG_DEFAULT) #define PALETTE_LockPalette(hPalette) ((PPALGDI)GDIOBJ_LockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)) #define PALETTE_UnlockPalette(hPalette) GDIOBJ_UnlockObj((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE) diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index b535517406f..2a0cea6435b 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -1,5 +1,5 @@ /* - * $Id: dib.c,v 1.51 2004/06/20 00:45:37 navaraf Exp $ + * $Id: dib.c,v 1.52 2004/06/22 20:08:17 gvg Exp $ * * ReactOS W32 Subsystem * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 ReactOS Team @@ -54,9 +54,8 @@ NtGdiSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, CONST RGBQUAD *Col /* Rebuild the palette. */ NtGdiDeleteObject(dc->w.hPalette); - dc->w.hPalette = PALETTE_AllocPalette(PAL_INDEXED, - 1 << BitmapObj->dib->dsBmih.biBitCount, - (PULONG)BitmapObj->ColorMap, 0, 0, 0); + dc->w.hPalette = PALETTE_AllocPaletteIndexedRGB(1 << BitmapObj->dib->dsBmih.biBitCount, + BitmapObj->ColorMap); } else Entries = 0; diff --git a/reactos/subsys/win32k/objects/palette.c b/reactos/subsys/win32k/objects/palette.c index c03b66a4a3f..617eac8a57a 100644 --- a/reactos/subsys/win32k/objects/palette.c +++ b/reactos/subsys/win32k/objects/palette.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: palette.c,v 1.19 2004/06/20 00:45:37 navaraf Exp $ */ +/* $Id: palette.c,v 1.20 2004/06/22 20:08:17 gvg Exp $ */ #include #ifndef NO_MAPPING @@ -98,6 +98,48 @@ PALETTE_AllocPalette(ULONG Mode, return NewPalette; } +HPALETTE FASTCALL +PALETTE_AllocPaletteIndexedRGB(ULONG NumColors, + CONST RGBQUAD *Colors) +{ + HPALETTE NewPalette; + PPALGDI PalGDI; + unsigned i; + + NewPalette = (HPALETTE) GDIOBJ_AllocObj(sizeof(PALGDI), GDI_OBJECT_TYPE_PALETTE, (GDICLEANUPPROC) PALETTE_InternalDelete); + if (NULL == NewPalette) + { + return NULL; + } + + PalGDI = PALETTE_LockPalette(NewPalette); + ASSERT( PalGDI ); + + PalGDI->Self = NewPalette; + PalGDI->Mode = PAL_INDEXED; + + PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool, sizeof(PALETTEENTRY) * NumColors, TAG_PALETTE); + if (NULL == PalGDI->IndexedColors) + { + PALETTE_UnlockPalette(NewPalette); + PALETTE_FreePalette(NewPalette); + return NULL; + } + for (i = 0; i < NumColors; i++) + { + PalGDI->IndexedColors[i].peRed = Colors[i].rgbRed; + PalGDI->IndexedColors[i].peGreen = Colors[i].rgbGreen; + PalGDI->IndexedColors[i].peBlue = Colors[i].rgbBlue; + PalGDI->IndexedColors[i].peFlags = 0; + } + + PalGDI->NumColors = NumColors; + + PALETTE_UnlockPalette(NewPalette); + + return NewPalette; +} + // Create the system palette HPALETTE FASTCALL PALETTE_Init(VOID) {