[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 5 May 2012 17:29:34 +0000 (17:29 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sat, 5 May 2012 17:29:34 +0000 (17:29 +0000)
Rename PALETTE_AllocPalette2 to PALETTE_AllocPalette, allocate PALETTE and color array in one allocation, improve code

svn path=/trunk/; revision=56514

reactos/win32ss/gdi/ntgdi/palette.c
reactos/win32ss/gdi/ntgdi/palette.h

index 6f759da..fd23672 100644 (file)
@@ -145,62 +145,81 @@ VOID FASTCALL PALETTE_ValidateFlags(PALETTEENTRY* lpPalE, INT size)
         lpPalE[i].peFlags = PC_SYS_USED | (lpPalE[i].peFlags & 0x07);
 }
 
+
 PPALETTE
 NTAPI
-PALETTE_AllocPalette2(ULONG Mode,
-                     ULONG NumColors,
-                     ULONG *Colors,
-                     ULONG Red,
-                     ULONG Green,
-                     ULONG Blue)
+PALETTE_AllocPalette(
+    _In_ ULONG iMode,
+    _In_ ULONG cColors,
+    _In_ PULONG pulColors,
+    _In_ FLONG flRed,
+    _In_ FLONG flGreen,
+    _In_ FLONG flBlue)
 {
-    PPALETTE PalGDI;
+    PPALETTE ppal;
+    ULONG fl = 0, cjSize = sizeof(PALETTE);
 
-    PalGDI = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE,
-                                             sizeof(PALETTE),
-                                             BASEFLAG_LOOKASIDE);
-    if (!PalGDI)
+    /* Check if the palette has entries */
+    if (iMode == PAL_INDEXED)
     {
-        DPRINT1("Could not allocate a palette.\n");
-        return NULL;
+        /* Check color count */
+        if ((cColors == 0) || (cColors > 1024)) return NULL;
+
+        /* Allocate enough space for the palete entries */
+        cjSize += cColors * sizeof(PALETTEENTRY);
     }
+    else
+    {
+        /* There are no palette entries */
+        cColors = 0;
 
-    PalGDI->flFlags = Mode;
+        /* We can use the lookaside list */
+        fl |= BASEFLAG_LOOKASIDE;
+    }
 
-    if (NumColors > 0)
+    /* Allocate the object (without a handle!) */
+    ppal = (PPALETTE)GDIOBJ_AllocateObject(GDIObjType_PAL_TYPE, cjSize, fl);
+    if (!ppal)
     {
-        PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool,
-                                                      sizeof(PALETTEENTRY) * NumColors,
-                                                      TAG_PALETTE);
-        if (NULL == PalGDI->IndexedColors)
-        {
-            GDIOBJ_vDeleteObject(&PalGDI->BaseObject);
-            return NULL;
-        }
-        if (Colors) RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors);
+        return NULL;
     }
 
-    if (Mode & PAL_INDEXED)
+    /* Set mode, color count and entry pointer */
+    ppal->flFlags = iMode;
+    ppal->NumColors = cColors;
+    ppal->IndexedColors = ppal->apalColors;
+
+    /* Check what kind of palette this is */
+    if (iMode & PAL_INDEXED)
     {
-        PalGDI->NumColors = NumColors;
+        /* Check if we got a color array */
+        if (pulColors)
+        {
+            /* Copy the entries */
+            RtlCopyMemory(ppal->IndexedColors,
+                          pulColors,
+                          cColors * sizeof(ULONG));
+        }
     }
-    else if (Mode & PAL_BITFIELDS)
+    else if (iMode & PAL_BITFIELDS)
     {
-        PalGDI->RedMask = Red;
-        PalGDI->GreenMask = Green;
-        PalGDI->BlueMask = Blue;
-
-        if (Red == 0x7c00 && Green == 0x3E0 && Blue == 0x1F)
-            PalGDI->flFlags |= PAL_RGB16_555;
-        else if (Red == 0xF800 && Green == 0x7E0 && Blue == 0x1F)
-            PalGDI->flFlags |= PAL_RGB16_565;
-        else if (Red == 0xFF0000 && Green == 0xFF00 && Blue == 0xFF)
-            PalGDI->flFlags |= PAL_BGR;
-        else if (Red == 0xFF && Green == 0xFF00 && Blue == 0xFF0000)
-            PalGDI->flFlags |= PAL_RGB;
+        /* Copy the color masks */
+        ppal->RedMask = flRed;
+        ppal->GreenMask = flGreen;
+        ppal->BlueMask = flBlue;
+
+        /* Check what masks we have and set optimization flags */
+        if ((flRed == 0x7c00) && (flGreen == 0x3E0) && (flBlue == 0x1F))
+            ppal->flFlags |= PAL_RGB16_555;
+        else if ((flRed == 0xF800) && (flGreen == 0x7E0) && (flBlue == 0x1F))
+            ppal->flFlags |= PAL_RGB16_565;
+        else if ((flRed == 0xFF0000) && (flGreen == 0xFF00) && (flBlue == 0xFF))
+            ppal->flFlags |= PAL_BGR;
+        else if ((flRed == 0xFF) && (flGreen == 0xFF00) && (flBlue == 0xFF0000))
+            ppal->flFlags |= PAL_RGB;
     }
 
-    return PalGDI;
+    return ppal;
 }
 
 PPALETTE
@@ -216,7 +235,7 @@ PALETTE_AllocPalWithHandle(
     PPALETTE ppal;
 
     /* Allocate the palette without a handle */
-    ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue);
+    ppal = PALETTE_AllocPalette(iMode, cColors, pulColors, flRed, flGreen, flBlue);
     if (!ppal) return NULL;
 
     /* Insert the palette into the handle table */
@@ -384,7 +403,7 @@ EngCreatePalette(
     PPALETTE ppal;
     HPALETTE hpal;
 
-    ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue);
+    ppal = PALETTE_AllocPalette(iMode, cColors, pulColors, flRed, flGreen, flBlue);
     if (!ppal) return NULL;
 
     hpal = GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_PUBLIC);
index 31240dc..1c2cedf 100644 (file)
@@ -59,7 +59,7 @@ InitPaletteImpl(VOID);
 
 PPALETTE
 NTAPI
-PALETTE_AllocPalette2(
+PALETTE_AllocPalette(
     _In_ ULONG iMode,
     _In_ ULONG cColors,
     _In_ PULONG pulColors,
@@ -146,13 +146,3 @@ GreCreatePaletteInternal(
     IN LPLOGPALETTE pLogPal,
     IN UINT cEntries);
 
-////
-
-HPALETTE
-FASTCALL
-PALETTE_AllocPalette(ULONG Mode,
-                     ULONG NumColors,
-                     ULONG *Colors,
-                     ULONG Red,
-                     ULONG Green,
-                     ULONG Blue);