ROS_DC_INFO rosdc;
} DC;
+extern PDC defaultDCstate;
+
/* Internal functions *********************************************************/
-extern PDC defaultDCstate;
+/* dcobjs.c */
+
+VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
+VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
+
+HPALETTE
+NTAPI
+GdiSelectPalette(
+ HDC hDC,
+ HPALETTE hpal,
+ BOOL ForceBackground);
+
+
INIT_FUNCTION NTSTATUS NTAPI InitDcImpl(VOID);
PPDEVOBJ FASTCALL IntEnumHDev(VOID);
BOOL FASTCALL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest);
VOID FASTCALL DC_vUpdateViewportExt(PDC pdc);
VOID FASTCALL DC_vCopyState(PDC pdcSrc, PDC pdcDst, BOOL to);
-VOID FASTCALL DC_vUpdateFillBrush(PDC pdc);
-VOID FASTCALL DC_vUpdateLineBrush(PDC pdc);
-VOID FASTCALL DC_vUpdateTextBrush(PDC pdc);
-VOID FASTCALL DC_vUpdateBackgroundBrush(PDC pdc);
VOID FASTCALL DC_vFinishBlit(PDC pdc1, PDC pdc2);
VOID FASTCALL DC_vPrepareDCsForBlit(PDC pdc1, RECT rc1, PDC pdc2, RECT rc2);
BOOL FASTCALL IntSetDefaultRegion(PDC);
BOOL NTAPI GreSetDCOwner(HDC hdc, ULONG ulOwner);
+
FORCEINLINE
PDC
DC_LockDc(HDC hdc)
palPtr->palPalEntry[i].peFlags = 0;
}
- hpalette = NtGdiCreatePaletteInternal(palPtr,NB_RESERVED_COLORS);
+ hpalette = GreCreatePaletteInternal(palPtr,NB_RESERVED_COLORS);
+ ASSERT(hpalette);
ExFreePoolWithTag(palPtr, TAG_PALETTE);
/* palette_size = visual->map_entries; */
return NULL;
}
- PalGDI->Self = PalGDI->BaseObject.hHmgr;
PalGDI->flFlags = Mode;
- if (NULL != Colors)
+ if (NumColors > 0)
{
PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool,
sizeof(PALETTEENTRY) * NumColors,
GDIOBJ_vDeleteObject(&PalGDI->BaseObject);
return NULL;
}
- RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors);
+ if (Colors) RtlCopyMemory(PalGDI->IndexedColors, Colors, sizeof(PALETTEENTRY) * NumColors);
}
if (Mode & PAL_INDEXED)
return PalGDI;
}
+PPALETTE
+NTAPI
+PALETTE_AllocPalWithHandle(
+ _In_ ULONG iMode,
+ _In_ ULONG cColors,
+ _In_ PULONG pulColors,
+ _In_ FLONG flRed,
+ _In_ FLONG flGreen,
+ _In_ FLONG flBlue)
+{
+ PPALETTE ppal;
+
+ /* Allocate the palette without a handle */
+ ppal = PALETTE_AllocPalette2(iMode, cColors, pulColors, flRed, flGreen, flBlue);
+ if (!ppal) return NULL;
+
+ /* Insert the palette into the handle table */
+ if (!GDIOBJ_hInsertObject(&ppal->BaseObject, GDI_OBJ_HMGR_POWNED))
+ {
+ DPRINT1("Could not insert palette into handle table.\n");
+ GDIOBJ_vFreeObject(&ppal->BaseObject);
+ return NULL;
+ }
+
+ return ppal;
+}
+
HPALETTE
FASTCALL
PALETTE_AllocPalette(ULONG Mode,
NewPalette = PalGDI->BaseObject.hHmgr;
- PalGDI->Self = NewPalette;
PalGDI->flFlags = PAL_INDEXED;
PalGDI->IndexedColors = ExAllocatePoolWithTag(PagedPool,
return NewPalette;
}
-BOOL NTAPI
+BOOL
+NTAPI
PALETTE_Cleanup(PVOID ObjectBody)
{
PPALETTE pPal = (PPALETTE)ObjectBody;
- if (NULL != pPal->IndexedColors)
+ if (pPal->IndexedColors && pPal->IndexedColors != pPal->apalColors)
{
ExFreePoolWithTag(pPal->IndexedColors, TAG_PALETTE);
}
return TRUE;
}
-INT FASTCALL
+INT
+FASTCALL
PALETTE_GetObject(PPALETTE ppal, INT cbCount, LPLOGBRUSH lpBuffer)
{
if (!lpBuffer)
ULONG i, ulBestIndex = 0;
PALETTEENTRY peColor = *(PPALETTEENTRY)&iColor;
- /* Loop all palette entries, break on exact match */
- for (i = 0; i < ppal->NumColors && ulMinimalDiff != 0; i++)
+ /* Loop all palette entries */
+ for (i = 0; i < ppal->NumColors; i++)
{
/* Calculate distance in the color cube */
ulDiff = peColor.peRed - ppal->IndexedColors[i].peRed;
{
ulBestIndex = i;
ulMinimalDiff = ulColorDiff;
+
+ /* Break on exact match */
+ if (ulMinimalDiff == 0) break;
}
}
PALETTE *PalGDI;
PalGDI = (PALETTE*)PalObj;
- /* PalGDI = (PALETTE*)AccessInternalObjectFromUserObject(PalObj); */
if (Start >= PalGDI->NumColors)
return 0;
/** Systemcall Interface ******************************************************/
+HPALETTE
+NTAPI
+GreCreatePaletteInternal(
+ IN LPLOGPALETTE pLogPal,
+ IN UINT cEntries)
+{
+ HPALETTE hpal = NULL;
+ PPALETTE ppal;
+
+ pLogPal->palNumEntries = cEntries;
+ ppal = PALETTE_AllocPalWithHandle(PAL_INDEXED,
+ cEntries,
+ (PULONG)pLogPal->palPalEntry,
+ 0, 0, 0);
+
+ if (ppal != NULL)
+ {
+ PALETTE_ValidateFlags(ppal->IndexedColors, ppal->NumColors);
+
+ hpal = ppal->BaseObject.hHmgr;
+ PALETTE_UnlockPalette(ppal);
+ }
+
+ return hpal;
+}
+
/*
* @implemented
*/
-HPALETTE APIENTRY
-NtGdiCreatePaletteInternal ( IN LPLOGPALETTE pLogPal, IN UINT cEntries )
+HPALETTE
+APIENTRY
+NtGdiCreatePaletteInternal(
+ IN LPLOGPALETTE plogpalUser,
+ IN UINT cEntries)
{
- PPALETTE PalGDI;
- HPALETTE NewPalette;
-
- pLogPal->palNumEntries = cEntries;
- NewPalette = PALETTE_AllocPalette( PAL_INDEXED,
- cEntries,
- (PULONG)pLogPal->palPalEntry,
- 0, 0, 0);
+ HPALETTE hpal = NULL;
+ PPALETTE ppal;
+ ULONG i, cjSize;
- if (NewPalette == NULL)
+ ppal = PALETTE_AllocPalWithHandle(PAL_INDEXED, cEntries, NULL, 0, 0, 0);
+ if (ppal == NULL)
{
return NULL;
}
- PalGDI = (PPALETTE) PALETTE_ShareLockPalette(NewPalette);
- if (PalGDI != NULL)
+ cjSize = FIELD_OFFSET(LOGPALETTE, palPalEntry[cEntries]);
+
+ _SEH2_TRY
{
- PALETTE_ValidateFlags(PalGDI->IndexedColors, PalGDI->NumColors);
- PALETTE_ShareUnlockPalette(PalGDI);
+ ProbeForRead(plogpalUser, cjSize, 1);
+
+ for (i = 0; i < cEntries; i++)
+ {
+ ppal->IndexedColors[i] = plogpalUser->palPalEntry[i];
+ }
}
- else
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- /* FIXME: Handle PalGDI == NULL!!!! */
- DPRINT1("PalGDI is NULL\n");
+ GDIOBJ_vDeleteObject(&ppal->BaseObject);
+ _SEH2_YIELD(return NULL);
}
- return NewPalette;
+ _SEH2_END;
+
+ PALETTE_ValidateFlags(ppal->IndexedColors, cEntries);
+ hpal = ppal->BaseObject.hHmgr;
+ PALETTE_UnlockPalette(ppal);
+
+ return hpal;
}
HPALETTE APIENTRY NtGdiCreateHalftonePalette(HDC hDC)
}
}
- return NtGdiCreatePaletteInternal((LOGPALETTE *)&Palette, Palette.NumberOfEntries);
+ return GreCreatePaletteInternal((LOGPALETTE *)&Palette, Palette.NumberOfEntries);
}
BOOL
#pragma once
-#define PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual) */
-#define PALETTE_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */
-
-#define PALETTE_PRIVATE 0x1000 /* private colormap, identity mapping */
-#define PALETTE_WHITESET 0x2000
-
// Palette mode flags
#ifndef __WINDDI_H // Defined in ddk/winddi.h
#define PAL_INDEXED 0x00000001 // Indexed palette
#define PAL_RGB16_565 0x00400000 // 16-bit RGB in 565 format
#define PAL_GAMMACORRECTION 0x00800000 // Correct colors
-
typedef struct _PALETTE
{
- /* Header for all gdi objects in the handle table.
- Do not (re)move this. */
- BASEOBJECT BaseObject;
-
- PALOBJ PalObj;
- XLATEOBJ *logicalToSystem;
- HPALETTE Self;
- FLONG flFlags; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
- ULONG NumColors;
- PALETTEENTRY *IndexedColors;
- ULONG RedMask;
- ULONG GreenMask;
- ULONG BlueMask;
- ULONG ulRedShift;
- ULONG ulGreenShift;
- ULONG ulBlueShift;
- HDEV hPDev;
+ /* Header for all gdi objects in the handle table.
+ Do not (re)move this. */
+ BASEOBJECT BaseObject;
+
+ PALOBJ PalObj;
+ XLATEOBJ *logicalToSystem;
+ FLONG flFlags; // PAL_INDEXED, PAL_BITFIELDS, PAL_RGB, PAL_BGR
+ ULONG NumColors;
+ PALETTEENTRY *IndexedColors;
+ ULONG RedMask;
+ ULONG GreenMask;
+ ULONG BlueMask;
+ ULONG ulRedShift;
+ ULONG ulGreenShift;
+ ULONG ulBlueShift;
+ HDEV hPDev;
+ PALETTEENTRY apalColors[0];
} PALETTE;
extern PALETTE gpalRGB, gpalBGR, gpalMono, gpalRGB555, gpalRGB565, *gppalDefault;
extern PPALETTE appalSurfaceDefault[];
-HPALETTE FASTCALL PALETTE_AllocPalette(ULONG Mode,
- ULONG NumColors,
- ULONG *Colors,
- ULONG Red,
- ULONG Green,
- ULONG Blue);
-HPALETTE FASTCALL PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
- CONST RGBQUAD *Colors);
-#define PALETTE_FreePalette(pPalette) GDIOBJ_FreeObj((POBJ)pPalette, GDIObjType_PAL_TYPE)
-#define PALETTE_FreePaletteByHandle(hPalette) GDIOBJ_FreeObjByHandle((HGDIOBJ)hPalette, GDI_OBJECT_TYPE_PALETTE)
#define PALETTE_UnlockPalette(pPalette) GDIOBJ_vUnlockObject((POBJ)pPalette)
-
#define PALETTE_ShareLockPalette(hpal) \
((PPALETTE)GDIOBJ_ShareLockObj((HGDIOBJ)hpal, GDI_OBJECT_TYPE_PALETTE))
#define PALETTE_ShareUnlockPalette(ppal) \
GDIOBJ_vDereferenceObject(&ppal->BaseObject)
-BOOL NTAPI PALETTE_Cleanup(PVOID ObjectBody);
-INIT_FUNCTION NTSTATUS NTAPI InitPaletteImpl(VOID);
-VOID FASTCALL PALETTE_ValidateFlags (PALETTEENTRY* lpPalE, INT size);
-INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color);
+INIT_FUNCTION
+NTSTATUS
+NTAPI
+InitPaletteImpl(VOID);
-INT FASTCALL PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer);
-ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE* ppal, ULONG iColor);
-ULONG NTAPI PALETTE_ulGetNearestIndex(PALETTE* ppal, ULONG iColor);
-ULONG NTAPI PALETTE_ulGetNearestBitFieldsIndex(PALETTE* ppal, ULONG ulColor);
-VOID NTAPI PALETTE_vGetBitMasks(PPALETTE ppal, PULONG pulColors);
+PPALETTE
+NTAPI
+PALETTE_AllocPalette2(
+ _In_ ULONG iMode,
+ _In_ ULONG cColors,
+ _In_ PULONG pulColors,
+ _In_ FLONG flRed,
+ _In_ FLONG flGreen,
+ _In_ FLONG flBlue);
-PPALETTEENTRY FASTCALL ReturnSystemPalette (VOID);
-HPALETTE FASTCALL GdiSelectPalette(HDC, HPALETTE, BOOL);
+PPALETTE
+NTAPI
+PALETTE_AllocPalWithHandle(
+ _In_ ULONG iMode,
+ _In_ ULONG cColors,
+ _In_ PULONG pulColors,
+ _In_ FLONG flRed,
+ _In_ FLONG flGreen,
+ _In_ FLONG flBlue);
+
+VOID
+FASTCALL
+PALETTE_ValidateFlags(
+ PALETTEENTRY* lpPalE,
+ INT size);
+
+INT
+FASTCALL
+PALETTE_GetObject(
+ PPALETTE pGdiObject,
+ INT cbCount,
+ LPLOGBRUSH lpBuffer);
+
+ULONG
+NTAPI
+PALETTE_ulGetNearestPaletteIndex(
+ PPALETTE ppal,
+ ULONG iColor);
+
+ULONG
+NTAPI
+PALETTE_ulGetNearestIndex(
+ PPALETTE ppal,
+ ULONG iColor);
+
+ULONG
+NTAPI
+PALETTE_ulGetNearestBitFieldsIndex(
+ PPALETTE ppal,
+ ULONG ulColor);
+
+VOID
+NTAPI
+PALETTE_vGetBitMasks(
+ PPALETTE ppal,
+ PULONG pulColors);
+
+BOOL
+NTAPI
+PALETTE_Cleanup(PVOID ObjectBody);
ULONG
FORCEINLINE
ppal->IndexedColors[ulIndex].peBlue);
}
+HPALETTE
+NTAPI
+GreCreatePaletteInternal(
+ IN LPLOGPALETTE pLogPal,
+ IN UINT cEntries);
+
+////
+
+HPALETTE
+FASTCALL
+PALETTE_AllocPalette(ULONG Mode,
+ ULONG NumColors,
+ ULONG *Colors,
+ ULONG Red,
+ ULONG Green,
+ ULONG Blue);
+
+HPALETTE
+FASTCALL
+PALETTE_AllocPaletteIndexedRGB(ULONG NumColors,
+ CONST RGBQUAD *Colors);
+