Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
215 lines
6.2 KiB
C
215 lines
6.2 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// ImageLib Sources
|
|
// Copyright (C) 2000-2002 by Denton Woods
|
|
// Last modified: 02/21/2002 <--Y2K Compliant! =]
|
|
//
|
|
// Filename: src-IL/include/il_dds.h
|
|
//
|
|
// Description: Reads from a DirectDraw Surface (.dds) file.
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#ifndef DDS_H
|
|
#define DDS_H
|
|
|
|
#include "il_internal.h"
|
|
|
|
|
|
#ifdef _WIN32
|
|
#pragma pack(push, dds_struct, 1)
|
|
#endif
|
|
typedef struct DDSHEAD
|
|
{
|
|
ILbyte Signature[4];
|
|
|
|
ILuint Size1; // size of the structure (minus MagicNum)
|
|
ILuint Flags1; // determines what fields are valid
|
|
ILuint Height; // height of surface to be created
|
|
ILuint Width; // width of input surface
|
|
ILuint LinearSize; // Formless late-allocated optimized surface size
|
|
ILuint Depth; // Depth if a volume texture
|
|
ILuint MipMapCount; // number of mip-map levels requested
|
|
ILuint AlphaBitDepth; // depth of alpha buffer requested
|
|
|
|
ILuint NotUsed[10];
|
|
|
|
ILuint Size2; // size of structure
|
|
ILuint Flags2; // pixel format flags
|
|
ILuint FourCC; // (FOURCC code)
|
|
ILuint RGBBitCount; // how many bits per pixel
|
|
ILuint RBitMask; // mask for red bit
|
|
ILuint GBitMask; // mask for green bits
|
|
ILuint BBitMask; // mask for blue bits
|
|
ILuint RGBAlphaBitMask; // mask for alpha channel
|
|
|
|
ILuint ddsCaps1, ddsCaps2, ddsCaps3, ddsCaps4; // direct draw surface capabilities
|
|
ILuint TextureStage;
|
|
} IL_PACKSTRUCT DDSHEAD;
|
|
#ifdef _WIN32
|
|
#pragma pack(pop, dds_struct)
|
|
#endif
|
|
|
|
|
|
|
|
// use cast to struct instead of RGBA_MAKE as struct is
|
|
// much
|
|
typedef struct Color8888
|
|
{
|
|
ILubyte r; // change the order of names to change the
|
|
ILubyte g; // order of the output ARGB or BGRA, etc...
|
|
ILubyte b; // Last one is MSB, 1st is LSB.
|
|
ILubyte a;
|
|
} Color8888;
|
|
|
|
|
|
typedef struct Color888
|
|
{
|
|
ILubyte r; // change the order of names to change the
|
|
ILubyte g; // order of the output ARGB or BGRA, etc...
|
|
ILubyte b; // Last one is MSB, 1st is LSB.
|
|
} Color888;
|
|
|
|
|
|
typedef struct Color565
|
|
{
|
|
unsigned nBlue : 5; // order of names changes
|
|
unsigned nGreen : 6; // byte order of output to 32 bit
|
|
unsigned nRed : 5;
|
|
} Color565;
|
|
|
|
|
|
typedef struct DXTColBlock
|
|
{
|
|
ILshort col0;
|
|
ILshort col1;
|
|
|
|
// no bit fields - use bytes
|
|
ILbyte row[4];
|
|
} DXTColBlock;
|
|
|
|
typedef struct DXTAlphaBlockExplicit
|
|
{
|
|
ILshort row[4];
|
|
} DXTAlphaBlockExplicit;
|
|
|
|
typedef struct DXTAlphaBlock3BitLinear
|
|
{
|
|
ILbyte alpha0;
|
|
ILbyte alpha1;
|
|
|
|
ILbyte stuff[6];
|
|
} DXTAlphaBlock3BitLinear;
|
|
|
|
|
|
// Defines
|
|
|
|
//Those 4 were added on 20040516 to make
|
|
//the written dds files more standard compliant
|
|
#define DDS_CAPS 0x00000001L
|
|
#define DDS_HEIGHT 0x00000002L
|
|
#define DDS_WIDTH 0x00000004L
|
|
|
|
#define DDS_RGB 0x00000040L
|
|
#define DDS_PIXELFORMAT 0x00001000L
|
|
|
|
#define DDS_LUMINANCE 0x00020000L
|
|
|
|
#define DDS_ALPHAPIXELS 0x00000001L
|
|
#define DDS_ALPHA 0x00000002L
|
|
#define DDS_FOURCC 0x00000004L
|
|
#define DDS_PITCH 0x00000008L
|
|
#define DDS_COMPLEX 0x00000008L
|
|
#define DDS_TEXTURE 0x00001000L
|
|
#define DDS_MIPMAPCOUNT 0x00020000L
|
|
#define DDS_LINEARSIZE 0x00080000L
|
|
#define DDS_VOLUME 0x00200000L
|
|
#define DDS_MIPMAP 0x00400000L
|
|
#define DDS_DEPTH 0x00800000L
|
|
|
|
#define DDS_CUBEMAP 0x00000200L
|
|
#define DDS_CUBEMAP_POSITIVEX 0x00000400L
|
|
#define DDS_CUBEMAP_NEGATIVEX 0x00000800L
|
|
#define DDS_CUBEMAP_POSITIVEY 0x00001000L
|
|
#define DDS_CUBEMAP_NEGATIVEY 0x00002000L
|
|
#define DDS_CUBEMAP_POSITIVEZ 0x00004000L
|
|
#define DDS_CUBEMAP_NEGATIVEZ 0x00008000L
|
|
|
|
|
|
#define IL_MAKEFOURCC(ch0, ch1, ch2, ch3) \
|
|
((ILint)(ILbyte)(ch0) | ((ILint)(ILbyte)(ch1) << 8) | \
|
|
((ILint)(ILbyte)(ch2) << 16) | ((ILint)(ILbyte)(ch3) << 24 ))
|
|
|
|
enum PixFormat
|
|
{
|
|
PF_ARGB,
|
|
PF_RGB,
|
|
PF_DXT1,
|
|
PF_DXT2,
|
|
PF_DXT3,
|
|
PF_DXT4,
|
|
PF_DXT5,
|
|
|
|
PF_3DC,
|
|
|
|
PF_ATI1N,
|
|
|
|
PF_LUMINANCE,
|
|
|
|
PF_LUMINANCE_ALPHA,
|
|
|
|
PF_RXGB, //Doom3 normal maps
|
|
|
|
PF_A16B16G16R16,
|
|
|
|
PF_R16F,
|
|
|
|
PF_G16R16F,
|
|
|
|
PF_A16B16G16R16F,
|
|
|
|
PF_R32F,
|
|
|
|
PF_G32R32F,
|
|
|
|
PF_A32B32G32R32F,
|
|
PF_UNKNOWN = 0xFF
|
|
};
|
|
|
|
#define CUBEMAP_SIDES 6
|
|
|
|
// Internal functions
|
|
ILboolean iLoadDdsInternal(ILvoid);
|
|
ILboolean iIsValidDds(ILvoid);
|
|
ILboolean iCheckDds(DDSHEAD *Head);
|
|
ILvoid AdjustVolumeTexture(DDSHEAD *Head);
|
|
ILboolean ReadData(ILvoid);
|
|
ILboolean AllocImage(ILvoid);
|
|
ILboolean Decompress(ILvoid);
|
|
ILboolean ReadMipmaps(ILvoid);
|
|
ILuint DecodePixelFormat(ILvoid);
|
|
ILboolean DecompressARGB(ILvoid);
|
|
ILboolean DecompressDXT1(ILvoid);
|
|
ILboolean DecompressDXT2(ILvoid);
|
|
ILboolean DecompressDXT3(ILvoid);
|
|
ILboolean DecompressDXT4(ILvoid);
|
|
ILboolean DecompressDXT5(ILvoid);
|
|
|
|
ILboolean Decompress3Dc(ILvoid);
|
|
|
|
ILboolean DecompressAti1n(ILvoid);
|
|
|
|
ILboolean DecompressRXGB(ILvoid);
|
|
|
|
ILboolean DecompressFloat(ILvoid);
|
|
ILvoid CorrectPreMult(ILvoid);
|
|
ILvoid GetBitsFromMask(ILuint Mask, ILuint *ShiftLeft, ILuint *ShiftRight);
|
|
ILboolean iSaveDdsInternal(ILvoid);
|
|
ILboolean WriteHeader(ILimage *Image, ILenum DXTCFormat, ILuint CubeFlags);
|
|
ILushort *CompressTo565(ILimage *Image);
|
|
|
|
ILubyte *CompressTo88(ILimage *Image);
|
|
ILuint Compress(ILimage *Image, ILenum DXTCFormat);
|
|
ILboolean GetBlock(ILushort *Block, ILushort *Data, ILimage *Image, ILuint XPos, ILuint YPos);
|
|
ILboolean GetAlphaBlock(ILubyte *Block, ILubyte *Data, ILimage *Image, ILuint XPos, ILuint YPos);
|
|
|
|
ILboolean Get3DcBlock(ILubyte *Block, ILubyte *Data, ILimage *Image, ILuint XPos, ILuint YPos, int channel);
|
|
ILvoid ShortToColor565(ILushort Pixel, Color565 *Colour);
|
|
ILvoid ShortToColor888(ILushort Pixel, Color888 *Colour);
|
|
ILushort Color565ToShort(Color565 *Colour);
|
|
ILushort Color888ToShort(Color888 *Colour);
|
|
ILuint GenBitMask(ILushort ex0, ILushort ex1, ILuint NumCols, ILushort *In, ILubyte *Alpha, Color888 *OutCol);
|
|
ILvoid GenAlphaBitMask(ILubyte a0, ILubyte a1, ILubyte *In, ILubyte *Mask, ILubyte *Out);
|
|
ILuint RMSAlpha(ILubyte *Orig, ILubyte *Test);
|
|
ILuint Distance(Color888 *c1, Color888 *c2);
|
|
ILvoid ChooseEndpoints(ILushort *Block, ILushort *ex0, ILushort *ex1);
|
|
ILvoid ChooseAlphaEndpoints(ILubyte *Block, ILubyte *a0, ILubyte *a1);
|
|
ILvoid CorrectEndDXT1(ILushort *ex0, ILushort *ex1, ILboolean HasAlpha);
|
|
ILvoid PreMult(ILushort *Data, ILubyte *Alpha);
|
|
|
|
|
|
extern ILuint CubemapDirections[CUBEMAP_SIDES];
|
|
|
|
|
|
#endif//DDS_H
|