Skip to content

#7992 Isolate PDF SMask - #2361

Merged
Frenzie merged 16 commits into
koreader:masterfrom
kerivin:isolate-pdf-smask
May 18, 2026
Merged

#7992 Isolate PDF SMask#2361
Frenzie merged 16 commits into
koreader:masterfrom
kerivin:isolate-pdf-smask

Conversation

@kerivin

@kerivin kerivin commented May 17, 2026

Copy link
Copy Markdown
Contributor

The implementation of #7992
Suggested order of merges: this PR -> bump base in koreader -> koreader PR

Image Image Image Image

This change is Reviewable

@Frenzie Frenzie left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not really a big fan of the whole separate utils file. That feels a bit like an LLM that read too much Java and therefore thinks every offhand thought should be split out into a separate file.

Comment thread mupdf_utils.c Outdated
Comment thread mupdf_utils.c Outdated
Comment on lines +15 to +16
fz_fill_image_mask(ctx, smask_dev->default_device, img->mask, ctm,
fz_device_gray(ctx), black, alpha, color_params);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't live in 1980, so there's no need to split things into two lines making life worse. ;-)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed it

kerivin and others added 2 commits May 18, 2026 00:41
Co-authored-by: Frans de Jonge <fransdejonge@gmail.com>
Comment thread mupdf_utils.h Outdated
@kerivin

kerivin commented May 17, 2026

Copy link
Copy Markdown
Contributor Author

I'm not really a big fan of the whole separate utils file. That feels a bit like an LLM that read too much Java and therefore thinks every offhand thought should be split out into a separate file.

There is a few C files with MuPDF stuff, but they all are about wrapping... I thought it would be not so obvious to put the non-wrapper to the wrappers

Co-authored-by: Frans de Jonge <fransdejonge@gmail.com>
@Frenzie

Frenzie commented May 17, 2026

Copy link
Copy Markdown
Member

To my mind it's still wrapping some fz_ functions. Just because it's not the most minimal wrap possible doesn't invalidate that. See #2322 for my take on something similar. It's still "wrapping" fz_new_story and fz_story_document, just while also massaging the output into the desired format. I'd be more inclined to rename the file if the word wrap is an issue.

The difference with cre.c and dvju.c is that those use the Lua C API, so they're not doing any "wrapping". But API aside, they're otherwise very similar in concept.

@kerivin

kerivin commented May 17, 2026

Copy link
Copy Markdown
Contributor Author

Yeah ok, I'll move it to wrap-mupdf.c

