[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 9 Jun 2010 02:57:52 +0000 (02:57 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Wed, 9 Jun 2010 02:57:52 +0000 (02:57 +0000)
- 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

subsystems/win32/win32k/eng/surface.c
subsystems/win32/win32k/include/palette.h
subsystems/win32/win32k/main/dllmain.c
subsystems/win32/win32k/objects/palette.c
subsystems/win32/win32k/objects/stockobj.c

index efcb423..76c502f 100644 (file)
@@ -140,45 +140,6 @@ SURFACE_Cleanup(PVOID ObjectBody)
     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
 NTAPI
@@ -190,7 +151,14 @@ SURFACE_AllocSurface(
 {
     PSURFACE psurf;
     SURFOBJ *pso;
-    
+
+    /* Verify format */
+    if (iFormat < BMF_1BPP || iFormat > BMF_PNG)
+    {
+        DPRINT1("Invalid bitmap format: %ld\n", iFormat);
+        return NULL;
+    }
+
     /* Allocate a SURFACE object */
     psurf = (PSURFACE)GDIOBJ_AllocObjWithHandle(GDI_OBJECT_TYPE_BITMAP);
 
@@ -205,7 +173,9 @@ SURFACE_AllocSurface(
         pso->iType = iType;
         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;
index 4f82172..bdef3d9 100644 (file)
@@ -54,8 +54,8 @@ typedef struct _PALETTE
   HDEV  hPDev;
 } 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,
                                        ULONG NumColors,
index 234dedc..76d26c3 100644 (file)
@@ -439,6 +439,9 @@ DriverEntry (
       return STATUS_UNSUCCESSFUL;
   }
 
+  /* Initialize default palettes */
+  PALETTE_Init();
+
   /* Create stock objects, ie. precreated objects commonly
      used by win32 applications */
   CreateStockObjects();
index c489ef0..40cd261 100644 (file)
@@ -14,7 +14,8 @@
 
 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] =
 {
@@ -133,6 +134,19 @@ HPALETTE FASTCALL PALETTE_Init(VOID)
     gpalMono.BaseObject.ulShareCount = 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;
 }
 
index fabc9cf..02b07df 100644 (file)
@@ -190,7 +190,7 @@ CreateStockObjects(void)
     (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_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++)
     {