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.
|
|
/******************************Module*Header*******************************\
* Module Name: texspan.h * * Main header file for textured spans. * * 22-Nov-1995 ottob Created * * Copyright (c) 1995 Microsoft Corporation \**************************************************************************/
typedef LONG FIXED16;
#define RMASK (((1 << RBITS) - 1) << RSHIFT)
#define GMASK (((1 << GBITS) - 1) << GSHIFT)
#define BMASK (((1 << BBITS) - 1) << BSHIFT)
#if (REPLACE || FAST_REPLACE)
#define RRIGHTSHIFTADJ (16 - (RSHIFT + RBITS))
#define GRIGHTSHIFTADJ (16 - (GSHIFT + GBITS))
#define BRIGHTSHIFTADJ (16 - (BSHIFT + BBITS))
#else
#define RRIGHTSHIFTADJ (16 - (RSHIFT))
#define GRIGHTSHIFTADJ (16 - (GSHIFT))
#define BRIGHTSHIFTADJ (16 - (BSHIFT))
#endif
#define S_SHIFT_PAL 16
#define T_SHIFT_PAL 6
#define TMASK_SUBDIV GENACCEL(gengc).tMaskSubDiv
#define TSHIFT_SUBDIV GENACCEL(gengc).tShiftSubDiv
#if (FAST_REPLACE)
#define TEX_PALETTE GENACCEL(gengc).texImageReplace
#if (PALETTE_ONLY)
#define TEX_IMAGE GENACCEL(gengc).texImage
#else
#define TEX_IMAGE GENACCEL(gengc).texImageReplace
#endif
#if (PALETTE_ONLY)
#define S_SHIFT S_SHIFT_PAL
#define T_SHIFT 6
#elif (BPP == 8)
#define S_SHIFT 16
#define T_SHIFT 6
#else
#define S_SHIFT 15
#define T_SHIFT 5
#endif
#else
#if (PALETTE_ONLY)
#define S_SHIFT S_SHIFT_PAL
#define T_SHIFT 6
#else
#define S_SHIFT 14
#define T_SHIFT 4
#endif
#define TEX_IMAGE GENACCEL(gengc).texImage
#define TEX_PALETTE GENACCEL(gengc).texPalette
#endif
#define ALPHA_MODULATE \
aDisplay = (ULONG)(gbMulTable[((aAccum >> 8) & 0xff00) | texBits[3]]) << 8;
#define ALPHA_NOMODULATE \
aDisplay = ((ULONG)texBits[3] << 8);
#define ALPHA_READ_8 \
{\ ULONG pix = (ULONG)gengc->pajInvTranslateVector[*pPix];\ ULONG alphaVal = (0xff00 - aDisplay);\ \ rDisplay = gbMulTable[((pix & RMASK) << (GBITS + BBITS)) | alphaVal];\ gDisplay = gbMulTable[((pix & GMASK) << (BBITS)) | alphaVal];\ bDisplay = gbMulTable[(pix & BMASK) | alphaVal];\ }
#define ALPHA_READ_16 \
{\ ULONG pix = *((USHORT *)pPix);\ ULONG alphaVal = (0xff00 - aDisplay);\ \ rDisplay = gbMulTable[((pix & RMASK) >> (RSHIFT - (8 - RBITS))) | alphaVal];\ gDisplay = gbMulTable[((pix & GMASK) >> (GSHIFT - (8 - GBITS))) | alphaVal];\ bDisplay = gbMulTable[((pix & BMASK) << (8 - BBITS)) | alphaVal];\ }
#define ALPHA_READ_32 \
{\ ULONG alphaVal = (0xff00 - aDisplay);\ \ rDisplay = gbMulTable[pPix[2] | alphaVal];\ gDisplay = gbMulTable[pPix[1] | alphaVal];\ bDisplay = gbMulTable[pPix[0] | alphaVal];\ }
#if (BPP == 8)
#define ALPHA_READ ALPHA_READ_8
#elif (BPP == 16)
#define ALPHA_READ ALPHA_READ_16
#else
#define ALPHA_READ ALPHA_READ_32
#endif
#undef STRING1
#undef STRING2
#undef STRING3
#undef STRING4
#if FAST_REPLACE
#if PALETTE_ONLY
#define STRING1 __fastFastPerspPalReplace
#else
#define STRING1 __fastFastPerspReplace
#endif
#elif REPLACE
#if (PALETTE_ONLY)
#define STRING1 __fastPerspPalReplace
#else
#define STRING1 __fastPerspReplace
#endif
#elif FLAT_SHADING
#define STRING1 __fastPerspFlat
#else
#define STRING1 __fastPerspSmooth
#endif
#if ALPHA
#define STRING2 Alpha
#endif
#if ZBUFFER
#if (ZCMP_L)
#define STRING3 Zlt
#else
#define STRING3 Zle
#endif
#endif
#if (BPP == 8)
#define STRING4 332
#elif (BPP == 16)
#if (GBITS == 5)
#define STRING4 555
#else
#define STRING4 565
#endif
#else
#define STRING4 888
#endif
#ifdef STRING2
#ifdef STRING3
void FASTCALL STRCAT4(STRING1, STRING2, STRING3, STRING4) #else
void FASTCALL STRCAT3(STRING1, STRING2, STRING4) #endif
#else
#ifdef STRING3
void FASTCALL STRCAT3(STRING1, STRING3, STRING4) #else
void FASTCALL STRCAT2(STRING1, STRING4) #endif
#endif
(__GLGENcontext *gengc) { __GLfloat qwInv; ULONG count; LONG subDivCount; FIXED16 sAccum; FIXED16 tAccum; __GLfloat qwAccum; FIXED16 subDs, subDt; FIXED16 sResult, tResult; FIXED16 sResultNew, tResultNew; BYTE *pPix; BYTE *texAddr; BYTE *texBits; #if ALPHA
ULONG rDisplay, gDisplay, bDisplay, aDisplay; #endif
#if (FLAT_SHADING || SMOOTH_SHADING)
PDWORD pdither; FIXED16 rAccum, gAccum, bAccum; #if (ALPHA)
FIXED16 aAccum; #endif
#endif
#if (BPP == 32)
ULONG pixAdj; #if (FLAT_SHADING || SMOOTH_SHADING)
ULONG ditherVal; #endif
#endif
#if PALETTE_ENABLED
BOOL bPalette = (GENACCEL(gengc).texPalette != NULL); #endif
BOOL bOrtho = (GENACCEL(gengc).flags & GEN_TEXTURE_ORTHO);
if (!bOrtho) { if (CASTINT(gengc->gc.polygon.shader.frag.qw) <= 0) gengc->gc.polygon.shader.frag.qw = (__GLfloat)1.0; __GL_FLOAT_BEGIN_DIVIDE(__glOne, gengc->gc.polygon.shader.frag.qw, &qwInv); }
subDivCount = 7; sAccum = GENACCEL(gengc).spanValue.s; tAccum = GENACCEL(gengc).spanValue.t; qwAccum = gengc->gc.polygon.shader.frag.qw; #if (FLAT_SHADING)
rAccum = ((GENACCEL(gengc).spanValue.r >> RBITS) & 0xff00); gAccum = ((GENACCEL(gengc).spanValue.g >> GBITS) & 0xff00); bAccum = ((GENACCEL(gengc).spanValue.b >> BBITS) & 0xff00); #if (ALPHA)
aAccum = GENACCEL(gengc).spanValue.a; #endif
#elif (SMOOTH_SHADING)
rAccum = GENACCEL(gengc).spanValue.r; gAccum = GENACCEL(gengc).spanValue.g; bAccum = GENACCEL(gengc).spanValue.b; #if ALPHA
aAccum = GENACCEL(gengc).spanValue.a; #endif
#endif
#if ((BPP == 32) && (FLAT_SHADING || SMOOTH_SHADING))
ditherVal = ditherShade[0]; #endif
if (!bOrtho) { __GL_FLOAT_SIMPLE_END_DIVIDE(qwInv); sResult = FTOL((__GLfloat)sAccum * qwInv); tResult = ((FTOL((__GLfloat)tAccum * qwInv)) >> TSHIFT_SUBDIV) & ~7; qwAccum += GENACCEL(gengc).qwStepX; if (CASTINT(qwAccum) <= 0) qwAccum = (__GLfloat)1.0; __GL_FLOAT_SIMPLE_BEGIN_DIVIDE(__glOne, qwAccum, qwInv); } else { sResult = sAccum; tResult = (tAccum >> TSHIFT_SUBDIV) & ~7; } sAccum += GENACCEL(gengc).sStepX; tAccum += GENACCEL(gengc).tStepX;
if (GENACCEL(gengc).flags & SURFACE_TYPE_DIB) { #if (BPP != 32)
pPix = GENACCEL(gengc).pPix + gengc->gc.polygon.shader.frag.x * (BPP / 8); #else
if (GENACCEL(gengc).bpp == 32) { pPix = GENACCEL(gengc).pPix + gengc->gc.polygon.shader.frag.x * 4; pixAdj = 4; } else { pPix = GENACCEL(gengc).pPix + gengc->gc.polygon.shader.frag.x * 3; pixAdj = 3; } #endif
} else { pPix = gengc->ColorsBits; #if (BPP == 32)
pixAdj = GENACCEL(gengc).xMultiplier; #endif
}
#if (FLAT_SHADING || SMOOTH_SHADING)
#if (BPP != 32)
pdither = (gengc->gc.polygon.shader.frag.y & 0x3) * 8 + ditherShade + (((gengc->gc.polygon.shader.frag.x & 0x3) - (((ULONG_PTR)pPix / (BPP / 8)) & 0x3)) & 0x3); #endif
#endif
if (!bOrtho) { __GL_FLOAT_SIMPLE_END_DIVIDE(qwInv); sResultNew = FTOL((__GLfloat)sAccum * qwInv); tResultNew = ((FTOL((__GLfloat)tAccum * qwInv)) >> TSHIFT_SUBDIV) & ~7; qwAccum += GENACCEL(gengc).qwStepX; if (CASTINT(qwAccum) <= 0) qwAccum = (__GLfloat)1.0; __GL_FLOAT_SIMPLE_BEGIN_DIVIDE(__glOne, qwAccum, qwInv); } else { sResultNew = sAccum; tResultNew = (tAccum >> TSHIFT_SUBDIV) & ~7; }
sAccum += GENACCEL(gengc).sStepX; tAccum += GENACCEL(gengc).tStepX;
subDs = (sResultNew - sResult) >> 3; subDt = (tResultNew - tResult) >> 3;
#if ZBUFFER
{ GLuint zAccum = gengc->gc.polygon.shader.frag.z; GLint zDelta = gengc->gc.polygon.shader.dzdx; PBYTE zbuf = (PBYTE)gengc->gc.polygon.shader.zbuf;
if (GENACCEL(gengc).flags & GEN_LESS) { for (count = gengc->gc.polygon.shader.length;;) { if ( ((__GLz16Value)(zAccum >> Z16_SHIFT)) < *((__GLz16Value*)zbuf) ) { *((__GLz16Value*)zbuf) = ((__GLz16Value)(zAccum >> Z16_SHIFT)); #include "texspan2.h"
} if (--count == 0) goto exit; zbuf += 2; zAccum += zDelta; #include "texspan3.h"
} } else { for (count = gengc->gc.polygon.shader.length;;) { if ( ((__GLz16Value)(zAccum >> Z16_SHIFT)) <= *((__GLz16Value*)zbuf) ) { *((__GLz16Value*)zbuf) = ((__GLz16Value)(zAccum >> Z16_SHIFT)); #include "texspan2.h"
} if (--count == 0) goto exit; zbuf += 2; zAccum += zDelta; #include "texspan3.h"
} } } #else
for (count = gengc->gc.polygon.shader.length;;) { #include "texspan2.h"
if (--count == 0) goto exit; #include "texspan3.h"
} #endif
exit: if (!bOrtho) { __GL_FLOAT_SIMPLE_END_DIVIDE(qwInv); } }
#undef RMASK
#undef GMASK
#undef BMASK
#undef RRIGHTSHIFTADJ
#undef GRIGHTSHIFTADJ
#undef BRIGHTSHIFTADJ
#undef ALPHA_MODULATE
#undef ALPHA_NOMODULATE
#undef ALPHA_READ_8
#undef ALPHA_READ_16
#undef ALPHA_READ_32
#undef ALPHA_READ
#undef S_SHIFT
#undef T_SHIFT
#undef TMASK_SUBDIV
#undef TSHIFT_SUBDIV
#undef TEX_IMAGE
#undef TEX_PALETTE
#undef S_SHIFT_PAL
#undef T_SHIFT_PAL
|