diff --git a/tools/sortchars.c b/tools/sortchars.c index 598213b..1123a2e 100644 --- a/tools/sortchars.c +++ b/tools/sortchars.c @@ -28,15 +28,21 @@ #define FONT 1 /* 0 or 1 */ #define DX 2 #define DY 3 -#define RANGE 4 +#define RANGEBITS 2 +#define RANGE (1 << RANGEBITS) +#define FULLRANGE (1 << (RANGEBITS * DX * DY)) int total[GLYPHS][DX][DY]; +int16_t allbits[GLYPHS]; +int bestchar[FULLRANGE]; static int curve[17] = /* 17 instead of 16 */ { 0, 4, 6, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15 }; +static int distance(uint16_t, uint16_t); + int main(int argc, char *argv[]) { int count[DX][DY]; @@ -98,7 +104,7 @@ int main(int argc, char *argv[]) += img[(w * (y / DY) + (x / DX)) * 4 + 1]; } - /* Compute max value */ + /* Compute max pixel value */ max = 0; for(i = 0x20; i < GLYPHS; i++) for(y = 0; y < DY; y++) @@ -109,34 +115,80 @@ int main(int argc, char *argv[]) max = val; } + /* Compute bits for all glyphs */ for(i = 0x20; i < GLYPHS; i++) { int bits = 0; if(i >= 0x7f && i <= 0x9f) + { + allbits[i] = 0; continue; - - ret = cucul_utf32_to_utf8(utf8, i); - utf8[ret] = '\0'; + } for(y = 0; y < DY; y++) { for(x = 0; x < DX; x++) { int t = total[i][x][y] * 16 * 256 / (count[x][y] * max); - t = curve[t] / (16 / RANGE); - - printf("%d ", t); bits *= RANGE; - bits |= t; + bits |= curve[t] / (16 / RANGE); + } + } + + allbits[i] = bits; + } + + /* Find a glyph for all combinations */ + for(i = 0; i < FULLRANGE; i++) + { + int j, mindist = 0x1000, best = 0; + + for(j = 0x20; j < GLYPHS; j++) + { + int d = distance(i, allbits[j]); + if(d < mindist) + { + best = j; + mindist = d; + if(d == 0) + break; } } - printf(" 0x%04d (%s)\n", bits, utf8); + bestchar[i] = best; } + /* Print results */ + printf("/* Generated by sortchars.c */\n"); + printf("static char const lookup_ascii[%i] =\n{\n ", FULLRANGE); + for(i = 0; i < FULLRANGE; i++) + { + ret = cucul_utf32_to_utf8(utf8, bestchar[i]); + utf8[ret] = '\0'; + printf("%i, ", bestchar[i]); + if((i % 16) == 15 && i != FULLRANGE - 1) + printf("\n "); + } + printf("\n};\n"); + cucul_free_canvas(cv); return 0; } +static int distance(uint16_t a, uint16_t b) +{ + int i, d = 0; + + for(i = 0; i < DX * DY; i++) + { + int x = (int)(a & (RANGE - 1)) - (int)(b & (RANGE - 1)); + d += x * x; + a /= RANGE; + b /= RANGE; + } + + return d; +} +