basic start for uf8x9, README and gen.py updated

This commit is contained in:
Lephenixnoir 2021-03-06 16:28:20 +01:00
parent 0628030524
commit 9cb1272a1c
Signed by untrusted user who does not match committer: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
7 changed files with 86 additions and 34 deletions

View File

@ -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 <gint/display.h>
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!");
```

44
gen.py
View File

@ -5,21 +5,21 @@ import sys
import os
import re
if len(sys.argv) <= 1:
print(f"usage: {sys.argv[0]} <block files...>")
if len(sys.argv) != 3:
print(f"usage: {sys.argv[0]} <FONT FOLDER> <OUTPUT IMAGE>")
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])

BIN
uf8x9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
uf8x9/U+0020.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
uf8x9/U+00A0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
uf8x9/U+0100.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
uf8x9/U+0370.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB