- .font format: glyph sections with #/. grids, proportional widths, literal unicode glyph names, spacing/space-width/line-height/baseline - build (atlas white-on-transparent + JSON metrics), render (text -> PNG with \n, scale, color), info, preview (terminal half-blocks) - example tiny5 font: A-Z, ÅÄÖ, 0-9, punctuation (47 glyphs, 3x5) - go tests: parsing, errors, atlas metrics, text rendering Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmdG9GqfSWCzts7AkDwRDh
bitmap-font-maker (fontc)
Turns .font text files — pixel glyph grids an agent can read and edit
directly — into font atlases (PNG + JSON metrics) and renders text
strings to PNG. Proportional widths, unicode glyph names (ÅÄÖ works).
Go, zero dependencies, single static binary.
Build
# Arch/Garuda: sudo pacman -S go
cd bitmap-font-maker
go build -o build/fontc . # or the VS Code task "build bitmap-font-maker"
go test ./...
The .font format
# comment
font: tiny5 optional name
spacing: 1 px between glyphs (default 1)
space-width: 3 advance of ' ' (default: width of '0')
line-height: 7 default: glyph height + 1
baseline: 5 default: glyph height
glyph A:
.#.
#.#
###
#.#
#.#
glyph :: the char between "glyph " and ":" is literal
.
#
.
#
.
#= pixel on,.= off.- All glyphs share one height; widths may differ (proportional fonts —
Mcan be 5 px wide while.is 1 px). - Max glyph size 64x64.
Commands
fontc build tiny5.font -o out/tiny5 # -> tiny5.png (atlas) + tiny5.json (metrics)
fontc render tiny5.font 'HEJ!\nRAD 2' --scale 4 --color '#FFD700' -o title.png
fontc info tiny5.font # validate + list glyphs
fontc preview tiny5.font 'HELLO' # draw in the terminal
Atlas + metrics
The atlas draws glyphs white on transparent so game engines can tint them. The JSON carries everything a loader needs:
{
"name": "tiny5", "atlas": "tiny5.png",
"height": 5, "lineHeight": 6, "baseline": 5,
"spacing": 1, "spaceWidth": 3,
"glyphs": { "A": {"x": 0, "y": 0, "w": 3, "h": 5, "advance": 4}, ... }
}
Drawing text in a game: blit glyphs[c] from the atlas, advance the
cursor by advance; spaces advance spaceWidth + spacing; new lines
step lineHeight.
examples/tiny5.font is a complete 3x5 font:
A-Z, ÅÄÖ, 0-9 and punctuation.