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.
3.9 KiB
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
-
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.
-
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). -
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
-
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