[gimp-dds] / tags / release-2.0 / mktables.c Repository:
ViewVC logotype

View of /tags/release-2.0/mktables.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 80 - (download) (as text) (annotate)
Fri Nov 2 23:28:56 2007 UTC (2 years ago) by cocidius
File size: 3123 byte(s)
I think i got it this time... Create release 2.0 tag.
    1 #include <stdlib.h>
    2 #include <stdio.h>
    3 
    4 int mul8bit(int a, int b)
    5 {
    6    int t = a * b + 128;
    7    return((t + (t >> 8)) >> 8);
    8 }
    9 
   10 static void prepare_opt_table(unsigned char *tab,
   11                               const unsigned char *expand, int size)
   12 {
   13    int i, mn, mx, bestE, minE, maxE, e;
   14 
   15    for(i = 0; i < 256; ++i)
   16    {
   17       bestE = 256;
   18 
   19       for(mn = 0; mn < size; ++mn)
   20       {
   21          for(mx = 0; mx < size; ++mx)
   22          {
   23             minE = expand[mn];
   24             maxE = expand[mx];
   25             e = abs(maxE + mul8bit(minE - maxE, 0x55) - i);
   26 
   27             if(e < bestE)
   28             {
   29                tab[i * 2 + 0] = mx;
   30                tab[i * 2 + 1] = mn;
   31                bestE = e;
   32             }
   33          }
   34       }
   35    }
   36 }
   37 
   38 int main(void)
   39 {
   40    FILE *fp;
   41    int i, v;
   42    unsigned char expand5[32];
   43    unsigned char expand6[64];
   44    unsigned char quantRB[256 + 16];
   45    unsigned char quantG[256 + 16];
   46    unsigned char omatch5[256][2];
   47    unsigned char omatch6[256][2];
   48 
   49    fp = fopen("dxt_tables.h", "w");
   50    fprintf(fp,
   51            "#ifndef DXT_TABLES_H\n"
   52            "#define DXT_TABLES_H\n\n");
   53 
   54    fprintf(fp,
   55            "static const unsigned char expand5[32] =\n"
   56            "{");
   57    for(i = 0; i < 32; ++i)
   58    {
   59       if(i % 8 == 0) fprintf(fp, "\n   ");
   60       expand5[i] = (i << 3) | (i >> 2);
   61       fprintf(fp, "0x%02x, ", expand5[i]);
   62    }
   63    fprintf(fp, "\n};\n\n");
   64 
   65    fprintf(fp,
   66            "static const unsigned char expand6[64] =\n"
   67            "{");
   68    for(i = 0; i < 64; ++i)
   69    {
   70       if(i % 8 == 0) fprintf(fp, "\n   ");
   71       expand6[i] = (i << 2) | (i >> 4);
   72       fprintf(fp, "0x%02x, ", expand6[i]);
   73    }
   74    fprintf(fp, "\n};\n\n");
   75 
   76    for(i = 0; i < 256 + 16; ++i)
   77    {
   78       v = i - 8;
   79       if(v < 0) v = 0;
   80       if(v > 255) v = 255;
   81       quantRB[i] = expand5[mul8bit(v, 31)];
   82       quantG[i] = expand6[mul8bit(v, 63)];
   83    }
   84 
   85    fprintf(fp,
   86            "static const unsigned char quantRB[256 + 16] =\n"
   87            "{");
   88    for(i = 0; i < 256 + 16; ++i)
   89    {
   90       if(i % 8 == 0) fprintf(fp, "\n   ");
   91       fprintf(fp, "0x%02x, ", quantRB[i]);
   92    }
   93    fprintf(fp, "\n};\n\n");
   94 
   95    fprintf(fp,
   96            "static const unsigned char quantG[256 + 16] =\n"
   97            "{");
   98    for(i = 0; i < 256 + 16; ++i)
   99    {
  100       if(i % 8 == 0) fprintf(fp, "\n   ");
  101       fprintf(fp, "0x%02x, ", quantG[i]);
  102    }
  103    fprintf(fp, "\n};\n\n");
  104 
  105    prepare_opt_table(&omatch5[0][0], expand5, 32);
  106    prepare_opt_table(&omatch6[0][0], expand6, 64);
  107 
  108    fprintf(fp,
  109            "static const unsigned char omatch5[256][2] =\n"
  110            "{");
  111    for(i = 0; i < 256; ++i)
  112    {
  113       if(i % 4 == 0) fprintf(fp, "\n   ");
  114       fprintf(fp, "{0x%02x, 0x%02x}, ", omatch5[i][0], omatch5[i][1]);
  115    }
  116    fprintf(fp, "\n};\n\n");
  117 
  118    fprintf(fp,
  119            "static const unsigned char omatch6[256][2] =\n"
  120            "{");
  121    for(i = 0; i < 256; ++i)
  122    {
  123       if(i % 4 == 0) fprintf(fp, "\n   ");
  124       fprintf(fp, "{0x%02x, 0x%02x}, ", omatch6[i][0], omatch6[i][1]);
  125    }
  126    fprintf(fp, "\n};\n\n");
  127 
  128    fprintf(fp, "#endif\n");
  129 
  130    fclose(fp);
  131 
  132    return(0);
  133 }

ViewVC Help
Powered by ViewVC 1.0.4