diff --git a/README.md b/README.md index 99f40c7..345421e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,9 @@ devices and drivers. These include: # Limitations Only the ASCII character set from ``chr(32)`` to ``chr(126)`` is supported. -Kerning is not supported. +Kerning is not supported. Fonts are one bit per pixel. This does not rule out +colour displays: the device driver can add colour information at the rendering +stage. # Usage @@ -71,11 +73,11 @@ Assume that the you have employed the utility to create a file ``myfont.py``. In your code you will issue ```python -from myfont import myfont +import myfont ``` -The ``myfont`` instance will then be used by the device driver to render strings -on demand. +The ``myfont`` module name will then be passed to the device driver to render +strings on demand. # Dependencies, links and licence @@ -100,46 +102,15 @@ device. The purpose of the command line arguments specified to the user is to ensure that the data layout is optimised for the device so that the copy is a simple bytewise copy. -The user program imports a Python font file. This instantiates a ``PyFont`` -object with appropriate constructor arguments such as the metrics of the -specific font. When the user program needs to display a string it passes the -instance to the device driver. The instance exposes appropriate font metrics -(defined in pixels) and a ``get_ch()`` method. The latter provides fast access -to the bytes corresponding to an individual character together with character -specific metrics. +The user program imports a Python font file. When the user program needs to +display a string it passes the module name to the device driver. The module +exposes appropriate font metrics (defined in pixels) and a ``get_ch()`` +function. The latter provides fast access to the bytes corresponding to an +individual character together with character specific metrics. Fixed width characters include blank bits after the character bits to pad out -the width. Variable pitch characters include a small number of blank "advance" -bits to provide correct spacing between characters. - -## The PyFont class - -This is defined in the file ``pyfont.py``. An outline definition of the class is -as follows: - -```python -class PyFont(object): - def __init__(self, font, index, vert, horiz, vmap, revbit): - self._bits_horiz = horiz # Width of monospaced char or 0 if variable - self._bits_vert = vert # Height of all chars - self._vmap = vmap # Vertical map - self._revbit = revbit # Bit reversal of font bytes - self._index = index - self._font = font - - def get_ch(self, ch): - from uctypes import addressof - # Replace out of range characters with a default - # compute offset of current character bitmap and char width - return addressof(self._font) + offset, self._bits_vert, char_width - - def get_properties(self): - return self._bits_vert, self._bits_horiz, self._vmap, self._revbit -``` - -The device driver calls the ``get_ch`` method for each character in a string. -The ``get_properties`` method enables the driver to validate the Python font -file. +the width. Variable pitch characters include a small, character specific, +number of blank "advance" bits to provide correct spacing between characters. ## Font files @@ -147,13 +118,32 @@ Assume the user has run the utility to produce a file ``myfont.py`` This then has the following outline definition (in practice the bytes objects are large): ```python -import pyfont -_myfont = b'\x00\x00' -_myfont_index = b'\x00\x00\x23\x00\' -myfont = pyfont.PyFont(_myfont, _myfont_index, 24, 0, True, False) +version = '0.1' +height = 23 +width = 22 +vmap = True +reversed = False +_font = b'\x00\x00' +_index = b'\x00\x00\x23\x00\' +from uctypes import addressof + +def _chr_addr(ordch): + # use _index to return the offset into _font + +def get_ch(ch): + # validate ch, if out of range use '?' + # get offset into _font and retrieve char width + # Return address of start of bitmap, height and width + return addressof(_font) + offset + 2, height, width ``` +``height`` and ``width`` are specified in bits (pixels). + +Note that the module global ``width`` is relevant only to files created as +fixed pitch. It is provided for information only, and will be zero for variable +pitch fonts. This enbles such fonts to be identified at runtime. + ## Mapping A character occupies a space where (0, 0) represents the coordinates of the top @@ -183,9 +173,5 @@ Python source file is a lesser consideration, with readability being prioritised over size. Hence they will be "pretty printed" with the large bytes objects split over multiple lines for readability. -The ``get_ch`` method will determine the character width from the difference -between current and next index values and the font's vertical size: it does not -require explicit storage. - This general approach has been tested on a Pyboard connected to LCD hardware having an onboard frame buffer. The visual performance is good.