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.
 
 
 
 
 
 

112 lines
3.6 KiB

//----------------------------------------------------------------------------
//
// rgbmap.cpp
//
// Implements rgb colormap code.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
static int CalculateShift(unsigned long mask);
static unsigned long AllocateColor(void* arg, int red, int green, int blue);
static void FreeColor(void* arg, unsigned long pixel);
RLDDIRGBMap* RLDDICreateRGBMap(unsigned long red_mask,
unsigned long green_mask,
unsigned long blue_mask)
{
RLDDIRGBMap* rgbmap;
if (D3DMalloc((void**) &rgbmap, sizeof(RLDDIRGBMap)))
return NULL;
rgbmap->red_mask = red_mask;
rgbmap->green_mask = green_mask;
rgbmap->blue_mask = blue_mask;
rgbmap->red_shift = CalculateShift(rgbmap->red_mask);
rgbmap->green_shift = CalculateShift(rgbmap->green_mask);
rgbmap->blue_shift = CalculateShift(rgbmap->blue_mask);
rgbmap->alloc.priv = rgbmap;
rgbmap->alloc.allocate_color = AllocateColor;
rgbmap->alloc.free_color = FreeColor;
return rgbmap;
}
// ATTENTION this function should perhaps be packaged up and put in d3dutil
static int RLDDILog2[] = {
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
8,
};
static int CalculateShift(unsigned long mask)
{
int shift, width;
shift = 0;
while ((mask & 1) == 0)
{
shift++;
mask >>= 1;
}
width = RLDDILog2[mask + 1];
return shift - (8 - width);
}
/*
* We can't just use left shift since some CPUs don't treat left shift by
* a negative as right shift (and why should they after all).
*/
#define SHIFT(t, v, s) \
do { \
if (s < 0) \
t = v >> -s; \
else \
t = v << s; \
} while (0)
static unsigned long AllocateColor(void* arg, int red, int green, int blue)
{
RLDDIRGBMap* rgbmap = (RLDDIRGBMap*) arg;
unsigned long pixel;
unsigned long t;
SHIFT(t, red, rgbmap->red_shift);
pixel = t & rgbmap->red_mask;
SHIFT(t, green, rgbmap->green_shift);
pixel |= t & rgbmap->green_mask;
SHIFT(t, blue, rgbmap->blue_shift);
pixel |= t & rgbmap->blue_mask;
return pixel;
}
static void FreeColor(void* arg, unsigned long pixel)
{
}
void RLDDIDestroyRGBMap(RLDDIRGBMap* rgbmap)
{
D3DFree(rgbmap);
}