Commit Graph
3365 Commits
Author SHA1 Message Date
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
NetterSilverandClaude Haiku 5.5 58fbda40b4 Draw a line to the end point of degenerate SVG arcs
Found while testing crates/svg/src/pathdata.rs:228-233

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 00:30:59 +00: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
Barzabel a854e680f7 test(expr): deep-nesting tests assert the guard's own error (#2124, #2125)
Reflect is not an expression global, so Reflect.construct never reached the
nesting check; the proxy case asserts Proxy is undefined.
2026-10-22 23:00:12 +03:00
zitann2020andDeepSeek V4.1 Flash 21792fe536 i18n(ja): Keylight (1.2) and 基本3D, as the menu draws them
Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 04:58:53 +09:00
zitann2020andDeepSeek V4.1 Flash defaba09b1 i18n(ja): the effect names as AE's Effect menu draws them
The menu is the authority and it disagreed with this table in three ways: five rows had been
translated that AE leaves in English (Key Cleaner, Advanced Spill Suppressor, Unmult,
Twirl (Legacy) and mocha shape), eight use a half-width ampersand, and a handful differ only in
spacing (Cineon コンバーター, 3D カメラトラッカー, 基本3D). Five effects the table skipped do have
names: コンプレッサー, 歪み, ゲート, カールノイズ and VR 平面として投影.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 04:57:10 +09:00
zitann2020andDeepSeek V4.1 Flash 9ea79ac50b i18n(ja): the category is 式制御, as AE draws it
Adobe help calls it エクスプレッション制御 in prose; the Effect menu says 式制御. The menu is what
a user reads, so it wins.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 04:52:46 +09:00
zitann2020andDeepSeek V4.1 Flash a992654e98 i18n(ja): the OCIO transforms, and two names AE draws with half-width marks
Read from the Effect menu: OCIO CDL 変換, OCIO 色空間変換, OCIO 表示変換, OCIO ファイル変換 and
OCIO Look トランスフォーム. AE draws 稲妻(高度) and 輝度&コントラスト with half-width marks while
平均化(イコライズ) keeps full-width ones, so the punctuation follows the menu per effect.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 04:50:28 +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 8324d93c39 fix(expr): JSON.stringify key lists report cycles; document stack guard coverage (#2124, #2125)
An array replacer now copies each source object once per call, so a cycle stays a cycle and the native check throws TypeError, while shared objects still serialize. Documents which threads evaluate expressions, what the 256 KiB guard covers (tested on a 512 KiB thread), that it does not apply on wasm32, and why eval is indirect.
2026-10-22 21:33:16 +03:00
Barzabel 210af24abf svg: allocate a CSS block only for accepted selectors; charge class tokens (#2140) 2026-10-22 21:24:33 +03:00
vangel76andClaude Sonnet 5.5 037c18374f Merge upstream/main into rfx-masks-shapes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 20:24:21 +02:00
zitann2020andDeepSeek V4.1 Flash 03d43fb2f2 i18n(ja): two names Adobe translates, and a doc comment that had drifted
Key Cleaner is キークリーナー and Advanced Spill Suppressor is 高度なスピルサプレッション —
neither is a brand name, and Adobe's keying page names both. The doc comment claimed the
VR and OCIO sets repeat their English names here; the VR rows are Japanese now and the OCIO
rows do not exist, so it says what is true instead.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 03:11:03 +09:00
zitann2020andDeepSeek V4.1 Flash ac9cd8b8d8 i18n(ja): the remaining categories the glossary names
285 of 307 ids. The 22 that stay English are the ones no source names: the OCIO set,
Screen Key, Unmult, Curl Noise, Puppet, Twirl (Legacy), Stereo 3D Controls, the two face
tracking effects, Mocha shape, Paint, and three audio effects.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 03:03:52 +09:00
zitann2020andDeepSeek V4.1 Flash 067d79ce3b i18n(ja): keep the effect list's wording for five effects
Adobe's per-effect pages say 色合い / レベル / 露出 / ストローク / ストロボライト, but its effect
list says 色かぶり補正 / レベル補正 / 露光量 / 線 / ストロボ, and the list is what AE's
interface follows. The interface wins.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 02:59:33 +09: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
zitann2020andDeepSeek V4.1 Flash 4e05e2bf25 i18n(ja): five effect names Adobe's Japanese help corrects
Tint is 色合い, Levels is レベル, Exposure is 露出, Stroke is ストローク and Strobe Light is
ストロボライト. The list used for cross-checking carried Photoshop's words for three of them.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 02:35:31 +09: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
Barzabel 6686cc75ca fix(expr): bound runtime parser and native recursion depth (#2124, #2125)
eval, Function and the generator/async function constructors now check the nesting of their source like the expression text. join, toLocaleString, flat and JSON.stringify check the run's stack use per level, results nested past the detached levels become [object], and Proxy/Reflect are no longer available to expressions. Each of these overflowed the stack and aborted the app.
2026-10-22 20:28:38 +03:00
zitann2020andDeepSeek V4.1 Flash de4d825152 i18n(ja): the blur, colour, distort, stylize and generate effect names (#821)
148 of the 307 ids. Names from AE 2026's Japanese interface and from Adobe's Japanese help,
which is what settles the `CC` rows staying English and `Smart Blur` being `ブラー(詳細)`.
Three rows rest on elimination and are called out in the PR.

Co-Authored-By: DeepSeek V4.1 Flash <noreply@deepseek.com>
2026-10-23 02:23:59 +09: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
Barzabel 966e279691 model: cap glTF buffer-less accessors in aggregate, check element offsets (#2139)
The per-accessor count checks from #1235 already reject the audit's trigger
(a MAT4 accessor with count 10^11); a regression test now pins it. What was
left: accessors without a bufferView were capped at 16M components each, but
nothing backs them, so one capped accessor referenced from many primitives
allocated 64 MB per reference. The cap is now one budget for the whole file.
Per-element offsets use checked arithmetic as well.
2026-10-22 20:10:51 +03:00
midasdf 636f1cf738 Text: the Japanese fallback test pins ja-JP (#2039)
The test checked that Japanese text falls back to an installed Japanese
family, but left the process-global CJK locale at the host's: on a zh-CN
host with a Chinese face installed, han_order puts the Chinese families
first for the shared ideographs and the Japanese-family assertion fails.
Set ja-JP under the TEST_CJK_LOCALE lock and clear the request when the
test ends, as the zh-CN test beside it does.

Tests: effectcraft-text 75 lib + 3 integration passed; cargo fmt --all -- --check passed.
2026-10-23 01:37:22 +09: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
midasdf 2d360d9a83 Text: the Han fallback test accepts an earlier Chinese family (#2039)
The macOS fallback test selected the first installed family from the
Simplified list, so a Mac that also has PingFang SC (or Microsoft YaHei /
Noto Sans CJK SC) picked that one and then failed an assertion that only
accepted the three macOS faces. Accept any family from the list -- every one
is Chinese -- and check that each installed macOS face covers the shared
ideographs instead.

Also exercise fallback_for itself under a zh-CN request, which the direct
resolve_in lookup bypassed, and serialise the process-global locale with the
layout CJK test so a cached family order cannot leak between them.

Tests: effectcraft-text 75 lib + 3 integration passed; effectcraft-render
233 passed, 1 ignored; cargo fmt --all -- --check and cargo clippy -p
effectcraft-text --all-targets -- -D warnings clean.
2026-10-22 23:08:39 +09: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
Christopher Linnett d2fae0a144 fix: bound Classic 3D depth-of-field blur and reject non-finite focus distances (#2092)
The camera's Set Focus Distance to Layer command compared only 'd <= 0.0', which NaN passes, and two finite but extreme positions can overflow their difference to infinity; a stored non-finite focus distance serializes as null and leaves the project unsavable. Reject it, fall back to the zoom plane in the camera evaluation, and count a non-finite focus or depth as in focus. The Classic 3D blur radius itself was unbounded: a 0%-scaled or very distant layer scales it by up to 1e9, and the padded blur buffer sized from it aborts the process. Cap each plane's radius to a padded buffer that fits the renderer's 16 Mpx layer budget, don't blur planes whose pixels cover under a thousandth of a comp pixel, saturate the padded sizes, and refuse padded buffers past the project's maximum layer size. Regression tests for each guard.
2026-10-22 21:57:41 +08: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
skylar taylor-barrick 70763d74c0 Merge pull request #1966 from Silvertree2010/fix/h930-deleting-the-first-vertex-of-a-c
Fix feather points when deleting first vertex of a closed mask path
2026-10-22 07:52:39 -06:00
skylar taylor-barrick be4d2d7bb8 Merge pull request #1992 from Silvertree2010/fix/h1142-sampleimage-panics-with-integer
Fix integer overflow in sampleImage for huge sample points
2026-10-22 07:52:31 -06:00
skylar taylor-barrick a9c2bfa6eb Merge pull request #1902 from Silvertree2010/fix/h704-hsv-to-rgb-returns-magenta-for-a
Fix hsv_to_rgb returning magenta for tiny negative hues
2026-10-22 07:52:17 -06:00
skylar taylor-barrick 1348621007 Merge pull request #1989 from Silvertree2010/fix/h1084-path-rect-panics-when-both-size
Fix panic in path::rect when both size components are NaN
2026-10-22 07:52:11 -06:00
Madhav Agarwal 3306bf2296 ui: Spacebar hand pans timeline rows vertically (#2083) 2026-10-22 19:15:34 +05:30
Madhav Agarwal 7fe0513894 engine: split layers above the original by default (#2083) 2026-10-22 19:13:36 +05:30
Madhav Agarwal ffe3c913e1 ui: scrub hot text from the slider range (#2097) 2026-10-22 19:05:30 +05:30
Madhav Agarwal 963f489eab engine: resolve effect match-name paths in prop_ref (#2064) 2026-10-22 18:47:59 +05:30
Madhav Agarwal 3f4ffdc0fc engine: a keyframe on the out point no longer warns (#2084) 2026-10-22 18:41:26 +05:30
Egon 5000 a59e7ad67f Timeline: assert the full search-row hierarchy for the elided Contents, add docstrings
The search test now pins every row (layer, Contents, group, path/fill/
Transform) so a future regression that re-adds the inner Contents row or
reorders the flattening fails loudly. Docstrings cover the functions the
diff touches (group_row, all, rec, push_group) for CodeRabbit's
docstring-coverage pre-merge check.
2026-10-22 14:59:25 +02:00