Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

Span_AffineLoop.h

Go to the documentation of this file.
00001 /****************************************************************************************/
00002 /*  Span_AffineLoop.H                                                                   */
00003 /*                                                                                      */
00004 /*  Author: Mike Sandige                                                                */
00005 /*  Description:  This is a template to create multiple affine span line drawing        */
00006 /*                routines.  See Span, Span_Factory                                     */
00007 /*                                                                                      */
00008 /*  The contents of this file are subject to the Genesis3D Public License               */
00009 /*  Version 1.01 (the "License"); you may not use this file except in                   */
00010 /*  compliance with the License. You may obtain a copy of the License at                */
00011 /*  http://www.genesis3d.com                                                            */
00012 /*                                                                                      */
00013 /*  Software distributed under the License is distributed on an "AS IS"                 */
00014 /*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */
00015 /*  the License for the specific language governing rights and limitations              */
00016 /*  under the License.                                                                  */
00017 /*                                                                                      */
00018 /*  The Original Code is Genesis3D, released March 25, 1999.                            */
00019 /*  Genesis3D Version 1.1 released November 15, 1999                                 */
00020 /*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */
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) /*R*/ | ((Color&0xFC00)>>5) /*G*/ | ((Color&0xF80000)>>19)/*B*/ );
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) /*R*/ | ((Color&0xF800)>>6) /*G*/ | ((Color&0xF80000)>>19)/*B*/ );
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));     //4444 argb
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                                                         // no texture
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         }

Generated on Tue Sep 30 12:36:24 2003 for GTestAndEngine by doxygen 1.3.2