Commit Graph
317 Commits
Author SHA1 Message Date
jpirnay 73b9f2028a yaclf 2026-03-17 22:07:14 +01:00
jpirnay 7df68fcf31 Merge branch 'feat-sdcard-info' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-17 21:27:10 +01:00
jpirnay c46490fd43 Reformat file size 2026-03-17 21:24:06 +01:00
jpirnay ce0c429dae Refine 2026-03-17 21:12:42 +01:00
jpirnay 6dc719ca69 Add Info Activitiy 2026-03-17 21:05:46 +01:00
jpirnay 7a940d0a4b Fix 2026-03-13 21:38:29 +01:00
jpirnay 9b70ddc93b Merge branch 'master' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-13 21:24:04 +01:00
jpirnay beeab0ff55 cast currentpage 2026-03-13 21:15:05 +01:00
jpirnay fb3997aae5 fix: Init lastSleepImage (edge case) (#1360)
## Summary

* **What is the goal of this PR?** fix edge case for definition

## Additional Context

If loadFromFile() returns false (no state file exists — first boot, or
SD missing), lastSleepImage is never set and contains garbage.
[SleepActivity.cpp:83] then uses it in a while comparison to avoid
repeating the same image. The JSON path (doc["lastSleepImage"] |
(uint8_t)0) handles it, but only if the file exists.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _** NO **_
2026-03-11 18:37:13 -05:00
jpirnay 1b97c4602d chore: change label while on settings tab actions (#1325)
## Summary

* **What is the goal of this PR?** The "Toggle" label while on the "tab"
actions of settings screen was misleading. Will show "Select" now ,
while "Toggle" remains in place for all 'real' settings

* **What changes are included?**

## Additional Context
<img width="240" alt="1"
src="https://github.com/user-attachments/assets/dc198716-0aad-4c75-96fe-52595625e69d"
/>
<img width="240" alt="2"
src="https://github.com/user-attachments/assets/85ce5368-801c-489d-aa94-51f126c3ddc8"
/>


---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**NO **_
2026-03-11 18:36:34 -05:00
117936a78e fix: back button in settings returns to tab bar first (#1354)
## Summary
- Pressing Back while browsing settings within a category now jumps
focus to the category tab bar
- Pressing Back again from the tab bar exits settings to home
- Previously, Back always exited directly to home regardless of scroll
position

Closes #797

## Test plan
- [ ] Scroll deep into a settings category → press Back → tab bar is
focused
- [ ] Press Back again from tab bar → exits to home screen
- [ ] Use category switching (continuous hold) → still works as before
- [ ] Settings are saved on exit (not on tab-bar jump)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: bkb <bkb@arcnode.xyz>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 18:35:48 -05:00
Adrian Wilkins-Caruana 1409259721 perf: font-compression improvements (#1056)
## Purpose

This PR includes some preparatory changes that are needed for an
upcoming performant CJK font feature. The changes have no impact on
render time and heap allocation for latin text. **Despite this, I think
these changes stand on their own as a better font
compression/decompression implementation.**

## Summary

- Font decompressor rewrite: Replaced the 4-slot LRU group cache with a
two-tier system — a page buffer (glyphs prewarmed before rendering
begins) and a hot-group fallback (last decompressed group retained for
non-prewarmed
  glyphs). 
- Byte-aligned compressed bitmap format: Glyph bitmaps within compressed
groups are now stored row-padded rather than tightly packed before
DEFLATE compression, improving compression ratios by making identical
pixel rows produce
identical byte patterns. Glyphs are compacted back to packed format on
demand at render time. Reduces flash size by 155 KB.
- Page prewarm system: Added `Page::collectText` and
`Page::getDominantStyle` to extract per-style glyph requirements before
rendering, and `GfxRenderer::prewarmFontCache` to pre-decompress only
the groups needed for the dominant style
   — eliminating mid-render decompression for the common case.
- UTF-8 robustness fixes: `utf8NextCodepoint` now validates continuation
bytes and returns a replacement glyph on malformed input;
`ChapterHtmlSlimParser` correctly preserves incomplete multi-byte
sequences across word-buffer flush
  boundaries rather than splitting them.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**YES**_ Architecture and
design was done by me, refined a bit by Claude. Code mostly by Claude,
but not entirely.
2026-03-11 21:05:46 +01:00
jpirnay 2008060a81 Refactor ui content rect 2026-03-10 19:11:30 +01:00
jpirnay 36b1b5e345 Fix to master 2026-03-09 22:48:14 +01:00
jpirnay 010ba4a89c Merge branch 'master' of https://github.com/jpirnay/crosspoint-reader into feat-page-overlay 2026-03-09 22:41:33 +01:00
jpirnay 0a4a369d25 Merge branch 'feat-page-overlay' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-09 19:51:52 +01:00
jpirnay 3e52fad331 Overlay always use portrait 2026-03-09 19:51:28 +01:00
jpirnay 8070d251f1 Merge branch 'feat-bookinfo' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 17:58:33 +01:00
jpirnay fd71e87800 Add info option to recents, too 2026-03-08 17:58:20 +01:00
Uri Tauber c986a274ee refactor: reader utils (#1329)
## Summary

Extract shared reader utilities (`ReaderUtils.h`) to reduce duplication
across `EpubReaderActivity`, `TxtReaderActivity`, and (upcoming)
`MarkdownReaderActivity`.

  Utilities extracted:

   - `applyOrientation()` — orientation switch logic
   - `detectPageTurn()` — page navigation input detection
   - `renderAntiAliased()` — grayscale anti-aliasing pass
   - `displayWithRefreshCycle()` — refresh mode cadence
   - `GO_HOME_MS` — back button timing constant

  ## Impact

Flash: 32 bytes saved (6006441 → 6006409 bytes). Minimal immediate gain,
but meaningful once markdown reader and future reader types share these
functions.

Code quality: Eliminates ~100 lines of duplicated logic spread across
multiple files. All readers now follow the same patterns for
orientation, input handling, and rendering.

  ## Rationale

This refactor is preparation for markdown support, which requires
identical input and rendering logic. Instead of copy-pasting these
patterns a third time, all readers now share a single, tested
implementation. Future reader types can reuse `ReaderUtils` without
duplication.

  ---

  ## AI Usage

Did you use AI tools to help write this code? YES Claude extracted the
code, under my guidance. Tested on my device and seems to work fine.
2026-03-08 11:45:54 -05:00
jpirnay 8dc82f28af Use series in recents if present 2026-03-08 17:44:10 +01:00
jpirnay 02edfbb418 Merge branch 'feat-dirshow' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 16:34:39 +01:00
jpirnay 5b1ccb8b6d Dont add brackets around directory for themes that have icon support 2026-03-08 16:20:21 +01:00
jpirnay 2010b33e5d Review amendments 2026-03-08 11:03:50 +01:00
jpirnay 7ab6d5ac4b Proper fix 2026-03-08 10:13:36 +01:00
jpirnay 47257fe4b4 Add include 2026-03-08 10:12:16 +01:00
jpirnay 378c1613ee Merge branch 'fix-key' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 10:00:48 +01:00
jpirnay c63659311e Merge branch 'feat-overlay' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 09:58:14 +01:00
jpirnay 8688139a71 Merge branch 'feat-hiddenfiles' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 09:56:47 +01:00
jpirnay 786fbfa7c1 Merge branch 'feat-page-overlay' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 09:55:09 +01:00
jpirnay ca94f89fba Merge branch 'feat-dirshow' of https://github.com/jpirnay/crosspoint-reader into mybuild 2026-03-08 09:54:29 +01:00
jpirnay 2abcf9bc68 Review fixes 2026-03-07 19:33:02 +01:00
jpirnay 2d6741e9df Remap buttons 2026-03-07 18:52:46 +01:00
jpirnay 5dab5b3cf1 Add error information 2026-03-07 18:52:27 +01:00
jpirnay 907aa43caf No accidental confirmation 2026-03-07 18:51:55 +01:00
jpirnay 56ed445c71 Smaller font size 2026-03-07 18:17:06 +01:00
jpirnay 10e0680f6e Add bookinfo 2026-03-07 18:07:49 +01:00
jpirnay 3ed96a7e49 Use and populate metadata 2026-03-07 18:02:21 +01:00
jpirnay 7183b75a3c Make directories stand out more 2026-03-07 11:21:21 +01:00
jpirnay 9ca0f30b16 Sync to master 2026-03-07 10:29:41 +01:00
jpirnay 34a96d717d Merge branch 'master' of https://github.com/crosspoint-reader/crosspoint-reader into feat-page-overlay 2026-03-07 10:22:18 +01:00
jpirnay e31e5fd1f5 Show name of next section to appear 2026-03-07 10:17:07 +01:00
Uri Tauber 8fbb37b359 feat: footnote anchor navigation (#1245)
## Summary: Enable footnote anchor navigation in EPUB reader

This PR extracts the core anchor-to-page mapping mechanism from PR #1143
(TOC fragment navigation) to provide immediate footnote navigation
support. By merging this focused subset first, users get a complete
footnote experience now while simplifying the eventual review and merge
of the full #1143 PR.

  ---

## What this extracts from PR #1143

PR #1143 implements comprehensive TOC fragment navigation for EPUBs with
multi-chapter spine files. This PR takes only the anchor resolution
infrastructure:

- Anchor-to-page mapping in section cache: During page layout,
ChapterHtmlSlimParser records which page each HTML id attribute lands
on, serializing the map into the .bin cache file.
- Anchor resolution in `EpubReaderActivity`: When navigating to a
footnote link with a fragment (e.g., `chapter2.xhtml#note1`), the reader
resolves the anchor to a page number and jumps directly to it.
- Section file format change: Bumped to version 15, adds anchor map
offset in header.

  ---

## Simplified scope vs. PR #1143

To minimize conflicts and complexity, this PR differs from #1143 in key
ways:

* **Anchors tracked**
  * **Origin:** Only TOC anchors (passed via `std::set`)
  * **This branch:** All `id` attributes

* **Page breaks**
  * **Origin**: Forces new page at TOC chapter boundaries
  * **This branch:** None — natural flow

* **TOC integration**
  * **Origin**: `tocBoundaries`, `getTocIndexForPage()`, chapter skip
  * **This branch:** None — just footnote links

* **Bug fix**
  * **This branch:** Fixed anchor page off-by-1/2 bug


The anchor recording bug (recording page number before `makePages()`
flushes previous block) was identified and fixed during this extraction.
The fix uses a deferred `pendingAnchorId` pattern that records the
anchor after page completion.

  ---

## Positioning for future merge

Changes are structured to minimize conflicts when #1143 eventually
merges:

- `ChapterHtmlSlimParser.cpp` `startElement()`: Both branches rewrite
the same if `(!idAttr.empty())` block. The merged version will combine
both approaches (TOC anchors get page breaks + immediate recording;
footnote anchors get deferred recording).
- `EpubReaderActivity.cpp` `render()`: The `pendingAnchor` resolution
block is positioned at the exact same insertion point where #1143 places
its `pendingTocIndex` block (line 596, right after `nextPageNumber`
assignment). During merge, both blocks will sit side-by-side.
   
  ---

## Why merge separately?

1. Immediate user value: Footnote navigation works now without waiting
for the full TOC overhaul
   2. Easier review: ~100 lines vs. 500+ lines in #1143 
3. Bug fix included: The page recording bug is fixed here and will carry
into #1143
4. Minimal conflicts: Structured for clean merge — both PRs touch the
same files but in complementary ways
---

### AI Usage

Did you use AI tools to help write this code? _**< YES >**_ Done by
Claude Opus 4.6
2026-03-06 21:10:45 +03:00
jpirnay c7af23b33e Use 'correct' label for tab control 2026-03-05 23:40:56 +01:00
jpirnay f5cc2915d7 Sync to new master 2026-03-05 18:29:33 +01:00
jpirnay 761a050185 Merge branch 'master' of https://github.com/jpirnay/crosspoint-reader into feat-page-overlay 2026-03-05 18:28:38 +01:00
Zach Nelson 5b8787b2bc perf: Avoid creating strings for file extension checks (#1303)
## Summary

**What is the goal of this PR?**

This change avoids the pattern of creating a `std::string` using
`.substr` in order to compare against a file extension literal.
```c++
std::string path;
if (path.length() >= 4 && path.substr(path.length() - 4) == ".ext")
```

The `checkFileExtension` utility has moved from StringUtils to
FsHelpers, to be available to code in lib/. The signature now accepts a
`std::string_view` instead of `std::string`, which makes the single
implementation reusable for Arduino `String`.

Added utility functions for commonly repeated extensions.

These changes **save about 2 KB of flash (5,999,427 to 5,997,343)**.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**NO**_
2026-03-05 10:12:22 -06:00
jpirnay 5c1ff9b5bb yaclf 2026-03-04 19:47:12 +01:00
jpirnay d0d4dc5c18 Review changes 2026-03-04 12:27:33 +01:00
jpirnay 08cdd06c41 Deal with stale caches 2026-03-04 10:46:56 +01:00