Skip to content

Cache None for code points not found in font to prevent unnecessary file scans#76

Merged
tannewt merged 4 commits into
adafruit:mainfrom
mtraver:glyph-cache-and-tests
May 21, 2026
Merged

Cache None for code points not found in font to prevent unnecessary file scans#76
tannewt merged 4 commits into
adafruit:mainfrom
mtraver:glyph-cache-and-tests

Conversation

@mtraver
Copy link
Copy Markdown
Contributor

@mtraver mtraver commented May 21, 2026

The current implementation treats None as meaning not present in the font OR never before loaded rather than simply not present in the font. This means that a subsequent call to load_glyphs for a code point that had been loaded before and not found will trigger another scan of the file, only to not be found again.

This PR:

  1. Changes the meaning of None in the cache to mean simply not present in the font.
  2. In the BDF and PCF implementations, caches None for code points not found in the font. The lvfontbin implementation already does this. The TTF implementation doesn't load glyphs so this is not yet relevant.
  3. Removes the preemptive caching of None in get_glyph.
  4. Adds tests. There were already mocks written for displayio.Bitmap and fontio.Glyph so the tests use those. The test/ dir is also renamed to tests/ because CI only runs pytest if the dir tests/ is present.

This PR also cleans up and clarifies type checking imports so that tests run using the mocked displayio.Bitmap.

Finally, there were changes required by the ruff check pre-commit check, so some type annotations are updated from e.g. Optional[int] to int | None etc.

Closes #75

@mtraver mtraver force-pushed the glyph-cache-and-tests branch 3 times, most recently from 519a1df to 3bfc80a Compare May 21, 2026 17:51
mtraver added 3 commits May 21, 2026 11:40
…ile scans

The current implementation treats None as meaning not present in the
font OR never before loaded rather than simply not present in the font.
This means that a subsequent call to load_glyphs for a code point that
had been loaded before and not found will trigger another scan of the
file, only to not be found again.

This commit:
1. Changes the meaning of None in the cache to mean simply not
present in the font.
2. In the BDF and PCF implementations, caches None for code points not
found in the font. The lvfontbin implementation already does this. The
TTF implementation doesn't load glyphs so this is not yet relevant.
3. Removes the preemptive caching of None in get_glyph.
4. Adds tests. There were already mocks written for displayio.Bitmap and
fontio.Glyph so the tests use those.

This commit also cleans up and clarifies type checking imports so that
tests run using the mocked displayio.Bitmap.

Closes adafruit#75
CI only runs tests if the dir tests/ is present.
@mtraver mtraver force-pushed the glyph-cache-and-tests branch from 45534d5 to 3a8c0a4 Compare May 21, 2026 18:40
Comment thread tests/test_bitmap_font.py Outdated
@dhalbert dhalbert requested review from FoamyGuy and tannewt and removed request for FoamyGuy May 21, 2026 19:10
Copy link
Copy Markdown
Member

@tannewt tannewt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! Excited for the speedup 🚀

@tannewt tannewt merged commit 94bec4b into adafruit:main May 21, 2026
1 check passed
@mtraver mtraver deleted the glyph-cache-and-tests branch May 21, 2026 22:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Caching of unknown glyphs is inconsistent

3 participants