Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1437 lines
48 KiB

/******************************Module*Header*******************************\
* Module Name: xlateobj.hxx
*
* This file contains the class prototypes for palettes and xlates
*
* Created: 08-Nov-1990 19:30:06
* Author: Patrick Haluptzok patrickh
*
* Copyright (c) 1990-1999 Microsoft Corporation
*
* TERMINOLOGY:
*
* Logical hpal: Something an application creates. These exist in the
* hdc.
*
* Physical hpal: An hpal that describes a surface. These are unique per
* hsurf. They can only be changed by GDI, not directly
* by an application.
*
* Every hdc has 3 fields for compatibiliy with Win3.0 Animate
* palette functionality.
*
* The first one is in the DCLEVEL:
*
* HPALETTE hpal; // Indicates the current hpal for the DC.
*
* These fields are not in the DCLEVEL:
*
* HDC hdcHpalPrev; // These two hdc fields enable tracking where
* HDC hdcHpalNext; // a hpal has been selected in.
*
* Every hpal has 2 fields for compatibility with Win3.0 Animate.
*
* HDC hdcHead; // The head of the list for the dc's that
* // this hpal is selected into
* ULONG cRef; // count of dc's and levels this baby is
* // selected into
*
* When a hpal is selected into a hdc, the hdc is added into a
* linked list of hdc associated with the hpal. The reference
* count for the hpal is incremented. The previous hpal has
* it's reference count decremented, and the hdc is taken out
* of it's linked list. This is so we can run down the list
* of DC the palette is selected into to do the AnimatePalette.
*
* The hpal is saved with SaveDC. SaveDC increments the reference count
* of the corresponding hpal and copies it to the new level.
*
* On RestoreDC decrement the old hpal's reference count. If the hpal's
* on the levels are different, the new hpal must be added back in the
* linked list, ***NOTE: it doesn't need to increment the reference count
* for the new level's hpal, the reference count already has
* this level added in it.
*
* A RealizePalette creates a xlateobj for mapping entries from the hdc's
* hpal to the hsurf's hpal if the surface is managed by the window manager.
* If the surface is not window managed the mapping is so trivial that a
* xlateobj is not created.
*
* GLOBAL Notions:
*
* STOCKOBJ_PAL
* PPALETTE ppalDefault;
* PPALETTE ppalDefaultSurface8bpp;
*
* STOCKOBJ_PAL is what every DC has when it is called by GetDC. It is
* the special case palette that is always locked, non-modifiable and
* contains the 20 default colors. The constructors and destructors and
* methods all should do the right thing for the default palette, i.e.
* never really lock it or modify it, but allow everyone to look at it
* and copy it.
*
* Tue 04-Dec-1990 -by- Patrick Haluptzok [patrickh]
* update
\**************************************************************************/
#ifndef _XLATEOBJ_
#define _XLATEOBJ_
#ifndef GDIFLAGS_ONLY // used for gdikdx
typedef struct _PIXEL32
{
BYTE b;
BYTE g;
BYTE r;
BYTE a;
}PIXEL32,*PPIXEL32;
typedef union _ALPHAPIX
{
PIXEL32 pix;
RGBQUAD rgb;
ULONG ul;
} ALPHAPIX,*PALPHAPIX;
typedef union _PAL_ULONG
{
PALETTEENTRY pal;
ULONG ul;
} PAL_ULONG;
typedef union _BGR_ULONG
{
RGBQUAD rgb;
ULONG ul;
} BGR_ULONG;
typedef union _HDEVPPAL
{
HDEV hdev;
PPALETTE ppal;
} HDEVPPAL;
typedef struct _PAL_LOGPALETTE
{
SHORT palVersion;
SHORT palNumEntries;
PALETTEENTRY palPalEntry[20];
} PAL_LOGPALETTE;
// The translate structure is used on palette managed devices to convert
// logical palette indices to physical palette indices.
typedef struct _TRANSLATE
{
ULONG iUniq; // Surface time this translate was made for. 0 if rerealize necesary.
BYTE ajVector[1]; // NOTE: THIS IS A VARIABLE-LENGTH FIELD AND MUST BE LAST
} TRANSLATE;
typedef TRANSLATE *PTRANSLATE;
typedef struct _TRANSLATE20
{
ULONG iUniq;
BYTE ajVector[20];
} TRANSLATE20;
extern TRANSLATE20 defaultTranslate;
extern PAL_LOGPALETTE logDefaultPal;
extern BYTE HalftoneColorCube[];
//
// forward reference
//
// NOTE: the cache size must be a power of 2, quicker modula calculation.
#define XLATE_CACHE_SIZE ((ULONG) 8)
#define XLATE_MODULA (XLATE_CACHE_SIZE - (ULONG) 1)
#endif // GDIFLAGS_ONLY used for gdikdx
#define DIB_PAL_NONE 3
// PALOBJ flags - Fist bunch are defined in winddi.h
//#define PAL_INDEXED 0x00000001
//#define PAL_BITFIELDS 0x00000002
//#define PAL_RGB 0x00000004
//#define PAL_BGR 0x00000008
//#define PAL_CMYK 0x00000010
#define PAL_DC 0x00000100 // See below for comments
#define PAL_FIXED 0x00000200
#define PAL_FREE 0x00000400
#define PAL_MANAGED 0x00000800
#define PAL_NOSTATIC 0x00001000
#define PAL_MONOCHROME 0x00002000
#define PAL_BRUSHHACK 0x00004000
#define PAL_DIBSECTION 0x00008000
#define PAL_NOSTATIC256 0x00010000
#define PAL_HT 0x00100000
#define PAL_RGB16_555 0x00200000
#define PAL_RGB16_565 0x00400000
#define PAL_GAMMACORRECT 0x00800000 // This bit is only for palette on surface
//
// PAL_DIBSECTION is set when the palette is created for a DIBSECTION being
// created with DIB_PAL_COLORS. When this happens we should attempt to map
// the colors directly as identity xlate if possible, rather than doing the
// first color match wins routine.
//
// PAL_DC specifies the palette was created by an application through
// CreatePalette. These palettes only live in DC's, never in
// surfaces. These may be selected into multiple DC's, with the
// restriction that only one of the DC's hsurf's hpal is of type
// PAL_MANAGED
// Physical palettes are unique to an hsurf. No two surfaces have
// the same palette, though their entries may be the same. (They can also
// share color tables if it's a palette for a DirectDRaw object.) There are
// 3 different PAL_SURF types.
// 1. PAL_FIXED is a fixed palette. If this flag is set then
// the palette for this surface cannot be changed.
// 2. PAL_FREE means the palette is completely free. If it's selected into
// a DC with an hpal, the DC's hpal will map right in 1-1. This is the
// type of palette a Bitmap would have.
// 3. PAL_MANAGED means this palette has some entries fixed and
// some are settable. The fixed entries must be the first 10 and
// last 10. This is what a palette managed device has.
// PAL_NOSTATIC is a flag that signifies that for this PAL_MANAGED surface
// only two colors black, white, (first and last) are reserved.
// PAL_MONOCHROME is the flag stuck on monochrome bitmaps that should
// have their 0-> mapped to the foreground color of the dest DC and
// the 1-> mapped to the background color. The flag is put on palettes
// of bitmaps created via the call CreateBitmap, CreateBitmapIndirect.
// CreateDIBitmap treats monochromes just like 4,8 etc. it looks at
// the associated color table with the bitmap and therefore doesn't
// mark the palette PAL_MONOCHROME. This flag is required for
// Win 3.0 compatibility.
// There are 2 classes of palettes:
//
// A. PAL_INDEXED - the palette is described by an array of RGB's.
// 1. PAL_MONOCHROME - is a subset of PAL_INDEXED
//
// B. Not PAL_INDEXED, cEntries == 0
// the palette has no table, it describes how to convert
// the bits directly into RGBs via masks.
// 1. PAL_RGB - Classical RGB.
// PAL_RGB specifies a palette as being true RGB. An application creates
// an RGB palette by calling CreatePalette with numentries equal to 0.
// The byte order from low to high is R, G, B, flag.
// PAL_BGR specifies RGB expect the ordering from low to high is
// B, G, R, flags
// If the palette has less than 20 colors simultaneously then it must be a
// fixed palette or a free palette, none of the entries may be settable
// and the driver may pass back any colors it wants for it's palette.
// Windows3.1 flags for palette matching
#define PC_USED 0x10
#define PC_FOREGROUND 0x20
#ifndef GDIFLAGS_ONLY // used for gdikdx
//
// in some cases build an xlate table from rgb333 to palette entries
//
typedef PBYTE PRGB555XLATE;
#endif // GDIFLAGS_ONLY used for gdikdx
// Specify on calls to search for nearest COLORREFs or PALENTRYs whether
// to do an exact match search before doing the nearest match, since an
// exact search is so much faster.
#define SE_DONT_SEARCH_EXACT_FIRST 0x00
#define SE_DO_SEARCH_EXACT_FIRST 0x01
//
// ulXlatePalUnique maintains "time" of the last change to a palette or xlateobj.
// This is needed to tell if a xlateobj or translate is valid.
//
#ifndef GDIFLAGS_ONLY // used for gdikdx
extern ULONG ulXlatePalUnique;
extern PAL_ULONG aPalHalftone[];
//
// Function prototype for palette-specific routines to convert a
// PALETTEENTRY to the destination device's color format.
//
class PALETTE;
typedef ULONG (FASTCALL *PFN_GetFromPalentry)(PALETTE*, ULONG);
//
// Function prototype for optimized routines to convert between two
// bitfields (or RGB or BGR) format colors.
//
typedef ULONG (FASTCALL *PFN_pfnXlate)(XLATEOBJ*, ULONG);
/******************************Public*Class*******************************\
* class PALETTE
*
* Palette class
*
* History:
* 07-Nov-1990 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
class PALETTE : public OBJECT
{
public:
FLONG flPal; // flags in palette
ULONG cEntries; // count of entries currently in palette
ULONG ulTime; // Time that specifies when the palette
// was last modified. Use this to determine
// if xlateobj are still valid.
HDC hdcHead; // Head of the linked list of DC's this hpalette
// is selected into so we traverse all the DC's
// an hpal is selected into to do AnimatePalette
// ect. correctly
HDEVPPAL hSelected; // For a PAL_DC this is the hdev of the pdev
// this
// palette is selected into. We track this
// because a palette can only be selected into
// the DC's of 1 device at a
// time. The DEVLOCK of the pdev serializes
// access to the pxlates in the palDC.
// For a PAL_MANAGED palette this is
// the hpal of its default palette.
ULONG cRefhpal; // For a PAL_DC this is the
// count of times this hpal is selected into a DC.
// For a PAL_xxx this is the
// index in the cache table of where the last
// hxlate used for this surf palette was stuffed.
ULONG cRefRegular; // For a PAL_MANAGED this is the number of reserved
// entries.
// For the special case where we have created a DIB
// via DIB_PAL_COLORS, we store the actual length of
// the DIB's color table here so we don't have to
// make as big an xlate
// For a DIBSECTION bitmap this is the count of
// entries that are used. This is for
// Get/SetDIBColorTable to remember the ClrUsed.
HDEV hdevOwner; // Pointer to PDEV who create this palette by EngCreatePalette()
// this entry is used only for the palette on the surface.
// [note] later to 'union' with someelse value which
// is only used for logical palette.
PTRANSLATE ptransFore; // Foreground mapping.
PTRANSLATE ptransCurrent; // Current mapping which may == ptransFore.
PTRANSLATE ptransOld; // The old translate for UpdateColors.
// This needs to be kept around to support
// UpdateColors.
PFN_GetFromPalentry pfnGetNearestFromPalentry;
PFN_GetFromPalentry pfnGetMatchFromPalentry;
// Indirect functions to convert a PALETTEENTRY
// to the destination device's color format
ULONG ulRGBTime;
PRGB555XLATE pRGBXlate; // prgbXlate is allocated for a palette when doing
// translations from 16,24,32 bit per pixel formats
// to the palette format. ulRGBTime is used to determine
// if the xlate is valid.
PAL_ULONG *apalColor; // Pointer to color table. Usually points to
// &apalColorTabe[0], except for a DirectDraw
// GetDC surface, for which it points directly to
// the screen surface's color table
PALETTE *ppalColor; // Palette that owns the color table
// NOTE: THIS IS A VARIABLE-LENGTH FIELD AND MUST BE LAST
PAL_ULONG apalColorTable[1]; // array of rgb values that each index corresponds
// plus array of intensities from least intense to most
// intense (plus index to corresponding rgb value)
};
typedef PALETTE *PPALETTE;
/******************************Public*Class********************************\
* XLATE
*
* This is the data structure for an xlate object. An xlate tranlates
* indices from being relative one palette to being relative to another.
*
* History:
* Mon 07-Mar-1994 -by- Patrick Haluptzok [patrickh]
* Derive off of XLATEOBJ.
*
* 18-Nov-1990 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
class XLATE : public _XLATEOBJ
{
public:
// ULONG iUniq; // Uniqueness
// FLONG flXlate; // Accelerator flags
// USHORT iSrcType; // Src palette type
// USHORT iDstType; // Dst palette type
// ULONG cEntries; // Count of entries in table
// ULONG *pulXlate; // Pointer to translation vector.
ULONG iBackSrc; // tracked for blting to monochrome
ULONG iForeDst; // tracked for blting from monochrome
ULONG iBackDst; // tracked for blting from monochrome
LONG lCacheIndex; // Is XLATE_CACHE_JOURNAL if for journal play back
// Is XLATE_CACHE_INVALID if it's not in cache
// Otherwise it's the cache index.
PPALETTE ppalSrc; // Points to Src palette.
PPALETTE ppalDst; // Points to Dst palette.
PPALETTE ppalDstDC; // Points to Dst DC palette.
HANDLE hcmXform; // ICM Color Transform for operation
LONG lIcmMode; // ICM mode for operation
FLONG flPrivate; // Private accelerator flags
// NOTE: THIS IS A VARIABLE-LENGTH FIELD AND MUST BE LAST
ULONG ai[1]; // The translation vector.
public:
BOOL bIsIdentity() { return(flXlate & XO_TRIVIAL); }
ULONG ulTranslate(ULONG cIndex) { return(XLATEOBJ_iXlate(this, cIndex)); }
VOID vSetIndex(ULONG ulIndex, ULONG ulValue)
{
ASSERTGDI(ulIndex < cEntries, "ERROR XLATE vSetIndex");
ai[ulIndex] = ulValue;
}
VOID FASTCALL vMapNewXlate(PTRANSLATE ptrans);
VOID vCheckForTrivial();
VOID vCheckForICM(HANDLE hcmXform,ULONG lIcmMode);
PFN_pfnXlate pfnXlateBetweenBitfields();
};
typedef XLATE *PXLATE;
//
// This class is for the global identity xlate we have sitting around.
//
class XLATE256 : public XLATE
{
public:
ULONG aiExtra[255]; // We have a 256 array of ident xlate.
};
class XLATE2 : public XLATE
{
public:
ULONG aiExtra[1]; // We have a 2 entry array.
};
extern XLATE256 xloIdent;
// The following constants are for reserved uniqueness values.
// 1 is reserved for the identity xlate.
// 2 is reserved for the palette time for a palette managed bitmap palette.
// If ever wrapping is an issue I would increment by 2, start at an even #
// and put the reserved times at odd offsets.
#define XLATE_IDENTITY_UNIQ 1
#define COMPAT_PAL_MAN_BM_UNIQ 2
#define XLATE_START_UNIQ 3
//
// The 2 common palettes used in Windows are:
// The palette for mononchrome bitmaps
// The default logical palette for DC's
//
extern PPALETTE ppalDefault;
extern PPALETTE gppalRGB;
extern PPALETTE ppalDefaultSurface8bpp;
extern PPALETTE ppalMono;
extern HPALETTE hpalMono;
/******************************Public*Structure****************************\
* P_BITFIELDS
*
* This supports the 16 and 32 bit-bitfield palette types. The bitfields
* for each color are assumed to be contiguous and don't overlap.
*
* Let a 16 or 32 bit index be represented by:
*
* { X | Y | Z } where X is the high ignored bits, Y is the color bits
* for a particular Color and Z is the ignored low bits.
*
* cColorRight = (Y > 8) ? (Z + Y - 8) : (Z);
*
* Let w=0 for red, w=8 for green, w=16 for blue
*
* cColorLeft = (Y > 8) ? (w) : (w + 8 - Y)
*
* We compute this for R,G,B and from these we can transform the colors
* from RGB to indexes and back again no matter how wide or what order
* the bitfields for each of the colors is.
*
* History:
* 08-Nov-1991 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
typedef struct _P_BITFIELDS
{
FLONG flRed; // Masks for the corresponding bits
FLONG flGre;
FLONG flBlu;
ULONG cRedLeft;
ULONG cGreLeft;
ULONG cBluLeft;
ULONG cRedRight;
ULONG cGreRight;
ULONG cBluRight;
ULONG cRedMiddle;
ULONG cGreMiddle;
ULONG cBluMiddle;
} P_BITFIELDS;
/******************************Public*Class*******************************\
* class XEPALOBJ
*
* Palette User Object
*
* History:
* Thu 29-Aug-1991 -by- Patrick Haluptzok [patrickh]
* changed it to be XEPALOBJ
*
* 07-Nov-1990 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
class XEPALOBJ /* xepal */
{
protected:
PPALETTE ppal;
public:
XEPALOBJ() { ppal = (PPALETTE) NULL; }
XEPALOBJ(PPALETTE ppalNew) { ppal = ppalNew; }
VOID vAltCheckLock(HPALETTE hpal)
{
ppal = (PPALETTE) HmgShareCheckLock((HOBJ)hpal, PAL_TYPE);
}
VOID vAltLock(HPALETTE hpal)
{
ppal = (PPALETTE) HmgShareLock((HOBJ)hpal, PAL_TYPE);
}
VOID vAltUnlock()
{
if (ppal != (PPALETTE) NULL)
{
DEC_SHARE_REF_CNT(ppal);
ppal = (PPALETTE) NULL;
}
}
// These are the common functions
HPALETTE hpal() { return((HPALETTE) ppal->hGet()); }
BOOL bValid() { return(ppal != (PPALETTE) NULL); }
BOOL bIsPalDefault() { return(ppal == ppalDefault); }
VOID vSetPID(W32PID pid) { HmgSetOwner((HOBJ)hpal(), pid, PAL_TYPE); }
VOID vRefPalette() { if (ppal != NULL) INC_SHARE_REF_CNT(ppal); }
VOID vUnrefPalette();
BOOL bDeletePalette(BOOL bCleanup = FALSE, CLEANUPTYPE cutype = CLEANUP_NONE); // release associated memory
// Bitfield functions
FLONG flRed() { return(((P_BITFIELDS *) ppal->apalColor)->flRed); }
VOID flRed(FLONG flNew) { ((P_BITFIELDS *) ppal->apalColor)->flRed = flNew; }
FLONG flGre() { return(((P_BITFIELDS *) ppal->apalColor)->flGre); }
VOID flGre(FLONG flNew) { ((P_BITFIELDS *) ppal->apalColor)->flGre = flNew; }
FLONG flBlu() { return(((P_BITFIELDS *) ppal->apalColor)->flBlu); }
VOID flBlu(FLONG flNew) { ((P_BITFIELDS *) ppal->apalColor)->flBlu = flNew; }
ULONG& cRedLeft() { return(((P_BITFIELDS *) ppal->apalColor)->cRedLeft); }
VOID cRedLeft(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cRedLeft = ul; }
ULONG& cGreLeft() { return(((P_BITFIELDS *) ppal->apalColor)->cGreLeft); }
VOID cGreLeft(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cGreLeft = ul; }
ULONG& cBluLeft() { return(((P_BITFIELDS *) ppal->apalColor)->cBluLeft); }
VOID cBluLeft(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cBluLeft = ul; }
ULONG& cRedRight() { return(((P_BITFIELDS *) ppal->apalColor)->cRedRight); }
VOID cRedRight(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cRedRight = ul; }
ULONG& cGreRight() { return(((P_BITFIELDS *) ppal->apalColor)->cGreRight); }
VOID cGreRight(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cGreRight = ul; }
ULONG& cBluRight() { return(((P_BITFIELDS *) ppal->apalColor)->cBluRight); }
VOID cBluRight(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cBluRight = ul; }
ULONG& cRedMiddle() { return(((P_BITFIELDS *) ppal->apalColor)->cRedMiddle); }
VOID cRedMiddle(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cRedMiddle = ul; }
ULONG& cGreMiddle() { return(((P_BITFIELDS *) ppal->apalColor)->cGreMiddle); }
VOID cGreMiddle(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cGreMiddle = ul; }
ULONG& cBluMiddle() { return(((P_BITFIELDS *) ppal->apalColor)->cBluMiddle); }
VOID cBluMiddle(ULONG ul) { ((P_BITFIELDS *) ppal->apalColor)->cBluMiddle = ul; }
ULONG ulBitfieldToRGB(ULONG ulIndex);
ULONG ulIndexToRGB(ULONG ulIndex);
// General functions
PPALETTE ppalGet() { return(ppal); }
PVOID pvPalette() { return((PVOID) ppal); }
VOID ppalSet(PPALETTE ppalNew) { ppal = ppalNew; }
FLONG flPal() { return(ppal->flPal); }
VOID flPalSet(FLONG flag) { ppal->flPal = flag; }
VOID flPal(FLONG flag) { ppal->flPal |= flag; }
ULONG iPalMode() { return(ppal->flPal & (PAL_RGB | PAL_BGR | PAL_CMYK | PAL_INDEXED | PAL_BITFIELDS)); }
BOOL bIsRGB() { return(ppal->flPal & PAL_RGB); }
BOOL bIsBGR() { return(ppal->flPal & PAL_BGR); }
BOOL bIs565() { return(ppal->flPal & PAL_RGB16_565); }
BOOL bIs555() { return(ppal->flPal & PAL_RGB16_555); }
BOOL bIsCMYK() { return(ppal->flPal & PAL_CMYK); }
BOOL bIsIndexed() { return(ppal->cEntries); }
BOOL bIsPalDC() { return(ppal->flPal & PAL_DC); }
BOOL bIsBitfields() { return(ppal->flPal & PAL_BITFIELDS); }
BOOL bIsPalDibsection() { return(ppal->flPal & PAL_DIBSECTION); }
BOOL bIsHalftone() { return(ppal->flPal & PAL_HT);}
ULONG cEntries() { return(ppal->cEntries); }
VOID cEntries(ULONG ulTemp) { ppal->cEntries = ulTemp; }
PPALETTE ppalColor() { return(ppal->ppalColor); }
PAL_ULONG *apalColorGet() { return(ppal->apalColor); }
VOID vComputeCallTables();
VOID apalColorSet(PPALETTE ppalGlobal)
{
if (ppal->ppalColor != ppal)
{
// Handle re-assignment case
DEC_SHARE_REF_CNT(ppal->ppalColor);
}
INC_SHARE_REF_CNT(ppalGlobal);
ppal->apalColor = ppalGlobal->apalColor;
ppal->ppalColor = ppalGlobal;
}
VOID apalResetColorTable()
{
if (ppal->ppalColor != ppal)
{
// Handle re-assignment case
DEC_SHARE_REF_CNT(ppal->ppalColor);
}
// Note that this does not transfer ownership of the color table
ppal->apalColor = &ppal->apalColorTable[0];
ppal->ppalColor = ppal;
}
ULONG ulTime()
{
if (ppal->ppalColor != ppal)
{
// Note if color table lives in different PALETTE, get time from there.
return(ppal->ppalColor->ulTime);
}
else
{
return(ppal->ulTime);
}
}
VOID ulTime(ULONG ulNewTime)
{
ppal->ulTime = ulNewTime;
if (ppal->ppalColor != ppal)
{
// Note if color table lives in different PALETTE, update that's ulTime, too.
ppal->ppalColor->ulTime = ulNewTime;
}
}
VOID vUpdateTime() { ulTime(ulGetNewUniqueness(ulXlatePalUnique)); }
VOID vSetHTPal() { ppal->flPal |= PAL_HT; }
VOID vClearHTPal() { ppal->flPal &= ~PAL_HT; }
BOOL bIsHTPal() { return(ppal->flPal & PAL_HT); }
PALETTEENTRY palentryGet(ULONG ulIndex)
{
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR palentryGet: ulIndex > cEntries");
return(ppal->apalColor[ulIndex].pal);
}
ULONG ulEntryGet(ULONG ulIndex)
{
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR ulentryGet: ulIndex > cEntries");
return(ppal->apalColor[ulIndex].ul);
}
VOID palentrySet(ULONG ulIndex, PALETTEENTRY palentry)
{
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR palentrySet: ulIndex > cEntries");
ppal->apalColor[ulIndex].pal = palentry;
}
VOID ulEntrySet(ULONG ulIndex, ULONG ulRGB)
{
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR palentrySet: ulIndex > cEntries");
ppal->apalColor[ulIndex].ul = ulRGB;
}
ULONG ulSetEntries(ULONG iStart, ULONG cEntry, CONST PALETTEENTRY *ppalentry);
ULONG ulAnimatePalette(ULONG iStart, ULONG cEntry, CONST PALETTEENTRY *ppalentry);
ULONG ulGetEntries(ULONG iStart, ULONG cEntry, PPALETTEENTRY ppalentry, BOOL bZeroFlags);
ULONG ulGetNearestFromPalentryNoExactMatchFirst(CONST PALETTEENTRY palentry);
ULONG ulGetMatchFromPalentry(CONST PALETTEENTRY palentry)
{
return(ppal->pfnGetMatchFromPalentry(ppal, *((ULONG*) &palentry)));
}
ULONG ulGetMatchFromPalentry(CONST ULONG palentry)
{
return(ppal->pfnGetMatchFromPalentry(ppal, palentry));
}
ULONG ulGetNearestFromPalentry(CONST PALETTEENTRY palentry)
{
return(ppal->pfnGetNearestFromPalentry(ppal, *((ULONG*) &palentry)));
}
ULONG ulGetNearestFromPalentry(CONST ULONG palentry)
{
return(ppal->pfnGetNearestFromPalentry(ppal, palentry));
}
ULONG ulGetNearestFromPalentry(
CONST PALETTEENTRY palentry,
ULONG seSearchExactFirst
)
{
ULONG ul;
if (seSearchExactFirst == SE_DONT_SEARCH_EXACT_FIRST)
{
ul = ulGetNearestFromPalentryNoExactMatchFirst(palentry);
}
else
{
ul = ulGetNearestFromPalentry(palentry);
}
return(ul);
}
VOID vInitMono();
VOID vInitVGA();
VOID vInit256Rainbow();
VOID vInit256Default();
// These are the DC palette functions - PALOBJDC
VOID hdcHead(HDC hdcHead)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR hdcHead() passed invalid palette type\n");
ppal->hdcHead = hdcHead;
}
HDC hdcHead()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR hdcHead() 1passed invalid palette type\n");
return(ppal->hdcHead);
}
VOID cRefhpal(ULONG ulTemp)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR cRefhpal not called on PAL_DC1\n");
ppal->cRefhpal = ulTemp;
}
ULONG cRefhpal()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR cRefhpal not called on PAL_DC\n");
return(ppal->cRefhpal);
}
VOID iXlateIndex(ULONG ulTemp)
{
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR iXlateIndex called on PAL_DC1\n");
ASSERTGDI(ulTemp < XLATE_CACHE_SIZE, "ERROR saving too large cache index \n");
ppal->cRefhpal = ulTemp;
}
ULONG iXlateIndex()
{
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR iXlateIndex called on PAL_DC\n");
ASSERTGDI(ppal->cRefhpal < XLATE_CACHE_SIZE, "ERROR retrieving out of bounds cache index \n");
return(ppal->cRefhpal);
}
VOID ptransFore(PTRANSLATE ptrans)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR pxlFore() passed invalid palette type\n");
ppal->ptransFore = ptrans;
}
PTRANSLATE ptransFore()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR pxlFore() 1passed invalid palette type\n");
return(ppal->ptransFore);
}
VOID ptransCurrent(PTRANSLATE ptrans)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR ptransCurrent() passed invalid palette type\n");
ppal->ptransCurrent = ptrans;
}
PTRANSLATE ptransCurrent()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR ptransCurrent() 1passed invalid palette type\n");
return(ppal->ptransCurrent);
}
VOID ptransOld(PTRANSLATE ptrans)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR ptransOld() passed invalid palette type\n");
ppal->ptransOld = ptrans;
}
PTRANSLATE ptransOld()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR ptransOld() 1passed invalid palette type\n");
return(ppal->ptransOld);
}
//
// For ResizePalette
//
BOOL bSwap(PPALETTE*,ULONG,ULONG);
//
// This returns the index in the surface palette an index in the dc
// palette maps to. It assumes you checked for a valid ptrans and a
// valid index range.
//
ULONG ulTranslateDCtoCurrent(ULONG ulIndex)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR GDI ulTranslateIndex");
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR GDI ulTranslateIndex1");
ASSERTGDI(ppal->ptransCurrent != (PTRANSLATE) NULL, "ERROR GDI ulTranslateIndex2");
return((ULONG) ppal->ptransCurrent->ajVector[ulIndex]);
}
//
// This returns the index in the surface palette an index in the dc
// palette maps to. It assumes you checked for a valid ptrans and a
// valid index range.
//
ULONG ulTranslateDCtoFore(ULONG ulIndex)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR GDI ulTranslateIndex1");
ASSERTGDI(ulIndex < ppal->cEntries, "ERROR GDI ulTranslateIndex11");
ASSERTGDI(ppal->ptransFore != (PTRANSLATE) NULL, "ERROR GDI ulTranslateIndex21");
return((ULONG) ppal->ptransFore->ajVector[ulIndex]);
}
//
// For a palette managed DC this is the hdev the palette is selected into.
//
HDEV hdev()
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR hdev() passed invalid palette type\n");
return(ppal->hSelected.hdev);
}
VOID hdev(HDEV hdev)
{
ASSERTGDI(ppal->flPal & PAL_DC, "ERROR hdev() 1passed invalid palette type\n");
ppal->hSelected.hdev = hdev;
}
BOOL bSet_hdev(HDEV hdev);
VOID vInc_cRef()
{
ASSERTGDI(ppal->flPal & PAL_DC, "vInc_cRef() passed invalid palette type\n");
InterlockedIncrement((PLONG) &(ppal->cRefhpal));
}
VOID vDec_cRef()
{
ASSERTGDI(ppal->flPal & PAL_DC, "vDec_cRef() passed invalid palette type\n");
ASSERTGDI(ppal->cRefhpal != 0, "cRefhpal == 0 in vDec Palette");
InterlockedDecrement((PLONG) &(ppal->cRefhpal));
}
// These are the surface palette functions - PALOBJS
BOOL bIsPalFixed() { return(ppal->flPal & PAL_FIXED); }
BOOL bIsPalManaged() { return(ppal->flPal & PAL_MANAGED); }
BOOL bIsPalFree() { return(ppal->flPal & PAL_FREE); }
BOOL bIsMonochrome() { return((ppal != NULL) && (ppal->flPal & PAL_MONOCHROME)); }
VOID vCopy_rgbquad(RGBQUAD *prgbquad, ULONG iStart, ULONG cEntries);
VOID vCopy_cmykquad(ULONG *pcmykquad, ULONG iStart, ULONG cEntries);
ULONG ulGetExactIndexFromPalentry(PAL_ULONG Color);
PTRANSLATE ptransMapIn(XEPALOBJ palDC, BOOL bForeground, ULONG *pulUsedChanged, ULONG *pulUnUsedChanged);
BOOL bJamItIn(XEPALOBJ palDC, BOOL bForeground, BOOL *pulUsedChanged, BOOL *pulUnUsedEntriesChanged);
ULONG ulRealizeOnFree(XEPALOBJ palDC);
VOID ulNumReserved(ULONG ulTemp)
{
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR ulNumReserved called on PAL_DC1\n");
ASSERTGDI(ulTemp < ppal->cEntries, "ERROR saving too large free index \n");
ppal->cRefRegular = ulTemp;
}
ULONG cColorTableLength() {
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR cColorTableLength called on PAL_DC1\n");
return ppal->cRefRegular;
}
VOID cColorTableLength(ULONG ulLength) {
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR cColorTableLength called on PAL_DC1\n");
ppal->cRefRegular = ulLength;
}
ULONG ulNumReserved()
{
ASSERTGDI(!(ppal->flPal & PAL_DC), "ERROR ulNumReserved called on PAL_DC\n");
ASSERTGDI(ppal->cRefRegular <= (ppal->cEntries - 1), "ERROR retrieving out of bounds free index \n");
ASSERTGDI(ppal->cRefRegular >= 1, "ERROR ulNumReserved too small\n");
return(ppal->cRefRegular);
}
BOOL bIsNoStatic()
{
return(ppal->flPal & PAL_NOSTATIC);
}
BOOL bIsNoStatic256()
{
return(ppal->flPal & PAL_NOSTATIC256);
}
VOID vSetNoStatic()
{
ppal->flPal = (ppal->flPal | PAL_NOSTATIC) & ~PAL_NOSTATIC256;
}
VOID vSetNoStatic256()
{
ppal->flPal = (ppal->flPal | PAL_NOSTATIC256) & ~PAL_NOSTATIC;
}
VOID vMakeNoXlate();
PPALETTE ppalOriginal()
{
ASSERTGDI(ppal->flPal & PAL_MANAGED, "ERROR hpalOriginal() passed invalid palette type\n");
return(ppal->hSelected.ppal);
}
VOID ppalOriginal(PPALETTE ppalNew)
{
ASSERTGDI(ppal->flPal & PAL_MANAGED, "ERROR hpalOriginal() 1passed invalid palette type\n");
ppal->hSelected.ppal = ppalNew;
}
VOID vCopyEntriesFrom(XEPALOBJ palSrc)
{
RtlCopyMemory(apalColorGet(),
palSrc.apalColorGet(),
(UINT) (MIN(palSrc.cEntries(), cEntries())) * sizeof(PAL_ULONG));
}
VOID vFill_rgbquads(RGBQUAD *prgb, ULONG iStart, ULONG cEntries);
VOID vFill_triples(RGBTRIPLE *prgb, ULONG iStart, ULONG cEntries);
VOID vAddToList(XDCOBJ& dco);
VOID vRemoveFromList(XDCOBJ& dco);
VOID vGetEntriesFrom(XEPALOBJ palDC, XEPALOBJ palSurf, PUSHORT pusIndices, ULONG cEntry);
BOOL bEqualEntries(XEPALOBJ pal);
BOOL bGenColorXlate555();
PRGB555XLATE pGetRGBXlate();
BYTE Xlate555(BYTE r,BYTE g, BYTE b)
{
return(ppal->pRGBXlate[
((r & 0xf8) << 7) ||
((g & 0xf8) << 2) ||
((b & 0xf8) >> 3)]);
}
//
// ICM: GammaCorrection stuff for 8bpp surface
//
BOOL bNeedGammaCorrection() { return(ppal->flPal & PAL_GAMMACORRECT); }
BOOL bNeedGammaCorrection(BOOL b) { SETFLAG(b,ppal->flPal,PAL_GAMMACORRECT);return (b); }
VOID CorrectColors(PPALETTEENTRY ppalentry, ULONG cEntries);
HDEV hdevOwner() { return(ppal->hdevOwner); }
HDEV hdevOwner(HDEV hdev_) { ppal->hdevOwner = hdev_;return(hdev_); }
};
/*********************************Class************************************\
* class EPALOBJ : public XEPALOBJ
*
* Used for creating a user object from a pointer to the object.
*
* History:
* Wed 28-Aug-1991 -by- Patrick Haluptzok [patrickh]
* Wrote it.
\**************************************************************************/
class EPALOBJ : public XEPALOBJ /* palo */
{
public:
EPALOBJ() {ppal = (PPALETTE) NULL; }
EPALOBJ(HPALETTE hpal) {ppal = (PPALETTE) HmgShareCheckLock((HOBJ)hpal, PAL_TYPE);}
~EPALOBJ()
{
if (ppal != (PPALETTE) NULL)
{
DEC_SHARE_REF_CNT(ppal);
}
}
};
/******************************Public*Class********************************\
* class PALMEMOBJ
*
* Palette Memory Object
*
* History:
* 07-Nov-1990 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
class PALMEMOBJ : public XEPALOBJ /* epalmo */
{
private:
BOOL bKeep;
public:
PALMEMOBJ() {bKeep = FALSE; ppal = (PPALETTE) NULL;}
BOOL bCreatePalette(ULONG iMode, ULONG cColors, ULONG *pulColors,
FLONG flRed, FLONG flGreen, FLONG flBlue,
ULONG iType);
BOOL bCreateHTPalette(LONG iFormatHT, GDIINFO *pGdiInfo);
~PALMEMOBJ();
VOID vKeepIt() { bKeep = TRUE; }
};
// structure for entry in the xlate cache.
typedef struct _XLATETABLE
{
ULONG ulReference; // How many people are currently using it.
PXLATE pxlate;
ULONG ulPalSrc; // palette src time when xlate created
ULONG ulPalDst; // palette dst time when xlate created
ULONG ulPalSrcDC; // palette src DC time when xlate created
ULONG ulPalDstDC; // palette dst DC time when xlate created
} XLATETABLE;
extern XLATETABLE xlateTable[XLATE_CACHE_SIZE];
extern ULONG ulTableIndex;
#endif // GDIFLAGS_ONLY used for gdikdx
// This signifies the xlate wasn't put in the cache. The destructor
// checks for this and deletes it if it's not in the cache.
#define XLATE_CACHE_JOURNAL -2
#define XLATE_CACHE_INVALID -1
// This describes the overall logic of surface to surface xlates.
// There are basically n types of xlates to worry about:
//
// 1. XO_TRIVIAL - no translation occurs, identity.
//
// 2. XO_TABLE - look up in a table for the correct table translation.
//
// a. XO_TO_MONO - look in to table for the correct tranlation,
// but when getting it out of the cache make sure iBackSrc is the
// same. iBackSrc goes to 1, everything else to 0.
// b. XLATE_FROM_MONO - look into table for the correct translation
// but when getting it out of the cache make sure iBackDst and
// iForeDst are both still valid. 1 goes to iBackDst, 0 to iForeDst.
// c. just plain jane indexed to indexed or rgb translation.
//
// 3. XO_RGB_SRC - Have to call XLATEOBJ_iXlate to get it translated.
//
// a. XO_TO_MONO - we have saved the iBackColor in ai[0]
// b. just plain jane RGB to indexed. Grab the RGB, find the closest
// match in Dst palette. Lot's of work.
//
// 4. XO_RGB_BOTH - Bit mashing time. Call XLATEOBJ_iXlate
//
// The code is written to quickly recognize the XO_TRIVIAL case, efficiently
// compute and cache the translate table for the type XO_TABLE case, and
// do the correct, expensive work required for cases 3 and 4.
// #define XO_TRIVIAL 0x00000001
// #define XO_TABLE 0x00000002
// #define XO_TO_MONO 0x00000004
// #define XO_FROM_CMYK 0x00000008
// #define XO_DEVICE_ICM 0x00000010
// #define XO_HOST_ICM 0x00000020
#define XLATE_FROM_MONO 0x00000100
#define XLATE_RGB_SRC 0x00000200
#define XLATE_RGB_BOTH 0x00000400
#define XLATE_PAL_MANAGED 0x00000800
#define XLATE_USE_CURRENT 0x00001000
#define XLATE_USE_SURFACE_PAL 0x00002000 // Only used with MultiMonitor system
#define XLATE_USE_FOREGROUND 0x00004000 // Only used with MultiMonitor system
#ifndef GDIFLAGS_ONLY // used for gdikdx
extern "C" ULONG XLATEOBJ_iXlate(XLATEOBJ *pxo, ULONG cIndex);
PXLATE
CreateXlateObject(
HANDLE hcmXform,
LONG lIcmMode,
XEPALOBJ palSrc,
XEPALOBJ palDst,
XEPALOBJ palSrcDC,
XEPALOBJ palDstDC,
ULONG iForeDst,
ULONG iBackDst,
ULONG iBackSrc,
ULONG flCreate
);
PXLATE
pCreateXlate(
ULONG ulNumEntries
);
/*********************************Class************************************\
* EXLATEOBJ
*
* This is the user object for a palette translation table.
*
* History:
* Wed 09-Mar-1994 -by- Patrick Haluptzok [patrickh]
* Get rid of stack object, clean up.
*
* Sun 05-May-1991 -by- Patrick Haluptzok [patrickh]
* add new DDI changes to code, deja vu.
*
* Mon 04-Feb-1991 -by- Patrick Haluptzok [patrickh]
* add DDI changes to code.
*
* Mon 03-Dec-1990 -by- Patrick Haluptzok [patrickh]
* wrote the first pass for NT.
\**************************************************************************/
class EXLATEOBJ
{
protected:
XLATE *pxlate;
public:
EXLATEOBJ() { pxlate = (PXLATE) NULL; }
EXLATEOBJ(PXLATE pxlateNew) { pxlate = pxlateNew; }
~EXLATEOBJ() { vAltUnlock(); }
BOOL bValid() { return(pxlate != (PXLATE) NULL); }
XLATE *pxlo() { return(pxlate); }
VOID vMakeIdentity() { pxlate = &xloIdent; }
PXLATE pInitXlate(PXLATE pxlateN)
{
return(pxlate = pxlateN);
}
PXLATE pCreateXlateObject(ULONG ul)
{
return(pxlate = pCreateXlate(ul));
}
PXLATE pInitXlateNoCache(
HANDLE hcmXform,
LONG lIcmMode,
XEPALOBJ palSrc,
XEPALOBJ palDst,
XEPALOBJ palDstDC,
ULONG iForeDst, // For Mono->Color 0 goes to it
ULONG iBackDst, // For Mono->Color 1 goes to it
ULONG iBackSrc, // For Color->Mono index goes to 1
ULONG flCreate = 0) // Used for Multi-Monitor System
{
//
// Cache ignorant initializer for Xlates. Good for short lived palettes.
//
return(pxlate = CreateXlateObject(
hcmXform,
lIcmMode,
palSrc,
palDst,
palDstDC,
palDstDC,
iForeDst,
iBackDst,
iBackSrc,
flCreate
)
);
}
ULONG iBackSrc() { return(pxlate->iBackSrc); }
ULONG iForeDst() { return(pxlate->iForeDst); }
ULONG iBackDst() { return(pxlate->iBackDst); }
PPALETTE ppalSrc() { return(pxlate->ppalSrc); }
PPALETTE ppalDst() { return(pxlate->ppalDst); }
PPALETTE ppalDstDC() { return(pxlate->ppalDstDC);}
VOID vAltLock(PXLATE pxlateN) { pxlate = (PXLATE) pxlateN;}
VOID vAltUnlock()
{
if (pxlate != (PXLATE) NULL)
{
if (pxlate->lCacheIndex >= 0)
{
//
// It's in the cache
//
ASSERTGDI(pxlate->lCacheIndex < XLATE_CACHE_SIZE, "ERROR not a cache index");
ASSERTGDI(xlateTable[pxlate->lCacheIndex].ulReference != 0, "ERROR xlateindex too small");
InterlockedDecrement((LPLONG) &(xlateTable[pxlate->lCacheIndex].ulReference));
}
else if (pxlate->lCacheIndex == XLATE_CACHE_INVALID)
{
VFREEMEM(pxlate);
}
#if DBG
else
{
ASSERTGDI(pxlate->lCacheIndex == XLATE_CACHE_JOURNAL, "ERROR cacheIndex not valid");
}
#endif
}
}
BOOL bMakeXlate(PUSHORT,XEPALOBJ,SURFACE*,ULONG,ULONG);
BOOL bInitXlateObj(HANDLE hcmXform,
LONG lIcmMode,
XEPALOBJ palSrc,
XEPALOBJ palDst,
XEPALOBJ palSrcDC,
XEPALOBJ palDstDC,
ULONG iForeDst, // For Mono->Color 0 goes to it
ULONG iBackDst, // For Mono->Color 1 goes to it
ULONG iBackSrc, // For Color->Mono index goes to 1
ULONG flCreate = 0); // Used for Multi-Monitor System
VOID vAddToCache(XEPALOBJ palSrc,
XEPALOBJ palDest,
XEPALOBJ palSrcDC,
XEPALOBJ palDestDC);
BOOL bSearchCache(XEPALOBJ palSrc,
XEPALOBJ palDst,
XEPALOBJ palSrcDC,
XEPALOBJ palDstDC,
ULONG iForeDst,
ULONG iBackDst,
ULONG iBackSrc,
ULONG flCreate);
BOOL bCreateXlateFromTable(ULONG cEntries, PULONG pIndices, XEPALOBJ palDst);
VOID vDelete();
};
PBYTE
XLATEOBJ_pGetXlate555(
XLATEOBJ *pxlo
);
BYTE
XLATEOBJ_ulIndexToPalSurf(
XLATEOBJ *,
PBYTE,
ULONG
);
BYTE
XLATEOBJ_RGB32ToPalSurf(
XLATEOBJ *,
PBYTE,
ULONG
);
BYTE
XLATEOBJ_BGR32ToPalSurf(
XLATEOBJ *,
PBYTE,
ULONG
);
BYTE
XLATEOBJ_RGB16_565ToPalSurf(
XLATEOBJ *,
PBYTE,
ULONG
);
BYTE
XLATEOBJ_RGB16_555ToPalSurf(
XLATEOBJ *,
PBYTE,
ULONG
);
typedef BYTE (*PFN_XLATE_RGB_TO_PALETTE)(XLATEOBJ *,PBYTE,ULONG);
/******************************Public*Class********************************\
* class XLATEMEMOBJ
*
* Xlate Memory Object
*
* History:
* 07-Nov-1990 -by- Patrick Haluptzok patrickh
* Wrote it.
\**************************************************************************/
class XLATEMEMOBJ : public EXLATEOBJ /* xlmo */
{
public:
XLATEMEMOBJ(XEPALOBJ palSurf, XEPALOBJ palDC);
~XLATEMEMOBJ();
};
//
// Prototypes for internal functions used in palette management.
//
BOOL
bDeletePalette(
HPAL hpal,
BOOL bCleanup = FALSE,
CLEANUPTYPE cutype = CLEANUP_NONE
);
ULONG
rgbFromColorref(
XEPALOBJ palSurf,
XEPALOBJ palDC,
ULONG crColor
);
ULONG
ulGetNearestIndexFromColorref(
XEPALOBJ palSurf,
XEPALOBJ palDC,
ULONG crColor,
ULONG seSearchExactFirst = SE_DO_SEARCH_EXACT_FIRST
);
ULONG
ulGetMatchingIndexFromColorref(
XEPALOBJ palSurf,
XEPALOBJ palDC,
ULONG crColor
);
ULONG
ulIndexToRGB(
XEPALOBJ palSrc,
XEPALOBJ palDC,
ULONG iSolidColor
);
ULONG
ulColorRefToRGB(
XEPALOBJ palSrc,
XEPALOBJ palDC,
ULONG iSolidColor
);
BOOL
bIsCompatible(
PPALETTE *pppalReference,
PPALETTE ppalBM,
SURFACE *pSurfBM,
HDEV hdev
);
VOID
vDeleteXLATEOBJ(
PXLATE pxlate
);
BOOL
CreateSurfacePal(
XEPALOBJ palSrc,
FLONG iPalType,
ULONG ulNumReserved,
ULONG ulNumPalReg
);
VOID
ParseBits(
FLONG flag,
ULONG *pcRight,
ULONG *pcLeft,
ULONG *pcMiddle,
ULONG cForColor
);
VOID
vMatchAPal(
PDC pdc,
XEPALOBJ palSurf,
XEPALOBJ palDC,
ULONG *pulnPhysChanged,
ULONG *pulnTransChanged
);
PTRANSLATE
ptransMatchAPal(
PDC pdc,
XEPALOBJ palSurf,
XEPALOBJ palDC,
BOOL bForeground,
ULONG *pulnPhysChanged,
ULONG *pulnTransChanged
);
BOOL
bEqualRGB_In_Palette(
XEPALOBJ,
XEPALOBJ
);
PPALETTE
CreatePhysicalPalette(
HDC hdc,
HPALETTE hpal
);
PPALETTE
ppalGetPPal(
HDC hdc,
HPALETTE hpal
);
VOID
vResetSurfacePalette(
HDEV hdev
);
//
// asm accelerator for ulGetNearestPalentry
//
extern "C" {
PPALETTEENTRY
ppalSearchNearestEntry(
PPALETTEENTRY ppalTemp,
CONST PALETTEENTRY palentry,
ULONG cEntries,
PUINT pArrayOfSquares
);
}
PPALETTE
ppalGet_ip(
XEPALOBJ,
HANDLE,
PPDEV
);
#endif
#endif // GDIFLAGS_ONLY used for gdikdx