Skip to content

Latest commit

 

History

History
105 lines (76 loc) · 10 KB

File metadata and controls

105 lines (76 loc) · 10 KB

Changelog

All notable changes to boozle are documented here. Format follows Keep a Changelog.

[Unreleased]

Changed

  • Overview thumbnails are cached across sessions and launches: slide overview now uses a dedicated thumbnail cache with a 128 MB in-process GPU LRU plus a transparent OS-temp PNG cache keyed by PDF path, file size, modtime, page, and thumbnail dimensions. Opening overview again in the same run should be immediate, and reopening the same unchanged deck can reuse thumbnails from temp without re-rendering them through PDFium.
  • Overview thumbnail loading is main-thread safe: background workers now emit CPU RGBA images only; Ebiten GPU uploads happen on the main goroutine before insertion into the thumbnail cache. Audience and presenter overview share this pipeline instead of maintaining duplicate render/upload code.
  • Large-deck overview drawing does less per frame: overview precomputes grid cell rectangles, uses O(1) mouse hit testing instead of scanning every slide, caches the static thumbnail grid layer while active, and switches large decks to a simpler grid fade instead of animating every tile independently.
  • PDF page sizes are cached lazily: repeated current/next/prefetch layout checks now reuse page dimensions after the first PageSize lookup instead of calling PDFium every frame.

Fixed

  • Presenter overview duplicate work: in presenter mode, the audience/master process no longer starts a thumbnail loader for overview content it does not draw; the presenter process owns the overview thumbnails it displays.

[1.2.0] — 2026-05-05

Added

  • PowerPoint speaker-note import: boozle notes import <file.pptx> extracts .pptx speaker notes into a standalone Boozle TOML sidecar. Use --out or --config to choose the output path, and --force to replace an existing sidecar. The generated file can be used with the PDF later, so the PowerPoint deck does not need to be carried during presentation.
  • Presenter notes: [[page]] notes = "..." entries in the TOML sidecar are now loaded and shown in presenter view for the current slide.
  • One-monitor presenter testing: --no-fullscreen --monitor 0 --presenter-monitor 0 now opens both audience and presenter views as windowed views on the same monitor for local testing.
  • --cache-mb: hard-cap the GPU page cache at N MB instead of the auto-sized budget. Useful when the auto sizing is generous for the navigation pattern actually in use. Also available as cache_mb in the TOML sidecar.
  • --render-scale: rasterise pages at a fraction of native pixels (0.5..1.0; 0 keeps native). Cuts per-page bytes quadratically and shrinks the PDFium WASM-side bitmaps in the same step — the biggest single lever for memory on large decks / high-DPI displays. Also available as render_scale in the TOML sidecar.

Changed

  • Render cache stores GPU images, not CPU pixels: page flips are now a pointer swap into the cache instead of an ebiten.NewImageFromImage re-upload of ~32 MB on every navigation. The cache uploads once via WritePixels, then PDFium's WASM-side bitmap and the Go-side RGBA copy are released immediately. Result: noticeably snappier flips on Retina/4K and a large drop in steady-state RAM (no more redundant CPU pixel buffers held alongside the GPU textures).
  • Cache budget is auto-sized to the active display: replaces the fixed 128 MB constant with a per-Layout budget of ~4 full-buffer pages, floored at 32 MB and capped at 192 MB. Small/laptop windows now use ~30–50 MB; high-DPI setups grow automatically. --cache-mb overrides the auto sizing; --render-scale reduces per-page bytes when memory matters more than maximum sharpness.
  • LRU is O(1): cache touch/evict no longer walks a slice on every Get/Put.
  • Mipmap reuse during resize: when the window is mid-drag and the cache doesn't yet have an entry at the new resolution, a larger same-page entry is linearly downsampled by the GPU as a stand-in while the prefetcher catches up at the exact size. No more PDFium hit per Layout tick during a resize.
  • Direction-aware prefetch: forward marches now prefetch [+1, +2, +3, -1] (mirrored on backward), with the queue depth bumped from 4 to 8. Idle state uses the cheaper [+1, -1].
  • Stale-DPI cache cleanup on monitor change: dragging a window between displays at different scale factors now proactively evicts entries strictly larger than the new buffer instead of leaving them to age out of the LRU naturally.

