Files
FC1/RenderDll/Common/Textures/Image/DXTCImage.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

211 lines
4.8 KiB
C++

/*********************************************************************NVMH2****
File: Image_DXTC.h
Copyright (C) 1999, 2000 NVIDIA Corporation
Copyright (C) 2002, Ubi Soft Milan
Tiziano Sardone
Comments:
A class to load and decompress DXT textures to 32-bit raw image data format.
.RAW output files can be loaded into photoshop by specifying the resolution
and 4 color channels of 8-bit, interleaved.
A few approaches to block decompression are in place and a simple code timing
function is called. Output of timing test is saved to a local .txt file.
TiZ: some modification to adapt the code to run under PS2.
******************************************************************************/
#if !defined(AFX_IMAGE_DXTC_H__4B89D8D0_7857_11D4_9630_00A0C996DE3D__INCLUDED_)
#define AFX_IMAGE_DXTC_H__4B89D8D0_7857_11D4_9630_00A0C996DE3D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifdef WIN32
#include <d3d.h>
#endif
#ifdef PS2
/////////////////////////////////////
// should be in ddraw.h
#ifndef MAKEFOURCC
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
#endif //defined(MAKEFOURCC)
#endif
struct TimingInfo; // defined in Image_DXTC.cpp
#define byte unsigned char
#define BYTE unsigned char
//#ifndef PS2
#define WORD unsigned short
#define DWORD unsigned int
#define LONG unsigned int
#define LPVOID void*
#define VOID void
#define CHAR char
#define LARGE_INTEGER int
//#endif
enum PixFormat
{
PF_ARGB,
PF_DXT1,
PF_DXT2,
PF_DXT3,
PF_DXT4,
PF_DXT5,
PF_UNKNOWN,
};
#define COMPRESSED_S3TC_DXT1 PF_DXT1
typedef struct _DDSCAPS2 {
DWORD dwCaps;
DWORD dwCaps2;
DWORD dwCaps3;
DWORD dwCaps4;
} DDSCAPS2, *LPDDSCAPS2;
typedef struct _DDPIXELFORMAT {
DWORD dwSize;
DWORD dwFlags;
DWORD dwFourCC;
union {
DWORD dwRGBBitCount;
DWORD dwYUVBitCount;
DWORD dwZBufferBitDepth;
DWORD dwAlphaBitDepth;
DWORD dwLuminanceBitCount;
DWORD dwBumpBitCount;
DWORD dwPrivateFormatBitCount;
} ;
union {
DWORD dwRBitMask;
DWORD dwYBitMask;
DWORD dwStencilBitDepth;
DWORD dwLuminanceBitMask;
DWORD dwBumpDuBitMask;
DWORD dwOperations;
} ;
union {
DWORD dwGBitMask;
DWORD dwUBitMask;
DWORD dwZBitMask;
DWORD dwBumpDvBitMask;
struct {
WORD wFlipMSTypes;
WORD wBltMSTypes;
} MultiSampleCaps;
} ;
union {
DWORD dwBBitMask;
DWORD dwVBitMask;
DWORD dwStencilBitMask;
DWORD dwBumpLuminanceBitMask;
} ;
union {
DWORD dwRGBAlphaBitMask;
DWORD dwYUVAlphaBitMask;
DWORD dwLuminanceAlphaBitMask;
DWORD dwRGBZBitMask;
DWORD dwYUVZBitMask;
} ;
} DDPIXELFORMAT, *LPDDPIXELFORMAT;
typedef struct _DDCOLORKEY{
DWORD dwColorSpaceLowValue;
DWORD dwColorSpaceHighValue;
} DDCOLORKEY, *LPDDCOLORKEY;
typedef struct _DDSURFACEDESC2 {
DWORD dwSize;
DWORD dwFlags;
DWORD dwHeight;
DWORD dwWidth;
union
{
LONG lPitch;
DWORD dwLinearSize;
} DUMMYUNIONNAMEN_1;
DWORD dwBackBufferCount;
union
{
DWORD dwMipMapCount;
DWORD dwRefreshRate;
} DUMMYUNIONNAMEN_2;
DWORD dwAlphaBitDepth;
DWORD dwReserved;
LPVOID lpSurface;
DDCOLORKEY ddckCKDestOverlay;
DDCOLORKEY ddckCKDestBlt;
DDCOLORKEY ddckCKSrcOverlay;
DDCOLORKEY ddckCKSrcBlt;
DDPIXELFORMAT ddpfPixelFormat;
DDSCAPS2 ddsCaps;
DWORD dwTextureStage;
} DDSURFACEDESC2, *LPDDSURFACEDESC2;
class Image_DXTC
{
public:
unsigned char * m_pCompBytes; // compressed image bytes
unsigned char * m_pDecompBytes;
int m_nCompSize;
int m_nCompLineSz;
char m_strFormat[256];
PixFormat m_CompFormat;
DDSURFACEDESC2 m_DDSD; // read from dds file
bool m_bMipTexture; // texture has mipmaps?
int m_nWidth; // in pixels of uncompressed image
int m_nHeight;
bool LoadFromFile( char * filename ); // true if success
VOID DecodePixelFormat( CHAR* strPixelFormat, DDPIXELFORMAT* pddpf );
void AllocateDecompBytes();
void Decompress();
void DecompressDXT1();
void DecompressDXT2();
void DecompressDXT3();
void DecompressDXT4();
void DecompressDXT5();
void SaveAsRaw8888(const char *name); // save decompressed bits
void SaveAsRaw888(const char *name); // save decompressed bits
void RunTimingSession(); // run a few methods & time the code
// must use dxt5 texture
void Time_Decomp5_01( int ntimes, TimingInfo * info );
void Time_Decomp5_02( int ntimes, TimingInfo * info );
void Time_Decomp5_03( int ntimes, TimingInfo * info );
void Time_Decomp5_04( int ntimes, TimingInfo * info );
Image_DXTC();
virtual ~Image_DXTC();
};
#endif // !defined(AFX_IMAGE_DXTC_H__4B89D8D0_7857_11D4_9630_00A0C996DE3D__INCLUDED_)