7bb1f7ed76b54718e83ccb0c63cdd47af0bfd08e
795
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
7bb1f7ed76 |
fix: update Italian translation (#1970)
## Summary * **What is the goal of this PR?** Update the Italian translation. * **What changes are included?** Took the latest `english.yaml` as reference and updated `italian.yaml` accordingly, translating new strings and revising existing ones where needed. Specific changes can be inspected from the diff. ## Additional Context * Nothing special to flag — happy to adjust any wording the reviewer disagrees with. --- ### 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? _**PARTIALLY**_ — Claude provided a first-pass draft; I revised and rewrote a substantial portion by hand. |
||
|
|
7acc31bc34 |
fix: silent-reboot on wifi activity exit to clear heap fragmentation (#1908)
WiFi/LWIP/netif teardown scatters long-lived allocations across the heap, leaving ~50KB of contiguous space unrecoverable without a reboot. Reboot the SoC on exit from any wifi-using activity to guarantee a clean heap. An RTC_NOINIT flag survives the reboot and tells setup() to skip the boot splash and route the user back where they came from: - File transfer / Calibre / OPDS / Font download -> home - KOReader sync -> currently-open EPUB Activities check WiFi.getMode() before rebooting, so backing out of the network mode menu without joining doesn't trigger a cycle. KOSync also esp_wifi_stop()s after the sync result so the radio is off while the user reads it; full teardown happens at the reboot. ## Additional Context The silent reboot skips the booting splash screen - it visibly looks like a screen refresh. This does cause a disconnection/reconnection blip for developers actively pulling logs over serial, but `pio device monitor` and the like successfully reconnect and feed in the early boot serial. as an example: ``` [256676] [DBG] [ACT] Exiting activity: KOReaderSync [256706] [DBG] [MAIN] Silent restart (target=reader) ESP-ROM:esp32c3-api1-20210207 Build:Feb 7 2021 rst:0xc (RTC_SW_CPU_RST),boot:0xf (SPI_FAST_FLASH_BOOT) Saved PC:0x403872bc SPIWP:0xee mode:DIO, clock div:1 load:0x3fcd72a0,len:0x990 load:0x403cbf10,len:0xac8 load:0x403ce710,len:0x4d28 entry 0x403cbf10 [22] [INF] [MAIN] Hardware detect: X4 [29] [SD] SD card detected [43] [DBG] [CPS] Settings loaded from file [58] [DBG] [KRS] Loaded KOReader credentials for user: jeremydk [69] [DBG] [OPS] Loaded 1 OPDS servers from file [69] [DBG] [UI] Using Lyra theme [70] [DBG] [MAIN] Starting CrossPoint version 1.2.0-dev-detached-bde75787 ... [203] [DBG] [ACT] Entering activity: Reader [211] [DBG] [EBP] Loading ePub: /Halting State - Charles Stross.epub [221] [DBG] [BMC] Loaded cache data: 51 spine, 41 TOC entries [246] [DBG] [CSS] Loaded 41 rules from cache [247] [DBG] [EBP] Loaded ePub: /Halting State - Charles Stross.epub ``` --- ### 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? _PARTIALLY_ |
||
|
|
938ca3fac1 |
chore: Update version to 1.3.0 (#1827)
## Summary This release adds SD card fonts — the most-requested feature since launch — brings the X3 to first-class status, redesigns the on-screen keyboard, overhauls OPDS, and ships SD-card firmware updates. 144 changes from 53 contributors, 32 of whom are new to the project. **🔠 SD Card Fonts** Custom fonts are here. A complete font subsystem lets you install and use fonts beyond the three built-in families. A new `.cpfont` binary format packs multiple styles (regular, bold, italic, bold-italic) into a single file per size, with on-demand glyph loading from the SD card. A two-pass prewarm renderer bulk-reads glyphs per page, achieving near-flash performance for Latin text and viable CJK rendering. Fonts can be downloaded over WiFi directly from the device, uploaded via the web interface, or copied manually to the SD card. The build pipeline ships a 17-family font library (serif, sans, mono, accessibility) with CI distribution via a dedicated crosspoint-fonts repository. As a bonus, CJK characters no longer get spurious hyphens at line breaks, and an advance-table cache eliminates 30+ second stalls during CJK section indexing. **📱 X3 Comes of Age** The X3 graduates from initial bring-up to a proper target. Grayscale antialiasing is sharper, EPUB images render correctly, OTA updates work, and sleep screen dimensions are dialed in. The headline addition: gyroscope-based tilt page turning via the QMI8658 IMU — tilt the device to turn pages hands-free. SD-card firmware update support and X3 bootloader compatibility mean users can update without a USB connection. **⌨️ Redesigned On-Screen Keyboard** The keyboard has been completely redesigned with improved layout, better key feedback, and a fix for the space key barely moving the cursor. Text entry across WiFi setup, OPDS search, and KOSync login is noticeably smoother. **👁️ Focus Reading** A new reading mode bolds the initial characters of each word (similar to Bionic Reading) to create artificial fixation points, helping improve reading speed and focus. The bolding ratio is 45%, with a minimum of 1 character and a maximum of 9, applied dynamically during indexing. **📚 OPDS Overhaul** OPDS gains in-catalog search with next/prev page navigation, support for multiple servers, correct handling of relative paths and query parameters (fixing CopyParty compatibility), and KOReader-compatible download filenames. **🔤 Text Rendering Refinements** Combining marks (diacritics) now use font metrics for positioning instead of heuristics, proportional numeral spacing is supported, and differential rounding eliminates uneven inter-glyph gaps. Hyphenation now recognizes ISO 639-2 language codes, nested block-level CSS styles are tracked correctly, and horizontal CSS insets are capped at 2em to prevent runaway margins. Bookerly has been replaced with Noto Serif for licensing reasons. **🎨 New Theme: RoundedRaff** A new rounded theme joins the theme picker, with fixes for sleep cover crop grid artifacts. **🔋 Battery & Power** Battery percentage smoothing on the X4 eliminates jittery readings. A short press on the power button can be set to trigger a manual screen refresh — handy for clearing ghosting. **📶 WiFi & Networking** WiFi connections now self-heal from transient drops without manual intervention, and a dBm signal strength indicator appears during web server sessions. WiFi networks can be edited directly from the web UI. **🔄 KOSync** Reading position sync is significantly more accurate. The old character-offset approach frequently landed on the wrong paragraph after syncing between devices — the new xpath-based mapping syncs at the paragraph level, matching KOReader's own behavior. A separate fix switches the HTTP layer to `esp_http_client`, and the reader now releases ~65KB of EPUB heap before the TLS handshake — together these eliminate the out-of-memory crashes that plagued KOSync on large books. **🛡️ Stability** Two memory leaks patched, a wild pointer crash in JPEGDEC MCU_SKIP handling fixed, boot loops with large XTC files eliminated, legacy XTC headers supported, the OTA updater now streams GitHub release JSON instead of buffering it in RAM, and a JPEG downscaler y-axis scale factor bug is corrected. **🌐 Languages** Slovenian is new. Russian, Ukrainian, Swedish, Italian, and Spanish translations received significant updates. --- Also in this release: **SD-card firmware updates without USB**, **file extensions in the file browser**, **full path bar navigation**, **end-of-book navigation improvements**, **XTC status bar**, **smarter "Cover + Custom" sleep screens**, **set sleep cover from the BMP viewer**, **orientation-aware popups**, **page turn buttons that follow orientation**, **long-press delete for directories**, **context-aware screenshot filenames with book title**, **crash reason displayed on boot**, **empty line rendering in the TXT reader**, **wallpaper recency buffer to prevent clustering**, **font family deletion from the device**, **next/prev labels in the BMP viewer**, **non-breaking space justification fix**, **README guidance for USB-locked third-party Xteink units**, and a long tail of web UI polish, i18n memory optimizations, and code quality improvements. ## What's Changed ### Features * feat: add SD card font support with on-device download and web management by @adriancaruana, @znelson, @itsthisjustin, @jpirnay, and @mcrosson * feat: Initial support for the x3 by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/875 * feat: X3 grayscale antialiasing improvements by @juicecultus in https://github.com/crosspoint-reader/crosspoint-reader/pull/1607 * feat: X3 gyroscope-based tilt page turning via QMI8658 IMU by @juicecultus in https://github.com/crosspoint-reader/crosspoint-reader/pull/1636 * feat(update): SD-card firmware update + X3 bootloader compatibility by @eunchurn in https://github.com/crosspoint-reader/crosspoint-reader/pull/1786 * feat: self-heal from transient WiFi loss, add dBm indicator during WebServerActivity by @jeremydk in https://github.com/crosspoint-reader/crosspoint-reader/pull/1780 * feat: edit wifi networks in webui by @osteotek in https://github.com/crosspoint-reader/crosspoint-reader/pull/1743 * feat: add OPDS search support & next/prev page navigation by @rxmmah in https://github.com/crosspoint-reader/crosspoint-reader/pull/1462 * feat: Support for multiple OPDS servers by @osteotek in https://github.com/crosspoint-reader/crosspoint-reader/pull/1209 * feat: Adjust Navigation at End of Book by @nscheung in https://github.com/crosspoint-reader/crosspoint-reader/pull/1425 * feat: Display file extensions in File Browser by @CaptainFrito in https://github.com/crosspoint-reader/crosspoint-reader/pull/1019 * feat: show full path bar in file browser by @zgredex in https://github.com/crosspoint-reader/crosspoint-reader/pull/1411 * feat: enable manual screen refresh on power button short press by @bdeshi in https://github.com/crosspoint-reader/crosspoint-reader/pull/1626 * feat: Rework "Cover + Custom" sleep screens to show covers only when currently reading by @iandchasse in https://github.com/crosspoint-reader/crosspoint-reader/pull/1256 * feat: Set sleep cover from BMP viewer by @el in https://github.com/crosspoint-reader/crosspoint-reader/pull/1104 * feat: show crash reason on boot by @ngxson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1453 * feat: Support for proportional numeral spacing by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1414 * feat: add orientation-aware popups for reader activities by @mrtnvgr in https://github.com/crosspoint-reader/crosspoint-reader/pull/1428 * feat: smooth battery percentage for x4 by @jonvex in https://github.com/crosspoint-reader/crosspoint-reader/pull/1635 * feat: context-aware screenshot filenames with book title by @jonstieglitz in https://github.com/crosspoint-reader/crosspoint-reader/pull/1589 * feat(theme): add roundedraff theme and fix sleep cover crop grid artifacts by @bunsoootchi in https://github.com/crosspoint-reader/crosspoint-reader/pull/918 * feat: Page turn button orientation change by @mchuck in https://github.com/crosspoint-reader/crosspoint-reader/pull/1069 * feat: Status bar for XTC files by @leecming82 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1849 * feat: enhance long press action to delete both files and directories by @WuTofu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1803 * feat: Added Slovenian translation by @thehijacker in https://github.com/crosspoint-reader/crosspoint-reader/pull/1551 * feat: focus reading by @vjapolitzer in https://github.com/crosspoint-reader/crosspoint-reader/pull/1670 * feat: add next / prev labels to bmp viewer by @Telemaniaka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1852 * feat: add font family deletion functionality by @WuTofu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1919 * feat: separate into "Download All" and "Update All" in font manager by @WuTofu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1955 * feat: verify CRC32 checksum for font files by @WuTofu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1904 * feat: increase default weight of Bitter font for improved rendering by @uxjulia in https://github.com/crosspoint-reader/crosspoint-reader/pull/1922 * feat: allow unnamed intervals by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1903 ### Fixes * fix: epub images not rendering correctly on x3 by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1572 * fix: OTA update on x3 and progress bar on x4 and x3 by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1805 * fix: boot looping when opening large XTC files by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1648 * fix: Wild pointer crash in JPEGDEC MCU_SKIP handling by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1627 * fix: two small memory leaks by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1628 * fix: use esp_http_client for KOSync to prevent TLS OOM on ESP32-C3 by @trilwu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1381 * fix: Read GH release JSON as stream in OTA updater by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1810 * fix: support legacy XTC file headers where pageTableOffset=48 by @uxjulia in https://github.com/crosspoint-reader/crosspoint-reader/pull/1816 * fix: Use font metrics for combining mark positioning by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1310 * fix: Use differential rounding for consistent inter-glyph spacing by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1413 * fix: Support hyphenation for EPUBs using ISO 639-2 language codes by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1461 * fix: Track block style stack for nested styles by @daveallie in https://github.com/crosspoint-reader/crosspoint-reader/pull/1582 * fix: cap per-side horizontal CSS inset at 2em by @rhoopr in https://github.com/crosspoint-reader/crosspoint-reader/pull/1694 * fix: increase loadable epub size by @CSCMe in https://github.com/crosspoint-reader/crosspoint-reader/pull/1638 * fix: Switch to xpath map for paragraph level syncing in KOSync by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1686 * fix: free Epub RAM and simplify KOSync navigation via ActivityManager by @wylanswets in https://github.com/crosspoint-reader/crosspoint-reader/pull/1860 * fix: improve KOSync bidirectional position matching accuracy by @wylanswets in https://github.com/crosspoint-reader/crosspoint-reader/pull/1897 * fix: Fix failing very first wifi connection attempt by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1521 * fix: avoid skipping chapter after screenshot by @Mraulio in https://github.com/crosspoint-reader/crosspoint-reader/pull/1625 * fix: back navigation from BMPViewer by @Telemaniaka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1597 * fix: Fix ghosting on exit of BMPViewer by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1432 * fix: make footnotes consider orientation for gutters by @Telemaniaka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1665 * fix: footnote link text by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1666 * fix: Erroneous navigation with long filenames in footnote links by @CSCMe in https://github.com/crosspoint-reader/crosspoint-reader/pull/1723 * fix: prevent wallpaper clustering with 16-entry recency buffer by @zgredex in https://github.com/crosspoint-reader/crosspoint-reader/pull/1606 * fix: webserver /delete API backward compatibility by @DianaNites in https://github.com/crosspoint-reader/crosspoint-reader/pull/1475 * fix: relative opds paths and query param with copyparty by @philips in https://github.com/crosspoint-reader/crosspoint-reader/pull/1535 * fix: use same file name as KOReader for OPDS downloads by @spfenwick in https://github.com/crosspoint-reader/crosspoint-reader/pull/1286 * fix: pressing space barely moves input cursor (#1729) by @pablohc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1733 * fix: keyboard feedback #1644 by @pablohc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1697 * fix: pluralize folder/file counts correctly in file list summary by @fain182 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1701 * fix: rendering bug of scrollbar in RoundedRaff theme by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1814 * fix: two roundedraff bugs by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1851 * fix: overlap in download font list layout by @pablohc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1900 * fix: remove duplicate 'Download Fonts' menu entry and improve navigation by @zgredex in https://github.com/crosspoint-reader/crosspoint-reader/pull/1893 * fix: Add common ligatures to SD font conversion ranges by @znelson * fix: capture instantiateVariableFont return value by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1911 * fix: Roundraff theme home menu offset with no recent books by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1845 * fix: Missing navigation button labels in Roundedraff theme by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1905 * fix: gracefully resolve fonts missing variants by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1921 * fix: distribute justifyExtra to non-breaking space tokens by @prawnwhoyawns in https://github.com/crosspoint-reader/crosspoint-reader/pull/1783 * fix: remove percent rendering from activities by @mcrosson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1901 * fix: Restore performance in fontconvert_sdcard.py by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1924 * fix: Prepare SD card font caches from txt reader by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1973 * fix: make script help paths lightweight by @sabraman in https://github.com/crosspoint-reader/crosspoint-reader/pull/1937 * fix: Replaced Bookerly with Noto Serif for licensing reasons by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1736 * fix: incorrect y-axis scale factor in jpeg nearest-neighbor downscaler by @WuTofu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1807 * fix: display empty lines in txt reader by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1841 * fix: short-press power action triggered after screenshot combo release by @pablohc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1853 * fix: correct Russian auto-turn translations by @a-ignatev in https://github.com/crosspoint-reader/crosspoint-reader/pull/1566 * fix: Update Ukrainian translations for footnotes (issue 1409) by @mirus-ua in https://github.com/crosspoint-reader/crosspoint-reader/pull/1585 * fix: missing swedish translations by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1667 * fix: Add swedish keyboard translations by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1726 * fix: swedish translations by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1762 * fix: swedish translation by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1829 * fix: swedish translation by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1888 * fix: Polish translation by @th0m4sek in https://github.com/crosspoint-reader/crosspoint-reader/pull/1909 * fix: Ukrainian-translation by @KymAndriy in https://github.com/crosspoint-reader/crosspoint-reader/pull/1946 * fix: Ukrainian translation by @KymAndriy in https://github.com/crosspoint-reader/crosspoint-reader/pull/1939 * fix: python requirements files by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1768 * fix: missing requirement by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1896 * fix: Use LOG_ macros in loc functions by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1794 ### Internal * refactor: redesign on-screen keyboard by @pablohc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1644 * refactor: replace picojpeg with JPEGDEC for cover art conversion by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1517 * refactor: Refactor drawArc / fillArc for faster execution by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1540 * perf: replace i18n pointer tables with offset tables, strip unused strings by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1408 * refactor: Store only unique localization strings in offset buffers by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1802 * refactor: Move language setting into JSON settings by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1796 * refactor: Use C++20 'requires' in ActivityResult constructor by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1420 * refactor: Use default member initializers for JpegContext and PngContext by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1435 * refactor: logPrintf and predefined log level strings by @CSCMe in https://github.com/crosspoint-reader/crosspoint-reader/pull/1546 * refactor: RAII scoped open/close for ZipFile by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1433 * refactor: Deduplicated BMP header writing in Xtc by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1439 * refactor: Added shared XML parser teardown helper by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1438 * refactor: Removed redundant FsFile close() calls by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1434 * refactor: Deduplicate battery drawing code and fix Lyra charging indicator by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1437 * refactor: Deduplicate Roundraff battery drawing by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1847 * refactor: Simplify sort in GfxRenderer::fillPolygon by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1817 * refactor: Avoid vector for page turn rates list by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1818 * refactor: Use std::size instead of sizeof/sizeof by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1819 * refactor: Use fixed-size integers for BookMetadataCache data by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1844 * refactor: Simplify isReaderActivity bookkeeping by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1838 * refactor: Simplify XtcReaderActivity with detectPageTurn by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1837 * refactor: change ukrainian translation to adaptation and add missing lines by @KymAndriy in https://github.com/crosspoint-reader/crosspoint-reader/pull/1828 * chore: drop JPEGDEC patch in favour of upstream fix by @martinbrook in https://github.com/crosspoint-reader/crosspoint-reader/pull/1465 * chore: clang-format.fix.ps1 script: Add .venv to list of path exclusions by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1515 * chore: Updating sleep screen dimensions for X3 by @jensechu in https://github.com/crosspoint-reader/crosspoint-reader/pull/1688 * chore: Clarify X3 RTC in SCOPE.md by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1687 * chore: Improved Italian translations by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1685 * chore: change ukrainian translation to adaptation by @KymAndriy in https://github.com/crosspoint-reader/crosspoint-reader/pull/1684 * chore: Update spanish.yaml by @mvidelatraduc in https://github.com/crosspoint-reader/crosspoint-reader/pull/1717 * chore: One Italian translation tweak by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1718 * chore: git pre-commit hook for format fix by @osteotek in https://github.com/crosspoint-reader/crosspoint-reader/pull/1730 * chore: Update SDK to fork in CrossPoint org by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1836 * chore: Added RAM to firmware_size_history.py script by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1830 * chore: Updated docs to reflect DESTRUCTOR_CLOSES_FILE=1 by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1878 * feat: cap compressed group size at 64 KB by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1913 * fix: build-script bug fixes for fontconvert{,_sdcard}.py by @jpirnay in https://github.com/crosspoint-reader/crosspoint-reader/pull/1910 * feat: include short SHA in CROSSPOINT_VERSION by @osteotek in https://github.com/crosspoint-reader/crosspoint-reader/pull/1728 * feat: show long branch names by @steka in https://github.com/crosspoint-reader/crosspoint-reader/pull/1727 * feat: enable pio build cache by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1769 * style: put page name first in browser titles by @fain182 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1703 * style: unify page headers across web UI by @fain182 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1702 * style: move file type badges into Type column by @fain182 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1793 * style: align action buttons vertically with page title by @fain182 in https://github.com/crosspoint-reader/crosspoint-reader/pull/1795 * docs: Update README with firmware flashing instructions by @ryneches in https://github.com/crosspoint-reader/crosspoint-reader/pull/1654 * docs: fix typos by @kianmeng in https://github.com/crosspoint-reader/crosspoint-reader/pull/1705 * docs: update README.md to reflect the current state of crosspoint by @Uri-Tauber in https://github.com/crosspoint-reader/crosspoint-reader/pull/1812 * docs: Add documentation for USB-locked Xteink devices by @itsthisjustin in https://github.com/crosspoint-reader/crosspoint-reader/pull/1990 * docs: expand first use of OPDS acronym and provide a wikipedia link by @sizezero in https://github.com/crosspoint-reader/crosspoint-reader/pull/1824 * docs: fix KOReader sync guide link by @sabraman in https://github.com/crosspoint-reader/crosspoint-reader/pull/1930 * docs: fix hyphenation updater script name by @sabraman in https://github.com/crosspoint-reader/crosspoint-reader/pull/1931 * fix: sd font download urls in docs by @mcrosson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1945 * fix: sd font folder paths in documentation by @mcrosson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1944 * chore: Add verbose mode to build-sd-fonts.py by @znelson in https://github.com/crosspoint-reader/crosspoint-reader/pull/1923 ## New Contributors * @a-ignatev made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1566 * @CSCMe made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1546 * @thehijacker made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1551 * @Telemaniaka made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1597 * @Mraulio made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1625 * @rxmmah made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1462 * @bdeshi made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1626 * @DianaNites made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1475 * @ryneches made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1654 * @zgredex made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1411 * @jonvex made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1635 * @KymAndriy made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1684 * @jensechu made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1688 * @kianmeng made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1705 * @philips made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1535 * @fain182 made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1701 * @mvidelatraduc made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1717 * @bunsoootchi made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/918 * @rhoopr made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1694 * @spfenwick made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1286 * @trilwu made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1381 * @jonstieglitz made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1589 * @uxjulia made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1816 * @mchuck made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1069 * @sizezero made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1824 * @leecming82 made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1849 * @jeremydk made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1780 * @WuTofu made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1803 * @wylanswets made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1860 * @sabraman made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1930 * @prawnwhoyawns made their first contribution in https://github.com/crosspoint-reader/crosspoint-reader/pull/1783 * @mcrosson made their first contribution as co-author on SD card font support **Full Changelog**: https://github.com/crosspoint-reader/crosspoint-reader/compare/1.2.0...release/1.3.0 --------- Co-authored-by: Justin Mitchell <justin@jmitch.com> Co-authored-by: Chun Ming Lee <95391408+leecming82@users.noreply.github.com> Co-authored-by: Uri Tauber <uritaube@gmail.com> |
||
|
|
0fbe6ff469 |
fix: update README.md to reflect the current state of crosspoint (#1812)
## Summary As noted in [#1680](https://github.com/crosspoint-reader/crosspoint-reader/discussions/1680#discussioncomment-16661106), the README hasn't been updated in a while and has fallen behind the actual firmware. This PR brings it up to date. Beyond the feature list, I added a section acknowledging community forks worth knowing about. I also took some deliberate editorial choices around how CrossPoint is framed — I think it has the potential to be more than just "an alternative Xteink firmware", and the wording reflects that. A note on process: I wrote the bulk of the text myself, but used AI tools to scan the codebase and catch features I might have missed, and to clean up my English (I'm fluent but not a native speaker). If any line reads as unnatural or AI-sounding, please flag it — I'd rather fix it than leave it. --- One thing outside the scope of this PR: I think the cover photo could use a refresh, ideally replaced with a small gallery showing different CrossPoint screens. If you have a professional camera and an Xteink device and want to help with that, let me know. --------- Co-authored-by: Zach Nelson <zach@zdnelson.com> |
||
|
|
43b20bd8be |
fix: Add documentation for USB-locked Xteink devices (#1990)
Document the Xteink Unlocker tool requirement for third-party purchased xteink units that ship with USB flashing locked. Include warnings about bricking risks when flashing unsupported firmwares (e.g. Papyrix) on locked devices, as they may permanently lock the device with no recovery path. |
||
|
|
b186529120 |
fix: Prepare SD card font caches from txt reader (#1973)
## Summary SD card font fixes: - `TxtReaderActivity` needs to call `renderer.ensureSdCardFontReady` to build the advance lookup table to support rendering with SD card fonts. This revealed that `TxtReaderActivity` was inconsistently performing layout with `getTextWidth`, when the renderer actually uses `getTextAdvanceX`, which can lead to minor inconsistencies in alignment. - Avoid allocating one big `allText` string in `ParsedText::layoutAndExtractLines`. Instead, pass the vector of word strings directly to `SdCardFont::buildAdvanceTable`, where the algorithm just needs to iterate codepoints anyway. --- ### 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? _**PARTIALLY**_ --------- Co-authored-by: Justin Mitchell <justin@jmitch.com> |
||
|
|
5fa5a71ba2 |
feat: Add Polish hyphenation support (#1590)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> |
||
|
|
aa43bd3569 |
chore: Removed unused icon header files (#1975)
## Summary Deleted two unused header files containing binary icon data. --- ### 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**_ |
||
|
|
8377ac9e31 |
refactor: Added utils for non-throwing memory allocation and scoped cleanup (#1832)
## Summary
Pared down version of #1418.
Following up on
|
||
|
|
71518b3336 |
fix: KOSync authentication with Calibre-Web-Automated (#1951)
## Summary * **What is the goal of this PR?** Fix regression of Calibre-Web-Automated authentication * **What changes are included?** Trivial fix using ESP HTTP Client primitives ## Additional Context Calibre-Web-Automated KOSync stopped working after refactoring HTTP client to use `ESP HTTP Client`, resulting in a _Server error (try again later)_ error. --- ### AI Usage Did you use AI tools to help write this code? _**NO**_ --------- Co-authored-by: drbourbon <fabio@MacBook-Air-di-Fabio.local> |
||
|
|
30b14f2ecf |
refactor: Removed SdCardFontGlobals.h (#1962)
## Summary First of several changes to decouple and clean up SD card fonts integration. This change eliminates SdCardFontGlobals.h: - Simply declare the `extern SdCardFontSystem sdFontSystem` in SdCardFontSystem.h. - `ActivityManager::goToReader` should not care about loading SD card fonts. Instead do the same work in `ReaderActivity::onEnter`, after the previous activity has exited and after ReaderActivity has validated the file path. --- ### 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**_ |
||
|
|
6f7f4c592a |
refactor: Eliminated relative path includes (#1961)
## Summary Relative includes can hide inappropriate dependency relationships. In this case, I found that lib/KOReaderSync/KOReaderCredentialStore.cpp was dependent on src/JsonSettingsIO.h -- a lib -> app dependency, the opposite direction dependencies should flow in this project. This change replaces all relative includes with root-relative includes, and corrects the KOReaderCredentialStore dependency by moving its JSON settings serialization local to the KOReaderSync library. --- ### 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? _**PARTIALLY**_ |
||
|
|
bc57e5d64b |
fix: jump page on hold in font family and language selection (#1925)
## Summary
- Holding the navigation button in **Settings → Reader → Font family**
now advances the selection by a full visible page instead of one item at
a time.
- Same fix applied to **Settings → Language**, which had the same
one-item-only behavior.
- Mirrors the pattern already used in font download (
|
||
|
|
db3bb850b2 |
fix: handle fallbacks for advance table and prewarm (#1929)
## Summary - Fixes #1928 by having the prewarm and advance table functions resolve fallback styles --- ### AI Usage Did you use AI tools to help write this code? YES - Codex --------- Co-authored-by: Uri Tauber <uritaube@gmail.com> |
||
|
|
30a209de8b |
fix: Characters from unsupported characterset are overlapping (#1958)
## Summary * **What is the goal of this PR?** fix #1956. ## Additional Context [NixOS-and-Flakes-Book_ch3_p7_4pct_130044.bmp](https://github.com/user-attachments/files/27648392/NixOS-and-Flakes-Book_ch3_p7_4pct_130044.bmp) --- ### 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 >**_ |
||
|
|
3c34a8310e |
docs: fix KOReader sync guide link (#1930)
## Summary * Fix the README link to the KOReader Sync quick setup section in the user guide. * Update the fragment from the old 3.6.5 anchor to the current 3.6.7 anchor. ## Additional Context The README pointed to `#365-koreader-sync-quick-setup`, but `USER_GUIDE.md` defines this section as `3.6.7 KOReader Sync Quick Setup`, with the matching anchor `#367-koreader-sync-quick-setup`. Verified with `rg` that the README now points to the existing heading. PlatformIO checks were not run because this is a Markdown-only link fix and `pio` is not installed in this environment. |
||
|
|
bc6e090aa8 |
feat: separate into "Download All" and "Update All" in font manager (#1955)
## Summary * **What is the goal of this PR?** Separate the font manager's combined `Download / Update All` action into separate `Download All` and `Update All` rows * **What changes are included?** - Updated multiple i18n translation files to add `STR_UPDATE_ALL` and adjust `STR_DOWNLOAD_ALL` text. - Added separate handlers: `downloadAll()` for fonts that have been installed and `updateAll()` for fonts with updates. - `Download All` and `Update All` are only shown when applicable. --- ### 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? _**PARTIALLY**_ |
||
|
|
8d1b86a893 |
feat: add next / prev labels to bmp viewer (#1852)
## Summary Bind `prev` / `next` functionality to the left and right buttons in BMP Viewer and adds labels <img width="718" height="953" alt="image" src="https://github.com/user-attachments/assets/c6dac14e-14f5-4cbf-9298-772cfc479f33" /> ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### 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**_ |
||
|
|
63d5094f2e |
Revert "feat: closest-pt size selection instead of ordinal slot" (#1949)
Reverts crosspoint-reader/crosspoint-reader#1912 This was meant to be more robust with partial SD card fonts, but causes trouble for folks using custom font sizes. We need a better approach to decouple numeric font sizes from S/M/L/XL settings. |
||
|
|
24977048c3 |
docs: fix hyphenation updater script name (#1931)
## Summary * Rename the hyphenation update script to match the documented `update_hyphenation.sh` name. * Update the hyphenation trie documentation command example to use the renamed script. ## Additional Context The prose in `docs/hyphenation-trie-format.md` referred to `update_hyphenation.sh`, but the command example and file on disk used `update_hypenation.sh`. This made the documented script name inconsistent with the runnable command. Verified with `rg` that no references to the misspelled script name remain. Also ran `bash -n scripts/update_hyphenation.sh` to syntax-check the renamed script without downloading trie files. |
||
|
|
63e92ec74e |
fix: make script help paths lightweight (#1937)
## Summary Consolidate the script help/startup fixes so standalone helper commands can show usage without requiring runtime-only dependencies or generating files. ## Details Several helper scripts imported optional packages, evaluated newer annotations, or started generation before users could inspect CLI usage. On a fresh checkout, this made common help paths fail on missing packages such as `cairosvg`, `Pillow`, `freetype-py`, `fontTools`, `pyphen`, `pyserial`, or on Python 3.9 annotation evaluation. A few generators also treated `--help` as a normal output argument and wrote files instead of printing usage. This change keeps runtime dependencies on the code paths that need them, handles lightweight help/list commands first, and adds explicit `--help` handling for generator scripts that previously started work. ## Validation - `python3 <script> --help` across tracked Python scripts, excluding `scripts/patch_jpegdec.py` because it is a PlatformIO pre-build hook rather than a standalone CLI - `python3 scripts/convert_icon.py` still exits with usage for missing required arguments - `python3 lib/EpdFont/scripts/fontconvert_sdcard.py --list-presets` - `python3 -m py_compile` for the changed scripts |
||
|
|
accd50b593 |
fix: Ukrainian-translation (#1946)
## Summary Micro fix Ukrainian translation --- ### 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**_ Co-authored-by: KymAndriy <test@notamail.ua> |
||
|
|
26250c0b80 |
fix: Ukrainian translation (#1939)
## Summary Update Ukrainian translation ### AI Usage Did you use AI tools to help write this code? _** PARTIALLY **_ --------- Co-authored-by: Kym_Adnriy <kym_andr@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> |
||
|
|
99ac1c5c89 |
fix: sd font download urls in docs (#1945)
## Summary SD font binaries are published in their own repo, this updates the docs to have the proper informatoin. --- ### 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, claude** |
||
|
|
90874dae9f |
fix: sd font folder paths in documentation (#1944)
## Summary The paths in the sd font documentation were never updated to match the code's use of `/fonts` and `/.fonts`. This fixes the paths in the docs. ### 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, Claude** |
||
|
|
a0037ced2b |
feat: add font family deletion functionality (#1919)
## Summary * **What is the goal of this PR?** 1. Adds font family deletion support to the font download activity so users can remove installed font families directly from the download list. 2. Address an issue where a font family manually deleted in the file browser by user will show as "update" in the `FontDownloadActivity` * **What changes are included?** * Updated button hint label to show `Delete` when deletion is available. * Added confirmation before deleting a selected installed font family. * Refreshed font registry in `fetchAndParseManifest` (for the second goal above) --- ### 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? _**PARTIALLY**_ |
||
|
|
20fee843c7 | fix: Missing navigation button labels in Roundedraff theme (#1905) | ||
|
|
181ed6c488 | fix: gracefully resolve fonts missing variants (#1921) | ||
|
|
3ac1ab13a0 | fix: distribute justifyExtra to non-breaking space tokens (#1783) | ||
|
|
dd06e71b66 | fix: remove percent rendering from activities (#1901) | ||
|
|
4e5e2fe40a |
feat: focus reading (#1670)
## Summary This PR introduces **Focus Reading**, a generic implementation of artificial fixation points (similar to Bionic Reading) designed to improve reading speed and focus by bolding the initial characters of words. This is achieved by dynamically bolding characters during indexing. <img width="500" alt="Focus Reading on X3" src="https://github.com/user-attachments/assets/94a632a5-82da-47be-957c-538b35bf84d9" /> ### Implementation Details #### Core Text Engine (`ParsedText`) - Modified `ParsedText::addWord` to implement a custom bolding algorithm. It uses a 45% ratio for bolding, with a minimum of 1 character and a maximum of 9. - UTF-8 Safety: Integrated `utf8NextCodepoint` to ensure character counting and string slicing occur at safe byte boundaries, preventing corruption of multi-byte characters (e.g., accented letters or smart quotes). - Intelligent Tokenization: This correctly identifies and separates "word" characters (letters, apostrophes, hyphens) from "non-word" characters (numbers, brackets, smart quotes). - Formatting Preservation: The logic ensures that punctuation is not "stolen" for the bolding count and that existing styles (like italics or underlines) are preserved across the bold/regular split. - Processing at indexing stage reduces CPU load at render-time and ensures layout/fit is unaffected. - Split details are tracked with `wordIsFocusSuffix`. After splitting and layout, suffixes are merged back into their preceding word entries to prevent a doubling of RAM usage. #### Settings and UI - Version Management: Bumped `SECTION_FILE_VERSION` to `21` - Global Settings: Added `focusReadingEnabled` to `CrossPointSettings`. - User Interface: Added a new toggle in the "Reader" section of the settings menu, positioned after the "Embedded Style" option. - Localization: Added the `STR_FOCUS_READING` string #### Plumbing - Plumbed the `focusReadingEnabled` boolean through `EpubReaderActivity`, `Section`, and `ChapterHtmlSlimParser` to ensure the user's setting reaches the `ParsedText` constructor during chapter indexing. ## Additional Context ### Files Changed - `lib/Epub/Epub/ParsedText.h / .cpp`: Core fixation logic and UTF-8 tokenization. - `lib/Epub/Epub/Section.h / .cpp`: Cache header updates and invalidation logic. - `lib/Epub/Epub/parsers/ChapterHtmlSlimParser.h / .cpp`: Plumbing the setting to text blocks. - `src/CrossPointSettings.h`: Data persistence for the new setting. - `src/SettingsList.h`: UI toggle implementation. - `src/activities/reader/EpubReaderActivity.cpp`: Handling settings changes during reading sessions. - `lib/I18n/translations/*.yaml`: UI strings. --- ### 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**_ |
||
|
|
2ff63884d6 |
fix: Restore performance in fontconvert_sdcard.py (#1924)
## Summary #1910 caused a massive performance degradation in the way rasterized glyph buffers were handled during pixel iteration. This change restores the original performance characteristics so the font generation job finishes in a reasonable amount of time. --- ### 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**_ |
||
|
|
74b8cac928 |
chore: Add verbose mode to build-sd-fonts.py (#1923)
## Summary One of the recent font conversion script changes obliterated performance. Add a verbose mode to build-sd-fonts.py to help diagnose problems. Changed the CI process to use verbose mode. --- ### 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**_ |
||
|
|
aba393f900 |
fix: Polish translation (#1909)
## Summary * **What is the goal of this PR?** (e.g., Implements the new feature for file uploading.) * **What changes are included?** ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### 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 | PARTIALLY | NO >**_ |
||
|
|
45441e0789 |
feat: closest-pt size selection instead of ordinal slot (#1912)
Add SdCardFontFamilyInfo::pickClosestSize(targetPtSize) and have the
manager and SdCardFontSystem drive size selection from a target point
size derived from the user's font-size enum (SMALL=12, MEDIUM=14,
LARGE=16, EXTRA_LARGE=18) rather than indexing the family's sorted size
list by enum ordinal.
The ordinal-slot approach mis-selects whenever a family doesn't ship the
canonical {12,14,16,18} set: a family with only [10,14,18] would map
SMALL/MEDIUM/LARGE/EXTRA_LARGE to 10/14/18/18 — fine for SMALL but
arbitrary for the rest. Closest-pt always picks the on-disk file nearest
to the user-intended point size, with a deterministic smaller-pt
tie-break.
No change for canonical-sized families.
## Summary
* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)
* **What changes are included?**
## Additional Context
* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
specific areas to focus on).
---
### 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 | PARTIALLY | NO
>**_
|
||
|
|
cff54d776c |
feat: increase default weight of Bitter font for improved rendering (#1922)
## Summary **What is the goal of this PR?** * Provide a better default weight of Bitter font for improved rendering **What changes are included?** * Changes the default weight for Bitter font that is defined in the custom font catalog to medium (500) from regular (400) for improved rendering on e-ink, especially when font anti-aliasing is turned on ## Additional Context * Bitter font at regular weight can become washed out when AA is on due to some of the thinner stems and posts of the font. Bumping the weight up to medium makes it sturdier and holds up better when AA is turned on. --- ### 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 >**_ |
||
|
|
5917c561b3 |
fix: build-script bug fixes for fontconvert{,_sdcard}.py (#1910)
Fontconvert_sdcard.py: * Move face.set_char_size() before any load_glyph() call. The validation loop runs load_glyph() with FT_LOAD_RENDER, which renders at the *active* size — calling it before set_char_size() wastes work at the default size and triggers Invalid_Size_Handle on some fonts. * Walk bitmap.buffer using bitmap.pitch with negative-pitch handling. The previous linear iteration assumed pitch == width and a top-down layout, which silently corrupts output for any padded or bottom-up bitmap FreeType returns. * Fix operator-precedence bug in 2-bit tail-padding: px << (4 - … % 4) * 2 evaluated as (px << (4 - … % 4)) * 2 due to << binding tighter than *. Add the missing outer parens. * Drop SMP codepoints (> U+FFFF) from kern and ligature tables before packing — the binary format uses uint16/uint32 codepoint fields and would raise struct.error otherwise. * Skip GPOS kern subtables that aren't lookup type 2 (PairPos). _extract_pairpos_subtable assumes Type-2 layout; cursive attachment and other types reachable through the kern feature crash inside it. Fontconvert.py: * Force UTF-8 stdout so `python fontconvert.py … > foo.h` on Windows doesn't emit UTF-16 / replacement characters in the generated header. ## Summary * **What is the goal of this PR?** (e.g., Implements the new feature for file uploading.) * **What changes are included?** ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### 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 | PARTIALLY | NO >**_ |
||
|
|
5d5533b3d2 |
fix: capture instantiateVariableFont return value (#1911)
instantiateVariableFont() returns a *new* TTFont with the requested axes
pinned; the existing call discards that return and proceeds to
font.save() the original (still-variable) font. The "static instance"
written to disk is therefore identical to the source variable font and
the requested axis values are silently ignored.
For sd-fonts.yaml entries that use the `variable: {wght: 400}` form
(e.g. Bitter, Lora) this means every weight ends up rasterised from the
same default-weight glyphs — bold and regular look the same.
Capture the return value, and pass two diagnostically useful kwargs
while we're touching the call:
* updateFontNames=True — rewrite the name table so the saved TTF reports
its actual weight/style instead of retaining the source variable-font
names.
* optimize=False — skip the gvar interpolation optimisation;
fully pinning every axis drops gvar anyway,
so the work would be wasted.
The atomic-write scaffolding around the call is left untouched.
## Summary
* **What is the goal of this PR?** (e.g., Implements the new feature for
file uploading.)
* **What changes are included?**
## Additional Context
* Add any other information that might be helpful for the reviewer
(e.g., performance implications, potential risks,
specific areas to focus on).
---
### 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 | PARTIALLY | NO
>**_
|
||
|
|
c5d2dc2e00 |
feat: cap compressed group size at 64 KB (#1913)
Add GROUP_MAX_UNCOMPRESSED_BYTES=65536 on top of the existing script- based grouping. When adding the next glyph would push a group past the cap, the group is closed and a new one started with the same script ID. Without the cap, the size of a script group is bounded only by however many glyphs the font supplies in that block. Dense scripts (CJK, Vietnamese precomposed, user-supplied fonts with large Unicode blocks) can produce a single group whose uncompressed size exceeds what fits in the embedded decompressor's transient malloc on the ESP32-C3, which manifests as a runtime allocation failure instead of a build error. The 64 KB ceiling is large enough to hold any single built-in script group with headroom and small enough to be a comfortable transient allocation on-device. The check uses byte-aligned size (4-pixel-aligned row stride × height), which is what the decompressor actually consumes — not the packed on-disk length. A defensive guard rejects any single glyph whose own size exceeds the cap with a clear error pointing at the offending codepoint. ## Summary * **What is the goal of this PR?** (e.g., Implements the new feature for file uploading.) * **What changes are included?** ## Additional Context * Add any other information that might be helpful for the reviewer (e.g., performance implications, potential risks, specific areas to focus on). --- ### 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 | PARTIALLY | NO >**_ |
||
|
|
91de6ac278 | fix: two roundedraff bugs (#1851) | ||
|
|
c7ad14eb36 |
fix: swedish translation (#1888)
## Summary * Add missing swedish translations --- ### 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**_ |
||
|
|
d3e0aeb62b |
feat: allow unnamed intervals (#1903)
## Summary * Previous `fontconvert_sdcard.py` requires that the intervals are named (i.e. listed in `INTERVAL_PRESETS`, ex. "latin1"), this change will also allow them to be unnamed (ex. "(0x2100-0x214F)") for a more flexible usage. --- ### 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**_ |
||
|
|
3efc863038 |
feat: verify CRC32 checksum for font files (#1904)
## Summary * **What is the goal of this PR?** Add end-to-end integrity verification for downloaded font files by including CRC32 checksums in the font manifest and validating downloaded `.cpfont` files on device. * **What changes are included?** - `generate-font-manifest.py`: compute and include `crc32` for each `.cpfont` asset in the generated `fonts.json` manifest. - `FontDownloadActivity.h`: extend manifest file metadata with `crc32` and declare checksum helper. - `FontDownloadActivity.cpp`: parse `crc32` from manifest, compute CRC32 of downloaded files using `esp_rom_crc32_le`. --- ### 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**_ |
||
|
|
bf30964982 |
fix: overlap in download font list layout (#1900)
## Summary
Fix font download list layout overlap in Classic and RoundedRaff themes.
The font description was shown as a right-aligned value, causing text to
overlap with the font name on narrow screens.
### Changes
- Move font description from `rowValue` to `rowSubtitle` (second line)
- Show only status ("Installed"/"Update Available") as `rowValue`
- Fix Classic and RoundedRaff themes `rowValue` truncation (was fixed
60px, now dynamic)
## Screenshots
### Classic
| RC 1.3.0 | #1900 |
|-|-|
|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/534434d6-d7a6-4f73-9d80-8fe5d060907c"
/>|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/e616c4b7-43b9-49a8-8aa6-ab19f29865f1"
/>|
### Lyra
| RC 1.3.0 | #1900 |
|-|-|
|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/5b42bad4-2860-4863-a025-5292aa391c1a"
/>|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/4c27dcbb-8e8e-4ef0-8771-f92975210f11"
/>|
### RoundedRaff
| RC 1.3.0 | #1900 |
|-|-|
|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/f0510c6f-7712-4cec-8fc8-4386951b1795"
/>|<img width="480" height="800" alt="image"
src="https://github.com/user-attachments/assets/017596b8-fe95-4541-884b-5de034c24193"
/>|
---
### 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>**_
|
||
|
|
ceb3fed392 |
fix: remove duplicate 'Download Fonts' menu entry and improve navigation (#1893)
## Summary
Removes duplicate "Download Fonts" menu entry and adds complete
navigation support to the font download activity.
## Problem
"Download Fonts" was appearing in **both** Reader settings and System
settings, creating a confusing duplicate menu entry.
## Changes
### 1. Remove Duplicate Menu Entry
- Removed `STR_DOWNLOAD_FONTS` from `systemSettings` in
`SettingsActivity.cpp`
- "Download Fonts" now only appears in **Reader settings**, positioned
right after the font family setting
- Rationale: Font settings logically belong together in the Reader
category
### 2. Navigation Improvements
- **Single-item navigation**: Replaced manual bounds checking with
`ButtonNavigator::nextIndex()` and `previousIndex()` methods
- Navigation now wraps from last item to first (and vice versa)
- **Page navigation**: Added continuous navigation handlers
- Long-pressing up/down buttons now navigates by page
- Uses `UITheme::getNumberOfItemsPerPage()` for consistent behavior
## Files Changed
- `src/activities/settings/SettingsActivity.cpp`: Removed duplicate
entry
- `src/activities/settings/FontDownloadActivity.cpp`: Navigation
improvements
## Testing
- Build: ✅ Compiled successfully
- Device testing: Recommended before merge
|
||
|
|
f03d3a8056 |
fix: missing requirement (#1896)
## Summary * Fix missing requirement (needed by lib/EpdFont/scripts/build-sd-fonts.py) * Add a root requirements.txt to simplify installation --- ### 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**_ |
||
|
|
bf894fd343 |
fix: improve KOSync bidirectional position matching accuracy (#1897)
## Summary **Goal:** Fix bidirectional KOSync position matching between CrossPoint and KOReader so that syncing in either direction lands on the correct page with character-level accuracy. **Changes included:** **Download — `toCrossPoint` (server XPath → CrossPoint page)** - **XPath ancestry mode for structured elements**: The previous `ParagraphStreamer` only tracked `<p>` elements. Replaced with a full ancestor-walking mode that correctly resolves XPaths pointing into `<li>`, `<ul>`, and other structured elements. Char offset within the target element is bounded to the matched element's content only. - **Slash-in-attribute-value corrupts depth tracking**: `processByteInTag()` treated every `/` byte as a self-closing tag marker, including `/` inside quoted attribute values (e.g. `xmlns="http://..."`, `src="Links/image.jpg"`). This drove `htmlDepth` to 0 prematurely, causing the ancestry search to exit far short of the target paragraph. Fixed with `inAttrQuote` tracking. - **Off-by-one in page formula**: `intra * totalPages` rounds up incorrectly for last-page positions. Changed to `intra * (totalPages - 1)` to map the `[0, 1]` intra fraction correctly onto the `[0, totalPages-1]` page range. Example: page 14 of 17 was returned as 15. **Upload — `toKOReader` (CrossPoint page → server XPath)** - **Off-by-one in page-to-intra formula**: Symmetric fix — `pageNumber / totalPages` changed to `pageNumber / (totalPages - 1)`, with the guard updated from `> 0` to `> 1` to avoid division by zero. - **`<li>`-based XPath generation**: When the current page starts on a list item, `findXPathForProgress` now generates `ul[N]/li[M]` XPaths rather than falling back to the preceding `<p>`. Requires the new `listItemIndex` field in `PageLutEntry` (section cache version bumped to 23). - **Text-node precision with correct `text()[N].M` format**: KOReader expects `text()[N].M` where `N` is the 1-based index of the specific text node within the element. The previous attempt generated `text().M` (no brackets), which caused KOReader to jump to the front of the book. Implements a per-element text-node index stack in `XPathProgressResolver` — parallel to the existing element path stack — that correctly tracks text node indices relative to each element. Empty text nodes from bare anchor elements (`<a id="anchor"/>`) are intentionally skipped, matching KOReader's own text node counting behavior. **Reviewer-caught bugs** - **Double `onCloseTag()` on malformed `</br/>`**: Both the `tagIsClose` path and the self-closing `/` check were firing, double-decrementing `htmlDepth`. Fixed with a `!tagIsClose` guard. - **Dangling pointer in `LOG_DBG`**: `std::to_string(*nextParagraphPage).c_str()` passed a pointer to a temporary destroyed before the variadic call. Fixed with `snprintf` into a stack `char[8]` buffer. ## Additional Context - Section cache version bumped from 22 → 23 due to the new `listItemIndex` field in `PageLutEntry`. Users upgrading will see a one-time re-render of all cached sections on first load — no data loss. - The `textNodeIndexStack` in `XPathProgressResolver` is a `std::vector<int>` that mirrors the existing `path` and `parentStates` stacks — same depth, same lifetime. No additional heap pressure beyond what was already present. - All fixes verified on device with *Gentle and Lowly* by Dane C. Ortlund (spine 21, 17 pages). Download syncs land on the correct page; upload syncs land at the correct paragraph with character-level offset. ## Test plan - [ ] Download: sync from KOReader → CrossPoint lands on correct page for `text()[N].M` XPaths - [ ] Download: ancestry correctly resolves `<li>` positions inbound from KOReader - [ ] Upload: sync from CrossPoint → KOReader lands within one page for mid-paragraph positions - [ ] Upload: sync from CrossPoint → KOReader correctly targets `<li>` elements when page starts on a list item - [ ] Upload: `text()[N].M` format XPaths do not cause KOReader to jump to front of book - [ ] Section cache version 23: delete `.crosspoint/` and verify clean re-parse with no crashes --- ### AI Usage Did you use AI tools to help write this code? **YES** — developed with Claude Code (Anthropic). --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
628794f8b8 | fix: Add common ligatures to SD font conversion ranges | ||
|
|
e64155ed63 |
fix: free Epub RAM and simplify KOSync navigation via ActivityManager (#1860)
## Summary * **What is the goal of this PR?** Fix KOSync failing with "Network error" on large/complex EPUBs, and simplify the sync navigation flow by removing the callback/result pattern. * **What changes are included?** This PR combines the approaches from #1855 and #1760 into a single, cleaner solution: **Memory fix (from #1855):** - `EpubReaderActivity` pre-computes the local KOReader position and chapter name, then explicitly releases `epub` and `section` before launching `KOReaderSyncActivity`. This frees ~65KB measured on device, giving the TLS handshake sufficient heap. The root cause was `MBEDTLS_ERR_X509_ALLOC_FAILED` (-0x2880) when a 3-cert chain consumed ~48KB during the handshake with only ~50KB available. - `KOReaderSyncActivity` no longer receives a `shared_ptr<Epub>` at construction — it lazy-loads the Epub after TLS only if remote progress is found (`ensureEpubLoaded()`). - Added `MIN_HEAP_FOR_TLS = 55000` guard in `KOReaderSyncClient` — returns `LOW_MEMORY` early if aggregate free heap is too low before attempting a TLS connection. **Navigation simplification (from #1760):** - Replaced `startActivityForResult` + callback with `activityManager.replaceActivity` / `activityManager.goToReader`. Progress is saved to `progress.bin` before the epub is released (cancel/upload paths) and in `saveProgressAndReturn` (apply remote path). The reader re-launches from the saved position naturally via `goToReader`, eliminating the need to reload the epub in a callback. - Extracted `ReaderUtils::saveProgress()` as a shared helper used by both `EpubReaderActivity` and `KOReaderSyncActivity`. - Added `STR_SAVE_PROGRESS_FAILED` to all 22 language files for the case where writing the synced position to SD fails. **Orientation fix (found during device testing):** - `EpubReaderActivity::onExit()` resets the renderer to portrait before destruction. With `replaceActivity` the reader is fully torn down before KOSync starts, so KOSync was always rendering in portrait even when reading in landscape. Fixed by calling `ReaderUtils::applyOrientation` in `KOReaderSyncActivity::onEnter()`. ## Additional Context Heap measurements on device (large EPUB with complex CSS): | Metric | Before | After | |---|---|---| | Heap before Epub release | 88,156 bytes | — | | Heap after Epub release | — | 153,892 bytes (+65,736) | | Heap at TLS handshake | ~50,000 bytes (fails) | ~116,384 bytes (passes) | | Min-free-ever during sync session | 2,600 bytes | 33,052 bytes | | TLS result | `MBEDTLS_ERR_X509_ALLOC_FAILED` | HTTP 200 | Tested on device: sync from inside a large EPUB in both portrait and landscape, cancel, apply remote progress, upload local progress. --- ### AI Usage Did you use AI tools to help write this code? _**YES**_ --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|
|
7993b2bb97 |
feat: add SD card font support with on-device download and web management
Add a complete SD card font subsystem that enables users to install and use custom fonts beyond the three built-in families. This combines the back-end firmware support (#1327) with the font configuration, build pipeline, CI distribution, and user-facing management UI (#1392). Core font system: - Custom .cpfont binary format (v4) with multi-style support (regular, bold, italic, bold-italic) packed into a single file per size - On-demand glyph loading from SD card with two-pass prewarm rendering to bulk-read glyphs per page, achieving near-flash performance for Latin text (~697ms vs ~681ms) and viable CJK rendering (~32% slower) - Persistent advance cache for layout measurement without SD I/O - Overflow ring buffer for glyph cache misses during rendering - Memory-conscious design: only advance tables kept in RAM; glyph bitmaps, kern tables, and ligatures loaded on demand from SD Font management: - On-device WiFi download from GitHub Releases with manifest-based discovery, install/update detection, and progress UI - Web interface font upload, listing, and deletion via /fonts page - Manual SD card copy to /fonts/ or /.fonts/ directories - Font selection integrated into Settings > Reader > Font Family Build pipeline: - Declarative YAML config (sd-fonts.yaml) as single source of truth for the 17-family font library (serif, sans, mono, accessibility) - Python converter (fontconvert_sdcard.py) for TTF/OTF to .cpfont with FreeType rasterization, class-based kerning, and ligature extraction - Parallel build orchestrator with variable font instance extraction - CI workflow publishing versioned + stable releases to a dedicated crosspoint-fonts repository with auto-incrementing revision tags - Centralized version constants (cpfont_version.py) shared across build tooling and CI, with firmware headers as manual sync points Additional fixes: - CJK characters no longer get hyphens inserted at line breaks - Advance table eliminates 30+ second stalls during CJK section indexing for paragraphs with >512 unique codepoints Closes #930 Co-authored-by: Zach Nelson <zach@zdnelson.com> Co-authored-by: Justin <itsthisjustin@users.noreply.github.com> Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: mcrosson <kemonine@kemonine.info> |