micropython-font-to-py/README.md

115 wiersze
5.3 KiB
Markdown
Czysty Zwykły widok Historia

2016-11-15 12:10:21 +00:00
# MicroPython font handling
2016-10-22 10:28:23 +00:00
2018-08-14 16:22:21 +00:00
This repository defines a method of creating and deploying fonts for use with
2018-08-31 10:17:58 +00:00
MicroPython display drivers. A PC utility renders industry standard font files
as a bitmap in the form of Python sourcecode. A MicroPython module enables such
files to be displayed on devices with suitable device drivers. These include
OLED displays using the SSD1306 chip and the official device driver. Compatible
drivers for a variety of display technologies are available as part of the
[nano-gui repository](https://github.com/peterhinch/micropython-nano-gui).
2016-10-29 10:35:13 +00:00
# 1. Introduction
2016-10-22 10:28:23 +00:00
MicroPython platforms generally have limited RAM, but more abundant storage in
the form of flash memory. Font files tend to be relatively large. The
conventional technique of rendering strings to a device involves loading the
2016-10-29 10:35:13 +00:00
entire font into RAM. This is fast but RAM intensive. The alternative of storing
the font as a random access file and loading individual glyphs into RAM on
2016-10-22 10:28:23 +00:00
demand is too slow for reasonable performance on most display devices.
This alternative implements a font as a Python source file, with the data being
declared as `bytes` objects. Such a file may be frozen as bytecode: this
involves building the firmware from source with the Python file in a specific
directory. On import very little RAM is used, yet the data may be accessed
fast. Note that the use of frozen bytecode is entirely optional: font files may
be imported in the normal way if RAM usage is not an issue.
2016-10-22 10:28:23 +00:00
2018-08-14 16:22:21 +00:00
The resultant file is usable with two varieties of display device drivers:
2016-10-22 10:28:23 +00:00
2018-08-14 16:22:21 +00:00
1. Drivers where the display class is subclassed from the official
`framebuffer` class.
2016-11-15 12:10:21 +00:00
2. Drivers for displays where the frame buffer is implemented in the display
2016-10-29 10:35:13 +00:00
device hardware.
2016-10-22 10:28:23 +00:00
# 2. Solution
2016-11-03 16:57:44 +00:00
2022-01-14 14:48:04 +00:00
This comprises four components, links to docs below:
2016-11-03 16:57:44 +00:00
2022-01-14 14:48:04 +00:00
1. [font_to_py.py](./FONT_TO_PY.md) This utility runs on a PC and converts an
industry standard font file to Python source. See below.
2018-08-31 10:17:58 +00:00
2. [Writer and CWriter classes](./writer/WRITER.md) These facilitate rendering
text to a monochrome or colour display having a suitable device driver.
2022-01-14 14:48:04 +00:00
3. [Creating icon fonts](./icon_fonts/README.md)
4. [Device driver notes](./writer/DRIVERS.md). Notes for authors of display
2018-08-14 16:22:21 +00:00
device drivers. Provides details of the font file format and information on
ensuring comptibility with the `Writer` classes.
2016-11-03 16:57:44 +00:00
# 3. font_to_py.py
2016-10-29 10:35:13 +00:00
This command line utility is written in Python 3 and runs on a PC. To convert
a scalable font to Python the utility takes input a font file in `ttf` or `otf`
form together with a height in pixels and outputs a Python source file
containing the font as a bitmap. Fixed and variable pitch rendering are
supported. The design has the following aims:
2016-11-15 12:10:21 +00:00
* Independence of specific display hardware.
* The path from font file to Python code to be fully open source.
2016-10-23 07:33:47 +00:00
2016-11-15 12:10:21 +00:00
The first is achieved by supplying hardware specific arguments to the utility.
These define horizontal or vertical mapping and the bit order for font data.
2016-10-23 07:33:47 +00:00
2016-11-15 12:10:21 +00:00
The second is achieved by using Freetype and the Freetype Python bindings. Its
use is documented [here](./FONT_TO_PY.md). This also details measurements of
RAM usage when importing fonts stored as frozen bytecode.
2016-10-23 07:33:47 +00:00
## 3.1 Small fonts
Converting scalable `ttf` or `otf` files programmatically works best for larger
fonts. For small fonts it is best to use hand-designed bitmapped font files.
These are now supported: `bdf` or `pcf` font files may be converted to Python
source in the same format as files originating from scalable fonts.
## 3.2 Limitations
2016-10-23 07:33:47 +00:00
2018-08-31 10:17:58 +00:00
Kerning is not supported. Fonts are one bit per pixel. Colour displays are
supported by the `CWriter` class which adds colour information at the rendering
stage. This assumes that all pixels of a character are coloured identically.
2016-10-23 07:33:47 +00:00
2018-08-31 10:17:58 +00:00
By default the `font_to_py.py` utility produces the ASCII character set from
`chr(32)` to `chr(126)` inclusive. Command line options enable the character
2019-10-18 12:25:56 +00:00
set to be modified to include arbitrary Unicode characters. Alternative sets
may be specified such as for non-English languages. Efficient support is now
provided for sparse character sets.
2018-08-31 10:17:58 +00:00
# 4. Font file interface
2017-01-06 15:16:58 +00:00
2019-10-18 12:25:56 +00:00
A font file is imported in the usual way e.g. `import font14`. Python font
files contain the following functions. These return values defined by the
arguments which were provided to `font_to_py.py`:
2017-01-06 15:16:58 +00:00
`height` Returns height in pixels.
`max_width` Returns maximum width of a glyph in pixels.
2019-10-18 12:25:56 +00:00
`baseline` Offset from top of glyph to the baseline.
2018-08-31 10:17:58 +00:00
`hmap` Returns `True` if font is horizontally mapped.
`reverse` Returns `True` if bit reversal was specified.
`monospaced` Returns `True` if monospaced rendering was specified.
`min_ch` Returns the ordinal value of the lowest character in the file.
`max_ch` Returns the ordinal value of the highest character in the file.
2017-01-06 15:16:58 +00:00
2019-10-18 12:25:56 +00:00
Glyphs are returned with the `get_ch` function. Its argument is a Unicode
character and it returns the following values:
2017-01-06 15:16:58 +00:00
2019-10-18 12:25:56 +00:00
* A `memoryview` object containing the glyph bytes.
2017-01-06 15:16:58 +00:00
* The height in pixels.
* The character width in pixels.
2018-08-31 10:17:58 +00:00
The `font_to_py.py` utility allows a default glyph to be specified (typically
`?`). If called with an undefined character, this glyph will be returned.
2019-10-18 12:25:56 +00:00
The `min_ch` and `max_ch` functions are mainly relevant to contiguous character
2018-08-31 10:17:58 +00:00
sets.
# 5. Licence
2016-10-22 10:28:23 +00:00
2016-11-15 12:10:21 +00:00
All code is released under the MIT licence.