/ source / tools / src / cacheinfo.cpp
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  }