katsuji
活字, movable type. Variable-width font tooling for a816 SNES projects.
Build a project's fonts and strings
katsuji.toml at the project root:
[fonts.dialog]
png = "fonts/vwf.png"
cell = [8, 16]
table = "text/ff4fr.tbl"
output = "assets/font.dat"
widths = { "0xFF" = 3, "0xA0" = -1 } # negative trims, positive sets
kerning-candidates = ["Ta", "Te", "va"] # tested for collision kerning
kerning = { "tt" = 2 } # hand-tuned: pixels tighter
[fonts.menu]
png = "fonts/8x8vwf.png"
cell = [8, 8]
table = "text/ff4_menus.tbl"
output = "assets/menu_font.dat"
constants = "assets/menu_font.i" # a816 constants describing the file
[strings.items]
font = "menu"
file = "text/items.txt" # one string per line (or `texts = [...]`)
bpp = 2
ink = 3
paper = 1
blob = "assets/items_vwf.dat" # tiles, no string across a bank edge
index = "assets/items_vwf.idx" # 4 bytes per string: offset lo16, bank, tiles
katsuji build # writes every output, paths relative to katsuji.toml
katsuji banner "Tarot" --table text/ff4fr.tbl --font assets/font.dat
Library
Atlas: a font drawn as a PNG grid of cells.find_kerning/pair_kerning: pair kerning by collision (one diagonal touch, never side by side).VwfFont: the font file the a816 VWF runtime reads (1bpp rows + width per glyph, kerning pairs, height).render/measure: text set at build time exactly as the runtime sets it.Wrapper: word wrap by pixel width, the game's control codes as data.Window/WindowBuilder: fill text windows; a game's script rules drive them.encode_tiles/colourize: SNES 2bpp / 4bpp planar tiles.text_tiles/pack_runs: static strings pre-rendered to a bank-safe blob.
Grown from ff4's tooling: its five fonts rebuild byte for byte, its wrapping and dialog goldens pass.
uv sync
make check
Metadata
Release files for katsuji 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| katsuji-0.1.1.tar.gz | 93.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| katsuji-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 115.1 kB
Release files / katsuji-0.1.1.tar.gz
| Download URL | katsuji-0.1.1.tar.gz |
|---|---|
| Size | 93.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f1e26bf8bcea4eae7b4c8888f3bf19c5ca3ef2e49b06d3d1bad2f710eed38fb9
|
|
BLAKE2b-256 checksum How to use checksums |
380b91a279707b55e8926792772205989198ae874839648f4757da7755c2d57e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.14.8"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.5.9 29 Sep 2026","python":"3.14.8","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|
Release files / katsuji-0.1.1-py3-none-any.whl
| Download URL | katsuji-0.1.1-py3-none-any.whl |
|---|---|
| Size | 21.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1343a19221fc485e70e245bfbd293e9ab614bb66b7a2d7e0aad10b1659728cb1
|
|
BLAKE2b-256 checksum How to use checksums |
aa64e745baace3950559bc89ac53eb33b8e4ad5f5e46ac22b6988a7cf5fe41be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.18.1 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.14.8"},"installer":{"name":"hatch","version":"1.18.1"},"openssl_version":"OpenSSL 3.5.9 29 Sep 2026","python":"3.14.8","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.13.1
|