]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - misc/mediasource/netradiant-src/libs/ddslib/ddslib.c
Rename mediasource to source
[voretournament/voretournament.git] / misc / mediasource / netradiant-src / libs / ddslib / ddslib.c
diff --git a/misc/mediasource/netradiant-src/libs/ddslib/ddslib.c b/misc/mediasource/netradiant-src/libs/ddslib/ddslib.c
deleted file mode 100644 (file)
index 424faee..0000000
+++ /dev/null
@@ -1,781 +0,0 @@
-/* -----------------------------------------------------------------------------
-
-DDS Library 
-
-Based on code from Nvidia's DDS example:
-http://www.nvidia.com/object/dxtc_decompression_code.html
-
-Copyright (c) 2003 Randy Reddig
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-Redistributions of source code must retain the above copyright notice, this list
-of conditions and the following disclaimer.
-
-Redistributions in binary form must reproduce the above copyright notice, this
-list of conditions and the following disclaimer in the documentation and/or
-other materials provided with the distribution.
-
-Neither the names of the copyright holders nor the names of its contributors may
-be used to endorse or promote products derived from this software without
-specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
------------------------------------------------------------------------------ */
-
-
-
-/* marker */
-#define DDSLIB_C
-
-
-
-/* dependencies */
-#include "ddslib.h"
-
-
-
-/* endian tomfoolery */
-typedef union
-{
-       float   f;
-       char    c[ 4 ];
-}
-floatSwapUnion;
-
-
-#ifndef __BIG_ENDIAN__
-       #ifdef _SGI_SOURCE
-               #define __BIG_ENDIAN__
-       #endif
-#endif
-
-
-#ifdef __BIG_ENDIAN__
-
-       int   DDSBigLong( int src ) { return src; }
-       short DDSBigShort( short src ) { return src; }
-       float DDSBigFloat( float src ) { return src; }
-
-       int DDSLittleLong( int src )
-       {
-               return ((src & 0xFF000000) >> 24) |
-                          ((src & 0x00FF0000) >> 8) |
-                          ((src & 0x0000FF00) << 8) |
-                          ((src & 0x000000FF) << 24);
-       }
-
-       short DDSLittleShort( short src )
-       {
-               return ((src & 0xFF00) >> 8) |
-                          ((src & 0x00FF) << 8);
-       }
-
-       float DDSLittleFloat( float src )
-       {
-               floatSwapUnion in,out;
-               in.f = src;
-               out.c[ 0 ] = in.c[ 3 ];
-               out.c[ 1 ] = in.c[ 2 ];
-               out.c[ 2 ] = in.c[ 1 ];
-               out.c[ 3 ] = in.c[ 0 ];
-               return out.f;
-       }
-
-#else /*__BIG_ENDIAN__*/
-
-       int   DDSLittleLong( int src ) { return src; }
-       short DDSLittleShort( short src ) { return src; }
-       float DDSLittleFloat( float src ) { return src; }
-               
-       int DDSBigLong( int src )
-       {
-               return ((src & 0xFF000000) >> 24) |
-                          ((src & 0x00FF0000) >> 8) |
-                          ((src & 0x0000FF00) << 8) |
-                          ((src & 0x000000FF) << 24);
-       }
-               
-       short DDSBigShort( short src )
-       {
-               return ((src & 0xFF00) >> 8) |
-                          ((src & 0x00FF) << 8);
-       }
-               
-       float DDSBigFloat( float src )
-       {
-               floatSwapUnion in,out;
-               in.f = src;
-               out.c[ 0 ] = in.c[ 3 ];
-               out.c[ 1 ] = in.c[ 2 ];
-               out.c[ 2 ] = in.c[ 1 ];
-               out.c[ 3 ] = in.c[ 0 ];
-               return out.f;
-       }
-
-#endif /*__BIG_ENDIAN__*/
-
-
-
-/*
-DDSDecodePixelFormat()
-determines which pixel format the dds texture is in
-*/
-
-static void DDSDecodePixelFormat( ddsBuffer_t *dds, ddsPF_t *pf )
-{
-       unsigned int    fourCC;
-       
-       
-       /* dummy check */
-       if(     dds == NULL || pf == NULL )
-               return;
-       
-       /* extract fourCC */
-       fourCC = dds->pixelFormat.fourCC;
-       
-       /* test it */
-       if( fourCC == 0 )
-               *pf = DDS_PF_ARGB8888;
-       else if( fourCC == *((unsigned int*) "DXT1") )
-               *pf = DDS_PF_DXT1;
-       else if( fourCC == *((unsigned int*) "DXT2") )
-               *pf = DDS_PF_DXT2;
-       else if( fourCC == *((unsigned int*) "DXT3") )
-               *pf = DDS_PF_DXT3;
-       else if( fourCC == *((unsigned int*) "DXT4") )
-               *pf = DDS_PF_DXT4;
-       else if( fourCC == *((unsigned int*) "DXT5") )
-               *pf = DDS_PF_DXT5;
-       else
-               *pf = DDS_PF_UNKNOWN;
-}
-
-
-
-/*
-DDSGetInfo()
-extracts relevant info from a dds texture, returns 0 on success
-*/
-
-int DDSGetInfo( ddsBuffer_t *dds, int *width, int *height, ddsPF_t *pf )
-{
-       /* dummy test */
-       if( dds == NULL )
-               return -1;
-       
-       /* test dds header */
-       if( *((int*) dds->magic) != *((int*) "DDS ") )
-               return -1;
-       if( DDSLittleLong( dds->size ) != 124 )
-               return -1;
-       
-       /* extract width and height */
-       if( width != NULL )
-               *width = DDSLittleLong( dds->width );
-       if( height != NULL )
-               *height = DDSLittleLong( dds->height );
-       
-       /* get pixel format */
-       DDSDecodePixelFormat( dds, pf );
-       
-       /* return ok */
-       return 0;
-}
-
-
-
-/*
-DDSGetColorBlockColors()
-extracts colors from a dds color block
-*/
-
-static void DDSGetColorBlockColors( ddsColorBlock_t *block, ddsColor_t colors[ 4 ] )
-{
-       unsigned short          word;
-
-       
-       /* color 0 */
-       word = DDSLittleShort( block->colors[ 0 ] );
-       colors[ 0 ].a = 0xff;
-       
-       /* extract rgb bits */
-       colors[ 0 ].b = (unsigned char) word;
-       colors[ 0 ].b <<= 3;
-       colors[ 0 ].b |= (colors[ 0 ].b >> 5);
-       word >>= 5;
-       colors[ 0 ].g = (unsigned char) word;
-       colors[ 0 ].g <<= 2;
-       colors[ 0 ].g |= (colors[ 0 ].g >> 5);
-       word >>= 6;
-       colors[ 0 ].r = (unsigned char) word;
-       colors[ 0 ].r <<= 3;
-       colors[ 0 ].r |= (colors[ 0 ].r >> 5);
-
-       /* same for color 1 */
-       word = DDSLittleShort( block->colors[ 1 ] );
-       colors[ 1 ].a = 0xff;
-       
-       /* extract rgb bits */
-       colors[ 1 ].b = (unsigned char) word;
-       colors[ 1 ].b <<= 3;
-       colors[ 1 ].b |= (colors[ 1 ].b >> 5);
-       word >>= 5;
-       colors[ 1 ].g = (unsigned char) word;
-       colors[ 1 ].g <<= 2;
-       colors[ 1 ].g |= (colors[ 1 ].g >> 5);
-       word >>= 6;
-       colors[ 1 ].r = (unsigned char) word;
-       colors[ 1 ].r <<= 3;
-       colors[ 1 ].r |= (colors[ 1 ].r >> 5);
-       
-       /* use this for all but the super-freak math method */
-       if( block->colors[ 0 ] > block->colors[ 1 ] )
-       {
-               /* four-color block: derive the other two colors.    
-                  00 = color 0, 01 = color 1, 10 = color 2, 11 = color 3
-                  these two bit codes correspond to the 2-bit fields 
-                  stored in the 64-bit block. */
-
-               word = ((unsigned short) colors[ 0 ].r * 2 + (unsigned short) colors[ 1 ].r ) / 3;
-                                                                                       /* no +1 for rounding */
-                                                                                       /* as bits have been shifted to 888 */
-               colors[ 2 ].r = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].g * 2 + (unsigned short) colors[ 1 ].g) / 3;
-               colors[ 2 ].g = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].b * 2 + (unsigned short) colors[ 1 ].b) / 3;
-               colors[ 2 ].b = (unsigned char) word;
-               colors[ 2 ].a = 0xff;
-
-               word = ((unsigned short) colors[ 0 ].r + (unsigned short) colors[ 1 ].r * 2) / 3;
-               colors[ 3 ].r = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].g + (unsigned short) colors[ 1 ].g * 2) / 3;
-               colors[ 3 ].g = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].b + (unsigned short) colors[ 1 ].b * 2) / 3;
-               colors[ 3 ].b = (unsigned char) word;
-               colors[ 3 ].a = 0xff;
-       }
-       else
-       {
-               /* three-color block: derive the other color.
-                  00 = color 0, 01 = color 1, 10 = color 2,  
-                  11 = transparent.
-                  These two bit codes correspond to the 2-bit fields 
-                  stored in the 64-bit block */
-
-               word = ((unsigned short) colors[ 0 ].r + (unsigned short) colors[ 1 ].r) / 2;
-               colors[ 2 ].r = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].g + (unsigned short) colors[ 1 ].g) / 2;
-               colors[ 2 ].g = (unsigned char) word;
-               word = ((unsigned short) colors[ 0 ].b + (unsigned short) colors[ 1 ].b) / 2;
-               colors[ 2 ].b = (unsigned char) word;
-               colors[ 2 ].a = 0xff;
-               
-               /* random color to indicate alpha */
-               colors[ 3 ].r = 0x00;
-               colors[ 3 ].g = 0xff;
-               colors[ 3 ].b = 0xff;
-               colors[ 3 ].a = 0x00;
-       }
-}
-
-
-
-/*
-DDSDecodeColorBlock()
-decodes a dds color block
-fixme: make endian-safe
-*/
-
-static void DDSDecodeColorBlock( unsigned int *pixel, ddsColorBlock_t *block, int width, unsigned int colors[ 4 ] )
-{
-       int                             r, n;
-       unsigned int    bits;
-       unsigned int    masks[] = { 3, 12, 3 << 4, 3 << 6 };    /* bit masks = 00000011, 00001100, 00110000, 11000000 */
-       int                             shift[] = { 0, 2, 4, 6 };
-       
-       
-       /* r steps through lines in y */
-       for( r = 0; r < 4; r++, pixel += (width - 4) )  /* no width * 4 as unsigned int ptr inc will * 4 */
-       {
-               /* width * 4 bytes per pixel per line, each j dxtc row is 4 lines of pixels */
-
-               /* n steps through pixels */
-               for( n = 0; n < 4; n++ )
-               {
-                       bits = block->row[ r ] & masks[ n ];
-                       bits >>= shift[ n ];
-
-                       switch( bits )
-                       {
-                               case 0:
-                                       *pixel = colors[ 0 ];
-                                       pixel++;
-                                       break;
-
-                               case 1:
-                                       *pixel = colors[ 1 ];
-                                       pixel++;
-                                       break;
-
-                               case 2:
-                                       *pixel = colors[ 2 ];
-                                       pixel++;
-                                       break;
-
-                               case 3:
-                                       *pixel = colors[ 3 ];
-                                       pixel++;
-                                       break;
-
-                               default:
-                                       /* invalid */
-                                       pixel++;
-                                       break;
-                       }
-               }
-       }
-}
-
-
-
-/*
-DDSDecodeAlphaExplicit()
-decodes a dds explicit alpha block
-*/
-
-static void DDSDecodeAlphaExplicit( unsigned int *pixel, ddsAlphaBlockExplicit_t *alphaBlock, int width, unsigned int alphaZero )
-{      
-       int                             row, pix;
-       unsigned short  word;
-       ddsColor_t              color;
-       
-       
-       /* clear color */
-       color.r = 0;
-       color.g = 0;
-       color.b = 0;
-       
-       /* walk rows */
-       for( row = 0; row < 4; row++, pixel += (width - 4) )
-       {
-               word = DDSLittleShort( alphaBlock->row[ row ] );
-               
-               /* walk pixels */
-               for( pix = 0; pix < 4; pix++ )
-               {
-                       /* zero the alpha bits of image pixel */
-                       *pixel &= alphaZero;
-                       color.a = word & 0x000F;
-                       color.a = color.a | (color.a << 4);
-                       *pixel |= *((unsigned int*) &color);
-                       word >>= 4;             /* move next bits to lowest 4 */
-                       pixel++;                /* move to next pixel in the row */
-
-               }
-       }
-}
-
-
-
-/*
-DDSDecodeAlpha3BitLinear()
-decodes interpolated alpha block
-*/
-
-static void DDSDecodeAlpha3BitLinear( unsigned int *pixel, ddsAlphaBlock3BitLinear_t *alphaBlock, int width, unsigned int alphaZero )
-{
-       
-       int                                     row, pix;
-       unsigned int            stuff;
-       unsigned char           bits[ 4 ][ 4 ];
-       unsigned short          alphas[ 8 ];
-       ddsColor_t                      aColors[ 4 ][ 4 ];
-       
-       
-       /* get initial alphas */
-       alphas[ 0 ] = alphaBlock->alpha0;
-       alphas[ 1 ] = alphaBlock->alpha1;
-       
-       /* 8-alpha block */
-       if( alphas[ 0 ] > alphas[ 1 ] )
-       {
-               /* 000 = alpha_0, 001 = alpha_1, others are interpolated */
-               alphas[ 2 ] = ( 6 * alphas[ 0 ] +     alphas[ 1 ]) / 7; /* bit code 010 */
-               alphas[ 3 ] = ( 5 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 7; /* bit code 011 */
-               alphas[ 4 ] = ( 4 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 7; /* bit code 100 */
-               alphas[ 5 ] = ( 3 * alphas[ 0 ] + 4 * alphas[ 1 ]) / 7; /* bit code 101 */
-               alphas[ 6 ] = ( 2 * alphas[ 0 ] + 5 * alphas[ 1 ]) / 7; /* bit code 110 */
-               alphas[ 7 ] = (     alphas[ 0 ] + 6 * alphas[ 1 ]) / 7; /* bit code 111 */
-       }
-       
-       /* 6-alpha block */
-       else
-       { 
-               /* 000 = alpha_0, 001 = alpha_1, others are interpolated */
-               alphas[ 2 ] = (4 * alphas[ 0 ] +     alphas[ 1 ]) / 5;  /* bit code 010 */
-               alphas[ 3 ] = (3 * alphas[ 0 ] + 2 * alphas[ 1 ]) / 5;  /* bit code 011 */
-               alphas[ 4 ] = (2 * alphas[ 0 ] + 3 * alphas[ 1 ]) / 5;  /* bit code 100 */
-               alphas[ 5 ] = (    alphas[ 0 ] + 4 * alphas[ 1 ]) / 5;  /* bit code 101 */
-               alphas[ 6 ] = 0;                                                                                /* bit code 110 */
-               alphas[ 7 ] = 255;                                                                              /* bit code 111 */
-       }
-       
-       /* decode 3-bit fields into array of 16 bytes with same value */
-       
-       /* first two rows of 4 pixels each */
-       stuff = *((unsigned int*) &(alphaBlock->stuff[ 0 ]));
-       
-       bits[ 0 ][ 0 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 0 ][ 1 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 0 ][ 2 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 0 ][ 3 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 1 ][ 0 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 1 ][ 1 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 1 ][ 2 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 1 ][ 3 ] = (unsigned char) (stuff & 0x00000007);
-       
-       /* last two rows */
-       stuff = *((unsigned int*) &(alphaBlock->stuff[ 3 ])); /* last 3 bytes */
-       
-       bits[ 2 ][ 0 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 2 ][ 1 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 2 ][ 2 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 2 ][ 3 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 3 ][ 0 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 3 ][ 1 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 3 ][ 2 ] = (unsigned char) (stuff & 0x00000007);
-       stuff >>= 3;
-       bits[ 3 ][ 3 ] = (unsigned char) (stuff & 0x00000007);
-       
-       /* decode the codes into alpha values */
-       for( row = 0; row < 4; row++ )
-       {
-               for( pix=0; pix < 4; pix++ )
-               {
-                       aColors[ row ][ pix ].r = 0;
-                       aColors[ row ][ pix ].g = 0;
-                       aColors[ row ][ pix ].b = 0;
-                       aColors[ row ][ pix ].a = (unsigned char) alphas[ bits[ row ][ pix ] ];
-               }
-       }
-       
-       /* write out alpha values to the image bits */
-       for( row = 0; row < 4; row++, pixel += width-4 )
-       {
-               for( pix = 0; pix < 4; pix++ )
-               {
-                       /* zero the alpha bits of image pixel */
-                       *pixel &= alphaZero;
-                       
-                       /* or the bits into the prev. nulled alpha */
-                       *pixel |= *((unsigned int*) &(aColors[ row ][ pix ]));  
-                       pixel++;
-               }
-       }
-}
-
-
-
-/*
-DDSDecompressDXT1()
-decompresses a dxt1 format texture
-*/
-
-static int DDSDecompressDXT1( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int                             x, y, xBlocks, yBlocks;
-       unsigned int    *pixel;
-       ddsColorBlock_t *block;
-       ddsColor_t              colors[ 4 ];
-       
-       
-       /* setup */
-       xBlocks = width / 4;
-       yBlocks = height / 4;
-       
-       /* walk y */
-       for( y = 0; y < yBlocks; y++ )
-       {
-               /* 8 bytes per block */
-               block = (ddsColorBlock_t*) ((char *) dds->data + y * xBlocks * 8);
-
-               /* walk x */
-               for( x = 0; x < xBlocks; x++, block++ )
-               {
-                       DDSGetColorBlockColors( block, colors );
-                       pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4);
-                       DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors );
-               }
-       }
-       
-       /* return ok */
-       return 0;
-}
-
-
-
-/*
-DDSDecompressDXT3()
-decompresses a dxt3 format texture
-*/
-
-static int DDSDecompressDXT3( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int                                             x, y, xBlocks, yBlocks;
-       unsigned int                    *pixel, alphaZero;
-       ddsColorBlock_t                 *block;
-       ddsAlphaBlockExplicit_t *alphaBlock;
-       ddsColor_t                              colors[ 4 ];
-
-
-       /* setup */
-       xBlocks = width / 4;
-       yBlocks = height / 4;
-       
-       /* create zero alpha */
-       colors[ 0 ].a = 0;
-       colors[ 0 ].r = 0xFF;
-       colors[ 0 ].g = 0xFF;
-       colors[ 0 ].b = 0xFF;
-       alphaZero = *((unsigned int*) &colors[ 0 ]);
-       
-       /* walk y */
-       for( y = 0; y < yBlocks; y++ )
-       {
-               /* 8 bytes per block, 1 block for alpha, 1 block for color */
-               block = (ddsColorBlock_t*) ((char *) dds->data + y * xBlocks * 16);
-
-               /* walk x */
-               for( x = 0; x < xBlocks; x++, block++ )
-               {
-                       /* get alpha block */
-                       alphaBlock = (ddsAlphaBlockExplicit_t*) block;
-                       
-                       /* get color block */
-                       block++;
-                       DDSGetColorBlockColors( block, colors );
-                       
-                       /* decode color block */
-                       pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4);
-                       DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors );
-                       
-                       /* overwrite alpha bits with alpha block */
-                       DDSDecodeAlphaExplicit( pixel, alphaBlock, width, alphaZero );
-               }
-       }
-       
-       /* return ok */
-       return 0;
-}
-
-
-
-/*
-DDSDecompressDXT5()
-decompresses a dxt5 format texture
-*/
-
-static int DDSDecompressDXT5( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int                                                     x, y, xBlocks, yBlocks;
-       unsigned int                            *pixel, alphaZero;
-       ddsColorBlock_t                         *block;
-       ddsAlphaBlock3BitLinear_t       *alphaBlock;
-       ddsColor_t                                      colors[ 4 ];
-
-
-       /* setup */
-       xBlocks = width / 4;
-       yBlocks = height / 4;
-       
-       /* create zero alpha */
-       colors[ 0 ].a = 0;
-       colors[ 0 ].r = 0xFF;
-       colors[ 0 ].g = 0xFF;
-       colors[ 0 ].b = 0xFF;
-       alphaZero = *((unsigned int*) &colors[ 0 ]);
-       
-       /* walk y */
-       for( y = 0; y < yBlocks; y++ )
-       {
-               /* 8 bytes per block, 1 block for alpha, 1 block for color */
-               block = (ddsColorBlock_t*) ((char *) dds->data + y * xBlocks * 16);
-
-               /* walk x */
-               for( x = 0; x < xBlocks; x++, block++ )
-               {
-                       /* get alpha block */
-                       alphaBlock = (ddsAlphaBlock3BitLinear_t*) block;
-                       
-                       /* get color block */
-                       block++;
-                       DDSGetColorBlockColors( block, colors );
-                       
-                       /* decode color block */
-                       pixel = (unsigned int*) (pixels + x * 16 + (y * 4) * width * 4);
-                       DDSDecodeColorBlock( pixel, block, width, (unsigned int*) colors );
-                       
-                       /* overwrite alpha bits with alpha block */
-                       DDSDecodeAlpha3BitLinear( pixel, alphaBlock, width, alphaZero );
-               }
-       }
-       
-       /* return ok */
-       return 0;
-}
-
-
-
-/*
-DDSDecompressDXT2()
-decompresses a dxt2 format texture (fixme: un-premultiply alpha)
-*/
-
-static int DDSDecompressDXT2( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int             r;
-       
-       
-       /* decompress dxt3 first */
-       r = DDSDecompressDXT3( dds, width, height, pixels );
-       
-       /* return to sender */
-       return r;
-}
-
-
-
-/*
-DDSDecompressDXT4()
-decompresses a dxt4 format texture (fixme: un-premultiply alpha)
-*/
-
-static int DDSDecompressDXT4( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int             r;
-       
-       
-       /* decompress dxt5 first */
-       r = DDSDecompressDXT5( dds, width, height, pixels );
-       
-       /* return to sender */
-       return r;
-}
-
-
-
-/*
-DDSDecompressARGB8888()
-decompresses an argb 8888 format texture
-*/
-
-static int DDSDecompressARGB8888( ddsBuffer_t *dds, int width, int height, unsigned char *pixels )
-{
-       int                                                     x, y;
-       unsigned char                           *in, *out;
-       
-       
-       /* setup */
-       in = dds->data;
-       out = pixels;
-       
-       /* walk y */
-       for( y = 0; y < height; y++ )
-       {
-               /* walk x */
-               for( x = 0; x < width; x++ )
-               {
-                       *out++ = *in++;
-                       *out++ = *in++;
-                       *out++ = *in++;
-                       *out++ = *in++;
-               }
-       }
-       
-       /* return ok */
-       return 0;
-}
-
-
-
-/*
-DDSDecompress()
-decompresses a dds texture into an rgba image buffer, returns 0 on success
-*/
-
-int DDSDecompress( ddsBuffer_t *dds, unsigned char *pixels )
-{
-       int                     width, height, r;
-       ddsPF_t         pf;
-       
-       
-       /* get dds info */
-       r = DDSGetInfo( dds, &width, &height, &pf );
-       if( r )
-               return r;
-       
-       /* decompress */
-       switch( pf )
-       {
-               case DDS_PF_ARGB8888:
-                       /* fixme: support other [a]rgb formats */
-                       r = DDSDecompressARGB8888( dds, width, height, pixels );
-                       break;
-               
-               case DDS_PF_DXT1:
-                       r = DDSDecompressDXT1( dds, width, height, pixels );
-                       break;
-               
-               case DDS_PF_DXT2:
-                       r = DDSDecompressDXT2( dds, width, height, pixels );
-                       break;
-               
-               case DDS_PF_DXT3:
-                       r = DDSDecompressDXT3( dds, width, height, pixels );    
-                       break;
-               
-               case DDS_PF_DXT4:
-                       r = DDSDecompressDXT4( dds, width, height, pixels );
-                       break;
-               
-               case DDS_PF_DXT5:
-                       r = DDSDecompressDXT5( dds, width, height, pixels );            
-                       break;
-               
-               default:
-               case DDS_PF_UNKNOWN:
-                       memset( pixels, 0xFF, width * height * 4 );
-                       r = -1;
-                       break;
-       }
-       
-       /* return to sender */
-       return r;
-}
-