Commit Graph
3605 Commits
Author SHA1 Message Date
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
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
midasdf 9e39aea45b ROADMAP: the Chinese panel catalogs hold 998 rows, not 1,626
1,626 is the Traditional Chinese total translated-string count; the panel
catalogs carry 998 source rows each (996 in Japanese), as
docs/localization-parity.md measures.
2026-10-23 01:29:35 +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 5300c9fa87 i18n(ja): add the missing panel rows and recount localization
Review follow-up to the panel/dialog step: the composition-settings tabs
translate "Basic" and "Advanced" through `tr(variable)` and the Preview
transport translates "Play/Stop", but none of the three had a catalog
row, so they stayed English. Add them to the Japanese, Simplified and
Traditional Chinese catalogs and pin them in
`japanese_rows_translate_the_panels`.

The shared "Type" key means "kind" in the Project column and the Camera
Settings dialog, so the Chinese rows read 类型/類型 instead of 文字
("text").

Keep the graph button bar's automation labels English: translate only
the drawn label and tooltip, and translate the stored English strings
when the hidden-button menu draws them.

Recount the docs from the catalogs: 628 menu rows, 996 Japanese and 998
Chinese panel rows; count Simplified Chinese's 306 effect names in its
numerator (46%) and average the ten After Effects languages the table
actually names (21%, not the stale 27%). Update the measurement basis,
the cross-references in gaps.md and target-app-parity.md, and ROADMAP.
2026-10-22 23:10:58 +09:00