wadext/fileformat.h
2016-11-12 12:03:29 +02:00

249 lines
5.2 KiB
C

#include <stdint.h>
enum
{
FG_UNKNOWN = 0,
FG_GFX = 0x10000,
FG_SND = 0x20000,
FG_MUS = 0x30000,
FG_VOX = 0x40000,
FG_FONT = 0x50000,
FG_OTHER = 0x60000,
FG_MASK = 0xff0000,
};
enum
{
FT_MP3BASE = 1,
FT_OGGBASE = 2,
FT_DOOMGFX = FG_GFX + 1,
FT_PNG = FG_GFX + 2,
FT_JPG = FG_GFX + 3,
FT_PCX = FG_GFX + 4,
FT_TGA = FG_GFX + 5,
FT_DDS = FG_GFX + 6,
FT_IMGZ = FG_GFX + 7,
FT_MP3 = FG_SND + FT_MP3BASE,
FT_OGG = FG_SND + FT_OGGBASE,
FT_DOOMSND = FG_SND + 3,
FT_WAV = FG_SND + 4,
FT_VOC = FG_SND + 5,
FT_AIFF = FG_SND + 6,
FT_FLAC = FG_SND + 7,
FT_MP3MUS = FG_MUS + FT_MP3BASE,
FT_OGGMUS = FG_MUS + FT_OGGBASE,
FT_MUS = FG_MUS + 3,
FT_MID = FG_MUS + 4,
FT_XMI = FG_MUS + 5,
FT_HMP = FG_MUS + 6,
FT_HMI = FG_MUS + 7,
FT_SPC = FG_MUS + 8,
FT_MOD = FG_MUS + 9,
FT_IT = FG_MUS + 10,
FT_XM = FG_MUS + 11,
FT_S3M = FG_MUS + 12,
// Todo: add more specialized formats if needed
FT_KVX = FG_VOX + 1,
FT_FON1 = FG_FONT + 1,
FT_FON2 = FG_FONT + 2,
FT_BMF = FG_FONT + 3,
FT_TEXT = FG_OTHER + 1,
FT_BINARY = FG_OTHER + 2,
FT_LEVEL = FG_OTHER + 3,
FT_MARKER = FG_OTHER + 4,
};
struct FileType
{
int type;
const char *extension;
};
// various file format headers for type detection.
// posts are runs of non masked source pixels
struct column_t
{
uint8_t topdelta; // -1 is the last post in a column
uint8_t length; // length data bytes follows
};
struct patch_t
{
uint16_t width; // bounding box size
uint16_t height;
int16_t leftoffset; // pixels to the left of origin
int16_t topoffset; // pixels below the origin
uint32_t columnofs[1]; // only [width] used
// the [0] is &columnofs[width]
};
#pragma pack(1)
struct TGAHeader
{
uint8_t id_len;
uint8_t has_cm;
uint8_t img_type;
int16_t cm_first;
int16_t cm_length;
uint8_t cm_size;
int16_t x_origin;
int16_t y_origin;
int16_t width;
int16_t height;
uint8_t bpp;
uint8_t img_desc;
};
struct PCXHeader
{
uint8_t manufacturer;
uint8_t version;
uint8_t encoding;
uint8_t bitsPerPixel;
uint16_t xmin, ymin;
uint16_t xmax, ymax;
uint16_t horzRes, vertRes;
uint8_t palette[48];
uint8_t reserved;
uint8_t numColorPlanes;
uint16_t uint8_tsPerScanLine;
uint16_t paletteType;
uint16_t horzSize, vertSize;
uint8_t padding[54];
};
#ifndef __BIG_ENDIAN__
#define MAKE_ID(a,b,c,d) ((uint32_t)((a)|((b)<<8)|((c)<<16)|((d)<<24)))
#else
#define MAKE_ID(a,b,c,d) ((uint32_t)((d)|((c)<<8)|((b)<<16)|((a)<<24)))
#endif
#pragma pack()
#define ID_DDS MAKE_ID('D','D','S',' ')
#define ID_DXT1 MAKE_ID('D','X','T','1')
#define ID_DXT2 MAKE_ID('D','X','T','2')
#define ID_DXT3 MAKE_ID('D','X','T','3')
#define ID_DXT4 MAKE_ID('D','X','T','4')
#define ID_DXT5 MAKE_ID('D','X','T','5')
// Bits in dwFlags
#define DDSD_CAPS 0x00000001
#define DDSD_HEIGHT 0x00000002
#define DDSD_WIDTH 0x00000004
#define DDSD_PITCH 0x00000008
#define DDSD_PIXELFORMAT 0x00001000
#define DDSD_MIPMAPCOUNT 0x00020000
#define DDSD_LINEARSIZE 0x00080000
#define DDSD_DEPTH 0x00800000
// Bits in ddpfPixelFormat
#define DDPF_ALPHAPIXELS 0x00000001
#define DDPF_FOURCC 0x00000004
#define DDPF_RGB 0x00000040
// Bits in DDSCAPS2.dwCaps1
#define DDSCAPS_COMPLEX 0x00000008
#define DDSCAPS_TEXTURE 0x00001000
#define DDSCAPS_MIPMAP 0x00400000
// Bits in DDSCAPS2.dwCaps2
#define DDSCAPS2_CUBEMAP 0x00000200
#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_NEGATIZEZ 0x00008000
#define DDSCAPS2_VOLUME 0x00200000
struct DDPIXELFORMAT
{
uint32_t Size; // Must be 32
uint32_t Flags;
uint32_t FourCC;
uint32_t RGBBitCount;
uint32_t RBitMask, GBitMask, BBitMask;
uint32_t RGBAlphaBitMask;
};
struct DDCAPS2
{
uint32_t Caps1, Caps2;
uint32_t Reserved[2];
};
struct DDSURFACEDESC2
{
uint32_t Size; // Must be 124. DevIL claims some writers set it to 'DDS ' instead.
uint32_t Flags;
uint32_t Height;
uint32_t Width;
union
{
int32_t Pitch;
uint32_t LinearSize;
};
uint32_t Depth;
uint32_t MipMapCount;
uint32_t Reserved1[11];
DDPIXELFORMAT PixelFormat;
DDCAPS2 Caps;
uint32_t Reserved2;
};
struct DDSFileHeader
{
uint32_t Magic;
DDSURFACEDESC2 Desc;
};
#define MAXVOXMIPS 5
struct kvxslab_t
{
uint8_t ztop; // starting z coordinate of top of slab
uint8_t zleng; // # of uint8_ts in the color array - slab height
uint8_t backfacecull; // low 6 bits tell which of 6 faces are exposed
uint8_t col[1/*zleng*/];// color data from top to bottom
};
struct FVoxelMipLevel
{
unsigned int SizeX;
unsigned int SizeY;
unsigned int SizeZ;
int *OffsetX;
short *OffsetXY;
uint8_t *SlabData;
};
inline int GetInt(const unsigned char *foo)
{
return *(const int *)foo;
}
inline int GetShort(const unsigned char *foo)
{
return *(const short *)foo;
}
FileType IdentifyFileType(const char *name, const uint8_t *data, int length);
bool FlatToPng(int options, const uint8_t *data, int length, const char *pngpath);
bool PatchToPng(int options, const uint8_t *ldata, int length, const char *pngpath);
bool DoomSndToWav(const uint8_t *data, int length, const char *filename);