diff --git a/.github/workflows/consolidation-gates.yml b/.github/workflows/consolidation-gates.yml index 120f65a1..3f42414e 100644 --- a/.github/workflows/consolidation-gates.yml +++ b/.github/workflows/consolidation-gates.yml @@ -87,7 +87,7 @@ jobs: needs: scope if: needs.scope.outputs.engine == 'true' runs-on: ubuntu-24.04 - timeout-minutes: 30 + timeout-minutes: 45 steps: - name: Checkout head revision uses: actions/checkout@v4 diff --git a/crates/n0/src/drawlist.rs b/crates/n0/src/drawlist.rs index ac3504b8..76ba8ad2 100644 --- a/crates/n0/src/drawlist.rs +++ b/crates/n0/src/drawlist.rs @@ -125,6 +125,22 @@ pub(crate) enum ResolvedFilterConvolveEdgeMode { None, } +#[derive(Debug, Clone, Copy, PartialEq)] +pub(crate) enum ResolvedFilterLightSource { + Distant { + direction: [f32; 3], + }, + Point { + location: [f32; 3], + }, + Spot { + location: [f32; 3], + target: [f32; 3], + falloff_exponent: f32, + cutoff_angle: f32, + }, +} + /// The private filter-operation vocabulary admitted by the painter. #[derive(Debug, Clone, PartialEq)] pub(crate) enum ResolvedFilterPrimitive { @@ -189,6 +205,12 @@ pub(crate) enum ResolvedFilterPrimitive { edge_mode: ResolvedFilterConvolveEdgeMode, preserve_alpha: bool, }, + DiffuseLighting { + surface_scale: f32, + diffuse_constant: f32, + color: n0_model::model::Color, + light: ResolvedFilterLightSource, + }, Merge, } diff --git a/crates/n0/src/glyphless.rs b/crates/n0/src/glyphless.rs index bcd6c168..26e51327 100644 --- a/crates/n0/src/glyphless.rs +++ b/crates/n0/src/glyphless.rs @@ -24,7 +24,7 @@ use n0_model::model::{ use n0_model::path::ResolvedPathArtifact; use rframe::{ ClipPath, FilterBlend, FilterColorSpace, FilterComposite, FilterConvolveEdgeMode, - FilterDisplacementChannel, FilterInput, FilterMorphology, FilterPrimitive, + FilterDisplacementChannel, FilterInput, FilterLightSource, FilterMorphology, FilterPrimitive, FilterTurbulenceKind, Frame, FrameItem, Geometry, MaskMode, PaintStack, ScopeEffect, VisualRef, }; @@ -34,8 +34,8 @@ use crate::drawlist::{ ResolvedClipGeometryKind, ResolvedClipLayer, ResolvedClipPath, ResolvedFilter, ResolvedFilterBlend, ResolvedFilterColorSpace, ResolvedFilterComposite, ResolvedFilterConvolveEdgeMode, ResolvedFilterDisplacementChannel, ResolvedFilterInput, - ResolvedFilterMorphology, ResolvedFilterNode, ResolvedFilterPrimitive, - ResolvedFilterTurbulenceKind, ResolvedMaskMode, StrokeDashPhase, + ResolvedFilterLightSource, ResolvedFilterMorphology, ResolvedFilterNode, + ResolvedFilterPrimitive, ResolvedFilterTurbulenceKind, ResolvedMaskMode, StrokeDashPhase, }; use crate::frame::FrameExecutionError; use crate::paint::PaintCtx; @@ -1054,6 +1054,35 @@ fn compile_filter(filter: &rframe::Filter) -> ResolvedFilter { }, preserve_alpha, }, + FilterPrimitive::DiffuseLighting { + surface_scale, + diffuse_constant, + color, + light, + } => ResolvedFilterPrimitive::DiffuseLighting { + surface_scale, + diffuse_constant, + color: compile_color(color), + light: match light { + FilterLightSource::Distant { direction } => { + ResolvedFilterLightSource::Distant { direction } + } + FilterLightSource::Point { location } => { + ResolvedFilterLightSource::Point { location } + } + FilterLightSource::Spot { + location, + target, + falloff_exponent, + cutoff_angle, + } => ResolvedFilterLightSource::Spot { + location, + target, + falloff_exponent, + cutoff_angle, + }, + }, + }, FilterPrimitive::Merge => ResolvedFilterPrimitive::Merge, }, }) diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index bcb69078..85963eff 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -29,7 +29,7 @@ use skia_safe::{ image::CachingHint, path_effect::PathEffect, shaders, stroke_rec::InitStyle, Blender, Canvas, 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, + PaintStyle, Path, PathBuilder, PathDirection, PathFillType, PathOp, Point, Point3, RRect, Rect, SamplingOptions, Shader, StrokeRec, }; @@ -37,8 +37,9 @@ use crate::drawlist::{ DrawList, ItemKind, PostPaintOpacity, ResolvedClipGeometry, ResolvedClipGeometryKind, ResolvedClipLayer, ResolvedClipPath, ResolvedFilter, ResolvedFilterBlend, ResolvedFilterColorSpace, ResolvedFilterComposite, ResolvedFilterConvolveEdgeMode, - ResolvedFilterDisplacementChannel, ResolvedFilterInput, ResolvedFilterMorphology, - ResolvedFilterPrimitive, ResolvedFilterTurbulenceKind, ResolvedMaskMode, StrokeDashPhase, + ResolvedFilterDisplacementChannel, ResolvedFilterInput, ResolvedFilterLightSource, + ResolvedFilterMorphology, ResolvedFilterPrimitive, ResolvedFilterTurbulenceKind, + ResolvedMaskMode, StrokeDashPhase, }; /// The gradient family whose local matrix could not be represented by the @@ -2339,6 +2340,34 @@ fn sk_convolve_tile_mode(mode: ResolvedFilterConvolveEdgeMode) -> skia_safe::Til } } +fn sk_lighting_color(color: n0_model::model::Color, space: ResolvedFilterColorSpace) -> Color { + let argb = color.argb(); + let channel = |shift| ((argb >> shift) & 0xff_u32) as u8; + let to_linear_byte = |component: u8| { + let component = f32::from(component) / 255.0; + let linear = if component <= 0.04045 { + component / 12.92 + } else { + ((component + 0.055) / 1.055).powf(2.4) + }; + (linear * 255.0).round() as u8 + }; + let (r, g, b) = (channel(16), channel(8), channel(0)); + match space { + ResolvedFilterColorSpace::Srgb => Color::from_argb(u8::MAX, r, g, b), + ResolvedFilterColorSpace::LinearRgb => Color::from_argb( + u8::MAX, + to_linear_byte(r), + to_linear_byte(g), + to_linear_byte(b), + ), + } +} + +fn sk_point3(point: [f32; 3]) -> Point3 { + Point3::new(point[0], point[1], point[2]) +} + /// 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 { @@ -2419,6 +2448,7 @@ fn build_filter(filter: &ResolvedFilter) -> Result { ColorRestore::Floating }) } + ResolvedFilterPrimitive::DiffuseLighting { .. } => Some(ColorRestore::Default), ResolvedFilterPrimitive::SolidColor { .. } => None, _ => inherited_color_restore, }; @@ -2899,6 +2929,67 @@ fn build_filter(filter: &ResolvedFilter) -> Result { || node.color_space == ResolvedFilterColorSpace::Srgb, ) } + ResolvedFilterPrimitive::DiffuseLighting { + surface_scale, + diffuse_constant, + color, + light, + } => { + let input = inputs + .pop() + .expect("diffuse lighting has one checked input"); + procedural_provenance = false; + procedural_unorm8_blend = false; + let color = sk_lighting_color(color, node.color_space); + let filter = match light { + ResolvedFilterLightSource::Distant { direction } => { + skia_safe::image_filters::distant_lit_diffuse( + sk_point3(direction), + color, + surface_scale, + diffuse_constant, + input.image_filter, + crop, + ) + } + ResolvedFilterLightSource::Point { location } => { + skia_safe::image_filters::point_lit_diffuse( + sk_point3(location), + color, + surface_scale, + diffuse_constant, + input.image_filter, + crop, + ) + } + ResolvedFilterLightSource::Spot { + location, + target, + falloff_exponent, + cutoff_angle, + } => skia_safe::image_filters::spot_lit_diffuse( + sk_point3(location), + sk_point3(target), + falloff_exponent, + cutoff_angle, + color, + surface_scale, + diffuse_constant, + input.image_filter, + crop, + ), + } + .ok_or_else(|| { + "the backend could not construct a diffuse-lighting operation".to_string() + })?; + ( + Some(filter), + node.color_space, + input.source_dependent, + input.requires_exact_restore + || node.color_space == ResolvedFilterColorSpace::Srgb, + ) + } ResolvedFilterPrimitive::Merge => { let mut inputs = inputs.into_iter(); let image_filter = if let Some(first) = inputs.next() { @@ -3000,10 +3091,11 @@ mod filter_policy_tests { use std::sync::Arc; use n0_model::math::RectF; - use n0_model::model::Color32F; + use n0_model::model::{Color as ModelColor, Color32F}; use crate::drawlist::{ - ResolvedFilterConvolveEdgeMode, ResolvedFilterMorphology, ResolvedFilterNode, + ResolvedFilterConvolveEdgeMode, ResolvedFilterLightSource, ResolvedFilterMorphology, + ResolvedFilterNode, }; use super::{ @@ -3277,6 +3369,54 @@ mod filter_policy_tests { .expect("preserved alpha remains a checked native operation"); assert!(alpha_preserving.source_preflatten); } + + #[test] + fn every_checked_diffuse_light_kind_builds_with_its_color_space_policy() { + let lights = [ + ResolvedFilterLightSource::Distant { + direction: [0.5, -0.5, std::f32::consts::FRAC_1_SQRT_2], + }, + ResolvedFilterLightSource::Point { + location: [4.0, 8.0, 12.0], + }, + ResolvedFilterLightSource::Spot { + location: [2.0, 3.0, 8.0], + target: [7.0, 6.0, 0.0], + falloff_exponent: 8.0, + cutoff_angle: 35.0, + }, + ]; + for color_space in [ + ResolvedFilterColorSpace::Srgb, + ResolvedFilterColorSpace::LinearRgb, + ] { + for light in lights { + let filter = ResolvedFilter { + region: REGION, + nodes: Arc::from([ResolvedFilterNode { + inputs: Arc::from([ResolvedFilterInput::SourceAlpha]), + region: REGION, + color_space, + primitive: ResolvedFilterPrimitive::DiffuseLighting { + surface_scale: -2.0, + diffuse_constant: 0.75, + color: ModelColor(0xffff_b347), + light, + }, + }]), + may_paint_transparent_input: true, + source_is_transparent: false, + }; + let built = build_filter(&filter).expect("checked native diffuse light builds"); + assert!(!built.source_preflatten); + assert_eq!( + built.restore_blender.is_some(), + color_space == ResolvedFilterColorSpace::Srgb, + "sRGB lighting uses the architecture-neutral outer restore; gamma conversion ends it" + ); + } + } + } } /// Product-build preflight for a resolved image-filter graph. Replay repeats diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 993ea3bb..f367c3ec 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -259,8 +259,11 @@ cargo run -p n0_cli --bin n0 -- \ authored result names. Its current operations are `feGaussianBlur`, integer `feOffset`, zero-input `feFlood`, all seven `feComposite` operators, all sixteen two-input `feBlend` modes, ordered `feMerge`/`feMergeNode`, - native one-input `feDropShadow`, and one-input `feColorMatrix` and - `feComponentTransfer`, plus one-input `feMorphology`. Inputs + native one-input `feDropShadow`, one-input `feColorMatrix`, + `feComponentTransfer`, `feMorphology`, `feConvolveMatrix`, and + `feDiffuseLighting` with one direct `feDistantLight`, `fePointLight`, or + `feSpotLight` child, plus zero-input `feTurbulence` and two-input + `feDisplacementMap`. Inputs resolve to `SourceGraphic`, `SourceAlpha`, the previous result, or an earlier named result before the frame; unknown values follow Chromium's measured first/previous fallback. @@ -430,6 +433,36 @@ cargo run -p n0_cli --bin n0 -- \ accepted kernel-size strategy through 256 stay admitted. Representative fallback branches are celled; the wider invalid-spelling matrix is measured, not all separately celled. + Diffuse lighting consumes one input's alpha as a height field and carries one + already-resolved distant, point, or spot light. The first recognized direct + light child wins; non-light children are ignored, nested lights do not + participate, and no light produces transparent black. The operation's own + output is opaque across its primitive subregion, including opaque black at + zero diffuse constant. Missing input follows the established first/previous + graph fallback; SourceGraphic and SourceAlpha therefore give the same + illumination for the same source coverage. + `surfaceScale` and `diffuseConstant` carry signed SVG numbers with initial + one; an exactly empty attribute becomes zero, malformed nonempty text uses + the initial, surface height keeps its sign, and a negative diffuse constant + clamps to zero. Distant angles are signed and periodic. Point and spot + coordinates default independently to zero. Under object-box primitive units, + their x/y coordinates use the target axes and z uses the normalized diagonal. + Spot exponent defaults to one and clamps to 1–128. A missing, zero, or + out-of-range cone angle uses the measured 90-degree behavior; an in-range + negative angle equals its positive magnitude. + Direct `lighting-color` carries initial white, admitted sRGB forms, + `currentColor`, reset/invalid fallback, non-inheritance, and ignored authored + alpha. The light channels adapt to the selected filter color space; missing + interpolation is linearRGB and explicit sRGB differs. CSS lighting color, + explicit inheritance, `var()`, and wider color functions refuse by stable + name. General affine target mappings and diffuse output used as the + foreground of `feComposite` `in`/`atop` against a source-derived second input + have two further precision patrols. Axis maps, reflection, exact quarter + turns, other composite operators, blend/merge, neighboring one-input spatial + operations, regions, ``, `viewBox`, stroke and gradient alpha, and target + opacity/clip/mask are Chromium-baked exact. Chromium ignores sampled valid + and invalid `kernelUnitLength` spellings; two cells carry the diffuse drop, + while that shared row and `feSpecularLighting` remain open. 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 @@ -498,27 +531,34 @@ cargo run -p n0_cli --bin n0 -- \ Initializing Skia before drawlist replay selects the fused AVX2 path on x86. The 700-cell baseline is byte-exact on ARM and hosted x86 without a tolerance. The forty-one-cell convolution rung keeps the complete 741-cell - gate byte-exact on ARM and hosted x86 without a new tolerance. All three - hundred eighty Chromium-baked filter cells are exact on both hosts. + gate byte-exact on ARM and hosted x86 without a new tolerance. The + seventy-one-cell diffuse-lighting rung keeps the complete 812-cell gate + byte-exact without a new tolerance. All four hundred fifty-one + Chromium-baked filter cells are exact. 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, - 91 turbulence/displacement, and 41 convolution-rung cells. The complete corpus - contains 741 Chromium-baked cells plus 10 sampled frames, with 146 named + 91 turbulence/displacement, 41 convolution-rung, and 71 diffuse-lighting + cells. The complete corpus contains 812 Chromium-baked cells plus 10 sampled + frames, with 152 named refusal rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, - `feComponentTransfer`, `feBlend`, - `feMorphology`, `feConvolveMatrix`, `feTurbulence`, `feDisplacementMap`, + `feComponentTransfer`, `feBlend`, `feMorphology`, `feConvolveMatrix`, + `feDiffuseLighting`, `feDistantLight`, `fePointLight`, `feSpotLight`, + `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`, `bias`, `divisor`, `edgeMode`, `kernelMatrix`, - convolution `order`, `preserveAlpha`, `targetX`, and `targetY` close; - `feOffset`, `feGaussianBlur`, ``, + convolution `order`, `preserveAlpha`, `targetX`, `targetY`, `azimuth`, + `diffuseConstant`, `elevation`, `limitingConeAngle`, `pointsAtX`, + `pointsAtY`, `pointsAtZ`, and `surfaceScale` close; + `feOffset`, `feGaussianBlur`, `feSpecularLighting`, ``, `filter`, `color-interpolation-filters`, `in`, `in2`, `operator`, `result`, - `radius`, `kernelUnitLength`, `dx`, `dy`, `stdDeviation`, `flood-color`, and - `flood-opacity` remain open for the named precision, applicability, resource, - cascade, or value remainder. + `radius`, `kernelUnitLength`, `lighting-color`, `specularExponent`, `x`, `y`, + `z`, `dx`, `dy`, `stdDeviation`, `flood-color`, and `flood-opacity` 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 4d8a12cf..3c15ceba 100644 --- a/crates/rframe/src/filter.rs +++ b/crates/rframe/src/filter.rs @@ -8,7 +8,7 @@ use std::sync::Arc; -use cg::CGColor32F; +use cg::{CGColor, CGColor32F}; use math2::Rectangle; use math2::transform::AffineTransform; @@ -112,6 +112,27 @@ pub enum FilterConvolveEdgeMode { None, } +/// One already-resolved light source for a surface-lighting operation. +/// +/// Source angles and coordinate-unit conventions stop at the producer. The +/// contract carries the direction or three-dimensional points consumed by +/// the image operation, with no element or attribute vocabulary attached. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum FilterLightSource { + Distant { + direction: [f32; 3], + }, + Point { + location: [f32; 3], + }, + Spot { + location: [f32; 3], + target: [f32; 3], + falloff_exponent: f32, + cutoff_angle: f32, + }, +} + /// Four exact byte lookup tables for one non-premultiplied RGBA operation. /// /// Channel order is named at construction and access, so a producer cannot @@ -236,6 +257,15 @@ pub enum FilterPrimitive { edge_mode: FilterConvolveEdgeMode, preserve_alpha: bool, }, + /// Diffuse illumination derived from one input's alpha height field. + DiffuseLighting { + surface_scale: f32, + diffuse_constant: f32, + /// Opaque resolved sRGB light colour. A painter adapts its channels + /// to the operation's declared interpolation space. + color: CGColor, + light: FilterLightSource, + }, Merge, } @@ -329,6 +359,9 @@ pub enum FilterProgramError { InvalidConvolveMatrix { node: usize, }, + InvalidDiffuseLighting { + node: usize, + }, } impl std::fmt::Display for FilterProgramError { @@ -392,6 +425,10 @@ impl std::fmt::Display for FilterProgramError { f, "filter node {node} has an invalid convolution order, kernel, target, gain, or bias" ), + Self::InvalidDiffuseLighting { node } => write!( + f, + "filter node {node} has an invalid diffuse-light parameter, colour, or light source" + ), } } } @@ -418,7 +455,8 @@ impl FilterProgram { | FilterPrimitive::ColorMatrix { .. } | FilterPrimitive::ComponentTransfer { .. } | FilterPrimitive::Morphology { .. } - | FilterPrimitive::ConvolveMatrix { .. } => Some(1), + | FilterPrimitive::ConvolveMatrix { .. } + | FilterPrimitive::DiffuseLighting { .. } => Some(1), FilterPrimitive::SolidColor { .. } | FilterPrimitive::Turbulence { .. } => Some(0), FilterPrimitive::Composite { .. } | FilterPrimitive::Blend { .. } @@ -530,6 +568,19 @@ impl FilterProgram { { return Err(FilterProgramError::InvalidConvolveMatrix { node: index }); } + FilterPrimitive::DiffuseLighting { + surface_scale, + diffuse_constant, + color, + light, + } if !surface_scale.is_finite() + || !diffuse_constant.is_finite() + || diffuse_constant < 0.0 + || color.a() != u8::MAX + || !valid_light(light) => + { + return Err(FilterProgramError::InvalidDiffuseLighting { node: index }); + } FilterPrimitive::Offset { .. } | FilterPrimitive::SolidColor { .. } | FilterPrimitive::Composite { .. } @@ -541,6 +592,7 @@ impl FilterProgram { | FilterPrimitive::Turbulence { .. } | FilterPrimitive::DisplacementMap { .. } | FilterPrimitive::ConvolveMatrix { .. } + | FilterPrimitive::DiffuseLighting { .. } | FilterPrimitive::Merge => {} } } @@ -572,6 +624,7 @@ impl FilterProgram { preserve_alpha, .. } => !preserve_alpha && bias > 0.0, + FilterPrimitive::DiffuseLighting { .. } => true, FilterPrimitive::GaussianBlur { .. } | FilterPrimitive::Offset { .. } | FilterPrimitive::Composite { .. } @@ -584,6 +637,37 @@ impl FilterProgram { } } +fn valid_light(light: FilterLightSource) -> bool { + match light { + FilterLightSource::Distant { direction } => { + direction.into_iter().all(f32::is_finite) + && direction + .into_iter() + .all(|component| (-1.0..=1.0).contains(&component)) + && direction + .into_iter() + .map(|component| component * component) + .sum::() + > 0.0 + } + FilterLightSource::Point { location } => location.into_iter().all(f32::is_finite), + FilterLightSource::Spot { + location, + target, + falloff_exponent, + cutoff_angle, + } => { + location.into_iter().all(f32::is_finite) + && target.into_iter().all(f32::is_finite) + && falloff_exponent.is_finite() + && (1.0..=128.0).contains(&falloff_exponent) + && cutoff_angle.is_finite() + && cutoff_angle != 0.0 + && (-90.0..=90.0).contains(&cutoff_angle) + } + } +} + /// Why a checked program cannot be applied as one resolved filter effect. #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum FilterError { diff --git a/crates/rframe/src/lib.rs b/crates/rframe/src/lib.rs index 7a038f99..ba655af6 100644 --- a/crates/rframe/src/lib.rs +++ b/crates/rframe/src/lib.rs @@ -26,9 +26,9 @@ pub use clip::{ }; pub use filter::{ Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, - FilterConvolveEdgeMode, FilterDisplacementChannel, FilterError, FilterInput, FilterMorphology, - FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, FilterTurbulenceKind, - MAX_FILTER_CONVOLVE_KERNEL_VALUES, MAX_FILTER_NODES, + FilterConvolveEdgeMode, FilterDisplacementChannel, FilterError, FilterInput, FilterLightSource, + FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, + FilterTurbulenceKind, MAX_FILTER_CONVOLVE_KERNEL_VALUES, 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 8fec5d45..1e694be3 100644 --- a/crates/rframe/tests/filter_contract.rs +++ b/crates/rframe/tests/filter_contract.rs @@ -6,9 +6,9 @@ use math2::Rectangle; use math2::transform::AffineTransform; use rframe::{ Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, - FilterConvolveEdgeMode, FilterDisplacementChannel, FilterError, FilterInput, FilterMorphology, - FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, FilterTurbulenceKind, - MAX_FILTER_CONVOLVE_KERNEL_VALUES, MAX_FILTER_NODES, + FilterConvolveEdgeMode, FilterDisplacementChannel, FilterError, FilterInput, FilterLightSource, + FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, FilterProgramError, + FilterTurbulenceKind, MAX_FILTER_CONVOLVE_KERNEL_VALUES, MAX_FILTER_NODES, }; fn blur(input: FilterInput, sigma_x: f32, sigma_y: f32) -> FilterNode { @@ -734,6 +734,124 @@ fn convolution_has_one_input_and_a_bounded_finite_checked_kernel() { } } +#[test] +fn diffuse_lighting_has_one_input_and_a_checked_shared_light_source() { + let region = Rectangle::from_xywh(0.0, 0.0, 10.0, 10.0); + let lighting = |inputs: Arc<[FilterInput]>, surface_scale, diffuse_constant, color, light| { + FilterNode::new( + inputs, + region, + FilterColorSpace::LinearRgb, + FilterPrimitive::DiffuseLighting { + surface_scale, + diffuse_constant, + color, + light, + }, + ) + }; + let distant = FilterLightSource::Distant { + direction: [0.5, -0.5, std::f32::consts::FRAC_1_SQRT_2], + }; + + assert_eq!( + FilterProgram::new(Arc::from([lighting( + Arc::from([]), + 1.0, + 1.0, + cg::CGColor::WHITE, + distant, + )])), + Err(FilterProgramError::InvalidInputCount { + node: 0, + expected: 1, + actual: 0, + }) + ); + + for light in [ + distant, + FilterLightSource::Point { + location: [-4.0, 8.0, 12.0], + }, + FilterLightSource::Spot { + location: [2.0, 3.0, 8.0], + target: [7.0, 6.0, 0.0], + falloff_exponent: 128.0, + cutoff_angle: -35.0, + }, + ] { + let program = FilterProgram::new(Arc::from([lighting( + Arc::from([FilterInput::SourceAlpha]), + -3.0, + 0.0, + cg::CGColor::from_rgb(0x25, 0x63, 0xeb), + light, + )])) + .expect("a finite diffuse operation with any resolved light kind is admitted"); + assert!(program.may_paint_transparent_input()); + } + + for node in [ + lighting( + Arc::from([FilterInput::Source]), + f32::INFINITY, + 1.0, + cg::CGColor::WHITE, + distant, + ), + lighting( + Arc::from([FilterInput::Source]), + 1.0, + -1.0, + cg::CGColor::WHITE, + distant, + ), + lighting( + Arc::from([FilterInput::Source]), + 1.0, + 1.0, + cg::CGColor::from_rgba(255, 255, 255, 128), + distant, + ), + lighting( + Arc::from([FilterInput::Source]), + 1.0, + 1.0, + cg::CGColor::WHITE, + FilterLightSource::Distant { + direction: [0.0, 0.0, 0.0], + }, + ), + lighting( + Arc::from([FilterInput::Source]), + 1.0, + 1.0, + cg::CGColor::WHITE, + FilterLightSource::Point { + location: [0.0, f32::NAN, 0.0], + }, + ), + lighting( + Arc::from([FilterInput::Source]), + 1.0, + 1.0, + cg::CGColor::WHITE, + FilterLightSource::Spot { + location: [0.0, 0.0, 1.0], + target: [0.0, 0.0, 0.0], + falloff_exponent: 129.0, + cutoff_angle: 0.0, + }, + ), + ] { + assert_eq!( + FilterProgram::new(Arc::from([node])), + Err(FilterProgramError::InvalidDiffuseLighting { node: 0 }) + ); + } +} + #[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); diff --git a/crates/websem/src/svg.rs b/crates/websem/src/svg.rs index 6495107f..c2124cb6 100644 --- a/crates/websem/src/svg.rs +++ b/crates/websem/src/svg.rs @@ -137,7 +137,7 @@ use math2::transform::AffineTransform; use rframe::{ ClipGeometry, ClipLayer, ClipPath, FillRule, Filter, FilterBlend, FilterChannelTables, FilterColorSpace, FilterComposite, FilterConvolveEdgeMode, FilterDisplacementChannel, - FilterInput, FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, + FilterInput, FilterLightSource, FilterMorphology, FilterNode, FilterPrimitive, FilterProgram, FilterTurbulenceKind, Frame, FrameItem, FrameItems, FrameItemsError, FrameNode, Geometry, Identity, MAX_FILTER_CONVOLVE_KERNEL_VALUES, Mask, MaskMode, PaintAlphaFactor, PaintStack, PathData, Provenance, Scope, ScopeEffect, ScopeOpacity, Stroke, StrokeCap, StrokeDash, @@ -4941,6 +4941,209 @@ mod filter_resource { }) } + /// One lighting-family SVGAnimatedNumber value as Chromium 149 exposes + /// it. An exactly empty attribute is the animated-number zero; ASCII + /// whitespace-only and every other malformed spelling use the field's + /// initial value. + fn lighting_number(element: HtmlElement<'_>, name: &str, initial: f32) -> f32 { + if get_attr(element, name).as_deref() == Some("") { + 0.0 + } else { + svg_number(element, name, initial) + } + } + + fn patrol_lighting_style(element: HtmlElement<'_>, owner: &str) -> Result<(), CompileError> { + let Some(style) = get_attr(element, "style") else { + return Ok(()); + }; + if style.contains('\\') { + return Err(CompileError::UnsupportedFilter(format!( + "inline style on <{owner}> contains a CSS escape; property identity cannot be proven by the direct decoder" + ))); + } + if css_declares_property(&style, "lighting-color") { + return Err(CompileError::UnsupportedFilter(format!( + "CSS lighting-color on <{owner}> is not represented by the pinned cascade; its direct presentation attribute is a separate ingress" + ))); + } + Ok(()) + } + + fn lighting_color(element: HtmlElement<'_>, owner: &str) -> Result { + let absolute = match get_attr(element, "lighting-color") { + None => AbsoluteColor::WHITE, + Some(raw) => { + let lowered = raw.to_ascii_lowercase(); + let trimmed = trim_svg_whitespace(&lowered); + if lowered.contains("var(") { + return Err(CompileError::UnsupportedFilter(format!( + "{owner} lighting-color resolves through var(), whose substitution is not represented at this Stylo pin" + ))); + } + if trimmed == "inherit" { + return Err(CompileError::UnsupportedFilter(format!( + "{owner} lighting-color uses inherit, which needs the unavailable cascaded lighting-color longhand" + ))); + } + if matches!(trimmed, "initial" | "unset" | "revert" | "revert-layer") { + AbsoluteColor::WHITE + } else { + match parse_color_attribute(&raw) { + Some(ParsedColorAttribute::Absolute(color)) => color, + Some(ParsedColorAttribute::CurrentColor) => element + .borrow_data() + .map(|data| data.styles.primary().clone_color()) + .unwrap_or(AbsoluteColor::WHITE), + Some(ParsedColorAttribute::BeyondSlice(reason)) => { + return Err(CompileError::UnsupportedFilter(format!( + "{owner} lighting-color is outside the admitted color slice: {reason}" + ))); + } + // An invalid presentation hint contributes initial white. + None => AbsoluteColor::WHITE, + } + } + } + }; + let color = admitted_srgb(absolute, 1.0).map_err(|reason| { + CompileError::UnsupportedFilter(format!( + "{owner} lighting-color is outside the admitted color slice: {reason}" + )) + })?; + // Blink adapts only RGB into the operation space. Authored color + // alpha has no effect on either lighting primitive. + Ok(CGColor::from_rgb(color.r(), color.g(), color.b())) + } + + fn lighting_point( + element: HtmlElement<'_>, + units: Units, + target_box: Rectangle, + x_name: &str, + y_name: &str, + z_name: &str, + ) -> [f32; 3] { + let x = lighting_number(element, x_name, 0.0); + let y = lighting_number(element, y_name, 0.0); + let z = lighting_number(element, z_name, 0.0); + match units { + Units::UserSpaceOnUse => [x, y, z], + Units::ObjectBoundingBox => { + // Blink's Resolve3dPoint uses the normalized diagonal for Z, + // with this exact float operation order. + let z_basis = ((target_box.width * target_box.width + + target_box.height * target_box.height) + / 2.0) + .sqrt(); + [ + target_box.x + x * target_box.width, + target_box.y + y * target_box.height, + z * z_basis, + ] + } + } + } + + fn diffuse_light_source( + primitive: HtmlElement<'_>, + primitive_units: Units, + target_box: Rectangle, + override_skips: &HashMap, + ) -> Result, CompileError> { + let mut child = primitive.first_element_child(); + while let Some(candidate) = child { + child = candidate.next_element_sibling(); + let tag = candidate.local_name_string(); + if !matches!( + tag.as_str(), + "feDistantLight" | "fePointLight" | "feSpotLight" + ) { + continue; + } + if let Some(reason) = override_skips.get(&candidate.node_id()) { + return Err(CompileError::UnsupportedFilter(format!( + "the <{tag}> authored state is overridden at document load: {reason}" + ))); + } + let light = match tag.as_str() { + "feDistantLight" => { + let radians = |degrees: f32| degrees * (std::f32::consts::PI / 180.0); + let azimuth = radians(lighting_number(candidate, "azimuth", 0.0)); + let elevation = radians(lighting_number(candidate, "elevation", 0.0)); + FilterLightSource::Distant { + direction: [ + azimuth.cos() * elevation.cos(), + azimuth.sin() * elevation.cos(), + elevation.sin(), + ], + } + } + "fePointLight" => FilterLightSource::Point { + location: lighting_point(candidate, primitive_units, target_box, "x", "y", "z"), + }, + "feSpotLight" => { + let limiting_cone_angle = lighting_number(candidate, "limitingConeAngle", 0.0); + FilterLightSource::Spot { + location: lighting_point( + candidate, + primitive_units, + target_box, + "x", + "y", + "z", + ), + target: lighting_point( + candidate, + primitive_units, + target_box, + "pointsAtX", + "pointsAtY", + "pointsAtZ", + ), + falloff_exponent: lighting_number(candidate, "specularExponent", 1.0) + .clamp(1.0, 128.0), + cutoff_angle: if limiting_cone_angle == 0.0 + || !(-90.0..=90.0).contains(&limiting_cone_angle) + { + 90.0 + } else { + limiting_cone_angle + }, + } + } + _ => unreachable!("recognized light tag"), + }; + let finite = match light { + FilterLightSource::Distant { direction } => { + direction.into_iter().all(f32::is_finite) + } + FilterLightSource::Point { location } => location.into_iter().all(f32::is_finite), + FilterLightSource::Spot { + location, + target, + falloff_exponent, + cutoff_angle, + } => { + location.into_iter().all(f32::is_finite) + && target.into_iter().all(f32::is_finite) + && falloff_exponent.is_finite() + && cutoff_angle.is_finite() + } + }; + if !finite { + // Chromium's native lighting builder contributes transparent + // black when a finite authored number overflows during + // object-box point resolution. State that image explicitly; + // never let a backend construction failure become an + // unfiltered fallback. + return Ok(None); + } + return Ok(Some(light)); + } + Ok(None) + } + fn composite_operator(element: HtmlElement<'_>) -> FilterComposite { match get_attr(element, "operator") .as_deref() @@ -5790,6 +5993,15 @@ mod filter_resource { axis_or_quarter_turn && [a, b, c, d].into_iter().all(f32::is_finite) } + /// Native lighting agrees for translations, axis maps, reflections, and + /// exact quarter turns. General rotations and shears change the pinned + /// backend's mapped height-field sampling by observable channel values. + fn diffuse_lighting_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 { @@ -6056,6 +6268,35 @@ mod filter_resource { ), } } + "feDiffuseLighting" => { + patrol_color_style(element)?; + patrol_lighting_style(element, "feDiffuseLighting")?; + match diffuse_light_source( + element, + primitive_units, + target_box, + override_skips, + )? { + Some(light) => ( + vec![resolve_input(element, "in", previous, &names)], + FilterPrimitive::DiffuseLighting { + surface_scale: lighting_number(element, "surfaceScale", 1.0), + diffuse_constant: lighting_number(element, "diffuseConstant", 1.0) + .max(0.0), + color: lighting_color(element, "feDiffuseLighting")?, + light, + }, + ), + // A lighting primitive without one recognized direct + // light child contributes transparent black. + None => ( + Vec::new(), + FilterPrimitive::SolidColor { + color: CGColor32F::TRANSPARENT, + }, + ), + } + } "feMerge" => { patrol_color_style(element)?; let mut inputs = Vec::new(); @@ -6197,9 +6438,12 @@ mod filter_resource { let mut has_turbulence = false; let mut has_displacement_map = false; let mut has_convolve_matrix = false; + let mut has_diffuse_lighting = false; + let mut has_diffuse_lighting_composition_boundary = false; let mut has_source_dependent_morphology = false; let mut has_source_dependent_active_morphology = false; let mut has_source_dependent_convolve_matrix = false; + let mut lighting_dependencies = Vec::with_capacity(nodes.len()); for node in &nodes { let source_dependent = node.inputs().iter().any(|input| match *input { FilterInput::Source | FilterInput::SourceAlpha => true, @@ -6237,7 +6481,30 @@ mod filter_resource { has_convolve_matrix = true; has_source_dependent_convolve_matrix |= source_dependent; } + let lighting_dependent = + matches!(node.primitive(), FilterPrimitive::DiffuseLighting { .. }) + || node.inputs().iter().any(|input| match *input { + FilterInput::Source | FilterInput::SourceAlpha => false, + FilterInput::Node(index) => lighting_dependencies[index], + }); + has_diffuse_lighting |= + matches!(node.primitive(), FilterPrimitive::DiffuseLighting { .. }); + if matches!( + node.primitive(), + FilterPrimitive::Composite { + operator: FilterComposite::In | FilterComposite::Atop + } + ) && node.inputs().first().is_some_and(|input| match *input { + FilterInput::Source | FilterInput::SourceAlpha => false, + FilterInput::Node(index) => lighting_dependencies[index], + }) && node.inputs().get(1).is_some_and(|input| match *input { + FilterInput::Source | FilterInput::SourceAlpha => true, + FilterInput::Node(index) => source_dependencies[index], + }) { + has_diffuse_lighting_composition_boundary = true; + } source_dependencies.push(source_dependent); + lighting_dependencies.push(lighting_dependent); } if has_blend { if !blend_mapping_is_admitted(target_to_frame) { @@ -6283,6 +6550,18 @@ mod filter_resource { .to_string(), )); } + if has_diffuse_lighting && !diffuse_lighting_mapping_is_admitted(target_to_frame) { + return Err(CompileError::UnsupportedFilter( + "feDiffuseLighting's target mapping crosses the pinned-backend lighting-filter transform precision boundary" + .to_string(), + )); + } + if has_diffuse_lighting_composition_boundary { + return Err(CompileError::UnsupportedFilter( + "feDiffuseLighting as the foreground of feComposite in/atop against a source-derived second input crosses the pinned-backend lighting-composition precision boundary" + .to_string(), + )); + } if has_source_dependent_convolve_matrix && filter_source_has_paint_server(target)? { return Err(CompileError::UnsupportedFilter( "feConvolveMatrix's source image crosses the pinned-backend convolution-filter paint-server precision boundary" diff --git a/crates/websem/tests/unsupported_corpus.rs b/crates/websem/tests/unsupported_corpus.rs index b73977ff..28a39252 100644 --- a/crates/websem/tests/unsupported_corpus.rs +++ b/crates/websem/tests/unsupported_corpus.rs @@ -200,6 +200,16 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "displacement-filter transform precision boundary", ), + ( + "svg-filter-diffuse-composition-precision", + DeclaredByBestEffort, + "lighting-composition precision boundary", + ), + ( + "svg-filter-diffuse-transform-precision", + DeclaredByBestEffort, + "lighting-filter transform precision boundary", + ), ( "svg-filter-effect-stack-precision", DeclaredByBestEffort, @@ -237,6 +247,26 @@ const CORPUS: &[(&str, Departure, &str)] = &[ "small-kernel precision boundary", ), ("svg-filter-href", DeclaredByBestEffort, "href inheritance"), + ( + "svg-filter-lighting-color-css", + DeclaredByBestEffort, + "CSS lighting-color", + ), + ( + "svg-filter-lighting-color-inherit", + DeclaredByBestEffort, + "lighting-color uses inherit", + ), + ( + "svg-filter-lighting-color-syntax", + DeclaredByBestEffort, + "lighting-color is outside the admitted color slice", + ), + ( + "svg-filter-lighting-color-var", + DeclaredByBestEffort, + "lighting-color resolves through var()", + ), ( "svg-filter-list", DeclaredByBestEffort, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index 7433f9e0..03b7a21c 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -67,9 +67,9 @@ 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` and `feConvolveMatrix`, plus zero-input `feTurbulence` and - two-input - `feDisplacementMap`; graph inputs resolve from + `feMorphology`, `feConvolveMatrix`, and `feDiffuseLighting` with one direct + `feDistantLight`, `fePointLight`, or `feSpotLight` child, 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; @@ -77,14 +77,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 741 Chromium-baked primitive cells plus 10 sampled frames. +- **The corpus** is 812 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 146 rows. + register has 152 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 @@ -3658,3 +3658,110 @@ primitive corpus moves from 700 to 741 cells; the ten exact-time sampled frames are unchanged. Exactly nine checklist rows tick: the element and eight attributes named above. This records no conformance score and takes no FLIP action. + +## Rung: `feDiffuseLighting` and the light-source family (2026-08-27) + +The verdict is CLOSE/SPLIT. ``, ``, +``, and `` close for their complete static +Chromium behavior. Eight element-specific attribute rows close with them: +`azimuth`, `diffuseConstant`, `elevation`, `limitingConeAngle`, `pointsAtX`, +`pointsAtY`, `pointsAtZ`, and `surfaceScale`. The shared `x`, `y`, `z`, +`specularExponent`, `kernelUnitLength`, `lighting-color`, `in`, `result`, +primitive-region, color-space, filter-resource, and dynamics rows remain open +for their wider applicability or independently named value/cascade remainder. +`` remains unsupported; no CSS property row closes. + +Chromium 149.0.7827.55 establishes diffuse illumination from one input image's +alpha field. Missing `in` follows the established first/previous graph rule, +and SourceGraphic and SourceAlpha are identical because source RGB does not +enter the operation. The result is opaque throughout its primitive subregion, +including opaque black where the diffuse coefficient is zero; a primitive +without a recognized direct light child instead contributes transparent +black. Non-light children are skipped, nested lights do not participate, and +the first recognized direct `feDistantLight`, `fePointLight`, or `feSpotLight` +child wins. + +`surfaceScale` and `diffuseConstant` carry one signed SVG number with initial +one. For this animated-number family an exactly empty attribute becomes zero, +while whitespace-only and malformed text use the initial; leading plus, +exponent, and the measured trailing-comma prefix are accepted. +`surfaceScale` remains signed. A negative diffuse constant clamps to zero. +The three light-source coordinates and the three spot targets carry the same +one-number grammar with initial zero. Distant azimuth and elevation are signed +and periodic. Spot exponent defaults to one and clamps to the inclusive +1–128 range; its shared attribute row stays open because the same name also +applies to specular lighting. A missing or zero cone angle, or one outside the +inclusive -90–90 range, selects the backend's 90-degree behavior. Within that +range a negative angle is pixel-identical to its positive magnitude. A spot +whose position equals its target retains Chromium's native degenerate result. + +User-space point coordinates pass through directly. Under object-box primitive +units, x and y map against the target box's independent axes and z maps against +the normalized diagonal, `sqrt((width² + height²) / 2)`. Spot positions and +targets use that same three-dimensional map. Exact controls cover non-square +boxes, negative coordinates, non-uniform `viewBox` mapping, axis transforms, +reflection, exact quarter turns, ``, stroke geometry, gradient alpha, and +target opacity, clip, and mask. A finite authored object-box coordinate whose +mapping overflows produces Chromium's transparent operation result rather than +an unfiltered fallback; that boundary is committed exact. + +The direct `lighting-color` subset has initial white, is not inherited by +default, admits the established sRGB color forms and `currentColor`, treats an +invalid or reset spelling as the initial, and ignores authored color alpha +while retaining its RGB channels. Missing filter interpolation equals +linearRGB; explicit sRGB is visibly distinct. The operation adapts the light +channels into that selected space before illumination. Explicit inheritance, +CSS-authored `lighting-color`, custom-property substitution, and wider color +functions are all honored by Chromium and now refuse by four focused stable +names. Those independently listed cascade, custom-property, and color-family +gaps—plus the still-open specular applicability—keep the `lighting-color` +presentation-attribute row open. The CSS property twin is unavailable in the +pinned Servo-mode cascade, and no matcher is added around it. + +Current Chromium ignores every sampled `kernelUnitLength` spelling on diffuse +lighting: positive one- and two-axis numbers, fractions, zero, negative, +malformed text, units, percentages, CSS math, custom properties, and CSS-wide +keywords all leave a discriminating surface unchanged. The same drop reproduced +on sampled specular-lighting controls. Two diffuse cells commit a valid and an +invalid drop, but `kernelUnitLength` remains open until the specular primitive +itself is admitted. This follows the browser-drop precedent established by +[gridaco/nothing#77](https://github.com/gridaco/nothing/pull/77). + +The numeric crux was measured instead of inferred. Source decimals around the +binary32 midpoint, adjacent finite extrema, subnormals, underflow, parser +overflow fallback, and huge signed angles all reproduce Chromium through the +shared ordered SVG-number evaluator. At this 64×64 amplification, the midpoint +witness and both adjacent controls happen to be pixel-identical, so no new +numeric patrol was invented from a non-discriminating raster. This is a +negative probe verdict, not a proof that no larger raster can expose another +alias (measured, not celled). + +Two silent backend classes remain and are now named. General target rotation +changed 551 pixels at maximum channel delta 15, a shear changed 543 at delta +12, and a sampled affine map changed 624 at delta 12. Translation, arbitrary +sampled axis maps, reflection, and exact quarter turns are exact. Separately, +using diffuse lighting as the foreground of `feComposite` `in` or `atop` +against a source-derived second input changed 69 pixels at maximum delta 180. +The other composite operators, arithmetic composition, blend, merge, +generated-background composition, lighting in the second input, and adjacent +one-input spatial operations are exact. Two focused refusal fixtures guard +those boundaries in strict and best-effort admission (measured, not celled). + +Six twice-deterministic scratch matrices exercised 236 sources across grammar, +light selection, operation semantics, color, units, graph composition, +transforms, extremes, and `kernelUnitLength`. Every candidate rendered through +the actual command path. After the named patrols, 217 candidates are +pixel-exact and admission-identical; the remaining 19 reach one of the new or +already-established stable names. Seventy-one cells entered only through +`just add`; all are Chromium-baked and exact without a tolerance. + +Gate sensitivity was proved by temporarily halving the resolved diffuse +coefficient in the painter. `just gate` rejected 61 of the new cells, with up +to all 4,096 pixels changed and maximum channel delta 128. Restoring the +coefficient returned the complete 812-cell gate to green. + +Six focused rows join the refusal register, moving it from 146 to 152. The +primitive corpus moves from 741 to 812 cells; the ten exact-time sampled frames +are unchanged. Exactly twelve checklist rows tick: the four elements and eight +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 2fd1843f..07e9edba 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -654,9 +654,9 @@ excluded. > separate unresolved operation grammar. Authored declarations are therefore > quarantined by name rather than matched by a second cascade. The other four > filter-effect properties are Gecko-only at this Stylo pin and also remain -> open. The direct `feFlood` attribute route now carries an admitted subset, -> but it does not create a CSS computed-value route and does not change these -> property rows. +> open. The direct `feFlood` and `feDiffuseLighting` attribute routes now carry +> admitted subsets, but neither creates a CSS computed-value route or changes +> these property rows. ### Compositing and blending @@ -1468,9 +1468,9 @@ for attributes the platform ships ahead of the SVG 2 indexes. > up to 2,814 pixels and maximum channel delta 250; restoration returns the > gate to green. The shared graph, region, interpolation, filter-resource, and > dynamics rows remain open. -- [ ] `` +- [x] `` - [x] `` -- [ ] `` +- [x] `` - [x] `` - [x] `` - [x] `` @@ -1520,9 +1520,24 @@ for attributes the platform ships ahead of the SVG 2 indexes. > zero radius and later color-space conversion retain their prior paths. The > complete 609-cell gate is exact on ARM and hosted x86 without tolerance. - [ ] `` -- [ ] `` +- [x] `` - [ ] `` -- [ ] `` +- [x] `` + +> **2026-08-27 close/split:** `feDiffuseLighting` reads one input alpha field +> and closes with all three direct light kinds. The first recognized direct +> light child wins; non-light children are skipped, nested lights do not +> participate, and no light produces transparent black. Exact cells cover +> distant, point, and spot illumination; opaque output alpha; signed surface +> height; object-box x/y/normalized-diagonal-z mapping; both filter color +> spaces; graph inputs; hard regions; ``, `viewBox`, stroke and gradient +> alpha; target effects; safe transforms; and neighboring filter operations. +> General affine mappings and one narrow `feComposite` foreground placement +> refuse by stable precision names. Seventy-one exact cells move the complete +> gate to 812. Halving the diffuse coefficient makes sixty-one of them fail, +> up to all 4,096 pixels and maximum channel delta 128; restoration returns +> the gate to green. `feSpecularLighting` remains open behind the advanced +> transactional primitive witness. - [ ] `` - [x] `` @@ -1808,6 +1823,16 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `image-rendering` - [ ] `letter-spacing` - [ ] `lighting-color` + +> **2026-08-27 split:** direct `lighting-color` on admitted diffuse lighting +> carries initial white, the admitted sRGB color subset, `currentColor`, reset +> and invalid fallback, non-inheritance, and Chromium's rule that light-color +> alpha is ignored. Missing filter interpolation is linearRGB and explicit +> sRGB remains distinct. Explicit inheritance, CSS ingress, `var()`, and wider +> color functions refuse by four stable names under their independently +> listed rows. The presentation-attribute row also applies to the still-open +> specular primitive, so it does not tick; its CSS property twin is absent at +> the pinned cascade and stays separately open. - [ ] `marker-end` - [ ] `marker-mid` - [ ] `marker-start` @@ -1926,7 +1951,7 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `aria-valuenow` - [ ] `aria-valuetext` - [ ] `autofocus` -- [ ] `azimuth` +- [x] `azimuth` - [x] `baseFrequency` > **2026-08-26 close:** `baseFrequency` applies only to `feTurbulence` and @@ -1955,7 +1980,7 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `crossorigin` - [ ] `data-*` - [ ] `decoding` -- [ ] `diffuseConstant` +- [x] `diffuseConstant` - [x] `divisor` - [ ] `download` - [ ] `dx` @@ -1967,7 +1992,7 @@ for attributes the platform ships ahead of the SVG 2 indexes. > invalid spelling select `duplicate`. The attribute's other listed > applicability is blur, where current Chromium drops all spellings; one > committed drop cell records that browser behavior. -- [ ] `elevation` +- [x] `elevation` - [x] `exponent` - [ ] `fetchpriority` - [x] `filterUnits` @@ -2006,12 +2031,13 @@ for attributes the platform ships ahead of the SVG 2 indexes. > Missing, malformed, non-finite, or wrong-count matrices produce the measured > transparent result. Kernels at the measured native strategy boundaries—28, > 29, 64, 65, and 256 coefficients—are exact; 257 coefficients produce the -> celled Chromium drop. `kernelUnitLength` stays open: Chromium ignores every -> sampled valid and invalid spelling on convolution, while the attribute also -> applies to the still-open lighting primitives. +> celled Chromium drop. Current Chromium also ignores every sampled valid and +> invalid spelling on diffuse lighting, with valid and invalid drop cells, and +> sampled specular controls reproduce that result. `kernelUnitLength` stays +> open until the specular primitive itself is admitted. - [ ] `lang` - [ ] `lengthAdjust` -- [ ] `limitingConeAngle` +- [x] `limitingConeAngle` - [ ] `markerHeight` - [ ] `markerUnits` - [ ] `markerWidth` @@ -2136,9 +2162,9 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `ping` - [ ] `playbackorder` - [ ] `points` -- [ ] `pointsAtX` -- [ ] `pointsAtY` -- [ ] `pointsAtZ` +- [x] `pointsAtX` +- [x] `pointsAtY` +- [x] `pointsAtZ` - [x] `preserveAlpha` > **2026-08-27 close:** the complete case-sensitive `false | true` grammar is @@ -2186,7 +2212,22 @@ for attributes the platform ships ahead of the SVG 2 indexes. > invalid, wrong-case, whitespace-padded, and CSS-wide spellings select the > initial `noStitch`; stitched fractional primitive regions are Chromium-baked. - [ ] `style` -- [ ] `surfaceScale` +- [x] `surfaceScale` + +> **2026-08-27 close/split:** the eight diffuse/light-only attributes tick at +> their complete signed SVG-number behavior. `surfaceScale` and +> `diffuseConstant` have initial one; an exactly empty attribute becomes zero, +> while whitespace-only or malformed text takes the initial. Surface height +> keeps its sign and a negative diffuse constant clamps to zero. Azimuth and +> elevation are signed and periodic. Spot targets default independently to +> zero. `limitingConeAngle` uses the measured 90-degree behavior when missing, +> zero, or outside ±90; a negative in-range angle equals its positive +> magnitude. Leading plus, exponent, trailing-comma prefix, finite extremes, +> underflow, and overflow fallback were measured across the family. The wider +> invalid-spelling matrix is measured, not all separately celled. Shared +> `x`/`y`/`z` remain open for their other element applicability, and +> `specularExponent` remains open for `feSpecularLighting` even though the spot +> light's initial one and inclusive 1–128 clamp are carried. - [ ] `systemLanguage` - [ ] `tabindex` - [x] `tableValues` diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 8651abaf..61abdf2f 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -226,6 +226,11 @@ is exactly what the engine renders pixel-for-pixel. | `svg-filter-convolve-{source-alpha,source-alpha-preserve,color-default,color-auto,color-linear,color-srgb,primitive-units,region-crop,input-previous,result-reuse,generated-input,blur-before,morphology-after}.svg` | Alpha, color, graph, and operation evidence: convolved versus preserved SourceAlpha, default linearRGB and explicit `auto`/sRGB/linearRGB, object-box units, hard crops, previous and named result routing, generated input, and ordering around blur and morphology. All thirteen are byte-exact. | | `svg-filter-convolve-{source-path,source-stroke,source-group,use,viewbox,axis-fractional,quarter-turn,target-opacity,target-clip,target-mask}.svg` | Source and composition evidence: direct path, stroke, and group images; `` and non-uniform `viewBox`; safe fractional axis mapping and exact quarter turn; and filter ordering with target opacity, geometric clip, and mask. The binary-mask control is byte-identical to explicit filter-then-mask nesting, differs from the reversed order by 75 pixels at maximum channel delta 99, and differs from no mask by 444 pixels at maximum delta 204. All ten are byte-exact. | | *(measured, not celled — convolution split)* | Four twice-deterministic Chromium 149 matrices probed grammar, operation semantics, numeric and native-strategy boundaries, source classes, transforms, graph routing, and effect order. Every candidate also rendered through both actual CLI admissions; process success was never treated as pixel proof. After the three patrols below, every admitted candidate is exact and admission-identical. Current Chromium ignores every sampled valid and invalid `kernelUnitLength` spelling. The amplified coefficient `1.000000059604644775390625000000000000000000000001` selects the upper adjacent binary32 value; the shared ordered source-number route is exact. The default divisor uses ordered binary32 summation. General target rotation and shear differ by 462px/Δ15 and 632px/Δ13; source-dependent linear/radial gradient fills and a gradient stroke differ by 1,425px/Δ7, 1,658px/Δ7, and 609px/Δ7. A valid divisor of `1e-45` has a non-finite reciprocal in the resolved arithmetic domain and refuses by its own narrow name. Axis maps, fractional translation/scale, reflection, exact quarter turns, generated input, accepted kernels through 256, ordered sum overflow, and large finite bias are exact. Removing kernel reversal made eleven cells fail: the dedicated witness changed 230px/Δ202, and failures reached 2,814px with maximum Δ250. Restoration returned the complete 741-cell gate to green. The corpus is now 741 cells plus 10 sampled frames, the filter estate has 380 cells, and the named register has 146 rows. | +| `svg-filter-diffuse-{distant,distant-angle-default,distant-angle-large,distant-azimuth-negative,distant-elevation-negative,point,point-x-negative,point-y-negative,point-z-negative,spot,spot-target-x,spot-target-y,spot-target-z,spot-exponent-default,spot-exponent-lower-clamp,spot-exponent-upper-clamp,spot-cone-default,spot-cone-active,spot-cone-negative,spot-cone-outside,spot-degenerate,missing-light,child-order,nested-light,nonlight-child}.svg` | Light selection and the complete element-specific light grammar: all three light kinds, signed/large distant angles, independent signed point and spot coordinates, spot exponent clamping, cone behavior, the degenerate spot, first-direct-child selection, skipped non-light children, ignored nesting, and transparent output without a light. All twenty-five are byte-exact. | +| `svg-filter-diffuse-{constant-default,constant-empty-zero,constant-zero,constant-negative-clamp,constant-number-plus,constant-number-exponent,surface-default,surface-empty-zero,surface-zero,surface-negative,surface-number-plus,surface-number-exponent,surface-max,object-box-overflow}.svg` | Diffuse scalar and extreme arithmetic evidence: initial versus exact-empty zero, explicit zero, signed surface height, non-negative diffuse coefficient, leading-plus/exponent grammar, maximum finite height, and the transparent result when a finite object-box point overflows during mapping. All fourteen are byte-exact. | +| `svg-filter-diffuse-{light-color-default,light-color-rgb,light-color-alpha-ignored,light-color-currentcolor,light-color-srgb-function,light-color-invalid,light-color-transparent,color-linear,color-srgb,input-default,input-source-alpha,input-source-graphic,output-alpha,region-percent,point-primitive-units,spot-primitive-units,viewbox}.svg` | Color, input, output, region, and three-dimensional unit evidence: initial/reset/invalid color, sRGB spellings, `currentColor`, ignored color alpha, distinct filter color spaces, first-input fallback, alpha-only lighting, opaque result alpha, hard percentage crops, axis/normalized-diagonal object-box mapping for point and spot lights, and non-uniform `viewBox`. All seventeen are byte-exact. | +| `svg-filter-diffuse-{use,stroke,gradient-alpha,target-opacity,target-clip,target-mask,transform-axis,transform-reflection,transform-quarter-turn,blur-after,blur-before,convolve-before,composite-out,kernel-unit-length-drop,kernel-unit-length-invalid-drop}.svg` | Source, effect-order, safe-mapping, graph, and browser-drop evidence: ``, stroke and paint-server alpha, outer opacity/clip/mask, axis maps/reflection/quarter turns, both blur orders, convolution input, an exact diffuse/composite placement, and valid/invalid `kernelUnitLength` spellings that current Chromium ignores. All fifteen are byte-exact. | +| *(measured, not celled — diffuse-lighting split)* | Six twice-deterministic Chromium 149 matrices contain 236 sources. Every candidate also rendered through both actual CLI admissions; 217 are exact and admission-identical, and the other nineteen reach a new or older stable refusal, with zero silent mismatches. SourceGraphic and SourceAlpha are identical because only alpha is lit; the raw result is opaque across its primitive region, while zero diffuse constant is opaque black and no light is transparent. Object-box z uses `sqrt((w²+h²)/2)`, not either axis. Current Chromium ignores all fifteen sampled diffuse `kernelUnitLength` spellings and all three sampled specular controls. General rotation differs by 551px/Δ15, shear by 543px/Δ12, and a sampled affine map by 624px/Δ12; axis maps, reflection, and exact quarter turns are exact. Diffuse output as the foreground of composite `in`/`atop` against a source-derived second input differs by 69px/Δ180; the other composite/blend/merge/generated-background and one-input operation placements are exact. Midpoint-adjacent source-number controls are pixel-identical at this raster, so no numeric refusal was invented. CSS lighting color, explicit inheritance, `var()`, and wider color syntax remain four guarded value/cascade gaps. Halving the painter's diffuse coefficient made sixty-one new cells fail, up to all 4,096 pixels and Δ128; restoration returned the complete 812-cell gate to green. The corpus is now 812 cells plus 10 sampled frames, the filter estate has 451 cells, and the named register has 152 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 7cab58df..949ff529 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 (741) +## Chromium-baked cells (812) Each renders byte-exact against its committed Chromium oracle (seven curved cells and four gradient ramps carry a declared, bounded @@ -258,6 +258,77 @@ to its fixture source. No new image is committed for this view. svg-filter-convolve-target-y svg-filter-convolve-use svg-filter-convolve-viewbox +svg-filter-diffuse-blur-after +svg-filter-diffuse-blur-before +svg-filter-diffuse-child-order +svg-filter-diffuse-color-linear +svg-filter-diffuse-color-srgb +svg-filter-diffuse-composite-out +svg-filter-diffuse-constant-default +svg-filter-diffuse-constant-empty-zero +svg-filter-diffuse-constant-negative-clamp +svg-filter-diffuse-constant-number-exponent +svg-filter-diffuse-constant-number-plus +svg-filter-diffuse-constant-zero +svg-filter-diffuse-convolve-before +svg-filter-diffuse-distant +svg-filter-diffuse-distant-angle-default +svg-filter-diffuse-distant-angle-large +svg-filter-diffuse-distant-azimuth-negative +svg-filter-diffuse-distant-elevation-negative +svg-filter-diffuse-gradient-alpha +svg-filter-diffuse-input-default +svg-filter-diffuse-input-source-alpha +svg-filter-diffuse-input-source-graphic +svg-filter-diffuse-kernel-unit-length-drop +svg-filter-diffuse-kernel-unit-length-invalid-drop +svg-filter-diffuse-light-color-alpha-ignored +svg-filter-diffuse-light-color-currentcolor +svg-filter-diffuse-light-color-default +svg-filter-diffuse-light-color-invalid +svg-filter-diffuse-light-color-rgb +svg-filter-diffuse-light-color-srgb-function +svg-filter-diffuse-light-color-transparent +svg-filter-diffuse-missing-light +svg-filter-diffuse-nested-light +svg-filter-diffuse-nonlight-child +svg-filter-diffuse-object-box-overflow +svg-filter-diffuse-output-alpha +svg-filter-diffuse-point +svg-filter-diffuse-point-primitive-units +svg-filter-diffuse-point-x-negative +svg-filter-diffuse-point-y-negative +svg-filter-diffuse-point-z-negative +svg-filter-diffuse-region-percent +svg-filter-diffuse-spot +svg-filter-diffuse-spot-cone-active +svg-filter-diffuse-spot-cone-default +svg-filter-diffuse-spot-cone-negative +svg-filter-diffuse-spot-cone-outside +svg-filter-diffuse-spot-degenerate +svg-filter-diffuse-spot-exponent-default +svg-filter-diffuse-spot-exponent-lower-clamp +svg-filter-diffuse-spot-exponent-upper-clamp +svg-filter-diffuse-spot-primitive-units +svg-filter-diffuse-spot-target-x +svg-filter-diffuse-spot-target-y +svg-filter-diffuse-spot-target-z +svg-filter-diffuse-stroke +svg-filter-diffuse-surface-default +svg-filter-diffuse-surface-empty-zero +svg-filter-diffuse-surface-max +svg-filter-diffuse-surface-negative +svg-filter-diffuse-surface-number-exponent +svg-filter-diffuse-surface-number-plus +svg-filter-diffuse-surface-zero +svg-filter-diffuse-target-clip +svg-filter-diffuse-target-mask +svg-filter-diffuse-target-opacity +svg-filter-diffuse-transform-axis +svg-filter-diffuse-transform-quarter-turn +svg-filter-diffuse-transform-reflection +svg-filter-diffuse-use +svg-filter-diffuse-viewbox svg-filter-displacement-color-linear svg-filter-displacement-color-srgb svg-filter-displacement-default @@ -770,7 +841,7 @@ to its fixture source. No new image is committed for this view. svg-visibility-rule-beats-attribute svg-visibility-unhide -## The refusal register (146) +## The refusal register (152) What the slice refuses, by name, in the compiler's own words — **both refuse** is a document-level contract; **declared** renders @@ -809,6 +880,8 @@ its row into the cells above. | `svg-filter-convolve-transform-precision` | declared | skipped svg/g[1]: unsupported SVG filter: feConvolveMatrix's target mapping crosses the pinned-backend convolution-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-diffuse-composition-precision` | declared | skipped svg/g[1]: unsupported SVG filter: feDiffuseLighting as the foreground of feComposite in/atop against a source-derived second input crosses the pinned-backend lighting-composition precision boundary | +| `svg-filter-diffuse-transform-precision` | declared | skipped svg/g[1]: unsupported SVG filter: feDiffuseLighting's target mapping crosses the pinned-backend lighting-filter transform precision boundary | | `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 | @@ -823,6 +896,10 @@ its row into the cells above. | `svg-filter-flood-opacity-calc` | declared | skipped svg/rect[2]: unsupported SVG filter: feFlood flood-opacity is a CSS function this build cannot evaluate without a computation context | | `svg-filter-flood-var` | declared | skipped svg/rect[2]: unsupported SVG filter: feFlood flood-color resolves through var(), whose substitution is not represented at this Stylo pin | | `svg-filter-href` | declared | skipped svg/rect[2]: unsupported SVG filter: href inheritance is not yet resolved | +| `svg-filter-lighting-color-css` | declared | skipped svg/rect[1]: unsupported SVG filter: CSS lighting-color on is not represented by the pinned cascade; its direct presentation attribute is a separate ingress | +| `svg-filter-lighting-color-inherit` | declared | skipped svg/rect[1]: unsupported SVG filter: feDiffuseLighting lighting-color uses inherit, which needs the unavailable cascaded lighting-color longhand | +| `svg-filter-lighting-color-syntax` | declared | skipped svg/rect[1]: unsupported SVG filter: feDiffuseLighting lighting-color is outside the admitted color slice: color space Lab is not yet gated against Chromium | +| `svg-filter-lighting-color-var` | declared | skipped svg/rect[1]: unsupported SVG filter: feDiffuseLighting lighting-color resolves through var(), whose substitution is not represented at this Stylo pin | | `svg-filter-list` | declared | skipped svg/rect[2]: unsupported SVG filter: filter presentation attribute uses multiple filter operations | | `svg-filter-list-quoted` | declared | skipped svg/rect[2]: unsupported SVG filter: filter presentation attribute uses multiple filter operations | | `svg-filter-morphology-filled-ellipse-precision` | declared | skipped svg/circle[1]: unsupported SVG filter: feMorphology's active source image crosses the retained filled-ellipse coverage boundary | @@ -831,7 +908,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 | diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-blur-after.png b/fixtures/web-first/chromium/svg-filter-diffuse-blur-after.png new file mode 100644 index 00000000..0a8770ea Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-blur-after.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-blur-before.png b/fixtures/web-first/chromium/svg-filter-diffuse-blur-before.png new file mode 100644 index 00000000..6077b1d7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-blur-before.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-child-order.png b/fixtures/web-first/chromium/svg-filter-diffuse-child-order.png new file mode 100644 index 00000000..8284570d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-child-order.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-color-linear.png b/fixtures/web-first/chromium/svg-filter-diffuse-color-linear.png new file mode 100644 index 00000000..44eff443 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-color-linear.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-color-srgb.png b/fixtures/web-first/chromium/svg-filter-diffuse-color-srgb.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-color-srgb.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-composite-out.png b/fixtures/web-first/chromium/svg-filter-diffuse-composite-out.png new file mode 100644 index 00000000..a17a2c6b Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-composite-out.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-default.png new file mode 100644 index 00000000..a1468a51 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-empty-zero.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-empty-zero.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-empty-zero.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-negative-clamp.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-negative-clamp.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-negative-clamp.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-exponent.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-exponent.png new file mode 100644 index 00000000..6a2a5362 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-exponent.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-plus.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-plus.png new file mode 100644 index 00000000..6a2a5362 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-number-plus.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-constant-zero.png b/fixtures/web-first/chromium/svg-filter-diffuse-constant-zero.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-constant-zero.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-convolve-before.png b/fixtures/web-first/chromium/svg-filter-diffuse-convolve-before.png new file mode 100644 index 00000000..f85c1360 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-convolve-before.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-default.png new file mode 100644 index 00000000..b53a8e2b Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-large.png b/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-large.png new file mode 100644 index 00000000..4f4b0a23 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-distant-angle-large.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-distant-azimuth-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-distant-azimuth-negative.png new file mode 100644 index 00000000..a1468a51 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-distant-azimuth-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-distant-elevation-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-distant-elevation-negative.png new file mode 100644 index 00000000..f6b0bfef Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-distant-elevation-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-distant.png b/fixtures/web-first/chromium/svg-filter-diffuse-distant.png new file mode 100644 index 00000000..a1468a51 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-distant.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-gradient-alpha.png b/fixtures/web-first/chromium/svg-filter-diffuse-gradient-alpha.png new file mode 100644 index 00000000..b830cb1e Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-gradient-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-input-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-input-default.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-input-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-input-source-alpha.png b/fixtures/web-first/chromium/svg-filter-diffuse-input-source-alpha.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-input-source-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-input-source-graphic.png b/fixtures/web-first/chromium/svg-filter-diffuse-input-source-graphic.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-input-source-graphic.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-drop.png b/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-drop.png new file mode 100644 index 00000000..ce7a0529 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-drop.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-invalid-drop.png b/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-invalid-drop.png new file mode 100644 index 00000000..ce7a0529 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-kernel-unit-length-invalid-drop.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-alpha-ignored.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-alpha-ignored.png new file mode 100644 index 00000000..94924fbc Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-alpha-ignored.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-currentcolor.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-currentcolor.png new file mode 100644 index 00000000..94924fbc Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-currentcolor.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-default.png new file mode 100644 index 00000000..2277b46a Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-invalid.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-invalid.png new file mode 100644 index 00000000..2277b46a Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-invalid.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-rgb.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-rgb.png new file mode 100644 index 00000000..94924fbc Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-rgb.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-srgb-function.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-srgb-function.png new file mode 100644 index 00000000..94924fbc Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-srgb-function.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-light-color-transparent.png b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-transparent.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-light-color-transparent.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-missing-light.png b/fixtures/web-first/chromium/svg-filter-diffuse-missing-light.png new file mode 100644 index 00000000..e2fc51d9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-missing-light.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-nested-light.png b/fixtures/web-first/chromium/svg-filter-diffuse-nested-light.png new file mode 100644 index 00000000..e2fc51d9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-nested-light.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-nonlight-child.png b/fixtures/web-first/chromium/svg-filter-diffuse-nonlight-child.png new file mode 100644 index 00000000..a1468a51 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-nonlight-child.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-object-box-overflow.png b/fixtures/web-first/chromium/svg-filter-diffuse-object-box-overflow.png new file mode 100644 index 00000000..e2fc51d9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-object-box-overflow.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-output-alpha.png b/fixtures/web-first/chromium/svg-filter-diffuse-output-alpha.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-output-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-point-primitive-units.png b/fixtures/web-first/chromium/svg-filter-diffuse-point-primitive-units.png new file mode 100644 index 00000000..5a9c6231 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-point-primitive-units.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-point-x-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-point-x-negative.png new file mode 100644 index 00000000..43e5c629 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-point-x-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-point-y-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-point-y-negative.png new file mode 100644 index 00000000..a9d188d8 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-point-y-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-point-z-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-point-z-negative.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-point-z-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-point.png b/fixtures/web-first/chromium/svg-filter-diffuse-point.png new file mode 100644 index 00000000..8284570d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-point.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-region-percent.png b/fixtures/web-first/chromium/svg-filter-diffuse-region-percent.png new file mode 100644 index 00000000..d796168f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-region-percent.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-active.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-active.png new file mode 100644 index 00000000..60765580 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-active.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-default.png new file mode 100644 index 00000000..9838cce9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-negative.png new file mode 100644 index 00000000..60765580 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-outside.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-outside.png new file mode 100644 index 00000000..9838cce9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-cone-outside.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-degenerate.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-degenerate.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-degenerate.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-default.png new file mode 100644 index 00000000..e4bc1718 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-lower-clamp.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-lower-clamp.png new file mode 100644 index 00000000..e4bc1718 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-lower-clamp.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-upper-clamp.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-upper-clamp.png new file mode 100644 index 00000000..c9140e61 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-exponent-upper-clamp.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-primitive-units.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-primitive-units.png new file mode 100644 index 00000000..1ed509c2 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-primitive-units.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-x.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-x.png new file mode 100644 index 00000000..372bbadc Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-x.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-y.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-y.png new file mode 100644 index 00000000..46bedbab Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-y.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-z.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-z.png new file mode 100644 index 00000000..b9c777a2 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot-target-z.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-spot.png b/fixtures/web-first/chromium/svg-filter-diffuse-spot.png new file mode 100644 index 00000000..6a79eae5 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-spot.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-stroke.png b/fixtures/web-first/chromium/svg-filter-diffuse-stroke.png new file mode 100644 index 00000000..5d5b8d33 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-default.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-default.png new file mode 100644 index 00000000..bab649bf Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-default.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-empty-zero.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-empty-zero.png new file mode 100644 index 00000000..f26440c7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-empty-zero.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-max.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-max.png new file mode 100644 index 00000000..c34a74a7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-max.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-negative.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-negative.png new file mode 100644 index 00000000..7ec61f02 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-negative.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-exponent.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-exponent.png new file mode 100644 index 00000000..ba28994a Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-exponent.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-plus.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-plus.png new file mode 100644 index 00000000..ba28994a Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-number-plus.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-surface-zero.png b/fixtures/web-first/chromium/svg-filter-diffuse-surface-zero.png new file mode 100644 index 00000000..f26440c7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-surface-zero.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-target-clip.png b/fixtures/web-first/chromium/svg-filter-diffuse-target-clip.png new file mode 100644 index 00000000..d796168f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-target-clip.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-target-mask.png b/fixtures/web-first/chromium/svg-filter-diffuse-target-mask.png new file mode 100644 index 00000000..d796168f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-target-mask.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-target-opacity.png b/fixtures/web-first/chromium/svg-filter-diffuse-target-opacity.png new file mode 100644 index 00000000..76463323 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-target-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-transform-axis.png b/fixtures/web-first/chromium/svg-filter-diffuse-transform-axis.png new file mode 100644 index 00000000..df94d315 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-transform-axis.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-transform-quarter-turn.png b/fixtures/web-first/chromium/svg-filter-diffuse-transform-quarter-turn.png new file mode 100644 index 00000000..f0882387 Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-transform-quarter-turn.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-transform-reflection.png b/fixtures/web-first/chromium/svg-filter-diffuse-transform-reflection.png new file mode 100644 index 00000000..4c2d310f Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-transform-reflection.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-use.png b/fixtures/web-first/chromium/svg-filter-diffuse-use.png new file mode 100644 index 00000000..fb45e94d Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-use.png differ diff --git a/fixtures/web-first/chromium/svg-filter-diffuse-viewbox.png b/fixtures/web-first/chromium/svg-filter-diffuse-viewbox.png new file mode 100644 index 00000000..d9dea61b Binary files /dev/null and b/fixtures/web-first/chromium/svg-filter-diffuse-viewbox.png differ diff --git a/fixtures/web-first/oracle-bake.json b/fixtures/web-first/oracle-bake.json index 7fc50f13..a21e0a86 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": "bcd80bb032ccac6bfbbc380eb04958eda717b886001dd5d378d01e2fc579d920", + "suite_sha256": "7b182ef872ad3dfe4c4baa3a0c07cba9cc7be7fa9acd891d61d7030044ea3125", "capture": { "device_scale_factor": 1, "omit_background": true, @@ -2089,6 +2089,645 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-diffuse-blur-after", + "source": "svg-filter-diffuse-blur-after.svg", + "source_sha256": "ef793e0837ae5d301db16f27e89b735412971383ab388a1df7df2e01797eebf6", + "oracle": "chromium/svg-filter-diffuse-blur-after.png", + "oracle_sha256": "5389a7f594270adc08aa6778bc6c76174b4d68d126fef6c1a2472368bda06946", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-blur-before", + "source": "svg-filter-diffuse-blur-before.svg", + "source_sha256": "4492aa630b91b30a09dd5bfcf4498e043fe49d86085fca792a24a66bcce2a476", + "oracle": "chromium/svg-filter-diffuse-blur-before.png", + "oracle_sha256": "89aa3a6e87751efe8ebebde6344e489ca7f0c92927cb52ab195cb61d988b804e", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-child-order", + "source": "svg-filter-diffuse-child-order.svg", + "source_sha256": "c135f0f5eafdc404e0c7fbf1c7b87b716d8fc5c73e463baec7b37452657b89c0", + "oracle": "chromium/svg-filter-diffuse-child-order.png", + "oracle_sha256": "0b9aac38072571d0e534eb6e006bc9ed9151935b307d33ada04f2bf24cef69e0", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-color-linear", + "source": "svg-filter-diffuse-color-linear.svg", + "source_sha256": "3919f6ac61734c8eb07a459984e64c18167ba6fd3846836ffe521f2abbfc0389", + "oracle": "chromium/svg-filter-diffuse-color-linear.png", + "oracle_sha256": "76c3d26e506273ca5f490fddedbe0eb7c918becc46c7f435b00dabdbc0a1c435", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-color-srgb", + "source": "svg-filter-diffuse-color-srgb.svg", + "source_sha256": "8715f27796cbee00e9f9ea43706767a4a79737477aded7b9108c140eb782592b", + "oracle": "chromium/svg-filter-diffuse-color-srgb.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-composite-out", + "source": "svg-filter-diffuse-composite-out.svg", + "source_sha256": "599eecf523505f5b5f57bafda04d6564d3eac5952366ebe0644e0f83bd4f5523", + "oracle": "chromium/svg-filter-diffuse-composite-out.png", + "oracle_sha256": "00d6ecb881fb87c3f5e92cb679d084327854e0b4b0a432662b002309fd0d7f9f", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-default", + "source": "svg-filter-diffuse-constant-default.svg", + "source_sha256": "4c4d4e155f3028796be8298707388b6e9e0004e8c50af7680ce8869853470d26", + "oracle": "chromium/svg-filter-diffuse-constant-default.png", + "oracle_sha256": "cbe16b23e4a27fae30bf415785bd94a54c24bf430b0062f74e4f9036c3acfe88", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-empty-zero", + "source": "svg-filter-diffuse-constant-empty-zero.svg", + "source_sha256": "49f47e3c8096c21526e4ab9b636c478ed6ddffea91bbe41e826c66fd57966f19", + "oracle": "chromium/svg-filter-diffuse-constant-empty-zero.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-negative-clamp", + "source": "svg-filter-diffuse-constant-negative-clamp.svg", + "source_sha256": "22cae486fa67be26fd33a620122a91c00665de9a1147a4fba824afd4c114ce63", + "oracle": "chromium/svg-filter-diffuse-constant-negative-clamp.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-number-exponent", + "source": "svg-filter-diffuse-constant-number-exponent.svg", + "source_sha256": "62d5e953e793b4fe3905bdea7ab9f66e8ac88a0f67e406f95ca326d6f8cc28d4", + "oracle": "chromium/svg-filter-diffuse-constant-number-exponent.png", + "oracle_sha256": "51056c288f81f9f640d962374f57eeb95d99950923dd57b05ef6207592ff0b6f", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-number-plus", + "source": "svg-filter-diffuse-constant-number-plus.svg", + "source_sha256": "8cf1664f26fb6c9861940914116973feab293b0d83c651f4b581577e09a46c5c", + "oracle": "chromium/svg-filter-diffuse-constant-number-plus.png", + "oracle_sha256": "51056c288f81f9f640d962374f57eeb95d99950923dd57b05ef6207592ff0b6f", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-zero", + "source": "svg-filter-diffuse-constant-zero.svg", + "source_sha256": "b087fd4ee9997d74cee7972baf8905535ecd502acec9ab5a50ce964ccc74f80a", + "oracle": "chromium/svg-filter-diffuse-constant-zero.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-convolve-before", + "source": "svg-filter-diffuse-convolve-before.svg", + "source_sha256": "0c382ef1e273757bf6a0253ff220dd557f7abc10b3dbd00ff2197686a85ab7cd", + "oracle": "chromium/svg-filter-diffuse-convolve-before.png", + "oracle_sha256": "d6b0eb4e725a82e63d413e1f965cdeae5aba6a55a995db59d14e6c5e6e1bf307", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant", + "source": "svg-filter-diffuse-distant.svg", + "source_sha256": "ef825f97ff9f2a39c20188969244cc6a8cefcf11cd5bb62d4760ad7163f4f1e0", + "oracle": "chromium/svg-filter-diffuse-distant.png", + "oracle_sha256": "cbe16b23e4a27fae30bf415785bd94a54c24bf430b0062f74e4f9036c3acfe88", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-angle-default", + "source": "svg-filter-diffuse-distant-angle-default.svg", + "source_sha256": "720862338a2cebdcf2086af7ca8eaa8ef9c753a8fef0d74feefc65c40b173653", + "oracle": "chromium/svg-filter-diffuse-distant-angle-default.png", + "oracle_sha256": "443ba0c9ae79142152732370a787f27ae2acddcc08d2b1a5ec0e21664da921e4", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-angle-large", + "source": "svg-filter-diffuse-distant-angle-large.svg", + "source_sha256": "bf027465e985d734d319d94a5afe3075359f41c8cc80750eb485d3757fd34a90", + "oracle": "chromium/svg-filter-diffuse-distant-angle-large.png", + "oracle_sha256": "5455b8b21c1913da0f328b8dc1a10ba097d12e1ae6345304c048c66ecb14c8f4", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-azimuth-negative", + "source": "svg-filter-diffuse-distant-azimuth-negative.svg", + "source_sha256": "bf6dd07c89d53f543f980755b5968ffe6e898715717d4896588bb1d4d730c7af", + "oracle": "chromium/svg-filter-diffuse-distant-azimuth-negative.png", + "oracle_sha256": "cbe16b23e4a27fae30bf415785bd94a54c24bf430b0062f74e4f9036c3acfe88", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-elevation-negative", + "source": "svg-filter-diffuse-distant-elevation-negative.svg", + "source_sha256": "edc2da2f2e49b9190b5270cdf8ced89fc880b6b76cc8f59dc14fe3e6e547ad27", + "oracle": "chromium/svg-filter-diffuse-distant-elevation-negative.png", + "oracle_sha256": "1cb775d43a8c84f7d8b08ea9582f6a16a1eb0da2fc0507d50c075af059a3cf53", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-gradient-alpha", + "source": "svg-filter-diffuse-gradient-alpha.svg", + "source_sha256": "242fede6ea6f676c307ab38089a6c535413e38ae9f8dc838aa98c011e258b2c7", + "oracle": "chromium/svg-filter-diffuse-gradient-alpha.png", + "oracle_sha256": "95ffd19abb79d4e3787b295d1a7a45e74a831c5c7ea9e10819c3c16ae53a5b7e", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-default", + "source": "svg-filter-diffuse-input-default.svg", + "source_sha256": "640637e96eccd1b1127c3b71cc4cba74ff89034086005c7bbddfdd059ce2c144", + "oracle": "chromium/svg-filter-diffuse-input-default.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-source-alpha", + "source": "svg-filter-diffuse-input-source-alpha.svg", + "source_sha256": "8715f27796cbee00e9f9ea43706767a4a79737477aded7b9108c140eb782592b", + "oracle": "chromium/svg-filter-diffuse-input-source-alpha.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-source-graphic", + "source": "svg-filter-diffuse-input-source-graphic.svg", + "source_sha256": "2b588d6c8e8117014234cd8f1505a6a052b946fa3d97e6c5ac3c2698862a0f98", + "oracle": "chromium/svg-filter-diffuse-input-source-graphic.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-kernel-unit-length-drop", + "source": "svg-filter-diffuse-kernel-unit-length-drop.svg", + "source_sha256": "7ce12fb0e7db83130f76e638725a48f3e8e955e8fe5b16f027e676f3ff86ff96", + "oracle": "chromium/svg-filter-diffuse-kernel-unit-length-drop.png", + "oracle_sha256": "bf18ea1c584ed3fbe11eff81ecf6383f6fff14fd9cbbd6b1ab8b6daf242d3e99", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-kernel-unit-length-invalid-drop", + "source": "svg-filter-diffuse-kernel-unit-length-invalid-drop.svg", + "source_sha256": "1ef04f32076c628474795812dd093e87b85eb57eaacccff0728716eaae51f504", + "oracle": "chromium/svg-filter-diffuse-kernel-unit-length-invalid-drop.png", + "oracle_sha256": "bf18ea1c584ed3fbe11eff81ecf6383f6fff14fd9cbbd6b1ab8b6daf242d3e99", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-alpha-ignored", + "source": "svg-filter-diffuse-light-color-alpha-ignored.svg", + "source_sha256": "d58e75224c41256a8e4a99976397791ea717771583c38fc6b0eec541b0047360", + "oracle": "chromium/svg-filter-diffuse-light-color-alpha-ignored.png", + "oracle_sha256": "29d7fb1983da08103157438a6a1f2291b4bc965395e6b19a0b19cc9a6171c8a7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-currentcolor", + "source": "svg-filter-diffuse-light-color-currentcolor.svg", + "source_sha256": "85f9acb144ed0f224a0d175a93932c0bcac9969ec801a76bd51ed371aab31596", + "oracle": "chromium/svg-filter-diffuse-light-color-currentcolor.png", + "oracle_sha256": "29d7fb1983da08103157438a6a1f2291b4bc965395e6b19a0b19cc9a6171c8a7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-default", + "source": "svg-filter-diffuse-light-color-default.svg", + "source_sha256": "4195dffeed4a1142c3da489869e58c44337681773f0873a95d1e7372c7567e84", + "oracle": "chromium/svg-filter-diffuse-light-color-default.png", + "oracle_sha256": "d3066dddde3250c64f949d423a7257e458b5c5da905f026d0c09b04572add247", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-invalid", + "source": "svg-filter-diffuse-light-color-invalid.svg", + "source_sha256": "1dad64b480b677ca6de3bda943c17f5f31c92dbadbfdf006b349ebd53f3424c5", + "oracle": "chromium/svg-filter-diffuse-light-color-invalid.png", + "oracle_sha256": "d3066dddde3250c64f949d423a7257e458b5c5da905f026d0c09b04572add247", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-rgb", + "source": "svg-filter-diffuse-light-color-rgb.svg", + "source_sha256": "f45bbe37d34e68f3985627863ebfd9fb07392247b1172794d030885fc9650439", + "oracle": "chromium/svg-filter-diffuse-light-color-rgb.png", + "oracle_sha256": "29d7fb1983da08103157438a6a1f2291b4bc965395e6b19a0b19cc9a6171c8a7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-srgb-function", + "source": "svg-filter-diffuse-light-color-srgb-function.svg", + "source_sha256": "c3de07d8208467b0ee8ce0027628da39616d43f0c2dcdf79c5752f4f972f23fd", + "oracle": "chromium/svg-filter-diffuse-light-color-srgb-function.png", + "oracle_sha256": "29d7fb1983da08103157438a6a1f2291b4bc965395e6b19a0b19cc9a6171c8a7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-transparent", + "source": "svg-filter-diffuse-light-color-transparent.svg", + "source_sha256": "af8a77cdc6b73f4c192a2abe03ee59da8615d37588b2e6c6ea778a5ee81af21d", + "oracle": "chromium/svg-filter-diffuse-light-color-transparent.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-missing-light", + "source": "svg-filter-diffuse-missing-light.svg", + "source_sha256": "d638a0976741be42fe0b1c80f53d2e20304989997327743d1d0c3d8fbe5e49b4", + "oracle": "chromium/svg-filter-diffuse-missing-light.png", + "oracle_sha256": "e7e99b17f5ae2108974e905e3406ce377dd5fe9471e1a3a1f365b61ebf227830", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-nested-light", + "source": "svg-filter-diffuse-nested-light.svg", + "source_sha256": "8d09db883b2bd49fd8ae8d846650b413fc5f53e16982d9e4e6637200261038ab", + "oracle": "chromium/svg-filter-diffuse-nested-light.png", + "oracle_sha256": "e7e99b17f5ae2108974e905e3406ce377dd5fe9471e1a3a1f365b61ebf227830", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-nonlight-child", + "source": "svg-filter-diffuse-nonlight-child.svg", + "source_sha256": "4835de8ac8ac0abf97389e98e8fc58584d1e4e53888ebc7d52e734272939df23", + "oracle": "chromium/svg-filter-diffuse-nonlight-child.png", + "oracle_sha256": "cbe16b23e4a27fae30bf415785bd94a54c24bf430b0062f74e4f9036c3acfe88", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-object-box-overflow", + "source": "svg-filter-diffuse-object-box-overflow.svg", + "source_sha256": "4f9af6e2385af6930bab0616f781080d27b425f946ba4f3ced18bf1b8b9d98bb", + "oracle": "chromium/svg-filter-diffuse-object-box-overflow.png", + "oracle_sha256": "e7e99b17f5ae2108974e905e3406ce377dd5fe9471e1a3a1f365b61ebf227830", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-output-alpha", + "source": "svg-filter-diffuse-output-alpha.svg", + "source_sha256": "8715f27796cbee00e9f9ea43706767a4a79737477aded7b9108c140eb782592b", + "oracle": "chromium/svg-filter-diffuse-output-alpha.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point", + "source": "svg-filter-diffuse-point.svg", + "source_sha256": "cae35b1bf07fa21c17f66aeb6b3d9d0ac1518ecc27bc1f4b97086d4acf713b7f", + "oracle": "chromium/svg-filter-diffuse-point.png", + "oracle_sha256": "0b9aac38072571d0e534eb6e006bc9ed9151935b307d33ada04f2bf24cef69e0", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-primitive-units", + "source": "svg-filter-diffuse-point-primitive-units.svg", + "source_sha256": "a2c1449fe36ebe703d74ec1edc5b0e71844a8209a6685fc9dfed866fca473cce", + "oracle": "chromium/svg-filter-diffuse-point-primitive-units.png", + "oracle_sha256": "e3b5f366cfa903c038901d70fcc9e23d915d997802accf59dfe00bf458dca9d9", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-x-negative", + "source": "svg-filter-diffuse-point-x-negative.svg", + "source_sha256": "7f14e7cd53bb6632b1e6d56cf287ea74f321877386acc427a8f08d9c715f0d91", + "oracle": "chromium/svg-filter-diffuse-point-x-negative.png", + "oracle_sha256": "7e992f4a13a057ca4e36df03a04c9d1af40286c24d66cf85ebc04351dd266cb0", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-y-negative", + "source": "svg-filter-diffuse-point-y-negative.svg", + "source_sha256": "3b9925c1b93da016c47ba33cdec8ad96fa1cb3831abb1cdeaed7497c37433e04", + "oracle": "chromium/svg-filter-diffuse-point-y-negative.png", + "oracle_sha256": "d9a037e43705f4212c1be71acaf8544d3e254add600282a3a53f833907128db2", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-z-negative", + "source": "svg-filter-diffuse-point-z-negative.svg", + "source_sha256": "02320f73d926bffa0833302638739e47208b2d0ba77fba44cafd6bb9952d9e5c", + "oracle": "chromium/svg-filter-diffuse-point-z-negative.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-region-percent", + "source": "svg-filter-diffuse-region-percent.svg", + "source_sha256": "15810cf94210447e0da083cc1078abb113889617eb8b4a8792508a556f890377", + "oracle": "chromium/svg-filter-diffuse-region-percent.png", + "oracle_sha256": "602d0836a1f506c591e44f3542f711e924c9afd02fcd39abec5bd49e56e9b5c6", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot", + "source": "svg-filter-diffuse-spot.svg", + "source_sha256": "fb3e127c06b3f57f402d2afccb7b89bd51208783b9b929b542d5dc663cce4615", + "oracle": "chromium/svg-filter-diffuse-spot.png", + "oracle_sha256": "4007ba775f08897b4470afc8ff5b928ad2b66079dc062ed17560c9db55c92ce3", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-active", + "source": "svg-filter-diffuse-spot-cone-active.svg", + "source_sha256": "212d5eceac16718ba03d04bc24f2596396cb3d4bf2705422e9e764c7fbdf2e5b", + "oracle": "chromium/svg-filter-diffuse-spot-cone-active.png", + "oracle_sha256": "3bdff6cc71cdd225fd1b30062b9daa4e4c52dfe1c6ad5b0f7f541db12dd2d5f5", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-default", + "source": "svg-filter-diffuse-spot-cone-default.svg", + "source_sha256": "3c8ad34df0f4afb36af60827c459a087a3542e052d48ea1131474c4956c5840b", + "oracle": "chromium/svg-filter-diffuse-spot-cone-default.png", + "oracle_sha256": "15998ae0bab36d697a3d8d216daddd61dc53a34733d5cbfe724862b9c5183ca1", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-negative", + "source": "svg-filter-diffuse-spot-cone-negative.svg", + "source_sha256": "1cb416c559af50877c0d84c30569aaa3af43ee7ef62d98b9ac072abb7c85a9dd", + "oracle": "chromium/svg-filter-diffuse-spot-cone-negative.png", + "oracle_sha256": "3bdff6cc71cdd225fd1b30062b9daa4e4c52dfe1c6ad5b0f7f541db12dd2d5f5", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-outside", + "source": "svg-filter-diffuse-spot-cone-outside.svg", + "source_sha256": "974d8853fb41696b59a67db39ef5714b9715d0d569e4425fd00ede3028229d5a", + "oracle": "chromium/svg-filter-diffuse-spot-cone-outside.png", + "oracle_sha256": "15998ae0bab36d697a3d8d216daddd61dc53a34733d5cbfe724862b9c5183ca1", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-degenerate", + "source": "svg-filter-diffuse-spot-degenerate.svg", + "source_sha256": "d331d7d265e0dc7a09187acb9e5d30b1a8396acb68fb450dc78f0f70a70037be", + "oracle": "chromium/svg-filter-diffuse-spot-degenerate.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-default", + "source": "svg-filter-diffuse-spot-exponent-default.svg", + "source_sha256": "dc2d01acb387821e8682f2cafd5843ddd43630db5c4a82afbe185184d732e6d1", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-default.png", + "oracle_sha256": "53dae7298c0d095c64e858ff7fc4e7222714a75cd1e1daedeaece99e5e8e73e7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-lower-clamp", + "source": "svg-filter-diffuse-spot-exponent-lower-clamp.svg", + "source_sha256": "5fa3fe413d15e4afe5326bdc5e12bcddac3bdd88e11442a72af475c5fccf8b51", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-lower-clamp.png", + "oracle_sha256": "53dae7298c0d095c64e858ff7fc4e7222714a75cd1e1daedeaece99e5e8e73e7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-upper-clamp", + "source": "svg-filter-diffuse-spot-exponent-upper-clamp.svg", + "source_sha256": "1aaaacb28159fa44dc5d5248870721977c1d1e105465247217d1e405ce3d60eb", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-upper-clamp.png", + "oracle_sha256": "5c30cd0c677e249a21b92ed311e94bba54ae84419553ba11bc68128b34a48ae7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-primitive-units", + "source": "svg-filter-diffuse-spot-primitive-units.svg", + "source_sha256": "39afbcdab71d5be6d9daf07c1201dff9199348ab76b123cfa1071e2cfa7a32a8", + "oracle": "chromium/svg-filter-diffuse-spot-primitive-units.png", + "oracle_sha256": "3ce7468a56629645a7b7f1dc5146f0caf785c88e82b5c3a167cfa7d4734e4519", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-x", + "source": "svg-filter-diffuse-spot-target-x.svg", + "source_sha256": "9335b6d569dc4d122fcec198793e5df6c68252ecb10686b006c9d3b7113732c9", + "oracle": "chromium/svg-filter-diffuse-spot-target-x.png", + "oracle_sha256": "f78a0eb249125fe98397d216223df0f53bdd67e562a8d944d6d69abb8c759e5d", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-y", + "source": "svg-filter-diffuse-spot-target-y.svg", + "source_sha256": "cabb1c41f59240fe33609b6a1a143e12633ad4ea6161e9c317d0adc27e20d835", + "oracle": "chromium/svg-filter-diffuse-spot-target-y.png", + "oracle_sha256": "189f3048cd1f6fc3bc070fd8249b5201e95b6f9693fc1d8ad7e76772cd7a0881", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-z", + "source": "svg-filter-diffuse-spot-target-z.svg", + "source_sha256": "659b68996a4f292b85fdffdd24d644ebfa8896e0cfabb485407d6e38fbf962b8", + "oracle": "chromium/svg-filter-diffuse-spot-target-z.png", + "oracle_sha256": "685ba24af206694c8860acd36f76c906e2a0ac0cb50f9d84b41b7fcc56ff82b2", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-stroke", + "source": "svg-filter-diffuse-stroke.svg", + "source_sha256": "7b3db5025fe4c23edc5e2785ac1b60cbae3fda9f602ef4853032d7fb0647af02", + "oracle": "chromium/svg-filter-diffuse-stroke.png", + "oracle_sha256": "c2bc84f64a45144423ac5ec03a4386dc4cbbfc017ca810a887f62b3099929380", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-default", + "source": "svg-filter-diffuse-surface-default.svg", + "source_sha256": "ad76a17e5ca1860d1dcdd387df1f85654d5e1e8fa081827cfc557df34a268558", + "oracle": "chromium/svg-filter-diffuse-surface-default.png", + "oracle_sha256": "6a2cc06192258e91c90ab2f8bdc901f0a7696958f0ffbe72aae3b9c342ad14b5", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-empty-zero", + "source": "svg-filter-diffuse-surface-empty-zero.svg", + "source_sha256": "90c89082b4141cb62224b7befd948dd0dccf7ccdad1eed8189a549a787ef2978", + "oracle": "chromium/svg-filter-diffuse-surface-empty-zero.png", + "oracle_sha256": "66a8f8f13b233bbc9100d0659a21fd19d2b1e876f101fc0cba6ea555e3fbbdc7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-max", + "source": "svg-filter-diffuse-surface-max.svg", + "source_sha256": "30f503b448204ad29f7f4b91eb1768023c8dfe71ec2a7d46891b20e12491f841", + "oracle": "chromium/svg-filter-diffuse-surface-max.png", + "oracle_sha256": "0ab42bc2cb9eec23eee24916aaaee8cff06c5d97a35223dfbe4510717103ef64", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-negative", + "source": "svg-filter-diffuse-surface-negative.svg", + "source_sha256": "bb15cdd984a71e0b2ec43641805decc7d07e2574ad7a5de89711597366bb0eea", + "oracle": "chromium/svg-filter-diffuse-surface-negative.png", + "oracle_sha256": "473498bf2a884203228538f4bfccb226526d0c51808a3e23244296eb63a8453e", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-number-exponent", + "source": "svg-filter-diffuse-surface-number-exponent.svg", + "source_sha256": "b0226a0dc5b0613704e8a23bc8aa9513b04dcaf5bbb497227e3137745e058f8e", + "oracle": "chromium/svg-filter-diffuse-surface-number-exponent.png", + "oracle_sha256": "f3eec241203b105a6d8f1af7b5f7fa4c8de31e7561c2ce2633ad229726f2a32d", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-number-plus", + "source": "svg-filter-diffuse-surface-number-plus.svg", + "source_sha256": "8063e7fe07bd85577739cb5060e530ed68cc7328b6f0b6464466ff1033f8da8d", + "oracle": "chromium/svg-filter-diffuse-surface-number-plus.png", + "oracle_sha256": "f3eec241203b105a6d8f1af7b5f7fa4c8de31e7561c2ce2633ad229726f2a32d", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-zero", + "source": "svg-filter-diffuse-surface-zero.svg", + "source_sha256": "058611d3554084326aeee4618ef5e80ca239e0acd95c99839c73df97ecb1d21d", + "oracle": "chromium/svg-filter-diffuse-surface-zero.png", + "oracle_sha256": "66a8f8f13b233bbc9100d0659a21fd19d2b1e876f101fc0cba6ea555e3fbbdc7", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-clip", + "source": "svg-filter-diffuse-target-clip.svg", + "source_sha256": "6f174310fb4f198ccd2ce0e892cb65ce866afbf8fd9bf3ec23a6a03d30c374a0", + "oracle": "chromium/svg-filter-diffuse-target-clip.png", + "oracle_sha256": "602d0836a1f506c591e44f3542f711e924c9afd02fcd39abec5bd49e56e9b5c6", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-mask", + "source": "svg-filter-diffuse-target-mask.svg", + "source_sha256": "2a6daa87dd170604746e6cd3e863a448db678fe722946b36bf7f1926950e052a", + "oracle": "chromium/svg-filter-diffuse-target-mask.png", + "oracle_sha256": "602d0836a1f506c591e44f3542f711e924c9afd02fcd39abec5bd49e56e9b5c6", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-opacity", + "source": "svg-filter-diffuse-target-opacity.svg", + "source_sha256": "d5b9b148b38760000655f730eeb2d5bc72143e41425450ce0c687540314b953e", + "oracle": "chromium/svg-filter-diffuse-target-opacity.png", + "oracle_sha256": "d2eaf78c30761f7d0ee33b21c132ddede2d5fc3a33e49426f4c593b889f81a77", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-axis", + "source": "svg-filter-diffuse-transform-axis.svg", + "source_sha256": "c82da6d312af878d5febe22e07fd3ffde5264bb566a2de9e078fc0f45be2e1f1", + "oracle": "chromium/svg-filter-diffuse-transform-axis.png", + "oracle_sha256": "169e5946ef6bedbb5a792068fced819623f4058b261071ab7bcd489daa2d55f3", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-quarter-turn", + "source": "svg-filter-diffuse-transform-quarter-turn.svg", + "source_sha256": "6750731436fa5d8eb0e44bcf429a360ec6956bfd6986aa2d92f83ba24295318b", + "oracle": "chromium/svg-filter-diffuse-transform-quarter-turn.png", + "oracle_sha256": "7e0e2858d24f2aed8f966dd1514146a8acfda5ce68d552860ff444af78974dc4", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-reflection", + "source": "svg-filter-diffuse-transform-reflection.svg", + "source_sha256": "dd95b31ff6120b5105b72414fc7ccf82e7121d1a9c6d4621c168cd8c09e92b87", + "oracle": "chromium/svg-filter-diffuse-transform-reflection.png", + "oracle_sha256": "7eeff912d720bee7b3756384e5986510b1cc7ee397af88d98b9b876034b8cb24", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-use", + "source": "svg-filter-diffuse-use.svg", + "source_sha256": "c706a33286d5acda4b4bf32bed9997f60d75a3f35bd611c23ffd489f9817a184", + "oracle": "chromium/svg-filter-diffuse-use.png", + "oracle_sha256": "c7330e228d73d5040b426477cb26ac4086c9b48226703f9d938562b4e6b68314", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-viewbox", + "source": "svg-filter-diffuse-viewbox.svg", + "source_sha256": "1f0577de756636225b9236966c471e74f1df0676a39893cf42ab2993e58f06f8", + "oracle": "chromium/svg-filter-diffuse-viewbox.png", + "oracle_sha256": "be5366fa71153938aafd5d4e24c0dcd4473599666752e5353e14334ba87c2af6", + "width": 64, + "height": 64 + }, { "id": "svg-filter-displacement-color-linear", "source": "svg-filter-displacement-color-linear.svg", diff --git a/fixtures/web-first/primitives.json b/fixtures/web-first/primitives.json index 8a6b2c6a..c68ec570 100644 --- a/fixtures/web-first/primitives.json +++ b/fixtures/web-first/primitives.json @@ -1919,6 +1919,574 @@ "width": 64, "height": 64 }, + { + "id": "svg-filter-diffuse-blur-after", + "source": "svg-filter-diffuse-blur-after.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-blur-after.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-blur-before", + "source": "svg-filter-diffuse-blur-before.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-blur-before.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-child-order", + "source": "svg-filter-diffuse-child-order.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-child-order.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-color-linear", + "source": "svg-filter-diffuse-color-linear.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-color-linear.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-color-srgb", + "source": "svg-filter-diffuse-color-srgb.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-color-srgb.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-composite-out", + "source": "svg-filter-diffuse-composite-out.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-composite-out.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-default", + "source": "svg-filter-diffuse-constant-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-empty-zero", + "source": "svg-filter-diffuse-constant-empty-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-empty-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-negative-clamp", + "source": "svg-filter-diffuse-constant-negative-clamp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-negative-clamp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-number-exponent", + "source": "svg-filter-diffuse-constant-number-exponent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-number-exponent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-number-plus", + "source": "svg-filter-diffuse-constant-number-plus.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-number-plus.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-constant-zero", + "source": "svg-filter-diffuse-constant-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-constant-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-convolve-before", + "source": "svg-filter-diffuse-convolve-before.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-convolve-before.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant", + "source": "svg-filter-diffuse-distant.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-distant.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-angle-default", + "source": "svg-filter-diffuse-distant-angle-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-distant-angle-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-angle-large", + "source": "svg-filter-diffuse-distant-angle-large.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-distant-angle-large.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-azimuth-negative", + "source": "svg-filter-diffuse-distant-azimuth-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-distant-azimuth-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-distant-elevation-negative", + "source": "svg-filter-diffuse-distant-elevation-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-distant-elevation-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-gradient-alpha", + "source": "svg-filter-diffuse-gradient-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-gradient-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-default", + "source": "svg-filter-diffuse-input-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-input-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-source-alpha", + "source": "svg-filter-diffuse-input-source-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-input-source-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-input-source-graphic", + "source": "svg-filter-diffuse-input-source-graphic.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-input-source-graphic.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-kernel-unit-length-drop", + "source": "svg-filter-diffuse-kernel-unit-length-drop.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-kernel-unit-length-drop.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-kernel-unit-length-invalid-drop", + "source": "svg-filter-diffuse-kernel-unit-length-invalid-drop.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-kernel-unit-length-invalid-drop.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-alpha-ignored", + "source": "svg-filter-diffuse-light-color-alpha-ignored.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-alpha-ignored.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-currentcolor", + "source": "svg-filter-diffuse-light-color-currentcolor.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-currentcolor.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-default", + "source": "svg-filter-diffuse-light-color-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-invalid", + "source": "svg-filter-diffuse-light-color-invalid.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-invalid.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-rgb", + "source": "svg-filter-diffuse-light-color-rgb.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-rgb.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-srgb-function", + "source": "svg-filter-diffuse-light-color-srgb-function.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-srgb-function.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-light-color-transparent", + "source": "svg-filter-diffuse-light-color-transparent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-light-color-transparent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-missing-light", + "source": "svg-filter-diffuse-missing-light.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-missing-light.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-nested-light", + "source": "svg-filter-diffuse-nested-light.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-nested-light.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-nonlight-child", + "source": "svg-filter-diffuse-nonlight-child.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-nonlight-child.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-object-box-overflow", + "source": "svg-filter-diffuse-object-box-overflow.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-object-box-overflow.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-output-alpha", + "source": "svg-filter-diffuse-output-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-output-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point", + "source": "svg-filter-diffuse-point.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-point.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-primitive-units", + "source": "svg-filter-diffuse-point-primitive-units.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-point-primitive-units.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-x-negative", + "source": "svg-filter-diffuse-point-x-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-point-x-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-y-negative", + "source": "svg-filter-diffuse-point-y-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-point-y-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-point-z-negative", + "source": "svg-filter-diffuse-point-z-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-point-z-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-region-percent", + "source": "svg-filter-diffuse-region-percent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-region-percent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot", + "source": "svg-filter-diffuse-spot.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-active", + "source": "svg-filter-diffuse-spot-cone-active.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-cone-active.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-default", + "source": "svg-filter-diffuse-spot-cone-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-cone-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-negative", + "source": "svg-filter-diffuse-spot-cone-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-cone-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-cone-outside", + "source": "svg-filter-diffuse-spot-cone-outside.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-cone-outside.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-degenerate", + "source": "svg-filter-diffuse-spot-degenerate.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-degenerate.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-default", + "source": "svg-filter-diffuse-spot-exponent-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-lower-clamp", + "source": "svg-filter-diffuse-spot-exponent-lower-clamp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-lower-clamp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-exponent-upper-clamp", + "source": "svg-filter-diffuse-spot-exponent-upper-clamp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-exponent-upper-clamp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-primitive-units", + "source": "svg-filter-diffuse-spot-primitive-units.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-primitive-units.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-x", + "source": "svg-filter-diffuse-spot-target-x.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-target-x.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-y", + "source": "svg-filter-diffuse-spot-target-y.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-target-y.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-spot-target-z", + "source": "svg-filter-diffuse-spot-target-z.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-spot-target-z.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-stroke", + "source": "svg-filter-diffuse-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-default", + "source": "svg-filter-diffuse-surface-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-empty-zero", + "source": "svg-filter-diffuse-surface-empty-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-empty-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-max", + "source": "svg-filter-diffuse-surface-max.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-max.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-negative", + "source": "svg-filter-diffuse-surface-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-number-exponent", + "source": "svg-filter-diffuse-surface-number-exponent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-number-exponent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-number-plus", + "source": "svg-filter-diffuse-surface-number-plus.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-number-plus.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-surface-zero", + "source": "svg-filter-diffuse-surface-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-surface-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-clip", + "source": "svg-filter-diffuse-target-clip.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-target-clip.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-mask", + "source": "svg-filter-diffuse-target-mask.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-target-mask.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-target-opacity", + "source": "svg-filter-diffuse-target-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-target-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-axis", + "source": "svg-filter-diffuse-transform-axis.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-transform-axis.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-quarter-turn", + "source": "svg-filter-diffuse-transform-quarter-turn.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-transform-quarter-turn.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-transform-reflection", + "source": "svg-filter-diffuse-transform-reflection.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-transform-reflection.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-use", + "source": "svg-filter-diffuse-use.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-use.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-filter-diffuse-viewbox", + "source": "svg-filter-diffuse-viewbox.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-filter-diffuse-viewbox.png", + "width": 64, + "height": 64 + }, { "id": "svg-filter-displacement-color-linear", "source": "svg-filter-displacement-color-linear.svg", diff --git a/fixtures/web-first/svg-filter-diffuse-blur-after.svg b/fixtures/web-first/svg-filter-diffuse-blur-after.svg new file mode 100644 index 00000000..ce236bf2 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-blur-after.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-blur-before.svg b/fixtures/web-first/svg-filter-diffuse-blur-before.svg new file mode 100644 index 00000000..a7537991 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-blur-before.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-child-order.svg b/fixtures/web-first/svg-filter-diffuse-child-order.svg new file mode 100644 index 00000000..b01882ac --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-child-order.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-color-linear.svg b/fixtures/web-first/svg-filter-diffuse-color-linear.svg new file mode 100644 index 00000000..d6e6fe23 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-color-linear.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-color-srgb.svg b/fixtures/web-first/svg-filter-diffuse-color-srgb.svg new file mode 100644 index 00000000..692bc8f8 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-color-srgb.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-composite-out.svg b/fixtures/web-first/svg-filter-diffuse-composite-out.svg new file mode 100644 index 00000000..14802829 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-composite-out.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-default.svg b/fixtures/web-first/svg-filter-diffuse-constant-default.svg new file mode 100644 index 00000000..dcb6e4a0 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-empty-zero.svg b/fixtures/web-first/svg-filter-diffuse-constant-empty-zero.svg new file mode 100644 index 00000000..4bc566f5 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-empty-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-negative-clamp.svg b/fixtures/web-first/svg-filter-diffuse-constant-negative-clamp.svg new file mode 100644 index 00000000..01a6a811 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-negative-clamp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-number-exponent.svg b/fixtures/web-first/svg-filter-diffuse-constant-number-exponent.svg new file mode 100644 index 00000000..5d8c5763 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-number-exponent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-number-plus.svg b/fixtures/web-first/svg-filter-diffuse-constant-number-plus.svg new file mode 100644 index 00000000..84ca3532 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-number-plus.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-constant-zero.svg b/fixtures/web-first/svg-filter-diffuse-constant-zero.svg new file mode 100644 index 00000000..4d3eabd7 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-constant-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-convolve-before.svg b/fixtures/web-first/svg-filter-diffuse-convolve-before.svg new file mode 100644 index 00000000..95ec275a --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-convolve-before.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-distant-angle-default.svg b/fixtures/web-first/svg-filter-diffuse-distant-angle-default.svg new file mode 100644 index 00000000..04c96dad --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-distant-angle-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-distant-angle-large.svg b/fixtures/web-first/svg-filter-diffuse-distant-angle-large.svg new file mode 100644 index 00000000..388edd18 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-distant-angle-large.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-distant-azimuth-negative.svg b/fixtures/web-first/svg-filter-diffuse-distant-azimuth-negative.svg new file mode 100644 index 00000000..2ea7be25 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-distant-azimuth-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-distant-elevation-negative.svg b/fixtures/web-first/svg-filter-diffuse-distant-elevation-negative.svg new file mode 100644 index 00000000..257564d9 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-distant-elevation-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-distant.svg b/fixtures/web-first/svg-filter-diffuse-distant.svg new file mode 100644 index 00000000..d0f80931 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-distant.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-gradient-alpha.svg b/fixtures/web-first/svg-filter-diffuse-gradient-alpha.svg new file mode 100644 index 00000000..3d59f9ab --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-gradient-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-input-default.svg b/fixtures/web-first/svg-filter-diffuse-input-default.svg new file mode 100644 index 00000000..183cf08f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-input-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-input-source-alpha.svg b/fixtures/web-first/svg-filter-diffuse-input-source-alpha.svg new file mode 100644 index 00000000..692bc8f8 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-input-source-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-input-source-graphic.svg b/fixtures/web-first/svg-filter-diffuse-input-source-graphic.svg new file mode 100644 index 00000000..b433b1b9 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-input-source-graphic.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-drop.svg b/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-drop.svg new file mode 100644 index 00000000..40a05b9c --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-drop.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-invalid-drop.svg b/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-invalid-drop.svg new file mode 100644 index 00000000..f81cb57f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-kernel-unit-length-invalid-drop.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-alpha-ignored.svg b/fixtures/web-first/svg-filter-diffuse-light-color-alpha-ignored.svg new file mode 100644 index 00000000..2b703ff3 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-alpha-ignored.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-currentcolor.svg b/fixtures/web-first/svg-filter-diffuse-light-color-currentcolor.svg new file mode 100644 index 00000000..557706ef --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-currentcolor.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-default.svg b/fixtures/web-first/svg-filter-diffuse-light-color-default.svg new file mode 100644 index 00000000..bd3fe35f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-invalid.svg b/fixtures/web-first/svg-filter-diffuse-light-color-invalid.svg new file mode 100644 index 00000000..0396337c --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-invalid.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-rgb.svg b/fixtures/web-first/svg-filter-diffuse-light-color-rgb.svg new file mode 100644 index 00000000..aee937a8 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-rgb.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-srgb-function.svg b/fixtures/web-first/svg-filter-diffuse-light-color-srgb-function.svg new file mode 100644 index 00000000..4de2c5d4 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-srgb-function.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-light-color-transparent.svg b/fixtures/web-first/svg-filter-diffuse-light-color-transparent.svg new file mode 100644 index 00000000..5328db07 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-light-color-transparent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-missing-light.svg b/fixtures/web-first/svg-filter-diffuse-missing-light.svg new file mode 100644 index 00000000..b0b0a424 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-missing-light.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-nested-light.svg b/fixtures/web-first/svg-filter-diffuse-nested-light.svg new file mode 100644 index 00000000..db69c763 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-nested-light.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-nonlight-child.svg b/fixtures/web-first/svg-filter-diffuse-nonlight-child.svg new file mode 100644 index 00000000..d10e27b7 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-nonlight-child.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-object-box-overflow.svg b/fixtures/web-first/svg-filter-diffuse-object-box-overflow.svg new file mode 100644 index 00000000..0111013d --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-object-box-overflow.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-output-alpha.svg b/fixtures/web-first/svg-filter-diffuse-output-alpha.svg new file mode 100644 index 00000000..692bc8f8 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-output-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-point-primitive-units.svg b/fixtures/web-first/svg-filter-diffuse-point-primitive-units.svg new file mode 100644 index 00000000..e51ae144 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-point-primitive-units.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-point-x-negative.svg b/fixtures/web-first/svg-filter-diffuse-point-x-negative.svg new file mode 100644 index 00000000..40095860 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-point-x-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-point-y-negative.svg b/fixtures/web-first/svg-filter-diffuse-point-y-negative.svg new file mode 100644 index 00000000..c95e50f8 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-point-y-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-point-z-negative.svg b/fixtures/web-first/svg-filter-diffuse-point-z-negative.svg new file mode 100644 index 00000000..b0ae7af2 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-point-z-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-point.svg b/fixtures/web-first/svg-filter-diffuse-point.svg new file mode 100644 index 00000000..e48af808 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-point.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-region-percent.svg b/fixtures/web-first/svg-filter-diffuse-region-percent.svg new file mode 100644 index 00000000..ae9321c0 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-region-percent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-cone-active.svg b/fixtures/web-first/svg-filter-diffuse-spot-cone-active.svg new file mode 100644 index 00000000..11a9024c --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-cone-active.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-cone-default.svg b/fixtures/web-first/svg-filter-diffuse-spot-cone-default.svg new file mode 100644 index 00000000..4804b325 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-cone-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-cone-negative.svg b/fixtures/web-first/svg-filter-diffuse-spot-cone-negative.svg new file mode 100644 index 00000000..0813019b --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-cone-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-cone-outside.svg b/fixtures/web-first/svg-filter-diffuse-spot-cone-outside.svg new file mode 100644 index 00000000..ff4a1b27 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-cone-outside.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-degenerate.svg b/fixtures/web-first/svg-filter-diffuse-spot-degenerate.svg new file mode 100644 index 00000000..6c36a431 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-degenerate.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-exponent-default.svg b/fixtures/web-first/svg-filter-diffuse-spot-exponent-default.svg new file mode 100644 index 00000000..8a96826d --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-exponent-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-exponent-lower-clamp.svg b/fixtures/web-first/svg-filter-diffuse-spot-exponent-lower-clamp.svg new file mode 100644 index 00000000..600a6602 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-exponent-lower-clamp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-exponent-upper-clamp.svg b/fixtures/web-first/svg-filter-diffuse-spot-exponent-upper-clamp.svg new file mode 100644 index 00000000..31e9c6e3 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-exponent-upper-clamp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-primitive-units.svg b/fixtures/web-first/svg-filter-diffuse-spot-primitive-units.svg new file mode 100644 index 00000000..b0c25b21 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-primitive-units.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-target-x.svg b/fixtures/web-first/svg-filter-diffuse-spot-target-x.svg new file mode 100644 index 00000000..2bba47df --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-target-x.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-target-y.svg b/fixtures/web-first/svg-filter-diffuse-spot-target-y.svg new file mode 100644 index 00000000..6ad720de --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-target-y.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot-target-z.svg b/fixtures/web-first/svg-filter-diffuse-spot-target-z.svg new file mode 100644 index 00000000..ee1c0e9a --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot-target-z.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-spot.svg b/fixtures/web-first/svg-filter-diffuse-spot.svg new file mode 100644 index 00000000..a2cbb514 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-spot.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-stroke.svg b/fixtures/web-first/svg-filter-diffuse-stroke.svg new file mode 100644 index 00000000..d4b7641f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-stroke.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-default.svg b/fixtures/web-first/svg-filter-diffuse-surface-default.svg new file mode 100644 index 00000000..0e6fa0f4 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-default.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-empty-zero.svg b/fixtures/web-first/svg-filter-diffuse-surface-empty-zero.svg new file mode 100644 index 00000000..0a358716 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-empty-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-max.svg b/fixtures/web-first/svg-filter-diffuse-surface-max.svg new file mode 100644 index 00000000..a6ffe90d --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-max.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-negative.svg b/fixtures/web-first/svg-filter-diffuse-surface-negative.svg new file mode 100644 index 00000000..4f46d4b4 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-number-exponent.svg b/fixtures/web-first/svg-filter-diffuse-surface-number-exponent.svg new file mode 100644 index 00000000..f80746e0 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-number-exponent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-number-plus.svg b/fixtures/web-first/svg-filter-diffuse-surface-number-plus.svg new file mode 100644 index 00000000..ddcc837c --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-number-plus.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-surface-zero.svg b/fixtures/web-first/svg-filter-diffuse-surface-zero.svg new file mode 100644 index 00000000..65fef0a0 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-surface-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-target-clip.svg b/fixtures/web-first/svg-filter-diffuse-target-clip.svg new file mode 100644 index 00000000..15711b34 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-target-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-target-mask.svg b/fixtures/web-first/svg-filter-diffuse-target-mask.svg new file mode 100644 index 00000000..92c9d47f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-target-mask.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-target-opacity.svg b/fixtures/web-first/svg-filter-diffuse-target-opacity.svg new file mode 100644 index 00000000..c9cf127b --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-target-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-transform-axis.svg b/fixtures/web-first/svg-filter-diffuse-transform-axis.svg new file mode 100644 index 00000000..24b22e0d --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-transform-axis.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-transform-quarter-turn.svg b/fixtures/web-first/svg-filter-diffuse-transform-quarter-turn.svg new file mode 100644 index 00000000..5c06cac5 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-transform-quarter-turn.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-transform-reflection.svg b/fixtures/web-first/svg-filter-diffuse-transform-reflection.svg new file mode 100644 index 00000000..e77fbe2e --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-transform-reflection.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-use.svg b/fixtures/web-first/svg-filter-diffuse-use.svg new file mode 100644 index 00000000..2abfdb1f --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-filter-diffuse-viewbox.svg b/fixtures/web-first/svg-filter-diffuse-viewbox.svg new file mode 100644 index 00000000..2db1af59 --- /dev/null +++ b/fixtures/web-first/svg-filter-diffuse-viewbox.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/README.md b/fixtures/web-first/unsupported/README.md index 064180a4..d7097470 100644 --- a/fixtures/web-first/unsupported/README.md +++ b/fixtures/web-first/unsupported/README.md @@ -72,10 +72,16 @@ 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 `feDiffuseLighting` after a supported flood prefix; it skips the whole affected target, so that 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 `feSpecularLighting` after a supported flood prefix; it skips the whole affected target, so that prefix can never escape as a plausible filtered result. | | `svg-filter-convolve-transform-precision.svg` | Refuse `feConvolveMatrix` under a target mapping outside axis maps and exact quarter turns. Fractional translation/scale, reflection, and exact quarter turns are exact. A sampled 17-degree rotation differs by 462 pixels at maximum channel delta 15 and a shear by 632 at delta 13; arbitrarily small sampled rotation/shear values reproduce the class (measured, not celled). | | `svg-filter-convolve-paint-server-precision.svg` | Refuse source-dependent `feConvolveMatrix` when the isolated source uses a paint-server fill or stroke. Sampled linear and radial fills differ by 1,425 and 1,658 pixels at maximum channel delta 7; a gradient stroke differs by 609 at delta 7. Generated-only filter inputs remain exact (measured, not celled). | | `svg-filter-convolve-arithmetic-range.svg` | Refuse a nonzero `divisor` whose reciprocal overflows finite `f32`. Chromium executes the valid number and the sampled output equals a nearby finite-gain control, while the resolved contract admits only finite gain. This is a narrow arithmetic-range patrol, not a second source parser (measured, not celled). | +| `svg-filter-diffuse-transform-precision.svg` | Refuse `feDiffuseLighting` under a target mapping outside axis maps and exact quarter turns. Translation, arbitrary sampled axis scales, reflection, and exact quarter turns are exact. A sampled 17-degree rotation differs by 551 pixels at maximum channel delta 15, a shear by 543 at delta 12, and a general affine map by 624 at delta 12 (measured, not celled). | +| `svg-filter-diffuse-composition-precision.svg` | Refuse diffuse lighting as the foreground of `feComposite` `in` or `atop` when the second input is source-derived. The sampled `in` witness differs by 69 pixels at maximum delta 180. `over`, `out`, `xor`, `lighter`, arithmetic, blend, merge, generated-background composition, lighting in the second input, and neighboring one-input spatial operations are exact (measured, not celled). | +| `svg-filter-lighting-color-css.svg` | Refuse CSS-authored `lighting-color` at its real ingress. Chromium lets the inline declaration beat the direct presentation attribute; the pinned Servo-mode cascade has no lighting-color longhand, so the target is skipped and declared instead of painting either color. Stylesheet ingress is likewise declared at the sheet. The direct attribute remains a separate admitted subset. | +| `svg-filter-lighting-color-inherit.svg` | Refuse explicit `inherit` on `lighting-color`. Chromium takes the ancestor filter's computed light color while the property is otherwise non-inherited. Reconstructing that edge needs the unavailable cascaded longhand; reset keywords retain the initial white and remain admitted. | +| `svg-filter-lighting-color-var.svg` | Refuse custom-property substitution in direct `lighting-color`. Chromium substitutes the green control exactly; the direct reader cannot prove which declaration supplies the value, so even a benign substitution over-refuses under the independent `var()` row. | +| `svg-filter-lighting-color-syntax.svg` | Refuse wider color syntax outside the admitted sRGB subset. Chromium honors the sampled Lab and HSL colors, and a Lab control differing by only six channel levels proves the conversion is byte-sensitive. The wider color-function rows carry this gap; it does not become an invented lighting-only parser. | | `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. | diff --git a/fixtures/web-first/unsupported/svg-filter-diffuse-composition-precision.svg b/fixtures/web-first/unsupported/svg-filter-diffuse-composition-precision.svg new file mode 100644 index 00000000..9f9c1eb0 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-diffuse-composition-precision.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-diffuse-transform-precision.svg b/fixtures/web-first/unsupported/svg-filter-diffuse-transform-precision.svg new file mode 100644 index 00000000..d25ee73f --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-diffuse-transform-precision.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-lighting-color-css.svg b/fixtures/web-first/unsupported/svg-filter-lighting-color-css.svg new file mode 100644 index 00000000..67bfa336 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-lighting-color-css.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-lighting-color-inherit.svg b/fixtures/web-first/unsupported/svg-filter-lighting-color-inherit.svg new file mode 100644 index 00000000..86b7f8e8 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-lighting-color-inherit.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-lighting-color-syntax.svg b/fixtures/web-first/unsupported/svg-filter-lighting-color-syntax.svg new file mode 100644 index 00000000..6ed91422 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-lighting-color-syntax.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-lighting-color-var.svg b/fixtures/web-first/unsupported/svg-filter-lighting-color-var.svg new file mode 100644 index 00000000..09cbe979 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-lighting-color-var.svg @@ -0,0 +1,9 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-filter-primitive.svg b/fixtures/web-first/unsupported/svg-filter-primitive.svg index 8852b56e..217ad752 100644 --- a/fixtures/web-first/unsupported/svg-filter-primitive.svg +++ b/fixtures/web-first/unsupported/svg-filter-primitive.svg @@ -2,9 +2,9 @@ - + - +