1.3.0.32-dev4-cpr-vcodex-steroids
Release Notes
Core Refactor: List-Activity Helpers & Book-Store Deduplication
All list-based screens (settings menus, app selectors, network mode, etc.) now share three composable helpers — ListInputMapper, ListLayout, and ListRenderHelper. This eliminates ~1,350 lines of duplicated boilerplate across 15 activities (TimeZone, Language, Font, KOReader, Status Bar, Shortcuts, OPDS, Favorites, Flashcards, Sleep, ScreenSaver, ScreenClean, Network, Reading Stats Import) while fixing several navigation bugs:
- Double-advance on quick taps — replaced
setNavAll(which registered press + release + continuous simultaneously) with the correct mode-specific calls. - Inverted delta mapping —
onNextRelease/onPreviousReleasenow properly aligned with positive/negative scroll deltas. - Restored missing continuous navigation — Network mode selector now scrolls continuously as originally intended.
- Binary size reduced by ~4.5 KB despite adding three new shared headers.
Book-Store Deduplication: FavoritesStore and RecentBooksStore now delegate shared algorithms (fallback titles, book indexing, normalization, dedup + metadata merge) to a single BookStoreUtils.h template header, cutting ~162 lines and eliminating duplicated private helpers.
E-Ink Refresh Tuning
- Library exit now uses half-refresh (avoiding unnecessary full flashes).
- ScreenSaver slideshow image transitions use half-refresh for smoother browsing.
- Library entry still uses a clean full refresh once after the shelf is ready.
EPUB Cover / Thumbnail Generation Overhaul
A series of fixes addressing EPUB cover generation failures on the ESP32-C3 (~380 KB RAM, fragmented heap):
- Relaxed heap guard: cover generation now requires only 32 KB contiguous (down from 48-95 KB), matching the actual peak allocation requirement.
- Empty cover detection: 0-byte JPEGs extracted from broken EPUBs no longer cause infinite retry loops.
- Adaptive JPEG subsampling: when the MCU row buffer exceeds available contiguous heap, the decoder automatically halves the sampling grid width until it fits — no quality penalty for thumbnails.
- Metadata pre-extraction:
extractBookMetadatanow builds theBookMetadataCacheduring the library scan pass, so subsequent cover generation reuses the cache and skips the expensive full-ZIP parse (~1-2 seconds saved per book).
XTC Cover / Thumbnail Performance Fix
XTC (plain-text book) thumbnails went from ~30 seconds to under 1 second:
- Streaming row-buffered downscaling: replaced ~165,000 individual SD card seek+read operations per thumbnail with ~1,080 batched row reads — a 150× reduction in I/O operations.
- Library heap guard lowered from 95 KB to 8 KB: after the streaming rewrite, the peak contiguous allocation is ~300 bytes, not 48-96 KB. The old guard was incorrectly blocking all XTC cover generation on fragmented heaps.
Library Cover Indexing Speed-Up
Cover generation in the Library view is significantly faster and visually cleaner:
- Batch e-ink rendering (tunable via
kCoverRenderBatchEvery): multiple covers can be drawn before a single display refresh, reducing render cycles on a 4×4 grid from ~17 to as few as 5. - Compact header counter replaces the full-screen blocking "INDEXING" popup — shows
covers N/Min the top-left corner with no flicker. - Intra-page navigation fix: Left/Right moves within the same grid page no longer falsely restart cover generation (uninitialized
lastPage_guard fixed). - First frame now paints placeholders instantly: icons appear immediately on library entry, with covers filling in progressively.
Book Context Menu — Visual Consistency
- Popup style unified with the Library sort/filter overlay: white background, bold title + separator, inline layout.
- Icons switched from 24px mappings to native 32×32 bitmaps (same as library popups).
- Scroll indicator triangles added when the item list exceeds visible rows.
Other Fixes
- Lexend font made optional:
-DOMIT_LEXENDbuild flag excludes the Lexend font from compilation, reducing firmware size. - Full refresh on Library exit restored: prevents e-ink ghosting from the dense grayscale cover grid after exiting the Library.
- Book time-left failover: when pace data (pages-per-minute) is unavailable but at least 10 minutes of reading time is recorded, a linear time-vs-progress estimate is used instead of showing nothing.