// XXX: This program is not in sync with EDuke32 (e.g. texcacheheader type). #include #include #include #include #include "compat.h" #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 typedef struct { char magic[8]; // 'Polymost' int xdim, ydim; // of image, unpadded int flags; // 1 = !2^x, 2 = has alpha, 4 = lzw compressed } texcacheheader; typedef struct { int size; int format; int xdim, ydim; // of mipmap (possibly padded) int border, depth; } texcachepicture; int main(void) { DIR *dir; struct dirent *dirent; struct stat st; FILE *fp; texcacheheader head; texcachepicture mip; dir = opendir("."); while ((dirent = readdir(dir))) { if (stat(dirent->d_name, &st)) { printf("%s: failed to stat\n", dirent->d_name); continue; } if (!(st.st_mode&S_IFREG)) { printf("%s: not a regular file\n", dirent->d_name); continue; } fp = fopen(dirent->d_name,"rb"); if (!fp) { printf("%s: failed to open\n", dirent->d_name); continue; } if (fread(&head, sizeof(head), 1, fp) != 1) { fclose(fp); printf("%s: failed to read header\n", dirent->d_name); continue; } head.xdim = B_LITTLE32(head.xdim); head.ydim = B_LITTLE32(head.ydim); head.flags = B_LITTLE32(head.flags); if (fread(&mip, sizeof(mip), 1, fp) != 1) { fclose(fp); printf("%s: failed to read mipmap header\n", dirent->d_name); continue; } mip.format = B_LITTLE32(mip.format); fclose(fp); if (memcmp(head.magic, "Polymost", 8)) { printf("%s: bad signature\n", dirent->d_name); continue; } else { char const * format; char flags[4] = "", flagsc = 0; switch (mip.format) { case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: format = "RGB DXT1"; break; case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: format = "RGBA DXT1"; break; case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: format = "RGBA DXT3"; break; case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: format = "RGBA DXT5"; break; default: format = "Unknown"; break; } if (head.flags&1) flags[flagsc++] = '2'; if (head.flags&2) flags[flagsc++] = 'A'; if (head.flags&4) flags[flagsc++] = 'L'; flags[flagsc++] = 0; printf("%s: flags=%s format=%s\n", dirent->d_name, flags, format); } } closedir(dir); return 0; }