photocraft/crates/engine/src
Brandon Thomas d64f809e4d
Layer via Copy, Copy and Cut read only the selected area: 33x faster on 24 MP (#668) (#985)
lift() converted the whole layer to a format with alpha before reading the
selection's rectangle, so on a 24 MP Background every Layer via Copy cost about
a second whatever the selection's size, and it sampled the selection mask one
pixel at a time. It now reads just that rectangle and the mask's rectangle.

6000x4000 Background, 2000x1500 selection, release: Layer via Copy 984 ms ->
30 ms. Select All then Layer via Copy: 212 ms.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 03:17:48 -04:00
..
adjust_cmds Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
analysis_cmds Analysis, notes, proof views, workspaces (+ in-progress work of other agents) 2026-10-01 22:49:07 -04:00
artboard_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
automate_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
brush_cmds Bound paint stroke work (#678, #679) (#751) 2026-10-07 17:12:49 -04:00
canvas_geom Fix flaky canvas_geom undo test: isolate the text-gamma test in its own binary (#135) 2026-10-05 01:36:37 -04:00
channel_cmds Apply Image onto a transparent layer no longer turns it black (#607) 2026-10-07 09:12:11 -04:00
comps_cmds Slice, layer comp and type style ids out of u32 range are rejected, not wrapped onto a real item (#914) (#930) 2026-10-07 23:13:41 -04:00
distort_cmds fix: use wasm-safe timing for Liquify (#393) 2026-10-07 10:38:32 +07:00
edit_menu_cmds Reject geometry params that would silently wrap through i64->i32 narrowing (#803) 2026-10-07 18:02:12 -04:00
eraser_cmds Magic Eraser and Background Eraser tools; canvas rotation/flip/size move vector geometry (#70) 2026-10-04 16:17:39 -04:00
file_cmds Automation: an allowed command can't run a denied one on its behalf (#861) 2026-10-07 23:58:26 -07:00
filters_ext Filter › Render › Relight: redirect a photo's lighting (#735) 2026-10-07 16:45:57 -04:00
float_cmds Selections: drag to move the outline; ⌘-drag floats the selected pixels (engine commands) (#686) 2026-10-07 16:45:31 -04:00
gallery_cmds Analysis, notes, proof views, workspaces (+ in-progress work of other agents) 2026-10-01 22:49:07 -04:00
gradient_fill_cmds Gradients honour explicit transparency stops; smart filter commands accept an explicit layer target (#465, #466) (#544) 2026-10-07 13:21:22 +07:00
layer_copy_cmds Drag layers onto another document's tab to copy them there (#589) (#851) 2026-10-07 23:37:42 -04:00
layer_menu_cmds Handle Stack Mode sources with no visible layers (#770) 2026-10-07 17:57:43 -04:00
magnetic_cmds Add the Magnetic Lasso tool (#864) 2026-10-07 19:42:45 -04:00
mask_view_cmds Masks: Alt-click to view mask, Cmd-click vector mask to select, vector-mask target brackets (#196) (#256) (#256) 2026-10-05 17:47:46 -04:00
mode_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
multichannel_cmds Analysis, notes, proof views, workspaces (+ in-progress work of other agents) 2026-10-01 22:49:07 -04:00
plugin_cmds Sandboxed WebAssembly plug-ins: photocraft-plugins (wasmi), plugin.* commands, Filter › Plug-ins (#67) 2026-10-04 16:08:28 -04:00
prefs Add rendering modes and CPU fallback recovery (#434) 2026-10-07 06:11:06 -04:00
preset_store Preset store: a store directory that doesn't exist yet reads as empty on Windows too (#878) 2026-10-07 16:57:32 -07:00
presets Layer Style: complete multi-instance effects and dialog parity (#157) (#786) 2026-10-07 19:05:15 -04:00
print_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
retouch_cmds Add the Content-Aware Move tool (#213) (#814) 2026-10-07 18:40:14 -04:00
slice_cmds Slice, layer comp and type style ids out of u32 range are rejected, not wrapped onto a real item (#914) (#930) 2026-10-07 23:13:41 -04:00
smart_cmds Layer › Smart Objects › Convert to Layers (#535) (#829) 2026-10-07 23:44:21 -04:00
type_extra_cmds History: tool and preset names, Frame from Layers as one step, undo/redo restore the targeted layers (#513, #528, #446, #496, #495) (#551) 2026-10-07 13:54:10 +07:00
type_styles_cmds Fix document run and ID overflow (#684, #685) (#749) 2026-10-07 13:49:46 -07:00
variables_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
vector_cmds Bound paint stroke work (#678, #679) (#751) 2026-10-07 17:12:49 -04:00
video_cmds Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
web_cmds Save for Web: slices never overwrite each other, and overlapping slices keep their HTML cells (#908, #909) (#929) 2026-10-07 23:12:27 -04:00
actions_cmds.rs Actions: actions.record/stop/play/list commands for agents and the CLI (part of #219) (#622) 2026-10-07 17:12:52 -04:00
adjust_cmds.rs Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
adjust_params.rs 32-bit documents: Levels don't clip the input and output ranges (#403) 2026-10-07 06:53:56 -04:00
align_cmds.rs Never crash: the engine is panic-free (Rule 9) (#54) 2026-10-04 13:26:26 -04:00
analysis_cmds.rs Arbitrary rotation starts at the ruler line's straightening angle (#660) 2026-10-07 16:33:52 -04:00
artboard_cmds.rs Bound layer-group nesting at import and Group Layers (stack-overflow guard) (#796) 2026-10-07 18:46:45 -04:00
automate_cmds.rs CLI batch: recorded-action steps, --format .ext, strict --quality, refuse --out = --in (#489, #490, #491, #492) (#545) 2026-10-07 13:21:07 +07:00
brush_cmds.rs Brush size and hardness keys are remappable in Keyboard Shortcuts (#626) (#828) 2026-10-07 21:49:00 -04:00
brush_key_cmds.rs Brush size and hardness keys are remappable in Keyboard Shortcuts (#626) (#828) 2026-10-07 21:49:00 -04:00
brush_preset_cmds.rs Brushes: Tilt Scale, Brush Projection, Spacing checkbox, section locks, Mixer Wetness/Mix; Brushes grid + drag and drop; options bar through tools.setBrush (#174) 2026-10-05 07:21:23 -04:00
build_info.rs progress, release workflows 2026-10-01 10:49:51 -04:00
canvas_geom.rs Smart objects keep their four-corner (Distort / Perspective) placement (#426) 2026-10-07 06:58:01 -04:00
channel_cmds.rs Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
color_cmds.rs Monitor profile auto follows each window's display; what is applied is visible (#569) (#591) 2026-10-07 09:02:58 -04:00
commands.rs Drag layers onto another document's tab to copy them there (#589) (#851) 2026-10-07 23:37:42 -04:00
comps_cmds.rs Slice, layer comp and type style ids out of u32 range are rejected, not wrapped onto a real item (#914) (#930) 2026-10-07 23:13:41 -04:00
cutout_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
display_color_tests.rs Monitor profile auto follows each window's display; what is applied is visible (#569) (#591) 2026-10-07 09:02:58 -04:00
display_color.rs Monitor profile auto follows each window's display; what is applied is visible (#569) (#591) 2026-10-07 09:02:58 -04:00
distort_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
edit_cmds.rs Layer via Copy, Copy and Cut read only the selected area: 33x faster on 24 MP (#668) (#985) 2026-10-08 03:17:48 -04:00
edit_menu_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
eraser_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
extra_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
file_cmds.rs Lossy WebP: a pure-Rust VP8 encoder with quality and lossless controls (#648) (#880) 2026-10-07 21:12:38 -04:00
fill_cmds.rs Pencil tool, Edit › Fill… dialog and "Rasterize?" prompt (#213) (#279) (#279) 2026-10-05 19:48:03 -04:00
fill_key_cmds.rs Shortcuts: rebindable fill keys, D/X and held temporary tools (#249) (#275) (#275) 2026-10-05 18:50:47 -04:00
filters_ext.rs fix(algo): Path Blur clamps per-path speeds (#708) (#840) 2026-10-07 21:06:10 -04:00
filters.rs Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
float_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
frame_cmds.rs History: tool and preset names, Frame from Layers as one step, undo/redo restore the targeted layers (#513, #528, #446, #496, #495) (#551) 2026-10-07 13:54:10 +07:00
fx_view_cmds.rs Layers rows: name truncates before the fx/lock/link indicators; fx triangle; Collapse All Groups (#144, #143) (#167) 2026-10-05 03:38:47 -04:00
gallery_cmds.rs Colours: handle non-hex Unicode values without an internal error (#261) (#261) 2026-10-05 18:14:20 -04:00
gradient_fill_cmds.rs Gradients honour explicit transparency stops; smart filter commands accept an explicit layer target (#465, #466) (#544) 2026-10-07 13:21:22 +07:00
group_view_cmds.rs Layers groups expand/collapse (#126); every displayed shortcut fires (#127) (#141) 2026-10-05 02:28:57 -04:00
image_cmds.rs Layer › Smart Objects › Convert to Layers (#535) (#829) 2026-10-07 23:44:21 -04:00
inspect.rs Masks: Alt-click to view mask, Cmd-click vector mask to select, vector-mask target brackets (#196) (#256) (#256) 2026-10-05 17:47:46 -04:00
jobs_tests.rs Add the Content-Aware Move tool (#213) (#814) 2026-10-07 18:40:14 -04:00
jobs.rs Automation: an allowed command can't run a denied one on its behalf (#861) 2026-10-07 23:58:26 -07:00
layer_copy_cmds.rs Drag layers onto another document's tab to copy them there (#589) (#851) 2026-10-07 23:37:42 -04:00
layer_menu_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
layer_multi_cmds.rs Drag layers onto another document's tab to copy them there (#589) (#851) 2026-10-07 23:37:42 -04:00
layer_nav_cmds.rs Keyboard layer navigation: Alt+[ / Alt+] / Alt+, / Alt+. and Shift to add (part of #352) (#470) 2026-10-07 09:31:15 +07:00
layer_style.rs Layer Style: complete multi-instance effects and dialog parity (#157) (#786) 2026-10-07 19:05:15 -04:00
lens_cmds.rs fix(engine): Camera Raw clamps the noise amounts to their range (#707) (#839) 2026-10-07 20:24:42 -04:00
lib.rs Automation: an allowed command can't run a denied one on its behalf (#861) 2026-10-07 23:58:26 -07:00
magnetic_cmds.rs Add the Magnetic Lasso tool (#864) 2026-10-07 19:42:45 -04:00
mask_view_cmds.rs Masks: Alt-click to view mask, Cmd-click vector mask to select, vector-mask target brackets (#196) (#256) (#256) 2026-10-05 17:47:46 -04:00
migrate_cmds.rs Persist migrated presets with preferences (#728) 2026-10-07 15:38:29 -04:00
mode_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
multichannel_cmds.rs Never crash: the engine is panic-free (Rule 9) (#54) 2026-10-04 13:26:26 -04:00
notes_cmds.rs Photoshop oracles via storytold/photocraft-corpus: pinned corpora, corpus feature, test-corpus, CI job (#190) (#190) 2026-10-05 17:47:33 -04:00
paint_cmds.rs Gradients honour explicit transparency stops; smart filter commands accept an explicit layer target (#465, #466) (#544) 2026-10-07 13:21:22 +07:00
path_edit_cmds.rs Direct Selection tool: reshape pen and shape paths after they're drawn (#790) (#865) 2026-10-07 22:58:31 -04:00
pattern_cmds.rs Pencil tool, Edit › Fill… dialog and "Rasterize?" prompt (#213) (#279) (#279) 2026-10-05 19:48:03 -04:00
photo_cmds.rs Background jobs: engine job API, progress and cancel (part of #210) (#289) 2026-10-06 15:41:38 -04:00
pick_cmds.rs Move tool: Auto-Select on by default; a click picks and drags the layer under the pointer (#296) (#330) (#330) 2026-10-06 10:46:55 -04:00
pixels.rs Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
plugin_cmds.rs Invert (⌘I) inverts the targeted layer mask (#780) (#838) 2026-10-07 23:30:53 -04:00
prefs.rs fix(engine): keyboard shortcut bulk set reports in-call clashes (#719) (#799) 2026-10-07 14:46:08 -07:00
preset_import_cmds.rs Background jobs: engine job API, progress and cancel (part of #210) (#289) 2026-10-06 15:41:38 -04:00
preset_store.rs Preset store: a store directory that doesn't exist yet reads as empty on Windows too (#878) 2026-10-07 16:57:32 -07:00
print_cmds.rs Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
proof_sim.rs Monitor profile auto follows each window's display; what is applied is visible (#569) (#591) 2026-10-07 09:02:58 -04:00
render_cmds.rs Colours: handle non-hex Unicode values without an internal error (#261) (#261) 2026-10-05 18:14:20 -04:00
retouch_cmds.rs Add the Content-Aware Move tool (#213) (#814) 2026-10-07 18:40:14 -04:00
select_extra_cmds.rs Fix Transform Selection hang on far-off-canvas transforms (Rule 9) 2026-10-04 08:34:23 -04:00
selection_cmds.rs Add the Magnetic Lasso tool (#864) 2026-10-07 19:42:45 -04:00
slice_cmds.rs Slice, layer comp and type style ids out of u32 range are rejected, not wrapped onto a real item (#914) (#930) 2026-10-07 23:13:41 -04:00
smart_cmds.rs Layer › Smart Objects › Convert to Layers (#535) (#829) 2026-10-07 23:44:21 -04:00
smartselect_cmds.rs Follow-ups to #665, #666, #734: Photoshop's mask-only Remove Background, one-step eye sweep, no-clone Show Only (#824) 2026-10-08 04:25:22 +07:00
snap.rs Layout documents: fix GPU device loss, live Move tool, local damage, no per-frame work (#125, #128) (#226) (#226) 2026-10-05 10:53:15 -04:00
stamp_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
symmetry_cmds.rs Start context-menu parity across canvas, paths, and document tabs (#556) 2026-10-07 07:45:26 -04:00
tests.rs Drag-and-drop: place onto the canvas in Free Transform, open at a tab slot (#739) 2026-10-07 18:57:50 -04:00
timeline_cmds.rs Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
transform_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
trap_cmds.rs Format: adopt the craft-family rustfmt.toml and format the workspace 2026-10-04 11:31:17 -04:00
type_caret_cmds.rs Type: hitTest, caret and navigate commands so agents can edit text by position (part of #219) (#623) 2026-10-07 17:02:09 -04:00
type_cmds.rs M9: create vertical type from the Type tool flyout (#784) 2026-10-07 18:53:56 -04:00
type_extra_cmds.rs Type layers keep their name in step with their text (#483) (#501) 2026-10-07 06:12:13 -04:00
type_spell_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
type_styles_cmds.rs Slice, layer comp and type style ids out of u32 range are rejected, not wrapped onto a real item (#914) (#930) 2026-10-07 23:13:41 -04:00
variables_cmds.rs fix(automation): judge image.applyDataSet by the files it would read (#870) 2026-10-07 21:25:19 -04:00
vector_cmds.rs Direct Selection tool: reshape pen and shape paths after they're drawn (#790) (#865) 2026-10-07 22:58:31 -04:00
video_cmds.rs Atomic saves: one crash-safe atomic_write for every document write (#230) (#230) 2026-10-05 11:16:13 -04:00
vp_cmds.rs fix(layers): a locked group locks the layers inside it (#847) 2026-10-07 20:18:27 -04:00
warp_cmds.rs fix(warp): reject extreme rect params with BadParams (#808 follow-up) (#849) 2026-10-07 21:04:05 -04:00
web_cmds.rs Save for Web: slices never overwrite each other, and overlapping slices keep their HTML cells (#908, #909) (#929) 2026-10-07 23:12:27 -04:00
wia_cmds.rs File > Import > WIA Support: 625/625 menu items live (100%) 2026-10-03 02:56:15 -04:00