This cartridge contains two command line utilities, font2gfx
and gfx2font
, to perform conversion between fonts and sprite sheets.
Installation
First, load the cart with load #font_utils
.
After loading, you have two options:
- Either an automatic installation: run the cart (press CTRL-R) and follow the instructions.
- or a manual installation:
cp /ram/cart/exports/appdata/system/util/font2gfx.lua /appdata/system/util/
cp /ram/cart/exports/appdata/system/util/gfx2font.lua /appdata/system/util/
Usage
Converting a font into a sprite sheet
Use font2gfx input.font
This will create two files: a gfx file containing the sprite sheet, and a lua file containing the configuration of the font (character width, height, variable width offsets, and so on).
You can optionally specify a specific output: font2gfx input.font output.gfx
If the output already exists, you can add a flag to overwrite: font2gfx -o input.font
Converting a sprite sheet into a font
Use gfx2font input.gfx
You need to have a lua file containing the configuration for the font. For example, here is the configuration for the default font (lil.font):
font_config = { width = 5, width_128 = 10, height = 11, x_offset = 0, y_offset = 0, flags = 3, char_offsets = { ["#"] = 1, ["."] = -1, ["I"] = -1, ["M"] = 1, ["T"] = 1, ["W"] = 1, ["i"] = -1, ["l"] = -1, ["m"] = 1, ["w"] = 1, } } |
You can optionally specify a different configuration file: gfx2font input.gfx input.lua
, and/or a different output file: gfx2font input.gfx input.lua output.font
If the output already exists, you can add a flag to overwrite: font2gfx -o input.font
Using the font
To use the font in a program (or in the terminal), use poke(0x4000, get(fetch("some.font")))
.
Memory layout for non-monospace fonts
I didn't find any information in the wiki about the format of non-monospace fonts, so here is what I found:
The fifth byte seems to contain two flags: the lower bit indicates that the font is not monospace. The second bit is also set for the default picotron font, but I don't know its purpose.
Then each character (at least in the range 32-127) have a configuration stored using 4 bits.
To find the index for a character configuration: divide the character code by 2; if the code is even, the configuration is in the 4 lower bits, otherwise it's in the 4 higher bits.
The 3 lower bits of a character configuration contains a delta to the base width (between -4 and +3), and the fourth bit pushes the character upward by 1 pixel (note that this vertical offset is currently not taken into account by my utilities).
variable-width fonts are documented in the release post: https://www.lexaloffle.com/bbs/?tid=49075
and official docs, in a very terse way: https://www.lexaloffle.com/dl/docs/pico-8_manual.html#Custom_Font
Thank you for the links! I didn't know pico-8 also supported variable-width fonts, I thought this was a new addition in picotron... I'll update the tools to handle the tab width and the vertical offset.
Btw I think -o
should be renamed to -f
, as -o
usually means "output" instead of "overwrite" and -f
means "force" (this is also true for the standard picotron commands like cp
) so someone might overwrite a file accidentally.
You're right. Initially the standard picotron commands didn't have the -f
option, and at least one of them had -o
to mean overwrite, so that's what I went for. I'll probably change it when I update the cart.
Hey @drakmaniso I'm trying to recreate ASCII using 6x8 letters (so they fit 80x25 like classic DOS terminals) and I'm having trouble with 1px spacing always appearing between characters, even if I play with offsets I can't seem to get rid of it. Is this a forced feature of fonts in Picotron? Am I better off just trying to use sprites? I was hoping to translate some existing DOS-formatted content to Ptron which means using text is best, but I'll muddy through if I have to.
[Please log in to post a comment]