diff --git a/README.md b/README.md index 38f66fd..03b06a0 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,27 @@ -# uf5x7: A 5x7 Unicode font +# Unicode fonts -uf5x7 is a 5x7 font that suports most of the common Unicode blocks. It can be -used in C.Basic with the custom font mechanism or in add-ins if the font -manager supports it. +This repository contains Unicode fonts that support most of the common Unicode +blocks. They can be used in C.Basic with the custom font mechanism or in +add-ins if there is a font manager (as of March 2021 only gint has one). -![Preview image: "Mézalors Δ=2 ⇒ ∀x∈S, x⊆Δ"](https://www.planet-casio.com/files/forums/preview-166451.png) +There are currently two fonts in this repository: -The font is **under CC0**, there are no conditions for using it. A link back here -would be appreciated though! +* [uf5x7: A 5x7 Unicode extension for fx-9860G](#uf5x7-an-unicode-extension-for-fx-9860g) +* [uf8x9: An original Unicode font for fx-CG](#uf8x9-an-original-unicode-font-for-fx-cg) + +The fonts are **under CC0**, there are no conditions for using them. A link +back here would be appreciated though! Related topic on Planète Casio: [Police 5x7 Unicode pour add-ins et C.Basic](https://www.planet-casio.com/Fr/forums/topic15732-1-Police-5x7-Unicode-pour-add-ins-et-C.Basic.html) -Currently the following blocks have been drawn: +## uf5x7: An Unicode extension for fx-9860G + +uf5x7 is a basic Unicode font mostly suitable for calculators of the fx-9860G +series (the ones with small 128x64 displays). + +![Preview image: "Mézalors Δ=2 ⇒ ∀x∈S, x⊆Δ"](https://www.planet-casio.com/files/forums/preview-166451.png) + +Supported blocks: * `U+0020 .. U+007F` - ASCII (128 chars) * `U+00A0 .. U+00FF` - Latin-1 Supplement (96 chars) @@ -41,17 +51,38 @@ Other characters supported in `FONTCHARACTER` (incomplete list): * `U+2139` - Imaginary number * `U+231F` - Fraction symbol -## Constructing a full image of the font +Full font: -The `gen.py` script can be used to generate `uf5x7.png`, the full image of the -font. You will need Python 3 and Pillow (PIL might be okay). +![](uf5x7.png) + +## uf8x9: An original Unicode font for fx-CG + +uf8x9 is a font designed specifically for the large fx-CG display (396x224), +which is thin vertically and thick horizontally. + +Supported blocks: + +* `U+0020 .. U+007F` - ASCII (128 chars) +* `U+00A0 .. U+00FF` - Latin-1 Supplement (96 chars) +* `U+0100 .. U+017F` - Latin Extended-A (128 chars) +* `U+0370 .. U+03FF` - Greek (144 chars) + +Full font: + +![](uf8x9.png) + +## Constructing full font images + +Use `gen.py` too generate the full images from the sections. You will need +Python 3 and Pillow (PIL might be okay). ```sh -% ./gen.py uf5x7/* +% ./gen.py uf5x7/ uf5x7.png +% ./gen.py uf8x9/ uf8x9.png ``` It will read each block's position from its file name (which should be on the -form `U\+[0-9A-Fa-f]{4}.png`) and guess the block end from the image +form `U\+[0-9A-Fa-f]{4}.png`) and guess the block size from the image dimensions. For image files with a different name, it will output an anonymous block. @@ -72,6 +103,7 @@ applied to all block images. ```sh % fxconv -f uf5x7/ name:uf5x7 charset:unicode grid.size:5x7 grid.padding:1 +% fxconv -f uf8x9/ name:uf8x9 charset:unicode grid.size:8x11 grid.padding:1 proportional:true height:9 ``` When using the fxSDK, add the `uf5x7` folder to your list of metadata files and @@ -84,6 +116,15 @@ uf5x7: # Note that this is a folder charset: unicode grid.size: 5x7 grid.padding: 1 + +uf8x9: + type: font + name: uf8x9 + charset: unicode + grid.size: 8x11 + grid.padding: 1 + proportional: true + height: 9 ``` To use the font, configure it with `dfont()`, then call `dtext()` as usual. @@ -91,5 +132,12 @@ Make sure the string is encoded as UTF-8. The `u8` prefix can be used if your source file is not encoded as UTF-8. ```c -dtext(5, 5, "Mézalors Δ=2 ⇒ ∀x∈S, x⊆Δ", BLACK, WHITE); +#include +extern font_t uf5x7, uf8x9; + +dfont(uf5x7); +dtext(5, 5, C_BLACK, "Mézalors Δ=2 ⇒ ∀x∈S, x⊆Δ"); + +dfont(uf8x9); +dtext(5, 15, C_BLACK, "Δt+(3-θ²)! Eurêka!"); ``` diff --git a/gen.py b/gen.py index ebb35ea..948f374 100755 --- a/gen.py +++ b/gen.py @@ -5,21 +5,21 @@ import sys import os import re -if len(sys.argv) <= 1: - print(f"usage: {sys.argv[0]} ") +if len(sys.argv) != 3: + print(f"usage: {sys.argv[0]} ") sys.exit(1) -files = sorted(sys.argv[1:]) +files = sorted(sys.argv[1] + "/" + x for x in os.listdir(sys.argv[1])) chars = PIL.Image.open("gen-chars.png") WHITE = (255, 255, 255) BLACK = (0, 0, 0) -def empty_separator(): - img = PIL.Image.new("RGB", (112, 9), color=WHITE) +def empty_separator(width): + img = PIL.Image.new("RGB", (width, 9), color=WHITE) for j in range(3, 6): - for i in range(1, 111): + for i in range(1, width-1): if not ((i + j) & 1): img.putpixel((i, j), BLACK) @@ -41,26 +41,26 @@ def char_image(c): index = 4 * char_index(c) return chars.crop((index, 0, index + 3, 5)) -def separator(start, end): - img = PIL.Image.new("RGB", (112, 9), color=WHITE) +def separator(start, end, width): + img = PIL.Image.new("RGB", (width, 9), color=WHITE) for j in range(3, 6): - for i in range(1, 26): + for i in range(1, width//2 - 30): if not ((i + j) & 1): img.putpixel((i, j), BLACK) - for i in range(86, 111): + for i in range(width//2 + 30, width-1): if not ((i + j) & 1): img.putpixel((i, j), BLACK) - x = 27 + x = width//2 - 29 for c in "U+{:04X}".format(start): img.paste(char_image(c), (x, 2)) x += 4 - for i in range(54, 58): + for i in range(width//2 - 2, width//2 + 2): img.putpixel((i, 4), BLACK) - x = 62 + x = width//2 + 6 for c in "U+{:04X}".format(end): img.paste(char_image(c), (x, 2)) x += 4 @@ -85,11 +85,11 @@ class Block: else: print(f'{basename} not a block') - def header(self): + def header(self, width): if self.block_start is not None: - return separator(self.block_start, self.block_end) + return separator(self.block_start, self.block_end, width) else: - return empty_separator() + return empty_separator(width) def body(self): return self.img @@ -97,7 +97,11 @@ class Block: def height(self): return self.img.height + 9 + def width(self): + return self.img.width + blocks = [ Block(file) for file in files ] +width = max(b.width() for b in blocks) height = sum(b.height() for b in blocks) left_height = 0 @@ -105,13 +109,13 @@ for b in blocks: left_height += b.height() if 2 * left_height >= height: break -result = PIL.Image.new("RGB", (2 * 112 + 8, left_height), color=WHITE) +result = PIL.Image.new("RGB", (2 * width + 8, left_height), color=WHITE) x = 0 y = 0 for b in blocks: - header = b.header() + header = b.header(width) result.paste(header, (x, y)) y += header.height @@ -121,6 +125,6 @@ for b in blocks: if y >= left_height: y = 0 - x += 112 + 8 + x += width + 8 -result.save("uf5x7.png") +result.save(sys.argv[2]) diff --git a/uf8x9.png b/uf8x9.png new file mode 100644 index 0000000..ffec309 Binary files /dev/null and b/uf8x9.png differ diff --git a/uf8x9/U+0020.png b/uf8x9/U+0020.png new file mode 100644 index 0000000..c36367b Binary files /dev/null and b/uf8x9/U+0020.png differ diff --git a/uf8x9/U+00A0.png b/uf8x9/U+00A0.png new file mode 100644 index 0000000..761f42d Binary files /dev/null and b/uf8x9/U+00A0.png differ diff --git a/uf8x9/U+0100.png b/uf8x9/U+0100.png new file mode 100644 index 0000000..172fce2 Binary files /dev/null and b/uf8x9/U+0100.png differ diff --git a/uf8x9/U+0370.png b/uf8x9/U+0370.png new file mode 100644 index 0000000..22e58b6 Binary files /dev/null and b/uf8x9/U+0370.png differ