add explanation of line mapping format to DRIVERS doc

pull/3/head
Brian Cappello 2017-06-29 14:48:09 -04:00
rodzic 90998dd94e
commit e5bdcbe098
1 zmienionych plików z 58 dodań i 1 usunięć

Wyświetl plik

@ -148,6 +148,9 @@ def max_width():
def hmap(): def hmap():
return False return False
def lmap():
return False
def reverse(): def reverse():
return False return False
@ -175,7 +178,7 @@ def get_char(ch):
# validate ch, if out of range use '?' # validate ch, if out of range use '?'
# get offsets into _font and retrieve char width # get offsets into _font and retrieve char width
# Return: memoryview of bitmap, height and width # Return: memoryview of bitmap, height and width
return mvfont[offset + 2, next_offset], height, width return _mvfont[offset + 2, next_offset], height, width
``` ```
``height`` and ``width`` are specified in bits (pixels). ``height`` and ``width`` are specified in bits (pixels).
@ -191,6 +194,9 @@ character check.
and contains all the bytes required to render the character including trailing and contains all the bytes required to render the character including trailing
space. space.
For line-mapped fonts, `get_char()` returns a 4-tuple:
(is_horizontal_mapping, memoryview_of_char_line_data, height, width)
## Binary font files ## Binary font files
These are unlikely to find application beyond the e-paper driver, but for These are unlikely to find application beyond the e-paper driver, but for
@ -221,6 +227,8 @@ values represent locations to the right of the origin and increasing y values
represent downward positions. Mapping defines the relationship between this represent downward positions. Mapping defines the relationship between this
abstract two dimensional array of bits and the physical linear sequence of bytes. abstract two dimensional array of bits and the physical linear sequence of bytes.
### Bit Mapping
Vertical mapping means that the LSB of first byte is pixel (0,0), MSB of first Vertical mapping means that the LSB of first byte is pixel (0,0), MSB of first
byte is (0, 7). The second byte (assuming the height is greater than 8 pixels) byte is (0, 7). The second byte (assuming the height is greater than 8 pixels)
is (0, 8) to (0, 15). Once the column is complete the next byte represents is (0, 8) to (0, 15). Once the column is complete the next byte represents
@ -233,6 +241,55 @@ than 8.
Bit reversal provides for the case where the bit order of each byte is reversed Bit reversal provides for the case where the bit order of each byte is reversed
i.e. a byte comprising bits [b7b6b5b4b3b2b1b0] becomes [b0b1b2b3b4b5b6b7]. i.e. a byte comprising bits [b7b6b5b4b3b2b1b0] becomes [b0b1b2b3b4b5b6b7].
### Line Mapping
There is also an alternative representation of storing characters, that can be
generated using `font_to_py.py`'s `-L` flag (for **L**ine mapping). Instead of
storing one high/low bit per pixel in the character space, it stores the lines
that make up the character. Lines within a character will either be horizontally
or vertically mapped, depending upon which mapping generates fewer draw calls.
This directional flag is stored in the first byte of a character, with `1`
meaning horizontal and `0` meaning vertical. The second byte stores the width
of the character in pixels, with all subsequent bytes storing the line data.
#### Horizontal Line Mapping
For horizontally mapped line data, the format returned by `get_char` is as follows:
For each row in the character with pixel data, the first byte specifies how many
lines are in the row, and the second byte specifies the `y` coordinate of each of
the lines (with (0,0) being the top-left). Each line in the row then follows as
a pair of bytes, where the first byte is the starting `x` coordinate and the second
byte is the length of the line (in pixels). Once `num_lines * 2` bytes have been
exhausted, the next row starts.
Subsequent rows usually follow the same format, however, there is one exception:
when the next row has the same data as the previous row. (Except of course for
the `y` coordinate, which should be incremented by `1`.) This is specified by a
single `0` byte. There can be multiple `0` bytes one after another, and that
means to use the most recent line data available, incrementing `y` by `1` for
each `0` byte encountered.
A sample drawing implementation can be found [here](https://github.com/peterhinch/micropython-font-to-py/blob/master/writer.py#L139-L159).
#### Vertical Line Mapping
For vertically mapped line data, the format returned by `get_char` is similar:
For each column in the character with pixel data, the first byte specifies how
many lines are in the column, and the second byte specifies the `x` coordinate
of each of the lines (again with (0,0) being the top-left). Each line in the
column then follows as a pair of bytes, where the first byte is the starting
`y` coordinate and the second byte is the length of the line (in pixels). Once
`num_lines * 2` bytes have been exhausted, the next column starts.
Subsequent columns usually follow the same format, however, again there is one
exception: when the next column has the same data as the previous column.
(Except of course for the `x` coordinate, which should be incremented by `1`.)
Likewise this is specified by a single `0` byte, and there can be multiple `0`
bytes one after another, incrementing `x` by `1` for each `0` byte encountered.
A sample drawing implementation can be found [here](https://github.com/peterhinch/micropython-font-to-py/blob/master/writer.py#L161-L181).
# Specification and Project Notes # Specification and Project Notes
The design aims primarily to minimise RAM usage. Minimising the size of the The design aims primarily to minimise RAM usage. Minimising the size of the