Comment thread ffi/mupdf.lua Outdated
Comment thread wrap-mupdf.c
if (img->mask) {
isolated_smask_device* smask_dev = (isolated_smask_device*)dev;
float black[1] = { 0.f };
fz_fill_image_mask(ctx, smask_dev->default_device, img->mask, ctm, fz_device_gray(ctx), black, alpha, color_params);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it correct that fz_device_gray doesn't need any cleanup?

@kerivin kerivin May 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like it.
Here's an example from the official documentation:

float cmyk[100][4] = { {1,0,0,0}, ...
float rgb[100][3];
fz_color_converter cc;
int i;

fz_find_color_converter(ctx,
	&cc,
	fz_device_cmyk(ctx),
	fz_device_rgb(ctx),
	NULL,
	fz_default_color_params(ctx)
);
for (i = 0; i < 100; ++i)
	cc.convert(ctx, &cc, cmyk[i], rgb[i]);
fz_drop_color_converter(ctx, &cc);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/**
	Retrieve global default colorspaces.

	These return borrowed references that should not be dropped,
	unless they are kept first.
*/
fz_colorspace *fz_device_gray(fz_context *ctx);
fz_colorspace *fz_device_rgb(fz_context *ctx);
fz_colorspace *fz_device_bgr(fz_context *ctx);
fz_colorspace *fz_device_cmyk(fz_context *ctx);
fz_colorspace *fz_device_lab(fz_context *ctx);

Comment thread wrap-mupdf.c Outdated
@Frenzie
Frenzie merged commit 2540fbf into koreader:master May 18, 2026
1 check passed
Frenzie added a commit to koreader/koreader that referenced this pull request May 18, 2026
* Support SDL3 pen events (koreader/koreader-base#2351)
* dropbear: update to 2026.91 (koreader/koreader-base#2359)
* Isolate PDF SMask (koreader/koreader-base#2361)
benoit-pierre pushed a commit to benoit-pierre/koreader that referenced this pull request May 18, 2026
benoit-pierre pushed a commit to benoit-pierre/koreader that referenced this pull request Jul 25, 2026
benoit-pierre pushed a commit to benoit-pierre/koreader that referenced this pull request Jul 26, 2026
liskin added a commit to liskin/koreader that referenced this pull request Jul 30, 2026
KOReader 2026.07 "Sailing Walrus"

<a href="https://github.com/user-attachments/assets/1cf9f7af-77be-41fa-b8d5-41bc60d2f9e3"><img width="2098" height="1610" alt="koreader-2026-07-sailing-walrus-fs8" src="https://github.com/user-attachments/assets/e274968e-f199-4353-afdc-e073fa456fa8" /></a>

It's been about four months since the previous release, so it's about time, isn't it? One very interesting addition is background cleanup for PDFs with Mask and SMask, which is technobabble for backgrounds (particularly in Archive.org PDFs, <koreader#15401>). It means you might not need preprocessing to be able to open them on your ereader without having to be fairly patient when turning pages, though the usual warnings apply: backgrounds are not *just* the yellowish color of paper, but they might also contain most of the non-textual content, if any.

Kobo v5 support was finally merged (<koreader#12401>), and will also reach the nightly builds server soon. There's also new or improved support for the PocketBook Era Lite, reMarkable Paper Pure, newer Onyx Android devices, and some Kindle models.

The hotkeys plugin now supports single-key shortcuts (koreader#14867), and speaking of plugins, there is now built-in support to delete them (koreader#15240).

SyncService is replaced by the new Cloud storage plugin (koreader#15210). It supports uploading, downloading, and deleting selected files, configurable servers and upload folders, natural sorting, and improved WebDAV handling.

And last but not least, there's now OPDS 2.0 basic support (koreader#15696).

This month's logo was contributed by [@thunder_clud](https://www.instagram.com/thunder_clud/).

We'd like to thank all contributors for their efforts. Some highlights since the previous release include:

* [doc] Add DataStorage developer docs (koreader#15121) @TechnoCode44
* linux: fix metadata to match our flatpak package (koreader#15126) @benoit-pierre
* otamanager: honor http proxy (koreader#15131) @benoit-pierre
* [Kindle] fix setting absolute warmth without breaking incremental settings (koreader#13344) @mergen3107
* tools: fix update-metadata (koreader#15132) @benoit-pierre
* Export highlights: filters (koreader#15003) @hius07
* Fix sdl3 lib path in nix shell (koreader#15142) @j-v
* Footnote popup: add option to justify (or not) text (koreader#15129) @poire-z
* [HtmlBoxWidget, DictQuickLookup] add capability to search within dictionary definitions (koreader#15001) @Commodore64user
* Bookmark browser: default book source (koreader#15143) @hius07
* bump base (koreader#15153) @benoit-pierre
  - libarchive: ensure FFI cdecls are the same on all platforms (koreader/koreader-base#2305)
* pocketbook: inkview handling rework (koreader#15087) @benoit-pierre
* bump crengine: support ::first-line, COLRv0 fonts, CHM and CSS fixes (koreader#15155) @poire-z
  Includes:
  - koreader/crengine#656
    - CHM: improve Chinese encoding handling
      Closes koreader#15079.
  - koreader/crengine#653
    - `renderFinalBlock()`: fix background color propagation among inlines
    - first-letter: resets some CSS, ignore invisible, stop on `<br/>`
    - CSS: support for pseudo element `::first-line`
      Closes koreader#14391.
    - CSS: add support for `float/clear`: `inline-start/inline-end`
  - koreader/crengine#654
    - lvfntman, lvdrawbuf: add COLR v0 color font rendering support

  Also add style tweaks to disable first-letter and first-line.
* css_tweaks: fix typo in Disable first-line tweak name (koreader#15161) @poire-z
* bump base (koreader#15172) @benoit-pierre
  - pocketbook: rework the inkview handling rework… (koreader/koreader-base#2307, close koreader#15156)
  - fi/util: prevent util.runInSubProcess children from running atexit handlers (koreader/koreader-base#2308, close koreader#15167)
* ReaderStatus: fix End of Document status change (koreader#15159) @hius07
* coverimage: only update on rotation if rotate image enabled (koreader#15179) @liskin
* Cloud storage+ (koreader#15150) @hius07
* [DictQuickLookup] detection and key-event injection for SDL devices (koreader#15158) @Commodore64user
* Collections update (koreader#15175, koreader#15193) @hius07
* File browser: fix "Folders and files mixed" menu item (koreader#15202) @hius07
* bugfix: check for current directory in webdav listing (koreader#15192) @rolurq
* SyncService is replaced by Cloud storage plugin (koreader#15210) @hius07
* pocketbook: drop redundant trace (koreader#15222) @benoit-pierre
* Status bars: fix showing additional content (koreader#15218) @hius07
* feat: add alternative mime type for fb2 (koreader#15231) @legokol
* Book status: reset rating (koreader#15227) @hius07
* Cloud storage: default server (koreader#15226) @hius07
* PluginLoader: use directory name for enabled/disabled, deprecate metadata name (koreader#15096) @Frenzie
* Feature: Implement the ability to delete plugins (koreader#15240) @Saterz
* [MultiInputDialog] split password field and checkbox (koreader#15234) @Commodore64user
* Cloud storage: upload selected files (koreader#15243) @hius07
* [Android] Bump luajit-launcher (koreader#15251) @Frenzie
  * EventReceiver: use Unix domain sockets instead of mkfifo() <koreader/android-luajit-launcher#580>
  * Fix Crema Soundup menu flickering due to unsupported GLR16 waveform <koreader/android-luajit-launcher#582>
  * Add support for ONYX_GO7 device ID <koreader/android-luajit-launcher#584>
  * Add ONYX_PALMA2_PRO to color device IDs <koreader/android-luajit-launcher#588>
* ReaderBookmark, BookmarkBrowser: unified bookmark details window (koreader#15250) @hius07
* InputText: delete selection; undo last deletion (koreader#15238) @hius07
* Fix language matching logic (koreader#15267) @PauLuke
* fix(pocketbook): Networking and DNS resolution during early boot (koreader#15244) @ananyatimalsina
* macos: tweak release 7z name (koreader#15284) @benoit-pierre
* Minor Wikipedia & highlighting fixes, add "Toggle hanging punctuation" to dispatcher (koreader#15285) @poire-z
* Profiles: keep settings in the base class (koreader#15270) @hius07
* Cloud storage: keep settings in the base class (koreader#15274) @hius07
* OPDS: load settings when needed only (koreader#15283) @hius07
* Add python to shell.nix (koreader#15296) @RoadRoller01
* vocabbuilder.koplugin: Add 'forgot' button in "Vocabulary exists" popup window (koreader#15297) @weijiuqiao
* handle multiple args in common/koreader.sh (koreader#15271) @liskin
* Read timer: start action, expiry message (koreader#15289) @hius07
* UI: Capitalize Bulgarian language name in language menu (koreader#15303) @d0nizam
* [KeyValuePage] Fix keyboard hold events targeting wrong item (koreader#15305) @Commodore64user
* MoveToArchive: load settings when needed only (koreader#15302) @hius07
* bump base (koreader#15308) @benoit-pierre
  - feat: Kindle: add uevent listener for input device hotplug (koreader/koreader-base#2327)
  - ffi/util,SDL3: stop SDL3 gamepad thread around fork() to fix Linux UI freeze (koreader/koreader-base#2332)
* bump crengine: MOBI and CSS fixes ; add getNearestWordFromPosition() (koreader#15310) @poire-z
  #### bump crengine: MOBI and CSS fixes

  Includes:
  - koreader/crengine#661
    - pdbfmt: don't overwrite extracted metadata
    - pdbfmt: extract more metadata from MOBI EXTH
    - pdbfmt: extract MOBI non-EXTH title if necessary
  - koreader/crengine#662
    - CSS first-line: fix possible crash
    - CSS width: fit-content: account for the element padding
    - getNodeByPoint(): improve fallback check

  #### cre.cpp: add getNearestWordFromPosition()

  Useful for improve text selection using DPAD/arrow keys.
  Requested along koreader/crengine#659.
* [PocketBook] Respect input_ignore_gsensor setting (koreader#15304) @jannickfahlbusch
* [doc] Add IconWidget developer docs (koreader#15253) (koreader#15276) @TechnoCode44
* Feature: Add a two different submenus for built-in and user plugins (koreader#15245) @Saterz
* plugins: avoid legacy use of double quoted sqlite strings (koreader#15318) @benoit-pierre
* BookStatusWidget: improve note gesture handling (koreader#15311) @Frenzie
* [Hotkeys] add single-key shortcuts (koreader#14867) @Commodore64user
* Gestures: keep settings in the base class (koreader#15278) @hius07
* DocSettings: fix moving doc setting to 'hash' location (koreader#15319) @hius07
* Collections: fix renaming folder (koreader#15320) @hius07
* KOSync: optionally send document metadata with progress sync (koreader#15306) @nperez0111
* Feat: KS3 & KSC support (koreader#15256) @ThatHackerDudeFromCyberspace
* Book metadata archive (koreader#15264) @hius07
* Book metadata archive: 'restore from archive' wording (koreader#15326) @hius07
* feat: ExternalKeyboard: allow plugin to load on Kindle (koreader#15248) @zampierilucas
* Folder shortcuts: standard folders (koreader#15323) @hius07
* NewsDownloader: per-feed max_age option (koreader#15322) @vandot
* Profiles: external auto-exec triggers (koreader#15329) @hius07
* [DictQuickLookup] add custom button layout (koreader#15184) @Commodore64user
* Sort by rating (koreader#15327) @hius07
* ReaderView: fix highlight in night mode (koreader#15336) @hius07
* Bug fix: ensure default_layout is up to date when generating menu (koreader#15340) @Commodore64user
* ci/macos: add workflow dispatch (koreader#15346) @benoit-pierre
* feat: add Lemma Greek-English dictionary (koreader#15357) @ciscoriordan
* fix: bump Lemma Greek-English Dictionary URL to v1.3.3 (koreader#15359) @ciscoriordan
* Plugin disable dialog (koreader#15341) @hius07
* Tweak document settings: open settings file when needed only (koreader#15355) @hius07
* kindle: add SSH server support to KUAL extension (koreader#15352) @benoit-pierre
* Plugins' menu items (koreader#15360) @hius07
* datetime: add gettext context to abbreviated months (koreader#15369) @ichnilatis-gr
* Fix opening file with associated provider (koreader#15367) @hius07
* VocabBuilder: sync action; enable deleting settings (koreader#15372) @hius07
* HttpInspector: enable deleting plugin settings (koreader#15373) @hius07
* QR from clipboard: enable highlight button on devices without clipboard (koreader#15363) @hius07
* Hide parent folder (koreader#15374) @hius07
* BatteryStat: enable deleting plugin settings (koreader#15378) @hius07
* KoSync: enable deleting plugin settings (koreader#15379) @hius07
* Wallabag: settings fixes (koreader#15383) @hius07
* NewsDownloader: enable deleting plugin settings (koreader#15382) @hius07
* OPDS: 'crawlable' relation (koreader#15384) @hius07
* kobo: Fix detection of 'Kobo mode' of Tolino devices (koreader#15389) @AlexanderS
* Perception expander: minor fixes (koreader#15364) @hius07
* plugins/calibre: preserve author_sort in slim metadata (koreader#15398) @AndyHazz
* BookShortcuts: fix settings (koreader#15392) @hius07
* TouchMenu: allow mousewheel scrolling; fix possible crash when highlighting (koreader#15402) @poire-z
* getHomeFolder() (koreader#15400) @hius07
* Increase viewport for PB743K3 (koreader#15410) @SilverGreen93
* Bump base (koreader#15411) @Frenzie
  * Support SDL3 pen events (koreader/koreader-base#2351)
  * Isolate PDF SMask (koreader/koreader-base#2361)
* koreader#7992 Isolate PDF SMask (koreader#15401) @kerivin
* fix: wikipedia enforced image step sizes (koreader#15399) @oscargolding
* Add support for Pocketbook Era Lite (koreader#15415) @Kulllerkeks
* Statistics: fix pic documents; enable deleting settings (koreader#15387) @hius07
* CloudStorage: save 'upload folder' (koreader#15408) @hius07
* ReaderHighlight: clear selection after showing OCR infomessage (koreader#15213) @Frenzie
* bump base (koreader#15418) @benoit-pierre
  - KOPTContext: add white threshold (koreader/koreader-base#2363)
* [DictQuickLookUp] bug_fix: don't mutate default_layout (koreader#15422) @Commodore64user
* Add white threshold for paged documents (koreader#15412) @kerivin
* bump base & crengine: support for initial-letter, and other fixes (koreader#15429) @poire-z
  Includes:
  - fix GCC 16 warnings (-Wunused-but-set-variable) koreader/crengine#663
  - koreader/crengine#666 :
    - ldomXRange::getRangeText(): newline on <br/>
    - createXPointer(pt)/getRect(): use formatter src->t.text
    - getRect(): unify one-char-long word width handling
    - CSS ::first-letter: use non-letter char if no letter in first text node
    - CSS ::first-line: properly handle inline-block
    - createXPointer(pt): return source text node on pseudoElem[FirstLetter]
    - getSegmentRects(): compare .bottom additionally to .top
    - lvfntman: add getCapHeight()
    - CSS initial-letter: add CSS parsing and style slot
    - CSS initial-letter: render ::first-letter via inline-box

  Also includes:
  - MuPDF: check if page has smask before applying it koreader/koreader-base#2364

  credocument: fix call cache statistics (not updated after the bit time.lua refactor years ago - koreader#15377 (comment)).
* QRClipboard: fix extending highlight to sentence (koreader#15431) @hius07
* doc: update build requirements (koreader#15437) @benoit-pierre
* sdl: better init trace (koreader#15438) @benoit-pierre
* Flat file list (no subfolders) (koreader#15425) @hius07
* Profiles: auto-executing list; path patterns (koreader#15439) @hius07
* drop remains of non-functional Ubuntu Touch target (koreader#15442) @benoit-pierre
* feat: saturation control (koreader#15381) @NoaHimesaka1873
* mxcfb: fix kobo FFI cdecls (koreader#15446) @benoit-pierre
* ReadCollection: fix per-collection write filter typo on removeItem (koreader#15454) @AndyHazz
* Tweak document settings: path patterns (koreader#15440) @hius07
* fix: missing saturation in copyPageState (koreader#15455) @NoaHimesaka1873
* Add WikDict bilingual dictionaries (koreader#15456) @karlb
* feat: add turkish reader.dict monolingual dictionary (koreader#15457) @BoboTiG
* Add some Wiktionary StarDict files (koreader#15451) @xxyzz
* feat: QTFB input/framebuffer support (koreader#15461) @NoaHimesaka1873
* Book metadata archive: fix saving (koreader#15445) @hius07
* feat: reMarkable Paper Pure support (koreader#15463) @NoaHimesaka1873
* [ReaderKeySelection] NT: improved text selection with cursor keys (koreader#15377) @Commodore64user
* ReaderDictionary: prettify dict download list (koreader#15452) @hius07
* fix `common/koreader.sh` arguments handling on restart (koreader#15312) @benoit-pierre
* make: change android targets to `android-xxx` (koreader#15351) @benoit-pierre
* generate new ota packages (koreader#15236) @benoit-pierre
* Screensaver: don't load the module on unsupported devices (koreader#15465) @hius07
* fix: appload quirk workaround (koreader#15475) @NoaHimesaka1873
* [TextBoxWidget] Find in definition (wiki edition) (koreader#15356) @Commodore64user
* Highlights: pre-highlighting prompt (koreader#15473) @hius07
* SDL: shell-escape openLink and external dict lookup args (koreader#15491) @Booyaka101
* Open file: more honor associated provider (koreader#15489) @hius07
* Exporter: exclude page bookmarks (koreader#15493) @hius07
* [DictQuick, Paging, Rolling] Eclectic fixes for 'find In Definition' and key Events (koreader#15498) @Commodore64user
* Highlights: temporary highlight color (koreader#15486) @hius07
* Menu widget: search next entry (koreader#15502) @hius07
* [TextViewer] NT: add page turn events for easier navigation (koreader#15504) @Commodore64user
* [SDL,plugin/hotkeys] Process gamepad events (koreader#15449) @Frenzie
* Screen rotation: always show rotation mode options (koreader#15505) @chofuhoyu
* BookShortcuts: fix open folder from Reader (koreader#15517) @hius07
* Cloud storage: download/delete selected files (koreader#15522) @hius07
* fix(cloudstorage): webdav not listing folders (koreader#15532) @Skittyblock
* fix(cloudstorage): choose folder not showing for empty dirs (koreader#15533) @Skittyblock
* vocabbuilder.koplugin: Add "got it" button in "Vocabulary exists" popup window (koreader#15534) @weijiuqiao
* [reMarkable] fix: native QTFB OTA update (koreader#15538) @NoaHimesaka1873
* fix(vocabbuilder): leaked db conn breaking sync (koreader#15531) @Skittyblock
* bump base & crengine, enhanced search on CreDocuments (koreader#15543) @poire-z
  #### bump base: ffi-cdecl and ffi tweaks and updates

  Also:
  - ffi/loadlib: fix loading SSL library in monolibtic mode
  - ci/circle: bump docker images (new ffi-cdecl version)
  - ffi/zstd: allow setting compression level
  - ffi/hashoir: new module for hashing memory
  - ffi/util: add bidirectional support to `runInSubProcess`
  - utils: improve `inkview_h` generator script

  (Too many PRs to add links to each of them :/ :))

  #### bump crengine: enhanced findText(); Malayalam hypnehation

  Includes:
  - TextLang, hyphenation: add Malayalam (ml) koreader/crengine#672
  - koreader/crengine#673
    - `findText()`: return list of ldomXRange instead of ldomWord
    - `findText()`: implement tweakable enhanced search
  - koreader/koreader-base#2411
    - cre.cpp findText() and findAllText():
      Updated to handle returned ldomXRange instead of ldomWord,
      and added optional searchFlags params.

  ReaderTypography: add Malayalam to the list of supported languages.

  #### ReaderSearch: enhanced search on CreDocuments

  See koreader#10366 (comment) (flags re-ordered since this post - don't trust them there).

  I settled on:
  <img width="544" height="245" alt="image" src="https://github.com/user-attachments/assets/3725c972-943e-4424-8d64-a09f256b66ec" />

  2 others commented out would give:
  <img width="546" height="313" alt="image" src="https://github.com/user-attachments/assets/6957ab49-e2aa-42e0-b40d-b91fbfae91a7" />

  ```lua
      -- For CreDocuments, different search features are available:
      -- Enhanced search flags:
      --   MATCH_ACROSS_TEXT_NODES     = 0x0001
      --   COLLAPSE_CONSECUTIVE_SPACES = 0x0002
      --   NORMALIZE_CANONICAL         = 0x0004
      --   NORMALIZE_COMPATIBILITY     = 0x0008
      --   IGNORE_FORMAT_CONTROL_CHARS = 0x0010
      --   FOLD_SPACES                 = 0x0020
      --   FOLD_APOSTROPHES            = 0x0040
      --   FOLD_HYPHENS                = 0x0080
      --   IGNORE_DIACRITICS           = 0x0100
      -- Make a few types of search available as radion buttons
      -- (These are available to be updated/extended by user-patches)
      search_types = {
          -- Title of the radio button , search_flags, use_regex
          { _("Ignore accents / stress marks"), 0x01FF, false },
          -- { _("As typed"), 0x0017, false },
          -- { _("Legacy search"), 0x0000, false },
          { _("Regular expression (long-press for help)"), 0x0001, true },
      },
      default_search_type = { "", 0x00FF, false }, -- Most except IGNORE_DIACRITICS
  ```

  These Radio buttons (each setting a set of flags) are mutually exclusive, but they can also be all unchecked (in which case, we use the defaults we seem to have all agreed on). `Case insensitive` is an independant one that works with all others (and the default of none).
  **Should they be squared checkboxes ?**

* bump crengine: refactor Font Manager, support for variable fonts (koreader#15553) @poire-z
  Includes koreader/crengine#669:
  - lvfntman: Refactor Font Manager; Add variable fonts
  - CSS font-optical-sizing
  - lvfntman: Docs and tests for refactor

  Thanks to @spfenwick .

  Closes koreader#12800 (might have been about the UI fonts, but well, it's more valuable in crengine, and we got it there, so closing).
* fix(language): remove duplicate Vietnamese language entry (koreader#15552) @gaunh0
* Page overlap: no indicator; actions for gestures/profiles (koreader#15541) @hius07
* Enable 'Saturation' option if 'Color rendering' is on (koreader#15542) @kerivin
* Malayalam Keyboard (FUTO layout) (koreader#15560) @NalrTynhe
* [ReaderKeySelection] NT: add indicator overlay (koreader#15547) @Commodore64user
* kindle: fix possible crash when not connected to a network but wifi is on (koreader#15519) @benoit-pierre
* QuickMenu: rename actions (koreader#15564) @hius07
* [ReaderKeySelection] flash word when starting indicator (koreader#15571) @Commodore64user
* Check code type before HTTP error handling (koreader#15578) @lyluqo
* Reworked the Wallabag plugin to recursively scan the download directory (koreader#15558) @evmcl
* Collections: fix removing book from collections via file popup dialog (koreader#15577) @hius07
* screensaver: add option for extra refreshes to avoid sleep screen ghosting (koreader#15568) @ahmadadam96
* minor wording and button corrections (koreader#15582) @Commodore64user
* bump base & crengine: Font Manager enhancements and fixes (koreader#15587) @poire-z
  Includes:
  - lvfntman: `SetAlias` cleanup koreader/crengine#678
  - lvfntman: synthetic small caps koreader/crengine#680
    Closes koreader#13563.
  - lvfntman: fix duplicated `@font-face` handling koreader/crengine#682
  - lvfntman: resurrect `getFontFileNameAndFaceIndex()` koreader/crengine#683
    Closes koreader#15574.
    Closes koreader#15581.
  - CSS: allow arbitrary `font-weight`s koreader/crengine#681
    Closes koreader#4174.
  - DrawBuf: allow drawing colors inverted koreader/crengine#677
    Closes koreader#15544.

  Also:
  cre.cpp: `drawCurrentPage()` set invert_colors when invert_images provided.

  Also:
  feat(ffi): invert screenshots in night mode koreader/koreader-base#2401
* kindle: fix issues when running from nonstandard location (koreader#15579) @ThatHackerDudeFromCyberspace
* feat: add dutch reader.dict monolingual dictionary (koreader#15589) @BoboTiG
* CloudStorage: fix servers order when adding new server (koreader#15580) @hius07
* NewsDownloader: check relative urls using socket.url.parse() (koreader#15595) @zikasak
* NewsDownloader: fix for shadowing _() (koreader#15597) @zikasak
* TextViewer: view html, markdown (koreader#15588) @hius07
* `ffi/posix_h` rework + use `ffi/netinfo` (koreader#15556) @benoit-pierre
* move kosync plugin settings into a separate file (koreader#15591) @zikasak
* Disable external plugins and user-patches (koreader#15593) @hius07
* kindle: More non-standard installation fixes and default NO_EIPS_SLEEP when not launched from KUAL (koreader#15601) @ThatHackerDudeFromCyberspace
* Background cleanup over dewatermark (koreader#15555) @kerivin
* kindle: Stop awesome regardless whether KOReader was launched from KUAL or not (koreader#15608) @ThatHackerDudeFromCyberspace
* [InputDialog] NT: remove separator from widget's layout (koreader#15602) @Commodore64user
* Highlights: note format (koreader#15599) @hius07
* [ReaderLink, Back] clear page links with Back key (koreader#15613) @Commodore64user
* kindle: Fix launch script path detection issues on older firmwares (koreader#15625) @ThatHackerDudeFromCyberspace
* NetworkMgr: re-DHCP after Wi-Fi network switch on Kobo (koreader#14790) (koreader#15618) @Warlium
* readerdictionary: fix & improve downloading dictionaries (koreader#15642) @benoit-pierre
* dictionaries: fix / update some dictionaries (koreader#15641) @benoit-pierre
* Clipboard snippets (koreader#15627) @hius07
* document: fix crash when opening single images (koreader#15644) @benoit-pierre
* QuickMenu position (koreader#15640) @hius07
* document: fix another `background_cleanup` check (koreader#15648) @benoit-pierre
* Add hall_file support to KindleTouch and KindleBasic4 (koreader#15654) @evankrummel
* NetworkListener: guard against auto_disable_wifi enabled by user on unsupported devices (koreader#15655) @Frenzie
* OPDSParser: handle self-closing content tags (koreader#15515) @Booyaka101
* SSH.koplugin: add force‑close toggle for stop (koreader#15338) @d0nizam
* fix: locale C or en_US has its own plural manipulation, the default one. (koreader#15375) @picospuch
* DjVu: preserve text-layer reading order in selection (koreader#15298) @anaxonda
* KOSync: queue failed progress updates for retry on reconnect (koreader#15324) @collaed
* Refactor DepGraph node handling (koreader#15659) @hugo1120
* feat(reMarkable): Oxide/libblight support (koreader#15611) @NoaHimesaka1873
* Support SDL stylus input (koreader#15344) @HackingGate
* CloudStorage: add natural sorting by name (koreader#15662) @hius07
* [InputText] Toggle on-screen keyboard with a lone Sym/ScreenKB tap (koreader#15669) @iav
* Fix crash when opening KOReader with connected BT keyboard (koreader#15681) @mergen3107
* Update wiktionary_stardict files (koreader#15686) @xxyzz
* add id Indonesian translation to UI (koreader#15693) @cloned-doy
* [ReaderKeySelection] rework addToMainMenu (koreader#15685) @Commodore64user
* pdfdocument: rename deleteMarkupAnnotation call to deleteAnnotation (koreader#15672) @tomasAlabes
* screensaver: improve extra flash option to fix banding (koreader#15703) @ahmadadam96
* bump base (koreader#15709) @benoit-pierre
  - libjpeg-turbo: minor cleanup (koreader/koreader-base#2451)
  - MuPDF: enable Background Cleanup for PDFs with Mask (not SMask) (koreader/koreader-base#2452, close koreader#15694)
  - jpeg: re-enable bmp writing support + miscellaenous improvements (koreader/koreader-base#2453, close koreader#15699)
* screensaver: add default values to anti-ghosting redraws spinner (koreader#15710) @ahmadadam96
* Kobo v5 support (koreader#12401) @NerdyProjects
* BookList: safeguard series index for sorting (koreader#15705) @hius07
* NetworkSetting: guard against missing scan result flags (koreader#15714) @SAY-5
* Quickstart: teach about menu search (koreader#15712) @gilgulgamesh
* BookmarkBrowser: persistent filters (koreader#15711) @hius07
* device/kobo: add Kobo:otaModel() like on Kindle for uniformity (koreader#15713) @Frenzie
* WebDAV sync: fix infinite 412 loop on weak ETags (koreader#15715) @Lorite
* pocketbook: fix startup crash after 6.11.1480 firmware update (koreader#15730) @9783e6
* Device:ping4: keep the native ICMP path on kernels < 2.6.27 (fix legacy Kindle UI freeze) (koreader#15663) @iav
* OPDS 2.0 basic support (koreader#15696) @hius07
* Fix bottom menu activation (koreader#15733) @hius07
* [DictQuickLookup] K4: use modifier to call lookupinputword widget (koreader#15723) @Commodore64user
* Flash when displaying covers to reduce ghosting (koreader#15724) @dmalinovsky
* android: set FONTDIR so MuPDF can find its fallback fonts (koreader#15738) @jperon
* fix(reMarkable): PowerD fixes for frontlight and HE sensor (koreader#15690) @NoaHimesaka1873

* @TechnoCode44 made their first contribution in koreader#15121
* @j-v made their first contribution in koreader#15142
* @rolurq made their first contribution in koreader#15192
* @legokol made their first contribution in koreader#15231
* @Saterz made their first contribution in koreader#15240
* @PauLuke made their first contribution in koreader#15267
* @ananyatimalsina made their first contribution in koreader#15244
* @RoadRoller01 made their first contribution in koreader#15296
* @d0nizam made their first contribution in koreader#15303
* @nperez0111 made their first contribution in koreader#15306
* @ThatHackerDudeFromCyberspace made their first contribution in koreader#15256
* @zampierilucas made their first contribution in koreader#15248
* @vandot made their first contribution in koreader#15322
* @ciscoriordan made their first contribution in koreader#15357
* @AlexanderS made their first contribution in koreader#15389
* @AndyHazz made their first contribution in koreader#15398
* @kerivin made their first contribution in koreader#15401
* @Kulllerkeks made their first contribution in koreader#15415
* @karlb made their first contribution in koreader#15456
* @xxyzz made their first contribution in koreader#15451
* @Booyaka101 made their first contribution in koreader#15491
* @chofuhoyu made their first contribution in koreader#15505
* @Skittyblock made their first contribution in koreader#15532
* @gaunh0 made their first contribution in koreader#15552
* @NalrTynhe made their first contribution in koreader#15560
* @lyluqo made their first contribution in koreader#15578
* @evmcl made their first contribution in koreader#15558
* @ahmadadam96 made their first contribution in koreader#15568
* @Warlium made their first contribution in koreader#15618
* @evankrummel made their first contribution in koreader#15654
* @picospuch made their first contribution in koreader#15375
* @anaxonda made their first contribution in koreader#15298
* @collaed made their first contribution in koreader#15324
* @hugo1120 made their first contribution in koreader#15659
* @HackingGate made their first contribution in koreader#15344
* @iav made their first contribution in koreader#15669
* @cloned-doy made their first contribution in koreader#15693
* @tomasAlabes made their first contribution in koreader#15672
* @NerdyProjects made their first contribution in koreader#12401
* @SAY-5 made their first contribution in koreader#15714
* @gilgulgamesh made their first contribution in koreader#15712
* @Lorite made their first contribution in koreader#15715
* @9783e6 made their first contribution in koreader#15730

**Full Changelog**: koreader/koreader@v2026.03...v2026.07 — [closed milestone issues](https://github.com/koreader/koreader/milestone/79?closed=1)

---

**Installation instructions**: [Android](https://github.com/koreader/koreader/wiki/Installation-on-Android-devices) • [Cervantes](https://github.com/koreader/koreader/wiki/Installation-on-BQ-devices) • [ChromeOS](https://github.com/koreader/koreader/wiki/Installation-on-Chromebook-devices) • [Kindle](https://github.com/koreader/koreader/wiki/Installation-on-Kindle-devices) • [Kobo](https://github.com/koreader/koreader/wiki/Installation-on-Kobo-devices) • [PocketBook](https://github.com/koreader/koreader/wiki/Installation-on-PocketBook-devices) • [ReMarkable](https://github.com/koreader/koreader/wiki/Installation-on-ReMarkable) • [Desktop Linux](https://github.com/koreader/koreader/wiki/Installation-on-desktop-linux) • [MacOS](https://github.com/koreader/koreader/wiki/Installation-on-MacOS)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants