aiongg
88c2ceff5f
Merge pull request #1461 from Silvertree2010/perf/export-speed
...
Speed up PDF export by reusing equal slide backdrops
2026-10-27 13:42:02 -04:00
NetterSilver and Claude Opus 5.5
2f4a6d906a
Speed up PDF export by reusing equal slide backdrops
...
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 >
2026-10-27 17:39:31 +01:00
NetterSilver and Claude Opus 5.5
53e183495b
Time PDF export over all bench runs
...
`deckcraft-cli bench` capped the "export .pdf" step at three runs while
its help promises the median of N runs for every step. Use --runs for
it too, so a PDF export benchmark can take enough samples to beat noise.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-27 16:43:29 +01:00
aiongg
2c9edcc394
refactor(ui): use craft-ui's ComboBox for every dropdown ( #1457 )
...
* ui: use craft_ui::ComboBox so dropdown menus grow back (egui#5225); repin craft-libs
* chore(deps): craft-libs 60d60d48 (dropdown fixes)
* chore(deps): craft-libs 6af63481 (dropdown fixes)
* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)
* chore(deps): craft-libs 92d392cf (#387 merged)
* chore(xtask): pdf-deps expects craft-libs 92d392cf
2026-10-27 10:26:51 -04:00
aiongg
ee875abffa
Merge pull request #1433 from aiongg/layout
...
refactor: shared module layout (craft-contrib#20)
2026-10-26 21:30:28 -04:00
skylar taylor-barrick
020e53e7a0
Merge pull request #1429 from storytold/fix/nextest-0.9.150
...
ci: require nextest 0.9.150
2026-10-26 17:35:27 -06:00
aiongg
12001d14e7
refactor(engine): split cmd/shape.rs into cmd/shape/{size,appearance,picture,freeform}.rs
2026-10-26 22:10:40 +00:00
aiongg
bbf7a8b8c7
docs: update source paths after the module layout moves
2026-10-26 22:08:44 +00:00
aiongg
96f0ac204e
test(engine): read past #[cfg(test)] imports in the file-system scan
2026-10-26 22:08:44 +00:00
aiongg
6b57773373
refactor(geom): split preset.rs into preset/{catalog,builder,build,shapes}.rs
2026-10-26 22:08:44 +00:00
aiongg
838d51ed59
refactor(text): split lib.rs into {run,style,autonum,shape,symbol,breaking,layout}.rs
2026-10-26 22:08:44 +00:00
aiongg
5b02b1744c
refactor(render): split lib.rs into {raster,opts,slide,renderer,geometry,stroke,text_draw}.rs
2026-10-26 22:08:44 +00:00
aiongg
8b456dce41
refactor(engine): split tools.rs into tools/{hit,pointer,drag,click,geometry}.rs
2026-10-26 22:08:44 +00:00
aiongg
15bf821535
refactor(engine): split cmd/text.rs into cmd/text/{ime,layout,editing,autocorrect,caret,formatting}.rs
2026-10-26 22:08:44 +00:00
aiongg
d7c06b53eb
refactor(engine): split cmd/smartart.rs into cmd/smartart/{nodes,paint,layout,diagrams,edit}.rs
2026-10-26 22:08:44 +00:00
aiongg
97b98767f1
refactor(engine): split cmd/insert.rs into cmd/insert/{picture,album,chart,text_fields,links}.rs
2026-10-26 22:08:44 +00:00
aiongg
d5180fbb70
refactor(engine): split cmd/format.rs into cmd/format/{font,text_effects,paragraph,painter,ruler}.rs
2026-10-26 22:08:44 +00:00
aiongg
9c222be711
refactor(engine): split cmd/design.rs into cmd/design/{colors,slide_background,slide_setup,master_view}.rs
2026-10-26 22:08:44 +00:00
aiongg
28371e27d7
refactor(ui-egui): split backstage.rs into backstage/{files,info,print}.rs
2026-10-26 22:08:44 +00:00
aiongg
4bdd5b5bee
refactor(ui-egui): split icons.rs into icons/{geometry,draw}.rs
2026-10-26 22:08:44 +00:00
aiongg
99688fe45a
refactor(ui-egui): split show.rs into show/{render,keys,ui,media,presenter,zoom}.rs
2026-10-26 22:08:44 +00:00
aiongg
ada66524a2
refactor(ui-egui): split panels.rs into one file per pane under panels/
2026-10-26 22:08:44 +00:00
aiongg
e84ba9def1
refactor(ui-egui): split ribbon.rs into one file per tab under ribbon/
2026-10-26 22:08:44 +00:00
aiongg
9545ff4d61
refactor(ui-egui): move the zoom, trim, about and alt-text test modules to their dialog files
2026-10-26 22:08:44 +00:00
aiongg
c8a6363a0f
refactor(ui-egui): split dialogs.rs into one file per dialog under dialogs/
2026-10-26 22:08:44 +00:00
aiongg
462310faed
refactor(ui-egui): split canvas.rs into canvas/{input,scroll,ime,media,rulers,guides,overlays,context_menu}.rs
2026-10-26 22:08:44 +00:00
aiongg
d428b4804a
refactor(ui-egui): move the backstage test files beside backstage.rs
2026-10-26 22:08:44 +00:00
aiongg
9ab4ed9581
refactor(ui-egui): move the sorter test files beside sorter.rs
2026-10-26 22:08:44 +00:00
aiongg
a094f37ed9
refactor(ui-egui): move the ribbon test files beside ribbon.rs
2026-10-26 22:08:44 +00:00
aiongg
742e660afd
refactor(ui-egui): move the dialogs test files beside dialogs.rs
2026-10-26 22:08:44 +00:00
aiongg
8338e21ecf
refactor(ui-egui): move the canvas test files beside canvas.rs
2026-10-26 22:08:44 +00:00
aiongg
7ab59a0cd3
refactor(ui-egui): move qat to ribbon/qat.rs
2026-10-26 22:08:44 +00:00
aiongg
a730e66757
refactor(ui-egui): move updates_ui to dialogs/updates_ui.rs
2026-10-26 22:08:44 +00:00
aiongg
ac3c3b7b2a
refactor(ui-egui): move credits to dialogs/credits.rs
2026-10-26 22:08:44 +00:00
aiongg
1368d06eeb
refactor(ui-egui): move squiggles to canvas/squiggles.rs
2026-10-26 22:08:44 +00:00
aiongg
af61c1cf3a
refactor(ui-egui): move preview to canvas/preview.rs
2026-10-26 22:08:44 +00:00
aiongg
099dfa7670
refactor(ui-egui): move the panels test files beside panels.rs
2026-10-26 22:08:44 +00:00
aiongg
d1022cdaa4
refactor(ui-egui): move animtimeline to panels/animtimeline.rs
2026-10-26 22:08:44 +00:00
aiongg
dcd06db2d3
refactor(ui-egui): move fillui to panels/fillui.rs
2026-10-26 22:08:44 +00:00
aiongg
82fb8e7680
refactor(ui-egui): move notes to panels/notes.rs
2026-10-26 22:08:44 +00:00
aiongg
59e4b272d8
refactor(ui-egui): move selpane to panels/selpane.rs
2026-10-26 22:08:44 +00:00
aiongg
62aa7aa437
refactor(ui-egui): move thumbs to panels/thumbs.rs
2026-10-26 22:08:44 +00:00
aiongg
af9b8c1adb
refactor(ui-egui): rename panes to panels
2026-10-26 22:08:44 +00:00
aiongg
d6026de7c2
refactor(ui-egui): move SlideApp method groups to app/{commands,files,ime,input,keys,playback,clipboard,frame,control}.rs
2026-10-26 22:08:44 +00:00
aiongg
d9199598e1
refactor(ui-egui): move SlideApp methods to app.rs and lib.rs types to services.rs, state.rs, clock.rs, ime_hooks.rs
2026-10-26 22:08:44 +00:00
aiongg
a2194407a1
refactor(media): move player tests to player/tests.rs
2026-10-26 22:08:44 +00:00
aiongg
b440c2ff40
refactor(geom): move preset tests to preset/tests.rs
2026-10-26 22:08:44 +00:00
aiongg
65a3ddc8f0
refactor(format): move lib.rs tests to tests.rs
2026-10-26 22:08:44 +00:00
aiongg
00eb5caad6
refactor(fonts): move lib.rs tests to tests.rs
2026-10-26 22:08:44 +00:00
aiongg
50feadc965
refactor(deckcraft): move control_server tests to control_server/tests.rs
2026-10-26 22:08:44 +00:00