cacheinfo.cpp
1 // XXX: This program is not in sync with EDuke32 (e.g. texcacheheader type). 2 3 #include "compat.h" 4 #include <dirent.h> 5 6 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 7 #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 8 #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 9 #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 10 11 typedef struct { 12 char magic[8]; // 'Polymost' 13 int xdim, ydim; // of image, unpadded 14 int flags; // 1 = !2^x, 2 = has alpha, 4 = lzw compressed 15 } texcacheheader; 16 typedef struct { 17 int size; 18 int format; 19 int xdim, ydim; // of mipmap (possibly padded) 20 int border, depth; 21 } texcachepicture; 22 23 int main(void) 24 { 25 DIR *dir; 26 struct dirent *dirent; 27 struct stat st; 28 FILE *fp; 29 texcacheheader head; 30 texcachepicture mip; 31 32 dir = opendir("."); 33 while ((dirent = readdir(dir))) { 34 if (stat(dirent->d_name, &st)) { 35 printf("%s: failed to stat\n", dirent->d_name); 36 continue; 37 } 38 if (!(st.st_mode&S_IFREG)) { 39 printf("%s: not a regular file\n", dirent->d_name); 40 continue; 41 } 42 43 fp = fopen(dirent->d_name,"rb"); 44 if (!fp) { 45 printf("%s: failed to open\n", dirent->d_name); 46 continue; 47 } 48 49 if (fread(&head, sizeof(head), 1, fp) != 1) { 50 fclose(fp); 51 printf("%s: failed to read header\n", dirent->d_name); 52 continue; 53 } 54 head.xdim = B_LITTLE32(head.xdim); 55 head.ydim = B_LITTLE32(head.ydim); 56 head.flags = B_LITTLE32(head.flags); 57 if (fread(&mip, sizeof(mip), 1, fp) != 1) { 58 fclose(fp); 59 printf("%s: failed to read mipmap header\n", dirent->d_name); 60 continue; 61 } 62 mip.format = B_LITTLE32(mip.format); 63 fclose(fp); 64 if (memcmp(head.magic, "Polymost", 8)) { 65 printf("%s: bad signature\n", dirent->d_name); 66 continue; 67 } 68 else { 69 char const * format; 70 char flags[4] = "", flagsc = 0; 71 switch (mip.format) { 72 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: format = "RGB DXT1"; break; 73 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: format = "RGBA DXT1"; break; 74 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: format = "RGBA DXT3"; break; 75 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: format = "RGBA DXT5"; break; 76 default: format = "Unknown"; break; 77 } 78 if (head.flags&1) flags[flagsc++] = '2'; 79 if (head.flags&2) flags[flagsc++] = 'A'; 80 if (head.flags&4) flags[flagsc++] = 'L'; 81 flags[flagsc++] = 0; 82 83 printf("%s: flags=%s format=%s\n", dirent->d_name, flags, format); 84 } 85 } 86 closedir(dir); 87 88 return 0; 89 }