libwebsockets/contrib/mcufont
2023-12-08 13:23:04 +00:00
..
encoder cmake: upgrade everyone to 3.5 minimum version 2023-12-08 13:23:04 +00:00
fonts lws_display: add display list / DLO support 2022-03-25 08:18:29 +00:00
LICENSE lws_display: add display list / DLO support 2022-03-25 08:18:29 +00:00
README.md lws_display: add display list / DLO support 2022-03-25 08:18:29 +00:00

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