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.
202 lines
6.8 KiB
202 lines
6.8 KiB
/****************************************************************************/
|
|
// 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;
|
|
}
|
|
|