tachibana/charmap_gen.ipynb
2021-06-17 19:16:34 +02:00

164 lines
15 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 96,
"id": "leading-oasis",
"metadata": {},
"outputs": [],
"source": [
"import string\n",
"import contextlib\n",
"import itertools\n",
"\n",
"import bdfparser\n",
"from PIL import Image\n",
"import numpy as np\n",
"import jinja2"
]
},
{
"cell_type": "code",
"execution_count": 104,
"id": "plastic-command",
"metadata": {},
"outputs": [],
"source": [
"class GlyphTableGenerator:\n",
" IS_PRINTABLE_TPL = '''\n",
"module gen_charmap_is_printable_{{font_id}}(input glyph[15:0], output reg is_printable) begin\n",
" always @(glyph) begin\n",
" case(glyph)\n",
" {% for glyph in glyphs %} 16'h{{ '{:04x}'.format(ord(glyph)) }}: is_printable <= 1;\n",
" {% endfor %} default: is_printable <= 0;\n",
" endcase\n",
" end\n",
"end\n",
"'''\n",
" \n",
" def __init__(self, font_id, bdf_file, glyph_w, glyph_h, chars=[chr(x) for x in range(128)]):\n",
" self.font_id = font_id\n",
" self.font = bdfparser.Font(bdf_file)\n",
" self.chars = chars # [ char for char in chars if ord(char) in font.glyphs ]\n",
" self.glyph_w, self.glyph_h = glyph_w, glyph_h\n",
" \n",
" self.glyphs = [ font.glyph(char).draw().crop(self.glyph_w, self.glyph_h)\n",
" if ord(char) in font.glyphs else bdfparser.Bitmap(['0'*glyph_w]*glyph_h)\n",
" for char in self.chars ]\n",
" self.glyphtable = bdfparser.Bitmap.concatall(self.glyphs, direction=0)\n",
" \n",
" def font_preview(self):\n",
" preview = self.font.drawall()\n",
" return Image.frombytes('1', (preview.width(), preview.height()), preview.tobytes('1'))\n",
"\n",
" def glyphtable_preview(self):\n",
" return Image.frombytes('1',\n",
" (self.glyphtable.width(), self.glyphtable.height()),\n",
" self.glyphtable.tobytes('1')).rotate(90, expand=True)\n",
"\n",
" def write_printable_table(self):\n",
" with open(f'src/gen/gen_charmap_is_printable_{self.font_id}.v', 'w') as f, contextlib.redirect_stdout(f):\n",
" print(jinja2.Environment().from_string(IS_PRINTABLE_TPL, globals=globals()).render(\n",
" font_id=self.font_id,\n",
" glyphs=self.chars,\n",
" ord=ord\n",
" ))\n",
"\n",
" def write_glyphtable_memory_init_file(self):\n",
" with open(f'src/gen/gen_glyphtable_{self.font_id}.hex', 'w') as f, contextlib.redirect_stdout(f):\n",
" for row in np.array(self.glyphtable.todata(2)):\n",
" width = (len(row)+3)//4\n",
" print(format(int(''.join(str(b) for b in row), 2), 'x').zfill(width))\n",
"\n",
" def write_font_param_file(self):\n",
" with open(f'src/gen/gen_font_params_{self.font_id}.vh', 'w') as f, contextlib.redirect_stdout(f):\n",
" print(f'`define GEN_FONT_GLYPH_W_{self.font_id} {self.glyph_w}')\n",
" print(f'`define GEN_FONT_GLYPH_H_{self.font_id} {self.glyph_h}')\n",
" print(f'`define GEN_FONT_GLYPH_COUNT_{self.font_id} {len(self.chars)}')\n"
]
},
{
"cell_type": "code",
"execution_count": 94,
"id": "divided-bookmark",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<PIL.Image.Image image mode=1 size=512x352 at 0x7FCB9E2C2730>"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"default_glyphtable_gen = GlyphTableGenerator('default', 'terminus-font-4.49.1/ter-u16n.bdf', 8, 16)\n",
"\n",
"default_glyphtable_gen.write_printable_table()\n",
"default_glyphtable_gen.write_glyphtable_memory_init_file()\n",
"default_glyphtable_gen.write_font_param_file()\n",
"\n",
"default_glyphtable_gen.font_preview()"
]
},
{
"cell_type": "code",
"execution_count": 95,
"id": "joint-network",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAACAAAAAAIAQAAAABFYCKXAAAC7klEQVR4nOWUT27bRhTGf6QVwykKcBZdFMiCs8giuwrIMgvzCDlCTlDrBtINLPQC9g2aG5gsEMBZUbugMGSO7BQu0CYzhheRxD9fF5ScGE2BNs6uHwES7715783HefNF4v+N+PX0a5RpJkuLU+gtffJeWMLbcGkLU1nZUy7tItvmwFsWw4W5tL8fX2cuOK5sYcDhAqEwhVnYCxbfXwRvHYX9hcLMZjNOw8fG0JrWdq4w7cSxGrQGoAnQmta0trWruKE5JqzMipVdz1aDZpN/DFB53RuHypP3vvz5Ku3t9UknqZNU6szLz/3c+/Hcz/2vmvvzSpK8r8ed5npzcK65r7yvKl/p3LeS8tRX8l4aV/5clT+v5r6SfLev6mb/RmdeUil5qZbWvu6fgzPV72pJpzttJdWqtYmoPqi9vPbluxO9W/nKS628pNia+5//iGcjeMzNDFy4zuJ8G3lMTGEjYA+ABxPAAOwF0CR6zmYegunoAHAhne052EOT3oHr10RT3MP8G2JcYFSYANy2+ojwdB05wmc2OoUohwiA3yxA/F/J/h3Fc4CfvlsNxRQTdAzrjBkwe0jEDy6awKCnYADWs/Vs4KDLopd3a0XAwloGOcSbS4Qlh4UBUA6RiYA2T53j7g94YABe2wFRXtj+MmzxagggCxBNdoaFaWcBiF34UuJb7L+c8mr6459/vPiWEdGLYLpsN+cJMNzJoskeZDExYGAEsDvcfRLn0Nj+RO4idRBNYDsRwATSABpF2YdMIZos7AfA9qFbPAoAT11fZeeWWQw8c8AocsqA7JHbD/SDdXp4fw2Q6vF7/6bsNhrQaasBKl0qXZVXR924qEJa6SJdbNbUY+8vVXmX5IlL8yTffCUd5UmeePW2S/Pk8qhSnhZSVZY3qg6lUlsNUJonTdqkTVqr6fNv8kSqtUyadBk16TJpfK1lupT8qlymddnv80QSX4O+JF1/oZq69J8iefKpVd36yn9ZeZl8xnenWynpL8gRenmHTEe6AAAAAElFTkSuQmCC\n",
"text/plain": [
"<PIL.Image.Image image mode=1 size=2048x8 at 0x7FCB9E351E80>"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"default_glyphtable_gen.glyphtable_preview()"
]
},
{
"cell_type": "code",
"execution_count": 107,
"id": "revised-launch",
"metadata": {},
"outputs": [],
"source": [
"with open('test_bench/test_data/test_glyphmem_data.hex', 'w') as f:\n",
" for c in itertools.islice(itertools.cycle(string.printable), 256*128):\n",
" print(f'{ord(c):04x}', file=f)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}