Contents
- Clipping (Highlights) System — full text selection, highlight, persistence, export
- Bookmarks — Absolute Word Index + Page Highlight — layout-independent, v4 format, highlight rendering
- Bookmarks — Text-Match for v3 — old bookmarks survive layout changes via snippet matching
- Guide Dots — configurable bullet markers between words
- Clippings App — standalone app for browsing clips per book
- Configurable Long-Press — side and front buttons for bookmarks/clippings
- EPUB Render Modes — Default/Balanced/Light with cache isolation
- Section Cache v44 — format bump, magic header, per-word metadata
- Reader Menu Icons Fix — garbled 32→24px migration, 4 blank icons regenerated
- Italian Translation Overhaul — 924 keys aligned, new + corrected translations
- Fixes — crash, positioning, persistence, UI visibility bugs
✂️ Clipping (Highlights) System
A complete highlight system ported from the CrossInk fork. Select and save text passages while reading; clippings persist across sessions and survive all layout changes.
Core features
- Create a clipping: Reader menu → "Create Clipping". Navigate with arrow keys, press Confirm to mark start, move cursor, press Confirm again to save.
- Selection UI: Cursor word appears inverted (black bg, white text) — same style as dictionary word lookup. Selected range shows light-gray dither background with fully readable text. Descender letters (g, q, y, p, j) are fully covered by the highlight rectangle.
- View & manage: "View Clippings" menu entry shows a list of all saved clippings with text snippets. Individual clippings can be deleted. Selecting a clipping jumps directly to its page.
- Persistent: Saved to
/.crosspoint/clippings/epub_<hash>.bin. Close and reopen the book — clippings are still highlighted. - Export: Every clipping is automatically appended to
/My Clippings.txtin Kindle-style format (title, author, page, chapter, text).
Layout-independent (v2 absolute word index)
- Clippings now store
absoluteWordStart— the word's position from the start of the chapter, invariant to font family, font size, alignment, and Guide Dot spacing. - When a clipping's stored page count doesn't match the current layout, the highlight automatically resolves to the correct position via cumulative word offset arrays built at section load time.
- Old v1 clippings remain backward-compatible: stored page/word indices are used when the layout is unchanged; a ≥3-token text-matching fallback handles layout changes.
- Jump from list: selecting a clipping from the View Clippings list resolves the correct page even after layout changes, using the absolute word index.
Integration
- Clipping icon in the reader menu (paperclip SVG, 24×24).
- Clipping list icon (document-with-clip SVG, 24×24).
- Fully anti-aliasing compatible.
- Cache directory
/.crosspoint/clippings/created on first save.
🔖 Bookmarks — Absolute Word Index + Page Highlight
BookmarkStore v4
- New field
absoluteWordStart(uint32_t) — first word on the bookmarked page as a position from chapter start. Invariant to all layout changes. - v4 bookmarks: highlight the exact anchor word with a light-gray dither background on every page render — no icon clutter.
- v3 (old) bookmarks: text-match the bookmark snippet (≥3 consecutive tokens) on the current page, skipping leading single-char tokens (quotes, punctuation), and highlight the matched word(s). V3 bookmarks without snippets fall back to the stored page number.
- Jump: selecting a bookmark from the list resolves the correct page via absolute word index or snippet text-matching across the section.
Reader menu icons fix
- All 32×32 icons in the reader menu replaced with proper 24×24 native arrays (the old 32×32 data was being read with the wrong stride, producing garbled output).
- 4 blank icons regenerated from custom SVGs: QR code, Go to %, Screenshot, Delete cache.
- 3 new SVG-sourced icons: Create Clipping, View Clippings, bookmark marker.
🟢 Guide Dots
A reading mode that inserts a visible bullet (•) between words, with configurable minimum spacing.
Features
- Toggle: Quick Settings, Settings → Reading, and Web portal all expose the Guide Dots toggle.
- Dots Spacing: Standard (16px minimum gap) and Large (32px). Changing the spacing invalidates the section cache and rebuilds with new line breaks.
- Layout integration:
computeNaturalGaps()precomputes expanded gap widths used consistently by the DP line-breaker, X-position loop, and justification calculation — zero text overflow. - Rendering: bullet
•(U+2022) drawn centered in every gap between non-attached words, using absolute X positions for pixel-perfect placement. - Cache-busting:
guideDotMinGapstored in section.bin v44 header. Toggling Guide Dots or changing spacing triggers automatic cache invalidation and rebuild.
📱 Clippings App (standalone)
A new standalone app for browsing saved clippings across all books, identical in structure to the Bookmarks app.
- Book list: scans Reading Stats, Recent Books, and Favorites for books with saved clippings.
- Open: confirm opens the in-reader ClippingsActivity for the selected book. Individual clippings can be deleted or jumped to.
- Delete all: long-hold Confirm triggers a delete-all-clippings confirmation dialog.
- Registered as ShortcutId::Clippings in the app registry. Visible in Home and Apps Hub; configurable location, order, and visibility via Settings.
- Icon: 32×32 paperclip icon (ClipIcon32) generated from SVG, mapped to
UIIcon::Filein the LyraMarcoand75 theme. - Home layout:
kVisibleMenuSlotsincreased from 5 to 6 to accommodate the new app alongside existing shortcuts.
🕹️ Configurable Long-Press (Side + Front Buttons)
Long-press side buttons (renamed + expanded)
- Label: "Long-press button behavior" → "Long-press side buttons".
- Two new options: Bookmarks (UP=toggle bookmark, DOWN=View Bookmarks) and Clippings (UP=enter clipping mode, DOWN=View Clippings).
- Original Chapter Skip and Orientation Change options unchanged.
Long-press front buttons (new setting)
- New setting "Long-press front buttons" with options Off / Bookmarks / Clippings.
- Left long-press toggles bookmark/enters clipping; Right long-press opens the bookmark/clipping list.
- Detection:
ReaderUtils::PageTurnResultnow carriesfromFrontButtonflag so the reader distinguishes front-button holds from side-button holds.
Settings UI
- Settings → Controls, Settings app, and Web portal expose both long-press selects with full option lists.
frontLongPressBehaviorpersisted viaJsonSettingsIO.
📐 EPUB Render Modes (Default / Balanced / Light)
- New setting
epubRenderModein CrossPointSettings with 3 modes: Default, Balanced, Light. - Quick Settings, Settings → Reading, and Web portal all expose the toggle.
- Section cache suffix: each mode uses its own cache file (e.g.
sections/1_balanced.bin), so caches never invalidate each other when switching modes. - Fallback chain: if building a section fails for the selected mode, the reader falls back: Default → Balanced → Light; Balanced → Light; Light → only Light.
- Silent next-chapter indexing uses the current render mode cache suffix.
🌐 Section Cache v44 (B1)
- Bumped
SECTION_FILE_VERSIONfrom 35 to 44. - Added
SECTION_CACHE_MAGIC(0x535843FF) for format detection. - New cache-busting fields:
bionicReadingEnabled,guideReadingEnabled,renderMode. - Added
liLutOffset(uint32_t) for future KOReader list-item lookups. - All accessor functions use a single
HEADER_FIELDS_SIZEconstant (27 bytes) to eliminate duplicated/inconsistent offset calculations — fixes the infinite rebuild loop caused by seeking pastpageCountwith the wrong stride. - All existing v35 caches invalidate on first boot (magic mismatch → clearCache → rebuild).
🇮🇹 Italian Translation Overhaul
- 924 keys now fully aligned with English.
- 84 new translations added: Clippings, Guide Dots, EPUB Render Mode, Dots Spacing, ScreenSaver (80 keys), long-press options, Library app descriptions, Lyra Marcoand75 theme name.
- 14 existing translations corrected: "> 30 metri" → "> 30 min", "Invisibile" → "Non visto", "Disattivato" → "OFF", "Manual" → "Manuale", "Crisp" → "Nitido", "Add" → "Aggiungi".
- 15 long strings shortened to fit on-screen without truncation (e.g. "Non c'è nessuna nota a piè di pagina su questa pagina" → "Nessuna nota in questa pagina").