//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef S3TC_DECODE_H #define S3TC_DECODE_H #ifdef _WIN32 #pragma once #endif #include "bitmap/imageformat.h" enum ImageFormat; class S3RGBA { public: unsigned char b, g, r, a; }; class S3PaletteIndex { public: unsigned char m_AlphaIndex; unsigned char m_ColorIndex; }; #define MAX_S3TC_BLOCK_BYTES 16 S3PaletteIndex S3TC_GetPixelPaletteIndex( ImageFormat format, const char *pS3Block, int x, int y ); void S3TC_SetPixelPaletteIndex( ImageFormat format, char *pS3Block, int x, int y, S3PaletteIndex iPaletteIndex ); // Note: width, x, and y are in texels, not S3 blocks. S3PaletteIndex S3TC_GetPaletteIndex( unsigned char *pFaceData, ImageFormat format, int imageWidth, int x, int y ); // Note: width, x, and y are in texels, not S3 blocks. void S3TC_SetPaletteIndex( unsigned char *pFaceData, ImageFormat format, int imageWidth, int x, int y, S3PaletteIndex paletteIndex ); const char* S3TC_GetBlock( const void *pCompressed, ImageFormat format, int nBlocksWide, // How many blocks wide is the image (pixels wide / 4). int xBlock, int yBlock ); char* S3TC_GetBlock( void *pCompressed, ImageFormat format, int nBlocksWide, // How many blocks wide is the image (pixels wide / 4). int xBlock, int yBlock ); // Merge the two palettes and copy the colors void S3TC_MergeBlocks( char **blocks, S3RGBA **pOriginals, // Original RGBA colors in the texture. This allows it to avoid doubly compressing. int nBlocks, int lPitch, // (in BYTES) ImageFormat format ); // Convert an RGB565 color to RGBA8888. inline S3RGBA S3TC_RGBAFrom565( unsigned short color, unsigned char alphaValue=255 ) { S3RGBA ret; ret.a = alphaValue; ret.r = (unsigned char)( (color >> 11) << 3 ); ret.g = (unsigned char)( ((color >> 5) & 0x3F) << 2 ); ret.b = (unsigned char)( (color & 0x1F) << 3 ); return ret; } // Blend from one color to another.. inline S3RGBA S3TC_RGBABlend( const S3RGBA &a, const S3RGBA &b, int aMul, int bMul, int div ) { S3RGBA ret; ret.r = (unsigned char)(( (int)a.r * aMul + (int)b.r * bMul ) / div ); ret.g = (unsigned char)(( (int)a.g * aMul + (int)b.g * bMul ) / div ); ret.b = (unsigned char)(( (int)a.b * aMul + (int)b.b * bMul ) / div ); ret.a = (unsigned char)(( (int)a.a * aMul + (int)b.a * bMul ) / div ); return ret; } #endif // S3TC_DECODE_H