Skip to content

1.3.0.32-dev4-cpr-vcodex-steroids

Choose a tag to compare

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 mappingonNextRelease / onPreviousRelease now 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: extractBookMetadata now builds the BookMetadataCache during 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/M in 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_LEXEND build 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.