Windows2003-3790/termsrv/drivers/rdp/rdpdd/npmdisp.c
2020-09-30 16:53:55 +02:00

203 lines
6.8 KiB
C

/****************************************************************************/
// npmdisp.c
//
// RDP Palette Manager display driver code.
//
// Copyright (C) 1997-2000 Microsoft Corporation
/****************************************************************************/
#include <precmpdd.h>
#define hdrstop
#define TRC_FILE "npmdisp"
#include <adcg.h>
#include <atrcapi.h>
#include <apmapi.h>
#include <nddapi.h>
#include <npmdisp.h>
#include <nsbcdisp.h>
#define DC_INCLUDE_DATA
#include <ndddata.c>
#undef DC_INCLUDE_DATA
#include <nsbcinl.h>
/****************************************************************************/
// PM_InitShm
//
// Alloc-time SHM init.
/****************************************************************************/
void RDPCALL PM_InitShm(PDD_PDEV pPDev)
{
int i;
DC_BEGIN_FN("PM_InitShm");
DC_IGNORE_PARAMETER(pPDev);
// There are several options here:
// - Connecting or reconnecting to a 4bpp client: we need to create a
// default VGA palette.
// - Connecting or reconnecting to an 8bpp client: it doesn't really
// matter what we do here as the first call to DrvSetPalette() will
// overwrite anything we set up.
// - Shadowing a console session: if the console's primary monitor is
// >8bpp, DrvSetPalette will never get called. Our chained console DD
// always runs at 8bpp so we set up an 8bpp rainbow palette which also
// contains the standard windows colors.
if (!ddConsole) {
// This is a connect or reconnect to a non-console session.
TRC_NRM((TB, "Create default 4BPP palette"));
for (i = 16; i < 248; i++) {
// Fill unused slots with some shade of pink.
pddShm->pm.palette[i].rgbBlue = 255;
pddShm->pm.palette[i].rgbGreen = 128;
pddShm->pm.palette[i].rgbRed = 128;
}
// Copy real VGA colors
// - copy entire 16-color palette into slots 0-15
// - copy high colors (8-15) into high end of palette (240-255)
memcpy(&(pddShm->pm.palette[0]),
ddDefaultVgaPalette,
sizeof(ddDefaultVgaPalette));
memcpy(&(pddShm->pm.palette[248]),
&(ddDefaultVgaPalette[8]),
sizeof(* ddDefaultVgaPalette) * 8);
}
else {
// This is a chained console DD -- this always runs at 8bpp and we
// must create a default rainbow palette.
PALETTEENTRY *ppalTmp;
ULONG ulLoop;
BYTE jRed;
BYTE jGre;
BYTE jBlu;
TRC_NRM((TB, "Create default 8BPP rainbow palette"));
// cColors == 256
// Generate 256 (8*8*4) RGB combinations to fill the palette
jRed = 0;
jGre = 0;
jBlu = 0;
ppalTmp = (PALETTEENTRY *)(pddShm->pm.palette);
for (ulLoop = 256; ulLoop != 0; ulLoop--) {
// JPB: The values used in the default rainbow set of colors do
// not particularly matter. However, we do not want any of the
// entries to match entries in the default VGA colors.
// Therefore we tweak the color values slightly to ensure that
// there are no matches.
ppalTmp->peRed = ((jRed == 0) ? (jRed+1) : (jRed-1));
ppalTmp->peGreen = ((jGre == 0) ? (jGre+1) : (jGre-1));
ppalTmp->peBlue = ((jBlu == 0) ? (jBlu+1) : (jBlu-1));
ppalTmp->peFlags = 0;
ppalTmp++;
if (!(jRed += 32))
if (!(jGre += 32))
jBlu += 64;
}
// Now copy in the system colors.
memcpy(&(pddShm->pm.palette[0]),
ddDefaultPalette,
sizeof(* ddDefaultPalette) * 10);
memcpy(&(pddShm->pm.palette[246]),
&(ddDefaultPalette[10]),
sizeof(* ddDefaultPalette) * 10);
}
pddShm->pm.paletteChanged = TRUE;
DC_END_FN();
}
/****************************************************************************/
// DrvSetPalette - see NT DDK documentation.
/****************************************************************************/
BOOL DrvSetPalette(
DHPDEV dhpdev,
PALOBJ *ppalo,
FLONG fl,
ULONG iStart,
ULONG cColors)
{
BOOL rc = FALSE;
PDD_PDEV ppdev = (PDD_PDEV)dhpdev;
unsigned numColorsReturned;
UINT32 length;
DC_BEGIN_FN("DrvSetPalette");
#ifdef DC_DEBUG
if (ppdev->cClientBitsPerPel > 8) {
TRC_ERR((TB, "Unexpected palette operation when in high color mode"));
}
#endif
if (ddConnected && pddShm != NULL) {
// Check that the parameters are within range.
if ((iStart + cColors) <= PM_NUM_8BPP_PAL_ENTRIES) {
// Get the palette colors into PDEV.
numColorsReturned = PALOBJ_cGetColors(ppalo, iStart, cColors,
(ULONG*)&(ppdev->Palette[iStart]));
if (numColorsReturned == cColors) {
// See if these new entries are actually different to the old
// ones by comparing the colors we've just put in the PDEV with
// the ones that we're about to update in the shared memory.
length = cColors * sizeof(PALETTEENTRY);
if (memcmp(&(pddShm->pm.palette[iStart]),
&(ppdev->Palette[iStart]), length)) {
// The colors have changed - copy them into the shared
// memory.
memcpy(&(pddShm->pm.palette[iStart]),
&(ppdev->Palette[iStart]), length);
// Set flags to indicate that the palette has changed.
pddShm->pm.paletteChanged = TRUE;
// Inform the SBC.
SBC_PaletteChanged();
TRC_ALT((TB, "Palette changed"));
}
else {
// The palette hasn't actually changed at all. This is
// slightly unusual, but not an error condition, so we
// return TRUE.
TRC_ALT((TB, "%lu new colors at index %lu haven't changed "
"palette - not sending.", cColors, iStart));
}
rc = TRUE;
}
else {
TRC_ERR((TB, "numColorsReturned(%u) cColors(%u)",
numColorsReturned, cColors));
}
}
else {
TRC_ERR((TB, "Invalid params: iStart(%u) cColors(%u)",
iStart, cColors));
}
}
else {
TRC_ERR((TB, "Called when disconnected"));
}
DC_END_FN();
return rc;
}