Commit Graph
2747 Commits
Author SHA1 Message Date
Christopher Linnett 0558c9427c fix: end an open text edit when Deselect All runs (#2096)
While a text layer was being edited, Edit > Deselect All and its shortcuts
selected every character (or did nothing) instead of ending the edit and
deselecting the layer.

- deselect_all now commits the open edit first, through the same route as
  text.endEdit: a created-but-empty type-tool layer is discarded, anything
  typed is kept, and no extra undo step is introduced.
- While the in-canvas editor holds the keyboard, the editor forwards the
  command's currently assigned shortcut (and any function-key chord) so
  Deselect All reaches the command from the comp; bare-letter bindings stay
  typing, and Select All still selects characters.
- The Project-panel focus redirects (invocation and menu enabled-ness) stand
  down while a text edit is open, so the menu and shortcut end the edit even
  when focus stayed on Project after Layer > New > Text.

Tests: three engine cases (commit + discard semantics), six UI kittest cases
(chords, F2, rebinding, menu enabled-ness, Project focus), RED at base.
2026-10-23 23:23:59 +08:00
Dylan M. Taylor 49d179738b packaging: use [[ tests, named locals and explicit returns (SonarCloud S7688/S7679/S7682) (#2187)
Switch the bash packaging scripts from [ to [[ for conditional tests,
give positional parameters descriptive local names, and end the shared
env.sh helpers with an explicit return. No behaviour change: every
comparison is against a literal, and a bare return keeps the last
command's status.
2026-10-23 11:17:22 -04:00
Dylan M. Taylor bd3ae8ab14 xtask: use unique temporary directories for bench tests (#2196) 2026-10-23 11:17:15 -04:00
Zaxaerith 9c0597fbfd fix(ui): add Duplicate to project item context menu (#2207) 2026-10-23 22:45:35 +08:00
Dylan M. Taylor dd325c7ab8 segment: bound checkpoint tensors and pickle work (#2192)
* segment: bound checkpoint tensors and pickle work

* segment: bound entry size, memo clones, and total tensor elements

* segment: cap cumulative decompressed storage bytes
2026-10-23 10:44:42 -04:00
Dylan M. Taylor 250b34174e Merge pull request #2218 from dylanmtaylor/sonar/checker-stat
fix: suppress the stat check's taint finding (SonarCloud)
2026-10-23 10:35:56 -04:00
Marco Arnulfo 24e61ce273 Composition Settings: the Resolution line shows the frame size the renderer produces (#2167) 2026-10-23 16:34:22 +02:00
Dylan M. Taylor 0c8d47f42a fix: suppress the stat check's taint finding (SonarCloud)
The stat is the validation that rejects anything but an existing regular
file; annotate it with that reasoning.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 10:28:48 -04:00
Marco Arnulfo c250150dbc Composition Settings: Resolution menu with the frame size and memory at that resolution (fixes #2167) 2026-10-23 16:21:56 +02:00
Dylan M. Taylor 9b735dc687 Merge pull request #2217 from dylanmtaylor/sonar/checker-path-safety
fix: document the AE checker's operator-supplied CLI path (SonarCloud)
2026-10-23 10:18:29 -04:00
Dylan M. Taylor c75071dfb8 fix: document the AE checker's operator-supplied CLI path (SonarCloud)
The path is the developer's own CLI build, stat'ed as a regular file before
use; suppress the taint finding with that reasoning.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 10:10:47 -04:00
Dylan M. Taylor 16c30830ef Merge pull request #2215 from dylanmtaylor/sonar/nosonar-placement
fix: put the NOSONAR marker on the spawnSync line (SonarCloud follow-up)
2026-10-23 09:53:46 -04:00
Dylan M. Taylor 400fbb79e9 fix: put the NOSONAR marker on the spawnSync line (SonarCloud)
Sonar applies NOSONAR to the line that carries the marker, so the
explanation above the call did not suppress anything.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 09:44:38 -04:00
Dylan M. Taylor 9066b64150 Merge pull request #2214 from dylanmtaylor/sonar/security-reliability
fix: validate the CLI path in the AE ease checker (SonarCloud jssecurity:S8705)
2026-10-23 09:37:45 -04:00
Dylan M. Taylor d1d9849e2d fix: validate the CLI path in the AE ease checker (SonarCloud)
Resolve the argument and require a regular file before spawnSync, which
never uses a shell and only runs fixed binaries or that validated path.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-23 09:29:39 -04:00
Dylan M. Taylor 23f11ab7cf expr: bound rewrite expansion and preserve assignment targets (#2195)
* expr: bound rewrite expansion and preserve assignment targets

* expr: bound rewritten output size and rewrite computed assignment targets
2026-10-23 09:14:49 -04:00
Dylan M. Taylor 09b9ebca34 roto: bound frozen matte decoding and serialization (#2194)
* roto: bound frozen matte decoding and serialization

* roto: address review (fallible RLE growth, pre-check plane bytes, saturate 32-bit limits)
2026-10-23 08:59:06 -04:00
Dylan M. Taylor 8a4ed77c4a pdf: bound image sample and mask allocations (#2191)
* pdf: bound image sample and mask allocations

* pdf: fallible mask allocations and JPEG header pixel cap
2026-10-23 08:56:15 -04:00
Dylan M. Taylor ca8043cbba text: bound layout and variable font metadata (#2193)
* text: bound layout and variable font metadata

* text: address review (intern once, f64 prefix sums, bounded item search, name fallback, consistent variation fallback)
2026-10-23 08:55:07 -04:00
Dylan M. Taylor 4b48482e8f ui: bound queued synthetic input gestures (#2197)
* ui: bound queued synthetic input gestures

* ui: reserve exact click event count
2026-10-23 08:45:10 -04:00
Dylan M. Taylor 2cf90507f3 svg: bound raster surfaces and handle duplicate gradient stops (#2190) 2026-10-23 08:38:10 -04:00
Christopher Linnett 32ae41c4eb #2094 (adv): crisp cast shadows so diffusion only softens
Shadow maps use the full scene-derived size (point-light faces capped
at 2048) under a 26M-texel scene budget halved largest-first; the PCF
filter measures its reach in output pixels with a two-texel minimum,
samples texel centres on a jittered adaptive 5..10 grid, and compares
each texel against the receiver plane's own depth so wide kernels never
self-shadow lit casters. The WGSL mirror is parenthesised (Tint rejects
the old form) and guarded by a shader-wide grammar test; the CPU
reference and shader remain step-for-step parity-tested.
2026-10-23 16:21:21 +08:00
heojunfoandClaude Opus 5.5 058fe9a005 Reload a numbered still as its own file (#2074)
Reload Footage probed every item the way File ▸ Import does by default,
so a still such as Photo_2.jpg with Photo_1.jpg beside it was grouped
into a run and measured from the run's first file. The still took
Photo_1's size. Sequence items still probe as a run; everything else
reads its one file.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-23 10:21:35 +09:00
skylar taylor-barrick 8fe2f51fb0 #979: cover raster footage and a selection elsewhere in the vector-menu test
A raster footage layer's Timeline menu now also has to leave out Create Shapes from Vector Layer. The viewer check keeps the solid selected, so the menu has to follow the layer under the pointer rather than the selection. With the viewer's caps merge made a no-op, the test fails at the viewer check.
2026-10-22 19:13:31 -06:00
Marco Arnulfo 952b04322e Project Settings: Frame Count, Start at 0 or Start at 1 (part of #1807)
file.projectSettings takes frameStart (0|1), the Project Settings dialog shows Frame Count, and scripts get app.project.framesCountType and displayStartFrame. The setting was already read by the Frames and Feet + Frames time display; nothing could change it.
2026-10-23 03:07:01 +02:00
skylar taylor-barrick 7c1183df56 #1497: test that double-clicking an effect property name reveals it in the timeline
Double-clicking a property name in Effect Controls did nothing. The test double-clicks the name and checks the Timeline marks the property revealed and shows its row. Without the fix nothing is revealed.
2026-10-22 18:55:49 -06:00
skylar taylor-barrick 841ff7bc4b #354: test that the panel focus outline is drawn over the panel bodies
The focused panel's outline was painted before the panel body, so body fills hid it. The test finds the outline in the painted shapes and checks no filled rect painted after it reaches its one-pixel ring. Without the fix a body fill overlaps the ring.
2026-10-22 18:55:49 -06:00
skylar taylor-barrick d87a6940f4 #979: test that layer context menus offer Create Shapes from Vector Layer
Right-clicking vector footage in the Timeline or the Composition viewer offered no vector conversion. The test imports an SVG and checks the item is absent for a solid, present on the SVG layer in both menus, and converts it. Without the fix the menu item is missing.
2026-10-22 18:55:49 -06:00
skylar taylor-barrick 1c3522be4a #382: test that audio decoding at a zero mix rate does not divide by zero
Resampling footage audio divided by the requested mix rate, so a rate of 0 panicked. The test decodes a 44.1 kHz WAV at rate 0 and expects a read of the requested length. Without the guard it panics with 'attempt to divide by zero'.
2026-10-22 18:55:49 -06:00
Markus Ang 58d00e78d5 #2034: fit translated Settings page names 2026-10-22 20:12:36 -04:00
Brandon ThomasandClaude Opus 5.5 9581b53c3f Release 0.16.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.16.0
2026-10-22 20:06:09 -04:00
Markus Ang 8ac7b3f508 #2135: reject non-ASCII thumbnail text safely 2026-10-22 19:29:42 -04:00
Dylan M. Taylor 0871135a6b Merge pull request #2062 from storytold/sonar-fix/js-css-reliability
fix: JS reliability bugs (SonarCloud S1764/S9383/S4275)
2026-10-22 19:27:57 -04:00
Dylan M. Taylor 645b683a77 Merge pull request #2061 from storytold/sonar-fix/js-csprng
security: use crypto.randomUUID for temp file suffix (SonarCloud S2245)
2026-10-22 19:27:53 -04:00
Dylan M. Taylor ec0cc83a29 fix(web): fall back to network when caches.open fails in service worker 2026-10-22 19:19:20 -04:00
Dylan M. Taylor 6871aa2236 security: check crypto.randomUUID availability in canMove 2026-10-22 19:19:19 -04:00
Anubhav-RaiandClaude Opus 5 6e3b5eb3e3 engine: deleting a layer clears the references to it (#2153)
Nothing cleared a `Value::Layer` reference when its layer was deleted, so the id stayed behind:
`env_pixels` resolved it to nothing and rendered no environment at all, while the UI showed "None",
which is documented as "fall back to the comp's Environment Layer". The delete path already
unparents children and drops a track matte that pointed at a deleted layer; a layer reference now
goes the same way, in the same history step, so undo restores the layer and the reference together.

This covers every layer-reference property, not only an Environment light's Source: 73 of them
across the effects (Clone Source, Set Matte, Back Layer, Water Surface, Sky, Ground…). Keyframes
carry the same value kind as the property, as in `essential.rs`, and are fixed too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-23 04:41:11 +05:30
Anubhav-RaiandClaude Opus 5 88045641f3 script: comp.width and comp.height resize the frame without moving the layers (#1942)
The setters go through `comp.settings`, which defaults to the Composition Settings dialog's
centre anchor, so `comp.width = 800` on a 400-wide comp shifted every unparented layer — and
all of its position keys — by 200 px. A script that resized a precomp then found its pixel
coordinates had moved under it.

After Effects' width and height setters only change the frame; moving the contents is what
"resize from centre" scripts do for themselves. The setters now pass `anchor: 0` (top left).
The dialog, which is where the anchor belongs, is untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-23 02:48:28 +05:30
zitann2020andDeepSeek V4.1 Flash 0cf7324d7c i18n(ja): AE says 縦横比, not アスペクト比
The Composition Settings dialog draws 「ピクセル縦横比」 and 「フレーム縦横比」, and its checkbox reads
「縦横比を 1:1 (1.00) に固定」. Three existing rows said アスペクト比.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 05:10:29 +09:00
Brandon ThomasandClaude Opus 5.5 15b8a916c5 Release 0.15.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.15.0
2026-10-22 15:39:32 -04:00
MarekSpodBiedry a07eb51dbf Fix u32 overflows in PDF CID width tables and CMap ranges (#2147) 2026-10-22 21:10:05 +02:00
Barzabel 210af24abf svg: allocate a CSS block only for accepted selectors; charge class tokens (#2140) 2026-10-22 21:24:33 +03:00
Christopher Linnett 174f401fe1 timeline: pick layer-valued properties from a layer drop-down (#2093)
The Timeline drew a layer-valued property (an Environment light's Source, a
Displacement Map's layer parameter) as read-only text holding the raw layer
id, so a light's Source could not be chosen in the UI at all - only through
prop.set from the command line, scripting or MCP. Effect Controls already
had a working drop-down for exactly these values: extract it into one shared
widgets::layer_picker (the current entry, "None" first, then "N. name" for
every layer of the comp, the list built only while the popup is open) and
draw it from both panels.

In the Timeline the pick writes through the same set closure as every other
value arm - an undoable prop.set (layer id, or null for None) - and
registers timeline.prop.<uid>.value like its neighbours, so the row names
the layer instead of exposing its id. Effect Controls keeps its rect,
automation id and write; its closed dropdown's "None", previously a
hardcoded literal, now follows the interface language. The dead "Layer {n}"
id text leaves the i18n catalogs with it.

ui_layer_source_picker drives both panels headlessly (open, pick, undo,
dismiss, current-entry highlight, translated None, picking None to clear a
set value), and an ignored wgpu snapshot test keeps the visual record
reproducible.
2026-10-23 01:47:55 +08:00
Barzabel ee13586814 svg: share CSS declaration blocks and cap <style> work (#2140)
Every selector of a comma list cloned the whole declaration block, and every
element scanned every rule, so a sub-megabyte <style> could demand billions of
string pairs. Selectors now index one shared block, the sheets are capped at
20 000 selectors and 50 000 declarations, rules are bucketed by id/class/type
so an element checks only candidates, and matching work over all elements is
charged against a 50M-step budget that fails the import instead of doing it.
2026-10-22 20:28:49 +03:00
NetterSilverandClaude Haiku 5.5 ed532afe72 Return None from Mat4::inverse for non-finite input
Found while testing crates/geom/src/lib.rs:362-390 (pivot check at line 367)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 19:12:38 +02:00
NetterSilverandClaude Haiku 5.5 fdfa286079 Keep rgb_to_hsv and rgb_to_hsl hue within 0..1
Found while testing crates/color/src/lib.rs:133 (rgb_to_hsv) and :96 (rgb_to_hsl)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 16:14:46 +02:00
NetterSilverandClaude Haiku 5.5 52bfb9c4bb Reject non-hex characters such as '+' in Rgba::from_hex
Found while testing crates/color/src/lib.rs:40-47

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 16:06:19 +02:00
skylar taylor-barrick b55cb5bc15 Merge pull request #1363 from DWAA1660/fix/1237-comp-contains-cycles
Project: comp_contains walks precomps with a visited set, not recursion (#1237)
2026-10-22 07:52:56 -06:00
skylar taylor-barrick 571aebd854 Merge pull request #1957 from Anubhav-Rai/script-value-dims
script: setValue rejects an array of the wrong dimension (#1936)
2026-10-22 07:52:51 -06:00
skylar taylor-barrick 831e719fa2 Merge pull request #1855 from CharlesBaumer/fix/doc-path-stills-windows
Windows: two fixes so cargo xtask ci gets past clippy and the media tests
2026-10-22 07:52:46 -06:00