mirror of
https://github.com/scp-fs2open/fs2open.github.com.git
synced 2026-11-09 04:49:39 -10:00
git-svn-id: svn://svn.icculus.org/fs2open/trunk/fs2_open@9805 387891d4-d844-0410-90c0-e4c51a9137d3
157 lines
4.8 KiB
C
157 lines
4.8 KiB
C
//header file to load .dds files
|
|
//these use dxtc texture compression
|
|
|
|
#ifndef __DDS_H
|
|
#define __DDS_H
|
|
|
|
#include "globalincs/pstypes.h"
|
|
#include "cfile/cfile.h"
|
|
|
|
|
|
#define DDS_ERROR_NONE 0 // everything went fine
|
|
#define DDS_ERROR_INVALID_FILENAME 1 // bad or missing file
|
|
#define DDS_ERROR_UNSUPPORTED 2 // a known format but one we don't support
|
|
#define DDS_ERROR_INVALID_FORMAT 3 // format that's not supported
|
|
#define DDS_ERROR_BAD_HEADER 4 // header was not "DDS "
|
|
#define DDS_ERROR_NO_COMPRESSION 5 // file is compressed, compression isn't supported
|
|
#define DDS_ERROR_NON_POWER_OF_2 6 // file is not a power of 2 in dimensions
|
|
#define DDS_ERROR_CUBEMAP_FACES 7 // file is a cubemap, but doesn't have all six faces
|
|
|
|
|
|
#define DDS_DXT_INVALID -1
|
|
#define DDS_UNCOMPRESSED 0
|
|
#define DDS_DXT1 1
|
|
#define DDS_DXT3 3
|
|
#define DDS_DXT5 5
|
|
#define DDS_CUBEMAP_UNCOMPRESSED 10
|
|
#define DDS_CUBEMAP_DXT1 11
|
|
#define DDS_CUBEMAP_DXT3 13
|
|
#define DDS_CUBEMAP_DXT5 15
|
|
|
|
#ifndef MAKEFOURCC
|
|
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
|
|
((uint)(ubyte)(ch0) | ((uint)(ubyte)(ch1) << 8) | \
|
|
((uint)(ubyte)(ch2) << 16) | ((uint)(ubyte)(ch3) << 24 ))
|
|
#endif //defined(MAKEFOURCC)
|
|
|
|
// FOURCC codes for DX compressed-texture pixel formats
|
|
#define FOURCC_DXT1 (MAKEFOURCC('D','X','T','1'))
|
|
#define FOURCC_DXT2 (MAKEFOURCC('D','X','T','2'))
|
|
#define FOURCC_DXT3 (MAKEFOURCC('D','X','T','3'))
|
|
#define FOURCC_DXT4 (MAKEFOURCC('D','X','T','4'))
|
|
#define FOURCC_DXT5 (MAKEFOURCC('D','X','T','5'))
|
|
|
|
#define DDS_FILECODE 0x20534444 // "DDS " in file
|
|
|
|
// DDS format stuff ...
|
|
#define DDSD_LINEARSIZE 0x00080000
|
|
#define DDSD_PITCH 0x00000008
|
|
#define DDPF_ALPHAPIXELS 0x00000001
|
|
#define DDPF_FOURCC 0x00000004
|
|
#define DDPF_PALETTEINDEXED4 0x00000008
|
|
#define DDPF_PALETTEINDEXEDTO8 0x00000010
|
|
#define DDPF_PALETTEINDEXED8 0x00000020
|
|
#define DDPF_RGB 0x00000040
|
|
#define DDSD_PIXELFORMAT 0x00001000
|
|
#define DDSD_WIDTH 0x00000004
|
|
#define DDSD_HEIGHT 0x00000002
|
|
#define DDSD_CAPS 0x00000001
|
|
#define DDSD_MIPMAPCOUNT 0x00020000
|
|
|
|
#define DDSCAPS_COMPLEX 0x00000008
|
|
#define DDSCAPS_PRIMARYSURFACE 0x00000200
|
|
#define DDSCAPS_MIPMAP 0x00400000
|
|
#define DDSCAPS_TEXTURE 0x00001000
|
|
|
|
#define DDSCAPS2_CUBEMAP 0x00000200
|
|
#define DDSCAPS2_VOLUME 0x00200000
|
|
#define DDSCAPS2_CUBEMAP_POSITIVEX 0x00000400
|
|
#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x00000800
|
|
#define DDSCAPS2_CUBEMAP_POSITIVEY 0x00001000
|
|
#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x00002000
|
|
#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x00004000
|
|
#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x00008000
|
|
|
|
#define DDSCAPS2_CUBEMAP_ALLFACES ( DDSCAPS2_CUBEMAP_POSITIVEX | \
|
|
DDSCAPS2_CUBEMAP_NEGATIVEX | \
|
|
DDSCAPS2_CUBEMAP_POSITIVEY | \
|
|
DDSCAPS2_CUBEMAP_NEGATIVEY | \
|
|
DDSCAPS2_CUBEMAP_POSITIVEZ | \
|
|
DDSCAPS2_CUBEMAP_NEGATIVEZ )
|
|
|
|
#pragma pack(1)
|
|
// these structures are the headers for a dds file
|
|
/*typedef struct _DDPIXELFORMAT {
|
|
uint dwSize;
|
|
uint dwFlags;
|
|
uint dwFourCC;
|
|
uint dwRGBBitCount;
|
|
uint dwRBitMask;
|
|
uint dwGBitMask;
|
|
uint dwBBitMask;
|
|
uint dwRGBAlphaBitMask;
|
|
} DDPIXELFORMAT;
|
|
|
|
typedef struct _DDSCAPS2
|
|
{
|
|
uint dwCaps1;
|
|
uint dwCaps2;
|
|
uint Reserved[2];
|
|
} DDSCAPS2;*/
|
|
|
|
typedef struct _DDSURFACEDESC2
|
|
{
|
|
uint dwSize; // size of the DDSURFACEDESC structure
|
|
uint dwFlags; // determines what fields are valid
|
|
uint dwHeight; // height of surface to be created
|
|
uint dwWidth; // width of input surface
|
|
uint dwPitchOrLinearSize;
|
|
uint dwDepth;
|
|
uint dwMipMapCount;
|
|
uint dwReserved1[11];
|
|
|
|
struct {
|
|
uint dwSize;
|
|
uint dwFlags;
|
|
uint dwFourCC;
|
|
uint dwRGBBitCount;
|
|
uint dwRBitMask;
|
|
uint dwGBitMask;
|
|
uint dwBBitMask;
|
|
uint dwRGBAlphaBitMask;
|
|
} ddpfPixelFormat;
|
|
|
|
struct {
|
|
uint dwCaps1;
|
|
uint dwCaps2;
|
|
uint Reserved[2];
|
|
} ddsCaps;
|
|
|
|
// DDPIXELFORMAT ddpfPixelFormat;
|
|
// DDSCAPS2 ddsCaps; // direct draw surface capabilities
|
|
uint dwReserved2;
|
|
} DDSURFACEDESC2;
|
|
#pragma pack()
|
|
|
|
#define DDS_OFFSET 4+sizeof(DDSURFACEDESC2) //place where the data starts -- should be 128
|
|
|
|
//reads a dds header
|
|
//returns one of the error values
|
|
//'compression_type' comes back as one of the DDS_DXTC* defines
|
|
int dds_read_header(const char *filename, CFILE *img_cfp = NULL, int *width = 0, int *height = 0, int *bpp = 0, int *compression_type = 0, int *levels = 0, int *size = 0, ubyte *palette = NULL);
|
|
|
|
//reads bitmap
|
|
//size of the data it stored in size
|
|
int dds_read_bitmap(const char *filename, ubyte *data, ubyte *bpp = NULL, int cf_type = CF_TYPE_ANY);
|
|
|
|
// writes a DDS file using given data
|
|
void dds_save_image(int width, int height, int bpp, int num_mipmaps, ubyte *data = NULL, int cubemap = 0, const char *filename = NULL);
|
|
|
|
//returns a string from a DDS error code
|
|
const char *dds_error_string(int code);
|
|
|
|
extern int Texture_compression_available;
|
|
extern int Use_compressed_textures;
|
|
|
|
#endif //__DDS_H
|