Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

270 lines
10 KiB

/******************************Module*Header*******************************\
* Module Name: texspan2.h
*
* Calculate the textured pixel, and write the value to the framebuffer.
*
* 22-Nov-1995 ottob Created
*
* Copyright (c) 1995 Microsoft Corporation
\**************************************************************************/
{
DWORD r, g, b;
#if (FLAT_SHADING || SMOOTH_SHADING)
#if (BPP == 8)
ULONG ditherVal = pdither[((ULONG_PTR)pPix) & 0x3];
#elif (BPP == 16)
ULONG ditherVal = pdither[((ULONG_PTR)pPix & 0x6) >> 1];
#endif
#endif
#if PALETTE_ENABLED
if (bPalette) {
texBits = ((BYTE *)TEX_IMAGE +
((sResult & GENACCEL(gengc).sMask) >> S_SHIFT_PAL) +
((tResult & TMASK_SUBDIV) >> T_SHIFT_PAL));
texBits = (BYTE *)((ULONG *)TEX_PALETTE + *texBits);
} else {
texBits = ((BYTE *)TEX_IMAGE +
((sResult & GENACCEL(gengc).sMask) >> S_SHIFT) +
((tResult & TMASK_SUBDIV) >> T_SHIFT));
}
#elif PALETTE_ONLY
texBits = ((BYTE *)TEX_IMAGE +
((sResult & GENACCEL(gengc).sMask) >> S_SHIFT_PAL) +
((tResult & TMASK_SUBDIV) >> T_SHIFT_PAL));
texBits = (BYTE *)((ULONG *)TEX_PALETTE + *texBits);
#else
texBits = ((BYTE *)TEX_IMAGE +
((sResult & GENACCEL(gengc).sMask) >> S_SHIFT) +
((tResult & TMASK_SUBDIV) >> T_SHIFT));
#endif
sResult += subDs;
tResult += subDt;
#if (FAST_REPLACE)
{
#if (ALPHA)
if (texBits[3] != 0) {
if (texBits[3] != 0xff) {
texBits = (texBits - GENACCEL(gengc).texImageReplace +
(BYTE *)GENACCEL(gengc).texPalette);
ALPHA_NOMODULATE
ALPHA_READ
#if (BPP == 32)
r = (((gbMulTable[aDisplay | texBits[2]] + rDisplay) << 8) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = (((gbMulTable[aDisplay | texBits[2]] + rDisplay) << 8) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = (((gbMulTable[aDisplay | texBits[1]] + gDisplay) << 8) >> GRIGHTSHIFTADJ) & GMASK;
b = (((gbMulTable[aDisplay | texBits[0]] + bDisplay) << 8) >> BRIGHTSHIFTADJ) & BMASK;
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
} else {
#if (BPP > 16)
ULONG texel = *((ULONG *)texBits);
#endif
#if (BPP == 8)
*pPix = *texBits;
#elif (BPP == 16)
*((USHORT *)pPix) = *((USHORT *)texBits);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)texel;
pPix[2] = (BYTE)(texel >> 16);
#endif
}
}
#else
{
#if (BPP > 16)
ULONG texel = *((ULONG *)texBits);
#endif
#if (BPP == 8)
*pPix = *texBits;
#elif (BPP == 16)
*((USHORT *)pPix) = *((USHORT *)texBits);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)texel;
pPix[2] = (BYTE)(texel >> 16);
#endif
}
#endif
}
#elif (REPLACE)
{
#if (ALPHA)
if (texBits[3] != 0) {
if (texBits[3] != 0xff) {
ALPHA_NOMODULATE
ALPHA_READ
#if (BPP == 32)
r = (((gbMulTable[aDisplay | texBits[2]] + rDisplay) << 8) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = (((gbMulTable[aDisplay | texBits[2]] + rDisplay) << 8) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = (((gbMulTable[aDisplay | texBits[1]] + gDisplay) << 8) >> GRIGHTSHIFTADJ) & GMASK;
b = (((gbMulTable[aDisplay | texBits[0]] + bDisplay) << 8) >> BRIGHTSHIFTADJ) & BMASK;
} else {
#if (BPP == 32)
r = ((texBits[2] << 8) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = ((texBits[2] << 8) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = ((texBits[1] << 8) >> GRIGHTSHIFTADJ) & GMASK;
b = ((texBits[0] << 8) >> BRIGHTSHIFTADJ) & BMASK;
}
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
}
#else
#if (BPP != 32)
r = ((texBits[2] << 8) >> RRIGHTSHIFTADJ) & RMASK;
g = ((texBits[1] << 8) >> GRIGHTSHIFTADJ) & GMASK;
b = ((texBits[0] << 8) >> BRIGHTSHIFTADJ) & BMASK;
#endif
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = *((USHORT *)texBits);
pPix[2] = (BYTE)texBits[2];
#endif
#endif
}
#elif (FLAT_SHADING)
{
#if (ALPHA)
if (texBits[3] != 0) {
ALPHA_MODULATE;
ALPHA_READ;
#if (BPP == 32)
r = ((((gbMulTable[aDisplay | gbMulTable[rAccum | texBits[2]]] + rDisplay) << (8+RBITS)) + ditherVal) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = ((((gbMulTable[aDisplay | gbMulTable[rAccum | texBits[2]]] + rDisplay) << (8+RBITS)) + ditherVal) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = ((((gbMulTable[aDisplay | gbMulTable[gAccum | texBits[1]]] + gDisplay) << (8+GBITS)) + ditherVal) >> GRIGHTSHIFTADJ) & GMASK;
b = ((((gbMulTable[aDisplay | gbMulTable[bAccum | texBits[0]]] + bDisplay) << (8+BBITS)) + ditherVal) >> BRIGHTSHIFTADJ) & BMASK;
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
}
#else
#if (BPP == 32)
r = (((gbMulTable[rAccum | texBits[2]] << (8+RBITS)) + ditherVal) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = (((gbMulTable[rAccum | texBits[2]] << (8+RBITS)) + ditherVal) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = (((gbMulTable[gAccum | texBits[1]] << (8+GBITS)) + ditherVal) >> GRIGHTSHIFTADJ) & GMASK;
b = (((gbMulTable[bAccum | texBits[0]] << (8+BBITS)) + ditherVal) >> BRIGHTSHIFTADJ) & BMASK;
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
#endif
}
#else // SMOOTH_SHADING
{
#if (ALPHA)
if (texBits[3] != 0) {
ALPHA_MODULATE;
ALPHA_READ;
#if (BPP == 32)
r = ((((gbMulTable[aDisplay | gbMulTable[((rAccum >> RBITS) & 0xff00) | texBits[2]]] + rDisplay) << (8+RBITS)) + ditherVal) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = ((((gbMulTable[aDisplay | gbMulTable[((rAccum >> RBITS) & 0xff00) | texBits[2]]] + rDisplay) << (8+RBITS)) + ditherVal) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = ((((gbMulTable[aDisplay | gbMulTable[((gAccum >> GBITS) & 0xff00) | texBits[1]]] + gDisplay) << (8+GBITS)) + ditherVal) >> GRIGHTSHIFTADJ) & GMASK;
b = ((((gbMulTable[aDisplay | gbMulTable[((bAccum >> BBITS) & 0xff00) | texBits[0]]] + bDisplay) << (8+BBITS)) + ditherVal) >> BRIGHTSHIFTADJ) & BMASK;
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
}
#else
#if (BPP == 32)
r = (((gbMulTable[((rAccum >> RBITS) & 0xff00) | texBits[2]] << (8+RBITS)) + ditherVal) << -RRIGHTSHIFTADJ) & RMASK;
#else
r = (((gbMulTable[((rAccum >> RBITS) & 0xff00) | texBits[2]] << (8+RBITS)) + ditherVal) >> RRIGHTSHIFTADJ) & RMASK;
#endif
g = (((gbMulTable[((gAccum >> GBITS) & 0xff00) | texBits[1]] << (8+GBITS)) + ditherVal) >> GRIGHTSHIFTADJ) & GMASK;
b = (((gbMulTable[((bAccum >> BBITS) & 0xff00) | texBits[0]] << (8+BBITS)) + ditherVal) >> BRIGHTSHIFTADJ) & BMASK;
#if (BPP == 8)
*pPix = gengc->xlatPalette[r | g | b];
#elif (BPP == 16)
*((USHORT *)pPix) = (USHORT)(r | g | b);
#else
*((USHORT UNALIGNED *)pPix) = (USHORT)(g | b);
pPix[2] = (BYTE)(r >> 16);
#endif
#endif
}
#endif
}