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
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);
|
|
}
|
|
|
|
|