From 8d11d610215e232c9b9a79039d1aff719124e49f Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Thu, 13 Mar 2025 16:03:46 -0700 Subject: [PATCH 1/3] Add support for LVGL binary font format There is an in-browser converter here: https://lvgl.io/tools/fontconverter The format is documented here: https://github.com/lvgl/lv_font_conv/tree/master/doc --- LICENSES/OFL-1.1.txt | 90 +++++++ adafruit_bitmap_font/bitmap_font.py | 13 +- adafruit_bitmap_font/lvfontbin.py | 228 ++++++++++++++++++ .../fonts/unifont-16.0.02-ascii-emoji.bin | Bin 0 -> 88120 bytes .../unifont-16.0.02-ascii-emoji.bin.license | 7 + 5 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 LICENSES/OFL-1.1.txt create mode 100644 adafruit_bitmap_font/lvfontbin.py create mode 100644 examples/fonts/unifont-16.0.02-ascii-emoji.bin create mode 100644 examples/fonts/unifont-16.0.02-ascii-emoji.bin.license diff --git a/LICENSES/OFL-1.1.txt b/LICENSES/OFL-1.1.txt new file mode 100644 index 0000000..84a3934 --- /dev/null +++ b/LICENSES/OFL-1.1.txt @@ -0,0 +1,90 @@ +The SIL Open Font License version 1.1 is copied below, and is also +available with a FAQ at http://scripts.sil.org/OFL. + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/adafruit_bitmap_font/bitmap_font.py b/adafruit_bitmap_font/bitmap_font.py index 842cd2e..a9c39a5 100644 --- a/adafruit_bitmap_font/bitmap_font.py +++ b/adafruit_bitmap_font/bitmap_font.py @@ -27,7 +27,7 @@ from displayio import Bitmap - from . import bdf, pcf, ttf + from . import bdf, lvfontbin, pcf, ttf except ImportError: pass @@ -35,7 +35,9 @@ __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" -def load_font(filename: str, bitmap: Optional[Bitmap] = None) -> Union[bdf.BDF, pcf.PCF, ttf.TTF]: +def load_font( + filename: str, bitmap: Optional[Bitmap] = None +) -> Union[bdf.BDF, lvfontbin.LVGLFont, pcf.PCF, ttf.TTF]: """Loads a font file. Returns None if unsupported.""" if not bitmap: import displayio @@ -56,4 +58,11 @@ def load_font(filename: str, bitmap: Optional[Bitmap] = None) -> Union[bdf.BDF, return ttf.TTF(font_file, bitmap) + if ( + filename.endswith("bin") or filename.endswith("lvfontbin") + ) and first_four == LVGL_HEADER_SIZE: + from . import lvfontbin + + return lvfontbin.LVGLFont(font_file, bitmap) + raise ValueError("Unknown magic number %r" % first_four) diff --git a/adafruit_bitmap_font/lvfontbin.py b/adafruit_bitmap_font/lvfontbin.py new file mode 100644 index 0000000..13075da --- /dev/null +++ b/adafruit_bitmap_font/lvfontbin.py @@ -0,0 +1,228 @@ +# SPDX-FileCopyrightText: 2025 Scott Shawcroft for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +`adafruit_bitmap_font.lvfontbin` +==================================================== + +Loads binary LVGL format fonts. + +* Author(s): Scott Shawcroft + +Implementation Notes +-------------------- + +**Hardware:** + +**Software and Dependencies:** + +* Adafruit CircuitPython firmware for the supported boards: + https://github.com/adafruit/circuitpython/releases + +""" + +import struct + +try: + from io import FileIO + from typing import Iterable, Union +except ImportError: + pass + +from fontio import Glyph + +from .glyph_cache import GlyphCache + + +class LVGLFont(GlyphCache): + """Loads glyphs from a LVGL binary font file in the given bitmap_class. + + There is an in-browser converter here: https://lvgl.io/tools/fontconverter + + The format is documented here: https://github.com/lvgl/lv_font_conv/tree/master/doc + + """ + + def __init__(self, f: FileIO, bitmap_class=None): + super().__init__() + f.seek(0) + self.file = f + self.bitmap_class = bitmap_class + # Initialize default values for bounding box + self._width = None + self._height = None + self._x_offset = 0 + self._y_offset = 0 + + # For reading bits + self._byte = 0 + self._remaining_bits = 0 + + while True: + buffer = f.read(4) + if len(buffer) < 4: + break + section_size = struct.unpack(" int: + """The number of pixels above the baseline of a typical ascender""" + return self._ascent + + @property + def descent(self) -> int: + """The number of pixels below the baseline of a typical descender""" + return self._descent + + def get_bounding_box(self) -> tuple[int, int, int, int]: + """Return the maximum glyph size as a 4-tuple of: width, height, x_offset, y_offset""" + return (self._width, self._height, self._x_offset, self._y_offset) + + def _seek(self, offset): + self.file.seek(offset) + self._byte = 0 + self._remaining_bits = 0 + + def _read_bits(self, num_bits): + result = 0 + needed_bits = num_bits + while needed_bits > 0: + if self._remaining_bits == 0: + self._byte = self.file.read(1)[0] + self._remaining_bits = 8 + available_bits = min(needed_bits, self._remaining_bits) + result = (result << available_bits) | (self._byte >> (8 - available_bits)) + self._byte <<= available_bits + self._byte &= 0xFF + self._remaining_bits -= available_bits + needed_bits -= available_bits + return result + + def load_glyphs(self, code_points: Union[int, str, Iterable[int]]) -> None: + # pylint: disable=too-many-statements,too-many-branches,too-many-nested-blocks,too-many-locals + if isinstance(code_points, int): + code_points = (code_points,) + elif isinstance(code_points, str): + code_points = [ord(c) for c in code_points] + + # Only load glyphs that aren't already cached + code_points = sorted(c for c in code_points if self._glyphs.get(c, None) is None) + if not code_points: + return + + for code_point in code_points: + # Find character ID in the cmap table + cid = None + for start, end, offset in self._cmap_tiny: + if start <= code_point < end: + cid = offset + (code_point - start) + break + + if cid is None or cid >= self._max_cid: + self._glyphs[code_point] = None + continue + + offset_length = 4 if self._index_to_loc_format == 1 else 2 + + # Get the glyph offset from the location table + self._seek(self._loca_start + cid * offset_length) + glyph_offset = struct.unpack( + " 0: # Convert any non-zero value to 1 + bitmap[x, y] = 1 + + # Create and cache the glyph + self._glyphs[code_point] = Glyph( + bitmap, 0, bbox_w, bbox_h, bbox_x, bbox_y, glyph_advance, 0 + ) diff --git a/examples/fonts/unifont-16.0.02-ascii-emoji.bin b/examples/fonts/unifont-16.0.02-ascii-emoji.bin new file mode 100644 index 0000000000000000000000000000000000000000..71ba9b4af5bc6a6b6975c6a75aa654f0565f0cb2 GIT binary patch literal 88120 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 Date: Mon, 17 Mar 2025 16:33:51 -0700 Subject: [PATCH 2/3] Add back header variable --- adafruit_bitmap_font/lvfontbin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/adafruit_bitmap_font/lvfontbin.py b/adafruit_bitmap_font/lvfontbin.py index 13075da..0a73fd7 100644 --- a/adafruit_bitmap_font/lvfontbin.py +++ b/adafruit_bitmap_font/lvfontbin.py @@ -34,6 +34,10 @@ from .glyph_cache import GlyphCache +# The LVGL file starts with the size of the 'head' section. It hasn't changed in five years so +# we can treat it like a magic number. +LVGL_HEADER_SIZE = b"\x30\x00\x00\x00" + class LVGLFont(GlyphCache): """Loads glyphs from a LVGL binary font file in the given bitmap_class. From 9191096c543cd306f06bba90ed98820b95efa47f Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 18 Mar 2025 09:33:16 -0700 Subject: [PATCH 3/3] Put header in correct file --- adafruit_bitmap_font/bitmap_font.py | 5 +++++ adafruit_bitmap_font/lvfontbin.py | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/adafruit_bitmap_font/bitmap_font.py b/adafruit_bitmap_font/bitmap_font.py index a9c39a5..7a67ef8 100644 --- a/adafruit_bitmap_font/bitmap_font.py +++ b/adafruit_bitmap_font/bitmap_font.py @@ -35,6 +35,11 @@ __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Bitmap_Font.git" +# The LVGL file starts with the size of the 'head' section. It hasn't changed in five years so +# we can treat it like a magic number. +LVGL_HEADER_SIZE = b"\x30\x00\x00\x00" + + def load_font( filename: str, bitmap: Optional[Bitmap] = None ) -> Union[bdf.BDF, lvfontbin.LVGLFont, pcf.PCF, ttf.TTF]: diff --git a/adafruit_bitmap_font/lvfontbin.py b/adafruit_bitmap_font/lvfontbin.py index 0a73fd7..13075da 100644 --- a/adafruit_bitmap_font/lvfontbin.py +++ b/adafruit_bitmap_font/lvfontbin.py @@ -34,10 +34,6 @@ from .glyph_cache import GlyphCache -# The LVGL file starts with the size of the 'head' section. It hasn't changed in five years so -# we can treat it like a magic number. -LVGL_HEADER_SIZE = b"\x30\x00\x00\x00" - class LVGLFont(GlyphCache): """Loads glyphs from a LVGL binary font file in the given bitmap_class.