windows-nt/Source/XPSP1/NT/multimedia/opengl/server/inc/spangen.h
2020-09-26 16:20:57 +08:00

83 lines
2.8 KiB
C

/******************************Module*Header*******************************\
* Module Name: spangen.h
*
* This code figures out the color for pixel and stores it
*
* 14-Oct-1994 mikeke Created
*
* Copyright (c) 1994 Microsoft Corporation
\**************************************************************************/
{
DWORD r, g, b;
DWORD color;
ULONG ditherVal;
if (flags & GEN_DITHER) {
ditherVal = pdither[iDither];
} else {
if ((flags & (GEN_SHADE | GEN_TEXTURE | GEN_RGBMODE)) ==
(GEN_SHADE | GEN_TEXTURE | GEN_RGBMODE)) {
ditherVal = 0x08;
} else {
ditherVal = 0x0000;
}
}
if (!(flags & GEN_RGBMODE)) {
if (BPP == 8) {
color = ((rAccum + ditherVal) >> 16) & 0xff;
} else {
color = ((PULONG)pXlat)[(((rAccum + ditherVal) >> 16) & 0xfff)];
}
} else {
if (flags & GEN_TEXTURE) {
texBits = (texAddr + ((sAccum & sMask) >> 14) +
((tAccum & tMask) >> tShift));
if (flags & GEN_SHADE) {
r = ((ULONG)(gbMulTable[(((rAccum >> rBits) & 0xff00) | texBits[2])] << rBits) + ditherVal) >> 8;
g = ((ULONG)(gbMulTable[(((gAccum >> gBits) & 0xff00) | texBits[1])] << gBits) + ditherVal) >> 8;
b = ((ULONG)(gbMulTable[(((bAccum >> bBits) & 0xff00) | texBits[0])] << bBits) + ditherVal) >> 8;
} else {
if (flags & GEN_DITHER) {
r = ((ULONG)(gbMulTable[(rAccum | texBits[2])] << rBits) + ditherVal) >> 8;
g = ((ULONG)(gbMulTable[(gAccum | texBits[1])] << gBits) + ditherVal) >> 8;
b = ((ULONG)(gbMulTable[(bAccum | texBits[0])] << bBits) + ditherVal) >> 8;
} else {
r = (texBits[2] << rBits) >> 8;
g = (texBits[1] << gBits) >> 8;
b = (texBits[0] << bBits) >> 8;
}
}
} else {
r = (rAccum + ditherVal) >> 16;
g = (gAccum + ditherVal) >> 16;
b = (bAccum + ditherVal) >> 16;
}
color = (r << rShift) |
(g << gShift) |
(b << bShift);
}
if (BPP == 8) {
*pPix = gengc->xlatPalette[color & 0xff];
#ifdef OLDWAY
if ((flags & (GEN_TEXTURE | GEN_SHADE | GEN_DITHER)) ==
GEN_TEXTURE) {
*pPix = (BYTE)color;
} else {
*pPix = (BYTE)pXlat[color & 0xff];
}
#endif
} else if (BPP == 16) {
*((WORD *)pPix) = (USHORT)color;
} else if (BPP == 24) {
*pPix = (BYTE)color;
*(pPix + 1) = (BYTE)(color >> 8);
*(pPix + 2) = (BYTE)(color >> 16);
} else {
*((DWORD *)pPix) = color;
}
}