forked from Lephenixnoir/unicode-fonts
basic start for uf8x9, README and gen.py updated
This commit is contained in:
parent
0628030524
commit
9cb1272a1c
76
README.md
76
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 <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
44
gen.py
|
@ -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])
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
Loading…
Reference in New Issue