From fee50dbfd1a23d651cfd98bbeecfb8103c415c91 Mon Sep 17 00:00:00 2001 From: Valentin Klein Date: Fri, 6 Nov 2026 17:36:28 +0100 Subject: [PATCH] Scripting: After Effects match names for 14 effects and Casts Shadows (#3122) * #3113: use After Effects' effect match names in scripting Checked every row of crates/script/src/matchnames.rs against After Effects 26.2 (app.effects, canAddProperty and the layer property trees). Fourteen effect names were wrong: twelve did not exist (Pixel Motion Blur is ADBE OFMotionBlur, Shadow/Highlight is ADBE ShadowHighlight, Ellipse is ADBE ELLIPSE, ...), and Noise and Photo Filter pointed at After Effects' hidden obsolete versions (now ADBE Noise2 and ADBE PhotoFilterPS). A light's Casts Shadows is ADBE Casts Shadows. The old names stay accepted for lookup (addProperty, property(), and parameters such as "ADBE Noise-0001"), so existing scripts keep working; .matchName emits only the After Effects name. A names-only fixture of After Effects' first-party match names backs the new test. Co-Authored-By: Claude Opus 5.5 * Scripting: match names that changed only in case still find effects and parameters property("ADBE Ellipse") and "ADBE Grow Bounds-0001" found nothing after the names became ADBE ELLIPSE / ADBE GROW BOUNDS. Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Claude Opus 5.5 --- crates/script/src/matchnames.rs | 125 ++++++- crates/script/src/model.rs | 3 + crates/script/src/tests.rs | 36 ++ .../tests/fixtures/ae-effect-match-names.tsv | 343 ++++++++++++++++++ 4 files changed, 490 insertions(+), 17 deletions(-) create mode 100644 crates/script/tests/fixtures/ae-effect-match-names.tsv diff --git a/crates/script/src/matchnames.rs b/crates/script/src/matchnames.rs index 45b10a0df..01b3258fd 100644 --- a/crates/script/src/matchnames.rs +++ b/crates/script/src/matchnames.rs @@ -149,7 +149,7 @@ const LIGHT: &[(&str, &str)] = &[ ("falloff", "ADBE Light Falloff Type"), ("radius", "ADBE Light Falloff Start"), ("falloffDistance", "ADBE Light Falloff Distance"), - ("castsShadows", "ADBE Light Casts Shadows"), + ("castsShadows", "ADBE Casts Shadows"), ("shadowDarkness", "ADBE Light Shadow Darkness"), ("shadowDiffusion", "ADBE Light Shadow Diffusion"), ]; @@ -309,12 +309,12 @@ pub const EFFECTS: &[(&str, &str)] = &[ ("ec.color.changetocolor", "ADBE Change To Color"), ("ec.color.colorama", "APC Colorama"), ("ec.color.leavecolor", "ADBE Leave Color"), - ("ec.color.photofilter", "ADBE Photo Filter"), + ("ec.color.photofilter", "ADBE PhotoFilterPS"), ("ec.color.vibrance", "ADBE Vibrance"), ("ec.color.lumetri", "ADBE Lumetri"), - ("ec.color.shadowhighlight", "ADBE Shadow/Highlight"), - ("ec.color.selectivecolor", "ADBE Selective Color"), - ("ec.color.gammapedestalgain", "ADBE Gamma/Pedestal/Gain"), + ("ec.color.shadowhighlight", "ADBE ShadowHighlight"), + ("ec.color.selectivecolor", "ADBE SelectiveColor"), + ("ec.color.gammapedestalgain", "ADBE Gamma/Pedestal/Gain2"), ("ec.color.equalize", "ADBE Equalize"), ("ec.color.autocontrast", "ADBE AutoContrast"), ("ec.color.autolevels", "ADBE AutoLevels"), @@ -351,15 +351,15 @@ pub const EFFECTS: &[(&str, &str)] = &[ ("ec.generate.grid", "ADBE Grid"), ("ec.generate.checkerboard", "ADBE Checkerboard"), ("ec.generate.circle", "ADBE Circle"), - ("ec.generate.ellipse", "ADBE Ellipse"), + ("ec.generate.ellipse", "ADBE ELLIPSE"), ("ec.generate.cellpattern", "ADBE Cell Pattern"), ("ec.generate.lensflare", "ADBE Lens Flare"), - ("ec.generate.vegas", "ADBE Vegas"), - ("ec.generate.writeon", "ADBE Write On"), + ("ec.generate.vegas", "APC Vegas"), + ("ec.generate.writeon", "ADBE Write-on"), ("ec.generate.audiospectrum", "ADBE AudSpect"), ("ec.generate.audiowaveform", "ADBE AudWave"), ("ec.generate.beam", "ADBE Laser"), - ("ec.generate.radiowaves", "ADBE Radio Waves"), + ("ec.generate.radiowaves", "APC Radio Waves"), ("ec.generate.scribble", "ADBE Scribble Fill"), ("ec.generate.paintbucket", "ADBE Paint Bucket"), ("ec.key.colorkey", "ADBE Color Key"), @@ -371,12 +371,12 @@ pub const EFFECTS: &[(&str, &str)] = &[ ("ec.key.spill", "ADBE Spill2"), ("ec.matte.simplechoker", "ADBE Simple Choker"), ("ec.matte.mattechoker", "ADBE Matte Choker"), - ("ec.noise.noise", "ADBE Noise"), + ("ec.noise.noise", "ADBE Noise2"), ("ec.noise.fractal", "ADBE Fractal Noise"), ("ec.noise.median", "ADBE Median"), ("ec.noise.addgrain", "VISINF Grain Implant"), ("ec.noise.dustscratches", "ADBE Dust & Scratches"), - ("ec.noise.turbulent", "ADBE Turbulent Noise"), + ("ec.noise.turbulent", "ADBE AIF Perlin Noise 3D"), ("ec.perspective.dropshadow", "ADBE Drop Shadow"), ("ec.perspective.radialshadow", "ADBE Radial Shadow"), ("ec.perspective.bevelalpha", "ADBE Bevel Alpha"), @@ -401,32 +401,73 @@ pub const EFFECTS: &[(&str, &str)] = &[ ("ec.time.echo", "ADBE Echo"), ("ec.time.posterizetime", "ADBE Posterize Time"), ("ec.time.timedisplacement", "ADBE Time Displacement"), - ("ec.time.timedifference", "ADBE Time Difference"), - ("ec.time.pixelmotionblur", "ADBE Pixel Motion Blur"), + ("ec.time.timedifference", "ADBE Difference"), + ("ec.time.pixelmotionblur", "ADBE OFMotionBlur"), ("ec.time.timewarp", "ADBE Timewarp"), ("ec.transition.linearwipe", "ADBE Linear Wipe"), ("ec.transition.radialwipe", "ADBE Radial Wipe"), ("ec.transition.venetian", "ADBE Venetian Blinds"), ("ec.transition.blockdissolve", "ADBE Block Dissolve"), ("ec.transition.gradientwipe", "ADBE Gradient Wipe"), - ("ec.transition.iriswipe", "ADBE Iris Wipe"), + ("ec.transition.iriswipe", "ADBE IRIS_WIPE"), ("ec.utility.applylut", "ADBE Apply Color LUT2"), ("ec.utility.cineon", "ADBE Cineon Converter2"), - ("ec.utility.growbounds", "ADBE Grow Bounds"), + ("ec.utility.growbounds", "ADBE GROW BOUNDS"), ]; fn find<'a>(t: &'a [(&str, &'a str)], k: &str) -> Option<&'a str> { t.iter().find(|(a, _)| *a == k).map(|(_, b)| *b) } +/// Effect match names that resolve to one of our effects but are not the name we emit (#3113): +/// After Effects' hidden obsolete versions (`ADBE Noise`, `ADBE Photo Filter`), which its +/// `addProperty` still accepts, and the names earlier EffectCraft versions emitted by mistake, +/// which scripts written against them may use. Lookup only: `effect()` gives the `EFFECTS` name. +const LEGACY_EFFECTS: &[(&str, &str)] = &[ + ("ADBE Noise", "ec.noise.noise"), + ("ADBE Photo Filter", "ec.color.photofilter"), + ("ADBE Shadow/Highlight", "ec.color.shadowhighlight"), + ("ADBE Selective Color", "ec.color.selectivecolor"), + ("ADBE Gamma/Pedestal/Gain", "ec.color.gammapedestalgain"), + ("ADBE Vegas", "ec.generate.vegas"), + ("ADBE Write On", "ec.generate.writeon"), + ("ADBE Radio Waves", "ec.generate.radiowaves"), + ("ADBE Turbulent Noise", "ec.noise.turbulent"), + ("ADBE Time Difference", "ec.time.timedifference"), + ("ADBE Pixel Motion Blur", "ec.time.pixelmotionblur"), + ("ADBE Iris Wipe", "ec.transition.iriswipe"), +]; + /// AE match name of an effect id (falls back to the id). pub fn effect(id: &str) -> String { find(EFFECTS, id).map(str::to_string).unwrap_or_else(|| id.to_string()) } -/// Our effect id for an AE effect match name. +/// Our effect id for an AE effect match name (or a legacy one, see `LEGACY_EFFECTS`). pub fn effect_from_match(m: &str) -> Option<&'static str> { - EFFECTS.iter().find(|(_, b)| b.eq_ignore_ascii_case(m)).map(|(a, _)| *a) + EFFECTS + .iter() + .find(|(_, b)| b.eq_ignore_ascii_case(m)) + .map(|(a, _)| *a) + .or_else(|| LEGACY_EFFECTS.iter().find(|(b, _)| b.eq_ignore_ascii_case(m)).map(|(_, a)| *a)) +} + +/// The current match name for a legacy name a script may still use: a `LEGACY_EFFECTS` effect +/// name, one of its parameters (`ADBE Noise-0001` → `ADBE Noise2-0001`), or the light's Casts +/// Shadows under its earlier name. `None` when `name` is not a legacy name. +pub fn current_name(name: &str) -> Option { + if name == "ADBE Light Casts Shadows" { + return Some("ADBE Casts Shadows".into()); + } + let legacy = |m: &str| LEGACY_EFFECTS.iter().find(|(b, _)| b.eq_ignore_ascii_case(m)).map(|(_, id)| effect(id)); + if let Some(m) = legacy(name) { + return Some(m); + } + let (fx, n) = name.rsplit_once('-')?; + if n.len() != 4 || !n.bytes().all(|b| b.is_ascii_digit()) { + return None; + } + legacy(fx).map(|m| format!("{m}-{n}")) } /// Our shape item kind (`layer.addShapeItem`) for an AE match name, our match id or a display @@ -573,6 +614,56 @@ pub fn node(chain: &[&Node]) -> String { mod tests { use super::*; + /// After Effects 26.2's `app.effects` (first-party match names and categories), #3113. + const AE_EFFECTS: &str = include_str!("../tests/fixtures/ae-effect-match-names.tsv"); + + fn ae_effects() -> Vec<(&'static str, &'static str)> { + AE_EFFECTS.lines().filter(|l| !l.starts_with('#') && !l.is_empty()).map(|l| l.split_once('\t').unwrap_or((l, ""))).collect() + } + + /// #3113: every effect match name we emit is one After Effects lists (case matters: its + /// `addProperty("ADBE Ellipse")` fails), and the current version, not a hidden obsolete one, + /// unless After Effects only has that one. + #[test] + fn effect_names_are_after_effects_names() { + let ae = ae_effects(); + // Obsolete in After Effects without a current replacement (Puppet is added by its tool). + let only_obsolete = ["ADBE Color Key", "ADBE Luma Key", "ADBE FreePin3"]; + for (id, m) in EFFECTS { + let Some((_, cat)) = ae.iter().find(|(n, _)| n == m) else { panic!("{id}: After Effects has no effect {m:?}") }; + assert!(!cat.contains("Obsolete") || only_obsolete.contains(m), "{id}: {m:?} is After Effects' obsolete version"); + } + assert_eq!(effect("ec.noise.noise"), "ADBE Noise2"); + assert_eq!(effect("ec.time.pixelmotionblur"), "ADBE OFMotionBlur"); + assert_eq!(effect("ec.generate.ellipse"), "ADBE ELLIPSE"); + assert_eq!(effect("ec.color.photofilter"), "ADBE PhotoFilterPS"); + } + + /// #3113: the names earlier versions emitted (and After Effects' obsolete ones) still resolve, + /// but none shadows a current name. + #[test] + fn legacy_effect_names_still_resolve() { + for (old, id) in LEGACY_EFFECTS { + assert_eq!(effect_from_match(old), Some(*id)); + assert!(!EFFECTS.iter().any(|(_, m)| m.eq_ignore_ascii_case(old)), "{old} is a current name"); + assert_eq!(current_name(old), Some(effect(id))); + } + assert_eq!(effect_from_match("ADBE Pixel Motion Blur"), Some("ec.time.pixelmotionblur")); + assert_eq!(current_name("ADBE Noise-0001").as_deref(), Some("ADBE Noise2-0001")); + assert_eq!(current_name("ADBE Light Casts Shadows").as_deref(), Some("ADBE Casts Shadows")); + assert_eq!(current_name("ADBE Noise2-0001"), None); + assert_eq!(current_name("ADBE Noise-01"), None); + assert_eq!(current_name("ADBE Gaussian Blur 2"), None); + } + + #[test] + fn light_casts_shadows_is_after_effects_name() { + let n = |m: &str| Node::from(effectcraft_project::PropGroup::new(1, m, m)); + let (light, mat, casts) = (n("lightOptions"), n("materialOptions"), n("castsShadows")); + assert_eq!(node(&[&light, &casts]), "ADBE Casts Shadows"); + assert_eq!(node(&[&mat, &casts]), "ADBE Casts Shadows"); + } + #[test] fn effect_names_round_trip() { for (id, m) in EFFECTS { diff --git a/crates/script/src/model.rs b/crates/script/src/model.rs index 258a6de2d..e662c1cdc 100644 --- a/crates/script/src/model.rs +++ b/crates/script/src/model.rs @@ -451,6 +451,9 @@ fn find_child<'a>(l: &'a Layer, g: &'a PropGroup, k: &str, depth: u8) -> Option< g.children .iter() .find(|n| chain_of(n) == k) + .or_else(|| matchnames::current_name(k).and_then(|m| g.children.iter().find(|n| chain_of(n) == m))) + // Match names that changed only in case (`ADBE Ellipse` is now `ADBE ELLIPSE`, #3113). + .or_else(|| g.children.iter().find(|n| chain_of(n).eq_ignore_ascii_case(k))) .or_else(|| g.children.iter().find(|n| n.name() == k)) .or_else(|| g.children.iter().find(|n| n.match_id() == k)) .or_else(|| g.children.iter().find(|n| n.name().eq_ignore_ascii_case(k))) diff --git a/crates/script/src/tests.rs b/crates/script/src/tests.rs index eefa017f0..9e934b555 100644 --- a/crates/script/src/tests.rs +++ b/crates/script/src/tests.rs @@ -139,6 +139,42 @@ fn fill_parameters_use_documented_match_names() { assert_eq!(o.result, json!("Color|All Masks|ADBE Fill-0007")); } +/// #3113: effects carry After Effects' match names (`ADBE Noise2`, `ADBE OFMotionBlur`); the +/// names earlier versions emitted still add and find the effect and its parameters. +#[test] +fn effects_use_after_effects_match_names_and_accept_legacy_ones() { + let mut s = session(); + let o = ok( + &mut s, + r#"var c = app.project.items.addComp("N", 100, 100, 1, 1, 12); var l = c.layers.addSolid([1,1,1], "S", 100, 100, 1); + var fx = l.property("ADBE Effect Parade"); + var a = fx.addProperty("ADBE Noise2"), b = fx.addProperty("ADBE Noise"), m = fx.addProperty("ADBE OFMotionBlur"); + var p = fx.addProperty("ADBE Pixel Motion Blur"); + [a.matchName, b.matchName, m.matchName, p.matchName, a.property("ADBE Noise2-0001").name, + fx.property("ADBE Noise").matchName, a.property("ADBE Noise-0001").name, fx.numProperties]"#, + ); + assert_eq!( + o.result, + json!(["ADBE Noise2", "ADBE Noise2", "ADBE OFMotionBlur", "ADBE OFMotionBlur", "Amount of Noise", "ADBE Noise2", "Amount of Noise", 4]) + ); +} + +/// #3113: names that changed only in case (`ADBE Ellipse` → `ADBE ELLIPSE`, `ADBE Grow Bounds` → +/// `ADBE GROW BOUNDS`) still find the effect and its parameters. +#[test] +fn match_names_that_changed_case_still_find_effects_and_parameters() { + let mut s = session(); + let o = ok( + &mut s, + r#"var c = app.project.items.addComp("E", 100, 100, 1, 1, 12); var l = c.layers.addSolid([1,1,1], "S", 100, 100, 1); + var fx = l.property("ADBE Effect Parade"); + var e = fx.addProperty("ADBE Ellipse"), g = fx.addProperty("ADBE Grow Bounds"); + [e.matchName, fx.property("ADBE Ellipse").matchName, e.property("ADBE Ellipse-0001").matchName, + g.matchName, fx.property("ADBE Grow Bounds").matchName, g.property("ADBE Grow Bounds-0001").matchName]"#, + ); + assert_eq!(o.result, json!(["ADBE ELLIPSE", "ADBE ELLIPSE", "ADBE ELLIPSE-0001", "ADBE GROW BOUNDS", "ADBE GROW BOUNDS", "ADBE GROW BOUNDS-0001"])); +} + #[test] fn stroke_parameters_use_after_effects_match_names() { // #1405: `ADBE Stroke-0002` is Stroke's Color in After Effects, not All Masks. diff --git a/crates/script/tests/fixtures/ae-effect-match-names.tsv b/crates/script/tests/fixtures/ae-effect-match-names.tsv new file mode 100644 index 000000000..341d82541 --- /dev/null +++ b/crates/script/tests/fixtures/ae-effect-match-names.tsv @@ -0,0 +1,343 @@ +# After Effects 26.2 app.effects: match namecategory, first-party names only (ADBE, APC, VISINF). +# Names only, read back from the running application (#3113). Categories "Obsolete"/"_Obsolete" are hidden legacy versions. "-" = no category. +ADBE 3D Glasses _Obsolete +ADBE 3D Glasses2 Perspective +ADBE 3D Tracker Perspective +ADBE 4ColorGradient Generate +ADBE AIF Perlin Noise 3D Noise & Grain +ADBE ATG Extract Keying +ADBE AUX CHANNEL EXTRACT 3D Channel +ADBE Alpha Levels2 _Obsolete +ADBE Alpha Levels3 _Obsolete +ADBE Angle Control Expression Controls +ADBE Apply Color LUT _Obsolete +ADBE Apply Color LUT2 Utility +ADBE Arithmetic Channel +ADBE Aud BT Audio +ADBE Aud Compressor Audio +ADBE Aud Delay Audio +ADBE Aud Distortion Audio +ADBE Aud Gate Audio +ADBE Aud HiLo Audio +ADBE Aud Modulator Audio +ADBE Aud Reverb Audio +ADBE Aud Reverse Audio +ADBE Aud Stereo Mixer Audio +ADBE Aud Tone Audio +ADBE AudSpect Generate +ADBE AudWave Generate +ADBE Aud_Flange Audio +ADBE AutoColor Color Correction +ADBE AutoContrast Color Correction +ADBE AutoLevels Color Correction +ADBE BEZMESH Distort +ADBE Basic 3D Obsolete +ADBE Basic Text2 Obsolete +ADBE Bevel Alpha Perspective +ADBE Bevel Edges Perspective +ADBE Bilateral Blur & Sharpen +ADBE Black&White Color Correction +ADBE Blend Channel +ADBE Block Dissolve Transition +ADBE Box Blur _Obsolete +ADBE Box Blur2 Blur & Sharpen +ADBE Brightness & Contrast _Obsolete +ADBE Brightness & Contrast 2 Color Correction +ADBE Broadcast Colors Color Correction +ADBE Brush Strokes Stylize +ADBE Bulge Distort +ADBE CHANNEL MIXER Color Correction +ADBE CM Animated Shape 2 - +ADBE CM Animated Shape 3 - +ADBE CM Animated Shape Control - +ADBE CM AutoscrollHorizontal - +ADBE CM AutoscrollVertical - +ADBE CM CornerReveal - +ADBE CM CrackedTiles - +ADBE CM CropEdges - +ADBE CM DissolveUnmelt - +ADBE CM FadeInOutFrames - +ADBE CM FadeInOutmsec - +ADBE CM FlyToInset - +ADBE CM GridWipe - +ADBE CM InsetVideoFramed - +ADBE CM InsetVideoTorn - +ADBE CM LightLeaksMarkers - +ADBE CM LightLeaksRandom - +ADBE CM MoodLightAmorph - +ADBE CM MoodLightDigital - +ADBE CM MoodLightStreaks - +ADBE CM OpacityFlashMarkers - +ADBE CM OpacityFlashRandom - +ADBE CM ScaleBounceMarkers - +ADBE CM ScaleBounceRandom - +ADBE CM SlideVariable - +ADBE CM Spin - +ADBE CM Throw - +ADBE CM TransCard - +ADBE CM TransComplete - +ADBE CM TransCorner - +ADBE CM TransDirection - +ADBE CM TransDissolve - +ADBE CM TransFade - +ADBE CM TransFadeMask - +ADBE CM TransIris - +ADBE CM TransRadial - +ADBE CM TransSlide - +ADBE CM TransStretch - +ADBE CM TransWipe - +ADBE CM TransWipeFeath - +ADBE CM WiggleGelatin - +ADBE CM WigglePosition - +ADBE CM WiggleRotation - +ADBE CM WiggleScale - +ADBE CM WiggleShear - +ADBE CM Wigglerama - +ADBE CM Zoom2DSpin - +ADBE CM Zoom3DTumble - +ADBE CM ZoomBubble - +ADBE CM ZoomSpiral - +ADBE CM ZoomWobble - +ADBE Calculations Channel +ADBE Camera Lens Blur Blur & Sharpen +ADBE CameraShakeDeblur Blur & Sharpen +ADBE Cartoonify Stylize +ADBE Cell Pattern Generate +ADBE Change Color Color Correction +ADBE Change To Color Color Correction +ADBE Channel Blur Blur & Sharpen +ADBE Channel Combiner Channel +ADBE Checkbox Control Expression Controls +ADBE Checkerboard Generate +ADBE Cineon Converter _Obsolete +ADBE Cineon Converter2 Utility +ADBE Circle Generate +ADBE Color Balance _Obsolete +ADBE Color Balance (HLS) Color Correction +ADBE Color Balance 2 Color Correction +ADBE Color Control Expression Controls +ADBE Color Difference Key Keying +ADBE Color Emboss Stylize +ADBE Color Key Obsolete +ADBE Color Link Color Correction +ADBE Color Range Keying +ADBE Color Swirl - +ADBE Compander Utility +ADBE Compound Arithmetic Channel +ADBE Compound Blur Blur & Sharpen +ADBE Corner Pin Distort +ADBE CurvesCustom Color Correction +ADBE DE Bounce - +ADBE DE Bounce At Marker - +ADBE DE Bounce On Beat - +ADBE DE Bounce Random - +ADBE DE Follow - +ADBE DE Jiggle - +ADBE DE Jiggle At Marker - +ADBE DE Jiggle On Beat - +ADBE DE Jiggle Random - +ADBE DE Opacity Pulse - +ADBE DE Opacity Pulse At Marker - +ADBE DE Opacity Pulse On Beat - +ADBE DE Opacity Pulse Random - +ADBE DE Orbit - +ADBE DE Orbit 3D - +ADBE DE Oscillate - +ADBE DE Oscillate At Marker - +ADBE DE Oscillate On Beat - +ADBE DE Oscillate Random - +ADBE DE Pendulum - +ADBE DE Pendulum At Marker - +ADBE DE Pendulum On Beat - +ADBE DE Pendulum Random - +ADBE DE Pulse - +ADBE DE Pulse At Marker - +ADBE DE Pulse On Beat - +ADBE DE Pulse Random - +ADBE DE Random Fill Color - +ADBE DE Random Motion - +ADBE DE Random Motion 1D - +ADBE DE Random Opacity - +ADBE DE Random Rotation - +ADBE DE Random Rotation 3D - +ADBE DE Random Scale - +ADBE DE Swarm - +ADBE DE Wobble Bounce - +ADBE DE Wobble Bounce At Marker - +ADBE DE Wobble Bounce On Beat - +ADBE DE Wobble Bounce Random - +ADBE DE Z Spring - +ADBE DE Z Spring At Marker - +ADBE DEPTH FIELD 3D Channel +ADBE DEPTH MATTE 3D Channel +ADBE Deflicker Color Correction +ADBE Difference Time +ADBE Difference Matte2 Keying +ADBE DigitalVideoLimiter Color Correction +ADBE Displacement Map Distort +ADBE Drop Shadow Perspective +ADBE Dropdown Control Expression Controls +ADBE Dust & Scratches Noise & Grain +ADBE ELLIPSE Generate +ADBE Easy Levels _Obsolete +ADBE Easy Levels2 Color Correction +ADBE Echo Time +ADBE Emboss Stylize +ADBE Equalize Color Correction +ADBE Exposure _Obsolete +ADBE Exposure2 Color Correction +ADBE Extract Keying +ADBE Eyedropper Fill Generate +ADBE FOG_3D 3D Channel +ADBE Fast Blur _Obsolete +ADBE Fill Generate +ADBE Find Edges Stylize +ADBE Fractal Generate +ADBE Fractal Noise Noise & Grain +ADBE FreePin3 _Obsolete +ADBE GROW BOUNDS Utility +ADBE Gamma/Pedestal/Gain2 Color Correction +ADBE Gaussian Blur Obsolete +ADBE Gaussian Blur 2 Blur & Sharpen +ADBE Geometry _Obsolete +ADBE Geometry2 Distort +ADBE Getting Jiggy - +ADBE Glo2 Stylize +ADBE Gradient Wipe Transition +ADBE Grid Generate +ADBE HDR ToneMap Utility +ADBE HUE SATURATION Color Correction +ADBE ID MATTE 3D Channel +ADBE IRIS_WIPE Transition +ADBE Invert Channel +ADBE KeyCleaner Keying +ADBE LIQUIFY Distort +ADBE Laser Generate +ADBE Layer Control Expression Controls +ADBE Leave Color Color Correction +ADBE Lens Flare Generate +ADBE Lightning Obsolete +ADBE Lightning 2 Generate +ADBE Linear Color Key2 Keying +ADBE Linear Wipe Transition +ADBE Luma Key Obsolete +ADBE Lumetri Color Correction +ADBE MESH WARP Distort +ADBE Magnify Distort +ADBE Matte Choker Matte +ADBE Median Noise & Grain +ADBE Minimax Channel +ADBE Mirror Distort +ADBE Mosaic Stylize +ADBE Motion Blur Blur & Sharpen +ADBE Noise _Obsolete +ADBE Noise Alpha _Obsolete +ADBE Noise Alpha2 Noise & Grain +ADBE Noise HLS _Obsolete +ADBE Noise HLS Auto _Obsolete +ADBE Noise HLS Auto2 Noise & Grain +ADBE Noise HLS2 Noise & Grain +ADBE Noise2 Noise & Grain +ADBE Numbers2 Text +ADBE OCIO CDL Transform Color Correction +ADBE OCIO Color Space Transform Color Correction +ADBE OCIO Display Transform Color Correction +ADBE OCIO FILE Transform Color Correction +ADBE OCIO Look Transform Color Correction +ADBE OFMotionBlur Time +ADBE Offset Distort +ADBE Optics Compensation Distort +ADBE PS Arbitrary Map Color Correction +ADBE PS Median Noise & Grain +ADBE PSL Bevel Emboss _Obsolete +ADBE PSL Drop Shadow _Obsolete +ADBE PSL Inner Glow _Obsolete +ADBE PSL Inner Shadow _Obsolete +ADBE PSL Outer Glow _Obsolete +ADBE PSL Solid Fill _Obsolete +ADBE Paint _Obsolete +ADBE Paint Bucket Generate +ADBE Param EQ Audio +ADBE Path Text Obsolete +ADBE Photo Filter _Obsolete +ADBE PhotoFilterPS Color Correction +ADBE Playgnd Simulation +ADBE Point Control Expression Controls +ADBE Point3D Control Expression Controls +ADBE Polar Coordinates Distort +ADBE Posterize Stylize +ADBE Posterize Time Time +ADBE Pro Levels _Obsolete +ADBE Pro Levels2 Color Correction +ADBE ProfileToProfile Utility +ADBE RESHAPE Distort +ADBE Radial Blur Blur & Sharpen +ADBE Radial Shadow Perspective +ADBE Radial Wipe Transition +ADBE Ramp Generate +ADBE Reduce Interlace Flicker Obsolete +ADBE RefineMatte _Obsolete +ADBE RefineMatte2 Matte +ADBE RefineRBMatte Matte +ADBE Remove Color Matting Channel +ADBE Ripple Distort +ADBE Rolling Shutter Distort +ADBE Roughen Edges Stylize +ADBE SCHMEAR Distort +ADBE Sample Image - +ADBE Samurai _Obsolete +ADBE Scatter Stylize +ADBE Scribble Fill Generate +ADBE SelectiveColor Color Correction +ADBE Separate XYZ Position - +ADBE Separate XYZ Scale - +ADBE Set Channels Channel +ADBE Set Matte2 _Obsolete +ADBE Set Matte3 Channel +ADBE ShadowHighlight Color Correction +ADBE Sharpen Blur & Sharpen +ADBE Shift Channels Channel +ADBE Simple Choker Matte +ADBE Slider Control Expression Controls +ADBE Smart Blur Blur & Sharpen +ADBE Solid Composite Channel +ADBE Spherize Distort +ADBE Spill Suppressor Obsolete +ADBE Spill2 Keying +ADBE Stereo 3D Controls - +ADBE Strobe Stylize +ADBE Stroke Generate +ADBE SubspaceStabilizer Distort +ADBE Texturize Stylize +ADBE Three-Way Color Corrector _Obsolete +ADBE Threshold _Obsolete +ADBE Threshold2 Stylize +ADBE Tile Stylize +ADBE Time Displacement Time +ADBE Timecode Text +ADBE Timewarp Time +ADBE Tint Color Correction +ADBE Tritone Color Correction +ADBE Turbulent Displace Distort +ADBE Twirl Distort +ADBE Unmult Keying +ADBE Unsharp Mask _Obsolete +ADBE Unsharp Mask2 Blur & Sharpen +ADBE Upscale Distort +ADBE Venetian Blinds Transition +ADBE Vibrance Color Correction +ADBE WRPMESH Distort +ADBE Wave Warp Distort +ADBE Write-on Generate +APC CardDanceCam Simulation +APC CardWipeCam Transition +APC Caustics Simulation +APC Colorama Color Correction +APC Foam Simulation +APC Radio Waves Generate +APC Shatter Simulation +APC Vegas Generate +APC Wave World Simulation +VISINF Grain Duplication Noise & Grain +VISINF Grain Implant Noise & Grain +VISINF Grain Removal Noise & Grain