chore: Remove miniz and modularise inflation logic#1073
Conversation
|
No actionable comments were generated in the recent review. 🎉 📜 Recent review detailsConfiguration used: Organization UI Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
📝 WalkthroughWalkthroughReplaces in-project miniz/tinfl/uzlib usage with a new InflateReader abstraction; adds InflateReader module; migrates font, PNG, and ZIP decompression to InflateReader streaming or one-shot APIs; removes the public miniz header and adjusts PlatformIO build flags. Changes
Sequence Diagram(s)sequenceDiagram
participant File as File/Stream
participant Reader as InflateReader
participant Decoder as Decoder (PNG/Font/ZIP)
participant Out as Output Buffer
File->>+Reader: provide compressed bytes (setSource or read callback)
Reader->>+Decoder: deliver decompressed chunk (read / readAtMost)
Decoder->>Out: write/defilter/assemble data
Decoder-->>-Reader: request more decompressed data
Reader-->>-File: invoke read callback when more input needed
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
lib/EpdFont/FontDecompressor.cpplib/EpdFont/FontDecompressor.hlib/InflateReader/InflateReader.cpplib/InflateReader/InflateReader.hlib/PngToBmpConverter/PngToBmpConverter.cpplib/ZipFile/ZipFile.cpplib/miniz/miniz.clib/miniz/miniz.hplatformio.ini
💤 Files with no reviewable changes (2)
- lib/miniz/miniz.h
- platformio.ini
🧰 Additional context used
🧬 Code graph analysis (1)
lib/InflateReader/InflateReader.h (1)
lib/InflateReader/InflateReader.cpp (16)
InflateReader(14-14)init(16-28)init(16-16)deinit(30-36)deinit(30-30)setSource(38-41)setSource(38-38)setReadCallback(43-43)setReadCallback(43-43)cb(43-43)skipZlibHeader(45-48)skipZlibHeader(45-45)read(50-62)read(50-50)readAtMost(64-74)readAtMost(64-64)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: cppcheck
- GitHub Check: build
🔇 Additional comments (16)
lib/EpdFont/FontDecompressor.h (2)
3-3: LGTM: new InflateReader dependency.
Keeps the header aligned with the new decompression abstraction.
31-31: LGTM: InflateReader state replaces uzlib internals cleanly.lib/ZipFile/ZipFile.cpp (2)
9-35: Nice encapsulation of streaming inflate state.
The context + callback separation makes the I/O path easier to follow.
420-473: LGTM: ZIP method branching updated for InflateReader.
One-shot inflate keeps raw-deflate handling straightforward.lib/EpdFont/FontDecompressor.cpp (1)
82-85: LGTM: one-shot InflateReader path is straightforward.lib/InflateReader/InflateReader.cpp (2)
7-12: LGTM: 32KB window + layout guard.
The static_assert helps keep the callback cast safe.
38-74: LGTM: source/callback wiring and read APIs look solid.lib/PngToBmpConverter/PngToBmpConverter.cpp (8)
23-52: LGTM: inline BMP writers + Paeth predictor.
54-175: LGTM: PNG/BMP helpers are clear and localized.
177-205: LGTM: decode context updated for InflateReader streaming.
209-267: LGTM: IDAT scanning + read callback look correct.
273-277: LGTM: scanline decode now streams via InflateReader.
502-510: LGTM: context initialization aligns with the new pipeline.
559-568: LGTM: reader init + zlib header skip for PNG IDAT.
593-594: LGTM: fixed‑point scale factor update.lib/InflateReader/InflateReader.h (1)
43-89: LGTM: API covers both one‑shot and streaming use cases.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@lib/InflateReader/InflateReader.cpp`:
- Around line 16-36: The init method currently overwrites ringBuffer without
freeing previous allocation; before allocating in InflateReader::init when
streaming is true, check if ringBuffer is non-null and free it (or call
InflateReader::deinit behavior) to avoid leaking memory, then proceed to
allocate and zero INFLATE_DICT_SIZE; if allocation fails ensure ringBuffer
remains nullptr and return false; finally call uzlib_uncompress_init(&decomp,
ringBuffer, ringBuffer ? INFLATE_DICT_SIZE : 0) as before.
In `@lib/InflateReader/InflateReader.h`:
- Around line 7-9: Implement the missing inflateBuffer function in
InflateReader.cpp: add a definition matching bool inflateBuffer(const uint8_t*
src, size_t srcLen, uint8_t* dst, size_t dstLen) that performs a one-shot
raw-deflate decompression using zlib (inflateInit2 with -MAX_WBITS), sets
z_stream.next_in/avail_in to src/srcLen and next_out/avail_out to dst/dstLen,
loops calling inflate until Z_STREAM_END or an error, then calls inflateEnd and
returns true only when exactly dstLen bytes were produced (avail_out == 0 and
inflate finished successfully); on any zlib error or short/over production,
clean up with inflateEnd and return false. Include necessary zlib headers and
ensure the function signature matches the declaration in InflateReader.h.
In `@lib/ZipFile/ZipFile.cpp`:
- Around line 577-601: The loop currently sets success when InflateStatus::Done
without validating totals; modify the streaming path around
ctx.reader.readAtMost/outputBuffer to accumulate a running total (e.g.,
totalProduced) of all produced bytes, and after receiving InflateStatus::Done
verify totalProduced == fileStat.uncompressedSize (error and abort if less or if
totalProduced exceeds fileStat.uncompressedSize during accumulation); only set
success = true and log inflatedDataSize when the sizes match, and log an error
and break on mismatch/overflow so truncated or overflown output is rejected.
3a7dfd2 to
ea0c0f1
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
lib/InflateReader/InflateReader.cpp (1)
6-8: Consider makingINFLATE_DICT_SIZEa compile-time constant.The value is fixed at 32768 and never changes. Using
constexprwould be more idiomatic and ensures the value is known at compile time.♻️ Suggested change
namespace { -size_t INFLATE_DICT_SIZE = 32768; +constexpr size_t INFLATE_DICT_SIZE = 32768; }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@lib/InflateReader/InflateReader.cpp` around lines 6 - 8, Change the runtime modifiable variable INFLATE_DICT_SIZE into a compile-time constant by replacing its definition in the anonymous namespace with a constexpr (e.g., constexpr size_t INFLATE_DICT_SIZE = 32768;) so the value is known at compile time and cannot be modified; update any usages of INFLATE_DICT_SIZE in InflateReader.cpp as needed (no API changes required).
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
lib/EpdFont/FontDecompressor.cpplib/EpdFont/FontDecompressor.hlib/InflateReader/InflateReader.cpplib/InflateReader/InflateReader.hlib/PngToBmpConverter/PngToBmpConverter.cpplib/ZipFile/ZipFile.cpplib/miniz/miniz.clib/miniz/miniz.hplatformio.ini
💤 Files with no reviewable changes (2)
- lib/miniz/miniz.h
- platformio.ini
🚧 Files skipped from review as they are similar to previous changes (1)
- lib/EpdFont/FontDecompressor.h
🧰 Additional context used
🧬 Code graph analysis (2)
lib/InflateReader/InflateReader.cpp (2)
lib/InflateReader/InflateReader.h (1)
InflateReader(39-85)lib/uzlib/src/tinflate.c (3)
uzlib_uncompress_init(552-562)uzlib_get_byte(193-217)uzlib_uncompress(565-626)
lib/InflateReader/InflateReader.h (1)
lib/InflateReader/InflateReader.cpp (16)
InflateReader(14-14)init(16-27)init(16-16)deinit(29-35)deinit(29-29)setSource(37-40)setSource(37-37)setReadCallback(42-42)setReadCallback(42-42)cb(42-42)skipZlibHeader(44-47)skipZlibHeader(44-44)read(49-61)read(49-49)readAtMost(63-73)readAtMost(63-63)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: cppcheck
- GitHub Check: build
🔇 Additional comments (16)
lib/ZipFile/ZipFile.cpp (4)
9-35: LGTM!The
ZipInflateCtxstruct correctly placesInflateReaderas the first member, enabling the uzlib callback cast pattern. ThezipReadCallbackimplementation properly handles EOF conditions and buffer management, matching the documented pattern inInflateReader.h.
457-463: LGTM!The one-shot decompression path is cleanly implemented with proper RAII scoping. The
InflateReaderdestructor runs beforedeflatedDatais freed, ensuring correct cleanup order.
577-621: LGTM!The streaming decompression correctly tracks
totalProducedand validates both overflow during accumulation and exact size match at completion. The cleanup paths properly handle all allocated resources.
17-19: LGTM!Namespace-scoped constants improve readability and maintainability over magic numbers for compression method checks.
lib/EpdFont/FontDecompressor.cpp (1)
82-88: LGTM!The migration to
InflateReaderis clean. Sinceinit()internally callsdeinit()first, repeated decompression calls are safe. Error handling correctly freesoutBufon failure.lib/InflateReader/InflateReader.h (2)
1-46: LGTM!The
InflateStatusscoped enum and class structure are well-designed. The copy semantics are correctly deleted, and the documentation clearly explains the streaming callback pattern for uzlib integration.
47-85: LGTM!The method declarations provide a clear and well-documented API for both one-shot and streaming decompression modes. The
raw()accessor enables advanced use cases while the primary API remains simple.lib/InflateReader/InflateReader.cpp (3)
10-14: LGTM!The
static_assertensures the callback casting pattern remains valid, and the destructor properly delegates todeinit()for cleanup.
16-35: LGTM!The
init()/deinit()pair correctly handles resource management. Callingdeinit()at the start ofinit()prevents ring buffer leaks on re-initialization, addressing the previously identified issue.
49-73: LGTM!The
read()andreadAtMost()implementations correctly handle the different modes. One-shot mode setsdest_startfor back-reference resolution, while streaming mode relies on the ring buffer. The status mapping inreadAtMost()is correct.lib/PngToBmpConverter/PngToBmpConverter.cpp (6)
23-56: LGTM!The BMP writing helpers and
paethPredictorare correctly implemented. The helper functions follow little-endian BMP format requirements.
178-205: LGTM!The
PngDecodeContextcorrectly placesInflateReaderas the first member, enabling the callback casting pattern. The structure properly encapsulates all state needed for streaming PNG decompression.
233-267: LGTM!The
pngIdatReadCallbackcorrectly handles multi-chunk IDAT streams, properly skipping CRC bytes between chunks and finding subsequent IDAT chunks when needed.
270-320: LGTM!The
decodeScanlinefunction cleanly integrates withInflateReader::read()for decompression and correctly implements all PNG filter types.
559-568: LGTM!The streaming
InflateReaderinitialization is correct. PNG IDAT data uses zlib compression, so callingskipZlibHeader()before decompression is necessary.
593-594: LGTM!The fixed-point scaling arithmetic is safe given the image size constraints (
MAX_IMAGE_WIDTH = 2048,MAX_IMAGE_HEIGHT = 3072). The shift operationwidth << 16won't overflowuint32_twithin these limits.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@lib/InflateReader/InflateReader.cpp`:
- Around line 6-8: Change the runtime modifiable variable INFLATE_DICT_SIZE into
a compile-time constant by replacing its definition in the anonymous namespace
with a constexpr (e.g., constexpr size_t INFLATE_DICT_SIZE = 32768;) so the
value is known at compile time and cannot be modified; update any usages of
INFLATE_DICT_SIZE in InflateReader.cpp as needed (no API changes required).
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
lib/InflateReader/InflateReader.cpp
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: build
- GitHub Check: cppcheck
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@lib/InflateReader/InflateReader.cpp`:
- Around line 63-69: readAtMost currently doesn't set decomp.dest_start in
non-streaming (one-shot) mode, which causes back-references to use an
uninitialized dest_start when ringBuffer is null; update
InflateReader::readAtMost to mirror read() by checking if ringBuffer is null and
then set decomp.dest_start = dest (or return an error/InflateStatus indicating
streaming-only) before calling uzlib_uncompress(&decomp), ensuring produced is
only computed after decomp.dest_start is initialized and avoiding corrupted
output/crash when init(false) was used.
d6001e9 to
6c1e32c
Compare
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
…#1073) ## Summary * Remove miniz and move completely to uzlib * Move uzlib interfacing to InflateReader to better modularise inflation code --- ### 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 helped with the extraction and refactor
## Summary It's been a little while since the last release, but the community has been incredibly busy. With 155 changes from 48 contributors (30 of which were new!), there was a lot to cover. Here are some of the highlights: **🔤 Kerning, Ligatures, and Font Improvements** Text rendering gets a significant upgrade with proper kerning and ligature support, fixed-point fractional x-advance for more accurate character placement, and font compression improvements that reduce flash usage. **📝 Footnotes** Footnote anchor navigation lets you select a footnote reference and jump to the footnote text, then jump back. Slim footnotes support is also available for books that use inline footnotes. **📖 EPUB Optimizer** A new integrated EPUB optimizer can clean up and reprocess books for better compatibility with the reader, directly from the device. **🔋 Battery Charging Indicator** You can now see when your device is actively charging, with a visual indicator on the battery icon. **💾 Crash Diagnostics** When something goes wrong, the firmware now dumps a crash report to the SD card — even without USB plugged in. This makes it much easier to report and diagnose issues. **🌐 New Languages** The community continues to expand language support. New in this release: Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian, Romanian, Catalan, Vietnamese, and Kazakh — along with significant improvements to existing translations. **📂 File Management** Multi-select file deletion, BMP image viewer in the file browser, hidden directory browsing, and long-click file deletion from the file browser. **⚡ Performance** Under the hood, text layout switched from `std::list` to `std::vector`, HTML entity lookups are now O(log(n)), font rendering is faster, image decode is 5-20% faster with per-pixel overhead eliminated, and multiple string allocation hot paths were eliminated. Pre-indexing of the next chapter also reduces page-turn latency at chapter boundaries. --- Along with all of the above, there are many other additions including **WebDAV support**, **auto page turn**, **QR code for current page**, **split status bar settings**, **screenshot capture**, **JSON-based settings migration**, **light/dark theme groundwork**, and a long list of stability fixes and translation improvements. ## What's Changed ### Features * feat: Support for kerning and ligatures by @znelson in #873 * feat: footnote anchor navigation by @Uri-Tauber in #1245 * feat: slim footnotes support by @Uri-Tauber in #1031 * feat: integrated epub optimizer by @zgredex and @pablohc in #1224 * feat: battery charging indicator (mirroring PR #537) by @jpirnay in #1427 * feat: dump crash report to sdcard by @ngxson in #1145 * feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity by @LSTAR1900 in #979 * feat: upgrade platform and support webdav by @dexif in #1047 * feat: Auto Page Turn for Epub Reader by @GenesiaW in #1219 * feat: enhance file deletion functionality with multi-select by @Jessica765 in #682 * feat: Long Click for File Deletion through File Browser by @Levrk in #909 * feat: Take screenshots by @el in #759 * feat: Current page as QR by @el in #1099 * feat: Download links for web server by @el in #1039 * feat: Added BmpViewer activity for viewing .bmp images in file browser by @Levrk in #887 * feat: User setting for image display by @jpirnay in #1291 * feat: Show hidden directories in browser by @jpirnay in #1288 * feat: Prefer ".sleep" over "sleep" for custom image directory by @jpirnay in #948 * feat: Allow a local configuration file for custom compiles by @jpirnay in #879 * feat: Migrate binary settings to json by @jpirnay in #920 * feat: split status bar setting by @whyte-j in #733 * feat: wrapped text in GfxRender, implemented in themes so far by @iandchasse in #1141 * feat: Themed language screen by @CaptainFrito in #1020 * feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in #1107 * feat: Add maxAlloc to memory information by @jpirnay in #1152 * feat: replace picojpeg with JPEGDEC for JPEG image decoding by @martinbrook in #1136 * feat: Add git branch to version information on settings screen by @jpirnay in #1225 * feat: sort languages in selection menu by @ariel-lindemann in #1071 * feat: Latin Extended-B European glyphs by @znelson in #1157 * feat: Latin Extended-B European glyphs by @znelson in #1167 * feat: Vietnamese glyphs support by @danoooob in #1147 * feat: add Turkish translation by @barbarhan in #1192 * feat: add full Danish translation by @hajisan in #1146 * feat: Add Finnish translations by @plahteenlahti in #1133 * feat: Add Polish Language by @th0m4sek in #1155 * feat: add Dutch translation by @basvdploeg in #1204 * feat: add Belarusian translation by @dexif in #1120 * feat: Add full Italian translations by @andreaturchet in #1144 * feat: add Ukrainian translation by @mirus-ua in #1065 * feat: Add Kazakh (kk) language support by @fsocietyipa in #1377 * feat: added Romanian strings by @ariel-lindemann in #987 * feat: add Catalan strings by @angeldenom in #1049 * feat: Make directories stand out more in local file browser: "[dir]" instead of "dir" by @jpirnay in #1339 * feat: Add Polish strings for commits #1219,#1169,#1031 +tweaks by @th0m4sek in #1227 * feat: Polish translation tweaks by @th0m4sek in #1193 ### Fixes * fix: Fix img layout issue / support CSS display:none for elements and images by @jpirnay in #1443 * fix: Overlapping battery percentage on image pages with anti-aliasing by @znelson in #1452 * fix: Fix prewarm perf when a page contains many styles by @adriancaruana in #1451 * fix: use sleep routine from the original firmware by @ngxson in #1298 * fix: Prevent line breaks on common English contractions by @znelson in #1405 * fix: Build with -fno-exceptions by @znelson in #1412 * fix: Reduce flash usage by cleaning up I18n translations by @steka in #1401 * fix: jpeg resource cleanup by @jpirnay in #1320 * fix: back button in settings returns to tab bar first by @Cache8063 in #1354 * fix: Init lastSleepImage (edge case) by @jpirnay in #1360 * fix: Add special handling for apostrophe hyphenation by @jpirnay in #1318 * fix: Fix inter-word spacing rounding error in text layout by @znelson in #1311 * fix: load access fault crash by @Uri-Tauber in #1370 * fix: Fix bootloop logging crash by @jpirnay in #1357 * fix: dump crash log without usb plugged, bump release log to INFO by @ngxson in #1332 * fix: avoid zip filename overflow by @jpirnay in #1321 * fix: Hanging indent (negative text-indent) and em-unit sizing by @jpirnay in #1229 * fix: Use fixed-point fractional x-advance and kerning for better text layout by @znelson in #1168 * fix: use HTTPClient::writeToStream for downloading files from OPDS by @osteotek in #1207 * fix: make file system operations thread-safe (HalFile) by @ngxson in #1212 * fix: properly implement requestUpdateAndWait() by @ngxson in #1218 * fix: prevent infinite render loop in Calibre Wireless after file transfer by @pablohc in #1070 * fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader sync by @jpirnay in #1151 * fix: Fix coverRendered flag by @jpirnay in #1154 * fix: Handle non-ASCII characters in sanitizeFilename by @znelson in #1132 * fix: Update activity was missing "Back" button label by @znelson in #1128 * fix: force auto-hinting for Bookerly to fix inconsistent stem widths by @adriancaruana in #1098 * fix: image centering bleed by @martinbrook in #1096 * fix: double free WebDAVHandler by @ngxson in #1093 * fix: Consider extra quotation styles when hyphenating quoted words by @cbix in #1077 * fix: acquire power lock before sleeping by @ngxson in #1125 * fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach in #1138 * fix: sdfat warning about redefinition of macro by @ngxson in #1135 * fix: Close leaked file descriptors in SleepActivity and web server by @brbla in #869 * fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in #1075 * fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in #1171 * fix: Hide unusable button hints when viewing empty directory by @Levrk in #1253 * fix: broken translations in status bar settings by @ariel-lindemann in #1188 * fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in #1169 * fix: Crash (Load access fault) when indexing chapters containing characters unsupported by bold/italic font variants by @Uri-Tauber in #997 * fix: Increase PNGdec buffer size to support wide images by @osteotek in #995 * fix: Use HalPowerManager for battery percentage by @vjapolitzer in #1005 * fix: Fix dangling pointer by @Uri-Tauber in #1010 * fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk in #1017 * fix: use double FAST_REFRESH to prevent washout on large grey images by @martinbrook in #957 * fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in #1002 * fix: Strip unused CSS rules by @daveallie in #1014 * fix: continue reading card classic theme by @pablohc in #990 * fix: Destroy CSS Cache file when invalid by @daveallie in #1018 * fix: Shorten "Forget Wifi" button labels to fit on button by @lukestein in #1045 * fix: improve Spanish translations by @pablohc in #1054 * fix: Fixed book title in home screen by @DestinySpeaker in #1013 * fix: Fix hyphenation and rendering of decomposed characters by @jpirnay in #1037 * fix: Improve and add Spanish translations by @DaniPhii in #1338 * fix: improve and add Spanish translations by @DaniPhii in #1254 * fix: improve and add Swedish translations by @steka in #1317 * fix: Extend missing / amend existing German translations by @jpirnay in #1226 * fix: update french.yaml file to have a better French translation of the CFW by @Spigaw in #1130 * fix: added romanian translation to new strings by @ariel-lindemann in #1105 * fix: add missing romanian strings by @ariel-lindemann in #1187 * fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by @mirus-ua in #1149 * fix: Dutch translation prefix correction by @basvdploeg in #1223 * fix: Small typo in i18n.md regarding C++ identifiers by @victordomingos in #1210 * fix: typo in USER_GUIDE.md by @arnaugamez in #1036 * fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in #1101 ### Internal * perf: font-compression improvements by @adriancaruana in #1056 * perf: Improve font drawing performance by @jpirnay in #978 * perf: Replace std::list with std::vector in text layout by @znelson in #1038 * perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in #1194 * perf: UITheme::getMetrics const and const-ref usage by @znelson in #1094 * perf: Avoid creating strings for file extension checks by @znelson in #1303 * perf: Eliminate per-pixel overheads in image rendering by @martinbrook in #1293 * perf: Update github actions for optimal performance with pioarduino by @Jason2866 in #1080 * style: Phase 1 - Simple light dark themes by @cdmoro in #1006 * refactor: implement ActivityManager by @ngxson in #1016 * refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in #1119 * refactor: Simplify new setting introduction by @jpirnay in #1086 * refactor: Use std binary search algorithms for font lookups by @znelson in #1202 * refactor: rename MyLibrary to FileBrowser by @osteotek in #1260 * refactor: Avoid rebuilding cache path strings by @znelson in #1300 * refactor: reader utils by @Uri-Tauber in #1329 * chore: Remove miniz and modularise inflation logic by @daveallie in #1073 * chore: Resolve several build warnings by @daveallie in #1076 * chore: Removed generated language headers by @znelson in #1156 * chore: Added generated lang headers to .gitignore by @znelson in #1158 * chore: remove redundant xTaskCreate by @ngxson in #1264 * chore: Removed unused PlatformIO include directory placeholder by @znelson in #1417 * chore: micro-optimisation: early exit on fillUncompressedSizes by @jpirnay in #1322 * chore: change label while on settings tab actions by @jpirnay in #1325 * chore: add firmware size history script by @znelson in #1235 * chore: Add powershell script for clang-formatting by @jpirnay in #1472 * chore: Removed unused ConfirmationActivity member by @znelson in #1234 * chore: Update russian.yaml by @madebyKir in #1198 * chore: new Ukrainian translation lines by @mirus-ua in #1199 * chore: new Ukrainian localization strings by @mirus-ua in #1270 * chore: Polish localization for STR_DELETE by @JonaszPotoniec in #1323 * chore: Image settings Polish localization by @znelson in #1299 * chore: add missing Catalan strings by @angeldenom in #1302 * chore: add missing translations for Romanian by @ariel-lindemann in #1265 * chore: Add Portuguese (Portugal) translator to the list by @victordomingos in #1211 * chore: Reduce flash usage by cleaning up I18n translations by @steka in #1401 * docs: Add lightweight contributor onboarding documentation by @bilalix in #894 * docs: ActivityManager migration guide by @znelson in #1222 * docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in #1108 * docs: add quick KOReader sync setup guide by @wjhrdy in #1181 * docs: image support marked as completed by @ariel-lindemann in #1008 * feat: aiagent context definition by @jpirnay in #922 * chore: Update SKILL.md to reflect generated i18n files are gitignored by @znelson in #1423 * fix: ActivityManager tweaks by @znelson in #1220 * fix: Correct relative file paths in SKILL.md documentation by @pablohc in #1304 * fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in #1295 ## New Contributors * @DestinySpeaker made their first contribution in #1002 * @arnaugamez made their first contribution in #1036 * @angeldenom made their first contribution in #1049 * @cdmoro made their first contribution in #1006 * @bilalix made their first contribution in #894 * @Jessica765 made their first contribution in #682 * @brbla made their first contribution in #869 * @dexif made their first contribution in #1047 * @mirus-ua made their first contribution in #1065 * @cbix made their first contribution in #1077 * @divinitycove made their first contribution in #1108 * @pepastach made their first contribution in #1138 * @Jason2866 made their first contribution in #1080 * @andreaturchet made their first contribution in #1144 * @Spigaw made their first contribution in #1130 * @iandchasse made their first contribution in #1141 * @th0m4sek made their first contribution in #1155 * @plahteenlahti made their first contribution in #1133 * @hajisan made their first contribution in #1146 * @madebyKir made their first contribution in #1198 * @victordomingos made their first contribution in #1210 * @basvdploeg made their first contribution in #1204 * @wjhrdy made their first contribution in #1181 * @DaniPhii made their first contribution in #1254 * @steka made their first contribution in #1317 * @barbarhan made their first contribution in #1192 * @JonaszPotoniec made their first contribution in #1323 * @Cache8063 made their first contribution in #1354 * @fsocietyipa made their first contribution in #1377 * @LSTAR1900 made their first contribution in #979 * @zgredex made their first contribution in #1224 **Full Changelog**: 1.1.1...release/1.2.0 --------- Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: Dani Poveda <daniphii@outlook.com> Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com> Co-authored-by: Barış Albayrak <barisa@pop-os.lan> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com> Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu> Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru> Co-authored-by: Mirus <mirusim@gmail.com> Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com> Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com> Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl> Co-authored-by: martin brook <martin.brook100@googlemail.com>
It's been a little while since the last release, but the community has been incredibly busy. With 155 changes from 48 contributors (30 of which were new!), there was a lot to cover. Here are some of the highlights: **🔤 Kerning, Ligatures, and Font Improvements** Text rendering gets a significant upgrade with proper kerning and ligature support, fixed-point fractional x-advance for more accurate character placement, and font compression improvements that reduce flash usage. **📝 Footnotes** Footnote anchor navigation lets you select a footnote reference and jump to the footnote text, then jump back. Slim footnotes support is also available for books that use inline footnotes. **📖 EPUB Optimizer** A new integrated EPUB optimizer can clean up and reprocess books for better compatibility with the reader, directly from the device. **🔋 Battery Charging Indicator** You can now see when your device is actively charging, with a visual indicator on the battery icon. **💾 Crash Diagnostics** When something goes wrong, the firmware now dumps a crash report to the SD card — even without USB plugged in. This makes it much easier to report and diagnose issues. **🌐 New Languages** The community continues to expand language support. New in this release: Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian, Romanian, Catalan, Vietnamese, and Kazakh — along with significant improvements to existing translations. **📂 File Management** Multi-select file deletion, BMP image viewer in the file browser, hidden directory browsing, and long-click file deletion from the file browser. **⚡ Performance** Under the hood, text layout switched from `std::list` to `std::vector`, HTML entity lookups are now O(log(n)), font rendering is faster, image decode is 5-20% faster with per-pixel overhead eliminated, and multiple string allocation hot paths were eliminated. Pre-indexing of the next chapter also reduces page-turn latency at chapter boundaries. --- Along with all of the above, there are many other additions including **WebDAV support**, **auto page turn**, **QR code for current page**, **split status bar settings**, **screenshot capture**, **JSON-based settings migration**, **light/dark theme groundwork**, and a long list of stability fixes and translation improvements. * feat: Support for kerning and ligatures by @znelson in crosspoint-reader#873 * feat: footnote anchor navigation by @Uri-Tauber in crosspoint-reader#1245 * feat: slim footnotes support by @Uri-Tauber in crosspoint-reader#1031 * feat: integrated epub optimizer by @zgredex and @pablohc in crosspoint-reader#1224 * feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in crosspoint-reader#1427 * feat: dump crash report to sdcard by @ngxson in crosspoint-reader#1145 * feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity by @LSTAR1900 in crosspoint-reader#979 * feat: upgrade platform and support webdav by @dexif in crosspoint-reader#1047 * feat: Auto Page Turn for Epub Reader by @GenesiaW in crosspoint-reader#1219 * feat: enhance file deletion functionality with multi-select by @Jessica765 in crosspoint-reader#682 * feat: Long Click for File Deletion through File Browser by @Levrk in crosspoint-reader#909 * feat: Take screenshots by @el in crosspoint-reader#759 * feat: Current page as QR by @el in crosspoint-reader#1099 * feat: Download links for web server by @el in crosspoint-reader#1039 * feat: Added BmpViewer activity for viewing .bmp images in file browser by @Levrk in crosspoint-reader#887 * feat: User setting for image display by @jpirnay in crosspoint-reader#1291 * feat: Show hidden directories in browser by @jpirnay in crosspoint-reader#1288 * feat: Prefer ".sleep" over "sleep" for custom image directory by @jpirnay in crosspoint-reader#948 * feat: Allow a local configuration file for custom compiles by @jpirnay in crosspoint-reader#879 * feat: Migrate binary settings to json by @jpirnay in crosspoint-reader#920 * feat: split status bar setting by @whyte-j in crosspoint-reader#733 * feat: wrapped text in GfxRender, implemented in themes so far by @iandchasse in crosspoint-reader#1141 * feat: Themed language screen by @CaptainFrito in crosspoint-reader#1020 * feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in crosspoint-reader#1107 * feat: Add maxAlloc to memory information by @jpirnay in crosspoint-reader#1152 * feat: replace picojpeg with JPEGDEC for JPEG image decoding by @martinbrook in crosspoint-reader#1136 * feat: Add git branch to version information on settings screen by @jpirnay in crosspoint-reader#1225 * feat: sort languages in selection menu by @ariel-lindemann in crosspoint-reader#1071 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1157 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1167 * feat: Vietnamese glyphs support by @danoooob in crosspoint-reader#1147 * feat: add Turkish translation by @barbarhan in crosspoint-reader#1192 * feat: add full Danish translation by @hajisan in crosspoint-reader#1146 * feat: Add Finnish translations by @plahteenlahti in crosspoint-reader#1133 * feat: Add Polish Language by @th0m4sek in crosspoint-reader#1155 * feat: add Dutch translation by @basvdploeg in crosspoint-reader#1204 * feat: add Belarusian translation by @dexif in crosspoint-reader#1120 * feat: Add full Italian translations by @andreaturchet in crosspoint-reader#1144 * feat: add Ukrainian translation by @mirus-ua in crosspoint-reader#1065 * feat: Add Kazakh (kk) language support by @fsocietyipa in crosspoint-reader#1377 * feat: added Romanian strings by @ariel-lindemann in crosspoint-reader#987 * feat: add Catalan strings by @angeldenom in crosspoint-reader#1049 * feat: Make directories stand out more in local file browser: "[dir]" instead of "dir" by @jpirnay in crosspoint-reader#1339 * feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by @th0m4sek in crosspoint-reader#1227 * feat: Polish translation tweaks by @th0m4sek in crosspoint-reader#1193 * fix: Fix img layout issue / support CSS display:none for elements and images by @jpirnay in crosspoint-reader#1443 * fix: Overlapping battery percentage on image pages with anti-aliasing by @znelson in crosspoint-reader#1452 * fix: Fix prewarm perf when a page contains many styles by @adriancaruana in crosspoint-reader#1451 * fix: use sleep routine from the original firmware by @ngxson in crosspoint-reader#1298 * fix: Prevent line breaks on common English contractions by @znelson in crosspoint-reader#1405 * fix: Build with -fno-exceptions by @znelson in crosspoint-reader#1412 * fix: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * fix: jpeg resource cleanup by @jpirnay in crosspoint-reader#1320 * fix: back button in settings returns to tab bar first by @Cache8063 in crosspoint-reader#1354 * fix: Init lastSleepImage (edge case) by @jpirnay in crosspoint-reader#1360 * fix: Add special handling for apostrophe hyphenation by @jpirnay in crosspoint-reader#1318 * fix: Fix inter-word spacing rounding error in text layout by @znelson in crosspoint-reader#1311 * fix: load access fault crash by @Uri-Tauber in crosspoint-reader#1370 * fix: Fix bootloop logging crash by @jpirnay in crosspoint-reader#1357 * fix: dump crash log without usb plugged, bump release log to INFO by @ngxson in crosspoint-reader#1332 * fix: avoid zip filename overflow by @jpirnay in crosspoint-reader#1321 * fix: Hanging indent (negative text-indent) and em-unit sizing by @jpirnay in crosspoint-reader#1229 * fix: Use fixed-point fractional x-advance and kerning for better text layout by @znelson in crosspoint-reader#1168 * fix: use HTTPClient::writeToStream for downloading files from OPDS by @osteotek in crosspoint-reader#1207 * fix: make file system operations thread-safe (HalFile) by @ngxson in crosspoint-reader#1212 * fix: properly implement requestUpdateAndWait() by @ngxson in crosspoint-reader#1218 * fix: prevent infinite render loop in Calibre Wireless after file transfer by @pablohc in crosspoint-reader#1070 * fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader sync by @jpirnay in crosspoint-reader#1151 * fix: Fix coverRendered flag by @jpirnay in crosspoint-reader#1154 * fix: Handle non-ASCII characters in sanitizeFilename by @znelson in crosspoint-reader#1132 * fix: Update activity was missing "Back" button label by @znelson in crosspoint-reader#1128 * fix: force auto-hinting for Bookerly to fix inconsistent stem widths by @adriancaruana in crosspoint-reader#1098 * fix: image centering bleed by @martinbrook in crosspoint-reader#1096 * fix: double free WebDAVHandler by @ngxson in crosspoint-reader#1093 * fix: Consider extra quotation styles when hyphenating quoted words by @cbix in crosspoint-reader#1077 * fix: acquire power lock before sleeping by @ngxson in crosspoint-reader#1125 * fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach in crosspoint-reader#1138 * fix: sdfat warning about redefinition of macro by @ngxson in crosspoint-reader#1135 * fix: Close leaked file descriptors in SleepActivity and web server by @brbla in crosspoint-reader#869 * fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in crosspoint-reader#1075 * fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in crosspoint-reader#1171 * fix: Hide unusable button hints when viewing empty directory by @Levrk in crosspoint-reader#1253 * fix: broken translations in status bar settings by @ariel-lindemann in crosspoint-reader#1188 * fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in crosspoint-reader#1169 * fix: Crash (Load access fault) when indexing chapters containing characters unsupported by bold/italic font variants by @Uri-Tauber in crosspoint-reader#997 * fix: Increase PNGdec buffer size to support wide images by @osteotek in crosspoint-reader#995 * fix: Use HalPowerManager for battery percentage by @vjapolitzer in crosspoint-reader#1005 * fix: Fix dangling pointer by @Uri-Tauber in crosspoint-reader#1010 * fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk in crosspoint-reader#1017 * fix: use double FAST_REFRESH to prevent washout on large grey images by @martinbrook in crosspoint-reader#957 * fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in crosspoint-reader#1002 * fix: Strip unused CSS rules by @daveallie in crosspoint-reader#1014 * fix: continue reading card classic theme by @pablohc in crosspoint-reader#990 * fix: Destroy CSS Cache file when invalid by @daveallie in crosspoint-reader#1018 * fix: Shorten "Forget Wifi" button labels to fit on button by @lukestein in crosspoint-reader#1045 * fix: improve Spanish translations by @pablohc in crosspoint-reader#1054 * fix: Fixed book title in home screen by @DestinySpeaker in crosspoint-reader#1013 * fix: Fix hyphenation and rendering of decomposed characters by @jpirnay in crosspoint-reader#1037 * fix: Improve and add Spanish translations by @DaniPhii in crosspoint-reader#1338 * fix: improve and add Spanish translations by @DaniPhii in crosspoint-reader#1254 * fix: improve and add Swedish translations by @steka in crosspoint-reader#1317 * fix: Extend missing / amend existing German translations by @jpirnay in crosspoint-reader#1226 * fix: update french.yaml file to have a better French translation of the CFW by @Spigaw in crosspoint-reader#1130 * fix: added romanian translation to new strings by @ariel-lindemann in crosspoint-reader#1105 * fix: add missing romanian strings by @ariel-lindemann in crosspoint-reader#1187 * fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by @mirus-ua in crosspoint-reader#1149 * fix: Dutch translation prefix correction by @basvdploeg in crosspoint-reader#1223 * fix: Small typo in i18n.md regarding C++ identifiers by @victordomingos in crosspoint-reader#1210 * fix: typo in USER_GUIDE.md by @arnaugamez in crosspoint-reader#1036 * fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in crosspoint-reader#1101 * perf: font-compression improvements by @adriancaruana in crosspoint-reader#1056 * perf: Improve font drawing performance by @jpirnay in crosspoint-reader#978 * perf: Replace std::list with std::vector in text layout by @znelson in crosspoint-reader#1038 * perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in crosspoint-reader#1194 * perf: UITheme::getMetrics const and const-ref usage by @znelson in crosspoint-reader#1094 * perf: Avoid creating strings for file extension checks by @znelson in crosspoint-reader#1303 * perf: Eliminate per-pixel overheads in image rendering by @martinbrook in crosspoint-reader#1293 * perf: Update github actions for optimal performance with pioarduino by @Jason2866 in crosspoint-reader#1080 * style: Phase 1 - Simple light dark themes by @cdmoro in crosspoint-reader#1006 * refactor: implement ActivityManager by @ngxson in crosspoint-reader#1016 * refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in crosspoint-reader#1119 * refactor: Simplify new setting introduction by @jpirnay in crosspoint-reader#1086 * refactor: Use std binary search algorithms for font lookups by @znelson in crosspoint-reader#1202 * refactor: rename MyLibrary to FileBrowser by @osteotek in crosspoint-reader#1260 * refactor: Avoid rebuilding cache path strings by @znelson in crosspoint-reader#1300 * refactor: reader utils by @Uri-Tauber in crosspoint-reader#1329 * chore: Remove miniz and modularise inflation logic by @daveallie in crosspoint-reader#1073 * chore: Resolve several build warnings by @daveallie in crosspoint-reader#1076 * chore: Removed generated language headers by @znelson in crosspoint-reader#1156 * chore: Added generated lang headers to .gitignore by @znelson in crosspoint-reader#1158 * chore: remove redundant xTaskCreate by @ngxson in crosspoint-reader#1264 * chore: Removed unused PlatformIO include directory placeholder by @znelson in crosspoint-reader#1417 * chore: micro-optimisation: early exit on fillUncompressedSizes by @jpirnay in crosspoint-reader#1322 * chore: change label while on settings tab actions by @jpirnay in crosspoint-reader#1325 * chore: add firmware size history script by @znelson in crosspoint-reader#1235 * chore: Add powershell script for clang-formatting by @jpirnay in crosspoint-reader#1472 * chore: Removed unused ConfirmationActivity member by @znelson in crosspoint-reader#1234 * chore: Update russian.yaml by @madebyKir in crosspoint-reader#1198 * chore: new Ukrainian translation lines by @mirus-ua in crosspoint-reader#1199 * chore: new Ukrainian localization strings by @mirus-ua in crosspoint-reader#1270 * chore: Polish localization for STR_DELETE by @JonaszPotoniec in crosspoint-reader#1323 * chore: Image settings Polish localization by @znelson in crosspoint-reader#1299 * chore: add missing Catalan strings by @angeldenom in crosspoint-reader#1302 * chore: add missing translations for Romanian by @ariel-lindemann in crosspoint-reader#1265 * chore: Add Portuguese (Portugal) translator to the list by @victordomingos in crosspoint-reader#1211 * chore: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * docs: Add lightweight contributor onboarding documentation by @bilalix in crosspoint-reader#894 * docs: ActivityManager migration guide by @znelson in crosspoint-reader#1222 * docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in crosspoint-reader#1108 * docs: add quick KOReader sync setup guide by @wjhrdy in crosspoint-reader#1181 * docs: image support marked as completed by @ariel-lindemann in crosspoint-reader#1008 * feat: aiagent context definition by @jpirnay in crosspoint-reader#922 * chore: Update SKILL.md to reflect generated i18n files are gitignored by @znelson in crosspoint-reader#1423 * fix: ActivityManager tweaks by @znelson in crosspoint-reader#1220 * fix: Correct relative file paths in SKILL.md documentation by @pablohc in crosspoint-reader#1304 * fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in crosspoint-reader#1295 * @DestinySpeaker made their first contribution in crosspoint-reader#1002 * @arnaugamez made their first contribution in crosspoint-reader#1036 * @angeldenom made their first contribution in crosspoint-reader#1049 * @cdmoro made their first contribution in crosspoint-reader#1006 * @bilalix made their first contribution in crosspoint-reader#894 * @Jessica765 made their first contribution in crosspoint-reader#682 * @brbla made their first contribution in crosspoint-reader#869 * @dexif made their first contribution in crosspoint-reader#1047 * @mirus-ua made their first contribution in crosspoint-reader#1065 * @cbix made their first contribution in crosspoint-reader#1077 * @divinitycove made their first contribution in crosspoint-reader#1108 * @pepastach made their first contribution in crosspoint-reader#1138 * @Jason2866 made their first contribution in crosspoint-reader#1080 * @andreaturchet made their first contribution in crosspoint-reader#1144 * @Spigaw made their first contribution in crosspoint-reader#1130 * @iandchasse made their first contribution in crosspoint-reader#1141 * @th0m4sek made their first contribution in crosspoint-reader#1155 * @plahteenlahti made their first contribution in crosspoint-reader#1133 * @hajisan made their first contribution in crosspoint-reader#1146 * @madebyKir made their first contribution in crosspoint-reader#1198 * @victordomingos made their first contribution in crosspoint-reader#1210 * @basvdploeg made their first contribution in crosspoint-reader#1204 * @wjhrdy made their first contribution in crosspoint-reader#1181 * @DaniPhii made their first contribution in crosspoint-reader#1254 * @steka made their first contribution in crosspoint-reader#1317 * @barbarhan made their first contribution in crosspoint-reader#1192 * @JonaszPotoniec made their first contribution in crosspoint-reader#1323 * @Cache8063 made their first contribution in crosspoint-reader#1354 * @fsocietyipa made their first contribution in crosspoint-reader#1377 * @LSTAR1900 made their first contribution in crosspoint-reader#979 * @zgredex made their first contribution in crosspoint-reader#1224 **Full Changelog**: crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0 --------- Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: Dani Poveda <daniphii@outlook.com> Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com> Co-authored-by: Barış Albayrak <barisa@pop-os.lan> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com> Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu> Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru> Co-authored-by: Mirus <mirusim@gmail.com> Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com> Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com> Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl> Co-authored-by: martin brook <martin.brook100@googlemail.com>
## Summary It's been a little while since the last release, but the community has been incredibly busy. With 155 changes from 48 contributors (30 of which were new!), there was a lot to cover. Here are some of the highlights: **🔤 Kerning, Ligatures, and Font Improvements** Text rendering gets a significant upgrade with proper kerning and ligature support, fixed-point fractional x-advance for more accurate character placement, and font compression improvements that reduce flash usage. **📝 Footnotes** Footnote anchor navigation lets you select a footnote reference and jump to the footnote text, then jump back. Slim footnotes support is also available for books that use inline footnotes. **📖 EPUB Optimizer** A new integrated EPUB optimizer can clean up and reprocess books for better compatibility with the reader, directly from the device. **🔋 Battery Charging Indicator** You can now see when your device is actively charging, with a visual indicator on the battery icon. **💾 Crash Diagnostics** When something goes wrong, the firmware now dumps a crash report to the SD card — even without USB plugged in. This makes it much easier to report and diagnose issues. **🌐 New Languages** The community continues to expand language support. New in this release: Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian, Romanian, Catalan, Vietnamese, and Kazakh — along with significant improvements to existing translations. **📂 File Management** Multi-select file deletion, BMP image viewer in the file browser, hidden directory browsing, and long-click file deletion from the file browser. **⚡ Performance** Under the hood, text layout switched from `std::list` to `std::vector`, HTML entity lookups are now O(log(n)), font rendering is faster, image decode is 5-20% faster with per-pixel overhead eliminated, and multiple string allocation hot paths were eliminated. Pre-indexing of the next chapter also reduces page-turn latency at chapter boundaries. --- Along with all of the above, there are many other additions including **WebDAV support**, **auto page turn**, **QR code for current page**, **split status bar settings**, **screenshot capture**, **JSON-based settings migration**, **light/dark theme groundwork**, and a long list of stability fixes and translation improvements. ## What's Changed ### Features * feat: Support for kerning and ligatures by @znelson in crosspoint-reader#873 * feat: footnote anchor navigation by @Uri-Tauber in crosspoint-reader#1245 * feat: slim footnotes support by @Uri-Tauber in crosspoint-reader#1031 * feat: integrated epub optimizer by @zgredex and @pablohc in crosspoint-reader#1224 * feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in crosspoint-reader#1427 * feat: dump crash report to sdcard by @ngxson in crosspoint-reader#1145 * feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity by @LSTAR1900 in crosspoint-reader#979 * feat: upgrade platform and support webdav by @dexif in crosspoint-reader#1047 * feat: Auto Page Turn for Epub Reader by @GenesiaW in crosspoint-reader#1219 * feat: enhance file deletion functionality with multi-select by @Jessica765 in crosspoint-reader#682 * feat: Long Click for File Deletion through File Browser by @Levrk in crosspoint-reader#909 * feat: Take screenshots by @el in crosspoint-reader#759 * feat: Current page as QR by @el in crosspoint-reader#1099 * feat: Download links for web server by @el in crosspoint-reader#1039 * feat: Added BmpViewer activity for viewing .bmp images in file browser by @Levrk in crosspoint-reader#887 * feat: User setting for image display by @jpirnay in crosspoint-reader#1291 * feat: Show hidden directories in browser by @jpirnay in crosspoint-reader#1288 * feat: Prefer ".sleep" over "sleep" for custom image directory by @jpirnay in crosspoint-reader#948 * feat: Allow a local configuration file for custom compiles by @jpirnay in crosspoint-reader#879 * feat: Migrate binary settings to json by @jpirnay in crosspoint-reader#920 * feat: split status bar setting by @whyte-j in crosspoint-reader#733 * feat: wrapped text in GfxRender, implemented in themes so far by @iandchasse in crosspoint-reader#1141 * feat: Themed language screen by @CaptainFrito in crosspoint-reader#1020 * feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in crosspoint-reader#1107 * feat: Add maxAlloc to memory information by @jpirnay in crosspoint-reader#1152 * feat: replace picojpeg with JPEGDEC for JPEG image decoding by @martinbrook in crosspoint-reader#1136 * feat: Add git branch to version information on settings screen by @jpirnay in crosspoint-reader#1225 * feat: sort languages in selection menu by @ariel-lindemann in crosspoint-reader#1071 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1157 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1167 * feat: Vietnamese glyphs support by @danoooob in crosspoint-reader#1147 * feat: add Turkish translation by @barbarhan in crosspoint-reader#1192 * feat: add full Danish translation by @hajisan in crosspoint-reader#1146 * feat: Add Finnish translations by @plahteenlahti in crosspoint-reader#1133 * feat: Add Polish Language by @th0m4sek in crosspoint-reader#1155 * feat: add Dutch translation by @basvdploeg in crosspoint-reader#1204 * feat: add Belarusian translation by @dexif in crosspoint-reader#1120 * feat: Add full Italian translations by @andreaturchet in crosspoint-reader#1144 * feat: add Ukrainian translation by @mirus-ua in crosspoint-reader#1065 * feat: Add Kazakh (kk) language support by @fsocietyipa in crosspoint-reader#1377 * feat: added Romanian strings by @ariel-lindemann in crosspoint-reader#987 * feat: add Catalan strings by @angeldenom in crosspoint-reader#1049 * feat: Make directories stand out more in local file browser: "[dir]" instead of "dir" by @jpirnay in crosspoint-reader#1339 * feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by @th0m4sek in crosspoint-reader#1227 * feat: Polish translation tweaks by @th0m4sek in crosspoint-reader#1193 ### Fixes * fix: Fix img layout issue / support CSS display:none for elements and images by @jpirnay in crosspoint-reader#1443 * fix: Overlapping battery percentage on image pages with anti-aliasing by @znelson in crosspoint-reader#1452 * fix: Fix prewarm perf when a page contains many styles by @adriancaruana in crosspoint-reader#1451 * fix: use sleep routine from the original firmware by @ngxson in crosspoint-reader#1298 * fix: Prevent line breaks on common English contractions by @znelson in crosspoint-reader#1405 * fix: Build with -fno-exceptions by @znelson in crosspoint-reader#1412 * fix: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * fix: jpeg resource cleanup by @jpirnay in crosspoint-reader#1320 * fix: back button in settings returns to tab bar first by @Cache8063 in crosspoint-reader#1354 * fix: Init lastSleepImage (edge case) by @jpirnay in crosspoint-reader#1360 * fix: Add special handling for apostrophe hyphenation by @jpirnay in crosspoint-reader#1318 * fix: Fix inter-word spacing rounding error in text layout by @znelson in crosspoint-reader#1311 * fix: load access fault crash by @Uri-Tauber in crosspoint-reader#1370 * fix: Fix bootloop logging crash by @jpirnay in crosspoint-reader#1357 * fix: dump crash log without usb plugged, bump release log to INFO by @ngxson in crosspoint-reader#1332 * fix: avoid zip filename overflow by @jpirnay in crosspoint-reader#1321 * fix: Hanging indent (negative text-indent) and em-unit sizing by @jpirnay in crosspoint-reader#1229 * fix: Use fixed-point fractional x-advance and kerning for better text layout by @znelson in crosspoint-reader#1168 * fix: use HTTPClient::writeToStream for downloading files from OPDS by @osteotek in crosspoint-reader#1207 * fix: make file system operations thread-safe (HalFile) by @ngxson in crosspoint-reader#1212 * fix: properly implement requestUpdateAndWait() by @ngxson in crosspoint-reader#1218 * fix: prevent infinite render loop in Calibre Wireless after file transfer by @pablohc in crosspoint-reader#1070 * fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader sync by @jpirnay in crosspoint-reader#1151 * fix: Fix coverRendered flag by @jpirnay in crosspoint-reader#1154 * fix: Handle non-ASCII characters in sanitizeFilename by @znelson in crosspoint-reader#1132 * fix: Update activity was missing "Back" button label by @znelson in crosspoint-reader#1128 * fix: force auto-hinting for Bookerly to fix inconsistent stem widths by @adriancaruana in crosspoint-reader#1098 * fix: image centering bleed by @martinbrook in crosspoint-reader#1096 * fix: double free WebDAVHandler by @ngxson in crosspoint-reader#1093 * fix: Consider extra quotation styles when hyphenating quoted words by @cbix in crosspoint-reader#1077 * fix: acquire power lock before sleeping by @ngxson in crosspoint-reader#1125 * fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach in crosspoint-reader#1138 * fix: sdfat warning about redefinition of macro by @ngxson in crosspoint-reader#1135 * fix: Close leaked file descriptors in SleepActivity and web server by @brbla in crosspoint-reader#869 * fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in crosspoint-reader#1075 * fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in crosspoint-reader#1171 * fix: Hide unusable button hints when viewing empty directory by @Levrk in crosspoint-reader#1253 * fix: broken translations in status bar settings by @ariel-lindemann in crosspoint-reader#1188 * fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in crosspoint-reader#1169 * fix: Crash (Load access fault) when indexing chapters containing characters unsupported by bold/italic font variants by @Uri-Tauber in crosspoint-reader#997 * fix: Increase PNGdec buffer size to support wide images by @osteotek in crosspoint-reader#995 * fix: Use HalPowerManager for battery percentage by @vjapolitzer in crosspoint-reader#1005 * fix: Fix dangling pointer by @Uri-Tauber in crosspoint-reader#1010 * fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk in crosspoint-reader#1017 * fix: use double FAST_REFRESH to prevent washout on large grey images by @martinbrook in crosspoint-reader#957 * fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in crosspoint-reader#1002 * fix: Strip unused CSS rules by @daveallie in crosspoint-reader#1014 * fix: continue reading card classic theme by @pablohc in crosspoint-reader#990 * fix: Destroy CSS Cache file when invalid by @daveallie in crosspoint-reader#1018 * fix: Shorten "Forget Wifi" button labels to fit on button by @lukestein in crosspoint-reader#1045 * fix: improve Spanish translations by @pablohc in crosspoint-reader#1054 * fix: Fixed book title in home screen by @DestinySpeaker in crosspoint-reader#1013 * fix: Fix hyphenation and rendering of decomposed characters by @jpirnay in crosspoint-reader#1037 * fix: Improve and add Spanish translations by @DaniPhii in crosspoint-reader#1338 * fix: improve and add Spanish translations by @DaniPhii in crosspoint-reader#1254 * fix: improve and add Swedish translations by @steka in crosspoint-reader#1317 * fix: Extend missing / amend existing German translations by @jpirnay in crosspoint-reader#1226 * fix: update french.yaml file to have a better French translation of the CFW by @Spigaw in crosspoint-reader#1130 * fix: added romanian translation to new strings by @ariel-lindemann in crosspoint-reader#1105 * fix: add missing romanian strings by @ariel-lindemann in crosspoint-reader#1187 * fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by @mirus-ua in crosspoint-reader#1149 * fix: Dutch translation prefix correction by @basvdploeg in crosspoint-reader#1223 * fix: Small typo in i18n.md regarding C++ identifiers by @victordomingos in crosspoint-reader#1210 * fix: typo in USER_GUIDE.md by @arnaugamez in crosspoint-reader#1036 * fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in crosspoint-reader#1101 ### Internal * perf: font-compression improvements by @adriancaruana in crosspoint-reader#1056 * perf: Improve font drawing performance by @jpirnay in crosspoint-reader#978 * perf: Replace std::list with std::vector in text layout by @znelson in crosspoint-reader#1038 * perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in crosspoint-reader#1194 * perf: UITheme::getMetrics const and const-ref usage by @znelson in crosspoint-reader#1094 * perf: Avoid creating strings for file extension checks by @znelson in crosspoint-reader#1303 * perf: Eliminate per-pixel overheads in image rendering by @martinbrook in crosspoint-reader#1293 * perf: Update github actions for optimal performance with pioarduino by @Jason2866 in crosspoint-reader#1080 * style: Phase 1 - Simple light dark themes by @cdmoro in crosspoint-reader#1006 * refactor: implement ActivityManager by @ngxson in crosspoint-reader#1016 * refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in crosspoint-reader#1119 * refactor: Simplify new setting introduction by @jpirnay in crosspoint-reader#1086 * refactor: Use std binary search algorithms for font lookups by @znelson in crosspoint-reader#1202 * refactor: rename MyLibrary to FileBrowser by @osteotek in crosspoint-reader#1260 * refactor: Avoid rebuilding cache path strings by @znelson in crosspoint-reader#1300 * refactor: reader utils by @Uri-Tauber in crosspoint-reader#1329 * chore: Remove miniz and modularise inflation logic by @daveallie in crosspoint-reader#1073 * chore: Resolve several build warnings by @daveallie in crosspoint-reader#1076 * chore: Removed generated language headers by @znelson in crosspoint-reader#1156 * chore: Added generated lang headers to .gitignore by @znelson in crosspoint-reader#1158 * chore: remove redundant xTaskCreate by @ngxson in crosspoint-reader#1264 * chore: Removed unused PlatformIO include directory placeholder by @znelson in crosspoint-reader#1417 * chore: micro-optimisation: early exit on fillUncompressedSizes by @jpirnay in crosspoint-reader#1322 * chore: change label while on settings tab actions by @jpirnay in crosspoint-reader#1325 * chore: add firmware size history script by @znelson in crosspoint-reader#1235 * chore: Add powershell script for clang-formatting by @jpirnay in crosspoint-reader#1472 * chore: Removed unused ConfirmationActivity member by @znelson in crosspoint-reader#1234 * chore: Update russian.yaml by @madebyKir in crosspoint-reader#1198 * chore: new Ukrainian translation lines by @mirus-ua in crosspoint-reader#1199 * chore: new Ukrainian localization strings by @mirus-ua in crosspoint-reader#1270 * chore: Polish localization for STR_DELETE by @JonaszPotoniec in crosspoint-reader#1323 * chore: Image settings Polish localization by @znelson in crosspoint-reader#1299 * chore: add missing Catalan strings by @angeldenom in crosspoint-reader#1302 * chore: add missing translations for Romanian by @ariel-lindemann in crosspoint-reader#1265 * chore: Add Portuguese (Portugal) translator to the list by @victordomingos in crosspoint-reader#1211 * chore: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * docs: Add lightweight contributor onboarding documentation by @bilalix in crosspoint-reader#894 * docs: ActivityManager migration guide by @znelson in crosspoint-reader#1222 * docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in crosspoint-reader#1108 * docs: add quick KOReader sync setup guide by @wjhrdy in crosspoint-reader#1181 * docs: image support marked as completed by @ariel-lindemann in crosspoint-reader#1008 * feat: aiagent context definition by @jpirnay in crosspoint-reader#922 * chore: Update SKILL.md to reflect generated i18n files are gitignored by @znelson in crosspoint-reader#1423 * fix: ActivityManager tweaks by @znelson in crosspoint-reader#1220 * fix: Correct relative file paths in SKILL.md documentation by @pablohc in crosspoint-reader#1304 * fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in crosspoint-reader#1295 ## New Contributors * @DestinySpeaker made their first contribution in crosspoint-reader#1002 * @arnaugamez made their first contribution in crosspoint-reader#1036 * @angeldenom made their first contribution in crosspoint-reader#1049 * @cdmoro made their first contribution in crosspoint-reader#1006 * @bilalix made their first contribution in crosspoint-reader#894 * @Jessica765 made their first contribution in crosspoint-reader#682 * @brbla made their first contribution in crosspoint-reader#869 * @dexif made their first contribution in crosspoint-reader#1047 * @mirus-ua made their first contribution in crosspoint-reader#1065 * @cbix made their first contribution in crosspoint-reader#1077 * @divinitycove made their first contribution in crosspoint-reader#1108 * @pepastach made their first contribution in crosspoint-reader#1138 * @Jason2866 made their first contribution in crosspoint-reader#1080 * @andreaturchet made their first contribution in crosspoint-reader#1144 * @Spigaw made their first contribution in crosspoint-reader#1130 * @iandchasse made their first contribution in crosspoint-reader#1141 * @th0m4sek made their first contribution in crosspoint-reader#1155 * @plahteenlahti made their first contribution in crosspoint-reader#1133 * @hajisan made their first contribution in crosspoint-reader#1146 * @madebyKir made their first contribution in crosspoint-reader#1198 * @victordomingos made their first contribution in crosspoint-reader#1210 * @basvdploeg made their first contribution in crosspoint-reader#1204 * @wjhrdy made their first contribution in crosspoint-reader#1181 * @DaniPhii made their first contribution in crosspoint-reader#1254 * @steka made their first contribution in crosspoint-reader#1317 * @barbarhan made their first contribution in crosspoint-reader#1192 * @JonaszPotoniec made their first contribution in crosspoint-reader#1323 * @Cache8063 made their first contribution in crosspoint-reader#1354 * @fsocietyipa made their first contribution in crosspoint-reader#1377 * @LSTAR1900 made their first contribution in crosspoint-reader#979 * @zgredex made their first contribution in crosspoint-reader#1224 **Full Changelog**: crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0 --------- Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: Dani Poveda <daniphii@outlook.com> Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com> Co-authored-by: Barış Albayrak <barisa@pop-os.lan> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com> Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu> Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru> Co-authored-by: Mirus <mirusim@gmail.com> Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com> Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com> Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl> Co-authored-by: martin brook <martin.brook100@googlemail.com>
## Summary It's been a little while since the last release, but the community has been incredibly busy. With 155 changes from 48 contributors (30 of which were new!), there was a lot to cover. Here are some of the highlights: **🔤 Kerning, Ligatures, and Font Improvements** Text rendering gets a significant upgrade with proper kerning and ligature support, fixed-point fractional x-advance for more accurate character placement, and font compression improvements that reduce flash usage. **📝 Footnotes** Footnote anchor navigation lets you select a footnote reference and jump to the footnote text, then jump back. Slim footnotes support is also available for books that use inline footnotes. **📖 EPUB Optimizer** A new integrated EPUB optimizer can clean up and reprocess books for better compatibility with the reader, directly from the device. **🔋 Battery Charging Indicator** You can now see when your device is actively charging, with a visual indicator on the battery icon. **💾 Crash Diagnostics** When something goes wrong, the firmware now dumps a crash report to the SD card — even without USB plugged in. This makes it much easier to report and diagnose issues. **🌐 New Languages** The community continues to expand language support. New in this release: Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian, Romanian, Catalan, Vietnamese, and Kazakh — along with significant improvements to existing translations. **📂 File Management** Multi-select file deletion, BMP image viewer in the file browser, hidden directory browsing, and long-click file deletion from the file browser. **⚡ Performance** Under the hood, text layout switched from `std::list` to `std::vector`, HTML entity lookups are now O(log(n)), font rendering is faster, image decode is 5-20% faster with per-pixel overhead eliminated, and multiple string allocation hot paths were eliminated. Pre-indexing of the next chapter also reduces page-turn latency at chapter boundaries. --- Along with all of the above, there are many other additions including **WebDAV support**, **auto page turn**, **QR code for current page**, **split status bar settings**, **screenshot capture**, **JSON-based settings migration**, **light/dark theme groundwork**, and a long list of stability fixes and translation improvements. ## What's Changed ### Features * feat: Support for kerning and ligatures by @znelson in crosspoint-reader#873 * feat: footnote anchor navigation by @Uri-Tauber in crosspoint-reader#1245 * feat: slim footnotes support by @Uri-Tauber in crosspoint-reader#1031 * feat: integrated epub optimizer by @zgredex and @pablohc in crosspoint-reader#1224 * feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in crosspoint-reader#1427 * feat: dump crash report to sdcard by @ngxson in crosspoint-reader#1145 * feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity by @LSTAR1900 in crosspoint-reader#979 * feat: upgrade platform and support webdav by @dexif in crosspoint-reader#1047 * feat: Auto Page Turn for Epub Reader by @GenesiaW in crosspoint-reader#1219 * feat: enhance file deletion functionality with multi-select by @Jessica765 in crosspoint-reader#682 * feat: Long Click for File Deletion through File Browser by @Levrk in crosspoint-reader#909 * feat: Take screenshots by @el in crosspoint-reader#759 * feat: Current page as QR by @el in crosspoint-reader#1099 * feat: Download links for web server by @el in crosspoint-reader#1039 * feat: Added BmpViewer activity for viewing .bmp images in file browser by @Levrk in crosspoint-reader#887 * feat: User setting for image display by @jpirnay in crosspoint-reader#1291 * feat: Show hidden directories in browser by @jpirnay in crosspoint-reader#1288 * feat: Prefer ".sleep" over "sleep" for custom image directory by @jpirnay in crosspoint-reader#948 * feat: Allow a local configuration file for custom compiles by @jpirnay in crosspoint-reader#879 * feat: Migrate binary settings to json by @jpirnay in crosspoint-reader#920 * feat: split status bar setting by @whyte-j in crosspoint-reader#733 * feat: wrapped text in GfxRender, implemented in themes so far by @iandchasse in crosspoint-reader#1141 * feat: Themed language screen by @CaptainFrito in crosspoint-reader#1020 * feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in crosspoint-reader#1107 * feat: Add maxAlloc to memory information by @jpirnay in crosspoint-reader#1152 * feat: replace picojpeg with JPEGDEC for JPEG image decoding by @martinbrook in crosspoint-reader#1136 * feat: Add git branch to version information on settings screen by @jpirnay in crosspoint-reader#1225 * feat: sort languages in selection menu by @ariel-lindemann in crosspoint-reader#1071 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1157 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1167 * feat: Vietnamese glyphs support by @danoooob in crosspoint-reader#1147 * feat: add Turkish translation by @barbarhan in crosspoint-reader#1192 * feat: add full Danish translation by @hajisan in crosspoint-reader#1146 * feat: Add Finnish translations by @plahteenlahti in crosspoint-reader#1133 * feat: Add Polish Language by @th0m4sek in crosspoint-reader#1155 * feat: add Dutch translation by @basvdploeg in crosspoint-reader#1204 * feat: add Belarusian translation by @dexif in crosspoint-reader#1120 * feat: Add full Italian translations by @andreaturchet in crosspoint-reader#1144 * feat: add Ukrainian translation by @mirus-ua in crosspoint-reader#1065 * feat: Add Kazakh (kk) language support by @fsocietyipa in crosspoint-reader#1377 * feat: added Romanian strings by @ariel-lindemann in crosspoint-reader#987 * feat: add Catalan strings by @angeldenom in crosspoint-reader#1049 * feat: Make directories stand out more in local file browser: "[dir]" instead of "dir" by @jpirnay in crosspoint-reader#1339 * feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by @th0m4sek in crosspoint-reader#1227 * feat: Polish translation tweaks by @th0m4sek in crosspoint-reader#1193 ### Fixes * fix: Fix img layout issue / support CSS display:none for elements and images by @jpirnay in crosspoint-reader#1443 * fix: Overlapping battery percentage on image pages with anti-aliasing by @znelson in crosspoint-reader#1452 * fix: Fix prewarm perf when a page contains many styles by @adriancaruana in crosspoint-reader#1451 * fix: use sleep routine from the original firmware by @ngxson in crosspoint-reader#1298 * fix: Prevent line breaks on common English contractions by @znelson in crosspoint-reader#1405 * fix: Build with -fno-exceptions by @znelson in crosspoint-reader#1412 * fix: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * fix: jpeg resource cleanup by @jpirnay in crosspoint-reader#1320 * fix: back button in settings returns to tab bar first by @Cache8063 in crosspoint-reader#1354 * fix: Init lastSleepImage (edge case) by @jpirnay in crosspoint-reader#1360 * fix: Add special handling for apostrophe hyphenation by @jpirnay in crosspoint-reader#1318 * fix: Fix inter-word spacing rounding error in text layout by @znelson in crosspoint-reader#1311 * fix: load access fault crash by @Uri-Tauber in crosspoint-reader#1370 * fix: Fix bootloop logging crash by @jpirnay in crosspoint-reader#1357 * fix: dump crash log without usb plugged, bump release log to INFO by @ngxson in crosspoint-reader#1332 * fix: avoid zip filename overflow by @jpirnay in crosspoint-reader#1321 * fix: Hanging indent (negative text-indent) and em-unit sizing by @jpirnay in crosspoint-reader#1229 * fix: Use fixed-point fractional x-advance and kerning for better text layout by @znelson in crosspoint-reader#1168 * fix: use HTTPClient::writeToStream for downloading files from OPDS by @osteotek in crosspoint-reader#1207 * fix: make file system operations thread-safe (HalFile) by @ngxson in crosspoint-reader#1212 * fix: properly implement requestUpdateAndWait() by @ngxson in crosspoint-reader#1218 * fix: prevent infinite render loop in Calibre Wireless after file transfer by @pablohc in crosspoint-reader#1070 * fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader sync by @jpirnay in crosspoint-reader#1151 * fix: Fix coverRendered flag by @jpirnay in crosspoint-reader#1154 * fix: Handle non-ASCII characters in sanitizeFilename by @znelson in crosspoint-reader#1132 * fix: Update activity was missing "Back" button label by @znelson in crosspoint-reader#1128 * fix: force auto-hinting for Bookerly to fix inconsistent stem widths by @adriancaruana in crosspoint-reader#1098 * fix: image centering bleed by @martinbrook in crosspoint-reader#1096 * fix: double free WebDAVHandler by @ngxson in crosspoint-reader#1093 * fix: Consider extra quotation styles when hyphenating quoted words by @cbix in crosspoint-reader#1077 * fix: acquire power lock before sleeping by @ngxson in crosspoint-reader#1125 * fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach in crosspoint-reader#1138 * fix: sdfat warning about redefinition of macro by @ngxson in crosspoint-reader#1135 * fix: Close leaked file descriptors in SleepActivity and web server by @brbla in crosspoint-reader#869 * fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in crosspoint-reader#1075 * fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in crosspoint-reader#1171 * fix: Hide unusable button hints when viewing empty directory by @Levrk in crosspoint-reader#1253 * fix: broken translations in status bar settings by @ariel-lindemann in crosspoint-reader#1188 * fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in crosspoint-reader#1169 * fix: Crash (Load access fault) when indexing chapters containing characters unsupported by bold/italic font variants by @Uri-Tauber in crosspoint-reader#997 * fix: Increase PNGdec buffer size to support wide images by @osteotek in crosspoint-reader#995 * fix: Use HalPowerManager for battery percentage by @vjapolitzer in crosspoint-reader#1005 * fix: Fix dangling pointer by @Uri-Tauber in crosspoint-reader#1010 * fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk in crosspoint-reader#1017 * fix: use double FAST_REFRESH to prevent washout on large grey images by @martinbrook in crosspoint-reader#957 * fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in crosspoint-reader#1002 * fix: Strip unused CSS rules by @daveallie in crosspoint-reader#1014 * fix: continue reading card classic theme by @pablohc in crosspoint-reader#990 * fix: Destroy CSS Cache file when invalid by @daveallie in crosspoint-reader#1018 * fix: Shorten "Forget Wifi" button labels to fit on button by @lukestein in crosspoint-reader#1045 * fix: improve Spanish translations by @pablohc in crosspoint-reader#1054 * fix: Fixed book title in home screen by @DestinySpeaker in crosspoint-reader#1013 * fix: Fix hyphenation and rendering of decomposed characters by @jpirnay in crosspoint-reader#1037 * fix: Improve and add Spanish translations by @DaniPhii in crosspoint-reader#1338 * fix: improve and add Spanish translations by @DaniPhii in crosspoint-reader#1254 * fix: improve and add Swedish translations by @steka in crosspoint-reader#1317 * fix: Extend missing / amend existing German translations by @jpirnay in crosspoint-reader#1226 * fix: update french.yaml file to have a better French translation of the CFW by @Spigaw in crosspoint-reader#1130 * fix: added romanian translation to new strings by @ariel-lindemann in crosspoint-reader#1105 * fix: add missing romanian strings by @ariel-lindemann in crosspoint-reader#1187 * fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by @mirus-ua in crosspoint-reader#1149 * fix: Dutch translation prefix correction by @basvdploeg in crosspoint-reader#1223 * fix: Small typo in i18n.md regarding C++ identifiers by @victordomingos in crosspoint-reader#1210 * fix: typo in USER_GUIDE.md by @arnaugamez in crosspoint-reader#1036 * fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in crosspoint-reader#1101 ### Internal * perf: font-compression improvements by @adriancaruana in crosspoint-reader#1056 * perf: Improve font drawing performance by @jpirnay in crosspoint-reader#978 * perf: Replace std::list with std::vector in text layout by @znelson in crosspoint-reader#1038 * perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in crosspoint-reader#1194 * perf: UITheme::getMetrics const and const-ref usage by @znelson in crosspoint-reader#1094 * perf: Avoid creating strings for file extension checks by @znelson in crosspoint-reader#1303 * perf: Eliminate per-pixel overheads in image rendering by @martinbrook in crosspoint-reader#1293 * perf: Update github actions for optimal performance with pioarduino by @Jason2866 in crosspoint-reader#1080 * style: Phase 1 - Simple light dark themes by @cdmoro in crosspoint-reader#1006 * refactor: implement ActivityManager by @ngxson in crosspoint-reader#1016 * refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in crosspoint-reader#1119 * refactor: Simplify new setting introduction by @jpirnay in crosspoint-reader#1086 * refactor: Use std binary search algorithms for font lookups by @znelson in crosspoint-reader#1202 * refactor: rename MyLibrary to FileBrowser by @osteotek in crosspoint-reader#1260 * refactor: Avoid rebuilding cache path strings by @znelson in crosspoint-reader#1300 * refactor: reader utils by @Uri-Tauber in crosspoint-reader#1329 * chore: Remove miniz and modularise inflation logic by @daveallie in crosspoint-reader#1073 * chore: Resolve several build warnings by @daveallie in crosspoint-reader#1076 * chore: Removed generated language headers by @znelson in crosspoint-reader#1156 * chore: Added generated lang headers to .gitignore by @znelson in crosspoint-reader#1158 * chore: remove redundant xTaskCreate by @ngxson in crosspoint-reader#1264 * chore: Removed unused PlatformIO include directory placeholder by @znelson in crosspoint-reader#1417 * chore: micro-optimisation: early exit on fillUncompressedSizes by @jpirnay in crosspoint-reader#1322 * chore: change label while on settings tab actions by @jpirnay in crosspoint-reader#1325 * chore: add firmware size history script by @znelson in crosspoint-reader#1235 * chore: Add powershell script for clang-formatting by @jpirnay in crosspoint-reader#1472 * chore: Removed unused ConfirmationActivity member by @znelson in crosspoint-reader#1234 * chore: Update russian.yaml by @madebyKir in crosspoint-reader#1198 * chore: new Ukrainian translation lines by @mirus-ua in crosspoint-reader#1199 * chore: new Ukrainian localization strings by @mirus-ua in crosspoint-reader#1270 * chore: Polish localization for STR_DELETE by @JonaszPotoniec in crosspoint-reader#1323 * chore: Image settings Polish localization by @znelson in crosspoint-reader#1299 * chore: add missing Catalan strings by @angeldenom in crosspoint-reader#1302 * chore: add missing translations for Romanian by @ariel-lindemann in crosspoint-reader#1265 * chore: Add Portuguese (Portugal) translator to the list by @victordomingos in crosspoint-reader#1211 * chore: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * docs: Add lightweight contributor onboarding documentation by @bilalix in crosspoint-reader#894 * docs: ActivityManager migration guide by @znelson in crosspoint-reader#1222 * docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in crosspoint-reader#1108 * docs: add quick KOReader sync setup guide by @wjhrdy in crosspoint-reader#1181 * docs: image support marked as completed by @ariel-lindemann in crosspoint-reader#1008 * feat: aiagent context definition by @jpirnay in crosspoint-reader#922 * chore: Update SKILL.md to reflect generated i18n files are gitignored by @znelson in crosspoint-reader#1423 * fix: ActivityManager tweaks by @znelson in crosspoint-reader#1220 * fix: Correct relative file paths in SKILL.md documentation by @pablohc in crosspoint-reader#1304 * fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in crosspoint-reader#1295 ## New Contributors * @DestinySpeaker made their first contribution in crosspoint-reader#1002 * @arnaugamez made their first contribution in crosspoint-reader#1036 * @angeldenom made their first contribution in crosspoint-reader#1049 * @cdmoro made their first contribution in crosspoint-reader#1006 * @bilalix made their first contribution in crosspoint-reader#894 * @Jessica765 made their first contribution in crosspoint-reader#682 * @brbla made their first contribution in crosspoint-reader#869 * @dexif made their first contribution in crosspoint-reader#1047 * @mirus-ua made their first contribution in crosspoint-reader#1065 * @cbix made their first contribution in crosspoint-reader#1077 * @divinitycove made their first contribution in crosspoint-reader#1108 * @pepastach made their first contribution in crosspoint-reader#1138 * @Jason2866 made their first contribution in crosspoint-reader#1080 * @andreaturchet made their first contribution in crosspoint-reader#1144 * @Spigaw made their first contribution in crosspoint-reader#1130 * @iandchasse made their first contribution in crosspoint-reader#1141 * @th0m4sek made their first contribution in crosspoint-reader#1155 * @plahteenlahti made their first contribution in crosspoint-reader#1133 * @hajisan made their first contribution in crosspoint-reader#1146 * @madebyKir made their first contribution in crosspoint-reader#1198 * @victordomingos made their first contribution in crosspoint-reader#1210 * @basvdploeg made their first contribution in crosspoint-reader#1204 * @wjhrdy made their first contribution in crosspoint-reader#1181 * @DaniPhii made their first contribution in crosspoint-reader#1254 * @steka made their first contribution in crosspoint-reader#1317 * @barbarhan made their first contribution in crosspoint-reader#1192 * @JonaszPotoniec made their first contribution in crosspoint-reader#1323 * @Cache8063 made their first contribution in crosspoint-reader#1354 * @fsocietyipa made their first contribution in crosspoint-reader#1377 * @LSTAR1900 made their first contribution in crosspoint-reader#979 * @zgredex made their first contribution in crosspoint-reader#1224 **Full Changelog**: crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0 --------- Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: Dani Poveda <daniphii@outlook.com> Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com> Co-authored-by: Barış Albayrak <barisa@pop-os.lan> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com> Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu> Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru> Co-authored-by: Mirus <mirusim@gmail.com> Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com> Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com> Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl> Co-authored-by: martin brook <martin.brook100@googlemail.com>
## Summary It's been a little while since the last release, but the community has been incredibly busy. With 155 changes from 48 contributors (30 of which were new!), there was a lot to cover. Here are some of the highlights: **🔤 Kerning, Ligatures, and Font Improvements** Text rendering gets a significant upgrade with proper kerning and ligature support, fixed-point fractional x-advance for more accurate character placement, and font compression improvements that reduce flash usage. **📝 Footnotes** Footnote anchor navigation lets you select a footnote reference and jump to the footnote text, then jump back. Slim footnotes support is also available for books that use inline footnotes. **📖 EPUB Optimizer** A new integrated EPUB optimizer can clean up and reprocess books for better compatibility with the reader, directly from the device. **🔋 Battery Charging Indicator** You can now see when your device is actively charging, with a visual indicator on the battery icon. **💾 Crash Diagnostics** When something goes wrong, the firmware now dumps a crash report to the SD card — even without USB plugged in. This makes it much easier to report and diagnose issues. **🌐 New Languages** The community continues to expand language support. New in this release: Turkish, Danish, Finnish, Polish, Dutch, Belarusian, Italian, Ukrainian, Romanian, Catalan, Vietnamese, and Kazakh — along with significant improvements to existing translations. **📂 File Management** Multi-select file deletion, BMP image viewer in the file browser, hidden directory browsing, and long-click file deletion from the file browser. **⚡ Performance** Under the hood, text layout switched from `std::list` to `std::vector`, HTML entity lookups are now O(log(n)), font rendering is faster, image decode is 5-20% faster with per-pixel overhead eliminated, and multiple string allocation hot paths were eliminated. Pre-indexing of the next chapter also reduces page-turn latency at chapter boundaries. --- Along with all of the above, there are many other additions including **WebDAV support**, **auto page turn**, **QR code for current page**, **split status bar settings**, **screenshot capture**, **JSON-based settings migration**, **light/dark theme groundwork**, and a long list of stability fixes and translation improvements. ## What's Changed ### Features * feat: Support for kerning and ligatures by @znelson in crosspoint-reader#873 * feat: footnote anchor navigation by @Uri-Tauber in crosspoint-reader#1245 * feat: slim footnotes support by @Uri-Tauber in crosspoint-reader#1031 * feat: integrated epub optimizer by @zgredex and @pablohc in crosspoint-reader#1224 * feat: battery charging indicator (mirroring PR crosspoint-reader#537) by @jpirnay in crosspoint-reader#1427 * feat: dump crash report to sdcard by @ngxson in crosspoint-reader#1145 * feat: Implement silent pre-indexing for the next chapter in EpubReaderActivity by @LSTAR1900 in crosspoint-reader#979 * feat: upgrade platform and support webdav by @dexif in crosspoint-reader#1047 * feat: Auto Page Turn for Epub Reader by @GenesiaW in crosspoint-reader#1219 * feat: enhance file deletion functionality with multi-select by @Jessica765 in crosspoint-reader#682 * feat: Long Click for File Deletion through File Browser by @Levrk in crosspoint-reader#909 * feat: Take screenshots by @el in crosspoint-reader#759 * feat: Current page as QR by @el in crosspoint-reader#1099 * feat: Download links for web server by @el in crosspoint-reader#1039 * feat: Added BmpViewer activity for viewing .bmp images in file browser by @Levrk in crosspoint-reader#887 * feat: User setting for image display by @jpirnay in crosspoint-reader#1291 * feat: Show hidden directories in browser by @jpirnay in crosspoint-reader#1288 * feat: Prefer ".sleep" over "sleep" for custom image directory by @jpirnay in crosspoint-reader#948 * feat: Allow a local configuration file for custom compiles by @jpirnay in crosspoint-reader#879 * feat: Migrate binary settings to json by @jpirnay in crosspoint-reader#920 * feat: split status bar setting by @whyte-j in crosspoint-reader#733 * feat: wrapped text in GfxRender, implemented in themes so far by @iandchasse in crosspoint-reader#1141 * feat: Themed language screen by @CaptainFrito in crosspoint-reader#1020 * feat: set WiFi hostname to CrossPoint-Reader-XXXXXXXXXXXX by @dexif in crosspoint-reader#1107 * feat: Add maxAlloc to memory information by @jpirnay in crosspoint-reader#1152 * feat: replace picojpeg with JPEGDEC for JPEG image decoding by @martinbrook in crosspoint-reader#1136 * feat: Add git branch to version information on settings screen by @jpirnay in crosspoint-reader#1225 * feat: sort languages in selection menu by @ariel-lindemann in crosspoint-reader#1071 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1157 * feat: Latin Extended-B European glyphs by @znelson in crosspoint-reader#1167 * feat: Vietnamese glyphs support by @danoooob in crosspoint-reader#1147 * feat: add Turkish translation by @barbarhan in crosspoint-reader#1192 * feat: add full Danish translation by @hajisan in crosspoint-reader#1146 * feat: Add Finnish translations by @plahteenlahti in crosspoint-reader#1133 * feat: Add Polish Language by @th0m4sek in crosspoint-reader#1155 * feat: add Dutch translation by @basvdploeg in crosspoint-reader#1204 * feat: add Belarusian translation by @dexif in crosspoint-reader#1120 * feat: Add full Italian translations by @andreaturchet in crosspoint-reader#1144 * feat: add Ukrainian translation by @mirus-ua in crosspoint-reader#1065 * feat: Add Kazakh (kk) language support by @fsocietyipa in crosspoint-reader#1377 * feat: added Romanian strings by @ariel-lindemann in crosspoint-reader#987 * feat: add Catalan strings by @angeldenom in crosspoint-reader#1049 * feat: Make directories stand out more in local file browser: "[dir]" instead of "dir" by @jpirnay in crosspoint-reader#1339 * feat: Add Polish strings for commits crosspoint-reader#1219,crosspoint-reader#1169,crosspoint-reader#1031 +tweaks by @th0m4sek in crosspoint-reader#1227 * feat: Polish translation tweaks by @th0m4sek in crosspoint-reader#1193 ### Fixes * fix: Fix img layout issue / support CSS display:none for elements and images by @jpirnay in crosspoint-reader#1443 * fix: Overlapping battery percentage on image pages with anti-aliasing by @znelson in crosspoint-reader#1452 * fix: Fix prewarm perf when a page contains many styles by @adriancaruana in crosspoint-reader#1451 * fix: use sleep routine from the original firmware by @ngxson in crosspoint-reader#1298 * fix: Prevent line breaks on common English contractions by @znelson in crosspoint-reader#1405 * fix: Build with -fno-exceptions by @znelson in crosspoint-reader#1412 * fix: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * fix: jpeg resource cleanup by @jpirnay in crosspoint-reader#1320 * fix: back button in settings returns to tab bar first by @Cache8063 in crosspoint-reader#1354 * fix: Init lastSleepImage (edge case) by @jpirnay in crosspoint-reader#1360 * fix: Add special handling for apostrophe hyphenation by @jpirnay in crosspoint-reader#1318 * fix: Fix inter-word spacing rounding error in text layout by @znelson in crosspoint-reader#1311 * fix: load access fault crash by @Uri-Tauber in crosspoint-reader#1370 * fix: Fix bootloop logging crash by @jpirnay in crosspoint-reader#1357 * fix: dump crash log without usb plugged, bump release log to INFO by @ngxson in crosspoint-reader#1332 * fix: avoid zip filename overflow by @jpirnay in crosspoint-reader#1321 * fix: Hanging indent (negative text-indent) and em-unit sizing by @jpirnay in crosspoint-reader#1229 * fix: Use fixed-point fractional x-advance and kerning for better text layout by @znelson in crosspoint-reader#1168 * fix: use HTTPClient::writeToStream for downloading files from OPDS by @osteotek in crosspoint-reader#1207 * fix: make file system operations thread-safe (HalFile) by @ngxson in crosspoint-reader#1212 * fix: properly implement requestUpdateAndWait() by @ngxson in crosspoint-reader#1218 * fix: prevent infinite render loop in Calibre Wireless after file transfer by @pablohc in crosspoint-reader#1070 * fix: WiFi lifecycle and hyphenation heap defragmentation for KOReader sync by @jpirnay in crosspoint-reader#1151 * fix: Fix coverRendered flag by @jpirnay in crosspoint-reader#1154 * fix: Handle non-ASCII characters in sanitizeFilename by @znelson in crosspoint-reader#1132 * fix: Update activity was missing "Back" button label by @znelson in crosspoint-reader#1128 * fix: force auto-hinting for Bookerly to fix inconsistent stem widths by @adriancaruana in crosspoint-reader#1098 * fix: image centering bleed by @martinbrook in crosspoint-reader#1096 * fix: double free WebDAVHandler by @ngxson in crosspoint-reader#1093 * fix: Consider extra quotation styles when hyphenating quoted words by @cbix in crosspoint-reader#1077 * fix: acquire power lock before sleeping by @ngxson in crosspoint-reader#1125 * fix: Unify inconsistent Wi-Fi/WiFi in Czech translation by @pepastach in crosspoint-reader#1138 * fix: sdfat warning about redefinition of macro by @ngxson in crosspoint-reader#1135 * fix: Close leaked file descriptors in SleepActivity and web server by @brbla in crosspoint-reader#869 * fix: Enable DESTRUCTOR_CLOSES_FILE flag by @daveallie in crosspoint-reader#1075 * fix: Change "UI Font Size" to "Reader Font Size" by @divinitycove in crosspoint-reader#1171 * fix: Hide unusable button hints when viewing empty directory by @Levrk in crosspoint-reader#1253 * fix: broken translations in status bar settings by @ariel-lindemann in crosspoint-reader#1188 * fix: clarity issue with ambiguous string `SET` by @ariel-lindemann in crosspoint-reader#1169 * fix: Crash (Load access fault) when indexing chapters containing characters unsupported by bold/italic font variants by @Uri-Tauber in crosspoint-reader#997 * fix: Increase PNGdec buffer size to support wide images by @osteotek in crosspoint-reader#995 * fix: Use HalPowerManager for battery percentage by @vjapolitzer in crosspoint-reader#1005 * fix: Fix dangling pointer by @Uri-Tauber in crosspoint-reader#1010 * fix: re-implementing Cover Outlines for the new Lyra Themes by @Levrk in crosspoint-reader#1017 * fix: use double FAST_REFRESH to prevent washout on large grey images by @martinbrook in crosspoint-reader#957 * fix: Fixed Image Sizing When No Width is Set by @DestinySpeaker in crosspoint-reader#1002 * fix: Strip unused CSS rules by @daveallie in crosspoint-reader#1014 * fix: continue reading card classic theme by @pablohc in crosspoint-reader#990 * fix: Destroy CSS Cache file when invalid by @daveallie in crosspoint-reader#1018 * fix: Shorten "Forget Wifi" button labels to fit on button by @lukestein in crosspoint-reader#1045 * fix: improve Spanish translations by @pablohc in crosspoint-reader#1054 * fix: Fixed book title in home screen by @DestinySpeaker in crosspoint-reader#1013 * fix: Fix hyphenation and rendering of decomposed characters by @jpirnay in crosspoint-reader#1037 * fix: Improve and add Spanish translations by @DaniPhii in crosspoint-reader#1338 * fix: improve and add Spanish translations by @DaniPhii in crosspoint-reader#1254 * fix: improve and add Swedish translations by @steka in crosspoint-reader#1317 * fix: Extend missing / amend existing German translations by @jpirnay in crosspoint-reader#1226 * fix: update french.yaml file to have a better French translation of the CFW by @Spigaw in crosspoint-reader#1130 * fix: added romanian translation to new strings by @ariel-lindemann in crosspoint-reader#1105 * fix: add missing romanian strings by @ariel-lindemann in crosspoint-reader#1187 * fix: add new Ukrainian translation line for STR_SCREENSHOT_BUTTON by @mirus-ua in crosspoint-reader#1149 * fix: Dutch translation prefix correction by @basvdploeg in crosspoint-reader#1223 * fix: Small typo in i18n.md regarding C++ identifiers by @victordomingos in crosspoint-reader#1210 * fix: typo in USER_GUIDE.md by @arnaugamez in crosspoint-reader#1036 * fix: add missing keyboard metrics to Lyra3CoversTheme by @dexif in crosspoint-reader#1101 ### Internal * perf: font-compression improvements by @adriancaruana in crosspoint-reader#1056 * perf: Improve font drawing performance by @jpirnay in crosspoint-reader#978 * perf: Replace std::list with std::vector in text layout by @znelson in crosspoint-reader#1038 * perf: Optimize HTML entities lookup to O(log(n)) by @Uri-Tauber in crosspoint-reader#1194 * perf: UITheme::getMetrics const and const-ref usage by @znelson in crosspoint-reader#1094 * perf: Avoid creating strings for file extension checks by @znelson in crosspoint-reader#1303 * perf: Eliminate per-pixel overheads in image rendering by @martinbrook in crosspoint-reader#1293 * perf: Update github actions for optimal performance with pioarduino by @Jason2866 in crosspoint-reader#1080 * style: Phase 1 - Simple light dark themes by @cdmoro in crosspoint-reader#1006 * refactor: implement ActivityManager by @ngxson in crosspoint-reader#1016 * refactor: Simplify REPLACEMENT_GLYPH fallback by @znelson in crosspoint-reader#1119 * refactor: Simplify new setting introduction by @jpirnay in crosspoint-reader#1086 * refactor: Use std binary search algorithms for font lookups by @znelson in crosspoint-reader#1202 * refactor: rename MyLibrary to FileBrowser by @osteotek in crosspoint-reader#1260 * refactor: Avoid rebuilding cache path strings by @znelson in crosspoint-reader#1300 * refactor: reader utils by @Uri-Tauber in crosspoint-reader#1329 * chore: Remove miniz and modularise inflation logic by @daveallie in crosspoint-reader#1073 * chore: Resolve several build warnings by @daveallie in crosspoint-reader#1076 * chore: Removed generated language headers by @znelson in crosspoint-reader#1156 * chore: Added generated lang headers to .gitignore by @znelson in crosspoint-reader#1158 * chore: remove redundant xTaskCreate by @ngxson in crosspoint-reader#1264 * chore: Removed unused PlatformIO include directory placeholder by @znelson in crosspoint-reader#1417 * chore: micro-optimisation: early exit on fillUncompressedSizes by @jpirnay in crosspoint-reader#1322 * chore: change label while on settings tab actions by @jpirnay in crosspoint-reader#1325 * chore: add firmware size history script by @znelson in crosspoint-reader#1235 * chore: Add powershell script for clang-formatting by @jpirnay in crosspoint-reader#1472 * chore: Removed unused ConfirmationActivity member by @znelson in crosspoint-reader#1234 * chore: Update russian.yaml by @madebyKir in crosspoint-reader#1198 * chore: new Ukrainian translation lines by @mirus-ua in crosspoint-reader#1199 * chore: new Ukrainian localization strings by @mirus-ua in crosspoint-reader#1270 * chore: Polish localization for STR_DELETE by @JonaszPotoniec in crosspoint-reader#1323 * chore: Image settings Polish localization by @znelson in crosspoint-reader#1299 * chore: add missing Catalan strings by @angeldenom in crosspoint-reader#1302 * chore: add missing translations for Romanian by @ariel-lindemann in crosspoint-reader#1265 * chore: Add Portuguese (Portugal) translator to the list by @victordomingos in crosspoint-reader#1211 * chore: Reduce flash usage by cleaning up I18n translations by @steka in crosspoint-reader#1401 * docs: Add lightweight contributor onboarding documentation by @bilalix in crosspoint-reader#894 * docs: ActivityManager migration guide by @znelson in crosspoint-reader#1222 * docs: USER_GUIDE.md update for 1.1.0 by @divinitycove in crosspoint-reader#1108 * docs: add quick KOReader sync setup guide by @wjhrdy in crosspoint-reader#1181 * docs: image support marked as completed by @ariel-lindemann in crosspoint-reader#1008 * feat: aiagent context definition by @jpirnay in crosspoint-reader#922 * chore: Update SKILL.md to reflect generated i18n files are gitignored by @znelson in crosspoint-reader#1423 * fix: ActivityManager tweaks by @znelson in crosspoint-reader#1220 * fix: Correct relative file paths in SKILL.md documentation by @pablohc in crosspoint-reader#1304 * fix: add Technically Unsupported section to SCOPE.md by @Uri-Tauber in crosspoint-reader#1295 ## New Contributors * @DestinySpeaker made their first contribution in crosspoint-reader#1002 * @arnaugamez made their first contribution in crosspoint-reader#1036 * @angeldenom made their first contribution in crosspoint-reader#1049 * @cdmoro made their first contribution in crosspoint-reader#1006 * @bilalix made their first contribution in crosspoint-reader#894 * @Jessica765 made their first contribution in crosspoint-reader#682 * @brbla made their first contribution in crosspoint-reader#869 * @dexif made their first contribution in crosspoint-reader#1047 * @mirus-ua made their first contribution in crosspoint-reader#1065 * @cbix made their first contribution in crosspoint-reader#1077 * @divinitycove made their first contribution in crosspoint-reader#1108 * @pepastach made their first contribution in crosspoint-reader#1138 * @Jason2866 made their first contribution in crosspoint-reader#1080 * @andreaturchet made their first contribution in crosspoint-reader#1144 * @Spigaw made their first contribution in crosspoint-reader#1130 * @iandchasse made their first contribution in crosspoint-reader#1141 * @th0m4sek made their first contribution in crosspoint-reader#1155 * @plahteenlahti made their first contribution in crosspoint-reader#1133 * @hajisan made their first contribution in crosspoint-reader#1146 * @madebyKir made their first contribution in crosspoint-reader#1198 * @victordomingos made their first contribution in crosspoint-reader#1210 * @basvdploeg made their first contribution in crosspoint-reader#1204 * @wjhrdy made their first contribution in crosspoint-reader#1181 * @DaniPhii made their first contribution in crosspoint-reader#1254 * @steka made their first contribution in crosspoint-reader#1317 * @barbarhan made their first contribution in crosspoint-reader#1192 * @JonaszPotoniec made their first contribution in crosspoint-reader#1323 * @Cache8063 made their first contribution in crosspoint-reader#1354 * @fsocietyipa made their first contribution in crosspoint-reader#1377 * @LSTAR1900 made their first contribution in crosspoint-reader#979 * @zgredex made their first contribution in crosspoint-reader#1224 **Full Changelog**: crosspoint-reader/crosspoint-reader@1.1.1...release/1.2.0 --------- Co-authored-by: jpirnay <jens@pirnay.com> Co-authored-by: Dani Poveda <daniphii@outlook.com> Co-authored-by: Baris Albayrak <80099286+barbarhan@users.noreply.github.com> Co-authored-by: Barış Albayrak <barisa@pop-os.lan> Co-authored-by: Stefan Blixten Karlsson <sbkarlsson@gmail.com> Co-authored-by: Àngel <153315454+angeldenom@users.noreply.github.com> Co-authored-by: Jonasz Potoniec <jonasz@potoniec.eu> Co-authored-by: Егор Мартынов <martynovegorOF@yandex.ru> Co-authored-by: Mirus <mirusim@gmail.com> Co-authored-by: Spigaw <73850535+Spigaw@users.noreply.github.com> Co-authored-by: ariel-lindemann <41641978+ariel-lindemann@users.noreply.github.com> Co-authored-by: Nima Salami <54304457+hajisan@users.noreply.github.com> Co-authored-by: Arthur Tazhitdinov <lisnake@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Bas van der Ploeg <bas@basvanderploeg.nl> Co-authored-by: martin brook <martin.brook100@googlemail.com>
Summary
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 helped with the extraction and refactor