Commit Graph
1465 Commits
Author SHA1 Message Date
jpirnay 7291ccacc8 Further code review 2026-04-24 16:23:14 +02:00
jpirnay c4498cd535 Merge branch 'master' of https://github.com/jpirnay/crosspoint-reader into feat-rendering-perf 2026-04-24 15:47:47 +02:00
jpirnay 4cc8bcbddd Merge pull request #130 from jpirnay/fix-kosync-upload
fix: Reestablish 1.37 kosync upload behaviour
2026-04-24 15:47:05 +02:00
jpirnay 7c15c8aa85 Reestablish 1.37 upload behaviour 2026-04-24 15:35:56 +02:00
jpirnay ea2c0f77c8 Merge pull request #128 from jpirnay/feat-fontoverride
feat: Add font foverrides to reader menu
2026-04-24 15:02:30 +02:00
jpirnay 4cfd031cab And even more 2026-04-24 14:48:12 +02:00
jpirnay 5068817549 review induced changes 2026-04-24 14:25:11 +02:00
jpirnay 9a72409826 Fixing submenus 2026-04-24 14:17:50 +02:00
jpirnay ec36670485 Show default values 2026-04-24 12:54:17 +02:00
jpirnay 751f523295 Cluster tools section 2026-04-24 12:50:47 +02:00
jpirnay 0c080f5600 Refactor submenu creation logic 2026-04-24 12:44:08 +02:00
jpirnayandCopilot 7533ed1a9c Add font foverrides to reader menu
Co-authored-by: Copilot <copilot@github.com>
2026-04-24 11:38:55 +02:00
jpirnay e87cdf22ce Merge pull request #127 from jpirnay/feat-imagerefresh
fix: Autorefresh after image pages to get rid of ghosting artifacts (#116)
2026-04-24 10:47:17 +02:00
jpirnay 0b1599a5eb Honor local image display setting 2026-04-24 10:40:29 +02:00
jpirnay 1bf0278eec Autorefresh after image pages to get rid of ghosting artifacts (#116) 2026-04-24 10:30:07 +02:00
jpirnay 5d0620bc3a Change content type 2026-04-23 22:57:20 +02:00
jpirnay 5636769418 Enhance README with new features and format support
Added Markdown and WiFi captive portal support to the list of features for CrossPoint forks. Updated format support for CrossPoint and SUMI to include MD.
2026-04-23 22:53:32 +02:00
jpirnay 3521128c3e Version bump 2026-04-23 22:43:36 +02:00
jpirnay e9b2e918ed Merge pull request #124 from jpirnay/feat-markdown
feat: add + extend Markdown (.md) file reader #1698 by dcherrera
2026-04-23 22:40:56 +02:00
jpirnay 2faeb550fa More fixes 2026-04-23 22:35:07 +02:00
jpirnayandCopilot 88bfb8a76a Update workflow
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 22:32:39 +02:00
jpirnay 4346292340 Add additional file indicators 2026-04-23 22:21:43 +02:00
jpirnayandCopilot c04153ec5a Address cppcheck
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 22:14:41 +02:00
jpirnayandCopilot e968a54e77 Improve nested lists
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 22:04:19 +02:00
jpirnayandCopilot e0c42278ad Stupid fix
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 21:51:22 +02:00
jpirnay c2d51d6772 clang 2026-04-23 21:39:27 +02:00
jpirnay cf376df34c Rename 2026-04-23 21:37:52 +02:00
jpirnayandCopilot 35735b5175 Add code style
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 21:36:31 +02:00
jpirnayandCopilot 01a9d7cb36 Add TOC support
Co-authored-by: Copilot <copilot@github.com>
2026-04-23 21:27:14 +02:00
jpirnay a90290a596 add Markdown (.md) file reader with formatting support #1698 by dcherrera 2026-04-23 21:00:19 +02:00
jpirnay e299318851 Merge pull request #122 from jpirnay/integrate-pr-1209
feat: multiple opds server support (upstream 1209 by osteotek)
2026-04-23 19:51:34 +02:00
jpirnay a2f31f06e7 adress cppcheck complaint 2026-04-23 19:45:38 +02:00
jpirnay 6053ef4756 Review comments 2026-04-23 17:08:08 +02:00
jpirnay 9621dc1181 Cleanup startup 2026-04-23 16:44:27 +02:00
jpirnay 1d4748d20c Merge pull request #123 from jpirnay/fix-indexing-on-toc-pagebreak
fix: Fix reindexing loop on toc-page-break
2026-04-23 16:34:07 +02:00
jpirnay e0e3bd4251 Fix reindexing on toc-page-break 2026-04-23 13:15:30 +02:00
jpirnay 42fa3a4ac8 clang 2026-04-23 12:19:55 +02:00
Arthur TazhitdinovandCopilot c867669560 feat: Support for multiple OPDS servers (#1209)
* Add support for configuring and using multiple OPDS servers, replacing
the previous single-server limitation. Closes
https://github.com/crosspoint-reader/crosspoint-reader/issues/1178
* New OpdsServerStore singleton (modeled after WifiCredentialStore) that
persists up to 8 OPDS servers to /.crosspoint/opds.json with MAC-based
password obfuscation.
* One-time migration from legacy single-server fields in
CrossPointSettings to the new store on first boot.
* New OpdsServerListActivity for the device UI — works in two modes: a
settings list (add/edit/delete servers) and a picker (select which
server to browse). When only one server is configured, the picker is
skipped automatically.
* Renamed CalibreSettingsActivity → OpdsSettingsActivity for clarity. It
now edits individual OpdsServer entries (name, URL, username, password,
delete).
* OpdsBookBrowserActivity now receives an OpdsServer at construction and
uses its credentials for all fetches/downloads, and shows the server
name in the header.
* HttpDownloader::fetchUrl and downloadToFile accept optional per-call
username/password parameters instead of reading from global settings.
* REST API endpoints on CrossPointWebServer: GET /api/opds, POST
/api/opds, POST /api/opds/delete — passwords are never exposed over the
API (only a hasPassword flag), and omitting the password field on update
preserves the existing one.
* Web UI (SettingsPage.html) with dynamic OPDS server management cards —
add, edit, save, and delete servers from the browser.
<img width="932" height="906" alt="SCR-20260416-stvu"
src="https://github.com/user-attachments/assets/a8f18d84-4204-46a0-bb31-b73d24b3255f"
/>

* The OpdsServerStore JSON format and obfuscation scheme are identical
to WifiCredentialStore, so the same JsonSettingsIO infrastructure
handles both.
* The web API uses POST /api/opds/delete instead of DELETE /api/opds
because the ESP32 WebServer doesn't support the DELETE method with a
request body.
* Existing single-server configurations are migrated automatically — no
user action required. After migration the legacy CrossPointSettings
fields are cleared so it only runs once.
* The HttpDownloader changes are backward-compatible: the credential
parameters default to empty strings, so existing callers are unaffected.

---

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 >**_

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-04-23 11:14:50 +02:00
jpirnay d9d6e32359 git pre-commit hook for format fix (#1730) - ux only 2026-04-23 09:47:40 +02:00
jpirnay 7c6e4728f4 Add swedish keyboard translations (#1726) 2026-04-23 09:42:01 +02:00
jpirnay 700d7b442b fix: Erroneous navigation with long filenames in footnote links (#1723) 2026-04-23 09:39:58 +02:00
jpirnay 0d68162a07 show long branch names (#1727) 2026-04-23 09:33:50 +02:00
jpirnay 8ff8418441 pluralize folder/file counts correctly in file list summary (#1701) 2026-04-23 09:30:50 +02:00
jpirnay 4981086a1d Update html title strings according to #1703 2026-04-23 09:29:28 +02:00
jpirnay e5e825e7a5 Update Italian according to #1718 2026-04-23 09:25:50 +02:00
jpirnay 9116070335 Update Spanish according to upstream #1717 2026-04-23 09:24:39 +02:00
jpirnayandClaude Sonnet 4.6 23a77c6aa5 fontconvert.py: cap group uncompressed size at 64 KB
Script-range boundaries alone don't bound group size — dense Unicode
blocks (CJK, user fonts) can produce groups of hundreds of KB. Add a
64 KB hard cap: when adding the next glyph would exceed it, close the
current group and start a new one with the same script ID.

64 KB is well above the largest current built-in group (~50 KB for
notosans_18 Cyrillic) and a safe transient malloc on the ESP32-C3.
The decompressor side already handles any number of groups per font.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 08:36:36 +02:00
jpirnayandClaude Sonnet 4.6 e76118dff0 FontDecompressor: eliminate persistent hot group buffer
The hot group buffer (formerly up to 50 KB BSS / heap) is removed.
During prewarm, each group is now decompressed into a transient malloc
that is freed immediately after its glyphs are extracted — only one
group buffer and the page buffer coexist at a time.

For getBitmap() cache misses (rare: only hit when a glyph wasn't
covered by prewarm), the group is also decompressed transiently and
freed after the single glyph is compacted into _hotGlyphBuf.

Peak heap during prewarm is now: page buffer + one group buffer.
Outside of prewarm, heap usage is only the page buffer itself.
Works correctly for large future fonts (Vietnamese, CJK) regardless
of group size, with no permanent allocation overhead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 08:31:44 +02:00
jpirnayandClaude Sonnet 4.6 80722118a2 FontDecompressor: heap-allocate hot group buffer sized to active font
Replace the 50 KB static BSS _hotGroupBuf array with a heap pointer
allocated once per font (ensureHotGroupBuf). The buffer is sized to the
largest group in the active font — 6 KB for small fonts, ~50 KB for 18pt
— so no memory is wasted when rendering body text at typical sizes.

The buffer persists across pages (freed only in freeHotGroup/deinit),
so there is exactly one malloc per font session rather than one per page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 08:14:04 +02:00
jpirnay 62e271ac8f Merge pull request #119 from jpirnay/refactor-kosynchelper
refactor: Introduction of small helper routines
2026-04-22 07:37:14 +02:00