Commit Graph
1509 Commits
Author SHA1 Message Date
Harrison Booth faf4c0ee52 fix(format): Reflection slider with only focus does not re-add the reflection
A reflection slider that had focus and lost it to the None button committed its stale value.
Commit on focus loss only after an edit the user made, and cover it with a kittest.
2026-10-27 19:10:49 -05:00
Harrison Booth 952e4db95f Merge remote-tracking branch 'origin/main' into dc-fix-reflection
# Conflicts:
#	crates/ui-egui/src/panes.rs
2026-10-27 18:47:18 -05:00
aiongg 55e5ee56b4 Merge pull request #1434 from Jeremy8776/feat/install-scope-policy
Windows installation policy: DeckCraft
2026-10-27 17:09:15 -04:00
aiongg f2f4dfabc0 ci: use storytold/craft-common-actions at the merged installer-policy commit 2026-10-27 20:51:55 +00:00
Jeremy 8cb3365596 fix(installer): check the exact architecture-specific machine folder
The pre-signing check matched any folder named Program Files, so it rejected
a valid MSI when Windows resolves Program Files elsewhere, accepted the 64-bit
root for an x86 package and accepted a different app name. Build the expected
folder from the package architecture's resolved root and the policy name.
2026-10-27 19:08:41 +00:00
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
NetterSilverandClaude 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
NetterSilverandClaude 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
Jeremy 8445d98e24 fix(installer): resolve the wizard scope and folder correctly
Real msiexec runs (per-user and all-users, silent and wizard) found two defects
that the metadata fixtures cannot see:

- "Only for me" published ALLUSERS=2, so FindRelatedProducts treated the run as
  per-machine and skipped the existing per-user copy. An interactive upgrade
  left two registered products and uninstall left files behind. The page now
  leaves ALLUSERS unset for a per-user choice.
- Windows Installer resolves Program Files once, for the context it started in,
  so choosing "Everyone" in the wizard installed into the user profile with a
  machine-wide registration. The wizard now sets the new-install folder itself
  after the choice (Program Files, Program Files (x86) for 32-bit, or the
  per-user Programs folder). Silent installs are unchanged.

check-install-policy.ps1 now fails if either regresses.
2026-10-27 15:32:16 +00: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
Jeremy 428c8809ea fix(installer): harden install-policy checks and packaging-lint workflow 2026-10-27 12:00:56 +00:00
Jeremy abee4d7522 fix(installer): address scope and ARM64 review feedback 2026-10-27 12:00:56 +00:00
Jeremy 4d9b325d35 feat(installer): default to a per-user ArtCraft folder 2026-10-27 12:00:56 +00: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
Harrison Booth 1b2e5ea9e0 fix(format): keep explicit slider edits, skip only the rounding 2026-10-26 17:36:59 -05:00
Harrison Booth 5a28760b1e fix(format): Reflection None clears after another preset (#1356)
The effect sliders rounded 55.000000000000007 to 55 and read that as a change,
so each frame re-added the reflection the None button had just cleared.
2026-10-26 17:29:31 -05: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