mirror of
https://github.com/ZDoom/wadext.git
synced 2024-11-24 21:01:21 +00:00
249 lines
5.2 KiB
C
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);
|