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.
 
 
 
 
 
 

243 lines
6.5 KiB

/**************************************************************************
*
* Copyright (c) 2000 Microsoft Corporation
*
* Module Name:
*
* VGA color hash table
*
* Abstract:
*
* This module maintains a hash table which holds the 20 VGA colors
* (this includes the 4 which can be modified.)
* The 8bpp halftone code, for example, needs to detect these colors
* so that it doesn't halftone them.
*
* Notes:
*
* The collision algorithm is designed to place very little
* burden on the lookup code. It'll produce bad performance when there
* are many collisions - which is fine since we expect only
* a few collisions at most.
*
* Created:
*
* 04/06/2000 agodfrey
* Created it.
*
**************************************************************************/
#include "precomp.hpp"
// The hash table. VgaColorHash is the actual hash table. It is
// initialized from VgaColorHashInit, and then the 4 magic colors are added.
//
// An entry has the following layout:
//
// Bits 0-23: The RGB color
// Bits 24-29: The palette index for that color. This is an index into
// our logical palette (HTColorPalette).
// Bit 30: FALSE if the entry is empty, TRUE if it is occupied.
// Bit 31: Used for collisions - if this is TRUE, the lookup function
// should continue to the next entry.
ARGB VgaColorHash[VGA_HASH_SIZE];
static ARGB VgaColorHashInit[VGA_HASH_SIZE] = {
0x40000000, 0x00000000, 0x00000000, 0x00000000,
0x44000080, 0x00000000, 0x00000000, 0x500000ff,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x42008000, 0x00000000, 0x00000000, 0x00000000,
0x46008080, 0x00000000, 0x00000000, 0x00000000,
0x5200ffff, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x4e00ff00,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x41800000, 0x00000000, 0x00000000, 0x00000000,
0x45800080, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x43808000, 0x00000000, 0x00000000, 0x00000000,
0x4c808080, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x4fffff00, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x53ffffff,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x51ff00ff, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x47c0c0c0, 0x4dff0000
};
/**************************************************************************
*
* Function Description:
*
* Finds an entry in the table.
*
* Arguments:
*
* color - the color to find
*
* Return Value:
*
* The index corresponding to that color, or 0xff if not found.
*
* Notes:
*
* I don't expect performance-critical code to use this -
* e.g. HalftoneToScreen_sRGB_8_216 needs to do this inline -
* but it's useful for other code.
*
* Created:
*
* 04/08/2000 agodfrey
* Created it.
*
**************************************************************************/
BYTE
VGAHashLookup(
COLORREF color
)
{
UINT hashKey = VGAHashColor(
GetRValue(color),
GetGValue(color),
GetBValue(color)
);
ARGB rgbColor = (GetRValue(color) << 16) |
(GetGValue(color) << 8) |
GetBValue(color);
UINT tblEntry;
do
{
tblEntry = VgaColorHash[hashKey];
if (((tblEntry ^ rgbColor) & 0xffffff) == 0)
{
return (tblEntry >> 24) & 0x3f;
}
if (static_cast<INT>(tblEntry) >= 0)
{
break;
}
hashKey++;
hashKey &= (1 << VGA_HASH_BITS) - 1;
} while (1);
return 0xff;
}
/**************************************************************************
*
* Function Description:
*
* Adds an entry to the hash table. If the same color is already in
* the table, adds nothing.
*
* Arguments:
*
* color - the color to add
* index - the palette index of the color
*
* Return Value:
*
* NONE
*
* Created:
*
* 04/06/2000 agodfrey
* Created it.
*
**************************************************************************/
VOID
VGAHashAddEntry(
COLORREF color,
INT index
)
{
ASSERT ((index >= 0) & (index < 0x40));
if (VGAHashLookup(color) != 0xff)
{
return;
}
UINT hashKey = VGAHashColor(
GetRValue(color),
GetGValue(color),
GetBValue(color)
);
ARGB rgbColor = (GetRValue(color) << 16) |
(GetGValue(color) << 8) |
GetBValue(color);
// Find an empty location
while (VgaColorHash[hashKey] & 0x40000000)
{
// Set the high bit of each occupied location we hit, so that
// the lookup code will find the value we're about to add.
VgaColorHash[hashKey] |= 0x80000000;
hashKey++;
if (hashKey == VGA_HASH_SIZE)
{
hashKey = 0;
}
}
// Store the new entry
VgaColorHash[hashKey] = (rgbColor & 0xffffff) | (index << 24) | 0x40000000;
}
/**************************************************************************
*
* Function Description:
*
* Reinitializes the hash table, and adds the given 4 magic colors.
*
* Arguments:
*
* magicColors - the 4 magic colors
*
* Return Value:
*
* NONE
*
* Created:
*
* 04/06/2000 agodfrey
* Created it.
*
**************************************************************************/
VOID
VGAHashRebuildTable(
COLORREF *magicColors
)
{
GpMemcpy(VgaColorHash, VgaColorHashInit, sizeof(VgaColorHashInit));
VGAHashAddEntry(magicColors[0], 8);
VGAHashAddEntry(magicColors[1], 9);
VGAHashAddEntry(magicColors[2], 10);
VGAHashAddEntry(magicColors[3], 11);
}