- Initialize the palettes before creating any bitmaps.
- Replace SURFACE_vSetDefaultPalette with an array of default palettes.
- Check iFormat in SURFACE_AllocSurface

svn path=/branches/reactos-yarotows/; revision=47703
This commit is contained in:
Timo Kreuzer 2010-06-09 02:57:52 +00:00
parent 54e2569bf0
commit 8d819d4de1
5 changed files with 32 additions and 45 deletions

View file

@ -140,45 +140,6 @@ SURFACE_Cleanup(PVOID ObjectBody)
return TRUE; return TRUE;
} }
static
void
SURFACE_vSetDefaultPalette(
PSURFACE psurfBmp)
{
ULONG cBitsPixel = BitsPerFormat(psurfBmp->SurfObj.iBitmapFormat);
/* Find a suitable palette for this bitmap
* Increment internal objects share count
* so we can call PALETTE_ShareUnlockPalette
* or GDIOBJ_IncrementShareCount safely */
switch(cBitsPixel)
{
case 1:
psurfBmp->ppal = &gpalMono;
GDIOBJ_IncrementShareCount(&gpalMono.BaseObject);
break;
case 4:
case 8:
psurfBmp->ppal = PALETTE_ShareLockPalette(StockObjects[DEFAULT_PALETTE]);
break;
case 15:
psurfBmp->ppal = &gpalRGB555;
GDIOBJ_IncrementShareCount(&gpalRGB555.BaseObject);
break;
case 16:
psurfBmp->ppal = &gpalRGB565;
GDIOBJ_IncrementShareCount(&gpalRGB565.BaseObject);
break;
case 24:
case 32:
psurfBmp->ppal = &gpalBGR;
GDIOBJ_IncrementShareCount(&gpalBGR.BaseObject);
break;
default:
DPRINT1("Could not determine palette for bit depth %u.\n", cBitsPixel);
break;
}
}
PSURFACE PSURFACE
NTAPI NTAPI
@ -190,7 +151,14 @@ SURFACE_AllocSurface(
{ {
PSURFACE psurf; PSURFACE psurf;
SURFOBJ *pso; SURFOBJ *pso;
/* Verify format */
if (iFormat < BMF_1BPP || iFormat > BMF_PNG)
{
DPRINT1("Invalid bitmap format: %ld\n", iFormat);
return NULL;
}
/* Allocate a SURFACE object */ /* Allocate a SURFACE object */
psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP); psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP);
@ -205,7 +173,9 @@ SURFACE_AllocSurface(
pso->iType = iType; pso->iType = iType;
pso->iUniq = InterlockedIncrement((PLONG)&giUniqueSurface); pso->iUniq = InterlockedIncrement((PLONG)&giUniqueSurface);
SURFACE_vSetDefaultPalette(psurf); /* Assign a default palette amd increment its reference count */
psurf->ppal = appalSurfaceDefault[iFormat];
GDIOBJ_IncrementShareCount(&psurf->ppal->BaseObject);
} }
return psurf; return psurf;

View file

@ -54,8 +54,8 @@ typedef struct _PALETTE
HDEV hPDev; HDEV hPDev;
} PALETTE, *PPALETTE; } PALETTE, *PPALETTE;
extern PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565; extern PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565, *gppalDefault;
extern PPALETTE appalSurfaceDefault[];
HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode, HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
ULONG NumColors, ULONG NumColors,

View file

@ -439,6 +439,9 @@ DriverEntry (
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
/* Initialize default palettes */
PALETTE_Init();
/* Create stock objects, ie. precreated objects commonly /* Create stock objects, ie. precreated objects commonly
used by win32 applications */ used by win32 applications */
CreateStockObjects(); CreateStockObjects();

View file

@ -14,7 +14,8 @@
static UINT SystemPaletteUse = SYSPAL_NOSTATIC; /* the program need save the pallete and restore it */ static UINT SystemPaletteUse = SYSPAL_NOSTATIC; /* the program need save the pallete and restore it */
PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565; PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565, *gppalDefault;
PPALETTE appalSurfaceDefault[11];
const PALETTEENTRY g_sysPalTemplate[NB_RESERVED_COLORS] = const PALETTEENTRY g_sysPalTemplate[NB_RESERVED_COLORS] =
{ {
@ -133,6 +134,19 @@ HPALETTE FASTCALL PALETTE_Init(VOID)
gpalMono.BaseObject.ulShareCount = 0; gpalMono.BaseObject.ulShareCount = 0;
gpalMono.BaseObject.BaseFlags = 0 ; gpalMono.BaseObject.BaseFlags = 0 ;
/* Initialize default surface palettes */
gppalDefault = PALETTE_ShareLockPalette(hpalette);
appalSurfaceDefault[BMF_1BPP] = &gpalMono;
appalSurfaceDefault[BMF_4BPP] = gppalDefault;
appalSurfaceDefault[BMF_8BPP] = gppalDefault;
appalSurfaceDefault[BMF_16BPP] = &gpalRGB565;
appalSurfaceDefault[BMF_24BPP] = &gpalRGB;
appalSurfaceDefault[BMF_32BPP] = &gpalRGB;
appalSurfaceDefault[BMF_4RLE] = gppalDefault;
appalSurfaceDefault[BMF_8RLE] = gppalDefault;
appalSurfaceDefault[BMF_JPEG] = &gpalRGB;
appalSurfaceDefault[BMF_PNG] = &gpalRGB;
return hpalette; return hpalette;
} }

View file

@ -190,7 +190,7 @@ CreateStockObjects(void)
(void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]); (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]);
(void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]); (void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]);
StockObjects[DEFAULT_PALETTE] = (HGDIOBJ)PALETTE_Init(); StockObjects[DEFAULT_PALETTE] = (HGDIOBJ)gppalDefault->BaseObject.hHmgr;
for (Object = 0; Object < NB_STOCK_OBJECTS; Object++) for (Object = 0; Object < NB_STOCK_OBJECTS; Object++)
{ {