Features
- Add Lua API
view:export_highlights(path)that serialises all highlight annotations to
a JSON file. Each entry containspage(1-based),text, and optionallycomment.
Returnstrueon success ornil, erroron failure.
Bug Fixes
- Fix crash when right-clicking on the overlay scrollbar — right-click events were
unconditionally forwarded to the scrollbar, causing its built-in context menu
(QMenu::exec) to spin a nested event loop whileGraphicsView::contextMenuEvent
also fired, leading to a double-menu crash. Non-left-button clicks on the scrollbar
are now silently ignored. - Fix animated GIF frames being skipped:
QImageReader::read()auto-advances the frame
position for animated formats, so the subsequentjumpToNextImage()call was
double-advancing and skipping every other frame. - Fix animated GIF playback running at ~1.5× speed: the elapsed clock was started before
the first timer fired, so the first callback measured ~100 ms of wait time as "render
overhead" and scheduled the next frame at 0 ms delay. Subsequent frames alternated
between 0 ms and ~95 ms, averaging half the intended interval. The clock is now
restarted at the top of each callback so it measures only actual render overhead. - Fix image files always rendering blurry: pixel dimensions were stored directly as
typographic points in the page dimension cache, causingpageSceneSizeand
repositionPagesto apply an extra ×(dpi/72) upscale on every render. Dimensions
are now converted to pts (px * 72 / dpi) on load, matching the DjVu path. - Fix image zoom leaving blurry pixels:
setZoomAnchoredfor images only applied a
Qt scene-transform scale and never triggered a pixel-level re-render. The HQ render
timer is now started after each anchor zoom so that, once zoom settles,renderImage
re-renders at the exact target dimensions usingQt::SmoothTransformation. - Add
collectHighlightTexts()onModelreturning astd::vector<HighlightText>with
page,text,comment, andquadfields. Multi-line highlights are grouped into a
single entry (lines joined with a space) rather than one entry per line.
Performance
- Animated GIF memory usage reduced from O(all frames) to O(1 frame): switched from
pre-decoding every frame into aQList<QImage>buffer toQMoviewith
CacheMode::CacheNone, which decodes one frame at a time on demand. The manual
timer and elapsed-clock machinery is replaced byQMovie::frameChanged.
SVG Rendering
- SVG files are now rendered via librsvg + Cairo when available, with automatic fallback
to Qt'sQSvgRenderer. librsvg is probed at runtime usingQLibrary(no build-time
dependency, no configuration flag) — iflibrsvg-2.so.2andlibcairo.so.2are
installed on the system they are used automatically, otherwise rendering falls back
silently. librsvg handles CSS class-based styles,<switch>fallback elements, and
CSS functions such aslight-dark()that Qt's renderer ignores, producing correct
output for SVGs generated by tools like draw.io.
DjVu
- DjVu support is now detected at runtime via
QLibraryinstead of requiring a
compile-timeWITH_DJVUflag and a link-time dependency on libdjvulibre.
If it is installed on the system, DjVu files are opened automatically;
if it is absent, DjVu is silently unavailable. TheWITH_DJVUCMake option and the
HAS_DJVUpreprocessor define have been removed.
Breaking Changes
- Remove
ImageMagickdependency as it's a headache to maintain and to link against for cross-platform compatibility. - Removed
lektra.capabilitiestable as it's not useful