mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
110 lines
2.4 KiB
C
110 lines
2.4 KiB
C
|
//========= 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
|