Brings ~55 mod-exclusive files to the upstream-based mod/master-resync branch: Activities (migrated to new ActivityManager pattern): - Clock/Time: SetTimeActivity, SetTimezoneOffsetActivity, NtpSyncActivity - Dictionary: DictionaryDefinitionActivity, DictionarySuggestionsActivity, DictionaryWordSelectActivity, LookedUpWordsActivity - Bookmark: EpubReaderBookmarkSelectionActivity - Book management: BookManageMenuActivity, EndOfBookMenuActivity - OPDS: OpdsServerListActivity, OpdsSettingsActivity - Utility: DirectoryPickerActivity, NumericStepperActivity Utilities (unchanged): - BookManager, BookSettings, BookmarkStore, BootNtpSync - Dictionary, LookupHistory, TimeSync, OpdsServerStore Libraries: PlaceholderCover, TableData, ChapterXPathIndexer Scripts: inject_mod_version, generate_book_icon, preview_placeholder_cover Docs: KOReader sync XPath mapping Migration changes: - ActivityWithSubactivity -> Activity base class - Callback constructors -> finish()/setResult() pattern - enterNewActivity() -> startActivityForResult() - Activity::RenderLock&& -> RenderLock&& These files won't compile yet - they reference mod settings and I18n strings that will be added in subsequent phases. Made-with: Cursor
3.2 KiB
3.2 KiB
Flash Size Optimization: Per-Family Font and Per-Language Hyphenation Flags
Date: 2026-02-15
Task Description
Investigated ESP32-C3 flash usage (97.3% full at 6.375 MB / 6.5 MB app partition) and implemented build flags to selectively exclude font families and hyphenation language tries. Fonts alone consumed 65.6% of flash (3.99 MB).
Changes Made
1. lib/EpdFont/builtinFonts/all.h
- Wrapped Bookerly includes (16 files) in
#ifndef OMIT_BOOKERLY - Wrapped Noto Sans 12-18pt includes (16 files) in
#ifndef OMIT_NOTOSANS(keptnotosans_8_regular.houtside guard for UI small font) - Wrapped OpenDyslexic includes (16 files) in
#ifndef OMIT_OPENDYSLEXIC
2. src/main.cpp
- Wrapped Bookerly 14pt font objects (previously always included) in
#ifndef OMIT_BOOKERLY - Added per-family
#ifndef OMIT_*guards inside the existing#ifndef OMIT_FONTSblock for other sizes - Added matching guards to font registration in
setupDisplayAndFonts()
3. src/SettingsList.h
- Added
FontFamilyMappingstruct andkFontFamilyMappings[]compile-time table with per-family#ifndefguards - Switched Font Family setting from
SettingInfo::EnumtoSettingInfo::DynamicEnumwith getter/setter that maps between list indices and fixed enum values (BOOKERLY=0, NOTOSANS=1, OPENDYSLEXIC=2) - Added
static_assertensuring at least one font family is available
4. src/activities/settings/SettingsActivity.cpp
- Added DynamicEnum toggle support in
toggleCurrentSetting()(cycles through options viavalueGetter/valueSetter) - Added DynamicEnum display support in
render()display lambda
5. src/CrossPointSettings.cpp
- Guarded
getReaderFontId()switch cases with#ifndef OMIT_*, addeddefault:fallback to first available font - Guarded
getReaderLineCompression()switch cases with#ifndef OMIT_*, addeddefault:fallback - Added
#errordirective if all font families are omitted
6. lib/Epub/Epub/hyphenation/LanguageRegistry.cpp
- Added per-language
#ifndef OMIT_HYPH_xxguards around includes,LanguageHyphenatorobjects, and entries - Switched from
std::array<LanguageEntry, 6>tostd::vector<LanguageEntry>for variable entry count - Languages: DE (201 KB), EN (27 KB), ES (13 KB), FR (7 KB), IT (2 KB), RU (33 KB)
7. platformio.ini
- Added to
[env:mod]:-DOMIT_OPENDYSLEXIC,-DOMIT_HYPH_DE,-DOMIT_HYPH_EN,-DOMIT_HYPH_ES,-DOMIT_HYPH_FR,-DOMIT_HYPH_IT,-DOMIT_HYPH_RU
Design Decisions
- Enum values stay fixed (BOOKERLY=0, NOTOSANS=1, OPENDYSLEXIC=2) for settings file compatibility
- Existing
OMIT_FONTSflag left untouched; per-family flags nest inside it - DynamicEnum used for Font Family to handle index-to-value mapping when fonts are removed from the middle of the options list
Estimated Savings (mod build)
- OpenDyslexic fonts: ~1,052 KB
- All hyphenation tries: ~282 KB
- Total: ~1,334 KB (~1.30 MB) -- from 97.3% down to ~76.9%
Follow-up Items
- Build and verify the
modenvironment compiles cleanly and flash size reduction matches estimates - Other available flags for future use:
OMIT_BOOKERLY,OMIT_NOTOSANS(individual language OMIT_HYPH_xx flags can also be used selectively)