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.
165 lines
4.7 KiB
165 lines
4.7 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: palddi.cxx
|
|
*
|
|
* provides driver callbacks for palette management.
|
|
*
|
|
* Created: 06-Dec-1990 11:16:58
|
|
* Author: Patrick Haluptzok patrickh
|
|
*
|
|
* Copyright (c) 1990-1999 Microsoft Corporation
|
|
\**************************************************************************/
|
|
|
|
#include "precomp.hxx"
|
|
|
|
/******************************Public*Routine******************************\
|
|
* EngCreatePalette
|
|
*
|
|
* This is the engine entry point for device drivers to create palettes.
|
|
*
|
|
* History:
|
|
* 05-Feb-1991 -by- Patrick Haluptzok patrickh
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
HPALETTE EngCreatePalette(
|
|
ULONG iMode,
|
|
ULONG cColors,
|
|
PULONG pulColors,
|
|
FLONG flRed,
|
|
FLONG flGre,
|
|
FLONG flBlu)
|
|
{
|
|
HPALETTE hpal = (HPALETTE) 0;
|
|
BOOL bUMPD = iMode & UMPD_FLAG;
|
|
PALMEMOBJ pal;
|
|
|
|
iMode = iMode & ~UMPD_FLAG;
|
|
|
|
// If PAL_BITFIELDS, check to see if we can substitute one of the
|
|
// special cases PAL_RGB or PAL_BGR.
|
|
|
|
if ( (iMode == PAL_BITFIELDS) && (flGre == 0x0000ff00) &&
|
|
( ((flRed == 0x000000ff) && (flBlu == 0x00ff0000)) ||
|
|
((flRed == 0x00ff0000) && (flBlu == 0x000000ff)) ) )
|
|
{
|
|
iMode = (flRed == 0x000000ff) ? PAL_RGB : PAL_BGR;
|
|
}
|
|
|
|
// We default to assuming it's fixed palette and then at EngAssociate
|
|
// time we look at his pdev and decide if this guy is more capable
|
|
// than that and set the palette up accordingly.
|
|
|
|
if (pal.bCreatePalette(iMode, cColors, pulColors,
|
|
flRed, flGre, flBlu, PAL_FIXED))
|
|
{
|
|
pal.vKeepIt();
|
|
hpal = (HPALETTE)pal.hpal();
|
|
pal.ppalSet(NULL); // Leave a reference count of 1 so that we
|
|
// can do vUnrefPalette() in EngDeletePalette
|
|
|
|
if (bUMPD)
|
|
{
|
|
GreSetPaletteOwner(hpal, OBJECT_OWNER_CURRENT);
|
|
}
|
|
}
|
|
|
|
return(hpal);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* EngQueryPalette
|
|
*
|
|
* This is the engine entry point for device drivers to query palettes.
|
|
* This is intended mostly for remote-control drivers such as NetMeeting
|
|
* to determine the palette type of the primary display.
|
|
*
|
|
* Note that the driver has to look at GCAPS_PALMANAGED to determine
|
|
* whether it's a fixed palette or not.
|
|
*
|
|
* History:
|
|
* 04-Jan-1997 -by- J. Andrew Goossen andrewgo
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
ULONG EngQueryPalette(
|
|
HPALETTE hpal,
|
|
ULONG *piMode,
|
|
ULONG cColors,
|
|
ULONG *pulColors)
|
|
{
|
|
ULONG ulRet = 0;
|
|
|
|
EPALOBJ pal(hpal);
|
|
if (pal.bValid())
|
|
{
|
|
*piMode
|
|
= pal.flPal() & (PAL_INDEXED | PAL_BITFIELDS | PAL_RGB | PAL_BGR);
|
|
|
|
if (pal.cEntries() != 0)
|
|
{
|
|
// It's palettized:
|
|
|
|
ulRet = pal.ulGetEntries(0, cColors, (PALETTEENTRY*) pulColors, TRUE);
|
|
}
|
|
else
|
|
{
|
|
// It's bitfields:
|
|
|
|
ulRet = 3;
|
|
|
|
if ((cColors >= 3) && (pulColors != NULL))
|
|
{
|
|
*(pulColors) = pal.flRed();
|
|
*(pulColors + 1) = pal.flGre();
|
|
*(pulColors + 2) = pal.flBlu();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WARNING("EngQueryPalette -- Invalid palette");
|
|
}
|
|
|
|
return(ulRet);
|
|
}
|
|
|
|
/******************************Public*Routine******************************\
|
|
* EngDeletePalette
|
|
*
|
|
* Driver entry point for deleting palettes it has created
|
|
*
|
|
* History:
|
|
* 05-Feb-1991 -by- Patrick Haluptzok patrickh
|
|
* Wrote it.
|
|
\**************************************************************************/
|
|
|
|
BOOL EngDeletePalette(HPALETTE hpal)
|
|
{
|
|
BOOL b = FALSE;
|
|
|
|
EPALOBJ palobj(hpal);
|
|
if (palobj.bValid() && !palobj.bIsPalDC())
|
|
{
|
|
// First, undo the alt-lock we just did by invoking EPALOBJ:
|
|
|
|
DEC_SHARE_REF_CNT(palobj.ppalGet());
|
|
|
|
// Device dependent bitmaps for RGB colour depths have their palettes
|
|
// pointing to the surface's primary palette. With dynamic colour
|
|
// depth changing, we want to keep those palette references around
|
|
// even after the primary surface is deleted.
|
|
//
|
|
// This means that during the dynamic mode change, the palette should
|
|
// not be deleted when the old instance of the driver asks it to be
|
|
// deleted, but instead when the last bitmap referencing the palette
|
|
// is deleted. Having everyone use 'vUnrefPalette' makes this Just
|
|
// Work.
|
|
|
|
palobj.vUnrefPalette();
|
|
|
|
b = TRUE;
|
|
}
|
|
|
|
return(b);
|
|
}
|
|
|