| @@ -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; | |||
| } | |||