mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-28 04:27:06 -06:00
PDF export rasterises every slide as a backdrop and a content layer and hands both to the writer. Profiling (gdb stack sampling) showed most of the main thread outside rendering going to per-pixel work on those rasters: compositing the backdrop onto white (not vectorised), the writer hashing every backdrop to deduplicate it, and the straight-alpha conversion scanning every content pixel. - Composite the backdrop with saturating adds and skip 16-pixel blocks that are already opaque; skip blocks with no partly transparent pixel in the straight-alpha conversion. Same formulas, same bytes. - Keep the last opaque backdrops (up to 32 MiB of pixels) and hand the writer the same image again when a slide renders an identical backdrop. The writer stored equal backdrops once already; now it also skips hashing and compressing the copies. Output is byte-identical. deckcraft-cli bench, export .pdf step, 15 interleaved runs each on a 16-thread Ryzen (A/A noise +0.9 %): - sample x4 (32 slides): median 531 -> 322 ms (-39 %), min 529 -> 317 ms - same deck, every slide a different background: 557 -> 441 ms (-21 %) - sample (8 slides): 149 -> 103 ms (-31 %) Exported PDFs are byte-identical. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>