From da8a9473f57626e48cf0b40947921cfa3752c1e5 Mon Sep 17 00:00:00 2001 From: Universe Date: Wed, 26 Aug 2026 22:19:44 +0900 Subject: [PATCH 1/6] websem: close SVG turbulence and displacement rows --- crates/n0/src/drawlist.rs | 35 + crates/n0/src/glyphless.rs | 73 +- crates/n0/src/paint.rs | 168 ++++- crates/n0_cli/README.md | 57 +- crates/rframe/src/filter.rs | 90 ++- crates/rframe/src/frame.rs | 37 +- crates/rframe/src/lib.rs | 6 +- crates/rframe/tests/filter_contract.rs | 172 ++++- crates/rframe/tests/scope_stream.rs | 66 +- crates/websem/src/svg.rs | 175 ++++- crates/websem/tests/filter_contract.rs | 260 ++++++- crates/websem/tests/unsupported_corpus.rs | 15 + docs/wg/consolidation/svg-engine-of-record.md | 136 +++- docs/wg/consolidation/web-checklist.md | 65 +- fixtures/web-first/README.md | 5 + fixtures/web-first/STATUS.md | 85 ++- .../svg-filter-displacement-color-linear.png | Bin 0 -> 366 bytes .../svg-filter-displacement-color-srgb.png | Bin 0 -> 374 bytes .../svg-filter-displacement-default.png | Bin 0 -> 374 bytes ...vg-filter-displacement-empty-generated.png | Bin 0 -> 213 bytes ...vg-filter-displacement-generated-color.png | Bin 0 -> 204 bytes ...svg-filter-displacement-half-alpha-map.png | Bin 0 -> 306 bytes ...-filter-displacement-input-default-in2.png | Bin 0 -> 372 bytes ...g-filter-displacement-input-unknown-in.png | Bin 0 -> 225 bytes .../svg-filter-displacement-map-region.png | Bin 0 -> 344 bytes .../svg-filter-displacement-opacity.png | Bin 0 -> 309 bytes .../chromium/svg-filter-displacement-path.png | Bin 0 -> 790 bytes ...vg-filter-displacement-primitive-units.png | Bin 0 -> 376 bytes .../svg-filter-displacement-quarter-turn.png | Bin 0 -> 318 bytes ...svg-filter-displacement-region-percent.png | Bin 0 -> 304 bytes ...svg-filter-displacement-scale-fraction.png | Bin 0 -> 305 bytes .../svg-filter-displacement-scale-invalid.png | Bin 0 -> 374 bytes ...svg-filter-displacement-scale-negative.png | Bin 0 -> 372 bytes ...svg-filter-displacement-scale-positive.png | Bin 0 -> 372 bytes ...lter-displacement-scale-trailing-comma.png | Bin 0 -> 372 bytes ...vg-filter-displacement-scale-transform.png | Bin 0 -> 494 bytes .../svg-filter-displacement-scale-zero.png | Bin 0 -> 374 bytes ...svg-filter-displacement-selector-alpha.png | Bin 0 -> 372 bytes .../svg-filter-displacement-selector-axes.png | Bin 0 -> 376 bytes .../svg-filter-displacement-selector-blue.png | Bin 0 -> 374 bytes ...g-filter-displacement-selector-default.png | Bin 0 -> 372 bytes ...g-filter-displacement-selector-grammar.png | Bin 0 -> 372 bytes ...svg-filter-displacement-selector-green.png | Bin 0 -> 369 bytes .../svg-filter-displacement-selector-red.png | Bin 0 -> 399 bytes ...g-filter-displacement-source-alpha-map.png | Bin 0 -> 344 bytes ...svg-filter-displacement-source-rgb-map.png | Bin 0 -> 434 bytes .../svg-filter-displacement-stroke.png | Bin 0 -> 319 bytes ...vg-filter-displacement-transparent-map.png | Bin 0 -> 309 bytes ...ter-displacement-turbulence-map-linear.png | Bin 0 -> 566 bytes ...svg-filter-displacement-turbulence-map.png | Bin 0 -> 565 bytes .../chromium/svg-filter-displacement-use.png | Bin 0 -> 282 bytes .../svg-filter-displacement-viewbox.png | Bin 0 -> 342 bytes .../svg-filter-turbulence-base-comma.png | Bin 0 -> 7957 bytes .../svg-filter-turbulence-base-invalid.png | Bin 0 -> 204 bytes ...g-filter-turbulence-base-negative-axis.png | Bin 0 -> 204 bytes .../svg-filter-turbulence-base-one.png | Bin 0 -> 7401 bytes ...g-filter-turbulence-base-plus-exponent.png | Bin 0 -> 7401 bytes ...-filter-turbulence-base-trailing-comma.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-base-two.png | Bin 0 -> 7957 bytes .../svg-filter-turbulence-color-default.png | Bin 0 -> 8246 bytes .../svg-filter-turbulence-color-linear.png | Bin 0 -> 8246 bytes .../svg-filter-turbulence-color-srgb.png | Bin 0 -> 8803 bytes .../svg-filter-turbulence-default.png | Bin 0 -> 204 bytes ...svg-filter-turbulence-displacement-map.png | Bin 0 -> 726 bytes .../svg-filter-turbulence-empty-source.png | Bin 0 -> 7301 bytes ...-filter-turbulence-fractal-octave-zero.png | Bin 0 -> 202 bytes ...filter-turbulence-fractional-translate.png | Bin 0 -> 8821 bytes .../svg-filter-turbulence-graph-blend.png | Bin 0 -> 7148 bytes ...g-filter-turbulence-graph-result-reuse.png | Bin 0 -> 7860 bytes .../svg-filter-turbulence-octave-cap.png | Bin 0 -> 8889 bytes .../svg-filter-turbulence-octave-grammar.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-octave-negative.png | Bin 0 -> 204 bytes .../svg-filter-turbulence-octave-nine.png | Bin 0 -> 8889 bytes .../svg-filter-turbulence-octave-one.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-octave-two.png | Bin 0 -> 8324 bytes .../svg-filter-turbulence-octave-zero.png | Bin 0 -> 204 bytes .../svg-filter-turbulence-quarter-turn.png | Bin 0 -> 8797 bytes .../svg-filter-turbulence-region-percent.png | Bin 0 -> 3256 bytes ...lter-turbulence-region-stitch-fraction.png | Bin 0 -> 2142 bytes .../svg-filter-turbulence-seed-fraction.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-seed-grammar.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-seed-negative.png | Bin 0 -> 7308 bytes .../svg-filter-turbulence-seed-one.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-seed-zero.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-stitch-grammar.png | Bin 0 -> 7818 bytes .../svg-filter-turbulence-stitch-none.png | Bin 0 -> 7818 bytes .../chromium/svg-filter-turbulence-stitch.png | Bin 0 -> 7841 bytes .../svg-filter-turbulence-type-fractal.png | Bin 0 -> 5930 bytes .../svg-filter-turbulence-type-grammar.png | Bin 0 -> 7401 bytes .../svg-filter-turbulence-type-turbulence.png | Bin 0 -> 7401 bytes .../chromium/svg-filter-turbulence-use.png | Bin 0 -> 8810 bytes .../svg-filter-turbulence-viewbox.png | Bin 0 -> 8787 bytes fixtures/web-first/oracle-bake.json | 686 +++++++++++++++++- fixtures/web-first/primitives.json | 608 ++++++++++++++++ .../svg-filter-displacement-color-linear.svg | 10 + .../svg-filter-displacement-color-srgb.svg | 10 + .../svg-filter-displacement-default.svg | 10 + ...vg-filter-displacement-empty-generated.svg | 6 + ...vg-filter-displacement-generated-color.svg | 10 + ...svg-filter-displacement-half-alpha-map.svg | 10 + ...-filter-displacement-input-default-in2.svg | 10 + ...g-filter-displacement-input-unknown-in.svg | 10 + .../svg-filter-displacement-map-region.svg | 10 + .../svg-filter-displacement-opacity.svg | 10 + .../svg-filter-displacement-path.svg | 6 + ...vg-filter-displacement-primitive-units.svg | 10 + .../svg-filter-displacement-quarter-turn.svg | 10 + ...svg-filter-displacement-region-percent.svg | 10 + ...svg-filter-displacement-scale-fraction.svg | 10 + .../svg-filter-displacement-scale-invalid.svg | 10 + ...svg-filter-displacement-scale-negative.svg | 10 + ...svg-filter-displacement-scale-positive.svg | 10 + ...lter-displacement-scale-trailing-comma.svg | 10 + ...vg-filter-displacement-scale-transform.svg | 10 + .../svg-filter-displacement-scale-zero.svg | 10 + ...svg-filter-displacement-selector-alpha.svg | 10 + .../svg-filter-displacement-selector-axes.svg | 10 + .../svg-filter-displacement-selector-blue.svg | 10 + ...g-filter-displacement-selector-default.svg | 10 + ...g-filter-displacement-selector-grammar.svg | 10 + ...svg-filter-displacement-selector-green.svg | 10 + .../svg-filter-displacement-selector-red.svg | 10 + ...g-filter-displacement-source-alpha-map.svg | 10 + ...svg-filter-displacement-source-rgb-map.svg | 10 + .../svg-filter-displacement-stroke.svg | 6 + ...vg-filter-displacement-transparent-map.svg | 10 + ...ter-displacement-turbulence-map-linear.svg | 10 + ...svg-filter-displacement-turbulence-map.svg | 10 + .../web-first/svg-filter-displacement-use.svg | 5 + .../svg-filter-displacement-viewbox.svg | 10 + .../svg-filter-turbulence-base-comma.svg | 10 + .../svg-filter-turbulence-base-invalid.svg | 10 + ...g-filter-turbulence-base-negative-axis.svg | 10 + .../svg-filter-turbulence-base-one.svg | 10 + ...g-filter-turbulence-base-plus-exponent.svg | 10 + ...-filter-turbulence-base-trailing-comma.svg | 10 + .../svg-filter-turbulence-base-two.svg | 10 + .../svg-filter-turbulence-color-default.svg | 10 + .../svg-filter-turbulence-color-linear.svg | 10 + .../svg-filter-turbulence-color-srgb.svg | 10 + .../svg-filter-turbulence-default.svg | 10 + ...svg-filter-turbulence-displacement-map.svg | 10 + .../svg-filter-turbulence-empty-source.svg | 6 + ...-filter-turbulence-fractal-octave-zero.svg | 10 + ...filter-turbulence-fractional-translate.svg | 10 + .../svg-filter-turbulence-graph-blend.svg | 10 + ...g-filter-turbulence-graph-result-reuse.svg | 10 + .../svg-filter-turbulence-octave-cap.svg | 10 + .../svg-filter-turbulence-octave-grammar.svg | 10 + .../svg-filter-turbulence-octave-negative.svg | 10 + .../svg-filter-turbulence-octave-nine.svg | 10 + .../svg-filter-turbulence-octave-one.svg | 10 + .../svg-filter-turbulence-octave-two.svg | 10 + .../svg-filter-turbulence-octave-zero.svg | 10 + .../svg-filter-turbulence-quarter-turn.svg | 10 + .../svg-filter-turbulence-region-percent.svg | 10 + ...lter-turbulence-region-stitch-fraction.svg | 10 + .../svg-filter-turbulence-seed-fraction.svg | 10 + .../svg-filter-turbulence-seed-grammar.svg | 10 + .../svg-filter-turbulence-seed-negative.svg | 10 + .../svg-filter-turbulence-seed-one.svg | 10 + .../svg-filter-turbulence-seed-zero.svg | 10 + .../svg-filter-turbulence-stitch-grammar.svg | 10 + .../svg-filter-turbulence-stitch-none.svg | 10 + .../svg-filter-turbulence-stitch.svg | 10 + .../svg-filter-turbulence-type-fractal.svg | 10 + .../svg-filter-turbulence-type-grammar.svg | 10 + .../svg-filter-turbulence-type-turbulence.svg | 10 + .../web-first/svg-filter-turbulence-use.svg | 5 + .../svg-filter-turbulence-viewbox.svg | 10 + fixtures/web-first/unsupported/README.md | 5 +- ...svg-filter-displacement-clip-precision.svg | 13 + ...ilter-displacement-transform-precision.svg | 10 + .../unsupported/svg-filter-primitive.svg | 5 +- ...-filter-turbulence-transform-precision.svg | 7 + 175 files changed, 3415 insertions(+), 98 deletions(-) create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-color-linear.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-color-srgb.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-default.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-empty-generated.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-generated-color.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-half-alpha-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-input-default-in2.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-input-unknown-in.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-map-region.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-opacity.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-path.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-primitive-units.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-quarter-turn.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-region-percent.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-fraction.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-invalid.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-negative.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-positive.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-trailing-comma.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-transform.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-scale-zero.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-alpha.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-axes.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-blue.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-default.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-grammar.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-green.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-selector-red.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-source-alpha-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-source-rgb-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-stroke.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-transparent-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-turbulence-map-linear.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-turbulence-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-use.png create mode 100644 fixtures/web-first/chromium/svg-filter-displacement-viewbox.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-comma.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-invalid.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-negative-axis.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-one.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-plus-exponent.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-trailing-comma.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-base-two.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-color-default.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-color-linear.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-color-srgb.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-default.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-displacement-map.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-empty-source.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-fractal-octave-zero.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-fractional-translate.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-graph-blend.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-graph-result-reuse.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-cap.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-grammar.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-negative.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-nine.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-one.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-two.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-octave-zero.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-quarter-turn.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-region-percent.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-region-stitch-fraction.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-seed-fraction.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-seed-grammar.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-seed-negative.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-seed-one.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-seed-zero.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-stitch-grammar.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-stitch-none.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-stitch.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-type-fractal.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-type-grammar.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-type-turbulence.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-use.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-viewbox.png create mode 100644 fixtures/web-first/svg-filter-displacement-color-linear.svg create mode 100644 fixtures/web-first/svg-filter-displacement-color-srgb.svg create mode 100644 fixtures/web-first/svg-filter-displacement-default.svg create mode 100644 fixtures/web-first/svg-filter-displacement-empty-generated.svg create mode 100644 fixtures/web-first/svg-filter-displacement-generated-color.svg create mode 100644 fixtures/web-first/svg-filter-displacement-half-alpha-map.svg create mode 100644 fixtures/web-first/svg-filter-displacement-input-default-in2.svg create mode 100644 fixtures/web-first/svg-filter-displacement-input-unknown-in.svg create mode 100644 fixtures/web-first/svg-filter-displacement-map-region.svg create mode 100644 fixtures/web-first/svg-filter-displacement-opacity.svg create mode 100644 fixtures/web-first/svg-filter-displacement-path.svg create mode 100644 fixtures/web-first/svg-filter-displacement-primitive-units.svg create mode 100644 fixtures/web-first/svg-filter-displacement-quarter-turn.svg create mode 100644 fixtures/web-first/svg-filter-displacement-region-percent.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-fraction.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-invalid.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-negative.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-positive.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-trailing-comma.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-transform.svg create mode 100644 fixtures/web-first/svg-filter-displacement-scale-zero.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-alpha.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-axes.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-blue.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-default.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-grammar.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-green.svg create mode 100644 fixtures/web-first/svg-filter-displacement-selector-red.svg create mode 100644 fixtures/web-first/svg-filter-displacement-source-alpha-map.svg create mode 100644 fixtures/web-first/svg-filter-displacement-source-rgb-map.svg create mode 100644 fixtures/web-first/svg-filter-displacement-stroke.svg create mode 100644 fixtures/web-first/svg-filter-displacement-transparent-map.svg create mode 100644 fixtures/web-first/svg-filter-displacement-turbulence-map-linear.svg create mode 100644 fixtures/web-first/svg-filter-displacement-turbulence-map.svg create mode 100644 fixtures/web-first/svg-filter-displacement-use.svg create mode 100644 fixtures/web-first/svg-filter-displacement-viewbox.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-comma.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-invalid.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-negative-axis.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-one.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-plus-exponent.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-trailing-comma.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-base-two.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-color-default.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-color-linear.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-color-srgb.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-default.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-displacement-map.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-empty-source.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-fractal-octave-zero.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-fractional-translate.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-graph-blend.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-graph-result-reuse.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-cap.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-grammar.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-negative.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-nine.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-one.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-two.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-octave-zero.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-quarter-turn.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-region-percent.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-region-stitch-fraction.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-seed-fraction.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-seed-grammar.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-seed-negative.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-seed-one.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-seed-zero.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-stitch-grammar.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-stitch-none.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-stitch.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-type-fractal.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-type-grammar.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-type-turbulence.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-use.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-viewbox.svg create mode 100644 fixtures/web-first/unsupported/svg-filter-displacement-clip-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-filter-displacement-transform-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-filter-turbulence-transform-precision.svg diff --git a/crates/n0/src/drawlist.rs b/crates/n0/src/drawlist.rs index 7346bb64..da9cf277 100644 --- a/crates/n0/src/drawlist.rs +++ b/crates/n0/src/drawlist.rs @@ -104,6 +104,20 @@ pub(crate) enum ResolvedFilterMorphology { Dilate, } +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum ResolvedFilterTurbulenceKind { + Turbulence, + FractalNoise, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum ResolvedFilterDisplacementChannel { + Red, + Green, + Blue, + Alpha, +} + /// The private filter-operation vocabulary admitted by the painter. #[derive(Debug, Clone, PartialEq)] pub(crate) enum ResolvedFilterPrimitive { @@ -144,6 +158,19 @@ pub(crate) enum ResolvedFilterPrimitive { radius_x: f32, radius_y: f32, }, + Turbulence { + kind: ResolvedFilterTurbulenceKind, + base_frequency_x: f32, + base_frequency_y: f32, + num_octaves: u8, + seed: f32, + stitch_tiles: bool, + }, + DisplacementMap { + scale: f32, + x_channel: ResolvedFilterDisplacementChannel, + y_channel: ResolvedFilterDisplacementChannel, + }, Merge, } @@ -160,6 +187,14 @@ pub(crate) struct ResolvedFilterNode { pub struct ResolvedFilter { pub(crate) region: n0_model::math::RectF, pub(crate) nodes: Arc<[ResolvedFilterNode]>, + /// Whether the graph can create output from a fully transparent source. + /// Such a graph needs one explicit transparent source raster even when + /// its scope contains no draw item, or a lazy layer restore is skipped. + pub(crate) may_paint_transparent_input: bool, + /// The invocation's isolated source is known to be fully transparent. + /// Source references are materialized explicitly so generated/additive + /// graph output is not skipped by a lazy backend layer. + pub(crate) source_is_transparent: bool, } /// Product-local owner slot for a source-neutral glyphless frame. diff --git a/crates/n0/src/glyphless.rs b/crates/n0/src/glyphless.rs index 4bbe4f1a..d13fbcc5 100644 --- a/crates/n0/src/glyphless.rs +++ b/crates/n0/src/glyphless.rs @@ -23,17 +23,18 @@ use n0_model::model::{ }; use n0_model::path::ResolvedPathArtifact; use rframe::{ - ClipPath, FilterBlend, FilterColorSpace, FilterComposite, FilterInput, FilterMorphology, - FilterPrimitive, FilterProgram, Frame, FrameItem, Geometry, MaskMode, PaintStack, ScopeEffect, - VisualRef, + ClipPath, FilterBlend, FilterColorSpace, FilterComposite, FilterDisplacementChannel, + FilterInput, FilterMorphology, FilterPrimitive, FilterTurbulenceKind, Frame, FrameItem, + Geometry, MaskMode, PaintStack, ScopeEffect, VisualRef, }; use crate::damage::{diff_inputs, DamageOwner, FrameDamageInput}; use crate::drawlist::{ DrawList, GlyphlessOwnerSlot, Item, ItemKind, PostPaintOpacity, ResolvedClipGeometry, ResolvedClipGeometryKind, ResolvedClipLayer, ResolvedClipPath, ResolvedFilter, - ResolvedFilterBlend, ResolvedFilterColorSpace, ResolvedFilterComposite, ResolvedFilterInput, - ResolvedFilterMorphology, ResolvedFilterNode, ResolvedFilterPrimitive, ResolvedMaskMode, + ResolvedFilterBlend, ResolvedFilterColorSpace, ResolvedFilterComposite, + ResolvedFilterDisplacementChannel, ResolvedFilterInput, ResolvedFilterMorphology, + ResolvedFilterNode, ResolvedFilterPrimitive, ResolvedFilterTurbulenceKind, ResolvedMaskMode, StrokeDashPhase, }; use crate::frame::FrameExecutionError; @@ -386,7 +387,7 @@ pub fn compile(resolved: Frame) -> Result { OpenScopeKind::Clip { bounds } } ScopeEffect::Filter(filter) => { - let compiled = Arc::new(compile_filter(filter.program(), filter.region())); + let compiled = Arc::new(compile_filter(filter)); if let Err(reason) = crate::paint::preflight_filter(&compiled) { return Err(BuildError::Filter { owner: scope.owner, @@ -871,7 +872,8 @@ fn compile_clip_path(clip: &ClipPath) -> ResolvedClipPath { /// Project one checked, source-neutral filter program into private painter /// material. Every index and scalar has already been validated by `rframe`; /// this is a vocabulary translation, not a second resolver. -fn compile_filter(program: &FilterProgram, region: math2::Rectangle) -> ResolvedFilter { +fn compile_filter(filter: &rframe::Filter) -> ResolvedFilter { + let program = filter.program(); let nodes = program .iter() .map(|node| ResolvedFilterNode { @@ -969,14 +971,65 @@ fn compile_filter(program: &FilterProgram, region: math2::Rectangle) -> Resolved radius_x, radius_y, }, + FilterPrimitive::Turbulence { + kind, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + stitch_tiles, + } => ResolvedFilterPrimitive::Turbulence { + kind: match kind { + FilterTurbulenceKind::Turbulence => { + ResolvedFilterTurbulenceKind::Turbulence + } + FilterTurbulenceKind::FractalNoise => { + ResolvedFilterTurbulenceKind::FractalNoise + } + }, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + stitch_tiles, + }, + FilterPrimitive::DisplacementMap { + scale, + x_channel, + y_channel, + } => ResolvedFilterPrimitive::DisplacementMap { + scale, + x_channel: match x_channel { + FilterDisplacementChannel::Red => ResolvedFilterDisplacementChannel::Red, + FilterDisplacementChannel::Green => { + ResolvedFilterDisplacementChannel::Green + } + FilterDisplacementChannel::Blue => ResolvedFilterDisplacementChannel::Blue, + FilterDisplacementChannel::Alpha => { + ResolvedFilterDisplacementChannel::Alpha + } + }, + y_channel: match y_channel { + FilterDisplacementChannel::Red => ResolvedFilterDisplacementChannel::Red, + FilterDisplacementChannel::Green => { + ResolvedFilterDisplacementChannel::Green + } + FilterDisplacementChannel::Blue => ResolvedFilterDisplacementChannel::Blue, + FilterDisplacementChannel::Alpha => { + ResolvedFilterDisplacementChannel::Alpha + } + }, + }, FilterPrimitive::Merge => ResolvedFilterPrimitive::Merge, }, }) .collect::>() .into(); ResolvedFilter { - region: to_rectf(region), + region: to_rectf(filter.region()), nodes, + may_paint_transparent_input: program.may_paint_transparent_input(), + source_is_transparent: filter.source_is_transparent(), } } @@ -1540,8 +1593,8 @@ mod tests { }; use n0_model::resolve::ResolveOptions; use rframe::{ - Filter, FilterNode, FrameItems, FrameNode, Identity, PaintAlphaFactor, Provenance, Scope, - ScopeOpacity, + Filter, FilterNode, FilterProgram, FrameItems, FrameNode, Identity, PaintAlphaFactor, + Provenance, Scope, ScopeOpacity, }; use skia_safe::surfaces; diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index d2a5b745..e0c8e818 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -27,17 +27,18 @@ use skia_safe::canvas::{SaveLayerFlags, SaveLayerRec}; use skia_safe::gradient::{Colors as GradientColors, Gradient, Interpolation}; use skia_safe::{ image::CachingHint, path_effect::PathEffect, shaders, stroke_rec::InitStyle, Blender, Canvas, - ClipOp, Color, Color4f, ColorMatrix, ColorSpace, CubicResampler, Data, Font, Image, - ImageFilter, ImageInfo, Matrix, OpBuilder, Paint, PaintCap, PaintJoin, PaintStyle, Path, - PathBuilder, PathDirection, PathFillType, PathOp, Point, RRect, Rect, SamplingOptions, Shader, - StrokeRec, + ClipOp, Color, Color4f, ColorChannel, ColorMatrix, ColorSpace, CubicResampler, Data, Font, + ISize, Image, ImageFilter, ImageInfo, Matrix, OpBuilder, Paint, PaintCap, PaintJoin, + PaintStyle, Path, PathBuilder, PathDirection, PathFillType, PathOp, Point, RRect, Rect, + SamplingOptions, Shader, StrokeRec, }; use crate::drawlist::{ DrawList, ItemKind, PostPaintOpacity, ResolvedClipGeometry, ResolvedClipGeometryKind, ResolvedClipLayer, ResolvedClipPath, ResolvedFilter, ResolvedFilterBlend, - ResolvedFilterColorSpace, ResolvedFilterComposite, ResolvedFilterInput, - ResolvedFilterMorphology, ResolvedFilterPrimitive, ResolvedMaskMode, StrokeDashPhase, + ResolvedFilterColorSpace, ResolvedFilterComposite, ResolvedFilterDisplacementChannel, + ResolvedFilterInput, ResolvedFilterMorphology, ResolvedFilterPrimitive, + ResolvedFilterTurbulenceKind, ResolvedMaskMode, StrokeDashPhase, }; /// The gradient family whose local matrix could not be represented by the @@ -1938,6 +1939,10 @@ struct BuiltFilterResult { /// input through one additional source-image boundary. Preserve that /// measured boundary through later graph nodes. source_preflatten: bool, + /// A linear procedural source crosses Chromium's native final restore + /// after gamma conversion. The exact generated-source byte restore used + /// by solid and composite graphs differs by one channel level here. + requires_native_restore: bool, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -1999,6 +2004,7 @@ fn convert_filter_space( // matrix-specific sRGB restore boundary. color_restore: None, source_preflatten: result.source_preflatten, + requires_native_restore: result.requires_native_restore, }) } @@ -2208,27 +2214,48 @@ fn deterministic_filter_blender(mode: ResolvedFilterBlend) -> Result ColorChannel { + match channel { + ResolvedFilterDisplacementChannel::Red => ColorChannel::R, + ResolvedFilterDisplacementChannel::Green => ColorChannel::G, + ResolvedFilterDisplacementChannel::Blue => ColorChannel::B, + ResolvedFilterDisplacementChannel::Alpha => ColorChannel::A, + } +} + /// Build one checked private filter graph and its final-composition policy. fn build_filter(filter: &ResolvedFilter) -> Result { + let explicit_transparent_source = if filter.source_is_transparent { + Some(transparent_filter(filter.region).ok_or_else(|| { + "the backend could not construct an explicit transparent filter source".to_string() + })?) + } else { + None + }; let source = BuiltFilterResult { - image_filter: None, + image_filter: explicit_transparent_source.clone(), color_space: ResolvedFilterColorSpace::Srgb, source_dependent: true, requires_exact_restore: false, color_restore: None, source_preflatten: false, + requires_native_restore: false, }; - let source_alpha = - BuiltFilterResult { - image_filter: Some(source_alpha_filter().ok_or_else(|| { + let source_alpha = BuiltFilterResult { + image_filter: if let Some(source) = explicit_transparent_source { + Some(source) + } else { + Some(source_alpha_filter().ok_or_else(|| { "the backend could not construct the SourceAlpha input".to_string() - })?), - color_space: ResolvedFilterColorSpace::Srgb, - source_dependent: true, - requires_exact_restore: false, - color_restore: None, - source_preflatten: false, - }; + })?) + }, + color_space: ResolvedFilterColorSpace::Srgb, + source_dependent: true, + requires_exact_restore: false, + color_restore: None, + source_preflatten: false, + requires_native_restore: false, + }; let mut results: Vec = Vec::with_capacity(filter.nodes.len()); for node in filter.nodes.iter() { let mut inputs = Vec::with_capacity(node.inputs.len()); @@ -2292,6 +2319,12 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ResolvedFilterPrimitive::Morphology { radius_x, radius_y, .. } if source_dependent && (*radius_x > 0.0 || *radius_y > 0.0) ); + let requires_native_restore = inputs.iter().any(|input| input.requires_native_restore) + || matches!( + &node.primitive, + ResolvedFilterPrimitive::Turbulence { .. } + if node.color_space == ResolvedFilterColorSpace::LinearRgb + ); let (image_filter, output_space, source_dependent, requires_exact_restore) = match node .primitive .clone() @@ -2599,6 +2632,71 @@ fn build_filter(filter: &ResolvedFilter) -> Result { requires_exact_restore, ) } + ResolvedFilterPrimitive::Turbulence { + kind, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + stitch_tiles, + } => { + // Blink truncates the finite primitive subregion dimensions + // to signed integer tile lengths before constructing a + // stitched Perlin source. Rust's float-to-int cast has the + // same saturating, truncating contract. + let tile_size = + stitch_tiles.then(|| ISize::new(node.region.w as i32, node.region.h as i32)); + let shader = match kind { + ResolvedFilterTurbulenceKind::Turbulence => shaders::turbulence( + (base_frequency_x, base_frequency_y), + usize::from(num_octaves), + seed, + tile_size, + ), + ResolvedFilterTurbulenceKind::FractalNoise => shaders::fractal_noise( + (base_frequency_x, base_frequency_y), + usize::from(num_octaves), + seed, + tile_size, + ), + } + .ok_or_else(|| "the backend could not construct a turbulence shader".to_string())?; + let filter = skia_safe::image_filters::shader(shader, crop).ok_or_else(|| { + "the backend could not construct a turbulence operation".to_string() + })?; + (Some(filter), node.color_space, false, false) + } + ResolvedFilterPrimitive::DisplacementMap { + scale, + x_channel, + y_channel, + } => { + let displacement = inputs + .pop() + .expect("displacement map has two checked inputs"); + let color = inputs + .pop() + .expect("displacement map has two checked inputs"); + let filter = skia_safe::image_filters::displacement_map( + ( + sk_displacement_channel(x_channel), + sk_displacement_channel(y_channel), + ), + scale, + displacement.image_filter, + color.image_filter, + crop, + ) + .ok_or_else(|| { + "the backend could not construct a displacement-map operation".to_string() + })?; + ( + Some(filter), + node.color_space, + source_dependent, + requires_exact_restore, + ) + } ResolvedFilterPrimitive::Merge => { let mut inputs = inputs.into_iter(); let image_filter = if let Some(first) = inputs.next() { @@ -2648,6 +2746,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { requires_exact_restore, color_restore, source_preflatten, + requires_native_restore, }); } let output = results @@ -2675,6 +2774,8 @@ fn build_filter(filter: &ResolvedFilter) -> Result { } let restore_blender = if output.requires_exact_restore { Some(exact_unorm8_blender(ResolvedFilterComposite::Over)?) + } else if output.requires_native_restore { + None } else if output.color_restore == Some(ColorRestore::Floating) { Some(floating_porter_duff_blender(ResolvedFilterComposite::Over)?) } else if output.color_restore == Some(ColorRestore::Default) || output.source_dependent { @@ -2738,6 +2839,8 @@ mod filter_policy_tests { matrix: identity(alpha_offset), }, }]), + may_paint_transparent_input: alpha_offset > 0.0, + source_is_transparent: false, } } @@ -2776,6 +2879,8 @@ mod filter_policy_tests { }, }, ]), + may_paint_transparent_input: true, + source_is_transparent: false, }; let generated = build_filter(&generated).expect("generated matrix builds"); assert!(!generated.source_preflatten); @@ -2804,6 +2909,8 @@ mod filter_policy_tests { let source = ResolvedFilter { region: REGION, nodes: Arc::from([transfer(ResolvedFilterInput::Source, identity_tables(0))]), + may_paint_transparent_input: false, + source_is_transparent: false, }; let source = build_filter(&source).expect("source table builds"); assert!(source.source_preflatten); @@ -2812,6 +2919,8 @@ mod filter_policy_tests { let alpha_creating = ResolvedFilter { region: REGION, nodes: Arc::from([transfer(ResolvedFilterInput::Source, identity_tables(127))]), + may_paint_transparent_input: true, + source_is_transparent: false, }; let alpha_creating = build_filter(&alpha_creating).expect("alpha table builds"); assert!(alpha_creating.source_preflatten); @@ -2830,6 +2939,8 @@ mod filter_policy_tests { }, transfer(ResolvedFilterInput::Node(0), identity_tables(0)), ]), + may_paint_transparent_input: true, + source_is_transparent: false, }; let generated = build_filter(&generated).expect("generated table builds"); assert!(!generated.source_preflatten); @@ -2851,6 +2962,8 @@ mod filter_policy_tests { let one = |node| ResolvedFilter { region: REGION, nodes: Arc::from([node]), + may_paint_transparent_input: false, + source_is_transparent: false, }; let active = build_filter(&one(morphology( @@ -2903,6 +3016,8 @@ mod filter_policy_tests { ResolvedFilterColorSpace::Srgb, ), ]), + may_paint_transparent_input: true, + source_is_transparent: false, }; let generated = build_filter(&generated).expect("generated morphology builds"); assert!(!generated.source_preflatten); @@ -3339,6 +3454,25 @@ pub fn execute_unchecked(canvas: &Canvas, list: &DrawList, view: &Affine, if built_filter.source_preflatten { canvas.save_layer(&SaveLayerRec::default()); } + if filter.source_is_transparent && filter.may_paint_transparent_input { + // A source-independent primitive still needs a material + // source layer for Skia to evaluate its restore filter. + // Seed that lazy layer with an opaque Src draw; the graph + // cannot observe it because every Source input was replaced + // above by an explicit transparent filter. + let mut seed = Paint::default(); + seed.set_blend_mode(skia_safe::BlendMode::Src); + let region = Rect::from_xywh( + filter.region.x, + filter.region.y, + filter.region.w, + filter.region.h, + ); + // This raster only forces the lazy-layer restore to run and + // cannot leak into graph output. + seed.set_color(Color::BLACK); + canvas.draw_rect(region, &seed); + } scopes.push(Scope::Filter { source_preflatten: built_filter.source_preflatten, }); diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index fb416426..0af1b1e1 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -403,6 +403,30 @@ cargo run -p n0_cli --bin n0 -- \ retained fill-only ellipse coverage boundary. Rounded rectangles, curved paths, and circle/path strokes stay admitted. That last patrol leaves gridaco/nothing#88 separate and unchanged. + Turbulence carries both procedural formulas: the case-sensitive values + `turbulence` and `fractalNoise`, one/two-axis non-negative `baseFrequency`, + integer `numOctaves` capped at nine, signed `seed`, and the case-sensitive + values `stitch` and `noStitch`. Missing and invalid fields take their measured + initials; either negative frequency resets the pair, zero octaves still + reaches the selected formula, and a negative octave count produces a + transparent image. The generated source is bounded by its primitive region + and participates in its declared filter color space. A user-space filter may + therefore paint a target + whose isolated source is fully transparent; object-box filter units on the + same zero-area target produce no region and paint nothing. + Displacement map carries two ordered image inputs, a finite signed `scale`, + and independent case-sensitive `R | G | B | A` selectors with initial alpha. + Selection reads non-premultiplied map channels after conversion into the + primitive's filter color space. Under object-box primitive units Chromium's + one native displacement scalar uses the target width for both axes. Exact + evidence covers transparent and partial-alpha maps, source/source-alpha and + generated maps, procedural maps, hard regions, stroke/path sources, opacity, + safe axis mappings, exact quarter turns, ``, and non-uniform `viewBox`. + General rotations and shears for either primitive, and geometric clipping + around displacement, refuse by three stable precision names. Axis maps, + fractional translation and scale, reflections, and exact quarter turns stay + admitted. The wider shared graph, region, color, resource, and animation + surfaces retain their own boundaries. `filterUnits` and `primitiveUnits` carry their complete case-sensitive `userSpaceOnUse | objectBoundingBox` grammars, defaults, and invalid-value fallbacks. Filter and primitive regions accept admitted finite numbers, @@ -424,24 +448,25 @@ cargo run -p n0_cli --bin n0 -- \ boundary: the first full-workspace hosted-x86 run differed in nine cells and 1,633 pixels, all by one channel level, at the final filter-layer restore. Its scoped exact byte-domain restore leaves zero radius and later color-space - conversion on their prior paths. The same hosted workspace test now passes, - so all two hundred forty-eight Chromium-baked filter cells are exact on the - current ARM host and hosted x86 without a tolerance. The filter - estate is twenty-six from the chassis/blur slice, sixty from the - shadow-graph rung, twenty-eight from native drop shadow, twenty-seven from - color matrix, thirty-two from component transfer, and thirty-eight from - blend, plus thirty-seven from morphology. The complete corpus is 609 - Chromium-baked cells plus 10 sampled frames, with 140 - named refusal rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, - `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, - `feMorphology`, `feFuncR`, `feFuncG`, `feFuncB`, `feFuncA`, `k1`–`k4`, - `amplitude`, `exponent`, - `intercept`, `slope`, `tableValues`, and blend-only `mode` close; `feOffset`, - `feGaussianBlur`, ``, + conversion on their prior paths. The same hosted workspace test covers the + earlier two hundred forty-eight-cell estate; all three hundred twenty-four + Chromium-baked filter cells are exact on the current ARM host without a + tolerance. The filter estate contains 26 chassis/blur cells, 60 shadow-graph, + 28 native drop-shadow, 27 color-matrix, 32 component-transfer, 38 blend, 37 + morphology, and 76 turbulence/displacement cells. The complete corpus + contains 685 Chromium-baked cells plus 10 sampled frames, with 143 named + refusal rows. `feFlood`, `feComposite`, + `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, + `feComponentTransfer`, `feBlend`, + `feMorphology`, `feTurbulence`, `feDisplacementMap`, `feFuncR`, `feFuncG`, + `feFuncB`, `feFuncA`, `k1`–`k4`, `amplitude`, `exponent`, `intercept`, + `slope`, `tableValues`, blend-only `mode`, `baseFrequency`, `numOctaves`, + `seed`, `stitchTiles`, displacement `scale`, `xChannelSelector`, and + `yChannelSelector` close; `feOffset`, `feGaussianBlur`, ``, `filter`, `color-interpolation-filters`, `in`, `in2`, `operator`, `result`, `radius`, `dx`, `dy`, `stdDeviation`, `flood-color`, and `flood-opacity` - remain open for - the named precision, applicability, resource, cascade, or value remainder. + remain open for the named precision, applicability, resource, cascade, or + value remainder. A stroke is centred, its width is a cascaded length in either spelling — numbers, absolute units, `em`/`rem` against an authored or default font-size, percentages against the normalized diagonal, and pure-length diff --git a/crates/rframe/src/filter.rs b/crates/rframe/src/filter.rs index aed647fb..daca866a 100644 --- a/crates/rframe/src/filter.rs +++ b/crates/rframe/src/filter.rs @@ -81,6 +81,22 @@ pub enum FilterMorphology { Dilate, } +/// One source-neutral procedural-noise formula. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum FilterTurbulenceKind { + Turbulence, + FractalNoise, +} + +/// One non-premultiplied channel selected from a displacement image. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum FilterDisplacementChannel { + Red, + Green, + Blue, + Alpha, +} + /// Four exact byte lookup tables for one non-premultiplied RGBA operation. /// /// Channel order is named at construction and access, so a producer cannot @@ -170,6 +186,22 @@ pub enum FilterPrimitive { radius_x: f32, radius_y: f32, }, + /// A bounded four-channel procedural-noise source. The octave count is + /// already capped to the resolved algorithm's meaningful range. + Turbulence { + kind: FilterTurbulenceKind, + base_frequency_x: f32, + base_frequency_y: f32, + num_octaves: u8, + seed: f32, + stitch_tiles: bool, + }, + /// Displace `inputs[0]` by non-premultiplied channels from `inputs[1]`. + DisplacementMap { + scale: f32, + x_channel: FilterDisplacementChannel, + y_channel: FilterDisplacementChannel, + }, Merge, } @@ -254,6 +286,12 @@ pub enum FilterProgramError { InvalidMorphology { node: usize, }, + InvalidTurbulence { + node: usize, + }, + InvalidDisplacementMap { + node: usize, + }, } impl std::fmt::Display for FilterProgramError { @@ -306,6 +344,13 @@ impl std::fmt::Display for FilterProgramError { f, "filter node {node} has a non-finite or negative morphology radius" ), + Self::InvalidTurbulence { node } => write!( + f, + "filter node {node} has a non-finite/negative frequency, non-finite seed, or more than nine octaves" + ), + Self::InvalidDisplacementMap { node } => { + write!(f, "filter node {node} has a non-finite displacement scale") + } } } } @@ -332,8 +377,10 @@ impl FilterProgram { | FilterPrimitive::ColorMatrix { .. } | FilterPrimitive::ComponentTransfer { .. } | FilterPrimitive::Morphology { .. } => Some(1), - FilterPrimitive::SolidColor { .. } => Some(0), - FilterPrimitive::Composite { .. } | FilterPrimitive::Blend { .. } => Some(2), + FilterPrimitive::SolidColor { .. } | FilterPrimitive::Turbulence { .. } => Some(0), + FilterPrimitive::Composite { .. } + | FilterPrimitive::Blend { .. } + | FilterPrimitive::DisplacementMap { .. } => Some(2), FilterPrimitive::Merge => None, }; if let Some(expected) = expected_inputs @@ -399,6 +446,24 @@ impl FilterProgram { { return Err(FilterProgramError::InvalidMorphology { node: index }); } + FilterPrimitive::Turbulence { + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + .. + } if !base_frequency_x.is_finite() + || !base_frequency_y.is_finite() + || base_frequency_x < 0.0 + || base_frequency_y < 0.0 + || num_octaves > 9 + || !seed.is_finite() => + { + return Err(FilterProgramError::InvalidTurbulence { node: index }); + } + FilterPrimitive::DisplacementMap { scale, .. } if !scale.is_finite() => { + return Err(FilterProgramError::InvalidDisplacementMap { node: index }); + } FilterPrimitive::Offset { .. } | FilterPrimitive::SolidColor { .. } | FilterPrimitive::Composite { .. } @@ -407,6 +472,8 @@ impl FilterProgram { | FilterPrimitive::ColorMatrix { .. } | FilterPrimitive::ComponentTransfer { .. } | FilterPrimitive::Morphology { .. } + | FilterPrimitive::Turbulence { .. } + | FilterPrimitive::DisplacementMap { .. } | FilterPrimitive::Merge => {} } } @@ -432,12 +499,14 @@ impl FilterProgram { } => k4 > 0.0, FilterPrimitive::ColorMatrix { matrix } => matrix[19] > 0.0, FilterPrimitive::ComponentTransfer { tables } => tables.alpha()[0] > 0, + FilterPrimitive::Turbulence { .. } => true, FilterPrimitive::GaussianBlur { .. } | FilterPrimitive::Offset { .. } | FilterPrimitive::Composite { .. } | FilterPrimitive::Blend { .. } | FilterPrimitive::DropShadow { .. } | FilterPrimitive::Morphology { .. } + | FilterPrimitive::DisplacementMap { .. } | FilterPrimitive::Merge => false, }) } @@ -469,6 +538,7 @@ pub struct Filter { transform: AffineTransform, region: Rectangle, program: FilterProgram, + source_is_transparent: bool, } impl Filter { @@ -487,9 +557,20 @@ impl Filter { transform, region, program, + source_is_transparent: false, }) } + /// Declare that this invocation's isolated source image is fully + /// transparent. Generated/additive nodes may still paint; a consumer must + /// materialize an explicit transparent source rather than a lazy backend + /// input sentinel for that case. + #[must_use] + pub fn with_transparent_source(mut self) -> Self { + self.source_is_transparent = true; + self + } + #[must_use] pub const fn transform(&self) -> AffineTransform { self.transform @@ -504,6 +585,11 @@ impl Filter { pub const fn program(&self) -> &FilterProgram { &self.program } + + #[must_use] + pub const fn source_is_transparent(&self) -> bool { + self.source_is_transparent + } } fn valid_rect(rect: Rectangle) -> bool { diff --git a/crates/rframe/src/frame.rs b/crates/rframe/src/frame.rs index 9bf7e122..54662304 100644 --- a/crates/rframe/src/frame.rs +++ b/crates/rframe/src/frame.rs @@ -340,9 +340,10 @@ pub struct FrameNode { /// /// A scope's contents are the items between its begin and its end — a /// contiguous span, because an isolated group *is* a contiguous span of -/// painter order. Balance, nesting depth, and non-emptiness are invariants -/// of [`FrameItems`] construction, so a consumer matching on this enum -/// never meets a dangling boundary. +/// painter order. Balance, nesting depth, and meaningful content are +/// invariants of [`FrameItems`] construction, so a consumer matching on this +/// enum never meets a dangling boundary. The one meaningful empty span is a +/// filter whose declared transparent source can itself generate output. #[derive(Clone, Debug, PartialEq)] pub enum FrameItem { /// One resolved painted node. @@ -376,8 +377,8 @@ pub enum FrameItemsError { /// The [`FrameItem::ScopeBegin`] at this index is never closed. UnclosedScope { index: usize }, /// The [`FrameItem::ScopeBegin`] at this index encloses nothing. An - /// empty group is not a resolved visual fact — a producer whose scope - /// resolved to nothing states nothing. + /// empty group is not a resolved visual fact — except for a filter whose + /// declared transparent source can itself generate output. EmptyScope { index: usize }, /// The [`FrameItem::ScopeBegin`] at this index nests deeper than /// [`MAX_SCOPE_DEPTH`]. @@ -439,8 +440,9 @@ impl std::fmt::Display for FrameItemsError { impl std::error::Error for FrameItemsError {} -/// A checked painter-ordered item stream: every scope is balanced, -/// non-empty, and nested within [`MAX_SCOPE_DEPTH`]. +/// A checked painter-ordered item stream: every scope is balanced, meaningful, +/// and nested within [`MAX_SCOPE_DEPTH`]. Only a source-generating filter may +/// be meaningful without enclosed items. /// /// Like [`PathData`], this is a checked type: construction proves the /// invariants once, and a consumer trusts them rather than re-deriving @@ -452,7 +454,7 @@ impl FrameItems { pub fn try_new(items: Vec) -> Result { #[derive(Clone, Copy)] enum OpenKind { - Scope, + Scope { permits_empty: bool }, MaskTarget, MaskSource, } @@ -474,13 +476,20 @@ impl FrameItems { for (index, item) in items.iter().enumerate() { match item { FrameItem::Node(_) => complete_item(&mut open), - FrameItem::ScopeBegin(_) => { + FrameItem::ScopeBegin(scope) => { if open.len() >= MAX_SCOPE_DEPTH { return Err(FrameItemsError::ScopeTooDeep { index }); } open.push(Open { index, - kind: OpenKind::Scope, + kind: OpenKind::Scope { + permits_empty: matches!( + &scope.effect, + crate::scope::ScopeEffect::Filter(filter) + if filter.source_is_transparent() + && filter.program().may_paint_transparent_input() + ), + }, has_content: false, }); } @@ -488,10 +497,10 @@ impl FrameItems { let Some(current) = open.last().copied() else { return Err(FrameItemsError::UnopenedScopeEnd { index }); }; - if !matches!(current.kind, OpenKind::Scope) { + let OpenKind::Scope { permits_empty } = current.kind else { return Err(FrameItemsError::UnopenedScopeEnd { index }); - } - if !current.has_content { + }; + if !current.has_content && !permits_empty { return Err(FrameItemsError::EmptyScope { index: current.index, }); @@ -538,7 +547,7 @@ impl FrameItems { } if let Some(current) = open.first() { return Err(match current.kind { - OpenKind::Scope => FrameItemsError::UnclosedScope { + OpenKind::Scope { .. } => FrameItemsError::UnclosedScope { index: current.index, }, OpenKind::MaskTarget | OpenKind::MaskSource => FrameItemsError::UnclosedMask { diff --git a/crates/rframe/src/lib.rs b/crates/rframe/src/lib.rs index 1dc89455..e183402e 100644 --- a/crates/rframe/src/lib.rs +++ b/crates/rframe/src/lib.rs @@ -25,9 +25,9 @@ pub use clip::{ MAX_CLIP_GEOMETRIES_PER_LAYER, MAX_CLIP_LAYERS, }; pub use filter::{ - Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, FilterError, - FilterInput, FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, - MAX_FILTER_NODES, + Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, + FilterDisplacementChannel, FilterError, FilterInput, FilterMorphology, FilterNode, + FilterPrimitive, FilterProgram, FilterProgramError, FilterTurbulenceKind, MAX_FILTER_NODES, }; pub use frame::{ Frame, FrameItem, FrameItems, FrameItemsError, FrameNode, Geometry, Identity, MAX_SCOPE_DEPTH, diff --git a/crates/rframe/tests/filter_contract.rs b/crates/rframe/tests/filter_contract.rs index a401a30e..15a9aa55 100644 --- a/crates/rframe/tests/filter_contract.rs +++ b/crates/rframe/tests/filter_contract.rs @@ -5,9 +5,9 @@ use std::sync::Arc; use math2::Rectangle; use math2::transform::AffineTransform; use rframe::{ - Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, FilterError, - FilterInput, FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, - MAX_FILTER_NODES, + Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, + FilterDisplacementChannel, FilterError, FilterInput, FilterMorphology, FilterNode, + FilterPrimitive, FilterProgram, FilterProgramError, FilterTurbulenceKind, MAX_FILTER_NODES, }; fn blur(input: FilterInput, sigma_x: f32, sigma_y: f32) -> FilterNode { @@ -395,6 +395,172 @@ fn morphology_has_one_input_and_checked_non_negative_radii() { } } +#[test] +fn turbulence_is_a_zero_input_generated_source_with_checked_parameters() { + let region = Rectangle::from_xywh(0.0, 0.0, 10.0, 10.0); + let turbulence = |inputs: Arc<[FilterInput]>, + kind, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + stitch_tiles| { + FilterNode::new( + inputs, + region, + FilterColorSpace::LinearRgb, + FilterPrimitive::Turbulence { + kind, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + stitch_tiles, + }, + ) + }; + + assert_eq!( + FilterProgram::new(Arc::from([turbulence( + Arc::from([FilterInput::Source]), + FilterTurbulenceKind::Turbulence, + 0.1, + 0.2, + 1, + 0.0, + false, + )])), + Err(FilterProgramError::InvalidInputCount { + node: 0, + expected: 0, + actual: 1, + }) + ); + + for (base_frequency_x, base_frequency_y, num_octaves, seed) in [ + (-0.1, 0.0, 1, 0.0), + (0.0, -0.1, 1, 0.0), + (f32::INFINITY, 0.0, 1, 0.0), + (0.0, f32::NAN, 1, 0.0), + (0.0, 0.0, 10, 0.0), + (0.0, 0.0, 1, f32::INFINITY), + ] { + assert_eq!( + FilterProgram::new(Arc::from([turbulence( + Arc::from([]), + FilterTurbulenceKind::FractalNoise, + base_frequency_x, + base_frequency_y, + num_octaves, + seed, + true, + )])), + Err(FilterProgramError::InvalidTurbulence { node: 0 }) + ); + } + + for kind in [ + FilterTurbulenceKind::Turbulence, + FilterTurbulenceKind::FractalNoise, + ] { + for num_octaves in [0, 1, 9] { + let program = FilterProgram::new(Arc::from([turbulence( + Arc::from([]), + kind, + 0.0, + 256.0, + num_octaves, + -7.5, + true, + )])) + .expect("finite non-negative frequencies and at most nine octaves are resolved facts"); + assert!(program.may_paint_transparent_input()); + } + } +} + +#[test] +fn displacement_map_has_two_ordered_inputs_and_checked_channel_vocabulary() { + let region = Rectangle::from_xywh(0.0, 0.0, 10.0, 10.0); + let displacement = |inputs: Arc<[FilterInput]>, scale, x_channel, y_channel| { + FilterNode::new( + inputs, + region, + FilterColorSpace::Srgb, + FilterPrimitive::DisplacementMap { + scale, + x_channel, + y_channel, + }, + ) + }; + + assert_eq!( + FilterProgram::new(Arc::from([displacement( + Arc::from([FilterInput::Source]), + 20.0, + FilterDisplacementChannel::Red, + FilterDisplacementChannel::Green, + )])), + Err(FilterProgramError::InvalidInputCount { + node: 0, + expected: 2, + actual: 1, + }) + ); + assert_eq!( + FilterProgram::new(Arc::from([displacement( + Arc::from([FilterInput::Source, FilterInput::SourceAlpha]), + f32::NAN, + FilterDisplacementChannel::Blue, + FilterDisplacementChannel::Alpha, + )])), + Err(FilterProgramError::InvalidDisplacementMap { node: 0 }) + ); + + let channels = [ + FilterDisplacementChannel::Red, + FilterDisplacementChannel::Green, + FilterDisplacementChannel::Blue, + FilterDisplacementChannel::Alpha, + ]; + for x_channel in channels { + for y_channel in channels { + let program = FilterProgram::new(Arc::from([displacement( + Arc::from([FilterInput::Source, FilterInput::SourceAlpha]), + -256.5, + x_channel, + y_channel, + )])) + .expect("finite signed scale and two named channels are resolved facts"); + assert!(!program.may_paint_transparent_input()); + } + } +} + +#[test] +fn a_filter_invocation_names_when_its_source_is_fully_transparent() { + let region = Rectangle::from_xywh(0.0, 0.0, 10.0, 10.0); + let program = FilterProgram::new(Arc::from([FilterNode::new( + Arc::from([]), + region, + FilterColorSpace::LinearRgb, + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::Turbulence, + base_frequency_x: 0.1, + base_frequency_y: 0.2, + num_octaves: 2, + seed: 3.0, + stitch_tiles: false, + }, + )])) + .expect("generated source program"); + let filter = Filter::new(AffineTransform::identity(), region, program) + .expect("checked filter invocation"); + assert!(!filter.source_is_transparent()); + assert!(filter.with_transparent_source().source_is_transparent()); +} + #[test] fn generated_and_additive_nodes_keep_a_transparent_input_scope_alive() { let region = Rectangle::from_xywh(0.0, 0.0, 10.0, 10.0); diff --git a/crates/rframe/tests/scope_stream.rs b/crates/rframe/tests/scope_stream.rs index 623c1c02..354ecf9b 100644 --- a/crates/rframe/tests/scope_stream.rs +++ b/crates/rframe/tests/scope_stream.rs @@ -10,9 +10,11 @@ use cg::CGColor; use math2::Rectangle; use math2::transform::AffineTransform; use rframe::{ - FrameItem, FrameItems, FrameItemsError, FrameNode, Geometry, Identity, MAX_SCOPE_DEPTH, - PaintStack, Provenance, Scope, ScopeEffect, ScopeOpacity, VisualRef, + Filter, FilterColorSpace, FilterInput, FilterNode, FilterPrimitive, FilterProgram, + FilterTurbulenceKind, FrameItem, FrameItems, FrameItemsError, FrameNode, Geometry, Identity, + MAX_SCOPE_DEPTH, PaintStack, Provenance, Scope, ScopeEffect, ScopeOpacity, VisualRef, }; +use std::sync::Arc; fn owner(id: u64) -> VisualRef { VisualRef::new(Identity::new(id), Provenance::new(id)) @@ -37,6 +39,48 @@ fn begin(id: u64) -> FrameItem { }) } +fn filter_begin(id: u64, generated: bool, transparent_source: bool) -> FrameItem { + let region = Rectangle::from_xywh(0.0, 0.0, 40.0, 40.0); + let primitive = if generated { + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::Turbulence, + base_frequency_x: 0.1, + base_frequency_y: 0.2, + num_octaves: 2, + seed: 3.0, + stitch_tiles: false, + } + } else { + FilterPrimitive::GaussianBlur { + sigma_x: 2.0, + sigma_y: 2.0, + } + }; + let inputs: Arc<[FilterInput]> = if generated { + Arc::from([]) + } else { + Arc::from([FilterInput::Source]) + }; + let program = FilterProgram::new(Arc::from([FilterNode::new( + inputs, + region, + FilterColorSpace::LinearRgb, + primitive, + )])) + .expect("test filter graph is checked"); + let filter = Filter::new(AffineTransform::identity(), region, program) + .expect("test filter invocation is checked"); + let filter = if transparent_source { + filter.with_transparent_source() + } else { + filter + }; + FrameItem::ScopeBegin(Scope { + owner: owner(id), + effect: ScopeEffect::Filter(filter), + }) +} + #[test] fn a_balanced_nested_stream_is_admitted() { let items = FrameItems::try_new(vec![ @@ -82,6 +126,24 @@ fn an_empty_scope_is_refused_at_its_begin() { ); } +#[test] +fn a_generated_filter_over_a_declared_transparent_source_is_meaningful_when_empty() { + FrameItems::try_new(vec![filter_begin(1, true, true), FrameItem::ScopeEnd]) + .expect("the generated filter output is the empty span's visual fact"); +} + +#[test] +fn an_empty_filter_cannot_claim_meaning_without_both_contract_facts() { + assert_eq!( + FrameItems::try_new(vec![filter_begin(1, true, false), FrameItem::ScopeEnd]), + Err(FrameItemsError::EmptyScope { index: 0 }) + ); + assert_eq!( + FrameItems::try_new(vec![filter_begin(1, false, true), FrameItem::ScopeEnd]), + Err(FrameItemsError::EmptyScope { index: 0 }) + ); +} + /// A scope holding only another scope is not empty — group-of-group is a /// resolved fact (a container whose one child is itself a real layer). #[test] diff --git a/crates/websem/src/svg.rs b/crates/websem/src/svg.rs index 6d9a4c74..50223236 100644 --- a/crates/websem/src/svg.rs +++ b/crates/websem/src/svg.rs @@ -136,11 +136,11 @@ use math2::Rectangle; use math2::transform::AffineTransform; use rframe::{ ClipGeometry, ClipLayer, ClipPath, FillRule, Filter, FilterBlend, FilterChannelTables, - FilterColorSpace, FilterComposite, FilterInput, FilterMorphology, FilterNode, FilterPrimitive, - FilterProgram, Frame, FrameItem, FrameItems, FrameItemsError, FrameNode, Geometry, Identity, - Mask, MaskMode, PaintAlphaFactor, PaintStack, PathData, Provenance, Scope, ScopeEffect, - ScopeOpacity, Stroke, StrokeCap, StrokeDash, StrokeDashIntervals, StrokeDashIntervalsError, - StrokeJoin, VisualRef, + FilterColorSpace, FilterComposite, FilterDisplacementChannel, FilterInput, FilterMorphology, + FilterNode, FilterPrimitive, FilterProgram, FilterTurbulenceKind, Frame, FrameItem, FrameItems, + FrameItemsError, FrameNode, Geometry, Identity, Mask, MaskMode, PaintAlphaFactor, PaintStack, + PathData, Provenance, Scope, ScopeEffect, ScopeOpacity, Stroke, StrokeCap, StrokeDash, + StrokeDashIntervals, StrokeDashIntervalsError, StrokeJoin, VisualRef, }; use std::sync::Arc; @@ -2810,10 +2810,13 @@ impl<'a> ChildWalk<'a> { &mut self, checkpoint: usize, mut facts: SpanFacts, - filter: Filter, + mut filter: Filter, ) -> SpanFacts { - if facts.draws == 0 && !facts.has_scope && !filter.program().may_paint_transparent_input() { - return facts; + if facts.draws == 0 && !facts.has_scope { + if !filter.program().may_paint_transparent_input() { + return facts; + } + filter = filter.with_transparent_source(); } self.items .insert(checkpoint, filter_scope_item(&mut self.next_id, filter)); @@ -5009,6 +5012,74 @@ mod filter_resource { } } + fn turbulence_kind(element: HtmlElement<'_>) -> FilterTurbulenceKind { + match get_attr(element, "type").as_deref() { + Some("fractalNoise") => FilterTurbulenceKind::FractalNoise, + // SVG enumerations are case-sensitive and do not trim authored + // text. Missing and every invalid spelling retain turbulence. + _ => FilterTurbulenceKind::Turbulence, + } + } + + /// Complete SVG number-optional-number grammar for `baseFrequency`. + /// Invalid lists select the initial pair; one member duplicates; one + /// negative member makes the whole pair unsupported and therefore initial. + fn turbulence_base_frequency(element: HtmlElement<'_>) -> (f32, f32) { + let values = get_attr(element, "baseFrequency") + .as_deref() + .and_then(crate::svg_number_list::parse); + let pair = match values.as_deref() { + Some([value]) => (*value, *value), + Some([x, y]) => (*x, *y), + _ => (0.0, 0.0), + }; + if pair.0 < 0.0 || pair.1 < 0.0 { + (0.0, 0.0) + } else { + pair + } + } + + /// A resolved non-negative octave count capped to Blink's eight-bit-output + /// ceiling. `None` is the measured negative-count transparent result; + /// zero still reaches the formula (and fractal noise therefore yields its + /// neutral half sample). + fn turbulence_num_octaves(element: HtmlElement<'_>) -> Option { + let parsed = get_attr(element, "numOctaves") + .as_deref() + .map(trim_svg_whitespace) + .and_then(|raw| raw.parse::().ok()) + .unwrap_or(1); + (parsed >= 0).then(|| parsed.min(9) as u8) + } + + /// One SVG number through the shared ordered evaluator. A lone trailing + /// comma is accepted by Blink; every other residual token selects initial. + fn resolved_svg_number(element: HtmlElement<'_>, name: &str, initial: f32) -> f32 { + let Some(raw) = get_attr(element, name) else { + return initial; + }; + match crate::svg_number_list::parse(&raw).as_deref() { + Some([value]) => *value, + _ => initial, + } + } + + fn turbulence_stitches(element: HtmlElement<'_>) -> bool { + matches!(get_attr(element, "stitchTiles").as_deref(), Some("stitch")) + } + + fn displacement_channel(element: HtmlElement<'_>, name: &str) -> FilterDisplacementChannel { + match get_attr(element, name).as_deref() { + Some("R") => FilterDisplacementChannel::Red, + Some("G") => FilterDisplacementChannel::Green, + Some("B") => FilterDisplacementChannel::Blue, + // Missing and every invalid, padded, or wrong-case spelling + // retain the initial alpha selector. + _ => FilterDisplacementChannel::Alpha, + } + } + enum ComponentTransferFunction { Identity, Table(Vec), @@ -5556,6 +5627,15 @@ mod filter_resource { axis_or_quarter_turn && [a, b, c, d].into_iter().all(f32::is_finite) } + /// Procedural noise and displacement agree for axis maps and exact + /// quarter turns. General rotations and shears cross the pinned backend's + /// filtered-layer sampling boundary. + fn turbulence_displacement_mapping_is_admitted(target_to_frame: AffineTransform) -> bool { + let [[a, c, _], [b, d, _]] = target_to_frame.matrix; + let axis_or_quarter_turn = (b == 0.0 && c == 0.0) || (a == 0.0 && d == 0.0); + axis_or_quarter_turn && [a, b, c, d].into_iter().all(f32::is_finite) + } + fn filter_crosses_clip_path(target: HtmlElement<'_>) -> Result { let mut current = Some(target); while let Some(element) = current { @@ -5760,6 +5840,53 @@ mod filter_resource { }, ) } + "feTurbulence" => { + patrol_color_style(element)?; + let (base_frequency_x, base_frequency_y) = turbulence_base_frequency(element); + let primitive = match turbulence_num_octaves(element) { + Some(num_octaves) => FilterPrimitive::Turbulence { + kind: turbulence_kind(element), + base_frequency_x, + base_frequency_y, + num_octaves, + seed: resolved_svg_number(element, "seed", 0.0), + stitch_tiles: turbulence_stitches(element), + }, + // Blink's negative octave count contributes no sample: + // one bounded transparent source is the complete + // resolved image fact. Zero remains in the formula; + // fractal noise produces its neutral half sample. + None => FilterPrimitive::SolidColor { + color: CGColor32F::TRANSPARENT, + }, + }; + (Vec::new(), primitive) + } + "feDisplacementMap" => { + patrol_color_style(element)?; + let input = resolve_input(element, "in", previous, &names); + let input2 = resolve_input(element, "in2", previous, &names); + let mut scale = resolved_svg_number(element, "scale", 0.0); + if primitive_units == Units::ObjectBoundingBox { + // Blink's native filter exposes one scalar and applies + // the horizontal object-box scale to both channels. + scale *= target_box.width; + } + if !scale.is_finite() { + return Err(CompileError::UnsupportedFilter( + "feDisplacementMap scale resolves outside the finite filter range" + .to_string(), + )); + } + ( + vec![input, input2], + FilterPrimitive::DisplacementMap { + scale, + x_channel: displacement_channel(element, "xChannelSelector"), + y_channel: displacement_channel(element, "yChannelSelector"), + }, + ) + } "feMerge" => { patrol_color_style(element)?; let mut inputs = Vec::new(); @@ -5898,6 +6025,8 @@ mod filter_resource { let mut has_source_dependent_multi_input = false; let mut has_blend = false; let mut has_morphology = false; + let mut has_turbulence = false; + let mut has_displacement_map = false; let mut has_source_dependent_morphology = false; let mut has_source_dependent_active_morphology = false; for node in &nodes { @@ -5930,6 +6059,9 @@ mod filter_resource { has_source_dependent_active_morphology |= source_dependent && (radius_x > 0.0 || radius_y > 0.0); } + has_turbulence |= matches!(node.primitive(), FilterPrimitive::Turbulence { .. }); + has_displacement_map |= + matches!(node.primitive(), FilterPrimitive::DisplacementMap { .. }); source_dependencies.push(source_dependent); } if has_blend { @@ -5952,6 +6084,24 @@ mod filter_resource { .to_string(), )); } + if has_turbulence && !turbulence_displacement_mapping_is_admitted(target_to_frame) { + return Err(CompileError::UnsupportedFilter( + "feTurbulence's target mapping crosses the pinned-backend procedural-filter transform precision boundary" + .to_string(), + )); + } + if has_displacement_map && !turbulence_displacement_mapping_is_admitted(target_to_frame) { + return Err(CompileError::UnsupportedFilter( + "feDisplacementMap's target mapping crosses the pinned-backend displacement-filter transform precision boundary" + .to_string(), + )); + } + if has_displacement_map && filter_crosses_clip_path(target)? { + return Err(CompileError::UnsupportedFilter( + "feDisplacementMap crosses the pinned-backend filtered clip-path precision boundary" + .to_string(), + )); + } if has_source_dependent_morphology && filter_source_has_paint_server(target)? { return Err(CompileError::UnsupportedFilter( "feMorphology's source image crosses the pinned-backend morphology paint-server precision boundary" @@ -6109,10 +6259,13 @@ mod filter_resource { "filter resolution needs the target's complete fill-geometry box".to_string(), ) })?; - if target_box.width <= 0.0 || target_box.height <= 0.0 { + let units = filter_units(element); + let primitive_units = primitive_units(element); + if (target_box.width <= 0.0 || target_box.height <= 0.0) + && units == Units::ObjectBoundingBox + { return Ok(Resolution::Hide); } - let units = filter_units(element); let region = filter_region(element, units, target_box, bases)?; if region.width <= 0.0 || region.height <= 0.0 { return Ok(Resolution::Hide); @@ -6120,7 +6273,7 @@ mod filter_resource { let Some(program) = compile_graph( element, target, - primitive_units(element), + primitive_units, target_box, bases, region, diff --git a/crates/websem/tests/filter_contract.rs b/crates/websem/tests/filter_contract.rs index ae2dedec..5e6fa3a5 100644 --- a/crates/websem/tests/filter_contract.rs +++ b/crates/websem/tests/filter_contract.rs @@ -11,8 +11,8 @@ mod support; use math2::Rectangle; use math2::transform::AffineTransform; use rframe::{ - Filter, FilterBlend, FilterColorSpace, FilterComposite, FilterInput, FilterMorphology, - FilterPrimitive, Frame, FrameItem, ScopeEffect, + Filter, FilterBlend, FilterColorSpace, FilterComposite, FilterDisplacementChannel, FilterInput, + FilterMorphology, FilterPrimitive, FilterTurbulenceKind, Frame, FrameItem, ScopeEffect, }; use support::render_through_n0; use websem::{DegradationAction, InitialViewport, SvgFrameSource}; @@ -543,6 +543,262 @@ fn morphology_precision_boundaries_refuse_before_a_wrong_pixel() { ); } +#[test] +fn turbulence_resolves_the_measured_grammar_before_crossing_the_frame_seam() { + let source = |primitive: &str| { + document(&format!( + r##" + {primitive} + + "## + )) + }; + let primitive = |authored: &str| { + let frame = admit_both(&source(authored)); + let filter = resolved_filter(&frame); + assert_eq!(filter.program().iter().count(), 1); + let node = filter.program().iter().next().expect("one turbulence node"); + assert!(node.inputs().is_empty(), "turbulence is a generated source"); + node.primitive() + }; + + assert_eq!( + primitive( + r##""## + ), + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::FractalNoise, + base_frequency_x: 0.125, + base_frequency_y: 0.25, + num_octaves: 9, + seed: -3.5, + stitch_tiles: true, + } + ); + assert_eq!( + primitive(r##""##), + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::Turbulence, + base_frequency_x: 0.125, + base_frequency_y: 0.125, + num_octaves: 2, + seed: 0.0, + stitch_tiles: false, + }, + "one frequency duplicates across both axes" + ); + + for authored in [ + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + ] { + let FilterPrimitive::Turbulence { + base_frequency_x, + base_frequency_y, + .. + } = primitive(authored) + else { + panic!("invalid frequency retains the initial turbulence member") + }; + assert_eq!( + (base_frequency_x, base_frequency_y), + (0.0, 0.0), + "{authored}" + ); + } + + for authored in [ + r##""##, + r##""##, + ] { + assert_eq!( + primitive(authored), + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::Turbulence, + base_frequency_x: 0.0, + base_frequency_y: 0.0, + num_octaves: 1, + seed: 0.0, + stitch_tiles: false, + }, + "invalid enumeration and scalar spellings retain each initial: {authored}" + ); + } + + assert_eq!( + primitive(r##""##), + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::FractalNoise, + base_frequency_x: 0.0, + base_frequency_y: 0.0, + num_octaves: 0, + seed: 0.0, + stitch_tiles: false, + }, + "zero reaches the fractal formula" + ); + assert!( + matches!( + primitive(r##""##), + FilterPrimitive::SolidColor { color } if color.a() == 0.0 + ), + "a negative octave count resolves to a bounded transparent image" + ); +} + +#[test] +fn displacement_map_resolves_ordered_inputs_channels_and_horizontal_object_box_scale() { + let source = |primitive: &str, primitive_units: &str| { + document(&format!( + r##" + + + {primitive} + + "## + )) + }; + let resolved = |primitive: &str, primitive_units: &str| { + let frame = admit_both(&source(primitive, primitive_units)); + let filter = resolved_filter(&frame); + let node = filter.program().iter().last().expect("displacement output"); + assert_eq!(node.inputs(), [FilterInput::Node(0), FilterInput::Node(1)]); + node.primitive() + }; + + assert_eq!( + resolved( + r##""##, + "objectBoundingBox", + ), + FilterPrimitive::DisplacementMap { + scale: 5.0, + x_channel: FilterDisplacementChannel::Red, + y_channel: FilterDisplacementChannel::Green, + }, + "Blink's one native scalar uses target width for both displacement axes" + ); + + let channels = [ + ("R", FilterDisplacementChannel::Red), + ("G", FilterDisplacementChannel::Green), + ("B", FilterDisplacementChannel::Blue), + ("A", FilterDisplacementChannel::Alpha), + ]; + for (x_name, x_channel) in channels { + for (y_name, y_channel) in channels { + assert_eq!( + resolved( + &format!( + r##""## + ), + "userSpaceOnUse", + ), + FilterPrimitive::DisplacementMap { + scale: -12.5, + x_channel, + y_channel, + } + ); + } + } + + for authored in [ + r##""##, + r##""##, + r##""##, + ] { + assert_eq!( + resolved(authored, "userSpaceOnUse"), + FilterPrimitive::DisplacementMap { + scale: 0.0, + x_channel: FilterDisplacementChannel::Alpha, + y_channel: FilterDisplacementChannel::Alpha, + }, + "invalid spellings retain each initial: {authored}" + ); + } +} + +#[test] +fn generated_turbulence_can_paint_a_declared_empty_user_space_source() { + let source = |primitive_units: &str| { + document(&format!( + r##" + + + + "## + )) + }; + let user = admit_both(&source("userSpaceOnUse")); + let object = admit_both(&source("objectBoundingBox")); + for frame in [&user, &object] { + let filter = resolved_filter(frame); + assert!(filter.source_is_transparent()); + let pixels = render_through_n0(frame, 64, 64); + assert_ne!(at(&pixels, 24, 24), [255, 255, 255, 255]); + assert_eq!(at(&pixels, 4, 4), [255, 255, 255, 255]); + } + assert_eq!( + render_through_n0(&user, 64, 64), + render_through_n0(&object, 64, 64), + "base frequency itself is not primitiveUnits-scaled" + ); +} + +#[test] +fn turbulence_and_displacement_precision_boundaries_refuse_before_paint() { + let turbulence = r##" + + "##; + let displacement = r##" + + + "##; + for (filter, target, reason) in [ + ( + turbulence, + r##""##, + "procedural-filter transform precision boundary", + ), + ( + displacement, + r##""##, + "displacement-filter transform precision boundary", + ), + ( + displacement, + r##""##, + "filtered clip-path precision boundary", + ), + ] { + assert_target_skip( + &document(&format!( + r##" + + {filter} + {target}"## + )), + reason, + ); + } + + for transform in ["rotate(90 32 32)", "translate(64 0) scale(-1 1)"] { + admit_both(&document(&format!( + r##" {turbulence} + "## + ))); + } +} + #[test] fn blend_modes_lower_to_one_checked_two_input_operation() { let mode = |attribute: Option<&str>| { diff --git a/crates/websem/tests/unsupported_corpus.rs b/crates/websem/tests/unsupported_corpus.rs index 3460f296..f961fe98 100644 --- a/crates/websem/tests/unsupported_corpus.rs +++ b/crates/websem/tests/unsupported_corpus.rs @@ -175,6 +175,16 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "native-shadow transform precision boundary", ), + ( + "svg-filter-displacement-clip-precision", + DeclaredByBestEffort, + "filtered clip-path precision boundary", + ), + ( + "svg-filter-displacement-transform-precision", + DeclaredByBestEffort, + "displacement-filter transform precision boundary", + ), ( "svg-filter-effect-stack-precision", DeclaredByBestEffort, @@ -280,6 +290,11 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "translucent-source composition precision boundary", ), + ( + "svg-filter-turbulence-transform-precision", + DeclaredByBestEffort, + "procedural-filter transform precision boundary", + ), ( "svg-foreign-object", DeclaredByBestEffort, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index a93182e8..b3c8db02 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -67,7 +67,8 @@ from the dated addenda below: modes, ordered `feMerge`/`feMergeNode`, native one-input `feDropShadow`, one-input `feColorMatrix`, one-input `feComponentTransfer` with its direct `feFuncR`/`feFuncG`/`feFuncB`/`feFuncA` children, and one-input - `feMorphology`; graph inputs resolve from + `feMorphology`, plus zero-input `feTurbulence` and two-input + `feDisplacementMap`; graph inputs resolve from `SourceGraphic`/`SourceAlpha`/prior and named results, with both filter coordinate systems and color spaces, hard regions, nesting, admitted transforms, ``, and the established effect order; @@ -75,14 +76,14 @@ from the dated addenda below: the full `preserveAspectRatio` grammar; and one exact-time `` on a top-level ``. `crates/n0_cli/README.md` is the statement of record. -- **The corpus** is 609 Chromium-baked primitive cells plus 10 sampled frames. +- **The corpus** is 685 Chromium-baked primitive cells plus 10 sampled frames. All byte-exact except seven curved cells carrying a declared, geometrically confined tolerance (the native-oval/conic boundary) and four gradient cells carrying a declared one-code-value ramp-quantization tolerance (one pixel against Chromium's Skia; 18 knife-edge pixels between this engine's own macOS and Linux Skia builds; 336 ramp pixels under an isolated layer's restore; 576 after a masked ramp becomes luminance alpha). The named refusal - register has 140 rows. + register has 143 rows. - **Not claimed:** no conformance score exists or may be computed — FLIP is unratified. The FLIP record and identity-changing review are prepared, but only the owner act on gridaco/nothing#49 may authorize them and the first @@ -3350,3 +3351,132 @@ Three focused rows join the refusal register, moving it from 137 to 140. The primitive corpus moves from 572 to 609 cells; the ten exact-time sampled frames are unchanged. Exactly one checklist row ticks: ``. This records no conformance score and takes no FLIP action. + +## Rung: `feTurbulence` + `feDisplacementMap` (2026-08-26) + +The verdict is CLOSE/SPLIT. `` and `` close +for their complete static Chromium behavior. Their seven element-specific +attributes close with them: `baseFrequency`, `numOctaves`, `seed`, +`stitchTiles`, `scale`, `xChannelSelector`, and `yChannelSelector`. The shared +`type`, `in`, `in2`, `result`, primitive-region, +`color-interpolation-filters`, filter-resource, and dynamics rows remain open +for their wider applicability. CSS filter functions, animation, and external +resources are separate surfaces. No CSS property row closes. + +Chromium 149.0.7827.55 establishes the turbulence grammar. `type` is the +case-sensitive `turbulence | fractalNoise` enumeration with initial +`turbulence`; missing, empty, invalid, wrong-case, whitespace-padded, and +CSS-wide spellings select that initial. `baseFrequency` is one or two SVG +numbers with initial zero. One member supplies both axes. Leading plus, +exponent, comma-wsp, and one trailing comma are accepted. Missing, empty, +malformed, unit-bearing, percentage, CSS-function, comment-bearing, +extra-member, and overflowing spellings select the initial pair. If either +parsed member is negative, Chromium resets both axes to that pair rather than +clamping one independently. + +`numOctaves` is an integer with initial one. Leading plus and surrounding SVG +whitespace are accepted; decimal, exponent, trailing-comma, and integer- +overflow spellings select one. Positive values cap at nine in the rendered +formula. Zero remains a real formula input: zero-octave turbulence is +transparent, while zero-octave fractal noise is the neutral-half field. A +negative integer produces a transparent result. `seed` is a signed SVG number +with initial zero. Fractional values are accepted and the procedural formula +truncates them toward zero; negative seeds remain active. `stitchTiles` is the +case-sensitive `stitch | noStitch` enumeration with initial `noStitch` and the +same exact-text fallback discipline as `type`. + +The resolved procedural source carries only its formula, two finite +non-negative frequencies, capped octave count, finite seed, stitch decision, +hard region, and operating color space. It has no image input. The +`baseFrequency` pair is not scaled by `primitiveUnits`; object-box units still +govern authored primitive regions. For a stitched source, Chromium truncates +the finite primitive-region width and height to integer tile lengths before +constructing the repeating field. Fractional stitched-region controls and the +corresponding non-stitched field differ and are both exact. + +Chromium establishes a distinct two-input displacement operation. `scale` is +a signed SVG number with initial zero and the same one-member grammar as +`seed`. Each selector is the case-sensitive `R | G | B | A` enumeration with +initial `A`; padded, wrong-case, invalid, and CSS-wide spellings select alpha. +The operation reads non-premultiplied channels from its second image and moves +the first image by `(channel - 0.5) × scale` on each axis. A transparent map +therefore selects the negative half-scale vector rather than zero movement; +the half-alpha control lies near the zero vector at the byte-normalized alpha. +Both source images enter the primitive's declared filter color space before +sampling. This is observable even with alpha selectors because the color input +conversion also participates in the result. + +Object-box displacement follows Blink's one-scalar native route: the authored +scale is multiplied by the target width for both x and y displacement, not by +independent axis bases. A non-square target discriminates that rule from both +the height basis and separate-axis scaling. Hard filter and primitive regions, +percentage regions, bounded displacement maps, SourceGraphic, SourceAlpha, +source-as-map, generated color/map inputs, named/previous input fallback, +procedural maps, and result reuse all have exact evidence. + +The source audit exposed a filter-chassis error rather than a procedural-noise +error. A user-space filter can have a positive region even when the target +contributes no source pixels; a generated primitive must still paint that +region. The prior route discarded every zero-area target before filter-unit +resolution, and the resolved item stream rejected the resulting empty scope. +The corrected contract distinguishes a fully transparent source invocation +from an absent filter: source references become an explicit bounded +transparent image, and a source-generating graph makes the otherwise empty +filter scope meaningful. The same empty target under object-box filter units +has no positive filter region and correctly paints nothing. User-space filter +units with object-box primitive units still paint the unscaled turbulence +field. Empty-source turbulence, turbulence blended with SourceGraphic, and a +generated displacement graph are committed exact controls. + +The color audit found a second narrow chassis boundary. Missing +`color-interpolation-filters` equals explicit linearRGB; explicit sRGB changes +both noise formulas and a procedural displacement map. The procedural source +itself is backend-native, and its linearRGB-to-sRGB output needed the native +final layer restore. The prior generic generated-source restore produced a +widespread one-code-value difference. Keeping native restore provenance with +the procedural output clears that split while generated solid and byte-domain +filter outputs retain their established policies. Both turbulence formulas in +both color spaces and the noise-to-displacement chain are exact on the current +ARM host without a tolerance. + +Three remaining silent classes are now stable refusals. Axis maps, fractional +translation and scale, reflection, and exact quarter turns are exact. A +sampled 17-degree turbulence mapping differs by 3,173 pixels at maximum +channel delta 7 and a shear by 3,110 at delta 6. The corresponding displacement +controls differ by 280 pixels at delta 13 and 360 at delta 18. Separate mapping +patrols therefore guard each operation before paint. A geometric clip around +displacement differs by 35 pixels at maximum delta 2; the opacity control +without that clip is exact. One displacement-specific clip patrol quarantines +that class. Existing small-blur and translucent-source multi-input patrols +continue to own their independent graph boundaries (measured, not celled). + +The numeric crux did not reproduce the earlier stroke/geometry provenance +alias in a visible procedural field. Seed values bracketing sampled binary32 +midpoints and adjacent tiny base frequencies produced deterministic equal +pixels at 64×64, so no second numeric refusal was invented from an +undiscriminating raster. The admitted route nevertheless uses the shared +ordered SVG-number evaluator rather than Rust's raw lexical `f32` parser. This +is a negative probe verdict, not a claim that every possible numeric alias is +impossible (measured, not celled). + +Two broad matrices contain 164 twice-deterministic Chromium sources, each also +rendered through both actual command admissions. All 156 admitted sources are +pixel-exact and strict and best-effort agree; eight reach one of the three new +stable names or an older operation-specific patrol. Seventy-six committed +Chromium cells carry the admitted slice without a new tolerance. They cover +the complete parameter grammars, both formulas, all selectors, color spaces, +regions and units, source and map profiles, empty targets, graph routing, +safe mappings, source shapes, opacity, ``, `viewBox`, and the combined +procedural-warp graph. + +Gate sensitivity was proved by temporarily mapping turbulence to fractal noise +and the red displacement selector to alpha. `just gate` rejected fifty-five +new cells: turbulence controls changed up to all 4,096 pixels and displacement +controls reached maximum channel delta 202. Restoring both mappings returned +the complete 685-cell gate to green. + +Three focused rows join the refusal register, moving it from 140 to 143. The +primitive corpus moves from 609 to 685 cells; the ten exact-time sampled frames +are unchanged. Exactly nine checklist rows tick: the two elements and seven +element-specific attributes named above. This records no conformance score and +takes no FLIP action. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index fa16e7b4..492d6091 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -1451,7 +1451,7 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [x] `` - [ ] `` - [ ] `` -- [ ] `` +- [x] `` - [ ] `` - [x] `` - [x] `` @@ -1506,7 +1506,25 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `` - [ ] `` - [ ] `` -- [ ] `` +- [x] `` + +> **2026-08-26 close:** `feTurbulence` carries both static procedural-noise +> formulas, the complete five-parameter attribute vocabulary, generated-source +> regions, both filter color spaces, graph reuse, safe mappings, ``, and +> `viewBox`. `feDisplacementMap` carries two ordered images, signed scale, all +> four non-premultiplied channel selectors, hard regions and object-box units, +> color conversion, source/generated/procedural maps, source shapes, opacity, +> safe mappings, ``, and `viewBox`. A user-space procedural filter may +> paint even when its target contributes a fully transparent source; an +> object-box filter region on the same zero-area target paints nothing. +> Seventy-six exact Chromium cells move the complete gate to 685. General +> affine mappings for both primitives and geometric clipping for displacement +> refuse by three stable precision names before paint. The shared `type`, `in`, +> `in2`, `result`, region, interpolation, filter-resource, and dynamics rows +> remain open for their wider applicability. Swapping the two noise formulas +> and red/alpha displacement selection made fifty-five new cells fail, up to +> all 4,096 pixels and maximum channel delta 202; restoration returned the +> complete gate to green. - [ ] `` > **2026-08-25 split:** the static filter graph carries safe-kernel @@ -1865,7 +1883,13 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `aria-valuetext` - [ ] `autofocus` - [ ] `azimuth` -- [ ] `baseFrequency` +- [x] `baseFrequency` + +> **2026-08-26 close:** `baseFrequency` applies only to `feTurbulence` and +> carries the complete SVG one-or-two-number grammar. One value supplies both +> axes; comma-wsp, leading plus, exponent, and the measured lone trailing comma +> are carried. Missing, malformed, unit-bearing, and overlong lists select the +> initial zero pair; either negative member makes the whole pair initial. - [ ] `bias` - [ ] `class` - [x] `clipPathUnits` @@ -1945,7 +1969,12 @@ for attributes the platform ships ahead of the SVG 2 indexes. > invalid, wrong-case, whitespace-padded, legacy camelCase, CSS-wide, and > draft-only spellings select the initial `normal`; Chromium ignores the > sampled `no-composite` spelling without changing a valid mode. -- [ ] `numOctaves` +- [x] `numOctaves` + +> **2026-08-26 close:** `numOctaves` applies only to `feTurbulence`. Missing or +> invalid integer text selects one, leading plus and surrounding SVG whitespace +> are carried, positive values cap at nine, zero reaches the selected formula, +> and a negative integer produces the measured transparent result. - [ ] `offset` - [ ] `onabort` - [ ] `onafterprint` @@ -2054,8 +2083,15 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `result` - [ ] `role` - [ ] `rotate` -- [ ] `scale` -- [ ] `seed` +- [x] `scale` +- [x] `seed` + +> **2026-08-26 close:** displacement `scale` and turbulence `seed` each carry +> the complete signed SVG-number grammar with initial zero, including leading +> plus, exponent, and the measured lone trailing comma. Invalid, unit-bearing, +> percentage, CSS-function, and multi-member text selects the initial. Scale +> keeps its sign and fractions; the noise formula truncates fractional seed +> values toward zero as Chromium does. - [ ] `side` - [x] `slope` - [ ] `spacing` @@ -2064,7 +2100,12 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [x] `spreadMethod` - [ ] `startOffset` - [ ] `stdDeviation` -- [ ] `stitchTiles` +- [x] `stitchTiles` + +> **2026-08-26 close:** `stitchTiles` applies only to `feTurbulence` and carries +> the complete case-sensitive `stitch | noStitch` grammar. Missing, empty, +> invalid, wrong-case, whitespace-padded, and CSS-wide spellings select the +> initial `noStitch`; stitched fractional primitive regions are Chromium-baked. - [ ] `style` - [ ] `surfaceScale` - [ ] `systemLanguage` @@ -2091,13 +2132,19 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `viewBox` - [ ] `x1` - [ ] `x2` -- [ ] `xChannelSelector` +- [x] `xChannelSelector` - [ ] `xlink:href` - [ ] `xlink:title` - [ ] `xml:space` - [ ] `y1` - [ ] `y2` -- [ ] `yChannelSelector` +- [x] `yChannelSelector` + +> **2026-08-26 close:** both displacement selectors carry the complete +> case-sensitive `R | G | B | A` grammar independently. Missing, empty, +> invalid, wrong-case, whitespace-padded, and CSS-wide spellings select the +> initial `A`; committed pairs prove that selection occurs on the +> non-premultiplied displacement image. - [ ] `z` diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 9382cecc..263ee1be 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -212,6 +212,11 @@ is exactly what the engine renders pixel-for-pixel. | `svg-filter-morphology-{source-number-alias,radius-large-finite,viewbox-half-step,viewbox-nonuniform,primitive-units,source-alpha,input-previous,result-shadow,region-crop,region-zero-crop,channel-srgb,channel-linear,channel-alpha}.svg` | Numeric, graph, region, and color evidence: the amplified Blink source-number neighbor, a finite huge active radius, post-map half-step rounding, non-uniform and object-box axes, SourceAlpha and prior inputs, last-result shadowing, active and zero-radius hard crops, and distinct premultiplied extrema in sRGB, linearRGB, and alpha-only images. All thirteen are byte-exact. | | `svg-filter-morphology-{axis-fractional,quarter-turn,path,stroke,rounded-rect,source-use,target-opacity,target-clip,target-mask,blur-before,blur-after,transfer-before,transfer-after,blend-before,blend-after,shadow-before,shadow-after,matrix-before,matrix-after,chain-two}.svg` | Source and composition evidence: safe fractional axis mapping and exact quarter turn; path, stroke, rounded-rect, and `` sources; target opacity/clip/mask; two morphology nodes; and ordering around blur, component transfer, blend, native shadow, and generated merge/matrix graphs. All twenty are byte-exact. | | *(measured, not celled — morphology split)* | Four broad scratch matrices contain 187 twice-deterministic Chromium 149 sources, each rendered through both actual CLI admissions. After patrol, all 162 admitted sources are exact and admission-identical; the other 25 reach one of three new stable morphology names or an older operation-specific patrol. Axis maps and quarter turns are exact, while a 17-degree source map differs by 171px/Δ12 and a generated map by 142px/Δ9. Linear-gradient sources differ by 125px/Δ1 even at zero radius and 191px/Δ1 when active; radial and gradient-stroke controls reproduce the class. Active filled circles differ by 3px/Δ9 and a fractional ellipse by 8px/Δ6, while rounded rectangles, curved paths, circle strokes, and round path strokes are exact; this keeps gridaco/nothing#88 separate. A 600×32 bank pins half-up rounding and the 256-device-pixel radius cap. The region audit also found a premature source clip: correcting output-region placement removes 16px/Δ136 and preserves the older filter corpus. Swapping erosion and dilation made thirty-five of the thirty-seven new cells fail, up to 1,560 pixels and Δ255; restoration returned all 609 cells green. The first full-workspace hosted-x86 run then found nine active sRGB morphology cells with 1,633 pixels total at Δ1, isolating the final low-precision filter-layer restore. Scoping the established exact byte-domain restore to active sRGB morphology clears the same hosted workspace test and keeps all 609 ARM cells exact; zero radius and later color-space conversion retain their former paths, and no tolerance was added. The corpus is now 609 cells plus 10 sampled frames, and the named register has 140 rows. | +| `svg-filter-turbulence-{default,type-turbulence,type-fractal,type-grammar,base-one,base-two,base-comma,base-trailing-comma,base-invalid,base-negative-axis,base-plus-exponent,octave-one,octave-two,octave-zero,fractal-octave-zero,octave-negative,octave-nine,octave-cap,octave-grammar,seed-zero,seed-one,seed-fraction,seed-negative,seed-grammar,stitch-none,stitch,stitch-grammar}.svg` | The complete static `feTurbulence` parameter grammar in twenty-seven cells: both formulas and case-sensitive enum fallback; one/two-member SVG number lists, comma-wsp, a lone trailing comma, leading plus and exponent; invalid and negative-frequency fallback; integer octave parsing, zero/negative behavior, and the cap at nine; signed/truncated seeds; and both stitch modes with exact-enum fallback. All twenty-seven are byte-exact. | +| `svg-filter-turbulence-{color-default,color-srgb,color-linear,region-stitch-fraction,region-percent,fractional-translate,quarter-turn,use,viewbox,graph-blend,graph-result-reuse,empty-source}.svg` | Procedural-source operation evidence: default linearRGB and explicit color spaces, fractional stitched and percentage hard regions, safe mappings, non-uniform `viewBox`, ``, named graph reuse, and generated output over a fully transparent target source. All twelve are byte-exact. | +| `svg-filter-displacement-{default,scale-zero,scale-positive,scale-negative,scale-fraction,scale-trailing-comma,scale-invalid,selector-default,selector-alpha,selector-red,selector-green,selector-blue,selector-axes,selector-grammar}.svg` | The complete static `feDisplacementMap` parameter grammar in fourteen cells: absent and explicit-zero scale, signed/fractional SVG numbers, the accepted trailing comma and invalid fallback, all four independently selected channels, and case-sensitive selector fallback to alpha. All fourteen are byte-exact. | +| `svg-filter-displacement-{color-srgb,color-linear,primitive-units,transparent-map,half-alpha-map,map-region,source-alpha-map,source-rgb-map,generated-color,turbulence-map,turbulence-map-linear,region-percent,scale-transform,quarter-turn,use,viewbox,stroke,path,opacity,empty-generated,input-default-in2,input-unknown-in}.svg` · `svg-filter-turbulence-displacement-map.svg` | Two-input sampling and composition evidence: non-premultiplied map channels in both filter color spaces; Blink's horizontal object-box scale for both displacement axes; transparent, half-alpha, bounded, source, and generated maps; hard regions, safe mappings, ``, `viewBox`, stroke/path sources and opacity; default/unknown graph inputs; generated output over an empty target; and the procedural-noise-to-warp chain. All twenty-three are byte-exact. | +| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five new cells fail, up to all 4,096 pixels and maximum channel delta 202; restoration returned the complete 685-cell gate to green. The corpus is now 685 cells plus 10 sampled frames, and the named register has 143 rows. | | `svg-gradient-linear.svg` · `svg-gradient-linear-userspace.svg` · `svg-gradient-linear-bbox-offset.svg` | The gradient rung's base cells: the default objectBoundingBox ramp, the byte-identical userSpaceOnUse equivalent (the canary for the box-inverse fold), and a bbox-relative ramp on offset geometry. | | `svg-gradient-transform.svg` · `svg-gradient-css-transform.svg` | `gradientTransform` and an author `transform` declaration are one computed value — the attribute cell and the non-quarter CSS rotation cell (the discriminating measurement: the value applies about the raw origin of gradient space, both spellings). | | `svg-gradient-spread-reflect.svg` · `svg-gradient-spread-repeat.svg` · `svg-gradient-hard-stop.svg` · `svg-gradient-stop-nonmonotonic.svg` | The ramp grammar: both non-pad spread methods with their measured seams, equal-offset hard stops rendering crisp, and non-monotonic offsets clamping to the running maximum (never sorted). | diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index 88d3040e..980c983a 100644 --- a/fixtures/web-first/STATUS.md +++ b/fixtures/web-first/STATUS.md @@ -19,7 +19,7 @@ Not a conformance claim: no score is computed or implied (FLIP is unratified), and the corpus enumerates constructs, not the SVG surface. -## Chromium-baked cells (609) +## Chromium-baked cells (685) Each renders byte-exact against its committed Chromium oracle (seven curved cells and four gradient ramps carry a declared, bounded @@ -217,6 +217,42 @@ to its fixture source. No new image is committed for this view. svg-filter-composite-region-default svg-filter-composite-region-union svg-filter-composite-xor +svg-filter-displacement-color-linear +svg-filter-displacement-color-srgb +svg-filter-displacement-default +svg-filter-displacement-empty-generated +svg-filter-displacement-generated-color +svg-filter-displacement-half-alpha-map +svg-filter-displacement-input-default-in2 +svg-filter-displacement-input-unknown-in +svg-filter-displacement-map-region +svg-filter-displacement-opacity +svg-filter-displacement-path +svg-filter-displacement-primitive-units +svg-filter-displacement-quarter-turn +svg-filter-displacement-region-percent +svg-filter-displacement-scale-fraction +svg-filter-displacement-scale-invalid +svg-filter-displacement-scale-negative +svg-filter-displacement-scale-positive +svg-filter-displacement-scale-trailing-comma +svg-filter-displacement-scale-transform +svg-filter-displacement-scale-zero +svg-filter-displacement-selector-alpha +svg-filter-displacement-selector-axes +svg-filter-displacement-selector-blue +svg-filter-displacement-selector-default +svg-filter-displacement-selector-grammar +svg-filter-displacement-selector-green +svg-filter-displacement-selector-red +svg-filter-displacement-source-alpha-map +svg-filter-displacement-source-rgb-map +svg-filter-displacement-stroke +svg-filter-displacement-transparent-map +svg-filter-displacement-turbulence-map +svg-filter-displacement-turbulence-map-linear +svg-filter-displacement-use +svg-filter-displacement-viewbox svg-filter-drop-shadow-anisotropic svg-filter-drop-shadow-blur-input svg-filter-drop-shadow-chain @@ -338,6 +374,46 @@ to its fixture source. No new image is committed for this view. svg-filter-source-alpha svg-filter-stroke svg-filter-target-rotate +svg-filter-turbulence-base-comma +svg-filter-turbulence-base-invalid +svg-filter-turbulence-base-negative-axis +svg-filter-turbulence-base-one +svg-filter-turbulence-base-plus-exponent +svg-filter-turbulence-base-trailing-comma +svg-filter-turbulence-base-two +svg-filter-turbulence-color-default +svg-filter-turbulence-color-linear +svg-filter-turbulence-color-srgb +svg-filter-turbulence-default +svg-filter-turbulence-displacement-map +svg-filter-turbulence-empty-source +svg-filter-turbulence-fractal-octave-zero +svg-filter-turbulence-fractional-translate +svg-filter-turbulence-graph-blend +svg-filter-turbulence-graph-result-reuse +svg-filter-turbulence-octave-cap +svg-filter-turbulence-octave-grammar +svg-filter-turbulence-octave-negative +svg-filter-turbulence-octave-nine +svg-filter-turbulence-octave-one +svg-filter-turbulence-octave-two +svg-filter-turbulence-octave-zero +svg-filter-turbulence-quarter-turn +svg-filter-turbulence-region-percent +svg-filter-turbulence-region-stitch-fraction +svg-filter-turbulence-seed-fraction +svg-filter-turbulence-seed-grammar +svg-filter-turbulence-seed-negative +svg-filter-turbulence-seed-one +svg-filter-turbulence-seed-zero +svg-filter-turbulence-stitch +svg-filter-turbulence-stitch-grammar +svg-filter-turbulence-stitch-none +svg-filter-turbulence-type-fractal +svg-filter-turbulence-type-grammar +svg-filter-turbulence-type-turbulence +svg-filter-turbulence-use +svg-filter-turbulence-viewbox svg-filter-units-grammar svg-filter-url-comments svg-filter-url-quoted @@ -638,7 +714,7 @@ to its fixture source. No new image is committed for this view. svg-visibility-rule-beats-attribute svg-visibility-unhide -## The refusal register (140) +## The refusal register (143) What the slice refuses, by name, in the compiler's own words — **both refuse** is a document-level contract; **declared** renders @@ -674,6 +750,8 @@ its row into the cells above. | `svg-filter-component-transfer-transform-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feComponentTransfer's target mapping crosses the pinned-backend table-filter transform precision boundary; skipped svg/rect[3]: unsupported SVG filter: feComponentTransfer's target mapping crosses the pinned-backend table-filter transform precision boundary | | `svg-filter-css-functions` | declared | skipped svg/rect[2]: unsupported SVG filter: filter presentation attribute uses CSS filter functions, which are a separate unresolved operation grammar | | `svg-filter-css-property` | declared | skipped svg/rect[2]: unsupported computed style: style attribute on declares filter, which this cascade does not represent | +| `svg-filter-displacement-clip-precision` | declared | skipped svg/path[1]: unsupported SVG filter: feDisplacementMap crosses the pinned-backend filtered clip-path precision boundary | +| `svg-filter-displacement-transform-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feDisplacementMap's target mapping crosses the pinned-backend displacement-filter transform precision boundary | | `svg-filter-drop-shadow-color-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feDropShadow with an interior-channel flood color in linearRGB crosses the pinned-backend native-shadow color-conversion precision boundary | | `svg-filter-drop-shadow-range` | declared | skipped svg/rect[2]: unsupported SVG filter: feDropShadow parameters cross the admitted native-shadow range | | `svg-filter-drop-shadow-source-layer-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feDropShadow's source subtree crosses the pinned-backend native-shadow source-layer precision boundary | @@ -694,7 +772,7 @@ its row into the cells above. | `svg-filter-offset-blur-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: a filter graph combines feOffset with Gaussian blur, which crosses the pinned-backend composed-operation precision boundary | | `svg-filter-offset-fractional-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feOffset uses a fractional displacement, which crosses the pinned-backend rasterization boundary | | `svg-filter-offset-transform-precision` | declared | skipped svg/g[1]/rect[1]: unsupported SVG filter: feOffset's target mapping produces a fractional device-space displacement at the pinned-backend rasterization boundary | -| `svg-filter-primitive` | declared | skipped svg/rect[2]: unsupported SVG filter: filter graph contains unsupported primitive | +| `svg-filter-primitive` | declared | skipped svg/rect[2]: unsupported SVG filter: filter graph contains unsupported primitive | | `svg-filter-primitive-empty-region` | declared | skipped svg/rect[2]: unsupported SVG filter: a non-positive filter primitive region is not yet represented as a transparent graph result | | `svg-filter-region-calc` | declared | skipped svg/rect[2]: unsupported SVG filter: filter region x uses calc(), whose computed length is not represented at this Stylo pin | | `svg-filter-region-range` | declared | skipped svg/rect[2]: unsupported SVG filter: filter region width crosses the unimplemented Web used-length range | @@ -702,6 +780,7 @@ its row into the cells above. | `svg-filter-region-var` | declared | skipped svg/rect[2]: unsupported SVG filter: filter region x uses var(), whose computed length is not represented at this Stylo pin | | `svg-filter-root` | **both refuse** | unsupported SVG filter: filter on the root uses the host CSS-layer coordinate route | | `svg-filter-translucent-source-composition-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: a source-derived multi-input filter graph crosses the pinned-backend translucent-source composition precision boundary | +| `svg-filter-turbulence-transform-precision` | declared | skipped svg/rect[2]: unsupported SVG filter: feTurbulence's target mapping crosses the pinned-backend procedural-filter transform precision boundary | | `svg-foreign-object` | declared | skipped svg/foreignObject[1]: unsupported element | | `svg-geometry-calc-values` | declared | skipped svg/circle[1]: attribute cx="calc(8px + 8px)" is not a number; skipped svg/circle[2]: attribute cy="calc(8px \* 4)" is not a number; skipped svg/circle[3]: attribute r="calc(4px + 4px)" is not a number | | `svg-geometry-css-comments` | declared | skipped svg/circle[1]: attribute cx="/\*\*/16" is not a number; skipped svg/circle[2]: attribute cy="/\*\*/32/\*\*/" is not a number; skipped svg/circle[3]: attribute r="/\*\*/8/\*\*/" is not a number | diff --git a/fixtures/web-first/chromium/svg-filter-displacement-color-linear.png b/fixtures/web-first/chromium/svg-filter-displacement-color-linear.png new file mode 100644 index 0000000000000000000000000000000000000000..d60c279f5fbfc596ca85114c448415c0de732628 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFe-bxIEGZrd2?eoAEToP+XLri z3zQ~)(0FuBYfr1&!Vd;qt;eD#WZYHC;&*6uadO>waGTOMqus~n_x{f=-<1CU%*~l6 zXPhllpXJp$C&SD8kRgK<^8!PLSr_A$Z{65>L4u)|5k{Qt*n0V*B;UN(S3g%x+_ALi zXUNVZt60rxd)#lGZ!msgzf8DyefiGyrSb2keUQzxXYPL*Glf-CaAE5^bI$cwBP#eM z&Sx$3`t#ZU&qB*pHPt4$>s{EtGn%kDJk}DqdHayOTr>yFvPXALd^vYU&VpId)yATx z%Yb?2nhfrMLv{|kqQp}jy>4uu@ba5X@)iAUHSX{DwakO<5BKuG^j_gFKK?n>1m<`l r`3I~F4FCV1>g(GH3^g`Ta4|FJgTe~DWM4fxn`F_ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-color-srgb.png b/fixtures/web-first/chromium/svg-filter-displacement-color-srgb.png new file mode 100644 index 0000000000000000000000000000000000000000..606cf13be1a8761f7190f7d929cfff0f5ae37c64 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu|cIEGZrd2?fL7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb*?GtZGJ3gFSdVq zX=264H)l4a+05)(cKyuaj87^LB^r(~n6NF7d|MkO?atB5n8D*2^txelXqJak;LS+3N+7-}%{tHN0H5F&^BYf9lS(4RQkJCFR`b0mFV_Dyg5t##~0+BWPLBpS+&@18Jwa<4s~j3UrVLk6I2@7QnZ zzCWW_F_lB~_tA%QzS>Xl>o!}in!~*3JAdG_Z7pv(X2#s}UwXwp$Mw6x?0nUe6%!VM zHS#zlGe|K54PExHv})t6PPIM(Fn8LI24!HN{r~@2Wlju`!3GL8W(I#@o6j~zPfCFz N44$rjF6*2UngB_mns)#I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-default.png b/fixtures/web-first/chromium/svg-filter-displacement-default.png new file mode 100644 index 0000000000000000000000000000000000000000..606cf13be1a8761f7190f7d929cfff0f5ae37c64 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu|cIEGZrd2?fL7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb*?GtZGJ3gFSdVq zX=264H)l4a+05)(cKyuaj87^LB^r(~n6NF7d|MkO?atB5n8D*2^txelXqJak;LS+3N+7-}%{tHN0H5F&^BYf9lS(4RQkJCFR`b0mFV_Dyg5t##~0+BWPLBpS+&@18Jwa<4s~j3UrVLk6I2@7QnZ zzCWW_F_lB~_tA%QzS>Xl>o!}in!~*3JAdG_Z7pv(X2#s}UwXwp$Mw6x?0nUe6%!VM zHS#zlGe|K54PExHv})t6PPIM(Fn8LI24!HN{r~@2Wlju`!3GL8W(I#@o6j~zPfCFz N44$rjF6*2UngB_mns)#I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-empty-generated.png b/fixtures/web-first/chromium/svg-filter-displacement-empty-generated.png new file mode 100644 index 0000000000000000000000000000000000000000..b74e4fbcf7e870ba34d75af42b3726051714eeec GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJME>9Q7kcv5PE-7*~I7qNQl)tMX z!80$QU%i5FGrNHlkDSAX{ClYpGxYbFeYjK@7kJsGH!xVd*SKNYx73bZ`!v$;{>u62 zWWt=mc7bPsq=Ruo8pBzJS&T#pXwE9K&)-&|2v%+nbj<(%A5XtB1Txq_u3~1Gmda^Y S@U03Y#o+1c=d#Wzp$PyDT|>YC literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-generated-color.png b/fixtures/web-first/chromium/svg-filter-displacement-generated-color.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cf8e21c2863da1e749e5538997c0c34556d9a7 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5Pt}Ns|>>$8;F}TD= zL7{f(o-HDCm|{9q!xJi`=6;cjHA(pY=WqYUOTWL$Xxkop#&U(_$~OKPtJCwgR+j&$ zJGYV9K0ufZc-!s)&@KP}?_b5>1#}D>$T7?e4BJ_g@9%ey0g5nqy85}Sb4q9e0DD9~ Ar~m)} literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-half-alpha-map.png b/fixtures/web-first/chromium/svg-filter-displacement-half-alpha-map.png new file mode 100644 index 0000000000000000000000000000000000000000..0d80077f0f0a4486d6f74b164578cc3c5d7088b5 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJM=bkQ(Ar*7p+%V*0bd)&yu|H=E zSF5%~quYyE_m>P_*Dnh5Zguf?Ra_XFsru%Ok@aVzoB!9}&5Zk2Ydl%=Tl?grSKgQE zF58yc$B@MmaN5p6uzGfPFV{*zhhB!P*7BppMq9R6y^j5QG{j>qqp?7q)jg|y>&%q7 zFI=%Vn9qBMTkP~=)q?`7!OAuHHu*QUU$@p;a*St6@%@LdoLaB^TNAM9^fGbLpk!&? z@W-_W56VAyZ5;gT`Z}XC4N}fAH~sy$T@6$;Wm+NVp!=I)?dPX?mW!Q$E_rPBs(7!h wj+)jIHwK{WUZ79^|JM@^WCJqTKwf5Mh@K*AFIl(g08oU%)78&qol`;+0BmG zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-input-unknown-in.png b/fixtures/web-first/chromium/svg-filter-displacement-input-unknown-in.png new file mode 100644 index 0000000000000000000000000000000000000000..1e128f835bc93a4f60678bfc836a2fbf6a6e4c12 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMX`U{QAr*7p+}g<5;vnE~acA;- zt4+e)o4LA;f*b>!O$|gJ$J!sNzu7Wh)@;_6FyAR({x3a|mGk=bkKXCV4QUK#8KO@8 z^S3`Ex=7Li!k@)x!koc&foB1Jf%p5xyAEyp+p(rCb7$W=fwz~x7EdXu{`e+FaTeni oVFrf(|2G&uoDFm#8_0#s43+`>9mZ@=HGm=vp00i_>zopr0F*~kTmS$7 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-map-region.png b/fixtures/web-first/chromium/svg-filter-displacement-map-region.png new file mode 100644 index 0000000000000000000000000000000000000000..92266b21333efb0bb2d52f842cd610f1edde6a22 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YF!Fl3IEGZrd2@3kpQE7!>x21s zB6!)>Kj73k^scl=?!b%EH%AWXY&0_Ti15u*5;~b%b^G62+st=A)e;N8*k28j@fY{Z zw0Pm|6?;;Kd4VBA)HlYiE4O2^WE4%<9FiHp#1P@W?1``Bu8%TFtKQ zdv@LQ-N(yX@eb;|#ef|d&s486N2-1_@bsP#>_!XK}f9zPkcCv{$wV0g>S n!0`XS?}-*8VEC|s0*0BP?3vld1ZAyYpa_GftDnm{r-UW|ylIb` literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-opacity.png b/fixtures/web-first/chromium/svg-filter-displacement-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..bf41fb547f99ea9138c0adbaa6244d67cdbf7313 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMSDr48Ar*7p+%V)ivig0m=^XkbC1I;t zTBe_MnleG^cE+)<`vfNPe<(Y1<emdtg#kjQqR2!p4qpUXO@geCx8%YRk? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-path.png b/fixtures/web-first/chromium/svg-filter-displacement-path.png new file mode 100644 index 0000000000000000000000000000000000000000..16d1c987312f1364331dcfbea3bf3d7a079d6ccc GIT binary patch literal 790 zcmV+x1L^#UP)0008ZNkl?K?FBlbR|?M_|~L}RTsWD zT9BG*Us)-MkPr!V9`|~uNjsh7CiA#=auS%|YBDnk=f^qc&OJ#opTBJ*PL3Wvgg8lK z#7P9GNd%}Fd4Wva%Us+fB}7dkKusb*jlTddt+K@h3@aJmJM6~~*waUu<0sN*&tdrR z%fQYKE9AhrHGPAxl`wqx2(YCW!ofK*4D|ga-WRj^6p?;u08xCVC2Z z+E<1-J0r@e&kfS(9sV}>$9K?#TtL#kU8F3_n9B0-v4GJF_^0=1G%zs%H97^H_ARX0R7RY=5*i-| z9V#PETVU+sB@m)8;d70I(GRg=!iVxxB|pUh&tkUwi2{Sh*m`& z0oo+AN1Tv!&I6Q5*d1{Yl1>5IBt#f-Btt!65+aN^5&_~QgdB0?Uu+R3A#59@%D-wD zWs={CsYwK=8U253A!dI6sUuF35~3y%pe7NZ=05-c0RR83OmY+e000I_L_t&o0LXn~ Ud(gGUQ~&?~07*qoM6N<$g5Tq8fB*mh literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-primitive-units.png b/fixtures/web-first/chromium/svg-filter-displacement-primitive-units.png new file mode 100644 index 0000000000000000000000000000000000000000..f3683cb53d16daced9d05ef545b224d2f3c96206 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFzR}`IEGZrd2@4b7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb;QDytgK#tO#WCM zCEh09Z`_>yt9fBYm9I^gn!i#XV+M~yGQ+Hk_m*!hY`GxOkoKnk%(A+T0$;2)%{YD4 z*0ws|^YeH8PVvGd{tusbE(jD??XC>a{XM()WXjP_TZI?fTq9?wo|9PkHA?UM=c`tK z9hUx-Eb5$F{X=YZGW3EhF19?8SD$Xz z7~ZKoMUSuj+z+-#g%`z=IIA1J|5H45NGDNVakAI%jWd49N3WA}d%V;|lHbULZ2?qw zGJ_N|(8bIC)g>53cdGRXfVpBn8+3ue_W!@-q=j#Q3^q`}F*7iqwfUU&T>2DHgu&C* K&t;ucLK6U{+L#Ie literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-quarter-turn.png b/fixtures/web-first/chromium/svg-filter-displacement-quarter-turn.png new file mode 100644 index 0000000000000000000000000000000000000000..e04a95554fbda10595b0bdd6d971fba1a0085fd5 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJM&z>%hAr*7p+%V*0bQC%E(cLUc zuvOcl(d~tZS9qXR!==(MF3!3ag91G=wqMfJ$u28DHhtp%^>=(ezuoiQ$oOPl{gw$< zZ8?N-IZ_e$iJfUUE}iYrBg%q zUiw$XZfARC%8nN;&cdq=TV>QbAG>I^3k5A^mtnEJ5$FUorQ6QoZOOjKGa8DfOe^3f zOO-#$*So&E)dgxBKhW3z|9@U|V>6J!2J${LLsNpH+p44bJAfh#p00i_>zopr0E)JM AMgRZ+ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-region-percent.png b/fixtures/web-first/chromium/svg-filter-displacement-region-percent.png new file mode 100644 index 0000000000000000000000000000000000000000..c4853fca49712b80691d5c5ceb62225773c59d25 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMr=Bj3Ar*7p+}Oy+=qS?q(AzAk z^^kT2Q}2ap*`@3ORkF4h1H89{hzLbZ&6@0+lGeJ@Qu25G+nnM}&(HZRyCLuQY~}se zvzBj5?PJJd2{>)%@Nn vaUM_$$O+$o{{8=djT^%P_*Dnh5Zguf?Ra_XFshXXxWBl3ZPyO4R&zs)Qp6RpkuB^_oyydxu zrnXf!@#tm90t*CgEs+1JyY^a9^4CDct@r0PzVB_%KK?4nbc4XZ zH~c>8w%^$||Gal8spBfg0yl=O9qf^jD-OSw6b(vd^SV>M_$ehKq@qD`fw)cyjAhvyDlsbO-YLQ#(l^xta=jfYvcXF*1 sbO5@AAL!Bl|Bo}TlL0c=Kt5(>NJ*8oXEkuX02E>HboFyt=akR{06`vj+yDRo literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-invalid.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..606cf13be1a8761f7190f7d929cfff0f5ae37c64 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu|cIEGZrd2?fL7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb*?GtZGJ3gFSdVq zX=264H)l4a+05)(cKyuaj87^LB^r(~n6NF7d|MkO?atB5n8D*2^txelXqJak;LS+3N+7-}%{tHN0H5F&^BYf9lS(4RQkJCFR`b0mFV_Dyg5t##~0+BWPLBpS+&@18Jwa<4s~j3UrVLk6I2@7QnZ zzCWW_F_lB~_tA%QzS>Xl>o!}in!~*3JAdG_Z7pv(X2#s}UwXwp$Mw6x?0nUe6%!VM zHS#zlGe|K54PExHv})t6PPIM(Fn8LI24!HN{r~@2Wlju`!3GL8W(I#@o6j~zPfCFz N44$rjF6*2UngB_mns)#I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-negative.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-negative.png new file mode 100644 index 0000000000000000000000000000000000000000..00c63c8c38935f93182dd35c667e69361dcf19c9 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_?I>yU%Qv5)14 zBO-Nn>%H+UOBIhkn0zBL;~{U(8r>}$K8tm6nJxMeSk16j?lY92ru*{F2 z-T2U7&Di-&iJ7?X{m$}>PdttoGW0TL@HiOX`n|^*v=K8N+gwupDCrz$2agu3%_ z?v?Xd#R9%DPC#EIGekXMJ_ii4|NpN#-SP!8*g%2C%)lLJ^Eo=IXd_UB!PC{xWt~$( F69C)?n(_bu literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-positive.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-positive.png new file mode 100644 index 0000000000000000000000000000000000000000..5d866afd39c6391a3187dda6122e69263c31da8a GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_=yi^);q*hllz z5s@uN9P%c4G_8GL_(o^T2R5^7Vo^6Lxm{VM1OKeBZ3yG46ARPp-g-)7*Y8goe*L)> zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-trailing-comma.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-trailing-comma.png new file mode 100644 index 0000000000000000000000000000000000000000..5d866afd39c6391a3187dda6122e69263c31da8a GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_=yi^);q*hllz z5s@uN9P%c4G_8GL_(o^T2R5^7Vo^6Lxm{VM1OKeBZ3yG46ARPp-g-)7*Y8goe*L)> zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-transform.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-transform.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad64bf84dddf00ddbf530ed3b9f85dd03f16a4e GIT binary patch literal 494 zcmV0004_Nkl9sMgg!<0Bq6kg;wCO)PYan0kYNWbeX+oso#_y;H;84uVi>uZXUGqZ40EKI)IG=U<>*w zG*NzVxAj>2{hIhR`S*q*K;mmqGMXTSjt~c@`a1P%^!XvFfvi{1epQo5_2dS4Pd@WboyryrL?;JsgtH@-``H0vFnHS32(>i zmw0VgEw7FbvUa3W?hPZ~R}BaUx&uO#f)?A}0gu!|(LIRN3nh}%4yRZ2djJ~+z{V_O z40^};;}JwD$&{iM!4IMVLWAxAHVS}^0$`&6*rd19y*C47q9cTj0$`&6*nR*20RR7b k1l7&}000I_L_t&o05QK^%0yE|FaQ7m07*qoM6N<$f}w!Y<^TWy literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-scale-zero.png b/fixtures/web-first/chromium/svg-filter-displacement-scale-zero.png new file mode 100644 index 0000000000000000000000000000000000000000..606cf13be1a8761f7190f7d929cfff0f5ae37c64 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu|cIEGZrd2?fL7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb*?GtZGJ3gFSdVq zX=264H)l4a+05)(cKyuaj87^LB^r(~n6NF7d|MkO?atB5n8D*2^txelXqJak;LS+3N+7-}%{tHN0H5F&^BYf9lS(4RQkJCFR`b0mFV_Dyg5t##~0+BWPLBpS+&@18Jwa<4s~j3UrVLk6I2@7QnZ zzCWW_F_lB~_tA%QzS>Xl>o!}in!~*3JAdG_Z7pv(X2#s}UwXwp$Mw6x?0nUe6%!VM zHS#zlGe|K54PExHv})t6PPIM(Fn8LI24!HN{r~@2Wlju`!3GL8W(I#@o6j~zPfCFz N44$rjF6*2UngB_mns)#I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-alpha.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..5d866afd39c6391a3187dda6122e69263c31da8a GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_=yi^);q*hllz z5s@uN9P%c4G_8GL_(o^T2R5^7Vo^6Lxm{VM1OKeBZ3yG46ARPp-g-)7*Y8goe*L)> zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-axes.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-axes.png new file mode 100644 index 0000000000000000000000000000000000000000..014f55f07148ac13f1b97e2b98f63cfe867f4ca3 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFzR}`IEGZrd2?fT7L%jMv5%8e z*XTGUDdbP`aJuCnrySe0r<)@B#A5=U|JeEK zua;xtkH>{+F_+(!xL!_v6lPK>RLJ9y%pk>lq34_3+Fs?BV+Su9c-qMam{t+F(GYb zlliCr+1<-}D6bI`-yfrNNA+*V_C3!h?Y^f~YxczEgACBlTdwb&+9PlO_*&Rwy|^Wt>A!mr_-!tpZO*48k8+>sF+afq$ry#6AeWKL_RXV0(qAH5=K z6%!U3GMxQe|A@EwqK^sGpe-lZbr=~K{{L6rRu=^fKQ>UnF*AIMu=%|Hsemw0gu&C* K&t;ucLK6VyEul~V literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-blue.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..606cf13be1a8761f7190f7d929cfff0f5ae37c64 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu|cIEGZrd2?fL7L%h$+r!DJ zYjm8F6v`)gINfs4Q;zM5s9-m{CKh$0QoM`HY|)S4YQ`wdAJGvzb*?GtZGJ3gFSdVq zX=264H)l4a+05)(cKyuaj87^LB^r(~n6NF7d|MkO?atB5n8D*2^txelXqJak;LS+3N+7-}%{tHN0H5F&^BYf9lS(4RQkJCFR`b0mFV_Dyg5t##~0+BWPLBpS+&@18Jwa<4s~j3UrVLk6I2@7QnZ zzCWW_F_lB~_tA%QzS>Xl>o!}in!~*3JAdG_Z7pv(X2#s}UwXwp$Mw6x?0nUe6%!VM zHS#zlGe|K54PExHv})t6PPIM(Fn8LI24!HN{r~@2Wlju`!3GL8W(I#@o6j~zPfCFz N44$rjF6*2UngB_mns)#I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-default.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-default.png new file mode 100644 index 0000000000000000000000000000000000000000..5d866afd39c6391a3187dda6122e69263c31da8a GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_=yi^);q*hllz z5s@uN9P%c4G_8GL_(o^T2R5^7Vo^6Lxm{VM1OKeBZ3yG46ARPp-g-)7*Y8goe*L)> zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-grammar.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-grammar.png new file mode 100644 index 0000000000000000000000000000000000000000..5d866afd39c6391a3187dda6122e69263c31da8a GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlu_bIEGZrd2_=yi^);q*hllz z5s@uN9P%c4G_8GL_(o^T2R5^7Vo^6Lxm{VM1OKeBZ3yG46ARPp-g-)7*Y8goe*L)> zEAj8mn==M!HZ!}Hy}z+Lqe$h6M8h!#6Sf7CZ%d=1f9!AgdNS)}nD)I4h1pwK-aWqj zvvamjSW^6>e$xZG)A#sAPszC!xA~nM-?9La`ZbLAHt3&Xl00PB`mK6ryw=6t|C|>8 zeqY>S?EgnN-s9S%ZSHHoI5_MOUTnzlc52wd<8yTWa9OlofZBL><3z^uXTm>d6ng!B zP;l}e>!QGmVn+n7F+Bh7KZVt(rIc%C%)MThEBf1Ns%M|wE|hlX1WcgTe~ HDWM4f`HY}c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-selector-green.png b/fixtures/web-first/chromium/svg-filter-displacement-selector-green.png new file mode 100644 index 0000000000000000000000000000000000000000..2ccb2154a9dfbf3eec7bbd3c7b13926a8cbf84af GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFsgaFIEGZrd2?fT7L%jMv5%8e z*XTGUDdbP`aJuCnrySe0r<)>9Tg9D!nEdef zR%M?0Zx)-^yykC9dTCg!J&noJf^C5zLoZ{-xnFa(9TRj)W{_gOAklD)!2~Mq7jkA< z;zoh5R-0yY@7n$Qf#&Od`&2&*#9!g$_`GvPpty2(Wr%M3?B3tM`}JS3xZK?)@i}*) ziPP(?bKXB*Tl#~2>a*7ub$_UTtI$ua_1=2E@5Mt~km>WBR+aJnyIjx$vn(<;W!L*N z>>oH|9yW=$TP#(d;MZ+>Ud)Q|;OB0Tk;YE%o}2qDJ!7Bqw%AxoU-e|g#D#_oXa6Y8 zJ`T@$8yBX;JQl)GgV8-RqXPc8fVWiU*45Hffw$6c+2SHf!QDCvl~AmWMs^6%Lj0 z^8I%Ed%F&OJTIBvc5#1AP1n+`hbBc7O)BJZI9=1=KW}H2YI)_e`|+`F{lA!4^Pkqv z+xy}>|B?+_s}9MYm^)wZ-u;(#zZXPx=C6xVKfXx!PUDNUI>#P8SHJjda^Xxx?8i*noQjx?9)bsfI9>#p|6k_T1|#~8NEoY#8nvhl~;j|H5P8Kjsm zNHk2_Ho^D&JjSLL6iQqvW&c#UF|D9e;DMRh(HTco4+(r~cVDZ~b$aPH$-Wid zeA~9@*3{mflj6%IZe+r?z>uMrF@wheYS=Lbn9#5P!ry=XT-&M2rwA6({ml3u7@Gh8 j_Z^>D1!S;+!jqZ7G~6ownB>VTKoJH{S3j3^P6-&(TqY^?{=B zTBk&HsfF7)S8rfjy7k2u7iZmzL4h6_p59gJ$FJ5^& zQ`*-z*n-U=nPJN#=7_hce$v`4#~3nr8q%8meV!$sUw--KzA9U(HMahGVSl%mN1g5! zOm4j(!Jun%L}-5VY#HsAWzh>Qz9*jlxv%)XhrogT^_h=(7PM-Ask(LY@y(O+(-Xot zdVf1i``pA1Huxof@u$_l;#V_iw}drI7L@(EJy+R2jAQM(-wsET;(L3a^T`(KrL0004JNkli+bwjU zf^wC224?^>2izRwkD>t8X>CX*Aamsy6dkZzHev4?>IJM{Bi^i& zPapSk90WR$r@npQvk)4<9N5jPm!&xj=<;L&G!n)KmeAp(^@=HkMyrJEZ9w-XaWIW{ z;AAwONjd_Sx$Pe~C;$xwpuz7-Or~>*fODXZ$OW#2O^k*D(5wIe0RR8=(zX8LbBYH@h|oV9hk|2L$! z=FMh!%Lr7ow7#cmzTfJkFmaBzcTVg7m2v#Zob&Z`QS*he#ibu0YM=%MGt6eXA#&iE zd`3>mriaW6Z)OY5vOn-_*@MNwDz}({HhKS-*!sG1_XD_5S=@^2yg zpR>!WkKa9;mn8auwN6)D`8)IKuQ!_(9Rcf_Rit=&^^S_#DnahiX@= yNuO#CF4fowbcP+!v;Y5JZGZk2$Y2BcnwjBzngZL3kBhB=A`G6celF{r5}E*_RDjO_ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-turbulence-map-linear.png b/fixtures/web-first/chromium/svg-filter-displacement-turbulence-map-linear.png new file mode 100644 index 0000000000000000000000000000000000000000..72faf556d656e76bc831793b42c184758ad2a02f GIT binary patch literal 566 zcmV-60?GY}P)0005&NklJ5QYb|qNSkV2;6`M!2vi9B?qA7I2-^(12qLDR8Sz1HdQQHvMk%{of*$~^6;k= z+11ASe|sK|cY6Q$0!_}(PC=7n*l~sdYlZ=9cHY3GUFNhIA!N-kV9kVobbWJKynpii z1}u^RdE*>?|NJjLG$%c$C<60y_AJy4;B_~`Ru9Dx($IZ-{hHi)dbt7#4zdc}-(9#5 z<}uKRP=!1}mizMX_*r=Xj|*CM8WdIlKUShOUzuI#d zQH*;Lc;$O`1zMU58-|Bk2ssb^ZBRWd=YWWZyc1U-c|avG+k;-h1X|1J9IN(^oyF%s zJV!Z literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-turbulence-map.png b/fixtures/web-first/chromium/svg-filter-displacement-turbulence-map.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5053a5b3e0d32f2a1d74a72d38d69edfb0941e GIT binary patch literal 565 zcmV-50?Pe~P)0005%NklJ5QYb|qNSkV3Y>rjLCU|-ao!Tlk>Av(Bv3)oMFJ4VZfT5H!x|JIc-J=Su+e+GvOay-&_{&pFF<- zi)29FI7i<<|BDaJNzW;Y!2Fy&3pE3H-Hou-LotLjbl+aTCU>4*u0Vo=tU~v97w&_3 z4D=yXAy1IyzC1jBRvy6Pf|i{Ig%!Y$m1xaZCR|EId=7a964-I#(mHmu(c z<6Z<_`JP>Ymgd5S;h`2n&O?72R1eEJAmSnK#1%*$P)W@8pqDU#)-pOrES)s{9(+}m zH&CB-@s1{Jz^i9Wc@AR8*Vs^KSQlmTRC@i|Zr zbfgD-=aI>QV(AP{64BvOB&W&8DoF_8du?&Ukq$wGZidy@fEf;tNO)A)bgNHu4eJrNU-6Dp=Xb z2D-g8Kr&wPS)-K$-A=^B44526Lc0Mg-2s|`xCEI?_i*+?TO!@V>BL*b=mXZM?}dK< zR-nlUA!~*KYlZ=9HUIzs|NoXIK^p)700v1!K~w_(K@7gall+bN00000NkvXXu0mjf Djui4A literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-use.png b/fixtures/web-first/chromium/svg-filter-displacement-use.png new file mode 100644 index 0000000000000000000000000000000000000000..68129f7525d9307aed430a803187c0d354bcdee3 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJM^PVn_Ar*7p+%n{2bd+#-s3@IY z$kcmbci$z(DeD%iOQ{E}o{}{+Y*X1aBWwNS``6b!JNp0jNte>Scb!ijTUfw$foFlF zgKPrsh3>{860^(cME6B)&*?SiN3Z{$4XxcEnM?aRk|1TIQ^ z_%=)Pe{Q&TdBZcI?LXh0`c~X00J3t+BWAaMA4Ng-M}1`U2m0v$|CfiftAGqPkk^FVdQ&MBb@0Nn3)TmS$7 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-displacement-viewbox.png b/fixtures/web-first/chromium/svg-filter-displacement-viewbox.png new file mode 100644 index 0000000000000000000000000000000000000000..cfc422c1a3efa94f782907cc2f80f54d8446ce82 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFmijkIEGZrd2?$&H)Em%`v>;v zR~>$a=6n*@=xlT>lji=EZupUX!wemjqdsihvy(Q=(s1?MCHg1kY6s)6Y!sd|7fJEH4n=JU8Y3;km0;~~E z8PDp2{_V5zC~bTBE&GPWm)XbXWjy*O`NQC>`?jw+m6hwd#B!1#ns=Yh&@t>&cVEQs z&2jdsZGg6(i|sUlS$9*nY_c)$-~HV}+iOG1g_yg{lPevsY;M|o_4AvsQ=N@Bm^0)m zCcM0P{BM_P%Q1!wx!ZSYEn?U8z5D-NK2dL0<8|+ekvEQH@HCXMGcf%B&yW!$2MirH cP_QsFEIFq1Pv+mWuRsw7Pgg&ebxsLQ08wCy{{R30 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-comma.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-comma.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8de8defd2cd4179052a70e2b8f3a124af40be3 GIT binary patch literal 7957 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 LNkvXXu0mjf3XqOC literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-invalid.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-invalid.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb654dea28dd3510f38b52bf6e613503da1d721 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5PZf)c|>>$8;@vuhu zg9CrBKfb|gQL?~6c12gJMaBB&#`A8~HT(9PzWiIY&a;23C8H@2ZcYB>=Wo1lRs-?y z*1!Kw**E_0xuzn#igN|$id^{uW(J1;{|~)S=m0u~4dfVRhNGfvj=Sa_as-Mnc)I$z JtaD0e0sv3&Q+xmb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-negative-axis.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-negative-axis.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb654dea28dd3510f38b52bf6e613503da1d721 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5PZf)c|>>$8;@vuhu zg9CrBKfb|gQL?~6c12gJMaBB&#`A8~HT(9PzWiIY&a;23C8H@2ZcYB>=Wo1lRs-?y z*1!Kw**E_0xuzn#igN|$id^{uW(J1;{|~)S=m0u~4dfVRhNGfvj=Sa_as-Mnc)I$z JtaD0e0sv3&Q+xmb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-one.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-one.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-plus-exponent.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-plus-exponent.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-trailing-comma.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-trailing-comma.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-base-two.png b/fixtures/web-first/chromium/svg-filter-turbulence-base-two.png new file mode 100644 index 0000000000000000000000000000000000000000..ba8de8defd2cd4179052a70e2b8f3a124af40be3 GIT binary patch literal 7957 zcmV+wAL`(VP)000mGNklS1V^7DE3<~yY4y?m7ocBSfOgU6y;gPQ;1g$n0Q4ENx+AZtl`{2X2`M`Tp zjC=Hc8_^_2t~&Zs(8Nx$T-|8DolBDXu2BEK6PJg_~_#3|^~T z)pgx8##r@VU%X$bqzYB!qR=MAw5-cCjVS~hxsTPX-0`WZ^U=TN#}eknPwTdLzh=Md ztgUJ)*Hv}fwVkWWqEN5rbD76=nZq7fe4(?-VUMfqITgv+f=w#ts@B>{>ndgKW2{na z+f&Lri(x4_XM*65Fzg|)w8GgeUx{_^F~odCridv=e#Fvuc5{TvFEjtPTI;f^>aHWI z!}1)q_ZWtm4TO2yS1y`EG*MMW-4`E*l^1PQRm1Z!4v%>nmTii==gKUGS5kYnCChcW zE^}Sz>hy80UD@!TD^pgB50=XntdQ0DvwA5?!fV{8C9iATxH3mwWM%m-bfdK`T~oKqG!Mgj z8egj)Lzq+cTBo8gnUI>cFkMx&+7S4f4EgQTr8GtpDE3~+87)E9yYHTz^PN}?ap$8= zSss}{fVOq@%i_0b;}&u9X$)!&g^h(x+=#7aRzy;1+n&xL_~-cJG2I{j@s8t^W}o*c zhiGgrUE!RqYkThNYv0`{f&2Gw<2){Y3HzLt*Cw($Q&Js$<*rqAuIsL@NI7SX`R$iW zVueIG5a=kYX48IMHbN8<`5BeYMx9K}9*BKag|Pc&-Nwm}udu%M@QQJWI#Z^pblFwP zI8FJm6kFMS-yiSieSE%_`>;KiIPW=Rtqg}_s@Alf?N7G7G`Ek-r@rmJfBW%#z2}wG z-;|=dja;Z~ovi!J4lkE0wZjI-bsz|7*j(${u4;SAcMTjpRWeh8>%OdcO_HCds!TRy zsZdIT{NC8#Foow3heukUIeAW3S1NZVx7oIYtFFqfcAW(>)@2OSJI!OUO*WBOS>jpN zjX9m&_1s)fO@BGvsH(sI{OjBBn%9wHEpj5}EWZ}ixOCmEKV6k7zW(#C={0W4OnUH< zw7kf=)9n<~t?N6$CKI!D+o#FD7qzi`O#$SfRdkeS0p{=*Um)B*C%@#mP^&Al)~!?7 z>9TP}-??+wU)!d$K%J(5d{M5Y^L>$O62cb5zCSmY>-l!Qe4P3-nDcl(evI$;I+1cJ zM@Ld;pto)6^XYUwUp`3O=a28h>po4-ZJWuOq;j4wZ9eVghpvjMCN3oftb;epto;De zC?IQd`x3lU8~IaJO*OIqpLC!cfzY)k8!(sWIAxtu=Qt_QO1|N6Ioz4zVo z+huqT04GSN$cftBPTdD<|8#4*W*7%s22*V{XZ5w{X zfp0+pNJ&bTUSqAU+OqH3%k^^m1kTf#EN}AdZs8FE0w%i<44I$KZ1>(^_f|i1eI!QW8y}6`I`fdhI>8$kB|M<^8 zfviuTKFP_wr*#3Fl_@}E&Z{a6n8jypE?m|PIAcgTZ7N&$_31+1e7f@S@84h3dsv5I zc~MSl-stMlbr z)l~XM|5eh%BVgT~T;pvBE*htFWpyZuP@9s1tjZE}2QTRDG;AP+INR4=JcC)iE%e#| zwtF_QYQY|2%E_xl5%XnCQ4(p#n)n$B-;}Pe>$a9K`IUMcR~9#q?s*z z_R6k{G)HKKZThmR*$N?-1JX)bbuRc7aAwq|1d?hig;bj8Awfc5v>bzccXi_``lpFd zGOLRoxK{a;oU~Zg<}&D2&B1sA5VfSSDvgF?QMm+(7tpVOZL-@Ek&1Q=6Wq4R`+41m ziN+c?`f#brrf5nCT_&qbqO$Lnb=c2eegzl${?s(B)K6TJunsRJn`E73DCn%DD|;)B z#3VW3FaplwOzXc~PozPqlW(J+Nm!%ya}n1JjOLW2+wG=Kt;t;pl*5RGOKz+193g5s z$!Q4BQ1VBHuI+nNA(<_fUX@vIC$rgNugap5T#njCW7u^fx$W=2{vnO1Zg&{rdT<*G z2l^_ZvBX=cO4wlpIfR_dGvqN_n4;Wz=bhK<`Pbh*k6k@at)vD%g?L1HKnGQTX=WQ9cI0I|N-uM(Yl{k>~ z4Bzkiw(o}bFwaBq3*|$TN^$_i*V?k{x=VlRreTQehw_$JNjs zsO6ahM<@gmM@8_D*!z5Rw6w3vS8B1sKkAkabmqg$R#AtM4h23cb&#d1Y8&=3rDhR(Qowj`s!~OAjx=g9Ix@jDVQ8nkv z!4EBX54ylH&ZkaFB<2G%;h41Af;8tU2$s61*jY9IHre>RrGj(=oZ;0=R%7BkVi|WA zgYyqe6)~-7t%C20WJeIG)kENR=a(giF$@? zY=|AhfvH{E8pj583m2>Lqdxp1eFjV%A15@TrxTZctyJw)tz zVYP6l${EiGfJ_dg2JjUM5#XX3(>pmBkdG4*nvBpQLh#iT=qHxqgf@vvfo!#G3N^!@ zm)nhIye`hSF0M;lx3uCTsI+s8#vIjGOU;<)>$NPC+G#@N-u9=Z0osdNu7>@G&q$B70;nuQIz=BnFTmtm{?IwO7KhSm|xtq{4_-a7mB>tlR9!!&BY z0u#Q!#C1J?{sdvAyVK2tSN_Yt{SQ!%1{Z;P5qTn5)4@ECwgvp}B3o$sMszzFTzmHyVr!2 z?o7&IFr4Vg-@bl-fBUgLU-A7$q`~0B=>>b`j@K{0{_^WhbfpP^gG)m5IOs+f-AV*^ zQeaEsjZk~i9R<#hVx;r)V@v^FR=A`1D~Lk21-zkokTUP-K8*Kq82utXf?ph9!@9T; zLfO?W9kHQ0Ajn)*@R}bK4weQeajM;^M|Q8nBTV1-@s+1Zt{8oc8F*cqe$#E zv+IORf-;Wt^>*$rH;eU>gpL|yp?CAb<4E{+==gq{2js^g5X!E>od@ljm zwKc%9n^of>?57JHU0k5br-o3nVH6Bxs3|nsRxb-=Zlk!3$eEqgmIY;5R}!qT`aseo zm_ePw%lHk{T}fvnfh7azxL6=7?hpx8;t^awK0sFy0pfn<1G1=;2A)h!LtOxhgBp>9 z;O9E?qY-+za@afFaW_af>vg%5=+%Sg)u!I$cy?hNrTCRjJRzDvQ1i6QwJ6ejG;<-$ zLb#K5N71qbb@-I>qSs62NN-|yLS&8DmtH(gc=%pQfjD7XbyIW)G0u|P35#zVmqBze z?LwKKpY`h&mN_nC#+%qT#4vYGsoHl*A*^M9?cCkiJjW>xp>PXnk68q<6283ynmham zM+uln!s6r|S)d1Y!}^TqP})6<-UT`Mbs?P<^HYp!(vK^%dHIuc3x!B796;VGawy3G z9;`d1!_<@>NvS{$pbqOCA>P|tg}IQ(vp%>0zY-rnOij))ui{G9HFlRAz53}0%WuKT ziR0X&70)%I{As&_n&xK{6Nzov1~7qlm&8$p)^HtlC}elE4lzEkwrKK*3nd~^B5;&+ z+$BI!s$N7S$ICn9ot0o|yGq67t3;xTuk7J zq_hIgqf7K%hqUNOMeZdF08my* zMVbkoI#>#s_@55J2R=q8EDek&nF^KcgkXI|z(EaE7JGXU6i000iYNkloMk3@7 zXR*KpaJ(ilSzr}C$RgyYt!pGj%^O+Rk@@M!m*YDKMc~+XSjry$Tjq+Yg#DmHC%^=u zj_KuJj5EAPAJm1Zp@>-7&AGc zc2Rv4OkGj+*u>MF?Z=5dV|-XacN23%C);(qZ32ZPsSJ4vDQm!s<}dn#3(*gDRT8im z7c4z02A8FP^3oIqmZ^PCKt@V3r<1h{P>}Jc%@QLAyVFob1y-OI=_{VoVLMq-XTt92 z8K<^69obn370Ompk8-czGsAOzfAjBQr-{roi&D%gs;N%O#Dc{#6(r4YR%xxW5#i2~ z%DbFu*PJd?eKZrri5^gg`6X+{Av;hNq!bz{Zm_s8O3+h+kLdylIut@HUZ=EsHc;H9 zp|m^O;+KY*2;gvTPvT}!Sq`oxV%Cbs$QisJ)8pHEzi-cNf91Hal9W(XO%U5tR*}Kq zY#Y}I!t;%mA)%oqoGU!4v`(2$v%0bY@o%@!kR1ZA#0$XG*ig0D1GJluFTb8{w-pNwfxyup+TO?{ z&m3?`BRgJy=Y1@s;lTBxXlZFucP##B*~S_Saz`qG_f7JZLBX+J(bh!=AvsNsS0a8FMQV)Sgw z$w?l#%dI71$N2UqnJa!$9ZFSt{?XtLP1C4zX1L_Jdzgd-X1OA%Y4#1L8ISA}{e+#- zx{XHHE==+SUD=dSS^$CWEA}DN2V{Okt0$TAMra7AgeM2fX12sw;x-{uhS3h=izCEq z4`Ry543slNx`@dEr#}XiRYO%td(wwBA_lt{5HiIILPtIB7HXuakSj3%)AjQo^YY%d zffafoanuZgHyf;Cq-j}FC)<`}x=nhn3m8e4gGfRGQbXkzr_+U>z?iH_m=z2Fw1fyZ zgmF6pqZ@&F)cC&HU6=~MAYL0r{D7}LE@6zg=olEGwXw4)lu2wObMROzjW9^X<03D- zeVWI(fa|Ds9HHxlIpy`--(1z`^_};Hz6ND?LRQ3zmQy^+MkuA1`EL>{lKBBSyd{I5 z4FKRpUPO#RBha(bQXo8(FaUSxTxgd#FG{8~&bs^bcyHs&zp*XZSQ?^P&_7rcgr3nX z30O+OW|{Y7nMZ(Vc)*x@bC69e1885`X>Eb*H7{G*F73y;{loym?+eLh1O{Xd57o#& zv(6mT@BH_H;%`xdRh5l*aTCT&-vXH_g5bXfT7Z&ED8ko7T% zg2YfL2h|nc8X+1m7O;#;6B>loZH}>n7DD{9<3Iq&Kv}1GxexYz~=jI zTy!&jK4Ep3dmJ}92c2s-i@+_Lq-974llAKgTcs~pDX+>(=LsfNv?W0~*#c-;!OS?K z70Ci=T0)ZPJANbNwb&TXAlNj$@8rX3nW#_GYn$&lj@%V0$Gj$SPIw*Y0ccMzPH}r7 zryU3rr-8E*f=LYP?xVlj=B(=oPOW;@0RLzq(*cUDH95?$5{i8u#}UhGkzw5oBEk zmqV>$Q{Y95rGRCD<7b&9Qe=#3vlw8KKH9dxf79QX)nBhf@&3HOUr(qmF+}If&{n)E z0DC*no_YRnzx_VXGYOH82PlNAS+UGkDBXG#G0h7M?7FQK#eGQQQk1rqGC(~YRt0*b z=}+hT{kuH9@p`Yrh=-0;l_|GSMQH}kp^JK2(0iOL3W851-4xS;g$rzncWX>rmkb!r z@KtLcKOV2w4~(}FzwlV3m{14ftsBTz{CqrwLOX#|s-JRx-`_HukjI(APpN?GiKU9# zDjnraTNojk2v0BKS)TGZ=9bikj6LHqT!W=StYNzXA`JxR_Hp_0`Fi_wdp>>)|g)(zbIrjD;sdO=-7Y=nd)(W-=E|CD|7h2_{7A}aMM1)3>_NiQ(gc5 z+1JHp_Bn{pE>RSAC(l(;=L}52CPso#JS{HJvarT1j9p0}fEO(fOWBGhrZELgWDBQ? z)*9Pv&dB2^IuDJ>g#YyMfjb@l`S1UDzrRoGb6#fq{LcZgcKOo(@$30Ch~R)yvFENK zIdQk=$9sKE$k#A@3$Od1?`a>_a*h>;_PMNc+eGanbL6yIHd2c{C$bK9ih+xVhV`3e zEQPO*+sIfiGfzeUZSZ696?2n{MwR?gm`>E3GM@8q*(3NB&QYF`z~+PTRZgP$m2|jI z^L^c4et+5NMcyxB@*o}0=n6xB#3Uny2PVw4d2YuzG|33fhl0GE)^f=8)kaIJ!@C%B z(JJMj3h8iUN}=fDS13~hjI=(Ptcltp;=(>K6O5m;9~pR{ZxW?YL2POBC3BgKRHlUh zd{9|=CW726-L$M{IYh9}-Jm{0RA#7eRvY4cA@T@V@nSWC|qY7N8G2f0VCV1nWq zmThT!(Iyq$o=hu~t$8U?IO66RUACs`Eu&B?ql9BR8>|PtX9a*tsVE9ksq+<)8}Utz>x=k|oQm2A3jlB1J&vN}i#t&$>Dlc&4r?kh$@g zZOLTL3WsBaz$-P{cNY1^yglSk7#QVRw$MC=W4FfMI&7u!VF@m&W5%ztubCW)%ELBermT4Rh)#idCK(z=FX~JmmVtN?6uCV5c4COs ztTWNVEmrp959niyFAJ)zo8SiTmI<5ybaT0N@-Ux4detenN&lfsUo}Kiyu1EdH6KlV zYn$7tJ6-zo6{0&mp2PPa7;h@G0rgltQ)wKBY}(@qhDFw6gKAKK=<&3QdoBrDY*BAI zciz{b5+)-SyjX=e5r@_j3p2^A6z+_-2G*g-?H~X8FVKPo66!|}n`T%g{yj-p*Gr48 zynbBpRB`(x!R>6_)^;+72fgdQq={W_f^L_~8BPD!|NC>iKbFS}rmyl^SS61+^ym7t zu)~j!FV2m1J+{Jz154lN-G_-?mqja2-T}p3$7E6-BM}5XoHe1b%6>|F?g9dgB{SpShR)lO#`1+mDRxJ`P|$-^|xPc z;{e7!zdi2blMOuf_fP=0&aI3o=Dl8VGtrxoNx1tER#H!5n}r|&mcf{_eOH|>Et^>w z;y)I7=S3GX<+@z)3pAT?qaZ-1ouGxNvgW~eSQ^1&fSnQ(6EhU8a12l+6l&6L; zE13R*Ego6|W;Nm~Rp(1rwbhTmz7E3=24g>-kG~$+Nss+C6!UDA_0-yYZkDCrmg_OU z>Cczj_15>`TR0v;KHSdQ`fbNgo3Tw-dDbs(3j{97QwXsBvXC*g81w9*l%cSdR>}!X z3uaCDdo&Jy07G{7-L~BH3BlgAFFGUNGElBv8fhx^=!*E{pYYKdmm7o(b82xegpbh=#l;u0E06Lq6RJs#vg+&R%y{&S7|`qS-~dQn zm7=MRR&C|khZ5uIu?(*n+JNCXt<#&=vOrC|#**75f#x$p?^(!cdr0nb~D= zJl-u&j(d^J%dmvk%(^uSFiZQ8VT)*}Im?53t<3#pZX~??c!*2}hmc?Fb;kXmHm3ta zr^GQknC#a5iPZQ#Fqnl<#EToimAduh&v%} zn=Lf>fLXP)0O)U$JfNY)^slX>f5G|j@_His{{a91|Nn%snw9_n00v1!K~w_(A0MmqUO}7900000 LNkvXXu0mjf3XqOC literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-color-default.png b/fixtures/web-first/chromium/svg-filter-turbulence-color-default.png new file mode 100644 index 0000000000000000000000000000000000000000..007cf2b998f13c99c672973fa2b83563260c3ef0 GIT binary patch literal 8246 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 o0RR6S6Xz>%07*qoM6N<$f;D9?VgLXD literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-color-linear.png b/fixtures/web-first/chromium/svg-filter-turbulence-color-linear.png new file mode 100644 index 0000000000000000000000000000000000000000..007cf2b998f13c99c672973fa2b83563260c3ef0 GIT binary patch literal 8246 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 o0RR6S6Xz>%07*qoM6N<$f;D9?VgLXD literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-color-srgb.png b/fixtures/web-first/chromium/svg-filter-turbulence-color-srgb.png new file mode 100644 index 0000000000000000000000000000000000000000..4578984b887db07fe8fc07a847be823bce265d5f GIT binary patch literal 8803 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-default.png b/fixtures/web-first/chromium/svg-filter-turbulence-default.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb654dea28dd3510f38b52bf6e613503da1d721 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5PZf)c|>>$8;@vuhu zg9CrBKfb|gQL?~6c12gJMaBB&#`A8~HT(9PzWiIY&a;23C8H@2ZcYB>=Wo1lRs-?y z*1!Kw**E_0xuzn#igN|$id^{uW(J1;{|~)S=m0u~4dfVRhNGfvj=Sa_as-Mnc)I$z JtaD0e0sv3&Q+xmb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-displacement-map.png b/fixtures/web-first/chromium/svg-filter-turbulence-displacement-map.png new file mode 100644 index 0000000000000000000000000000000000000000..26402e8f7ddb6fa42cd3e94fad4dcbbb73d6235f GIT binary patch literal 726 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-fractal-octave-zero.png b/fixtures/web-first/chromium/svg-filter-turbulence-fractal-octave-zero.png new file mode 100644 index 0000000000000000000000000000000000000000..aeeacaef2d60f7048b156ec42b0532bbf92d960e GIT binary patch literal 202 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,SrS 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 Hu0mjfm6dJL literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-grammar.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-grammar.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-negative.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-negative.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb654dea28dd3510f38b52bf6e613503da1d721 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5PZf)c|>>$8;@vuhu zg9CrBKfb|gQL?~6c12gJMaBB&#`A8~HT(9PzWiIY&a;23C8H@2ZcYB>=Wo1lRs-?y z*1!Kw**E_0xuzn#igN|$id^{uW(J1;{|~)S=m0u~4dfVRhNGfvj=Sa_as-Mnc)I$z JtaD0e0sv3&Q+xmb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-nine.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-nine.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f31ad315fb2e747a90d61e49f761c77668e96b GIT binary patch literal 8889 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,SrS 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 Hu0mjfm6dJL literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-one.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-one.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-two.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-two.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8278eaea86625f3dad7e60dc8385e4a127f896 GIT binary patch literal 8324 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 O0000K4K literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-octave-zero.png b/fixtures/web-first/chromium/svg-filter-turbulence-octave-zero.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb654dea28dd3510f38b52bf6e613503da1d721 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMMo$;Vkcv5PZf)c|>>$8;@vuhu zg9CrBKfb|gQL?~6c12gJMaBB&#`A8~HT(9PzWiIY&a;23C8H@2ZcYB>=Wo1lRs-?y z*1!Kw**E_0xuzn#igN|$id^{uW(J1;{|~)S=m0u~4dfVRhNGfvj=Sa_as-Mnc)I$z JtaD0e0sv3&Q+xmb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-quarter-turn.png b/fixtures/web-first/chromium/svg-filter-turbulence-quarter-turn.png new file mode 100644 index 0000000000000000000000000000000000000000..b24a97d3bf27ca7e92bd59c23ee7887999785a6b GIT binary patch literal 8797 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 T(g4sw00000NkvXXu0mjfaU2UH literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-region-percent.png b/fixtures/web-first/chromium/svg-filter-turbulence-region-percent.png new file mode 100644 index 0000000000000000000000000000000000000000..5f24986a77e8927d2715deea247439b445e9265a GIT binary patch literal 3256 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-seed-grammar.png b/fixtures/web-first/chromium/svg-filter-turbulence-seed-grammar.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-seed-negative.png b/fixtures/web-first/chromium/svg-filter-turbulence-seed-negative.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6ff17de038369023fdd588cf702bc2f4caab70 GIT binary patch literal 7308 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-seed-zero.png b/fixtures/web-first/chromium/svg-filter-turbulence-seed-zero.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-stitch-grammar.png b/fixtures/web-first/chromium/svg-filter-turbulence-stitch-grammar.png new file mode 100644 index 0000000000000000000000000000000000000000..1007cb654528011a40de08e2242d55e9bef0bdc9 GIT binary patch literal 7818 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 RSVva5AxNPGD+|h8vu_#OurElHi{rU6PFYL2s zlYdNlU|1O=y{;}UU30s1Wb6I${Lljszr9|dC01?}#9;r)86k(tpCQTH28#Nwffz_G zC-Y3nuNmxqsNai1$24ZB=84561!B|qO>>OYfRkI}BzB=^g*+%d2~!Sr8Jn{-j`ocN zq;)kYw!wY>``ypy^{3&V|Mcbg^ds{wIV%~p!x(Ppm|Gqn_vzz-uev_JZTI^>IE2ZY z#pnL4f+_o=`K88K22&`G+4?3nYIwY|&&8#Al+a1e62P9t!?GO+Cs`(51|sZ&c5oec zm^`L+R;DCA*=mc)-=3>|?Zq7Hp5acl*{uOMv+_7CwE>J)(EF^Yt%f+p9SSRXlbWwE z>CmGcSriq@cW?G3@{;;#PuntDF_kr4zG<_$o;K{t9^^&MCfnSSfe<7h;P)R7x2=0w z0ceGviCI=Rg=?M64=|MMV|we=Qmk5vb_J@&Di6rPCFO!V0P=<2=7=hVg^o0V@d6Bu zH%juEa+ZC--1y)FK7(ilJ@Tf99oM+d+4hQzWJ7fdeP~ZEO-S{u9HgIu)NQMx9*S#X zyPA#9>&kTYF|uf8bxipfK^K~yOK51?f66$d>*g$&f;NaS1{WSu)Z<*2O>_*VPLEZH z>M4tB;jV?fRm@6k-MH>n^w$#c-!xd>a*|_G8r$O5+4+TBJ6Fx`4?W6|Ei*P4tvBT9 zp^h9{TxiC1dK)w!#tWx^=Z8&fmydwrhaPMY-V8ri{k7@_#x+gd)XCzM*Mm6Byc(nd5S-E=%M5KviMKL2IE7adAfzx5lmv_TW4@(n#V%k2mP)KmtNm zZ|>KB{+Yxlj-1KI1F6riCQ~UEq258r?0=()vI!IU94T}XCEkXpQsgM zE?Ne@Gi|go;8a_=mXa+rK9tnf{G-B9JL{r2^mvM%XPTd{A1hQkEPLG2lnFP0&dK1e zS^R~``t8dX@C<5u+783JtSJxKsd}EZasx~a40s!^*Xz8@zkmDvdB0Eh`+9$V{NtO+ zd{XUo(QQ?~H|x<|_I|ijvVh0BS!&rtaJf(NM)pI(@}Y&kwB69jh{rzCa6n=zrin!I z59PGD-=PMYs;!zPXB4dDko-w5B)JFU3wypF#ZIrl;9<5M?b=i{GGx1{N+-0vvc;aF z`}qECoS*mStx$RvV44 zZF+-C*YfSo^3Wq7R*$rHJ!wBcAKria?e+XIF4KK{zJJ`mJ?`V<`TG8DW^c1l^li2F zwZFFe_~yrBzA^`dHj%)W>*aHJoa)WeP1n)?{m1WQH7_`Ac6dgsC(bNV9**V;ldM}5 zvqMlV;ANIh&uW;gSsCm$uX=ge7>SsPRpRBk1H(!PWhSSOcA}vw_N$-f*ZYsx{r&ZX zna_{cQ~&#T-S6Y~_bHn)@uCpE= zS~UgP=k**>M|<(d^UPMmB&%U|M$=3cAfu-)yYpCV+LzO_9c2yCV!qPWjGsBt=QNX^ z8r!4?=u{YTAxt9D5SCnCv=gbO^vukqvEfQsj2KT!#k__po3<)@jsiTa5_zLWPGHD#Bx1qWm5bg+y4as0RR6l%W9(l000I_ cL_t&o0B#qw(FKp!RR91007*qoM6N<$f-og|@&Et; literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-stitch-none.png b/fixtures/web-first/chromium/svg-filter-turbulence-stitch-none.png new file mode 100644 index 0000000000000000000000000000000000000000..1007cb654528011a40de08e2242d55e9bef0bdc9 GIT binary patch literal 7818 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 RSVva5AxNPGD+|h8vu_#OurElHi{rU6PFYL2s zlYdNlU|1O=y{;}UU30s1Wb6I${Lljszr9|dC01?}#9;r)86k(tpCQTH28#Nwffz_G zC-Y3nuNmxqsNai1$24ZB=84561!B|qO>>OYfRkI}BzB=^g*+%d2~!Sr8Jn{-j`ocN zq;)kYw!wY>``ypy^{3&V|Mcbg^ds{wIV%~p!x(Ppm|Gqn_vzz-uev_JZTI^>IE2ZY z#pnL4f+_o=`K88K22&`G+4?3nYIwY|&&8#Al+a1e62P9t!?GO+Cs`(51|sZ&c5oec zm^`L+R;DCA*=mc)-=3>|?Zq7Hp5acl*{uOMv+_7CwE>J)(EF^Yt%f+p9SSRXlbWwE z>CmGcSriq@cW?G3@{;;#PuntDF_kr4zG<_$o;K{t9^^&MCfnSSfe<7h;P)R7x2=0w z0ceGviCI=Rg=?M64=|MMV|we=Qmk5vb_J@&Di6rPCFO!V0P=<2=7=hVg^o0V@d6Bu zH%juEa+ZC--1y)FK7(ilJ@Tf99oM+d+4hQzWJ7fdeP~ZEO-S{u9HgIu)NQMx9*S#X zyPA#9>&kTYF|uf8bxipfK^K~yOK51?f66$d>*g$&f;NaS1{WSu)Z<*2O>_*VPLEZH z>M4tB;jV?fRm@6k-MH>n^w$#c-!xd>a*|_G8r$O5+4+TBJ6Fx`4?W6|Ei*P4tvBT9 zp^h9{TxiC1dK)w!#tWx^=Z8&fmydwrhaPMY-V8ri{k7@_#x+gd)XCzM*Mm6Byc(nd5S-E=%M5KviMKL2IE7adAfzx5lmv_TW4@(n#V%k2mP)KmtNm zZ|>KB{+Yxlj-1KI1F6riCQ~UEq258r?0=()vI!IU94T}XCEkXpQsgM zE?Ne@Gi|go;8a_=mXa+rK9tnf{G-B9JL{r2^mvM%XPTd{A1hQkEPLG2lnFP0&dK1e zS^R~``t8dX@C<5u+783JtSJxKsd}EZasx~a40s!^*Xz8@zkmDvdB0Eh`+9$V{NtO+ zd{XUo(QQ?~H|x<|_I|ijvVh0BS!&rtaJf(NM)pI(@}Y&kwB69jh{rzCa6n=zrin!I z59PGD-=PMYs;!zPXB4dDko-w5B)JFU3wypF#ZIrl;9<5M?b=i{GGx1{N+-0vvc;aF z`}qECoS*mStx$RvV44 zZF+-C*YfSo^3Wq7R*$rHJ!wBcAKria?e+XIF4KK{zJJ`mJ?`V<`TG8DW^c1l^li2F zwZFFe_~yrBzA^`dHj%)W>*aHJoa)WeP1n)?{m1WQH7_`Ac6dgsC(bNV9**V;ldM}5 zvqMlV;ANIh&uW;gSsCm$uX=ge7>SsPRpRBk1H(!PWhSSOcA}vw_N$-f*ZYsx{r&ZX zna_{cQ~&#T-S6Y~_bHn)@uCpE= zS~UgP=k**>M|<(d^UPMmB&%U|M$=3cAfu-)yYpCV+LzO_9c2yCV!qPWjGsBt=QNX^ z8r!4?=u{YTAxt9D5SCnCv=gbO^vukqvEfQsj2KT!#k__po3<)@jsiTa5_zLWPGHD#Bx1qWm5bg+y4as0RR6l%W9(l000I_ cL_t&o0B#qw(FKp!RR91007*qoM6N<$f-og|@&Et; literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-stitch.png b/fixtures/web-first/chromium/svg-filter-turbulence-stitch.png new file mode 100644 index 0000000000000000000000000000000000000000..26944f31761620dd21bea88ea4371f24cf522102 GIT binary patch literal 7841 zcmV;S9$w*zP)000mGNkldgp`luJj=U?@Pb$ z`?m5muWQ^BKeTQ9_tKBkxD08Y_qe&s>Ef!gJ2%%$bGw~iUaoar&hwD=Xlzk9?+ZPx zu*JmtmL+amv8Pa%U3cR7(=aVOe%WF?tTDX3YRjf;y0#gIVO?gQ*0o?^Whkq98jpW~>f#JC;DUKHARjMK(;tTQ24 z*4Gk|+WWdF>fN|C#`5r8ciH)f)ea&rAPju-qpUtf8$4^}S4=9T z#C)1BA{2rSpLJWU+p=oMSq5XwJWbm)bNcMkS6$PbFWa`ki|Zg1lj`jdkvM{}}qmI6c;F-1o)U%{pE|H0r{4MbSCmI@fUEzx?pRpZdaC zc2}^TV~c4z(#Eg2vh=iWd)$v?D;HctIIFU1s-|IIapg1naU6PdQINldE0$SV&Gy+? zQ3c(@V52sLG>gq~J$i}v*>|uX+IpClWh*sRq%OFzxi$MfU<{CJMvr}YtIZ_VbcDT}f! zsy3WDf9gVatuL>axAXb@&wsvue142mPv#sZeH|>PUWH3lU)%0_J-_gl{xN+1dXH-w zt|!kyoT~QHoX#EZ-nMODBN;pl(>5$-PTmyNDY#g$Ix>bmOjEy3>mGBRSS?+L=v*!~ zPLiXbaH)sJ&+{CoDUH1u2Di**;%HRu9AsNx&*kmfy`0+f<$T@a@#{Z+d+#4lRv%|$ zV&F-h8YK-+UH96ZZdKXbzkNJDKE|Qn=9z%4Q^)R_zP-%1<4Bk5WmzYaHo-$bq{nCy z6=u^`8`idlv^6Pd-Nqiq8E2w4d zT1EZ(a=X6Nb^UmJYF+)apGVLMfaBpo#Z^~~8j)kk}*#>a{u zPGzuFS9aI#@^Zbs{pppHW{;&?sxYtBV>{lHpW=}|%~Twh<*16dwUqocz1&{b`9k*F zJ-I@?V$VH+H`98GVY0<=9Ihcfgj)MVSBXINvHQ3Gr z&Q9La5Kou$`Ss;Ww!VLVetrz|b66h3_BkEnYUh=B^7f`iI7{gIf&dUNJNIQo>caFj?!0G8hAh(0?plory zURW(h6*n4=1%bEiXgjs((#OWvyI*;v;q$I;E0U|}PWAocxl9Y+KuUTp_H%XjwH!CI zMax6mBQ64lwYE#N!1G33q&>qfX`UikzAIIT6t&t_^|@`^rdeicZ5D)

v%z$3gp} zu^M;_^}Mo7d(7U_gFGj=!D|2w7Ydh5V(lsKVlk9aQ@cp_+}yFzOG^IUQ(7Dgt-_eE z-#B%U`AF=Wr9|&yxvkX-42A7jY`ulE>W@Zd1dTlZ&=0D=5$A&z#|8*{SL=(s-{z5C z%Ew*sRRa#b3VFaz<6UxYE5}4l@BZb7xAUoPJ5H_S1KT#FW6j^ko{D5DyO>MaR>4)y zu7-XuXyJRa8$4?q=hL}?h3&Ck2u#t$b9F48jqZq3B3qA`ig=V8P|{ke%hW+hNj=ky zNo}I00s!od5qYwnaL{C6N0BxMziKJ z%=2^ATPMAh&Izrdf{sG8g%Hv4cZzcozO%(rImXFCF#q)9TUEL7T+U-y=Pqp{t2g_~ zsUP_{hGtjWwsBWzX460eVPh}=Rw*LE0dk(9OoiV<6k*VI01IBU#w6ac(b$%$q9>@)4t#@-sbp3~p z3zeN{WjnmO+QF^g-#<%RG?r>jWwD3yC~LsX+7kFF4qmPRIT2GBAVjf&Es@fW2h


H@fkrxrX{NDRSPIVHf}Y_vTgy$$;g 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 M07*qoM6N<$f{0g+j{pDw literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-type-grammar.png b/fixtures/web-first/chromium/svg-filter-turbulence-type-grammar.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-type-turbulence.png b/fixtures/web-first/chromium/svg-filter-turbulence-type-turbulence.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a5f0ec8eb84e30f1c36210916cc540835f764e GIT binary patch literal 7401 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-use.png b/fixtures/web-first/chromium/svg-filter-turbulence-use.png new file mode 100644 index 0000000000000000000000000000000000000000..aeabf4bfc0e1d2162613472a4355b0a3ebcb2aa5 GIT binary patch literal 8810 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-viewbox.png b/fixtures/web-first/chromium/svg-filter-turbulence-viewbox.png new file mode 100644 index 0000000000000000000000000000000000000000..01435f9cc14d143526f469f93de3cde67fd22530 GIT binary patch literal 8787 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 + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-color-srgb.svg b/fixtures/web-first/svg-filter-displacement-color-srgb.svg new file mode 100644 index 00000000..dbea17a2 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-color-srgb.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-default.svg b/fixtures/web-first/svg-filter-displacement-default.svg new file mode 100644 index 00000000..763c9c57 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-default.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-empty-generated.svg b/fixtures/web-first/svg-filter-displacement-empty-generated.svg new file mode 100644 index 00000000..3803000b --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-empty-generated.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-generated-color.svg b/fixtures/web-first/svg-filter-displacement-generated-color.svg new file mode 100644 index 00000000..838959fb --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-generated-color.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-half-alpha-map.svg b/fixtures/web-first/svg-filter-displacement-half-alpha-map.svg new file mode 100644 index 00000000..30d57ee4 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-half-alpha-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-input-default-in2.svg b/fixtures/web-first/svg-filter-displacement-input-default-in2.svg new file mode 100644 index 00000000..a8ea9879 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-input-default-in2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-input-unknown-in.svg b/fixtures/web-first/svg-filter-displacement-input-unknown-in.svg new file mode 100644 index 00000000..c1825355 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-input-unknown-in.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-map-region.svg b/fixtures/web-first/svg-filter-displacement-map-region.svg new file mode 100644 index 00000000..263764fa --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-map-region.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-opacity.svg b/fixtures/web-first/svg-filter-displacement-opacity.svg new file mode 100644 index 00000000..6fcb15f4 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-opacity.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-path.svg b/fixtures/web-first/svg-filter-displacement-path.svg new file mode 100644 index 00000000..4d76838c --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-path.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-primitive-units.svg b/fixtures/web-first/svg-filter-displacement-primitive-units.svg new file mode 100644 index 00000000..b5150f28 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-primitive-units.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-quarter-turn.svg b/fixtures/web-first/svg-filter-displacement-quarter-turn.svg new file mode 100644 index 00000000..2bd1d77c --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-quarter-turn.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-region-percent.svg b/fixtures/web-first/svg-filter-displacement-region-percent.svg new file mode 100644 index 00000000..f2e0403a --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-region-percent.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-fraction.svg b/fixtures/web-first/svg-filter-displacement-scale-fraction.svg new file mode 100644 index 00000000..4073c0ef --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-fraction.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-invalid.svg b/fixtures/web-first/svg-filter-displacement-scale-invalid.svg new file mode 100644 index 00000000..c65615c8 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-invalid.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-negative.svg b/fixtures/web-first/svg-filter-displacement-scale-negative.svg new file mode 100644 index 00000000..75d58b2f --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-negative.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-positive.svg b/fixtures/web-first/svg-filter-displacement-scale-positive.svg new file mode 100644 index 00000000..4f2541fb --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-positive.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-trailing-comma.svg b/fixtures/web-first/svg-filter-displacement-scale-trailing-comma.svg new file mode 100644 index 00000000..610e58e1 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-trailing-comma.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-transform.svg b/fixtures/web-first/svg-filter-displacement-scale-transform.svg new file mode 100644 index 00000000..77042e50 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-transform.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-scale-zero.svg b/fixtures/web-first/svg-filter-displacement-scale-zero.svg new file mode 100644 index 00000000..8960c1f5 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-scale-zero.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-alpha.svg b/fixtures/web-first/svg-filter-displacement-selector-alpha.svg new file mode 100644 index 00000000..c65d4ef7 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-alpha.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-axes.svg b/fixtures/web-first/svg-filter-displacement-selector-axes.svg new file mode 100644 index 00000000..97212cdb --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-axes.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-blue.svg b/fixtures/web-first/svg-filter-displacement-selector-blue.svg new file mode 100644 index 00000000..c17d8664 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-blue.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-default.svg b/fixtures/web-first/svg-filter-displacement-selector-default.svg new file mode 100644 index 00000000..4f2541fb --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-default.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-grammar.svg b/fixtures/web-first/svg-filter-displacement-selector-grammar.svg new file mode 100644 index 00000000..c1645801 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-grammar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-green.svg b/fixtures/web-first/svg-filter-displacement-selector-green.svg new file mode 100644 index 00000000..80b1a267 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-green.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-selector-red.svg b/fixtures/web-first/svg-filter-displacement-selector-red.svg new file mode 100644 index 00000000..5da30022 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-selector-red.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-source-alpha-map.svg b/fixtures/web-first/svg-filter-displacement-source-alpha-map.svg new file mode 100644 index 00000000..62d7de87 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-source-alpha-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-source-rgb-map.svg b/fixtures/web-first/svg-filter-displacement-source-rgb-map.svg new file mode 100644 index 00000000..6db7b873 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-source-rgb-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-stroke.svg b/fixtures/web-first/svg-filter-displacement-stroke.svg new file mode 100644 index 00000000..c7f27fac --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-stroke.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-transparent-map.svg b/fixtures/web-first/svg-filter-displacement-transparent-map.svg new file mode 100644 index 00000000..ea39e436 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-transparent-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-turbulence-map-linear.svg b/fixtures/web-first/svg-filter-displacement-turbulence-map-linear.svg new file mode 100644 index 00000000..c0ffa76d --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-turbulence-map-linear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-turbulence-map.svg b/fixtures/web-first/svg-filter-displacement-turbulence-map.svg new file mode 100644 index 00000000..0609f5b6 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-turbulence-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-use.svg b/fixtures/web-first/svg-filter-displacement-use.svg new file mode 100644 index 00000000..ba7e8007 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-use.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-filter-displacement-viewbox.svg b/fixtures/web-first/svg-filter-displacement-viewbox.svg new file mode 100644 index 00000000..4524e143 --- /dev/null +++ b/fixtures/web-first/svg-filter-displacement-viewbox.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-comma.svg b/fixtures/web-first/svg-filter-turbulence-base-comma.svg new file mode 100644 index 00000000..944647ef --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-comma.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-invalid.svg b/fixtures/web-first/svg-filter-turbulence-base-invalid.svg new file mode 100644 index 00000000..9463ef72 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-invalid.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-negative-axis.svg b/fixtures/web-first/svg-filter-turbulence-base-negative-axis.svg new file mode 100644 index 00000000..27076833 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-negative-axis.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-one.svg b/fixtures/web-first/svg-filter-turbulence-base-one.svg new file mode 100644 index 00000000..176842b5 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-one.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-plus-exponent.svg b/fixtures/web-first/svg-filter-turbulence-base-plus-exponent.svg new file mode 100644 index 00000000..aa5be901 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-plus-exponent.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-trailing-comma.svg b/fixtures/web-first/svg-filter-turbulence-base-trailing-comma.svg new file mode 100644 index 00000000..f7899077 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-trailing-comma.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-base-two.svg b/fixtures/web-first/svg-filter-turbulence-base-two.svg new file mode 100644 index 00000000..e2bd577a --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-base-two.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-color-default.svg b/fixtures/web-first/svg-filter-turbulence-color-default.svg new file mode 100644 index 00000000..f71fe013 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-color-default.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-color-linear.svg b/fixtures/web-first/svg-filter-turbulence-color-linear.svg new file mode 100644 index 00000000..63abb690 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-color-linear.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-color-srgb.svg b/fixtures/web-first/svg-filter-turbulence-color-srgb.svg new file mode 100644 index 00000000..2a0a48d9 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-color-srgb.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-default.svg b/fixtures/web-first/svg-filter-turbulence-default.svg new file mode 100644 index 00000000..9023d392 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-default.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-displacement-map.svg b/fixtures/web-first/svg-filter-turbulence-displacement-map.svg new file mode 100644 index 00000000..db56825c --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-displacement-map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-empty-source.svg b/fixtures/web-first/svg-filter-turbulence-empty-source.svg new file mode 100644 index 00000000..daa8c98f --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-empty-source.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-fractal-octave-zero.svg b/fixtures/web-first/svg-filter-turbulence-fractal-octave-zero.svg new file mode 100644 index 00000000..f5a7a395 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-fractal-octave-zero.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-fractional-translate.svg b/fixtures/web-first/svg-filter-turbulence-fractional-translate.svg new file mode 100644 index 00000000..4daaeb8d --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-fractional-translate.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-graph-blend.svg b/fixtures/web-first/svg-filter-turbulence-graph-blend.svg new file mode 100644 index 00000000..353e060c --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-graph-blend.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-graph-result-reuse.svg b/fixtures/web-first/svg-filter-turbulence-graph-result-reuse.svg new file mode 100644 index 00000000..949992e7 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-graph-result-reuse.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-cap.svg b/fixtures/web-first/svg-filter-turbulence-octave-cap.svg new file mode 100644 index 00000000..2dafff9a --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-cap.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-grammar.svg b/fixtures/web-first/svg-filter-turbulence-octave-grammar.svg new file mode 100644 index 00000000..0eb69657 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-grammar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-negative.svg b/fixtures/web-first/svg-filter-turbulence-octave-negative.svg new file mode 100644 index 00000000..a2282ef3 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-negative.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-nine.svg b/fixtures/web-first/svg-filter-turbulence-octave-nine.svg new file mode 100644 index 00000000..5c73e215 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-nine.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-one.svg b/fixtures/web-first/svg-filter-turbulence-octave-one.svg new file mode 100644 index 00000000..0a917453 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-one.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-two.svg b/fixtures/web-first/svg-filter-turbulence-octave-two.svg new file mode 100644 index 00000000..55eda026 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-two.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-octave-zero.svg b/fixtures/web-first/svg-filter-turbulence-octave-zero.svg new file mode 100644 index 00000000..7256dede --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-octave-zero.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-quarter-turn.svg b/fixtures/web-first/svg-filter-turbulence-quarter-turn.svg new file mode 100644 index 00000000..7860c6f3 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-quarter-turn.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-region-percent.svg b/fixtures/web-first/svg-filter-turbulence-region-percent.svg new file mode 100644 index 00000000..1a7ab193 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-region-percent.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-region-stitch-fraction.svg b/fixtures/web-first/svg-filter-turbulence-region-stitch-fraction.svg new file mode 100644 index 00000000..efb133f4 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-region-stitch-fraction.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-seed-fraction.svg b/fixtures/web-first/svg-filter-turbulence-seed-fraction.svg new file mode 100644 index 00000000..42581ca0 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-seed-fraction.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-seed-grammar.svg b/fixtures/web-first/svg-filter-turbulence-seed-grammar.svg new file mode 100644 index 00000000..5380c3aa --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-seed-grammar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-seed-negative.svg b/fixtures/web-first/svg-filter-turbulence-seed-negative.svg new file mode 100644 index 00000000..16b4bca9 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-seed-negative.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-seed-one.svg b/fixtures/web-first/svg-filter-turbulence-seed-one.svg new file mode 100644 index 00000000..ab01124f --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-seed-one.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-seed-zero.svg b/fixtures/web-first/svg-filter-turbulence-seed-zero.svg new file mode 100644 index 00000000..3fb693ed --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-seed-zero.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-stitch-grammar.svg b/fixtures/web-first/svg-filter-turbulence-stitch-grammar.svg new file mode 100644 index 00000000..3eead95f --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-stitch-grammar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-stitch-none.svg b/fixtures/web-first/svg-filter-turbulence-stitch-none.svg new file mode 100644 index 00000000..cfcda54c --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-stitch-none.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-stitch.svg b/fixtures/web-first/svg-filter-turbulence-stitch.svg new file mode 100644 index 00000000..b574a6e3 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-stitch.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-type-fractal.svg b/fixtures/web-first/svg-filter-turbulence-type-fractal.svg new file mode 100644 index 00000000..5428092d --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-type-fractal.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-type-grammar.svg b/fixtures/web-first/svg-filter-turbulence-type-grammar.svg new file mode 100644 index 00000000..bbf2d0f6 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-type-grammar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-type-turbulence.svg b/fixtures/web-first/svg-filter-turbulence-type-turbulence.svg new file mode 100644 index 00000000..6ecace51 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-type-turbulence.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-use.svg b/fixtures/web-first/svg-filter-turbulence-use.svg new file mode 100644 index 00000000..88587c92 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-use.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-viewbox.svg b/fixtures/web-first/svg-filter-turbulence-viewbox.svg new file mode 100644 index 00000000..af43f001 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-viewbox.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/unsupported/README.md b/fixtures/web-first/unsupported/README.md index efc3c69c..f620c9e5 100644 --- a/fixtures/web-first/unsupported/README.md +++ b/fixtures/web-first/unsupported/README.md @@ -72,7 +72,10 @@ The scannable, generated view of this register (beside the baked cells) is | `svg-filter-css-functions.svg` · `svg-filter-list.svg` · `svg-filter-list-quoted.svg` | The direct presentation reader carries one same-document URL only. Filter functions and a list of multiple operations are valid members of the wider property grammar and refuse by the stable filter name instead of being mistaken for that single URL. Quoted and unquoted URL tokens take the same branch. | | `svg-filter-external.svg` · `svg-filter-root.svg` | External resource resolution and the root host CSS-layer route stay outside this self-contained SVG-local frame. An external reference skips its target; an active root filter refuses in both admissions because there is no smaller honest hole. | | `svg-filter-href.svg` | Refuse `` inheritance before graph construction. Dropping the template edge could change primitive order, inherited attributes, inputs, and every output pixel. | -| `svg-filter-primitive.svg` | Any unrepresented `fe*` child invalidates graph construction transactionally. The witness has advanced to `feTurbulence`; it skips the whole affected target, so a supported prefix can never escape as a plausible filtered result. | +| `svg-filter-primitive.svg` | Any unrepresented `fe*` child invalidates graph construction transactionally. The witness has advanced to `feConvolveMatrix` after a supported flood prefix; it skips the whole affected target, so that prefix can never escape as a plausible filtered result. | +| `svg-filter-turbulence-transform-precision.svg` | Refuse `feTurbulence` under a general rotation or shear. Axis maps, fractional translation, reflection, and exact quarter turns are exact; a sampled 17-degree rotation differs by 3,173 pixels at maximum channel delta 7 and a shear by 3,110 at delta 6 (measured, not celled). | +| `svg-filter-displacement-transform-precision.svg` | Refuse `feDisplacementMap` under a general rotation or shear. Axis maps, fractional translation, reflection, and exact quarter turns are exact; a sampled 17-degree rotation differs by 280 pixels at maximum channel delta 13 and a shear by 360 at delta 18 (measured, not celled). | +| `svg-filter-displacement-clip-precision.svg` | Refuse `feDisplacementMap` across a geometric `clip-path`. The sampled path clip differs by 35 pixels at maximum channel delta 2 (measured, not celled); opacity without the clip is exact and celled. | | `svg-filter-morphology-transform-precision.svg` | Refuse `feMorphology` under a target mapping outside axis maps and exact quarter turns. Fractional translation and scale, reflection, and exact quarter turns are exact. A sampled 17-degree source mapping differs by 171 pixels at Δ12; generated-only rotation differs by 142 pixels at Δ9, and sampled shears reproduce the class (measured, not celled). | | `svg-filter-morphology-paint-server-precision.svg` | Refuse source-dependent `feMorphology` when the isolated source uses a paint-server fill or stroke. A linear gradient differs by 125 pixels at Δ1 even through zero radius and by 191 pixels at Δ1 when active; radial fills and gradient strokes reproduce the class. Generated-only graph inputs do not inherit the patrol (measured, not celled). | | `svg-filter-morphology-filled-ellipse-precision.svg` | Refuse active source-dependent `feMorphology` over a filled native `` or ``. The sampled circle differs by 3 pixels at Δ9 and a fractional ellipse by 8 pixels at Δ6. Rounded rectangles, curved paths, circle strokes, and round path strokes are exact. This is the retained fill-only ellipse coverage boundary tracked separately in gridaco/nothing#88, not a widened morphology gap (measured, not celled). | diff --git a/fixtures/web-first/unsupported/svg-filter-displacement-clip-precision.svg b/fixtures/web-first/unsupported/svg-filter-displacement-clip-precision.svg new file mode 100644 index 00000000..8c12ebb0 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-displacement-clip-precision.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-displacement-transform-precision.svg b/fixtures/web-first/unsupported/svg-filter-displacement-transform-precision.svg new file mode 100644 index 00000000..401a38f1 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-displacement-transform-precision.svg @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-primitive.svg b/fixtures/web-first/unsupported/svg-filter-primitive.svg index 20c46dbf..3ede989a 100644 --- a/fixtures/web-first/unsupported/svg-filter-primitive.svg +++ b/fixtures/web-first/unsupported/svg-filter-primitive.svg @@ -1,5 +1,8 @@ - + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-turbulence-transform-precision.svg b/fixtures/web-first/unsupported/svg-filter-turbulence-transform-precision.svg new file mode 100644 index 00000000..64b44be7 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-turbulence-transform-precision.svg @@ -0,0 +1,7 @@ + + + + + + + From fdbf758ceb73f5a98b9c2c94744bffe19779d17b Mon Sep 17 00:00:00 2001 From: Universe Date: Wed, 26 Aug 2026 23:00:46 +0900 Subject: [PATCH 2/6] n0: stabilize procedural filter provenance --- crates/n0/src/glyphless.rs | 69 ++++++++++++++++-- crates/n0/src/paint.rs | 55 +++++++++----- crates/n0_cli/README.md | 18 ++++- docs/wg/consolidation/svg-engine-of-record.md | 54 ++++++++++---- docs/wg/consolidation/web-checklist.md | 11 ++- fixtures/web-first/README.md | 3 +- fixtures/web-first/STATUS.md | 9 ++- ...er-turbulence-blend-morphology-restore.png | Bin 0 -> 6487 bytes .../svg-filter-turbulence-linear-blend.png | Bin 0 -> 7738 bytes ...vg-filter-turbulence-linear-srgb-blend.png | Bin 0 -> 7984 bytes ...lter-turbulence-linear-srgb-morphology.png | Bin 0 -> 6842 bytes ...er-turbulence-morphology-blend-restore.png | Bin 0 -> 6606 bytes ...vg-filter-turbulence-srgb-linear-blend.png | Bin 0 -> 8160 bytes ...lter-turbulence-srgb-linear-morphology.png | Bin 0 -> 7443 bytes fixtures/web-first/oracle-bake.json | 65 ++++++++++++++++- fixtures/web-first/primitives.json | 56 ++++++++++++++ ...er-turbulence-blend-morphology-restore.svg | 10 +++ .../svg-filter-turbulence-linear-blend.svg | 10 +++ ...vg-filter-turbulence-linear-srgb-blend.svg | 10 +++ ...lter-turbulence-linear-srgb-morphology.svg | 10 +++ ...er-turbulence-morphology-blend-restore.svg | 10 +++ ...vg-filter-turbulence-srgb-linear-blend.svg | 10 +++ ...lter-turbulence-srgb-linear-morphology.svg | 10 +++ 23 files changed, 363 insertions(+), 47 deletions(-) create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-blend-morphology-restore.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-linear-blend.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-linear-srgb-blend.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-linear-srgb-morphology.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-morphology-blend-restore.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-srgb-linear-blend.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-srgb-linear-morphology.png create mode 100644 fixtures/web-first/svg-filter-turbulence-blend-morphology-restore.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-linear-blend.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-linear-srgb-blend.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-linear-srgb-morphology.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-morphology-blend-restore.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-srgb-linear-blend.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-srgb-linear-morphology.svg diff --git a/crates/n0/src/glyphless.rs b/crates/n0/src/glyphless.rs index d13fbcc5..a3efb80a 100644 --- a/crates/n0/src/glyphless.rs +++ b/crates/n0/src/glyphless.rs @@ -357,7 +357,7 @@ pub fn compile(resolved: Frame) -> Result { provenance.owners.push(scope.owner); // Placeholder until the scope closes and its union is known. provenance.coverage.push(None); - let kind = match &scope.effect { + let (kind, initial_coverage) = match &scope.effect { ScopeEffect::Opacity(opacity) => { items.push(Item { node: slot, @@ -366,7 +366,7 @@ pub fn compile(resolved: Frame) -> Result { opacity: opacity.get(), }, }); - OpenScopeKind::Opacity + (OpenScopeKind::Opacity, None) } ScopeEffect::Clip(clip) => { let compiled = Arc::new(compile_clip_path(clip)); @@ -384,7 +384,7 @@ pub fn compile(resolved: Frame) -> Result { world: Affine::IDENTITY, kind: ItemKind::BeginClipPath { clip: compiled }, }); - OpenScopeKind::Clip { bounds } + (OpenScopeKind::Clip { bounds }, None) } ScopeEffect::Filter(filter) => { let compiled = Arc::new(compile_filter(filter)); @@ -403,12 +403,19 @@ pub fn compile(resolved: Frame) -> Result { world: to_affine(filter.transform()), kind: ItemKind::BeginFilter { filter: compiled }, }); - OpenScopeKind::Filter { bounds } + let initial_coverage = if filter.source_is_transparent() + && filter.program().may_paint_transparent_input() + { + bounds + } else { + None + }; + (OpenScopeKind::Filter { bounds }, initial_coverage) } }; open_scopes.push(OpenScope { slot, - coverage: None, + coverage: initial_coverage, kind, }); continue; @@ -1858,6 +1865,33 @@ mod tests { }) } + fn empty_turbulence_scope_begin(owner: VisualRef, seed: f32) -> FrameItem { + let region = Rectangle::from_xywh(4.0, 5.0, 10.0, 12.0); + let program = FilterProgram::new(Arc::from([FilterNode::new( + Arc::from([]), + region, + FilterColorSpace::LinearRgb, + FilterPrimitive::Turbulence { + kind: FilterTurbulenceKind::Turbulence, + base_frequency_x: 0.08, + base_frequency_y: 0.11, + num_octaves: 2, + seed, + stitch_tiles: false, + }, + )])) + .expect("test turbulence is a checked generated program"); + let transform = AffineTransform::from_acebdf(1.0, 0.0, 7.0, 0.0, 1.0, 8.0); + FrameItem::ScopeBegin(Scope { + owner, + effect: ScopeEffect::Filter( + Filter::new(transform, region, program) + .expect("test filter is a checked effect") + .with_transparent_source(), + ), + }) + } + fn clip_begin(owner: VisualRef, layers: Vec>) -> FrameItem { let layers = layers .into_iter() @@ -3110,6 +3144,31 @@ mod tests { ); } + #[test] + fn an_empty_generated_filter_edit_damages_its_transformed_region() { + let scene = |seed| { + let items = FrameItems::try_new(vec![ + empty_turbulence_scope_begin(SCOPE_OWNER, seed), + FrameItem::ScopeEnd, + ]) + .expect("a declared generated filter is meaningful without source draws"); + compile(frame_of(items)).expect("admitted generated-filter frame") + }; + let before = scene(2.0); + let after = scene(3.0); + let coverage = Rectangle::from_xywh(11.0, 13.0, 10.0, 12.0); + + assert_eq!(coverage_for(&before, SCOPE_OWNER), Some(to_rectf(coverage))); + assert_eq!( + diff_frame(&before, &after), + Damage { + changed: vec![SCOPE_OWNER], + union_frame: Some(coverage), + } + ); + assert!(diff_frame(&before, &before).is_empty()); + } + /// The contract's union/intersection normal form lowers to one private /// clip item and clips the enclosed paint without inventing a resource or /// an isolated layer. diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index e0c8e818..470db1e6 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -1939,10 +1939,10 @@ struct BuiltFilterResult { /// input through one additional source-image boundary. Preserve that /// measured boundary through later graph nodes. source_preflatten: bool, - /// A linear procedural source crosses Chromium's native final restore - /// after gamma conversion. The exact generated-source byte restore used - /// by solid and composite graphs differs by one channel level here. - requires_native_restore: bool, + /// An upstream procedural shader remains a floating image fact. Preserve + /// that provenance so later blends do not quantize it as an ordinary byte + /// image and the final layer takes an architecture-stable floating restore. + procedural_provenance: bool, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -2004,7 +2004,7 @@ fn convert_filter_space( // matrix-specific sRGB restore boundary. color_restore: None, source_preflatten: result.source_preflatten, - requires_native_restore: result.requires_native_restore, + procedural_provenance: result.procedural_provenance, }) } @@ -2239,7 +2239,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { requires_exact_restore: false, color_restore: None, source_preflatten: false, - requires_native_restore: false, + procedural_provenance: false, }; let source_alpha = BuiltFilterResult { image_filter: if let Some(source) = explicit_transparent_source { @@ -2254,7 +2254,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { requires_exact_restore: false, color_restore: None, source_preflatten: false, - requires_native_restore: false, + procedural_provenance: false, }; let mut results: Vec = Vec::with_capacity(filter.nodes.len()); for node in filter.nodes.iter() { @@ -2319,12 +2319,8 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ResolvedFilterPrimitive::Morphology { radius_x, radius_y, .. } if source_dependent && (*radius_x > 0.0 || *radius_y > 0.0) ); - let requires_native_restore = inputs.iter().any(|input| input.requires_native_restore) - || matches!( - &node.primitive, - ResolvedFilterPrimitive::Turbulence { .. } - if node.color_space == ResolvedFilterColorSpace::LinearRgb - ); + let mut procedural_provenance = inputs.iter().any(|input| input.procedural_provenance) + || matches!(&node.primitive, ResolvedFilterPrimitive::Turbulence { .. }); let (image_filter, output_space, source_dependent, requires_exact_restore) = match node .primitive .clone() @@ -2433,8 +2429,13 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ResolvedFilterPrimitive::Blend { mode } => { let background = inputs.pop().expect("blend has two checked inputs"); let foreground = inputs.pop().expect("blend has two checked inputs"); + let blender = if procedural_provenance { + sk_filter_blend_mode(mode).into() + } else { + deterministic_filter_blender(mode)? + }; let filter = skia_safe::image_filters::blend( - deterministic_filter_blender(mode)?, + blender, background.image_filter, foreground.image_filter, crop, @@ -2601,6 +2602,16 @@ fn build_filter(filter: &ResolvedFilter) -> Result { } => { let input = inputs.pop().expect("morphology has one checked input"); let active = radius_x > 0.0 || radius_y > 0.0; + // Active sRGB morphology over a direct procedural source + // establishes the exact byte restore Chromium uses for that + // kernel. A preceding exact blend leaves its stronger + // procedural-composition provenance intact. + if active + && node.color_space == ResolvedFilterColorSpace::Srgb + && !input.requires_exact_restore + { + procedural_provenance = false; + } let filter = match operator { ResolvedFilterMorphology::Erode => skia_safe::image_filters::erode( (radius_x, radius_y), @@ -2690,11 +2701,17 @@ fn build_filter(filter: &ResolvedFilter) -> Result { .ok_or_else(|| { "the backend could not construct a displacement-map operation".to_string() })?; + // The first hosted-x86 corpus run isolated the same final + // N32 restore split in every admitted sRGB displacement + // shape: 18 of the 22 failing rung cells (294 pixels total, + // all one code value). Keep the floating sampling operation + // native, then restore its sRGB result through the + // architecture-neutral byte path. ( Some(filter), node.color_space, source_dependent, - requires_exact_restore, + requires_exact_restore || node.color_space == ResolvedFilterColorSpace::Srgb, ) } ResolvedFilterPrimitive::Merge => { @@ -2746,7 +2763,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { requires_exact_restore, color_restore, source_preflatten, - requires_native_restore, + procedural_provenance, }); } let output = results @@ -2772,10 +2789,10 @@ fn build_filter(filter: &ResolvedFilter) -> Result { })?, ); } - let restore_blender = if output.requires_exact_restore { + let restore_blender = if output.procedural_provenance { + Some(floating_porter_duff_blender(ResolvedFilterComposite::Over)?) + } else if output.requires_exact_restore { Some(exact_unorm8_blender(ResolvedFilterComposite::Over)?) - } else if output.requires_native_restore { - None } else if output.color_restore == Some(ColorRestore::Floating) { Some(floating_porter_duff_blender(ResolvedFilterComposite::Over)?) } else if output.color_restore == Some(ColorRestore::Default) || output.source_dependent { diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 0af1b1e1..6fd7800c 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -448,13 +448,23 @@ cargo run -p n0_cli --bin n0 -- \ boundary: the first full-workspace hosted-x86 run differed in nine cells and 1,633 pixels, all by one channel level, at the final filter-layer restore. Its scoped exact byte-domain restore leaves zero radius and later color-space - conversion on their prior paths. The same hosted workspace test covers the - earlier two hundred forty-eight-cell estate; all three hundred twenty-four + conversion on their prior paths. Procedural sources carry floating + provenance through blend arithmetic and use an architecture-stable floating + final restore. Direct active sRGB morphology materializes that provenance; + blend before morphology preserves it. sRGB displacement output takes the + exact byte-domain restore. Empty generated-source scopes seed damage coverage + from their transformed filter region, so procedural parameter edits damage + pixels even without a source draw. Seven operation-order and color-transition + controls guard these distinctions. The first hosted-x86 run found 294 + one-code-value pixels across eighteen sRGB displacement and four procedural + cells; the scoped candidate is exact across the current ARM corpus and awaits + hosted-x86 confirmation. The same hosted workspace test covers the earlier + two hundred forty-eight-cell estate; all three hundred thirty-one Chromium-baked filter cells are exact on the current ARM host without a tolerance. The filter estate contains 26 chassis/blur cells, 60 shadow-graph, 28 native drop-shadow, 27 color-matrix, 32 component-transfer, 38 blend, 37 - morphology, and 76 turbulence/displacement cells. The complete corpus - contains 685 Chromium-baked cells plus 10 sampled frames, with 143 named + morphology, and 83 turbulence/displacement cells. The complete corpus + contains 692 Chromium-baked cells plus 10 sampled frames, with 143 named refusal rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index b3c8db02..cbf9529a 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -76,7 +76,7 @@ from the dated addenda below: the full `preserveAspectRatio` grammar; and one exact-time `` on a top-level ``. `crates/n0_cli/README.md` is the statement of record. -- **The corpus** is 685 Chromium-baked primitive cells plus 10 sampled frames. +- **The corpus** is 692 Chromium-baked primitive cells plus 10 sampled frames. All byte-exact except seven curved cells carrying a declared, geometrically confined tolerance (the native-oval/conic boundary) and four gradient cells carrying a declared one-code-value ramp-quantization tolerance (one pixel @@ -3426,18 +3426,26 @@ filter scope meaningful. The same empty target under object-box filter units has no positive filter region and correctly paints nothing. User-space filter units with object-box primitive units still paint the unscaled turbulence field. Empty-source turbulence, turbulence blended with SourceGraphic, and a -generated displacement graph are committed exact controls. +generated displacement graph are committed exact controls. That generated-only +scope also owns the transformed filter-region coverage used for frame damage; +changing its seed damages that region even though no source draw contributed a +box. The color audit found a second narrow chassis boundary. Missing `color-interpolation-filters` equals explicit linearRGB; explicit sRGB changes -both noise formulas and a procedural displacement map. The procedural source -itself is backend-native, and its linearRGB-to-sRGB output needed the native -final layer restore. The prior generic generated-source restore produced a -widespread one-code-value difference. Keeping native restore provenance with -the procedural output clears that split while generated solid and byte-domain -filter outputs retain their established policies. Both turbulence formulas in -both color spaces and the noise-to-displacement chain are exact on the current -ARM host without a tolerance. +both noise formulas and a procedural displacement map. A procedural image is a +floating image fact through blend arithmetic, including across a color-space +conversion; treating it as an ordinary generated byte image changes 349 to 490 +pixels at maximum deltas 1 to 6 in three measured blend cases. Active sRGB +morphology directly over that image establishes a byte-domain boundary, while +blend followed by morphology retains the stronger procedural-composition +provenance. The opposite operation order is an exact control. The final +procedural layer therefore uses an architecture-stable floating restore, while +sRGB displacement uses the established exact byte restore. Generated solids +and earlier byte-domain filter outputs retain their existing policies. Both +turbulence formulas in both color spaces, both operation orders, and the +noise-to-displacement chain are exact on the current ARM host without a +tolerance. Three remaining silent classes are now stable refusals. Axis maps, fractional translation and scale, reflection, and exact quarter turns are exact. A @@ -3462,8 +3470,14 @@ impossible (measured, not celled). Two broad matrices contain 164 twice-deterministic Chromium sources, each also rendered through both actual command admissions. All 156 admitted sources are pixel-exact and strict and best-effort agree; eight reach one of the three new -stable names or an older operation-specific patrol. Seventy-six committed -Chromium cells carry the admitted slice without a new tolerance. They cover +stable names or an older operation-specific patrol. A review-triggered matrix +adds eighteen procedural-operation sources across blend, morphology, matrix, +transfer, displacement, and both color-space directions. Fifteen are admitted +and exact after repair; three reach older shadow or composition patrols. The +former restore policy changes five measured cases: the three blend cases above, +sRGB-to-linear morphology by 2,365 pixels at maximum delta 1, and blend followed +by morphology by 393 pixels at delta 1. Eighty-three committed Chromium cells +carry the admitted slice without a new tolerance. They cover the complete parameter grammars, both formulas, all selectors, color spaces, regions and units, source and map profiles, empty targets, graph routing, safe mappings, source shapes, opacity, ``, `viewBox`, and the combined @@ -3473,10 +3487,22 @@ Gate sensitivity was proved by temporarily mapping turbulence to fractal noise and the red displacement selector to alpha. `just gate` rejected fifty-five new cells: turbulence controls changed up to all 4,096 pixels and displacement controls reached maximum channel delta 202. Restoring both mappings returned -the complete 685-cell gate to green. +the gate to green. Independently restoring the former procedural-image policy +makes the five dedicated operation-order cells fail, up to 2,365 pixels and +maximum delta 6. Restoring the measured provenance rule returns the complete +692-cell gate to green. + +The first hosted-x86 workspace run rejected twenty-two rung cells: eighteen +sRGB displacement cases and four procedural outputs, totalling 294 pixels, all +at delta 1. This is the same CPU-family final-restore class seen in earlier +filter rungs, not a formula or sampling disagreement. Scoped exact displacement +restore and the floating procedural restore keep all 692 ARM cells exact. The +hosted-x86 confirmation is pending; this paragraph records the failed run and +the candidate separately rather than treating local architecture agreement as +proof. Three focused rows join the refusal register, moving it from 140 to 143. The -primitive corpus moves from 609 to 685 cells; the ten exact-time sampled frames +primitive corpus moves from 609 to 692 cells; the ten exact-time sampled frames are unchanged. Exactly nine checklist rows tick: the two elements and seven element-specific attributes named above. This records no conformance score and takes no FLIP action. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index 492d6091..935c83b4 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -1517,14 +1517,21 @@ for attributes the platform ships ahead of the SVG 2 indexes. > safe mappings, ``, and `viewBox`. A user-space procedural filter may > paint even when its target contributes a fully transparent source; an > object-box filter region on the same zero-area target paints nothing. -> Seventy-six exact Chromium cells move the complete gate to 685. General +> Eighty-three exact Chromium cells move the complete gate to 692. General > affine mappings for both primitives and geometric clipping for displacement > refuse by three stable precision names before paint. The shared `type`, `in`, > `in2`, `result`, region, interpolation, filter-resource, and dynamics rows > remain open for their wider applicability. Swapping the two noise formulas > and red/alpha displacement selection made fifty-five new cells fail, up to > all 4,096 pixels and maximum channel delta 202; restoration returned the -> complete gate to green. +> complete gate to green. A review-triggered color-space/operation matrix found +> that procedural images must remain floating through blend arithmetic, while +> active sRGB morphology materializes a direct procedural image. Restoring the +> old policy makes five dedicated cells fail at up to 2,365 pixels and maximum +> channel delta 6. The first hosted-x86 run also found 294 one-code-value +> pixels across twenty-two displacement/procedural cells; scoped exact +> displacement restore and floating procedural provenance keep the complete +> ARM gate exact while the hosted rerun is pending. - [ ] `` > **2026-08-25 split:** the static filter graph carries safe-kernel diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 263ee1be..c2e432dc 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -214,9 +214,10 @@ is exactly what the engine renders pixel-for-pixel. | *(measured, not celled — morphology split)* | Four broad scratch matrices contain 187 twice-deterministic Chromium 149 sources, each rendered through both actual CLI admissions. After patrol, all 162 admitted sources are exact and admission-identical; the other 25 reach one of three new stable morphology names or an older operation-specific patrol. Axis maps and quarter turns are exact, while a 17-degree source map differs by 171px/Δ12 and a generated map by 142px/Δ9. Linear-gradient sources differ by 125px/Δ1 even at zero radius and 191px/Δ1 when active; radial and gradient-stroke controls reproduce the class. Active filled circles differ by 3px/Δ9 and a fractional ellipse by 8px/Δ6, while rounded rectangles, curved paths, circle strokes, and round path strokes are exact; this keeps gridaco/nothing#88 separate. A 600×32 bank pins half-up rounding and the 256-device-pixel radius cap. The region audit also found a premature source clip: correcting output-region placement removes 16px/Δ136 and preserves the older filter corpus. Swapping erosion and dilation made thirty-five of the thirty-seven new cells fail, up to 1,560 pixels and Δ255; restoration returned all 609 cells green. The first full-workspace hosted-x86 run then found nine active sRGB morphology cells with 1,633 pixels total at Δ1, isolating the final low-precision filter-layer restore. Scoping the established exact byte-domain restore to active sRGB morphology clears the same hosted workspace test and keeps all 609 ARM cells exact; zero radius and later color-space conversion retain their former paths, and no tolerance was added. The corpus is now 609 cells plus 10 sampled frames, and the named register has 140 rows. | | `svg-filter-turbulence-{default,type-turbulence,type-fractal,type-grammar,base-one,base-two,base-comma,base-trailing-comma,base-invalid,base-negative-axis,base-plus-exponent,octave-one,octave-two,octave-zero,fractal-octave-zero,octave-negative,octave-nine,octave-cap,octave-grammar,seed-zero,seed-one,seed-fraction,seed-negative,seed-grammar,stitch-none,stitch,stitch-grammar}.svg` | The complete static `feTurbulence` parameter grammar in twenty-seven cells: both formulas and case-sensitive enum fallback; one/two-member SVG number lists, comma-wsp, a lone trailing comma, leading plus and exponent; invalid and negative-frequency fallback; integer octave parsing, zero/negative behavior, and the cap at nine; signed/truncated seeds; and both stitch modes with exact-enum fallback. All twenty-seven are byte-exact. | | `svg-filter-turbulence-{color-default,color-srgb,color-linear,region-stitch-fraction,region-percent,fractional-translate,quarter-turn,use,viewbox,graph-blend,graph-result-reuse,empty-source}.svg` | Procedural-source operation evidence: default linearRGB and explicit color spaces, fractional stitched and percentage hard regions, safe mappings, non-uniform `viewBox`, ``, named graph reuse, and generated output over a fully transparent target source. All twelve are byte-exact. | +| `svg-filter-turbulence-{linear-blend,linear-srgb-blend,srgb-linear-blend,linear-srgb-morphology,srgb-linear-morphology,blend-morphology-restore,morphology-blend-restore}.svg` | Procedural-image provenance across the admitted blend and morphology family: all-linear and both color-space transition directions, plus both operation orders. A procedural image stays floating through blend arithmetic; active sRGB morphology materializes a direct procedural image, while an earlier blend keeps its stronger provenance. All seven are byte-exact. | | `svg-filter-displacement-{default,scale-zero,scale-positive,scale-negative,scale-fraction,scale-trailing-comma,scale-invalid,selector-default,selector-alpha,selector-red,selector-green,selector-blue,selector-axes,selector-grammar}.svg` | The complete static `feDisplacementMap` parameter grammar in fourteen cells: absent and explicit-zero scale, signed/fractional SVG numbers, the accepted trailing comma and invalid fallback, all four independently selected channels, and case-sensitive selector fallback to alpha. All fourteen are byte-exact. | | `svg-filter-displacement-{color-srgb,color-linear,primitive-units,transparent-map,half-alpha-map,map-region,source-alpha-map,source-rgb-map,generated-color,turbulence-map,turbulence-map-linear,region-percent,scale-transform,quarter-turn,use,viewbox,stroke,path,opacity,empty-generated,input-default-in2,input-unknown-in}.svg` · `svg-filter-turbulence-displacement-map.svg` | Two-input sampling and composition evidence: non-premultiplied map channels in both filter color spaces; Blink's horizontal object-box scale for both displacement axes; transparent, half-alpha, bounded, source, and generated maps; hard regions, safe mappings, ``, `viewBox`, stroke/path sources and opacity; default/unknown graph inputs; generated output over an empty target; and the procedural-noise-to-warp chain. All twenty-three are byte-exact. | -| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five new cells fail, up to all 4,096 pixels and maximum channel delta 202; restoration returned the complete 685-cell gate to green. The corpus is now 685 cells plus 10 sampled frames, and the named register has 143 rows. | +| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. A review-triggered eighteen-source matrix then isolated procedural-image arithmetic across blend, morphology, matrix, transfer, displacement, and both color-space directions: fifteen sources are admitted and exact after repair, while three reach older shadow/composition patrols. The old byte-image policy changed 349px/Δ1 for linear→sRGB blend, 490px/Δ6 for all-linear blend, 450px/Δ6 for sRGB→linear blend, 2,365px/Δ1 for sRGB→linear morphology, and 393px/Δ1 for blend→morphology. Those five are now load-bearing cells; two exact opposite-order controls guard the required morphology transition. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five original rung cells fail, up to all 4,096 pixels and maximum channel delta 202. Restoring the pre-review procedural policy separately makes the five cells above fail; both restorations return the complete 692-cell gate to green. The first hosted-x86 run found twenty-two rung cells and 294 pixels at Δ1: eighteen sRGB displacement cells plus four procedural outputs. Scoped exact displacement restore and floating procedural provenance keep all 692 ARM cells exact; the hosted rerun is pending. The corpus is now 692 cells plus 10 sampled frames, and the named register has 143 rows. | | `svg-gradient-linear.svg` · `svg-gradient-linear-userspace.svg` · `svg-gradient-linear-bbox-offset.svg` | The gradient rung's base cells: the default objectBoundingBox ramp, the byte-identical userSpaceOnUse equivalent (the canary for the box-inverse fold), and a bbox-relative ramp on offset geometry. | | `svg-gradient-transform.svg` · `svg-gradient-css-transform.svg` | `gradientTransform` and an author `transform` declaration are one computed value — the attribute cell and the non-quarter CSS rotation cell (the discriminating measurement: the value applies about the raw origin of gradient space, both spellings). | | `svg-gradient-spread-reflect.svg` · `svg-gradient-spread-repeat.svg` · `svg-gradient-hard-stop.svg` · `svg-gradient-stop-nonmonotonic.svg` | The ramp grammar: both non-pad spread methods with their measured seams, equal-offset hard stops rendering crisp, and non-monotonic offsets clamping to the running maximum (never sorted). | diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index 980c983a..7e995e4c 100644 --- a/fixtures/web-first/STATUS.md +++ b/fixtures/web-first/STATUS.md @@ -19,7 +19,7 @@ Not a conformance claim: no score is computed or implied (FLIP is unratified), and the corpus enumerates constructs, not the SVG surface. -## Chromium-baked cells (685) +## Chromium-baked cells (692) Each renders byte-exact against its committed Chromium oracle (seven curved cells and four gradient ramps carry a declared, bounded @@ -381,6 +381,7 @@ to its fixture source. No new image is committed for this view. svg-filter-turbulence-base-plus-exponent svg-filter-turbulence-base-trailing-comma svg-filter-turbulence-base-two +svg-filter-turbulence-blend-morphology-restore svg-filter-turbulence-color-default svg-filter-turbulence-color-linear svg-filter-turbulence-color-srgb @@ -391,6 +392,10 @@ to its fixture source. No new image is committed for this view. svg-filter-turbulence-fractional-translate svg-filter-turbulence-graph-blend svg-filter-turbulence-graph-result-reuse +svg-filter-turbulence-linear-blend +svg-filter-turbulence-linear-srgb-blend +svg-filter-turbulence-linear-srgb-morphology +svg-filter-turbulence-morphology-blend-restore svg-filter-turbulence-octave-cap svg-filter-turbulence-octave-grammar svg-filter-turbulence-octave-negative @@ -406,6 +411,8 @@ to its fixture source. No new image is committed for this view. svg-filter-turbulence-seed-negative svg-filter-turbulence-seed-one svg-filter-turbulence-seed-zero +svg-filter-turbulence-srgb-linear-blend +svg-filter-turbulence-srgb-linear-morphology svg-filter-turbulence-stitch svg-filter-turbulence-stitch-grammar svg-filter-turbulence-stitch-none diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-blend-morphology-restore.png b/fixtures/web-first/chromium/svg-filter-turbulence-blend-morphology-restore.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f0dbabe95684edad8bcea7d7f4b85b6f08e458 GIT binary patch literal 6487 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 A^#A|> literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-linear-srgb-blend.png b/fixtures/web-first/chromium/svg-filter-turbulence-linear-srgb-blend.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7488d763b66bd27193e3a25246a47bb1677e25 GIT binary patch literal 7984 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-morphology-blend-restore.png b/fixtures/web-first/chromium/svg-filter-turbulence-morphology-blend-restore.png new file mode 100644 index 0000000000000000000000000000000000000000..ae28df73fd9429f782d2c444f5a2aa822daa2814 GIT binary patch literal 6606 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 Rglqr+002ovPDHLkV1hfTVRQfh literal 0 HcmV?d00001 diff --git a/fixtures/web-first/oracle-bake.json b/fixtures/web-first/oracle-bake.json index 5d26df3f..dc9c8695 100644 --- a/fixtures/web-first/oracle-bake.json +++ b/fixtures/web-first/oracle-bake.json @@ -5,7 +5,7 @@ "bake_script_sha256": "2bdb5f933d072a1e87c9a675c3342fcf506c0955c0f5c26e2988f4e8fa37c4f2", "capture_module_sha256": "15ba5c3156f3ed0bfd0f32b6ad773e1d228c0f678396db08c8de1d972cf5bced", "suite": "primitives.json", - "suite_sha256": "ed72867d17735c95e8559ce81d0be59145dc0c7428438a2c6246065724677b6a", + "suite_sha256": "d6df57f610243ca1a3e4d7cc404e7a56a0db7e7ee62fc7712b628a38314d7beb", "capture": { "device_scale_factor": 1, "omit_background": true, @@ -3196,6 +3196,15 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-blend-morphology-restore", + "source": "svg-filter-turbulence-blend-morphology-restore.svg", + "source_sha256": "de0ddccf3c694015fae1497ece12e619147f715c258f3badf34ec4ec662edd2f", + "oracle": "chromium/svg-filter-turbulence-blend-morphology-restore.png", + "oracle_sha256": "ac1bba196fe00c0ce5705ee12939085f2c001d6fc62af2eb03b0c8c8a3e2b149", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-color-default", "source": "svg-filter-turbulence-color-default.svg", @@ -3286,6 +3295,42 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-linear-blend", + "source": "svg-filter-turbulence-linear-blend.svg", + "source_sha256": "db5ad834b261838797f5f5ce86b5a69ec3797a62a3173afe0743b04b7fecf825", + "oracle": "chromium/svg-filter-turbulence-linear-blend.png", + "oracle_sha256": "43837d815e68e4d44993a262687178e24992f494bb7b1c9b946ad2507bba9e6e", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-linear-srgb-blend", + "source": "svg-filter-turbulence-linear-srgb-blend.svg", + "source_sha256": "8ef288ac3d48522f67ba181d54ae19b45bf2db3116e7b379ff04efdf51c638fa", + "oracle": "chromium/svg-filter-turbulence-linear-srgb-blend.png", + "oracle_sha256": "8aa8ad7ef637f73f979b1a58cff663e2ec0361b42c0c305e75ca8fb612f44844", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-linear-srgb-morphology", + "source": "svg-filter-turbulence-linear-srgb-morphology.svg", + "source_sha256": "2b215c27428298e4679714343239d7c6f21078ab18f00d803ea1fd8208282172", + "oracle": "chromium/svg-filter-turbulence-linear-srgb-morphology.png", + "oracle_sha256": "794476cb26e074f8eac472a9c84b39043ec9e654dd78f1ee6aec82a641488612", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-morphology-blend-restore", + "source": "svg-filter-turbulence-morphology-blend-restore.svg", + "source_sha256": "9b7efd5b846c9f46a2d75583684a50041064165222f6010805bcac2103f42f74", + "oracle": "chromium/svg-filter-turbulence-morphology-blend-restore.png", + "oracle_sha256": "bf6243487410162a719a64f5fd81533eb974e471aef3f5b29a231128cb5c31de", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-octave-cap", "source": "svg-filter-turbulence-octave-cap.svg", @@ -3421,6 +3466,24 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-srgb-linear-blend", + "source": "svg-filter-turbulence-srgb-linear-blend.svg", + "source_sha256": "c9d612359418e8a203404501f69e43199655148a516b5558c8087b6f3b4f15b0", + "oracle": "chromium/svg-filter-turbulence-srgb-linear-blend.png", + "oracle_sha256": "01d3d6b4e2ba3ae4b2c9dbc9cae4384a0cc068caeae21322d32fae6f5e082281", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-srgb-linear-morphology", + "source": "svg-filter-turbulence-srgb-linear-morphology.svg", + "source_sha256": "9b07a43b919e7ac264c6fc8bfb097cdfee74730ea8c4980e6b1b9cf2fd563df1", + "oracle": "chromium/svg-filter-turbulence-srgb-linear-morphology.png", + "oracle_sha256": "5d614123e280ffc33840c003e30396d52161ce6a4d1041e6c05aaa90de70ff03", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-stitch", "source": "svg-filter-turbulence-stitch.svg", diff --git a/fixtures/web-first/primitives.json b/fixtures/web-first/primitives.json index c25e8c9e..aab05291 100644 --- a/fixtures/web-first/primitives.json +++ b/fixtures/web-first/primitives.json @@ -2903,6 +2903,14 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-blend-morphology-restore", + "source": "svg-filter-turbulence-blend-morphology-restore.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-blend-morphology-restore.png", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-color-default", "source": "svg-filter-turbulence-color-default.svg", @@ -2983,6 +2991,38 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-linear-blend", + "source": "svg-filter-turbulence-linear-blend.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-linear-blend.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-linear-srgb-blend", + "source": "svg-filter-turbulence-linear-srgb-blend.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-linear-srgb-blend.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-linear-srgb-morphology", + "source": "svg-filter-turbulence-linear-srgb-morphology.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-linear-srgb-morphology.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-morphology-blend-restore", + "source": "svg-filter-turbulence-morphology-blend-restore.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-morphology-blend-restore.png", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-octave-cap", "source": "svg-filter-turbulence-octave-cap.svg", @@ -3103,6 +3143,22 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-turbulence-srgb-linear-blend", + "source": "svg-filter-turbulence-srgb-linear-blend.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-srgb-linear-blend.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-turbulence-srgb-linear-morphology", + "source": "svg-filter-turbulence-srgb-linear-morphology.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-turbulence-srgb-linear-morphology.png", + "width": 64, + "height": 64 + }, { "id": "svg-filter-turbulence-stitch", "source": "svg-filter-turbulence-stitch.svg", diff --git a/fixtures/web-first/svg-filter-turbulence-blend-morphology-restore.svg b/fixtures/web-first/svg-filter-turbulence-blend-morphology-restore.svg new file mode 100644 index 00000000..50c45255 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-blend-morphology-restore.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-linear-blend.svg b/fixtures/web-first/svg-filter-turbulence-linear-blend.svg new file mode 100644 index 00000000..0f78c264 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-linear-blend.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-linear-srgb-blend.svg b/fixtures/web-first/svg-filter-turbulence-linear-srgb-blend.svg new file mode 100644 index 00000000..7a177da9 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-linear-srgb-blend.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-linear-srgb-morphology.svg b/fixtures/web-first/svg-filter-turbulence-linear-srgb-morphology.svg new file mode 100644 index 00000000..45c33c23 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-linear-srgb-morphology.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-morphology-blend-restore.svg b/fixtures/web-first/svg-filter-turbulence-morphology-blend-restore.svg new file mode 100644 index 00000000..097f0024 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-morphology-blend-restore.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-srgb-linear-blend.svg b/fixtures/web-first/svg-filter-turbulence-srgb-linear-blend.svg new file mode 100644 index 00000000..61e65fd4 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-srgb-linear-blend.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-srgb-linear-morphology.svg b/fixtures/web-first/svg-filter-turbulence-srgb-linear-morphology.svg new file mode 100644 index 00000000..04c4a041 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-srgb-linear-morphology.svg @@ -0,0 +1,10 @@ + + + + + + + + + + From 0ac1504edce4fb441711827f43a40249de716215 Mon Sep 17 00:00:00 2001 From: Universe Date: Thu, 27 Aug 2026 00:15:24 +0900 Subject: [PATCH 3/6] n0: make procedural blend rounding architecture-stable --- crates/n0/src/paint.rs | 146 +++++++++++++++++- crates/n0_cli/README.md | 34 ++-- docs/wg/consolidation/svg-engine-of-record.md | 76 ++++++--- docs/wg/consolidation/web-checklist.md | 22 ++- fixtures/web-first/README.md | 4 +- fixtures/web-first/STATUS.md | 10 +- ...lter-turbulence-blend-chain-difference.png | Bin 0 -> 6713 bytes ...ilter-turbulence-blend-chain-exclusion.png | Bin 0 -> 7167 bytes ...vg-filter-turbulence-difference-linear.png | Bin 0 -> 7794 bytes ...lter-turbulence-difference-srgb-direct.png | Bin 0 -> 7838 bytes ...er-turbulence-difference-srgb-transfer.png | Bin 0 -> 6617 bytes ...svg-filter-turbulence-exclusion-linear.png | Bin 0 -> 7497 bytes ...ilter-turbulence-exclusion-srgb-direct.png | Bin 0 -> 7788 bytes ...ter-turbulence-exclusion-srgb-transfer.png | Bin 0 -> 6800 bytes fixtures/web-first/oracle-bake.json | 74 ++++++++- fixtures/web-first/primitives.json | 64 ++++++++ ...lter-turbulence-blend-chain-difference.svg | 9 ++ ...ilter-turbulence-blend-chain-exclusion.svg | 9 ++ ...vg-filter-turbulence-difference-linear.svg | 9 ++ ...lter-turbulence-difference-srgb-direct.svg | 9 ++ ...er-turbulence-difference-srgb-transfer.svg | 9 ++ ...svg-filter-turbulence-exclusion-linear.svg | 9 ++ ...ilter-turbulence-exclusion-srgb-direct.svg | 9 ++ ...ter-turbulence-exclusion-srgb-transfer.svg | 9 ++ 24 files changed, 451 insertions(+), 51 deletions(-) create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-difference.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-exclusion.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-difference-linear.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-difference-srgb-direct.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-difference-srgb-transfer.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-exclusion-linear.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-exclusion-srgb-direct.png create mode 100644 fixtures/web-first/chromium/svg-filter-turbulence-exclusion-srgb-transfer.png create mode 100644 fixtures/web-first/svg-filter-turbulence-blend-chain-difference.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-blend-chain-exclusion.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-difference-linear.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-difference-srgb-direct.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-difference-srgb-transfer.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-exclusion-linear.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-exclusion-srgb-direct.svg create mode 100644 fixtures/web-first/svg-filter-turbulence-exclusion-srgb-transfer.svg diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index 470db1e6..b1e7bdf0 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -1939,10 +1939,14 @@ struct BuiltFilterResult { /// input through one additional source-image boundary. Preserve that /// measured boundary through later graph nodes. source_preflatten: bool, - /// An upstream procedural shader remains a floating image fact. Preserve - /// that provenance so later blends do not quantize it as an ordinary byte - /// image and the final layer takes an architecture-stable floating restore. + /// An upstream procedural shader needs procedural-scoped blend arithmetic + /// and final restore policy even after an intermediate sRGB result + /// materializes. The next field tracks that narrower blend-domain state. procedural_provenance: bool, + /// A direct sRGB procedural shader still enters Skia's byte-domain blend + /// stages. Color conversion or another arithmetic primitive promotes that + /// route to floating point even though procedural provenance remains. + procedural_unorm8_blend: bool, } #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -2005,6 +2009,8 @@ fn convert_filter_space( color_restore: None, source_preflatten: result.source_preflatten, procedural_provenance: result.procedural_provenance, + // Gamma conversion promotes the next blend to Skia's floating path. + procedural_unorm8_blend: false, }) } @@ -2087,6 +2093,31 @@ fn floating_porter_duff_blender(operator: ResolvedFilterComposite) -> Result Result { + // Procedural shaders must stay floating until the final composition, but + // leaving the last N32 quantization implicit selects different Skia CPU + // packing paths on NEON and x86. Quantize only the composed result: doing + // so earlier changes Chromium's blend and morphology arithmetic. + let slot = 21 + porter_duff_slot(operator)?; + let expression = porter_duff_expression(operator)? + .replace("src", "s") + .replace("dst", "d"); + cached_filter_blender(slot, || { + format!( + r#" +half4 main(half4 src, half4 dst) {{ + float4 s = float4(src); + float4 d = float4(dst); + float4 result = {expression}; + return half4(floor(clamp(result, 0.0, 1.0) * 255.0 + 0.5) / 255.0); +}} +"# + ) + }) +} + fn exact_unorm8_blender(operator: ResolvedFilterComposite) -> Result { // Skia's low-precision blend stages deliberately use an approximate // divide-by-255 on x86 while NEON uses the accurate operation. Spell the @@ -2177,6 +2208,37 @@ half4 main(half4 src, half4 dst) {{ ) } +fn floating_filter_blend_source(expression: &str) -> String { + format!( + r#" +float overlay_channel(float s, float d, float sa, float da) {{ + float blend = 2.0 * d <= da + ? 2.0 * s * d + : sa * da - 2.0 * (sa - s) * (da - d); + return s * (1.0 - da) + d * (1.0 - sa) + blend; +}} + +float hard_light_channel(float s, float d, float sa, float da) {{ + float blend = 2.0 * s <= sa + ? 2.0 * s * d + : sa * da - 2.0 * (sa - s) * (da - d); + return s * (1.0 - da) + d * (1.0 - sa) + blend; +}} + +float3 unorm8_product(float3 value) {{ + return floor((value * 65025.0 + 127.0) / 255.0) / 255.0; +}} + +half4 main(half4 src, half4 dst) {{ + float4 s = float4(src); + float4 d = float4(dst); + float4 result = {expression}; + return half4(clamp(result, 0.0, 1.0)); +}} +"# + ) +} + fn deterministic_filter_blender(mode: ResolvedFilterBlend) -> Result { let (slot, expression) = match mode { ResolvedFilterBlend::Normal => (12, "s + div255(d * (255.0 - s.a))"), @@ -2214,6 +2276,52 @@ fn deterministic_filter_blender(mode: ResolvedFilterBlend) -> Result Result { + // The same nine modes that enter Skia's architecture-dependent lowp path + // need explicit formulas for procedural inputs. Most stay floating; direct + // or materialized sRGB difference/exclusion retain one measured unorm8 + // product-rounding step. The remaining modes use Skia's high-precision path. + let (slot, expression) = match mode { + ResolvedFilterBlend::Normal => (27, "s + d * (1.0 - s.a)"), + ResolvedFilterBlend::Multiply => ( + 28, + "s * (1.0 - d.a) + d * (1.0 - s.a) + s * d", + ), + ResolvedFilterBlend::Screen => (29, "s + d - s * d"), + ResolvedFilterBlend::Overlay => ( + 30, + "float4(overlay_channel(s.r, d.r, s.a, d.a), overlay_channel(s.g, d.g, s.a, d.a), overlay_channel(s.b, d.b, s.a, d.a), s.a + d.a - s.a * d.a)", + ), + ResolvedFilterBlend::Darken => (31, "s + d - max(s * d.a, d * s.a)"), + ResolvedFilterBlend::Lighten => (32, "s + d - min(s * d.a, d * s.a)"), + ResolvedFilterBlend::HardLight => ( + 33, + "float4(hard_light_channel(s.r, d.r, s.a, d.a), hard_light_channel(s.g, d.g, s.a, d.a), hard_light_channel(s.b, d.b, s.a, d.a), s.a + d.a - s.a * d.a)", + ), + ResolvedFilterBlend::Difference => ( + if unorm8_input { 36 } else { 34 }, + if unorm8_input { + "float4(s.rgb + d.rgb - 2.0 * unorm8_product(min(s.rgb * d.a, d.rgb * s.a)), s.a + d.a - s.a * d.a)" + } else { + "float4(s.rgb + d.rgb - 2.0 * min(s.rgb * d.a, d.rgb * s.a), s.a + d.a - s.a * d.a)" + }, + ), + ResolvedFilterBlend::Exclusion => ( + if unorm8_input { 37 } else { 35 }, + if unorm8_input { + "float4(s.rgb + d.rgb - 2.0 * unorm8_product(s.rgb * d.rgb), s.a + d.a - s.a * d.a)" + } else { + "float4(s.rgb + d.rgb - 2.0 * s.rgb * d.rgb, s.a + d.a - s.a * d.a)" + }, + ), + _ => return Ok(sk_filter_blend_mode(mode).into()), + }; + cached_filter_blender(slot, || floating_filter_blend_source(expression)) +} + fn sk_displacement_channel(channel: ResolvedFilterDisplacementChannel) -> ColorChannel { match channel { ResolvedFilterDisplacementChannel::Red => ColorChannel::R, @@ -2240,6 +2348,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { color_restore: None, source_preflatten: false, procedural_provenance: false, + procedural_unorm8_blend: false, }; let source_alpha = BuiltFilterResult { image_filter: if let Some(source) = explicit_transparent_source { @@ -2255,6 +2364,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { color_restore: None, source_preflatten: false, procedural_provenance: false, + procedural_unorm8_blend: false, }; let mut results: Vec = Vec::with_capacity(filter.nodes.len()); for node in filter.nodes.iter() { @@ -2319,8 +2429,19 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ResolvedFilterPrimitive::Morphology { radius_x, radius_y, .. } if source_dependent && (*radius_x > 0.0 || *radius_y > 0.0) ); - let mut procedural_provenance = inputs.iter().any(|input| input.procedural_provenance) + let has_procedural_input = inputs.iter().any(|input| input.procedural_provenance); + let mut procedural_provenance = has_procedural_input || matches!(&node.primitive, ResolvedFilterPrimitive::Turbulence { .. }); + let mut procedural_unorm8_blend = + if matches!(&node.primitive, ResolvedFilterPrimitive::Turbulence { .. }) { + node.color_space == ResolvedFilterColorSpace::Srgb + } else { + has_procedural_input + && inputs + .iter() + .filter(|input| input.procedural_provenance) + .all(|input| input.procedural_unorm8_blend) + }; let (image_filter, output_space, source_dependent, requires_exact_restore) = match node .primitive .clone() @@ -2430,7 +2551,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { let background = inputs.pop().expect("blend has two checked inputs"); let foreground = inputs.pop().expect("blend has two checked inputs"); let blender = if procedural_provenance { - sk_filter_blend_mode(mode).into() + procedural_filter_blender(mode, procedural_unorm8_blend)? } else { deterministic_filter_blender(mode)? }; @@ -2447,6 +2568,11 @@ fn build_filter(filter: &ResolvedFilter) -> Result { // own floating-point arithmetic. let requires_exact_restore = requires_exact_restore || node.color_space == ResolvedFilterColorSpace::Srgb; + // The runtime blender computes this operation in the measured + // domain, then an sRGB result materializes before a later blend. + // Linear output remains floating. Final procedural provenance + // is independent and survives either transition. + procedural_unorm8_blend = node.color_space == ResolvedFilterColorSpace::Srgb; ( Some(filter), node.color_space, @@ -2553,6 +2679,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { } ResolvedFilterPrimitive::ColorMatrix { matrix } => { let input = inputs.pop().expect("color matrix has one checked input"); + procedural_unorm8_blend = false; let color_filter = skia_safe::color_filters::matrix_row_major(&matrix, None); let filter = skia_safe::image_filters::color_filter(color_filter, input.image_filter, crop) @@ -2573,6 +2700,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { let input = inputs .pop() .expect("component transfer has one checked input"); + procedural_unorm8_blend = false; let color_filter = skia_safe::color_filters::table_argb( Some(&tables[3]), Some(&tables[0]), @@ -2612,6 +2740,9 @@ fn build_filter(filter: &ResolvedFilter) -> Result { { procedural_provenance = false; } + if active { + procedural_unorm8_blend = false; + } let filter = match operator { ResolvedFilterMorphology::Erode => skia_safe::image_filters::erode( (radius_x, radius_y), @@ -2764,6 +2895,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { color_restore, source_preflatten, procedural_provenance, + procedural_unorm8_blend, }); } let output = results @@ -2790,7 +2922,9 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ); } let restore_blender = if output.procedural_provenance { - Some(floating_porter_duff_blender(ResolvedFilterComposite::Over)?) + Some(quantized_floating_porter_duff_blender( + ResolvedFilterComposite::Over, + )?) } else if output.requires_exact_restore { Some(exact_unorm8_blender(ResolvedFilterComposite::Over)?) } else if output.color_restore == Some(ColorRestore::Floating) { diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 6fd7800c..2341a2d7 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -449,22 +449,30 @@ cargo run -p n0_cli --bin n0 -- \ 1,633 pixels, all by one channel level, at the final filter-layer restore. Its scoped exact byte-domain restore leaves zero radius and later color-space conversion on their prior paths. Procedural sources carry floating - provenance through blend arithmetic and use an architecture-stable floating - final restore. Direct active sRGB morphology materializes that provenance; - blend before morphology preserves it. sRGB displacement output takes the - exact byte-domain restore. Empty generated-source scopes seed damage coverage - from their transformed filter region, so procedural parameter edits damage - pixels even without a source draw. Seven operation-order and color-transition - controls guard these distinctions. The first hosted-x86 run found 294 - one-code-value pixels across eighteen sRGB displacement and four procedural - cells; the scoped candidate is exact across the current ARM corpus and awaits - hosted-x86 confirmation. The same hosted workspace test covers the earlier - two hundred forty-eight-cell estate; all three hundred thirty-one + provenance through blend arithmetic. Direct sRGB procedural + `difference`/`exclusion` retains the pinned backend's byte-domain product + rounding; linear or component-transferred inputs use floating products. An + sRGB blend result materializes before a later blend; linear output remains + floating, and a later transfer promotes either route again. The final + procedural restore quantizes only the composed output with explicit + half-up byte rounding. Direct active sRGB morphology materializes procedural + provenance; blend before morphology preserves it. sRGB displacement output + takes the exact byte-domain restore. Empty generated-source scopes seed + damage coverage from their transformed filter region, so procedural + parameter edits damage pixels even without a source draw. Fifteen + operation-order, color-transition, and blend-domain controls guard these + distinctions. The first hosted-x86 run found 294 one-code-value pixels across + eighteen sRGB displacement and four procedural cells. The displacement repair + cleared all eighteen on the second run, which left 729 delta-1 pixels in four + procedural cells. The scoped arithmetic/quantization candidate is exact + across the current ARM corpus and awaits the next hosted-x86 confirmation. + The same hosted workspace test covers the earlier two hundred + forty-eight-cell estate; all three hundred thirty-nine Chromium-baked filter cells are exact on the current ARM host without a tolerance. The filter estate contains 26 chassis/blur cells, 60 shadow-graph, 28 native drop-shadow, 27 color-matrix, 32 component-transfer, 38 blend, 37 - morphology, and 83 turbulence/displacement cells. The complete corpus - contains 692 Chromium-baked cells plus 10 sampled frames, with 143 named + morphology, and 91 turbulence/displacement cells. The complete corpus + contains 700 Chromium-baked cells plus 10 sampled frames, with 143 named refusal rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index cbf9529a..67d84c6c 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -76,7 +76,7 @@ from the dated addenda below: the full `preserveAspectRatio` grammar; and one exact-time `` on a top-level ``. `crates/n0_cli/README.md` is the statement of record. -- **The corpus** is 692 Chromium-baked primitive cells plus 10 sampled frames. +- **The corpus** is 700 Chromium-baked primitive cells plus 10 sampled frames. All byte-exact except seven curved cells carrying a declared, geometrically confined tolerance (the native-oval/conic boundary) and four gradient cells carrying a declared one-code-value ramp-quantization tolerance (one pixel @@ -3433,19 +3433,32 @@ box. The color audit found a second narrow chassis boundary. Missing `color-interpolation-filters` equals explicit linearRGB; explicit sRGB changes -both noise formulas and a procedural displacement map. A procedural image is a -floating image fact through blend arithmetic, including across a color-space -conversion; treating it as an ordinary generated byte image changes 349 to 490 -pixels at maximum deltas 1 to 6 in three measured blend cases. Active sRGB -morphology directly over that image establishes a byte-domain boundary, while -blend followed by morphology retains the stronger procedural-composition -provenance. The opposite operation order is an exact control. The final -procedural layer therefore uses an architecture-stable floating restore, while -sRGB displacement uses the established exact byte restore. Generated solids -and earlier byte-domain filter outputs retain their existing policies. Both -turbulence formulas in both color spaces, both operation orders, and the -noise-to-displacement chain are exact on the current ARM host without a -tolerance. +both noise formulas and a procedural displacement map. Procedural pixels stay +floating through blend arithmetic and color conversion; treating them as an +ordinary generated byte image changes 349 to 490 pixels at maximum deltas 1 +to 6 in three measured blend cases. One narrower distinction remains inside +that statement. A direct sRGB procedural input reaches the pinned backend's +byte-domain product rounding for `difference` and `exclusion`, while a linear +input or an intervening component transfer promotes the blend to floating +arithmetic. An sRGB blend computes in its selected domain and then materializes +before a later blend; linear blend output remains floating, and a later transfer +promotes either route again. Four sixteen-mode atlases covering both color +spaces and direct or transferred alpha discriminate the first split. A +thirty-four-source chain matrix covers offset, blur, matrix, transfer, +morphology, prior blend, displacement, merge, and composite placement around +the affected modes: thirty admitted sources are exact and four reach the +existing source-derived multi-input patrol (measured, not celled). Eight +committed controls retain the two affected modes and the two-blend transition. +Active sRGB morphology directly over a procedural image +establishes a byte-domain boundary, while blend followed by morphology retains +the stronger procedural-composition provenance. The opposite operation order +is an exact control. The final procedural layer quantizes only the composed +result with explicit half-up byte rounding before the N32 boundary; sRGB +displacement uses the established exact byte restore. Generated solids and +earlier byte-domain filter outputs retain their existing policies. Both +turbulence formulas in both color spaces, both operation orders, the full +blend-mode atlases, and the noise-to-displacement chain are exact on the current +ARM host without a tolerance. Three remaining silent classes are now stable refusals. Axis maps, fractional translation and scale, reflection, and exact quarter turns are exact. A @@ -3476,8 +3489,11 @@ transfer, displacement, and both color-space directions. Fifteen are admitted and exact after repair; three reach older shadow or composition patrols. The former restore policy changes five measured cases: the three blend cases above, sRGB-to-linear morphology by 2,365 pixels at maximum delta 1, and blend followed -by morphology by 393 pixels at delta 1. Eighty-three committed Chromium cells -carry the admitted slice without a new tolerance. They cover +by morphology by 393 pixels at delta 1. The four blend atlases add sixty-four +exact procedural mode/space/alpha combinations, and the operation-chain matrix +adds thirty exact admitted sources (measured, not celled). Ninety-one committed +Chromium cells carry the admitted slice without a new +tolerance. They cover the complete parameter grammars, both formulas, all selectors, color spaces, regions and units, source and map profiles, empty targets, graph routing, safe mappings, source shapes, opacity, ``, `viewBox`, and the combined @@ -3490,19 +3506,31 @@ controls reached maximum channel delta 202. Restoring both mappings returned the gate to green. Independently restoring the former procedural-image policy makes the five dedicated operation-order cells fail, up to 2,365 pixels and maximum delta 6. Restoring the measured provenance rule returns the complete -692-cell gate to green. +700-cell gate to green. Replacing composed-result half-up quantization with +floor made forty-one cells fail, up to 3,648 pixels, all at delta 1; replacing +procedural multiply with normal made five cells fail, up to 1,362 pixels at +delta 116. Finally, forcing the promoted floating route on direct sRGB +`difference`/`exclusion` makes the two dedicated cells fail by 3,497 and 3,532 +pixels, while forcing byte-domain products on the promoted routes makes four +cells fail by 3,287–3,697 pixels. Carrying a floating result across the measured +sRGB blend-output boundary makes the two chain controls fail by 3,468 and 3,700 +pixels. Every restoration returns the complete gate to green. The first hosted-x86 workspace run rejected twenty-two rung cells: eighteen sRGB displacement cases and four procedural outputs, totalling 294 pixels, all -at delta 1. This is the same CPU-family final-restore class seen in earlier -filter rungs, not a formula or sampling disagreement. Scoped exact displacement -restore and the floating procedural restore keep all 692 ARM cells exact. The -hosted-x86 confirmation is pending; this paragraph records the failed run and -the candidate separately rather than treating local architecture agreement as -proof. +at delta 1. Scoped exact displacement restore cleared all eighteen displacement +failures on the second run. That run left four procedural cells and 729 pixels, +all at delta 1: one pixel each in the default-color, linear-color, and stitched +controls, plus 726 pixels in the procedural blend. This isolates both the final +N32 quantization and the low-precision blend path as CPU-family boundaries, not +noise-formula or displacement-sampling disagreements. Explicit floating mode +arithmetic, the direct-sRGB product exception above, and composed-result-only +half-up quantization keep all 700 ARM cells exact. The next hosted-x86 run is +pending; this paragraph records both failed runs and the candidate separately +rather than treating local architecture agreement as proof. Three focused rows join the refusal register, moving it from 140 to 143. The -primitive corpus moves from 609 to 692 cells; the ten exact-time sampled frames +primitive corpus moves from 609 to 700 cells; the ten exact-time sampled frames are unchanged. Exactly nine checklist rows tick: the two elements and seven element-specific attributes named above. This records no conformance score and takes no FLIP action. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index 935c83b4..16aa3413 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -1517,7 +1517,7 @@ for attributes the platform ships ahead of the SVG 2 indexes. > safe mappings, ``, and `viewBox`. A user-space procedural filter may > paint even when its target contributes a fully transparent source; an > object-box filter region on the same zero-area target paints nothing. -> Eighty-three exact Chromium cells move the complete gate to 692. General +> Ninety-one exact Chromium cells move the complete gate to 700. General > affine mappings for both primitives and geometric clipping for displacement > refuse by three stable precision names before paint. The shared `type`, `in`, > `in2`, `result`, region, interpolation, filter-resource, and dynamics rows @@ -1528,10 +1528,22 @@ for attributes the platform ships ahead of the SVG 2 indexes. > that procedural images must remain floating through blend arithmetic, while > active sRGB morphology materializes a direct procedural image. Restoring the > old policy makes five dedicated cells fail at up to 2,365 pixels and maximum -> channel delta 6. The first hosted-x86 run also found 294 one-code-value -> pixels across twenty-two displacement/procedural cells; scoped exact -> displacement restore and floating procedural provenance keep the complete -> ARM gate exact while the hosted rerun is pending. +> channel delta 6. The first hosted-x86 run found 294 one-code-value pixels +> across twenty-two displacement/procedural cells. Its first repair cleared all +> eighteen displacement failures; the second hosted run left 729 delta-1 +> pixels across four procedural cells, including 726 in the blend control. +> Pinned Skia source and a four-atlas, sixty-four-mode Chromium replay then +> separated direct sRGB byte-domain blend products from promoted floating +> products and made every atlas exact. Six committed difference/exclusion +> controls guard both routes: forcing floating arithmetic breaks the two direct +> controls by 3,497 and 3,532 pixels, while forcing byte arithmetic breaks the +> four promoted controls by 3,287–3,697 pixels. A further thirty-four-source +> operation-chain matrix found that an sRGB blend result materializes before a +> later blend; carrying the earlier floating state silently changed 3,468 and +> 3,700 pixels. Two committed chain controls now guard that transition. +> Explicit procedural mode arithmetic and composed-result half-up quantization +> keep all 700 ARM cells exact; the next hosted-x86 run is the remaining +> portability proof. - [ ] `` > **2026-08-25 split:** the static filter graph carries safe-kernel diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index c2e432dc..12525cbe 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -215,9 +215,11 @@ is exactly what the engine renders pixel-for-pixel. | `svg-filter-turbulence-{default,type-turbulence,type-fractal,type-grammar,base-one,base-two,base-comma,base-trailing-comma,base-invalid,base-negative-axis,base-plus-exponent,octave-one,octave-two,octave-zero,fractal-octave-zero,octave-negative,octave-nine,octave-cap,octave-grammar,seed-zero,seed-one,seed-fraction,seed-negative,seed-grammar,stitch-none,stitch,stitch-grammar}.svg` | The complete static `feTurbulence` parameter grammar in twenty-seven cells: both formulas and case-sensitive enum fallback; one/two-member SVG number lists, comma-wsp, a lone trailing comma, leading plus and exponent; invalid and negative-frequency fallback; integer octave parsing, zero/negative behavior, and the cap at nine; signed/truncated seeds; and both stitch modes with exact-enum fallback. All twenty-seven are byte-exact. | | `svg-filter-turbulence-{color-default,color-srgb,color-linear,region-stitch-fraction,region-percent,fractional-translate,quarter-turn,use,viewbox,graph-blend,graph-result-reuse,empty-source}.svg` | Procedural-source operation evidence: default linearRGB and explicit color spaces, fractional stitched and percentage hard regions, safe mappings, non-uniform `viewBox`, ``, named graph reuse, and generated output over a fully transparent target source. All twelve are byte-exact. | | `svg-filter-turbulence-{linear-blend,linear-srgb-blend,srgb-linear-blend,linear-srgb-morphology,srgb-linear-morphology,blend-morphology-restore,morphology-blend-restore}.svg` | Procedural-image provenance across the admitted blend and morphology family: all-linear and both color-space transition directions, plus both operation orders. A procedural image stays floating through blend arithmetic; active sRGB morphology materializes a direct procedural image, while an earlier blend keeps its stronger provenance. All seven are byte-exact. | +| `svg-filter-turbulence-{difference-linear,difference-srgb-direct,difference-srgb-transfer,exclusion-linear,exclusion-srgb-direct,exclusion-srgb-transfer}.svg` | The pinned blend-domain split for procedural `difference` and `exclusion`: direct sRGB procedural products take exact byte-domain rounding, while linear and component-transferred procedural inputs take floating products. The six full-canvas controls avoid unrelated edge antialiasing and are byte-exact. | +| `svg-filter-turbulence-blend-chain-{difference,exclusion}.svg` | A procedural sRGB blend computes with the selected arithmetic and then materializes before a later blend. These two full-canvas controls guard that second-blend byte-product transition; both are byte-exact. | | `svg-filter-displacement-{default,scale-zero,scale-positive,scale-negative,scale-fraction,scale-trailing-comma,scale-invalid,selector-default,selector-alpha,selector-red,selector-green,selector-blue,selector-axes,selector-grammar}.svg` | The complete static `feDisplacementMap` parameter grammar in fourteen cells: absent and explicit-zero scale, signed/fractional SVG numbers, the accepted trailing comma and invalid fallback, all four independently selected channels, and case-sensitive selector fallback to alpha. All fourteen are byte-exact. | | `svg-filter-displacement-{color-srgb,color-linear,primitive-units,transparent-map,half-alpha-map,map-region,source-alpha-map,source-rgb-map,generated-color,turbulence-map,turbulence-map-linear,region-percent,scale-transform,quarter-turn,use,viewbox,stroke,path,opacity,empty-generated,input-default-in2,input-unknown-in}.svg` · `svg-filter-turbulence-displacement-map.svg` | Two-input sampling and composition evidence: non-premultiplied map channels in both filter color spaces; Blink's horizontal object-box scale for both displacement axes; transparent, half-alpha, bounded, source, and generated maps; hard regions, safe mappings, ``, `viewBox`, stroke/path sources and opacity; default/unknown graph inputs; generated output over an empty target; and the procedural-noise-to-warp chain. All twenty-three are byte-exact. | -| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. A review-triggered eighteen-source matrix then isolated procedural-image arithmetic across blend, morphology, matrix, transfer, displacement, and both color-space directions: fifteen sources are admitted and exact after repair, while three reach older shadow/composition patrols. The old byte-image policy changed 349px/Δ1 for linear→sRGB blend, 490px/Δ6 for all-linear blend, 450px/Δ6 for sRGB→linear blend, 2,365px/Δ1 for sRGB→linear morphology, and 393px/Δ1 for blend→morphology. Those five are now load-bearing cells; two exact opposite-order controls guard the required morphology transition. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five original rung cells fail, up to all 4,096 pixels and maximum channel delta 202. Restoring the pre-review procedural policy separately makes the five cells above fail; both restorations return the complete 692-cell gate to green. The first hosted-x86 run found twenty-two rung cells and 294 pixels at Δ1: eighteen sRGB displacement cells plus four procedural outputs. Scoped exact displacement restore and floating procedural provenance keep all 692 ARM cells exact; the hosted rerun is pending. The corpus is now 692 cells plus 10 sampled frames, and the named register has 143 rows. | +| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. A review-triggered eighteen-source matrix then isolated procedural-image arithmetic across blend, morphology, matrix, transfer, displacement, and both color-space directions: fifteen sources are admitted and exact after repair, while three reach older shadow/composition patrols. The old byte-image policy changed 349px/Δ1 for linear→sRGB blend, 490px/Δ6 for all-linear blend, 450px/Δ6 for sRGB→linear blend, 2,365px/Δ1 for sRGB→linear morphology, and 393px/Δ1 for blend→morphology. Four further sixteen-mode atlases prove the direct-sRGB byte-product versus promoted-floating split for procedural `difference` and `exclusion`; all sixty-four mode/space/alpha combinations are exact in both admissions. A thirty-four-source chain matrix around offset, blur, matrix, transfer, morphology, prior blend, displacement, merge, and composite admits thirty exact sources and routes four through the existing source-derived multi-input patrol. It also proves that an sRGB blend output materializes before a later blend. Eight hard-edged cells guard the affected product and chain branches. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five original rung cells fail, up to all 4,096 pixels and maximum channel delta 202. Restoring the pre-review procedural policy makes five operation-order cells fail. Replacing final half-up quantization with floor makes forty-one cells fail, up to 3,648px/Δ1, and replacing procedural multiply with normal makes five fail, up to 1,362px/Δ116. Forcing floating products breaks the two direct-sRGB route cells by 3,497 and 3,532 pixels; forcing byte products breaks the four promoted-route cells by 3,287–3,697 pixels. Carrying floating state across the sRGB blend-output boundary breaks the two chain cells by 3,468 and 3,700 pixels. Every restoration returns the complete 700-cell gate to green. The first hosted-x86 run found twenty-two rung cells and 294 pixels at Δ1: eighteen sRGB displacement cells plus four procedural outputs. Scoped exact displacement restore cleared the eighteen displacement failures on the second run, which left four procedural cells and 729 pixels at Δ1—726 in the blend control and one each in three direct procedural controls. Explicit procedural mode arithmetic and composed-result-only half-up quantization keep all 700 ARM cells exact; the next hosted rerun remains the portability proof. The corpus is now 700 cells plus 10 sampled frames, and the named register has 143 rows. | | `svg-gradient-linear.svg` · `svg-gradient-linear-userspace.svg` · `svg-gradient-linear-bbox-offset.svg` | The gradient rung's base cells: the default objectBoundingBox ramp, the byte-identical userSpaceOnUse equivalent (the canary for the box-inverse fold), and a bbox-relative ramp on offset geometry. | | `svg-gradient-transform.svg` · `svg-gradient-css-transform.svg` | `gradientTransform` and an author `transform` declaration are one computed value — the attribute cell and the non-quarter CSS rotation cell (the discriminating measurement: the value applies about the raw origin of gradient space, both spellings). | | `svg-gradient-spread-reflect.svg` · `svg-gradient-spread-repeat.svg` · `svg-gradient-hard-stop.svg` · `svg-gradient-stop-nonmonotonic.svg` | The ramp grammar: both non-pad spread methods with their measured seams, equal-offset hard stops rendering crisp, and non-monotonic offsets clamping to the running maximum (never sorted). | diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index 7e995e4c..ab653c48 100644 --- a/fixtures/web-first/STATUS.md +++ b/fixtures/web-first/STATUS.md @@ -19,7 +19,7 @@ Not a conformance claim: no score is computed or implied (FLIP is unratified), and the corpus enumerates constructs, not the SVG surface. -## Chromium-baked cells (692) +## Chromium-baked cells (700) Each renders byte-exact against its committed Chromium oracle (seven curved cells and four gradient ramps carry a declared, bounded @@ -381,13 +381,21 @@ to its fixture source. No new image is committed for this view. svg-filter-turbulence-base-plus-exponent svg-filter-turbulence-base-trailing-comma svg-filter-turbulence-base-two +svg-filter-turbulence-blend-chain-difference +svg-filter-turbulence-blend-chain-exclusion svg-filter-turbulence-blend-morphology-restore svg-filter-turbulence-color-default svg-filter-turbulence-color-linear svg-filter-turbulence-color-srgb svg-filter-turbulence-default +svg-filter-turbulence-difference-linear +svg-filter-turbulence-difference-srgb-direct +svg-filter-turbulence-difference-srgb-transfer svg-filter-turbulence-displacement-map svg-filter-turbulence-empty-source +svg-filter-turbulence-exclusion-linear +svg-filter-turbulence-exclusion-srgb-direct +svg-filter-turbulence-exclusion-srgb-transfer svg-filter-turbulence-fractal-octave-zero svg-filter-turbulence-fractional-translate svg-filter-turbulence-graph-blend diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-difference.png b/fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-difference.png new file mode 100644 index 0000000000000000000000000000000000000000..ca91ffa629059049bd3bc31ef37064baa5cdf63a GIT binary patch literal 6713 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ɹA7U3AbvlCS4hjSC_Id~ntjYlg| zz>W&sFH4BC=xmp%ZzxA24yf8Hp)v_vF_;P>6FnR0>X~*=zzO~yT?(DTUdp2eeew{q zY)b|j-R1B=Y_0zq^}lTDg-X=&G}g5I4*&oF|Nm1?sPq5;00v1!K~w_(`MQ@G->&_b P00000NkvXXu0mjfr*{_} literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-exclusion.png b/fixtures/web-first/chromium/svg-filter-turbulence-blend-chain-exclusion.png new file mode 100644 index 0000000000000000000000000000000000000000..9e1e8ce6a6bace2eb4a5041eef90539acdc39529 GIT binary patch literal 7167 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 z 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-difference-srgb-transfer.png b/fixtures/web-first/chromium/svg-filter-turbulence-difference-srgb-transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..f5634c19f9109ba584d378ac2ade6206329e48c9 GIT binary patch literal 6617 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
MBok~dW|{TUcQ z`U1}YsmE4B@#umjf5~Wc)c2(v`1P;+OJ-2?$3#dNb*z{J7JL$`)R!oIF?>n|l2i#K zWP+nA*nqeKkjo&q3fJg~;ROB1iPKFv$p=L2B~4xItn-wR?|YQOr{mFQoZ1Nqf#f5d zASQFiutGdYI*q><9+B#z}4BCDheW{E1+HX7J0qsDIvM2 zXoYd4g0!Ibt0Mvr?da#abvfk<`H;cBHyKbgAj>Fav${ZmWtF9YL`!v#j=$1{7^8c4 zvr@W}_Ly;QGYi=wnxmKxD(58eFD8Aluc&2a65BXVW8$*Yf)>SDX zxHS7ukI^swJ6kOb0L$~#P|paXL^j^|U@@;=svvUA61N8ZMSNr|Ss?) za7cO*TxyLHyDmv;>`AlMonC%LQ!bdYhsK-gEIPa)VGUYX#8YxQPai!QW*sJ zBglNAdrghyhO8SW9jyroMfCHMpI!jn#vUs=XC`^4`+!o`%{0s@;KJ$Bl<60!kEEkx zvoDAWj=M||d#0k1P9`ma-p4Z5jUVq%x11!HcHC@UEL$qj{=noCL zlUdhOFv?*Q@_INlaVA+*webqwAD0p`a&mNOXbqTTwJhSzIhR96?vc!RD+fRUw8lcquNsrgQ*#*TWbntUKGXzL*H|H;0(&Tw0o8j}KRO zxtfSrQMZ@L0YlEZe8Hd>c<_IF%-RH%j4ZbB{{R30|Np0fY!?6k00v1!K~w_(lX{Q+ TKjy-R00000NkvXXu0mjfhUj22 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-filter-turbulence-exclusion-srgb-direct.png b/fixtures/web-first/chromium/svg-filter-turbulence-exclusion-srgb-direct.png new file mode 100644 index 0000000000000000000000000000000000000000..5629dc2a8768b5698ec1be6a3188362850206b2b GIT binary patch literal 7788 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 yg!w$ZYCE?72LJ&7|7c7veE + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-blend-chain-exclusion.svg b/fixtures/web-first/svg-filter-turbulence-blend-chain-exclusion.svg new file mode 100644 index 00000000..ca542f20 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-blend-chain-exclusion.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-difference-linear.svg b/fixtures/web-first/svg-filter-turbulence-difference-linear.svg new file mode 100644 index 00000000..11b05521 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-difference-linear.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-difference-srgb-direct.svg b/fixtures/web-first/svg-filter-turbulence-difference-srgb-direct.svg new file mode 100644 index 00000000..e77b5884 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-difference-srgb-direct.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-difference-srgb-transfer.svg b/fixtures/web-first/svg-filter-turbulence-difference-srgb-transfer.svg new file mode 100644 index 00000000..2dbcdab5 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-difference-srgb-transfer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-exclusion-linear.svg b/fixtures/web-first/svg-filter-turbulence-exclusion-linear.svg new file mode 100644 index 00000000..18f75a32 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-exclusion-linear.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-direct.svg b/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-direct.svg new file mode 100644 index 00000000..fb6fced3 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-direct.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-transfer.svg b/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-transfer.svg new file mode 100644 index 00000000..f8627153 --- /dev/null +++ b/fixtures/web-first/svg-filter-turbulence-exclusion-srgb-transfer.svg @@ -0,0 +1,9 @@ + + + + + + + + + From 6087b2b2f87b9a1af9dc3026226eb35e5e8b6821 Mon Sep 17 00:00:00 2001 From: Universe Date: Thu, 27 Aug 2026 00:55:26 +0900 Subject: [PATCH 4/6] ci: retry hosted checks after Actions outage From 2e4bc08e627a2ca8325725ccae4bd70d122968a8 Mon Sep 17 00:00:00 2001 From: Universe Date: Thu, 27 Aug 2026 01:50:31 +0900 Subject: [PATCH 5/6] n0: initialize Skia before raster replay --- crates/n0/src/paint.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index b1e7bdf0..6789ecdf 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -3459,6 +3459,13 @@ fn text_path( /// [`crate::frame::FrameProduct::execute`], which refuses a context whose /// incarnation or resource revision differs from the one captured at build. pub fn execute_unchecked(canvas: &Canvas, list: &DrawList, view: &Affine, ctx: &PaintCtx) { + // Install Skia's runtime-selected raster pipeline before any drawlist + // replay. Without this initialization, x86 stays on the baseline SSE + // implementation while ARM enters the default NEON implementation. That + // changes the fused arithmetic used by procedural shaders such as Perlin + // noise and can move a boundary value across N32 quantization. + skia_safe::graphics::init(); + #[derive(Debug, Clone, Copy, PartialEq, Eq)] enum Scope { Opacity, From 65c12eff6611c8327531f3ea713118c88e84f206 Mon Sep 17 00:00:00 2001 From: Universe Date: Thu, 27 Aug 2026 02:31:27 +0900 Subject: [PATCH 6/6] docs: record hosted x86 turbulence proof --- crates/n0_cli/README.md | 9 ++++++-- docs/wg/consolidation/svg-engine-of-record.md | 21 +++++++++++++------ docs/wg/consolidation/web-checklist.md | 10 +++++++-- fixtures/web-first/README.md | 2 +- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 2341a2d7..d3f899f0 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -464,8 +464,13 @@ cargo run -p n0_cli --bin n0 -- \ distinctions. The first hosted-x86 run found 294 one-code-value pixels across eighteen sRGB displacement and four procedural cells. The displacement repair cleared all eighteen on the second run, which left 729 delta-1 pixels in four - procedural cells. The scoped arithmetic/quantization candidate is exact - across the current ARM corpus and awaits the next hosted-x86 confirmation. + procedural cells. Scoped procedural arithmetic cleared the 726-pixel blend + control on the third run, leaving three singleton direct-noise pixels. Pinned + Skia source located them in an uninitialized runtime raster-pipeline dispatch: + x86 stayed on baseline non-fused Perlin arithmetic while ARM used fused NEON. + Initializing Skia before drawlist replay selects the fused AVX2 path on x86. + The complete 700-cell gate is byte-exact on ARM and hosted x86 without a + tolerance. The same hosted workspace test covers the earlier two hundred forty-eight-cell estate; all three hundred thirty-nine Chromium-baked filter cells are exact on the current ARM host without a diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index 67d84c6c..7b4dd136 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -3521,13 +3521,22 @@ sRGB displacement cases and four procedural outputs, totalling 294 pixels, all at delta 1. Scoped exact displacement restore cleared all eighteen displacement failures on the second run. That run left four procedural cells and 729 pixels, all at delta 1: one pixel each in the default-color, linear-color, and stitched -controls, plus 726 pixels in the procedural blend. This isolates both the final -N32 quantization and the low-precision blend path as CPU-family boundaries, not -noise-formula or displacement-sampling disagreements. Explicit floating mode +controls, plus 726 pixels in the procedural blend. Explicit floating mode arithmetic, the direct-sRGB product exception above, and composed-result-only -half-up quantization keep all 700 ARM cells exact. The next hosted-x86 run is -pending; this paragraph records both failed runs and the candidate separately -rather than treating local architecture agreement as proof. +half-up quantization cleared the blend control on the third hosted run. Three +singleton delta-1 pixels remained: default-color and linear-color produced +`[203, 190, 203, 255]` where Chromium produced `[203, 189, 203, 255]`, and the +stitched control produced `[173, 159, 171, 255]` where Chromium produced +`[174, 159, 171, 255]`. + +Pinned Skia source located that last direct-noise split in process startup. +The painter had never initialized Skia's runtime-selected raster pipeline, so +hosted x86 retained the baseline non-fused Perlin path while ARM used its fused +NEON path. `skia_safe::graphics::init()` now runs before any drawlist replay; +on hosted x86 it selects the AVX2 pipeline whose fused multiply-add ordering +matches the admitted procedural values. The fourth hosted-x86 gate and the ARM +gate are byte-exact across all 700 cells. No tolerance or pixel exception was +introduced. Three focused rows join the refusal register, moving it from 140 to 143. The primitive corpus moves from 609 to 700 cells; the ten exact-time sampled frames diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index 16aa3413..221e72de 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -1542,8 +1542,14 @@ for attributes the platform ships ahead of the SVG 2 indexes. > later blend; carrying the earlier floating state silently changed 3,468 and > 3,700 pixels. Two committed chain controls now guard that transition. > Explicit procedural mode arithmetic and composed-result half-up quantization -> keep all 700 ARM cells exact; the next hosted-x86 run is the remaining -> portability proof. +> kept all 700 ARM cells exact. The third hosted-x86 run cleared the 726-pixel +> blend control and left three singleton delta-1 pixels: one each in the +> default-color, linear-color, and stitched procedural controls. Pinned Skia +> source located that final split in process startup: no caller initialized the +> runtime-selected raster pipeline, so hosted x86 retained baseline non-fused +> Perlin arithmetic while ARM used its fused NEON path. Initializing Skia before +> drawlist replay selects x86 AVX2's fused path as well. The fourth hosted-x86 +> gate and the ARM gate are byte-exact across all 700 cells, with no tolerance. - [ ] `` > **2026-08-25 split:** the static filter graph carries safe-kernel diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 12525cbe..160ccdfc 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -219,7 +219,7 @@ is exactly what the engine renders pixel-for-pixel. | `svg-filter-turbulence-blend-chain-{difference,exclusion}.svg` | A procedural sRGB blend computes with the selected arithmetic and then materializes before a later blend. These two full-canvas controls guard that second-blend byte-product transition; both are byte-exact. | | `svg-filter-displacement-{default,scale-zero,scale-positive,scale-negative,scale-fraction,scale-trailing-comma,scale-invalid,selector-default,selector-alpha,selector-red,selector-green,selector-blue,selector-axes,selector-grammar}.svg` | The complete static `feDisplacementMap` parameter grammar in fourteen cells: absent and explicit-zero scale, signed/fractional SVG numbers, the accepted trailing comma and invalid fallback, all four independently selected channels, and case-sensitive selector fallback to alpha. All fourteen are byte-exact. | | `svg-filter-displacement-{color-srgb,color-linear,primitive-units,transparent-map,half-alpha-map,map-region,source-alpha-map,source-rgb-map,generated-color,turbulence-map,turbulence-map-linear,region-percent,scale-transform,quarter-turn,use,viewbox,stroke,path,opacity,empty-generated,input-default-in2,input-unknown-in}.svg` · `svg-filter-turbulence-displacement-map.svg` | Two-input sampling and composition evidence: non-premultiplied map channels in both filter color spaces; Blink's horizontal object-box scale for both displacement axes; transparent, half-alpha, bounded, source, and generated maps; hard regions, safe mappings, ``, `viewBox`, stroke/path sources and opacity; default/unknown graph inputs; generated output over an empty target; and the procedural-noise-to-warp chain. All twenty-three are byte-exact. | -| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. A review-triggered eighteen-source matrix then isolated procedural-image arithmetic across blend, morphology, matrix, transfer, displacement, and both color-space directions: fifteen sources are admitted and exact after repair, while three reach older shadow/composition patrols. The old byte-image policy changed 349px/Δ1 for linear→sRGB blend, 490px/Δ6 for all-linear blend, 450px/Δ6 for sRGB→linear blend, 2,365px/Δ1 for sRGB→linear morphology, and 393px/Δ1 for blend→morphology. Four further sixteen-mode atlases prove the direct-sRGB byte-product versus promoted-floating split for procedural `difference` and `exclusion`; all sixty-four mode/space/alpha combinations are exact in both admissions. A thirty-four-source chain matrix around offset, blur, matrix, transfer, morphology, prior blend, displacement, merge, and composite admits thirty exact sources and routes four through the existing source-derived multi-input patrol. It also proves that an sRGB blend output materializes before a later blend. Eight hard-edged cells guard the affected product and chain branches. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five original rung cells fail, up to all 4,096 pixels and maximum channel delta 202. Restoring the pre-review procedural policy makes five operation-order cells fail. Replacing final half-up quantization with floor makes forty-one cells fail, up to 3,648px/Δ1, and replacing procedural multiply with normal makes five fail, up to 1,362px/Δ116. Forcing floating products breaks the two direct-sRGB route cells by 3,497 and 3,532 pixels; forcing byte products breaks the four promoted-route cells by 3,287–3,697 pixels. Carrying floating state across the sRGB blend-output boundary breaks the two chain cells by 3,468 and 3,700 pixels. Every restoration returns the complete 700-cell gate to green. The first hosted-x86 run found twenty-two rung cells and 294 pixels at Δ1: eighteen sRGB displacement cells plus four procedural outputs. Scoped exact displacement restore cleared the eighteen displacement failures on the second run, which left four procedural cells and 729 pixels at Δ1—726 in the blend control and one each in three direct procedural controls. Explicit procedural mode arithmetic and composed-result-only half-up quantization keep all 700 ARM cells exact; the next hosted rerun remains the portability proof. The corpus is now 700 cells plus 10 sampled frames, and the named register has 143 rows. | +| *(measured, not celled — turbulence/displacement split)* | Two twice-deterministic Chromium 149 matrices contain 164 sources, each rendered through both actual CLI admissions. All 156 admitted sources are exact and admission-identical; eight reach one of the three new stable names or an older blur/composition patrol. General rotation and shear are the new mapping boundary: turbulence differs by 3,173px/Δ7 and 3,110px/Δ6, while displacement differs by 280px/Δ13 and 360px/Δ18. A clipped displacement differs by 35px/Δ2. Axis maps, fractional translation/scale, reflection, and exact quarter turns are exact. Missing filter interpolation is linearRGB; `sRGB` changes both the procedural field and displacement sampling. Zero fractal octaves produce the neutral-half field while a negative count is transparent. Empty user-space targets still receive generated output, including with object-box primitive units; object-box filter units on the same empty target paint nothing. Seed-midpoint and tiny adjacent-frequency probes found no second source-number divergence class at this raster size. A review-triggered eighteen-source matrix then isolated procedural-image arithmetic across blend, morphology, matrix, transfer, displacement, and both color-space directions: fifteen sources are admitted and exact after repair, while three reach older shadow/composition patrols. The old byte-image policy changed 349px/Δ1 for linear→sRGB blend, 490px/Δ6 for all-linear blend, 450px/Δ6 for sRGB→linear blend, 2,365px/Δ1 for sRGB→linear morphology, and 393px/Δ1 for blend→morphology. Four further sixteen-mode atlases prove the direct-sRGB byte-product versus promoted-floating split for procedural `difference` and `exclusion`; all sixty-four mode/space/alpha combinations are exact in both admissions. A thirty-four-source chain matrix around offset, blur, matrix, transfer, morphology, prior blend, displacement, merge, and composite admits thirty exact sources and routes four through the existing source-derived multi-input patrol. It also proves that an sRGB blend output materializes before a later blend. Eight hard-edged cells guard the affected product and chain branches. Swapping turbulence with fractal noise and red displacement with alpha made fifty-five original rung cells fail, up to all 4,096 pixels and maximum channel delta 202. Restoring the pre-review procedural policy makes five operation-order cells fail. Replacing final half-up quantization with floor makes forty-one cells fail, up to 3,648px/Δ1, and replacing procedural multiply with normal makes five fail, up to 1,362px/Δ116. Forcing floating products breaks the two direct-sRGB route cells by 3,497 and 3,532 pixels; forcing byte products breaks the four promoted-route cells by 3,287–3,697 pixels. Carrying floating state across the sRGB blend-output boundary breaks the two chain cells by 3,468 and 3,700 pixels. Every restoration returns the complete 700-cell gate to green. The first hosted-x86 run found twenty-two rung cells and 294 pixels at Δ1: eighteen sRGB displacement cells plus four procedural outputs. Scoped exact displacement restore cleared the eighteen displacement failures on the second run, which left four procedural cells and 729 pixels at Δ1—726 in the blend control and one each in three direct procedural controls. Explicit procedural mode arithmetic and composed-result-only half-up quantization cleared the 726-pixel blend control on the third run, leaving three singleton direct-noise pixels. Pinned Skia source then located the final split in uninitialized runtime raster-pipeline dispatch: x86 retained baseline non-fused Perlin arithmetic while ARM used its fused NEON path. Initializing Skia before drawlist replay selects fused AVX2 arithmetic on hosted x86. The complete 700-cell gate is byte-exact on ARM and hosted x86 with no tolerance. The corpus is now 700 cells plus 10 sampled frames, and the named register has 143 rows. | | `svg-gradient-linear.svg` · `svg-gradient-linear-userspace.svg` · `svg-gradient-linear-bbox-offset.svg` | The gradient rung's base cells: the default objectBoundingBox ramp, the byte-identical userSpaceOnUse equivalent (the canary for the box-inverse fold), and a bbox-relative ramp on offset geometry. | | `svg-gradient-transform.svg` · `svg-gradient-css-transform.svg` | `gradientTransform` and an author `transform` declaration are one computed value — the attribute cell and the non-quarter CSS rotation cell (the discriminating measurement: the value applies about the raw origin of gradient space, both spellings). | | `svg-gradient-spread-reflect.svg` · `svg-gradient-spread-repeat.svg` · `svg-gradient-hard-stop.svg` · `svg-gradient-stop-nonmonotonic.svg` | The ramp grammar: both non-pad spread methods with their measured seams, equal-offset hard stops rendering crisp, and non-monotonic offsets clamping to the running maximum (never sorted). |