You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.4 KiB
109 lines
2.4 KiB
//========= 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
|
|
|