[kandinsky] Cleanup KDFont, include all characters

This commit is contained in:
Romain Goyet
2018-10-09 17:13:25 +02:00
committed by LeaNumworks
parent c183f0147e
commit aeab06513e
2 changed files with 11 additions and 70 deletions

2
.gitignore vendored
View File

@@ -21,6 +21,8 @@ poincare/src/simplification/demo_ruleset.h
# Font related generated files.
kandinsky/fonts/rasterizer
kandinsky/src/font_large.cpp
kandinsky/src/font_small.cpp
# No i18n headers
apps/i18n.h

View File

@@ -43,6 +43,7 @@ void writeImageToPNGFile(image_t * image, char * filename);
#define CHARACTER_RANGE_START 0x20
#define CHARACTER_RANGE_END 0x7E
#define CHARACTER_COUNT (CHARACTER_RANGE_END-CHARACTER_RANGE_START)
#define GLYPH_COUNT (CHARACTER_COUNT + NUMBER_OF_SYMBOLS)
#define GRID_WIDTH 19
#define GRID_HEIGHT 8
@@ -192,9 +193,6 @@ int main(int argc, char * argv[]) {
FILE * sourceFile = fopen(output_cpp, "w");
#define NEW_FORMAT 1
#if NEW_FORMAT
fprintf(sourceFile, "/* This file is auto-generated by the rasterizer */\n\n");
fprintf(sourceFile, "#include <kandinsky/font.h>\n\n");
fprintf(sourceFile, "static constexpr KDCoordinate glyphWidth = %d;\n\n", glyph_width);
@@ -205,12 +203,12 @@ int main(int argc, char * argv[]) {
int sizeOfUncompressedGlyphBuffer = glyph_width * glyph_height * greyscaleBitsPerPixel/8;
uint8_t * uncompressedGlyphBuffer = (uint8_t *)malloc(sizeOfUncompressedGlyphBuffer);
uint16_t glyphDataOffset[CHARACTER_COUNT+1];
int maxGlyphDataSize = CHARACTER_COUNT* sizeOfUncompressedGlyphBuffer;
uint16_t glyphDataOffset[GLYPH_COUNT+1];
int maxGlyphDataSize = GLYPH_COUNT* sizeOfUncompressedGlyphBuffer;
uint8_t * glyphData = (uint8_t *)malloc(maxGlyphDataSize);
uint16_t lastOffset = 0;
for (int character = 0; character <= CHARACTER_COUNT; character++) {
for (int character = 0; character <= GLYPH_COUNT; character++) {
int characterX = (character%GRID_WIDTH * (glyph_width+grid_size));
int characterY = (character/GRID_WIDTH * (glyph_height+grid_size));
uint8_t accumulator = 0;
@@ -244,16 +242,16 @@ int main(int argc, char * argv[]) {
glyphDataOffset[character] = lastOffset;
lastOffset += sizeOfCompressedGlyphBuffer;
}
glyphDataOffset[CHARACTER_COUNT] = lastOffset;
glyphDataOffset[GLYPH_COUNT] = lastOffset;
fprintf(sourceFile, "static constexpr uint16_t glyphDataOffset[%d] = {", CHARACTER_COUNT+1);
prettyPrintArray(sourceFile, 80, 2, glyphDataOffset, CHARACTER_COUNT+1);
fprintf(sourceFile, "static constexpr uint16_t glyphDataOffset[%d] = {", GLYPH_COUNT+1);
prettyPrintArray(sourceFile, 80, 2, glyphDataOffset, GLYPH_COUNT+1);
fprintf(sourceFile, "};\n\n");
size_t finalDataSize = lastOffset;
size_t initialDataSize = CHARACTER_COUNT * glyph_width * glyph_height;
size_t initialDataSize = GLYPH_COUNT * glyph_width * glyph_height;
fprintf(sourceFile, "/* Rasterized = %5d bytes (%d glyphs x %d pixels)\n", initialDataSize, CHARACTER_COUNT, glyph_width*glyph_height);
fprintf(sourceFile, "/* Rasterized = %5d bytes (%d glyphs x %d pixels)\n", initialDataSize, GLYPH_COUNT, glyph_width*glyph_height);
fprintf(sourceFile, " * Downsampled = %5d bytes (1/%d of rasterized)\n", initialDataSize*greyscaleBitsPerPixel/8, 8/greyscaleBitsPerPixel);
fprintf(sourceFile, " * Compressed = %5d bytes (%.2f%% of rasterized) */\n", finalDataSize, 100.0*finalDataSize/initialDataSize);
@@ -266,67 +264,8 @@ int main(int argc, char * argv[]) {
fprintf(sourceFile, "const KDFont KDFont::private%s(glyphWidth, glyphHeight, glyphDataOffset, glyphData);\n", font_name);
#else
fprintf(sourceFile, "/* Auto-generated by rasterizer */\n\n");
fprintf(sourceFile, "const unsigned char bitmap%s[%d][%d][%d] = {\n", font_name, NUMBER_OF_SYMBOLS+CHARACTER_RANGE_END-CHARACTER_RANGE_START+1, glyph_height, glyph_width);
for (unsigned char character = CHARACTER_RANGE_START; character <= CHARACTER_RANGE_END; character++) {
fprintf(sourceFile, " {\n");
int characterX = ((character-CHARACTER_RANGE_START)%GRID_WIDTH * (glyph_width+grid_size));
int characterY = ((character-CHARACTER_RANGE_START)/GRID_WIDTH * (glyph_height+grid_size));
for (int y = 0; y < glyph_height; y++) {
fprintf(sourceFile, " {");
for (int x = 0; x < glyph_width; x++) {
pixel_t * pixel = (bitmap_image.pixels + (y+characterY)*bitmap_image.width + (x+characterX));
fprintf(sourceFile, "0x%02x", 0xFF - pixel->green);
if (x+1 < glyph_width) {
fprintf(sourceFile, ", ");
}
}
fprintf(sourceFile, "}");
if (y+1 < glyph_height) {
fprintf(sourceFile, ",");
}
fprintf(sourceFile, "\n");
}
fprintf(sourceFile, " }");
fprintf(sourceFile, ",");
fprintf(sourceFile, "\n");
}
for (int charIndex = 0; charIndex < NUMBER_OF_SYMBOLS; charIndex++) {
wchar_t wideChar = codePointForSymbol[charIndex];
fprintf(sourceFile, " {\n");
int characterX = ((charIndex+1+CHARACTER_RANGE_END-CHARACTER_RANGE_START)%GRID_WIDTH * (glyph_width+grid_size));
int characterY = ((charIndex+1+CHARACTER_RANGE_END-CHARACTER_RANGE_START)/GRID_WIDTH * (glyph_height+grid_size));
for (int y = 0; y < glyph_height; y++) {
fprintf(sourceFile, " {");
for (int x = 0; x < glyph_width; x++) {
pixel_t * pixel = (bitmap_image.pixels + (y+characterY)*bitmap_image.width + (x+characterX));
fprintf(sourceFile, "0x%02x", 0xFF - pixel->green);
if (x+1 < glyph_width) {
fprintf(sourceFile, ", ");
}
}
fprintf(sourceFile, "}");
if (y+1 < glyph_height) {
fprintf(sourceFile, ",");
}
fprintf(sourceFile, "\n");
}
fprintf(sourceFile, " }");
if (charIndex < NUMBER_OF_SYMBOLS - 1) {
fprintf(sourceFile, ",");
}
fprintf(sourceFile, "\n");
}
fprintf(sourceFile, "};\n");
#endif
fclose(sourceFile);
free(bitmap_image.pixels);
return 0;