Changeset 1841


Ignore:
Timestamp:
Oct 22, 2007, 12:15:54 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Updates to sortchars.c so that it can output a proper LUT.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/tools/sortchars.c

    r1840 r1841  
    2929#define DX 2
    3030#define DY 3
    31 #define RANGE 4
     31#define RANGEBITS 2
     32#define RANGE (1 << RANGEBITS)
     33#define FULLRANGE (1 << (RANGEBITS * DX * DY))
    3234
    3335int total[GLYPHS][DX][DY];
     36int16_t allbits[GLYPHS];
     37int bestchar[FULLRANGE];
    3438
    3539static int curve[17] = /* 17 instead of 16 */
     
    3741    0, 4, 6, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15
    3842};
     43
     44static int distance(uint16_t, uint16_t);
    3945
    4046int main(int argc, char *argv[])
     
    99105    }
    100106
    101     /* Compute max value */
     107    /* Compute max pixel value */
    102108    max = 0;
    103109    for(i = 0x20; i < GLYPHS; i++)
     
    110116            }
    111117
     118    /* Compute bits for all glyphs */
    112119    for(i = 0x20; i < GLYPHS; i++)
    113120    {
     
    115122
    116123        if(i >= 0x7f && i <= 0x9f)
     124        {
     125            allbits[i] = 0;
    117126            continue;
    118 
    119         ret = cucul_utf32_to_utf8(utf8, i);
    120         utf8[ret] = '\0';
     127        }
    121128
    122129        for(y = 0; y < DY; y++)
     
    125132            {
    126133                int t = total[i][x][y] * 16 * 256 / (count[x][y] * max);
    127                 t = curve[t] / (16 / RANGE);
    128 
    129                 printf("%d ", t);
    130134                bits *= RANGE;
    131                 bits |= t;
     135                bits |= curve[t] / (16 / RANGE);
    132136            }
    133137        }
    134138
    135         printf(" 0x%04d (%s)\n", bits, utf8);
     139        allbits[i] = bits;
    136140    }
     141
     142    /* Find a glyph for all combinations */
     143    for(i = 0; i < FULLRANGE; i++)
     144    {
     145        int j, mindist = 0x1000, best = 0;
     146
     147        for(j = 0x20; j < GLYPHS; j++)
     148        {
     149            int d = distance(i, allbits[j]);
     150            if(d < mindist)
     151            {
     152                best = j;
     153                mindist = d;
     154                if(d == 0)
     155                    break;
     156            }
     157        }
     158
     159        bestchar[i] = best;
     160    }
     161
     162    /* Print results */
     163    printf("/* Generated by sortchars.c */\n");
     164    printf("static char const lookup_ascii[%i] =\n{\n    ", FULLRANGE);
     165    for(i = 0; i < FULLRANGE; i++)
     166    {
     167        ret = cucul_utf32_to_utf8(utf8, bestchar[i]);
     168        utf8[ret] = '\0';
     169        printf("%i, ", bestchar[i]);
     170        if((i % 16) == 15 && i != FULLRANGE - 1)
     171            printf("\n    ");
     172    }
     173    printf("\n};\n");
    137174
    138175    cucul_free_canvas(cv);
     
    141178}
    142179
     180static int distance(uint16_t a, uint16_t b)
     181{
     182    int i, d = 0;
     183
     184    for(i = 0; i < DX * DY; i++)
     185    {
     186        int x = (int)(a & (RANGE - 1)) - (int)(b & (RANGE - 1));
     187        d += x * x;
     188        a /= RANGE;
     189        b /= RANGE;
     190    }
     191
     192    return d;
     193}
     194
Note: See TracChangeset for help on using the changeset viewer.