Commit Graph
1554 Commits
Author SHA1 Message Date
Dylan M. Taylor 0d9a0f6613 Enable update checks in Flatpak (#10206) 2026-10-29 17:24:04 -04:00
aiongg c645d5fcc9 Merge pull request #8896 from wanikhawar/select-mask-workspace
Select and Mask: Photoshop's full-window workspace (#7069, #8148)
2026-10-29 12:15:14 -04:00
aiongg 2231233af9 Merge pull request #6590 from wanikhawar/fix/6501-multi-layer-free-transform
Free Transform moves every selected layer (#6501, #3384, #6096)
2026-10-29 12:14:01 -04:00
aiongg 3bcff338c5 Merge pull request #6421 from wanikhawar/save-for-web-webp
Save for Web: WebP, lossy at its Quality or lossless (part of #6391, #2415)
2026-10-29 12:12:47 -04:00
David MannandClaude Opus 5.5 f66f749f96 Merge main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:18:30 +01:00
David MannandClaude Opus 5.5 15dc4092f8 Web build: served script fonts draw the interface too
The web build has no system fonts and embeds no craft fonts, so an Arabic
(or Japanese, Chinese, Korean, Hindi) interface had no font for its labels:
served fonts were registered only in the document text engine. A served
script fallback now also joins the end of every egui font family, and the
font stack theme::install_fonts rebuilds on a language change includes it
again. The web shell asks for the interface language's script font, not
only the browser languages'.

Review finding on #10006.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:18:28 +01:00
aiongg e2f9ae6bfb Merge main into perf/9328-slow-frames
Conflicts in perf/budgets.toml and docs/scorecard.md: both sides added perf rows (P80 here, P81 and P82 from #9942). Kept all three; scorecard regenerated with cargo xtask scorecard.
2026-10-28 20:30:50 +00:00
bd9590d060 Arabic interface language, combined from the community catalogs
Adds Arabic (ar, العربية) as an interface language. The catalog combines
the open Arabic catalogs of #2505, #4520, #4569, #5593, #5915, #6092 and
#6287: each row takes the best of their translations, with one Arabic
term per concept across the UI, and the strings added since are filled
in. Modern Standard Arabic, Western digits, the six CLDR plural forms
(zero|one|two|few|many|other).

The two tests that used ar-SA as an unsupported locale now use sw-KE, and
the direction test expects Arabic to be the one right-to-left catalog.

Co-authored-by: azizr12 <163084230+azizr12@users.noreply.github.com>
Co-authored-by: hicbest <213873494+hicbest@users.noreply.github.com>
Co-authored-by: hasan-sdaif <306196098+hasan-sdaif@users.noreply.github.com>
Co-authored-by: NibrasAz7 <34162952+NibrasAz7@users.noreply.github.com>
Co-authored-by: vfggf95565 <74471233+vfggf95565@users.noreply.github.com>
Co-authored-by: syrrevshin4202-prog <243624842+syrrevshin4202-prog@users.noreply.github.com>
Co-authored-by: test-bit-sys <336050374+test-bit-sys@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:22:26 +01:00
Khawar Zamman Wani 64422e7ef1 Merge main into save-for-web-webp 2026-10-28 21:09:35 +05:30
Brennan StehlingandClaude Opus 5.5 a9c26551f1 perf: add P81/P82 redraw-area rows on full-canvas layers (#9329)
Track-only rows that check they hit the whole-document-redraw path and
print the refreshed pixel count: undo of a brush dab on a 16-bit
15000x10000 full-canvas layer (reps capped at 5) and a fill of a 2 %
selection on a 24 MP full-canvas layer.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 23:08:30 -07:00
Brennan StehlingandClaude Opus 5.5 ce8f3e719e Docs: perf.slowFrames, and the stroke trace reads the shared frame stages (#9328)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 23:08:06 -07:00
Brennan Stehling 00522c852e Perf: P80, app frame time for a full CPU refresh of a 24 MP document (#9328)
Track-only row, the slow-frame recorder's worst case. A 24 MP photo plus
three full-canvas blended copies (Multiply, Screen, Overlay); each sample
toggles the top copy and times one harness.step(), so every frame
recomposites all 24 MP on the CPU (the photo's tiles are never uniform,
which keeps the reduced render's one-colour shortcut out of the way).
The row errors unless each frame recorded a CPU refresh covering at least
95 % of the canvas, so it can't silently take a fast path. 10 samples.
2026-10-27 23:06:56 -07:00
aiongg d453c7d12b Merge pull request #9564 from brennanMKE/perf/7494-baseline-guard
xtask perf: a baseline knows how trustworthy it is (#7494)
2026-10-27 23:56:45 -04:00
Khawar Zamman Wani e729ead4b2 Merge origin/main into fix/6501-multi-layer-free-transform 2026-10-28 09:22:55 +05:30
Khawar Zamman Wani 4e22d214dc Merge origin/main into select-mask-workspace 2026-10-28 09:22:54 +05:30
aiongg b4e69af424 Merge main into perf/9328-fallback-reason 2026-10-28 03:00:01 +00:00
aiongg a9e6f73ac5 Merge remote-tracking branch 'upstream/main' into HEAD 2026-10-28 02:31:52 +00:00
aiongg 386b7b8d8e Merge pull request #9565 from brennanMKE/perf/7494-cliff-rows
Perf: cliff rows for the CPU compositor, Advanced Blending, adjustment toggles, over-budget and huge documents (#7494)
2026-10-27 22:31:34 -04:00
aiongg eb6c1abf75 Merge pull request #9756 from Jeremy8776/feat/install-scope-policy
Windows installation policy: PhotoCraft
2026-10-27 17:57:55 -04:00
Brennan StehlingandClaude Opus 5.5 e43762ac0d Perf: rename P79 to the reduced composite it times (#7494)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 14:38:45 -07:00
Brennan Stehling 5b057e2247 Scorecard: regenerate for the cliff rows (#7494) 2026-10-27 14:38:45 -07:00
Jeremy 768ca7ce63 docs(installer): limit the silent per-user default to new installs
Maintenance keeps the existing installation context, and a major upgrade of an
existing per-machine installation without ALLUSERS=1 is rejected rather than
installed per-user.
2026-10-27 21:13:30 +00:00
David MannandClaude Opus 5.5 1992cfcb9c Integration: parity docs dated 2026-10-27 with a history row for the scorecard count
CodeRabbit on #9775: the 12-of-181 count changed today, so ui-parity.md and gaps.md get the date in their status lines and a revision-history row, as AGENTS.md asks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 20:21:26 +01:00
David MannandClaude Opus 5.5 5ccb6fb723 Merge main
Conflicts with main's batch #9880:
- psd file.rs / layer.rs: #5287 (PSB by encoded size, RLE tables widened on
  promotion) against #6583's lazy reader. Main's new widening and length code
  read `.data`, which #6583 leaves empty while the bytes stay in the source;
  it now goes through `encoded()` / `encoded_len()` (also the auto-merged
  lines in `rle_widening`, `encoded_len` and `LayerRecord::write`), and the
  lazy reader sets `write_as_psb: false`. New test
  `a_lazy_psd_promotes_to_the_same_psb_as_an_eager_one`: a lazily read PSD
  writes the same PSB bytes as an eager one; it fails with a `.data` read.
- direct_select.rs / vector_ui.rs: #9321's Type Path and #6353's hidden
  Work Path both kept.
- io tests main.rs: both modules. scorecard.md regenerated (12 of 181);
  ui-parity.md and gaps.md follow it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 19:49:42 +01:00
David MannandClaude Opus 5.5 c955e51b7f Integration: the parity docs name the locked-group exception for new layers (#4329)
CodeRabbit on #9775: Place::AutoEditable puts type, shapes, pastes, placed files and frames above a group whose lock would refuse them; ui-parity.md's status line and checklist row said every new layer goes into an open active group.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 19:13:57 +01:00
aiongg c1f3219dfb Merge #9445: Automation: refuse to replace a non-image file in the write root (#9439) 2026-10-27 17:44:26 +00:00
David MannandClaude Opus 5.5 199092edfd Integration: a failed favourite toggle shows as an error; preference count from the scorecard (#6526)
CodeRabbit on #9775: FontLibrary::finish wrote a failed type.font.favorite to the status bar as plain information; it now sets status_error like the other status writes. The regenerated scorecard counts 12 of 179 preferences that do nothing; ui-parity.md and gaps.md still said 178.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 18:18:49 +01:00
David Mann b731cdf9eb Merge PR #4329: Layers: New Group dialog and modifiers; new layers go into an open group and join its clip group
# Conflicts:
#	docs/ui-parity.md
2026-10-27 16:14:37 +01:00
David Mann 33e3fa2f8e Merge PR #6526: Font menu: favourites, recent fonts, class and similar-font filters, live preview 2026-10-27 15:53:56 +01:00
David MannandClaude Opus 5.5 6fcbedd229 Merge origin/main into pr-4329-fixup
Main moved the engine commands into crates/engine/src/cmd/ and the
dialogs and panels into submodules. The PR's placement calls follow
them, and main's new insert sites (new_adjustment in adjust_params.rs,
Place in file_cmds/open.rs, shapes in vector_cmds/shape.rs) use
layer_place::insert_new like the PR's originals. The New Group dialog
moves to dialogs/new_group_ui.rs; the Layers panel flyout's New Group…
opens it.

Main's Session::precheck now also checks layer.new.group's and
layer.new.groupFromLayers' new params (name, color, mode, opacity,
position), so precheck_agrees_with_execute holds. Main had since added
"New Group…" to every catalog: the PR's duplicate rows are dropped.
Main's newer tests that made a layer with an open group active now
open the group last, as the PR did for the older ones.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:22:03 +01:00
e3b2854838 Integration: font menu fix-ups after merging main (#6526)
- Character section: a style picked under a family's ">" with type layers
  selected set the layers but not the style for new type (the options bar
  did both). Pick "Inter > Thin" in Properties > Character: new type stayed
  Regular.
- Faux bold: a pointed tip moved r/sin(half its angle) along its bisector,
  uncapped (3.9 r at 30 degrees, an A apex grew a spike), and tips sharper
  than about 20 degrees did not move at all. Every tip now moves at most
  2r, continuously; inner corners (the crotch of a V) keep their exact
  miter.
- Faux bold: each point searched past runs of coincident points for its
  neighbours, O(n^2); a contour of 50 000 copies of one point took ~8 s per
  glyph. Neighbours now come from one O(n) pass over the runs.
- prefs.reset {"path":"type"} and Preferences > Type > Reset Section wiped
  the favourite fonts; they are kept now (type.favoriteFonts by name, or
  Reset All, still clear them).
- An expanded family whose own row scrolled out of view lost its style
  rows, so the list below jumped up.
- Show Similar Fonts re-sorted around each font an arrow step applied, so
  Down went back and forth between two fonts; the list now compares with
  the font current when the filter was turned on (or the menu opened).
- Docs: an uninstalled favourite is kept but not listed; FAUX_BOLD_RADIUS
  and the raster budget describe the thickened outline; the unused
  "Recent font list" rows are gone; docs/scorecard.md regenerated (the
  favourite fonts are one more setting).

Co-authored-by: D-monized <341904702+D-monized@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:52:20 +01:00
David Mann 3a689f217c Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	crates/engine/src/file_cmds.rs
#	crates/engine/src/retouch_cmds.rs
#	crates/engine/src/vector_cmds.rs
#	crates/io/src/psd_export.rs
#	crates/io/src/psd_import.rs
#	crates/io/src/smart_map.rs
#	crates/psd/src/layer.rs
#	crates/raster/src/lib.rs
#	crates/ui-egui/src/camera_raw_ui.rs
#	crates/ui-egui/src/canvas.rs
#	crates/ui-egui/src/filter_dialog.rs
#	crates/ui-egui/src/gpu_canvas.rs
#	crates/ui-egui/src/panels.rs
#	crates/ui-egui/src/retouch_ui.rs
#	crates/ui-egui/src/transform_tool.rs
#	crates/ui-egui/src/vector_ui.rs
#	docs/gaps.md
2026-10-27 14:26:26 +01:00
David Mann dc45a83c88 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	crates/automation/src/rpc.rs
#	crates/automation/src/workspace.rs
2026-10-27 14:20:28 +01:00
David Mann 718636e55e Merge remote-tracking branch 'origin/main' into fix/history-options 2026-10-27 14:16:11 +01:00
Jeremy 6599f6dbd2 docs(installer): say that silent installs are per-user and when the scope page appears 2026-10-27 12:26:56 +00:00
Jeremy e51f604ea4 docs(installer): note that the 32-bit all-users folder is Program Files (x86); tidy wording 2026-10-27 12:25:20 +00:00
Jeremy 94e13c9e6f docs(installer): describe the per-user default install location and scope 2026-10-27 12:09:03 +00:00
Jeremy bf4e8214fc fix(installer): correct the wizard and shortcut description in the release docs; harden install-policy checks 2026-10-27 12:01:33 +00:00
Jeremy 9956352be0 packaging(windows): dual-scope MSI, per-user by default, under the ArtCraft suite folder
Microsoft "Single Package Authoring": Package/Scope="perUserOrMachine"
writes ALLUSERS=2 and MSIINSTALLPERUSER=1, so the package installs
per-user by default (no UAC prompt) into %LOCALAPPDATA%\Programs\ArtCraftPhotoCraft (Windows Installer redirects the ProgramFiles folder in a
per-user install), and per-machine into Program Files\ArtCraft\PhotoCraft
through the setup wizard's "Install for all users" box or msiexec
ALLUSERS=1. Registry follows the context automatically: HKMU writes HKCU
per-user and HKLM per-machine, HKCR classes land in HKCU\Software\Classes
per-user, and components are keyed on registry values (ICE38).

Upgrades update the copy registered in the same context: the remembered
InstallDir is read from HKLM and HKCU separately, and installing in the
other context while a copy already exists is stopped with a message naming
the fix rather than creating a silent duplicate. The existing UpgradeCode,
ProductCode behaviour and per-machine upgrades are unchanged.

The Start Menu shortcut becomes non-advertised in its own component (an
advertised shortcut must target its component keypath, which is now a
registry value), as the ArtCraft Launcher's MSI already does.

Built and checked with WiX 5.0.2: full ICE validation and ICE50 pass, and
the built package's Property table, launch conditions, directory chain and
registry roots were read back from the MSI.
2026-10-27 12:01:33 +00:00
Brennan StehlingandClaude Opus 5.5 b0688ee9a3 Render path: the status bar names a non-memory reason, and perf.gpuFallback follows the active document (#9328)
A reason other than the memory budget (a flipped view, Advanced Blending…)
now shows "CPU Rendering" even while the measured layer fit is over the
budget. perf.gpu_fallback is set in one place from the active document's
reason, also each frame after a switch of document, so a refresh of an
arranged cell or another window can't make it disagree with
perf.renderPath's current. The control protocol says a history entry's doc
is the changed document's id, or 0 for every document.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 02:07:25 -07:00
Brennan Stehling ae043f50a0 Render path: the adjustment preview's CPU-proxy reason has its own slot (#9328)
A clipped or Blend If adjustment preview runs on the CPU proxy. Its reason
lives in a slot of its own, separate from the canvas's per-document reasons
and the app-wide reason, so closing or retargeting the dialog ends only the
preview's entry and can never report the canvas back on the GPU.
2026-10-27 02:07:25 -07:00
Brennan StehlingandClaude Opus 5.5 63b718a0b3 Docs: perf.renderPath in the control protocol and the development guide (#9328)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 02:07:25 -07:00
Khawar Zamman Wani 67172a9d08 Merge origin/main into fix/6501-multi-layer-free-transform 2026-10-27 11:57:10 +05:30
Khawar Zamman Wani 26d0b9c41c Merge origin/main into select-mask-workspace 2026-10-27 11:55:36 +05:30
aiongg a27436adcb Merge main into perf/selection-morphology
Resolves the move of crates/engine/src/selection_cmds.rs to cmd/selection_cmds.rs: the two hunks apply at the new path, and modify_window.rs with its tests moves under cmd/selection_cmds/.
2026-10-27 04:27:45 +00:00
Khawar Zamman Wani ba43eb3ea5 Merge origin/main into save-for-web-webp 2026-10-27 09:44:59 +05:30
Khawar Zamman Wani 2c2faad9ae Merge origin/main into fix/6501-multi-layer-free-transform 2026-10-27 09:42:36 +05:30
Khawar Zamman Wani c8e4c4fd5f Merge origin/main into select-mask-workspace 2026-10-27 09:32:39 +05:30
David MannandClaude Opus 5.5 69d6037f57 Merge main into fix/history-options
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 02:53:17 +01:00
David Mann 63e2c7d100 Merge PR #9031: fix(io): preserve Halftone Pattern smart filters in PSD/PSB
# Conflicts:
#	docs/file-format-parity.md
#	docs/gaps.md
2026-10-27 02:23:29 +01:00