libwebsockets/contrib/mcufont/README.md
Andy Green e3dca87f23 lws_display: add display list / DLO support
This adds optional display list support to lws_display, using DLOs (Display
List Objects).  DLOs for rectangle / rounded rectangle (with circle as the
degenerate case), PNGs, JPEG and compressed, antialiased bitmapped fonts
and text primitives are provided.

Logical DLOs are instantiated on heap and listed into an lws_display_list
owner, DLOs handle attributes like position, bounding box, colour +
opacity, and local error diffusion backing buffer.

When the display list is complete, it can be rasterized a line at a time,
with scoped error diffusion resolved, such that no allocation for the
framebuffer is required at any point.  DLOs are freed as the rasterization
moves beyond their bounding box.

Adds a platform registry binding names and other metadata to lws_display
fonts / PNGs / JPEGs.  Provides registration, destruction and best match
selection apis.
2022-03-25 08:18:29 +00:00

103 lines
3.9 KiB
Markdown

# origin
This is part of the MIT-licensed mcufont project which can be found here
https://github.com/mcufont/mcufont
That project is great but it's not actively maintained[1][2] and most work
on it was done back in 2013.
The decoder part was rewritten for lws as `./lib/misc/dlo/dlo-font-mcufont.c`.
This directory contains the ttf-> mcufont encoder, which is a C++
commandline tool for development.
[1] https://github.com/mcufont/mcufont/issues/11
[2] https://github.com/mcufont/mcufont/issues/26
## Building
Install `freetype-dev` or similar package on your build host.
Enable lws cmake option `-DLWS_WITH_MCUFONT_ENCODER=1` to get it built, but
since it is for development it is not packaged with the rest of lws by make
install.
It produces an executable for your build host in `./bin/lws-mcufont-encoder`
or similar as part of the normal lws cmake build process then.
## Modifications vs upstream
1) The rledecoder is rewritten to decode statefully, emitting a rasterized
line at a time and only taking in more input when required to issue the
next pixel that is needed for the current line. This implementation is
integrated into lws dlo stuff down ./lib/misc/dlo.
2) The mcufont decoder type headers are distributed as part of the lws
public headers, but are not imported with libwebsockets.h inclusion, you
should `#include <libwebsockets/mf_rlefont.h>` if you need them (you
normally won't need them, since the dlo stuff will bring it in for its
own usage).
3) Only the encoder part is brought into lws ./conftrib/mcufont; the
encoder can be built by selecting lws cmake option `-DLWS_WITH_MCUFONT_ENCODER=1`
4) The encoder part is modified to issue a single table blob file,
instead of the C typed structs and arrays requiring fonts to be
selected and managed only at build-time; it's at least possible to
download or otherwise manage fonts then after build-time.
The blob starts with a 64-byte header with a magic, versioning, flags and
a map of where the other regions can be found in the file... the overall
layout is like:
```
[64-byte header]
[font name string]
[font short name string]
[Dictionary Data area]
[Dictionary Offset area]
[Unicode range tables]
[offset table for range]
[data table for range]
```
File offsets are measured from the first byte of the blob / file.
Dictionary and glyph offset tables contain 16-bit offsets which apply to the first
byte of the Dictionary Data area and the Glyph data table respectively.
The header part is laid out like:
```
0000 4D 43 55 46 4-byte magic "MCUF"
0004 XX XX XX XX 4-byte MSB Flags + Version
0008 XX XX XX XX 4-byte MSB file offset: 00-terminated string: `full_name`
000C XX XX XX XX 4-byte MSB file offset: 00-terminated string: `short_name`
0010 XX XX XX XX 4-byte MSB file offset: Dictionary Data area (8b)
0014 XX XX XX XX 4-byte MSB count: extent of Dictionary Data area
0018 XX XX XX XX 4-byte MSB file offset: Dictionary Offsets (16b) into Data area
001C XX XX XX XX 4-byte MSB count: rle dictionary
0020 XX XX XX XX 4-byte MSB count: ref dictionary + rle dictionary
0024 XX XX XX XX 4-byte MSB file offset: Char Range Tables
0028 XX XX XX XX 4-byte MSB count: Char Range Tables
002C XX XX XX XX 4-byte MSB unicode fallback char
0030 XX XX 2-byte MSB `width`
0032 XX XX 2-byte MSB `height`
0034 XX XX 2-byte MSB `min_x_advance`
0036 XX XX 2-byte MSB `max_x_advance`
0038 XX XX 2-byte MSB signed `baseline_x`
003A XX XX 2-byte MSB `baseline_y`
003C XX XX 2-byte MSB `line_height`
003E 00 00 2-byte Reserved
```
Char range tables comprise for each range:
```
+0000 XX XX XX XX 4-byte MSB unicode index start
+0004 XX XX XX XX 4-byte MSB count of indexes covered
+0008 XX XX XX XX 4-byte MSB file offset: start of 16-bit glyph offsets table
+000C XX XX XX XX 4-byte MSB file offset: start of data above offsets point into
```