557 Commits
Author SHA1 Message Date
aiongg 713197635d Merge origin/main into prefs/gpu-adapter-typed-read 2026-11-01 13:16:28 +00:00
David Mann 89a5b25072 Merge main at 952c328b3 into integration batch 10 2026-10-31 00:05:12 +01:00
Dylan M. Taylor 952c328b3d Merge pull request #9893 from TaylorBurke/fix/screen-picker-xwayland-8977
Screen picker: a Wayland desktop picks through the portal when the window runs on Xwayland (#8977)
2026-10-30 14:42:04 -04:00
Dylan M. Taylor 9a6197dd6d Merge pull request #9894 from TaylorBurke/fix/extra-windows-app-id-6697
Extra windows share the main window's app id, so Wayland docks and window rules see them (#6697)
2026-10-30 14:38:48 -04:00
David Mann b2db24400e Merge main at b1cfff9d3 into integration batch 10
Conflicts resolved as unions of both sides: codecs re-exports (PngRows + TiffBands), smart_cmds source imports
(main's source_surface_from_buffer and cache API with #8571's svg_source_image_in/convert_svg_source; main's
duplicate rendering import dropped), io flat.rs test modules (#8536's banded TIFF tests and main's PNG ones),
menus/invoke.rs (#8571's smart SVG intercept and main's layer.selectUnderCursor), state.rs (#8311's
type_box_overflow and main's type_insertion_style), the canvas_geom test keeps the is_finite guard, docs
status lines keep both change lists, i18n catalogs keep both sides' rows (hi.tsv: main's wording where both
added the same string).
2026-10-30 14:28:02 +01:00
FredApps 0f120bbda1 Merge current main, reconcile streamed PNG profiles and workflow inputs 2026-10-30 06:52:05 +01:00
Dylan M. Taylor 249d126626 Update prompt shows the app icon and accent color instead of a letter (#10243)
UPDATE_APP (native builds; craft-update is a native-only dependency) carries our 128 px icon and accent (#2f7bf5, its colour in ArtCraft Launcher). The updater, the self-update
helper and craft-update's startup prompt all get them through crate::UPDATE_APP; the
prompt draws the icon, the accent and "by ArtCraft" (craft-update's default developer).

craft-update is pinned to storytold/craft-libs main at 1065653e7 (#434).
Clippy fixes for Rust 1.99 in untouched code (same logic):
- apps/photocraft/src/app_dirs.rs
- crates/codecs/src/codecs/via_image.rs
- crates/engine/src/canvas_geom/tests.rs
- crates/ui-egui/src/panels/blend_preview.rs
2026-10-30 01:27:27 -04:00
David Mann fea300dd4c Merge origin/main into integration batch 10 2026-10-30 01:47:01 +01:00
FredApps c93c0bb36d Merge main into trimmed integration; reconcile blur, pattern and Liquify behavior 2026-10-29 23:47:53 +01:00
aiongg cdb7ba0e21 Merge main into the integration batch 2026-10-29 21:46:27 +00:00
Dylan M. Taylor 0d9a0f6613 Enable update checks in Flatpak (#10206) 2026-10-29 17:24:04 -04:00
FredApps 63637c4d80 Merge current main into trimmed integration, preserving exclusions and interpolation behavior 2026-10-29 21:31:18 +01:00
David MannandClaude Opus 5.5 fefd90d576 Merge remote-tracking branch 'fork/integration-batch-10' into HEAD
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 19:16:12 +01:00
FredApps 255ecc81d0 Remove 21 requested PR contributions from the 108-PR integration
Retain 87 PRs. Reconcile overlapping integration fixes and update testing scope.
Removed: #7153 #7742 #5493 #9282 #3455 #9172 #3139 #3967 #4783 #5453 #8347 #1991 #3345 #4042 #4305 #4883 #4890 #5090 #6621 #5870 #5939.

Combined CI pending for this source; historical portable artifact is not applicable.
2026-10-29 18:49:17 +01:00
Federico Olivares 796ef557cc Merge main into the integration batch
Main's noop_step now takes the step's params (an Arrange that cannot move the layer is a no-op too); it is public for the CLI's run and batch, which pass them.
2026-10-29 14:19:54 -03:00
1acb1f464b Integration: SVG contents open and render as on main; AI originals for other editors (#8571)
- Smart-object contents (Replace Contents, Convert to Layers, Stack Mode,
  internal Edit Contents) refused any SVG whose canvas area times its
  node count passed 24 MP, e.g. a 1920x1080 layout with 12 shapes.
  decode_source now uses the bounded image parse with File > Open's
  layered import (import_svg_bounded_images). Convert to Layers' shape
  cache cap is 1 GiB in the document's format, the import's own budget,
  not 24 MP (four full-canvas shapes in a 4K document failed).
- The bounded resolver failed the whole drawing on an embedded image it
  can't read (an unknown MIME type, a corrupt PNG); it now leaves it out
  as usvg does, so such SVGs place and render again. Byte and decode
  overruns stay errors.
- resvg gives each embedded SVG image a scratch pixmap the size of its
  target and frees it after, so the scratch budget counts the deepest
  chain of nested SVG images, not every sibling: 12 SVG icons on a 2 MP
  canvas, or one at a 12 MP render, no longer fail.
- Main's shared nesting budget (#9397) now covers the bounded path too:
  511 + 511 levels across a drawing and its embedded SVG overflowed a
  1 MB stack.
- An AI working copy is regenerated through VectorCraft only when
  VectorCraft is the editor; Illustrator or another program gets the
  original bytes. VectorCraft is recognised by bundle id, a known
  install, or its name (vectorcraft[.exe], vectorcraft-<version> AppImage,
  ai.storyteller.vectorcraft).
- updateSvg refuses an AI/PDF/EPS source (updateVectorSource saves it
  back in its own format); the doc no longer calls updateSvg "existing".
- Edit Contents on contents already open in the internal editor switches
  to that document, as main does, instead of an error.
- Stack Mode on an SVG refuses up front when one float frame per layer
  would pass 1 GiB (the layered import no longer refuses for it).
- A stored display preview still fails on an embedded image it can't
  read (strict budget, its own import_svg_preview_with_work; external-
  editor saves and conversions leave the image out as placement does); skipped embedded SVGs still use up the XML byte
  budget; an image under an unknown MIME type or with no pixels is left
  out uncharged.
- Merge: the PSD import reads a preview's native source from the
  document's global blocks; main's owned open moves them out of the
  file, so every stored preview was dropped.
- Main's strict Clippy rules on the PR's app code (explicit import, a
  Unix-only test helper, one long opt-in test).

Co-authored-by: Mocky Digital <282319807+mockydevs@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 18:13:23 +01: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 Mann afacb057f7 Merge origin/main into pr-8571-fixup
Conflicts: svg.rs (main's bufread inflate and shared render helper, kept
with the PR's bounded raster path), psd_import.rs (the PR's vector
preview moved into main's smart_content), menus/invoke.rs (the SVG
intercept moved into main's split invoke_unguarded), rendering.rs and
the ui-egui import lists (main's explicit imports), Cargo.lock, docs
status lines (unions).
2026-10-29 16:38:24 +01:00
FredApps 2334a460f2 Verify export-only formats stay out of Open dialogs 2026-10-29 08:00:41 +01:00
FredApps f85bc4c545 Merge approved PhotoCraft PR #3387: feat(codecs): add lossless JPEG XL export for 8/16-bit images
Port behavior and regression coverage into current modules; preserve current upstream behavior.
Integrate lossless export-only JXL and independent decoder regression matrix, preserving current JPEG/TIFF save extensions and 12-bit/arithmetic JPEG decoder dependency.
2026-10-29 06:34:37 +01:00
FredApps 5cafc0968d Keep obsolete view command monolith deleted after modular form port 2026-10-29 05:39:24 +01:00
FredApps 425799851c Merge approved PhotoCraft PR #6492: Fail control startup promptly when its port is occupied
Port behavior and regression coverage into current modules; preserve current upstream behavior.
Prebound the listener inside current authorized control_setup before Linux display and GPU initialization, retaining integration preferences, workspace grants, authentication and single-instance routing. Preserved actual port logging, added occupied-port/prebound-dispatch regressions and bounded child cleanup to current process test harness.
2026-10-29 05:33:21 +01:00
FredApps 2f6156bebe Merge approved PhotoCraft PR #5090: Actions: add editable PhotoCraft Essentials starter presets
Port behavior and regression coverage into current modules; preserve current upstream behavior.
Register starter actions and bounded background-blur command in current modules; preserve persistent migration marker and portable JSON defaults compatibility.
2026-10-29 04:18:29 +01:00
FredApps 99b11de5d6 Merge approved PhotoCraft PR #9436: Startup: a failed launch says why in a dialog instead of closing silently (#7643) 2026-10-29 03:29:53 +01:00
FredApps e7e6ff1bf2 Merge approved PhotoCraft PR #4547: fix(icons): PhotoCraft icon corner radius matches other Craft apps (#4478) 2026-10-29 03:28:34 +01:00
David MannandClaude Opus 5.5 71dda79330 Web build: ask for the interface language's font when the manifest arrives
serve_fonts asks for the interface language's served script font once per
language, but the font manifest loads asynchronously: when the first frame
ran before it arrived, no fallback was registered yet, the request found
nothing, and an Arabic interface on an English browser stayed without its
font until the language changed. The manifest load now asks for the
interface language's font along with the browser languages'.

Review finding on #10006.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:41:38 +01:00
Federico Olivares 50f4602c33 Merge main into the integration batch 2026-10-28 18:20:58 -03: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
Dylan M. Taylor 2fccdcba8e Correct update_transport comment: Flatpak sandbox now has network (#9983) 2026-10-28 13:21:15 -04:00
Khawar Zamman Wani 64422e7ef1 Merge main into save-for-web-webp 2026-10-28 21:09:35 +05:30
Federico Olivares 5a6270921c Merge main into the integration batch
Main now carries #9031 (Halftone) and #8923; this branch keeps only what it adds on top: the guard for a setting beside a Gallery stack's effect list, its test, and the PSD open warning for patterns that paint nothing.
2026-10-28 11:17:59 -03:00
Dylan M. Taylor a9fa2d4673 Refactor photocraft app startup for strict Clippy checks 2026-10-28 01:06:43 +00:00
RickiNanoandClaude Opus 5.5 599b85a7cd Merge main into prefs/gpu-adapter-typed-read
Integration batch 9 (#9775) raised the preference count to 181 and
added its own 2026-10-27 status lines and history rows to gaps.md and
ui-parity.md. Both sides are kept: the scorecard regenerates to 11 of
181 do nothing, the branch's entries say 181 and are dated 2026-10-27,
above main's 12-of-181 rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 22:30:17 +01:00
Taylor BurkeandClaude Opus 5.5 af31ea090a Extra windows share the main window's app id, so Wayland docks and window rules see them (#6697)
Document windows (Window › New Window), Camera Raw and the screen color
picker were built from ViewportBuilder::default() with no app id, so on
Wayland their class was empty: Hyprland rules couldn't match them and docks
couldn't map them to the .desktop file. They now use the same app id as the
main window, defined once in photocraft_ui_egui::os_window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:31:30 -05:00
Taylor BurkeandClaude Opus 5.5 c139d3dbe6 Screen picker: a Wayland desktop picks through the portal when the window runs on Xwayland (#8977)
With a pen attached, or Preferences › Performance › Linux display server set
to X11, the window opens through Xwayland on a Wayland desktop. The picker
followed the window's display server and grabbed Xwayland's root window,
which holds no desktop pixels: GetImage failed with BadMatch. Choose the
backend from the desktop session instead, so Wayland always uses the
portal's PickColor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:44:34 -05:00
RickiNanoandClaude Opus 5.5 3aff459ad8 Merge main into prefs/gpu-adapter-typed-read
Picks up the export speed work (#9877) and the rest of main. Main's
prefs audit now counts 180 preferences, so the regenerated scorecard
reads 11 of 180 do nothing, and the branch's doc entries say 180 to
match; the 2026-10-25 history rows keep their 178.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 20:27:58 +01:00
David MannandClaude Opus 5.5 f56ae19522 Integration: Save As from an opened .pgm suggests .pnm on every platform (#3609)
CodeRabbit on #9775: the Linux portal swaps the extension for the picked type, but macOS and rfd keep the suggested name, so an opened image.pgm could still be saved as image.pgm holding P6 data. The suggested name itself now takes .pnm for any Netpbm subtype; the services test fails without it.

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 9426231d72 Integration: Save As from a Netpbm subtype's name starts on .pnm (#3609)
CodeRabbit on #9775: save_filters adds an unlisted suggested extension as its own type, so Save As on an opened .pgm offered .pgm again, though the encoder writes P6 for an RGB document. A suggested .pbm/.pgm/.ppm/.pam/.pfm now starts on the Netpbm type as .pnm; the services test checks every subtype name and fails without this.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 19:13:57 +01:00
RickiNanoandClaude Opus 5.5 5558e4a2d0 Merge main into prefs/gpu-adapter-typed-read
Main split crates/engine/src/prefs.rs into prefs/ and moved the
gpu_startup tests to gpu_startup/tests.rs: read_section now sits beside
read_lenient in prefs/store.rs, and the malformed-sibling assertions
moved with the tests. Doc status lines and revision rows keep both sides.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 18:32:23 +01:00
David MannandClaude Opus 5.5 11528118e7 Integration: Save As offers Netpbm as .pnm only (#3609)
CodeRabbit on #9775: the encoder picks P5/P6/P7/PFM from the image, not the name, so a .pbm, .pgm or .pfm picked in Save As held other data (an RGB document as P6 in a .pbm). Only the neutral .pnm is offered; File > Open still reads every Netpbm extension.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-27 18:18:48 +01:00
Federico Olivares e173a9be17 Merge main into the integration batch
Main reorganised the source tree (command modules under engine/src/cmd, tools and dialogs under ui-egui/src, large files split into modules, inline test modules moved to their own files). This branch's changes to the moved and split files are ported to their new locations.
2026-10-27 10:44:16 -03:00
48b42979c8 Integration: Netpbm Save As row leads with .pnm, Open lists .pnm/.dib, save test (#3609)
Picking Netpbm for a bare name (Untitled) took the row's first
extension, .pbm, though the codec writes P6/P7/PF from the image, never
a 1-bit PBM: an RGB document saved as x.pbm holding P6 data. The row now
starts with .pnm. File › Open didn't list .pnm or the new .dib alias, so
a file Save As had just written was hidden in the Open dialog; both are
now in All Formats and their own type. The test checks every new type
and alias is offered, the Netpbm row's first extension, that Open lists
every extension Save As writes, and what Save As writes to .pnm (P6) and
.hdr (#?RADIANCE), as asked in review.

Co-authored-by: buivanvu94 <125793064+buivanvu94@users.noreply.github.com>
Co-authored-by: tanish2k09 <13985398+tanish2k09@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 14:38:26 +01:00
David Mann f3e422f7ae Merge remote-tracking branch 'origin/main' into pr-3609-fixup
# Conflicts:
#	apps/photocraft/src/services.rs
2026-10-27 14:29:13 +01:00
dotCooCoo 655a81fc92 Merge main and accept SVG clipboard text after long XML preambles 2026-10-27 06:20:02 -07:00
Don Omondi e53f822032 Retry SVG saves that change during a read without reporting an error
When the working file changed between settling and reading, the watcher
sent "The SVG is still being saved" to the UI as an error. Treat that
result as a retry: clear the pending stamp so the new save settles again,
and send nothing. Other read errors are still reported once.

Tests cover the retry, single reporting of other errors, queue
backpressure and receiver drop, and a stress run of atomic replacements
that must deliver only complete saves ending with the final one.
2026-10-27 14:29:53 +03:00
Don Omondi 285770532b Merge main into embedded vector save-back
Resolve conflicts with the engine's cmd/ module move and the per-crate
integration test binaries. Run a selected VectorCraft.app bundle directly
(identified by bundle id) and reject nested gzip in bounded SVG parsing.
2026-10-27 11:59:56 +03:00
Khawar Zamman Wani ba43eb3ea5 Merge origin/main into save-for-web-webp 2026-10-27 09:44:59 +05:30
Don OmondiandClaude Opus 5.5 4c76339c36 Address CodeRabbit review: macOS app bundles, label, digest cache, SVG warp bounds
- External vector editing on macOS: discover VectorCraft.app in /Applications and
  ~/Applications, offer Illustrator when an Adobe Illustrator*.app is found, and accept a
  chosen .app under Other application. CFBundleExecutable is read from a bounded Info.plist
  (XML or binary, streamed with a nesting cap) and must resolve inside Contents/MacOS;
  chosen bundles open with /usr/bin/open -a. vectorcraft-cli is looked for in the same
  bundle, then in known installs. Logic is compiled and unit-tested on every Unix.
- Windows "not found" errors name the dialog's "Other application" option.
- Native preview hash verification is remembered per source allocation in a 32-entry
  Weak-keyed LRU (no strong references, no reusable stale addresses, lock not held
  while hashing), so refreshes and warp frames hash a shared source once.
- source_box uses the new io::svg::bounded_canvas_bounds for SVG without Stack Mode, so
  warp setup gets a frame for drawings whose editable layer caches exceed the budget.
  Stack Mode and Edit Contents stay strict. Exact 24,000,000-pixel boundary tested.
- Document every non-test function this PR adds; describe macOS behaviour in
  docs/embedded-vector-editing.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 03:02:40 +03:00
aiongg 411771a737 refactor(photocraft): move gpu_startup.rs tests to gpu_startup/tests.rs 2026-10-26 22:30:14 +00:00