diff options
Diffstat (limited to 'vtf/s3tc_decode.h')
| -rw-r--r-- | vtf/s3tc_decode.h | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/vtf/s3tc_decode.h b/vtf/s3tc_decode.h new file mode 100644 index 0000000..5cee891 --- /dev/null +++ b/vtf/s3tc_decode.h @@ -0,0 +1,109 @@ +//========= 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 |