00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 while(i-- > 0)
00024 {
00025 #if SPANROP & ZTEST
00026 ZFromMap = *(ZMapBits);
00027 if (ZFromMap > (Z>>16))
00028 #endif
00029 {
00030 #if SPANROP & ZSET
00031 *(ZMapBits++) = (ZMAPPIXEL)(Z>>16);
00032 #else
00033 #if SPANROP & ZTEST
00034 ZMapBits++;
00035 #endif
00036 #endif
00037
00038 #if !(( SPANROP & AFLAT) || (SPANROP & AMAP)) // NO alpha
00039 #if (SPANROP & TMAP)
00040 #ifdef TEST_LIGHTMAP
00041 Color = 0xFFFFFF;
00042 #else
00043 Color = Palette[*(TextureBits + ((U>>16)&UMask) + TOPDOWN_OR_BOTTOMUP(((V>>16)&VMask) << StrideShift))];
00044 #endif
00045 #if SPANROP & D565
00046 #ifdef RGB
00047 *(DestBits++) = (DESTPIXEL) ( ((((Color&0xFF)*R)>>15)&0xF800) | (((((Color&0xFF00)>>8)*G)>>20)&0x7E0) | ((((Color&0xFF0000)>>16)*B)>>26) );
00048 #else
00049 *(DestBits++) = (DESTPIXEL) ( ((Color&0xF8)<<8) | ((Color&0xFC00)>>5) | ((Color&0xF80000)>>19) );
00050 #endif
00051 #else
00052 #ifdef RGB
00053 *(DestBits++) = (DESTPIXEL) ( ((((Color&0xFF)*R)>>16)&0x7C00) | (((((Color&0xFF00)>>8)*G)>>21)&0x3E0) | ((((Color&0xFF0000)>>16)*B)>>26) );
00054 #else
00055 *(DestBits++) = (DESTPIXEL) ( ((Color&0xF8)<<7) | ((Color&0xF800)>>6) | ((Color&0xF80000)>>19) );
00056 #endif
00057 #endif
00058
00059 #else
00060 #if SPANROP & D565
00061 #ifdef RGB
00062 *(DestBits++) = (DESTPIXEL) ( ((R>>(RGB_FXP_SHIFTER + 3))<<11) | ((G>>(RGB_FXP_SHIFTER + 2))<<5) | (B>>(RGB_FXP_SHIFTER + 3)) );
00063 #else
00064 *(DestBits++) = (DESTPIXEL) Color;
00065 #endif
00066 #else
00067 #ifdef RGB
00068 *(DestBits++) = (DESTPIXEL)( ((R>>(RGB_FXP_SHIFTER + 3))<<10) | ((G>>(RGB_FXP_SHIFTER + 3))<<5) | (B>>(RGB_FXP_SHIFTER + 3)) );
00069 #else
00070 *(DestBits++) = (DESTPIXEL) Color;
00071 #endif
00072 #endif
00073 #endif
00074 #endif
00075
00076 #if (SPANROP & AFLAT) || (SPANROP & AMAP) // alpha map or alpha flat or both
00077 {
00078 int32 DColor,AR,AG,AB;
00079 #if (SPANROP & AMAP) && (SPANROP & AFLAT)
00080 int32 Alpha,OneMinusAlpha;
00081 #endif
00082
00083 DColor = *DestBits;
00084
00085 #if SPANROP & TMAP
00086 #if (SPANROP & AMAP)
00087 Color = *( ((ALPHAMAPPIXEL *)TextureBits) + ((U>>16)&UMask) + TOPDOWN_OR_BOTTOMUP(((V>>16)&VMask) << StrideShift));
00088 #ifdef RGB // alpha map and rgb shading
00089 AR = (((Color & 0xF00)>>8 ) * R) >>(4+RGB_FXP_SHIFTER);
00090 AG = (((Color & 0x0F0)>>4 ) * G) >>(4+RGB_FXP_SHIFTER);
00091 AB = ( (Color & 0x00F) * B) >>(4+RGB_FXP_SHIFTER);
00092 #else // alpha map only
00093 AR = ((Color & 0xF00)>>4 ) ;
00094 AG = ((Color & 0x0F0) ) ;
00095 AB = ((Color & 0x00F)<<4 ) ;
00096 #endif
00097 #if (SPANROP & AFLAT)
00098 Alpha = ((Color>>12) * A)>>4;
00099 OneMinusAlpha = 16-Alpha;
00100 #else
00101 A = (Color>>12);
00102 OneMinusA = 16-A;
00103 #endif
00104 #else // texture map without alpha
00105 Color = Palette[*(TextureBits + ((U>>16)&UMask) + TOPDOWN_OR_BOTTOMUP(((V>>16)&VMask) << StrideShift))];
00106 #ifdef RGB
00107 AR = (( Color & 0xFF ) * R) >>(8+RGB_FXP_SHIFTER);
00108 AG = (((Color & 0xFF00 )>>8 ) * G) >>(8+RGB_FXP_SHIFTER);
00109 AB = (((Color & 0xFF0000)>>16) * B) >>(8+RGB_FXP_SHIFTER);
00110 #else
00111 AR = (Color & 0xFF );
00112 AG = (Color & 0xFF00 )>>8;
00113 AB = (Color & 0xFF0000)>>16;
00114 #endif
00115 #endif
00116 #else
00117
00118 #ifdef RGB
00119 AR = R >>RGB_FXP_SHIFTER;
00120 AG = G >>RGB_FXP_SHIFTER;
00121 AB = B >>RGB_FXP_SHIFTER;
00122 #else
00123 AR = (Color & 0xFF );
00124 AG = (Color & 0xFF00 )>>8;
00125 AB = (Color & 0xFF0000)>>16;
00126 #endif
00127 #endif
00128
00129 #if (SPANROP & AMAP) && (SPANROP & AFLAT)
00130 #if SPANROP & D565
00131 AR = (((DColor&0xF800)>>8) * OneMinusAlpha) + (AR * Alpha);
00132 AG = (((DColor&0x7E0)>>3) * OneMinusAlpha) + (AG * Alpha);
00133 AB = (((DColor&0x1F)<<3) * OneMinusAlpha) + (AB * Alpha);
00134 *(DestBits++) = (DESTPIXEL) ( ( (AR>>7)<<11) | ( (AG>>6)<<5 ) | (AB>>7) );
00135 #else
00136 AR = (((DColor&0x7C00)>>7) * OneMinusAlpha) + (AR * Alpha);
00137 AG = (((DColor&0x3E0)>>2) * OneMinusAlpha) + (AG * Alpha);
00138 AB = (((DColor&0x1F)<<3) * OneMinusAlpha) + (AB * Alpha);
00139 *(DestBits++) = (DESTPIXEL) ( ( (AR>>7)<<10) | ( (AG>>7)<<5 ) | (AB>>7) );
00140 #endif
00141 #else
00142 #if SPANROP & D565
00143 AR = (((DColor&0xF800)>>8) * OneMinusA) + (AR * A);
00144 AG = (((DColor&0x7E0)>>3) * OneMinusA) + (AG * A);
00145 AB = (((DColor&0x1F)<<3) * OneMinusA) + (AB * A);
00146 *(DestBits++) = (DESTPIXEL) ( ( (AR>>7)<<11) | ( (AG>>6)<<5 ) | (AB>>7) );
00147 #else
00148 AR = (((DColor&0x7C00)>>7) * OneMinusA) + (AR * A);
00149 AG = (((DColor&0x3E0)>>2) * OneMinusA) + (AG * A);
00150 AB = (((DColor&0x1F)<<3) * OneMinusA) + (AB * A);
00151 *(DestBits++) = (DESTPIXEL) ( ( (AR>>7)<<10) | ( (AG>>7)<<5 ) | (AB>>7) );
00152 #endif
00153 #endif
00154
00155 }
00156 #endif
00157
00158 }
00159 #if SPANROP & ZTEST
00160 else
00161 {
00162 ZMapBits++;
00163 DestBits++;
00164 }
00165 #endif
00166
00167 #if SPANROP & TMAP
00168 U += dU;
00169 V += dV;
00170 #endif
00171 #ifdef RGB
00172 R += dR;
00173 G += dG;
00174 B += dB;
00175 #endif
00176 #ifdef ZBUF
00177 Z += dZ;
00178 #endif
00179 }