Fixed

  • Transient stalls during forward navigation: rapid Space or no longer drops prefetch requests on the floor (queue size 4 was too tight).
  • Per-frame allocation churn in presenter view: clock, slide counter, and elapsed-timer strings are now memoised at integer-second resolution. Status-text rendering reuses pooled scratch buffers instead of allocating a fresh ebiten.Image per character per frame.
  • Per-flip transition-snapshot allocation: the outgoing slide is held by pinning its existing cache entry instead of copying it into a fresh full-buffer ebiten.Image per page change.
  • Linux multi-monitor fullscreen placement: monitor selection is now re-applied after the window exists and before every fullscreen entry, including the f key toggle. This keeps --monitor and --presenter-monitor tied to the selected displays instead of letting the window manager/fullscreen transition fall back to the primary screen.
  • PowerPoint notes extraction: notes-page slide-number placeholders are ignored so empty note pages do not produce entries like notes = "17".

[1.1.1] — 2026-05-04

Added

  • --list-monitors / -M: prints the index, name, and DPI scale of every connected display, then exits. Use this to discover which number to pass to --monitor and --presenter-monitor when you're not sure how your OS has ordered the screens.

Fixed

  • Multi-monitor placement: --monitor 0 --presenter-monitor 1 (and any other combination) now reliably opens each window on the intended display. Previously, monitor 0 was a no-op that delegated placement to the OS — in setups where the OS default was not the primary, both windows landed on the same screen.

[1.1.0] — 2026-05-02

Added

  • Presenter view (--presenter-monitor, -P): optional second fullscreen window for speaker use, showing the current slide, next-slide preview, slide counter, wall clock, elapsed session timer, and auto-advance timer. It can also be enabled from the TOML sidecar with presenter_monitor = 1; the presenter and audience displays must use different monitors.
  • Slide transitions (--transition): animated page changes with slide (lateral push, the default) or fade (cross-dissolve). Pass --transition none to restore the instant-cut behaviour. The style can also be set in the TOML sidecar with transition = "fade". Non-directional jumps (Home, End, digit+Enter, l) always use a fade regardless of the configured style.

Fixed

  • Progress bar: removed a stray 1 px white line that appeared above the bar on certain slide backgrounds.
  • Presenter view: keyboard and mouse-wheel navigation now forward to the main presentation window, so the usual key bindings work when either screen has focus.
  • Slide overview: selection, "you are here", and hover borders now hug the actual slide edges instead of the full cell box, so frames are correctly sized for non-square slide aspect ratios.

Changed

  • Presenter view: replaced the raw split-pane layout with framed current/next slide panels plus a larger clock, slide counter, and timer area.
  • Presenter view: progress now uses the same segmented brand-rainbow treatment as the slide progress overlay.
  • Slide overview: preview and thumbnail grid now use the same framed dark panel style as presenter mode.
  • Slide overview: dark scrim opacity increased from 78 % to 90 % for better thumbnail contrast.

[1.0.0] — 2026-04-29

First stable release.

Added

  • Fullscreen PDF playback via PDFium compiled to WebAssembly (CGO-free renderer, pure-Go wazero runtime).
  • Auto-advance with --auto <duration> and per-page duration overrides in TOML sidecar.
  • Manual navigation: /, PgDn/PgUp, Space, Backspace, Home/End, numeric jump (digits + Enter).
  • Slide overview (Tab): split-screen thumbnail grid with animated enter/exit; navigate with arrow keys or click to jump to any slide.
  • Progress overlay (--progress): a segmented rainbow bar at the bottom of the screen — one segment per slide, completed slides glow in gradient colour, the current segment fills as the auto-advance timer counts down.
  • Page counter: "3 / 24" position display in the bottom-right corner when --progress is active.
  • --autoquit: quit the window automatically after the last page advances instead of stopping there. Useful for unattended kiosks.
  • l key: jump back to the previously viewed page (like Impressive's "return to last" shortcut).
  • f key: toggle fullscreen on/off at runtime.
  • p key: pause / resume auto-advance.
  • b / w keys: black-out / white-out screen toggles.
  • Mouse wheel: scroll down = next page, scroll up = previous page.
  • Auto-hide cursor: mouse cursor hides after ~3 s of inactivity and reappears on any movement.
  • Loop after last page (--loop).
  • Start at a specific page (--start N).
  • Restrict playback to a page range (--pages 3-7,10).
  • Multi-monitor support (--monitor N).
  • HiDPI-correct rendering — re-rasterises at native pixel resolution per monitor.
  • LRU page cache with background prefetch goroutine.
  • TOML sidecar (<file>.boozle.toml) for per-deck defaults and per-page overrides; progress and autoquit can also be set in the sidecar — CLI flags take precedence.
  • Background color flag (--bg <hex>).
  • Windowed mode for development (--no-fullscreen).
  • Single-binary distribution: install.sh (macOS/Linux) and install.ps1 (Windows) with SHA-256 verification.
  • GitHub Actions CI (ubuntu, macos, windows) and release pipeline producing native binaries for macOS arm64/amd64, Linux amd64, Windows amd64.