diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 9fc4eda4..9aaea35d 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -539,8 +539,8 @@ cargo run -p n0_cli --bin n0 -- \ 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, 41 convolution-rung, and 71 diffuse-lighting - cells. The complete corpus contains 874 Chromium-baked cells plus 10 sampled - frames, with 170 named + cells. The complete corpus contains 936 Chromium-baked cells plus 10 sampled + frames, with 169 named refusal rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, `feMorphology`, `feConvolveMatrix`, @@ -787,22 +787,35 @@ cargo run -p n0_cli --bin n0 -- \ `patternTransform` is the transform property's presentation hint: CSS beats it and a plain `transform` attribute is inert. Translation, axis scale, reflection, and exact quarter turns are admitted. The repeating source can - contain admitted rectangles, gradients, ``, masks, and a pattern nested - alone; pattern paint covers admitted rect, ellipse, and path fills and - strokes, and target opacity, clip, mask, and filter scopes retain their - established order. Sixty-two Chromium-baked cells cover that profile, + contain admitted rectangles, gradients, ``, masks, filters, and a + pattern nested alone; a filter may wrap that sole nested-pattern draw. + Pattern paint covers admitted rect, ellipse, and path fills and strokes, and + target opacity, clip, mask, and filter scopes retain their established + order. A pattern may be selected through all four destination + fill/stroke × context-fill/context-stroke crossings, including CSS ingress, + recursive `` owners, object-box coordinates, transforms, opacity, + fallback/nothing semantics, masks, and filters. It may also supply a + source-derived filter's input when the filtered source is one direct + sharp-cornered rectangle with exactly one pattern-painted fill or simple + stroke channel. That filter profile includes transparent and alpha-bearing + tiles, gradients, masks, strokes, and nested patterns. One hundred + twenty-four Chromium-baked cells cover the core and composition profiles, including independent object-box clients and one inline-HTML SVG entry; all are exact without a new tolerance. - What refuses by stable name: a pattern selected through - `context-fill`/`context-stroke`; an external template dependency; a non-`px` + What refuses by stable name: an external template dependency; a non-`px` unit, CSS math, `var()`, CSS-wide tile value, or CSS comments around an otherwise valid tile length; a source child outside the admitted element - slice; filter composition inside the source program; curved source - coverage; isolated multi-draw source + slice; curved source coverage; isolated multi-draw source opacity or a geometric source clip; another source draw mixed with a nested pattern; a fractional final tile extent; and a final tile map carrying a - general rotation or shear. Those last five are measured picture-shader - precision boundaries, not guessed omissions. Before its patrol, the valid + general rotation or shear. A source-derived filter over curved, rounded, + multi-draw, or wider pattern-painted target geometry has its own + filtered-pattern coverage refusal. The context-aware source classifier also + keeps eventual gradients behind the existing color-matrix, component- + transfer, convolution, morphology, native-shadow, and translucent-source + precision names instead of letting a context keyword hide them. Those + picture-shader and source-layer boundaries are measured, not guessed + omissions. Before its patrol, the valid comment spelling silently selected fallback in both admissions and changed all 2,304 target pixels at maximum delta 202. A derived template whose author stylesheet may contribute `transform:none` also refuses because the diff --git a/crates/websem/src/svg.rs b/crates/websem/src/svg.rs index 84853e48..be99b9bb 100644 --- a/crates/websem/src/svg.rs +++ b/crates/websem/src/svg.rs @@ -3103,7 +3103,20 @@ fn patrol_pattern_source_program(items: &FrameItems) -> Result<(), &'static str> .is_some_and(|stroke| stroke.paints().pattern().is_some()) }); let has_compositing_commands = items.iter().any(|item| !matches!(item, FrameItem::Node(_))); - if has_nested_pattern && (draw_count != 1 || has_compositing_commands) { + let one_filtered_nested_draw = items.len() == 3 + && matches!( + items.iter().next(), + Some(FrameItem::ScopeBegin(scope)) if matches!(scope.effect, ScopeEffect::Filter(_)) + ) + && matches!(items.iter().nth(1), Some(FrameItem::Node(_))) + && matches!(items.iter().nth(2), Some(FrameItem::ScopeEnd)); + // Filters over several solid/gradient draws are intentionally admitted: + // P2's group and adjacent-draw cells discriminate that exact picture + // program. The sole-draw rule belongs only to a nested pattern, where a + // second repeating picture shader crosses the measured composition edge. + if has_nested_pattern + && (draw_count != 1 || (has_compositing_commands && !one_filtered_nested_draw)) + { return Err( "source mixes a nested pattern with another draw at the pinned-backend picture-shader composition precision boundary", ); @@ -3141,11 +3154,6 @@ fn patrol_pattern_source_program(items: &FrameItems) -> Result<(), &'static str> "source carries an isolated opacity or geometric clip at the pinned-backend picture-shader source-effect precision boundary", ); } - FrameItem::ScopeBegin(scope) if matches!(scope.effect, ScopeEffect::Filter(_)) => { - return Err( - "source uses a filter composition outside the admitted pattern source slice", - ); - } FrameItem::ScopeBegin(_) | FrameItem::ScopeEnd | FrameItem::MaskBegin(_) @@ -3496,6 +3504,8 @@ impl<'a> ChildWalk<'a> { target_box, self.bases, self.override_skips, + self.servers, + &self.paint_contexts, ) } @@ -6512,17 +6522,188 @@ mod filter_resource { axis_or_quarter_turn && [a, b, c, d].into_iter().all(integer) } - fn source_subtree_crosses_native_shadow_boundary( - target: HtmlElement<'_>, + #[derive(Clone, Copy, PartialEq, Eq)] + enum EffectiveSourcePaint { + None, + OpaqueSolid, + TranslucentSolid, + Pattern, + OtherServer, + Unresolved, + } + + /// Classify the paint that actually reaches one source-image channel. + /// Looking only at the target's authored `SVGPaintKind` is insufficient: + /// `context-fill` / `context-stroke` may select a gradient or pattern from + /// an enclosing ``. The filter precision patrols must see that + /// eventual server before any pixels are admitted. + fn effective_source_paint<'d>( + element: HtmlElement<'d>, + property: PaintProperty, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], + ) -> Result { + let selected = match select_paint(element, property, paint_contexts) { + Ok(Some(selected)) => selected, + Ok(None) => return Ok(EffectiveSourcePaint::None), + // The ordinary paint compiler owns the stable diagnostic for an + // invalid context relation. Do not replace it with a speculative + // filter-profile diagnosis merely because filtering runs first. + Err(_) => return Ok(EffectiveSourcePaint::Unresolved), + }; + match &selected.value.kind { + SVGPaintKind::None => Ok(EffectiveSourcePaint::None), + SVGPaintKind::Color(color) => { + let data = selected + .owner + .borrow_data() + .ok_or(CompileError::MissingComputedStyle)?; + if data.styles.primary().resolve_color(color).alpha == 1.0 { + Ok(EffectiveSourcePaint::OpaqueSolid) + } else { + Ok(EffectiveSourcePaint::TranslucentSolid) + } + } + SVGPaintKind::PaintServer(url) => { + let Some(resolved_url) = url.url() else { + return Ok(EffectiveSourcePaint::OtherServer); + }; + let Some(fragment) = crate::svg_paint_server::same_document_fragment(resolved_url) + else { + return Ok(EffectiveSourcePaint::OtherServer); + }; + Ok(match crate::svg_paint_server::classify(servers, fragment) { + Ok(ClassifiedServer::Pattern(_)) => EffectiveSourcePaint::Pattern, + Ok(ClassifiedServer::Invalid | ClassifiedServer::Gradient) | Err(_) => { + EffectiveSourcePaint::OtherServer + } + }) + } + SVGPaintKind::ContextFill | SVGPaintKind::ContextStroke => { + unreachable!("select_paint removes every context relation") + } + } + } + + /// Whether one element contributes fill/stroke channels to a filter's + /// source image. Containers are traversed but never classified as paint. + fn source_paint_leaf(element: HtmlElement<'_>) -> bool { + matches!( + element.local_name_string().as_str(), + "rect" | "circle" | "ellipse" | "path" | "line" | "polygon" | "polyline" | "text" + ) + } + + /// A nested `` establishes a new context owner for its cloned + /// descendants. Filter source-profile walks do not need its geometry map, + /// only the owner ordering used by `select_paint`. + fn descendant_paint_contexts<'d>( + element: HtmlElement<'d>, + paint_contexts: &[PaintContext<'d>], + ) -> Vec> { + let mut contexts = paint_contexts.to_vec(); + if element.local_name_string() == "use" { + contexts.push(PaintContext { + element, + reference_box: None, + to_frame: AffineTransform::identity(), + }); + } + contexts + } + + /// Add one source element's children to the iterative profile walk while + /// carrying any context owner established by the parent. + fn push_source_children<'d>( + element: HtmlElement<'d>, + paint_contexts: &[PaintContext<'d>], + stack: &mut Vec<(HtmlElement<'d>, Vec>, bool)>, + ) { + let child_contexts = descendant_paint_contexts(element, paint_contexts); + let mut child = element.first_element_child(); + while let Some(next) = child { + stack.push((next, child_contexts.clone(), false)); + child = next.next_element_sibling(); + } + } + + /// P2 proves filtered pattern source images only for one direct, + /// sharp-cornered `` channel. Chromium/n0 probes found separate + /// picture-shader coverage splits on cubic paths (color matrix, component + /// transfer, offset, and merge) and rounded rectangles (blur, morphology, + /// and drop shadow). Keep that operation-independent source profile here + /// so a newly admitted primitive cannot silently bypass the same raster + /// boundary. + fn filter_source_crosses_pattern_profile_boundary<'d>( + target: HtmlElement<'d>, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], ) -> Result { - let mut stack = vec![(target, true)]; - while let Some((element, is_target)) = stack.pop() { - for property in [PaintProperty::Fill, PaintProperty::Stroke] { - if matches!( - computed_paint(element, property)?.kind, - SVGPaintKind::PaintServer(_) - ) { - return Ok(true); + let mut stack = vec![(target, paint_contexts.to_vec(), true)]; + while let Some((element, contexts, is_target)) = stack.pop() { + if source_paint_leaf(element) { + let fill = + effective_source_paint(element, PaintProperty::Fill, servers, &contexts)?; + let stroke = + effective_source_paint(element, PaintProperty::Stroke, servers, &contexts)?; + let pattern_property = match (fill, stroke) { + (EffectiveSourcePaint::Pattern, EffectiveSourcePaint::None) => { + Some(PaintProperty::Fill) + } + (EffectiveSourcePaint::None, EffectiveSourcePaint::Pattern) => { + Some(PaintProperty::Stroke) + } + (EffectiveSourcePaint::Pattern, _) | (_, EffectiveSourcePaint::Pattern) => { + return Ok(true); + } + _ => None, + }; + if let Some(pattern_property) = pattern_property { + if !is_target + || element.local_name_string() != "rect" + || element.first_element_child().is_some() + || get_attr(element, "rx").is_some() + || get_attr(element, "ry").is_some() + { + return Ok(true); + } + if matches!(pattern_property, PaintProperty::Stroke) { + let data = element + .borrow_data() + .ok_or(CompileError::MissingComputedStyle)?; + let style = data.styles.primary(); + if !matches!( + style.clone_stroke_dasharray(), + SVGStrokeDashArray::Values(values) if values.is_empty() + ) || style.clone_stroke_linecap() != StyloLinecap::Butt + || style.clone_stroke_linejoin() != StyloLinejoin::Miter + || style.clone_stroke_miterlimit().0 != 4.0 + { + return Ok(true); + } + } + } + } + push_source_children(element, &contexts, &mut stack); + } + Ok(false) + } + + fn source_subtree_crosses_native_shadow_boundary<'d>( + target: HtmlElement<'d>, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], + ) -> Result { + let mut stack = vec![(target, paint_contexts.to_vec(), true)]; + while let Some((element, contexts, is_target)) = stack.pop() { + if source_paint_leaf(element) { + for property in [PaintProperty::Fill, PaintProperty::Stroke] { + if matches!( + effective_source_paint(element, property, servers, &contexts)?, + EffectiveSourcePaint::OtherServer + ) { + return Ok(true); + } } } if !is_target { @@ -6533,21 +6714,22 @@ mod filter_resource { return Ok(true); } } - let mut child = element.first_element_child(); - while let Some(next) = child { - stack.push((next, false)); - child = next.next_element_sibling(); - } + push_source_children(element, &contexts, &mut stack); } Ok(false) } /// The pinned Chromium/backend pair agrees for a source-derived color /// matrix when its isolated source is one opaque solid fill on one direct - /// geometry target. Curved strokes, paint servers, authored translucency, - /// descendant compositing, and multi-draw groups cross independently - /// measured source-layer precision boundaries. - fn color_matrix_source_is_admitted(target: HtmlElement<'_>) -> Result { + /// geometry target, or for the separately measured direct sharp-rect + /// pattern profile. Curved strokes, non-pattern paint servers, authored + /// solid translucency, descendant compositing, and multi-draw groups cross + /// independently measured source-layer precision boundaries. + fn color_matrix_source_is_admitted<'d>( + target: HtmlElement<'d>, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], + ) -> Result { if !matches!( target.local_name_string().as_str(), "rect" | "circle" | "ellipse" | "path" | "polygon" | "polyline" @@ -6564,18 +6746,29 @@ mod filter_resource { SVGOpacity::Opacity(value) => value, _ => return Ok(false), }; - let fill = style.clone_fill(); - let opaque_fill = match fill.kind { - SVGPaintKind::Color(color) => { - fill_opacity == 1.0 && style.resolve_color(&color).alpha == 1.0 - } - SVGPaintKind::None - | SVGPaintKind::PaintServer(_) - | SVGPaintKind::ContextFill - | SVGPaintKind::ContextStroke => false, + let _stroke_opacity = match style.clone_stroke_opacity() { + SVGOpacity::Opacity(value) => value, + _ => return Ok(false), }; - let no_stroke = matches!(style.clone_stroke().kind, SVGPaintKind::None); - Ok(opaque_fill && no_stroke) + drop(data); + let fill = effective_source_paint(target, PaintProperty::Fill, servers, paint_contexts)?; + let stroke = + effective_source_paint(target, PaintProperty::Stroke, servers, paint_contexts)?; + let opaque_solid = fill_opacity == 1.0 + && fill == EffectiveSourcePaint::OpaqueSolid + && stroke == EffectiveSourcePaint::None; + let measured_pattern_rect = target.local_name_string() == "rect" + && get_attr(target, "rx").is_none() + && get_attr(target, "ry").is_none() + && matches!( + (fill, stroke), + (EffectiveSourcePaint::Pattern, EffectiveSourcePaint::None) + | (EffectiveSourcePaint::None, EffectiveSourcePaint::Pattern) + ); + // The typed matches above retain the established refusal for an + // unrepresentable opacity value. P2's matrix admits the complete + // resolved numeric fill/stroke paint-opacity range on this route. + Ok(opaque_solid || measured_pattern_rect) } /// Axis-aligned maps and exact quarter turns are exact across the sampled @@ -6587,22 +6780,24 @@ mod filter_resource { axis_or_quarter_turn && [a, b, c, d].into_iter().all(f32::is_finite) } - fn filter_source_has_paint_server(target: HtmlElement<'_>) -> Result { - let mut stack = vec![target]; - while let Some(element) = stack.pop() { - for property in [PaintProperty::Fill, PaintProperty::Stroke] { - if matches!( - computed_paint(element, property)?.kind, - SVGPaintKind::PaintServer(_) - ) { - return Ok(true); + fn filter_source_has_non_pattern_paint_server<'d>( + target: HtmlElement<'d>, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], + ) -> Result { + let mut stack = vec![(target, paint_contexts.to_vec(), true)]; + while let Some((element, contexts, _)) = stack.pop() { + if source_paint_leaf(element) { + for property in [PaintProperty::Fill, PaintProperty::Stroke] { + if matches!( + effective_source_paint(element, property, servers, &contexts)?, + EffectiveSourcePaint::OtherServer + ) { + return Ok(true); + } } } - let mut child = element.first_element_child(); - while let Some(next) = child { - stack.push(next); - child = next.next_element_sibling(); - } + push_source_children(element, &contexts, &mut stack); } Ok(false) } @@ -6721,11 +6916,13 @@ mod filter_resource { /// filter runs. The target's own `opacity` is deliberately excluded: SVG /// applies it after filtering. Descendant opacity, paint alpha, and /// fill/stroke opacity are source-image facts. - fn filter_source_has_authored_translucency( - target: HtmlElement<'_>, + fn filter_source_has_authored_translucency<'d>( + target: HtmlElement<'d>, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], ) -> Result { - let mut stack = vec![(target, true)]; - while let Some((element, is_target)) = stack.pop() { + let mut stack = vec![(target, paint_contexts.to_vec(), true)]; + while let Some((element, contexts, is_target)) = stack.pop() { let data = element .borrow_data() .ok_or(CompileError::MissingComputedStyle)?; @@ -6745,26 +6942,25 @@ mod filter_resource { let SVGOpacity::Opacity(opacity) = opacity else { return Ok(true); }; - let paint = computed_paint(element, property)?; - match paint.kind { - SVGPaintKind::None => {} - SVGPaintKind::Color(color) => { - if opacity != 1.0 || style.resolve_color(&color).alpha != 1.0 { + match effective_source_paint(element, property, servers, &contexts)? { + EffectiveSourcePaint::None => {} + EffectiveSourcePaint::OpaqueSolid => { + if opacity != 1.0 { return Ok(true); } } - SVGPaintKind::PaintServer(_) - | SVGPaintKind::ContextFill - | SVGPaintKind::ContextStroke => return Ok(true), + // P2's profile matrix covers transparent tile space, + // source alpha inside the tile, and destination paint + // opacity for both fill and stroke pattern ingresses. + EffectiveSourcePaint::Pattern => {} + EffectiveSourcePaint::TranslucentSolid + | EffectiveSourcePaint::OtherServer + | EffectiveSourcePaint::Unresolved => return Ok(true), } } } - - let mut child = element.first_element_child(); - while let Some(next) = child { - stack.push((next, false)); - child = next.next_element_sibling(); - } + drop(data); + push_source_children(element, &contexts, &mut stack); } Ok(false) } @@ -6778,6 +6974,8 @@ mod filter_resource { region: Rectangle, target_to_frame: AffineTransform, override_skips: &HashMap, + servers: &PaintServers<'_>, + paint_contexts: &[PaintContext<'_>], ) -> Result, CompileError> { let mut nodes: Vec = Vec::new(); let mut names = HashMap::new(); @@ -7022,7 +7220,11 @@ mod filter_resource { "feDropShadow" => { patrol_color_style(element)?; patrol_flood_style(element, "feDropShadow")?; - if source_subtree_crosses_native_shadow_boundary(target)? { + if source_subtree_crosses_native_shadow_boundary( + target, + servers, + paint_contexts, + )? { return Err(CompileError::UnsupportedFilter( "feDropShadow's source subtree crosses the pinned-backend native-shadow source-layer precision boundary" .to_string(), @@ -7210,6 +7412,15 @@ mod filter_resource { source_dependencies.push(source_dependent); lighting_dependencies.push(lighting_dependent); } + let output_is_source_dependent = source_dependencies.last().copied().unwrap_or(false); + if output_is_source_dependent + && filter_source_crosses_pattern_profile_boundary(target, servers, paint_contexts)? + { + return Err(CompileError::UnsupportedFilter( + "a source-derived filter reads pattern paint outside the admitted direct sharp-rect source profile at the pinned-backend filtered-pattern coverage precision boundary" + .to_string(), + )); + } if has_blend { if !blend_mapping_is_admitted(target_to_frame) { return Err(CompileError::UnsupportedFilter( @@ -7263,16 +7474,20 @@ mod filter_resource { 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(), + .to_string(), )); } - if has_source_dependent_convolve_matrix && filter_source_has_paint_server(target)? { + if has_source_dependent_convolve_matrix + && filter_source_has_non_pattern_paint_server(target, servers, paint_contexts)? + { return Err(CompileError::UnsupportedFilter( "feConvolveMatrix's source image crosses the pinned-backend convolution-filter paint-server precision boundary" .to_string(), )); } - if has_source_dependent_morphology && filter_source_has_paint_server(target)? { + if has_source_dependent_morphology + && filter_source_has_non_pattern_paint_server(target, servers, paint_contexts)? + { return Err(CompileError::UnsupportedFilter( "feMorphology's source image crosses the pinned-backend morphology paint-server precision boundary" .to_string(), @@ -7281,17 +7496,19 @@ mod filter_resource { if has_source_dependent_active_morphology && morphology_source_has_filled_ellipse(target)? { return Err(CompileError::UnsupportedFilter( "feMorphology's active source image crosses the retained filled-ellipse coverage boundary" - .to_string(), + .to_string(), )); } - if has_source_dependent_multi_input && filter_source_has_authored_translucency(target)? { + if has_source_dependent_multi_input + && filter_source_has_authored_translucency(target, servers, paint_contexts)? + { return Err(CompileError::UnsupportedFilter( "a source-derived multi-input filter graph crosses the pinned-backend translucent-source composition precision boundary" .to_string(), )); } if has_source_dependent_color_matrix { - if !color_matrix_source_is_admitted(target)? { + if !color_matrix_source_is_admitted(target, servers, paint_contexts)? { return Err(CompileError::UnsupportedFilter( "feColorMatrix's source image crosses the pinned-backend color-matrix source-layer precision boundary" .to_string(), @@ -7318,7 +7535,7 @@ mod filter_resource { } } if has_source_dependent_component_transfer { - if filter_source_has_paint_server(target)? { + if filter_source_has_non_pattern_paint_server(target, servers, paint_contexts)? { return Err(CompileError::UnsupportedFilter( "feComponentTransfer's source image crosses the pinned-backend table-filter paint-server precision boundary" .to_string(), @@ -7387,6 +7604,8 @@ mod filter_resource { target_box: Option, bases: PercentBases, override_skips: &HashMap, + servers: &PaintServers<'d>, + paint_contexts: &[PaintContext<'d>], ) -> Result { let AuthoredFilter::Fragment(fragment) = authored_filter(target)? else { return Ok(Resolution::None); @@ -7449,6 +7668,8 @@ mod filter_resource { region, target_to_frame, override_skips, + servers, + paint_contexts, )? else { return Ok(Resolution::Hide); @@ -9484,7 +9705,6 @@ fn resolve_fill( else { return Ok(PaintStack::empty()); }; - let selected_through_context = selected.context.is_some(); let owner_data = selected .owner .borrow_data() @@ -9517,7 +9737,6 @@ fn resolve_fill( bases, paint_opacity, extra_opacity, - selected_through_context, "fill", )? { Some(stack) => Ok(stack.with_alpha_factor( @@ -9547,7 +9766,6 @@ fn resolve_paint_server_stack( bases: PercentBases, paint_opacity: f32, post_paint_opacity: f32, - selected_through_context: bool, property: &str, ) -> Result, CompileError> { let refusal = |reason: String| match property { @@ -9593,11 +9811,6 @@ fn resolve_paint_server_stack( }) } ClassifiedServer::Pattern(first) => { - if selected_through_context { - return Err(refusal(format!( - "url(#{fragment}) resolves to a pattern paint selected through context-fill/context-stroke, outside the admitted pattern composition slice" - ))); - } let Some((reference_box, owner_to_destination)) = reference_space() .map_err(|reason| refusal(format!("url(#{fragment}): {reason}")))? else { @@ -10359,7 +10572,6 @@ fn resolve_stroke( else { return Ok(None); }; - let selected_through_context = selected.context.is_some(); let owner_data = selected .owner .borrow_data() @@ -10394,7 +10606,6 @@ fn resolve_stroke( bases, paint_opacity, extra_opacity, - selected_through_context, "stroke", )? { Some(stack) => stack.with_alpha_factor( diff --git a/crates/websem/tests/context_paint_contract.rs b/crates/websem/tests/context_paint_contract.rs index c3b64e80..c48f2722 100644 --- a/crates/websem/tests/context_paint_contract.rs +++ b/crates/websem/tests/context_paint_contract.rs @@ -325,13 +325,22 @@ fn nonstandard_context_fallback_refuses_from_every_ingress() { } #[test] -fn pattern_and_external_urls_keep_their_own_refusal_through_context() { - let pattern = refusal(&document( - r##""##, +fn pattern_resolves_through_context_while_external_urls_keep_their_refusal() { + let pattern = admit_both(&document( + r##""##, )); + let resolved = pattern.nodes()[0] + .paints + .pattern() + .expect("the context owner selects one source-neutral pattern"); assert!( - matches!(pattern, CompileError::UnsupportedFill(ref reason) if reason.contains("pattern paint selected through context-fill/context-stroke")), - "{pattern}" + resolved.items().nodes().next().is_some(), + "the selected pattern retains its resolved source program" + ); + assert_eq!( + (resolved.width(), resolved.height()), + (5.0, 10.0), + "object-box tile extents use the 20x20 context owner's reference space" ); let external = refusal(&document( diff --git a/crates/websem/tests/filter_contract.rs b/crates/websem/tests/filter_contract.rs index 5e6fa3a5..cf5081e6 100644 --- a/crates/websem/tests/filter_contract.rs +++ b/crates/websem/tests/filter_contract.rs @@ -29,10 +29,11 @@ fn document(body: &str) -> String { ) } -fn admit_both(source: &str) -> Frame { - let strict = SvgFrameSource::from_standalone_svg(source, viewport()).expect("strict admits"); +fn admit_both_named(source: &str, context: &str) -> Frame { + let strict = SvgFrameSource::from_standalone_svg(source, viewport()) + .unwrap_or_else(|error| panic!("{context}: strict must admit: {error}")); let best = SvgFrameSource::from_standalone_svg_best_effort(source, viewport()) - .expect("best effort admits"); + .unwrap_or_else(|error| panic!("{context}: best effort must admit: {error}")); let declared: Vec<_> = best .degradations() .iter() @@ -40,13 +41,21 @@ fn admit_both(source: &str) -> Frame { .collect(); assert!( declared.is_empty(), - "an admitted filter declares nothing: {declared:?}" + "{context}: an admitted filter declares nothing: {declared:?}" ); let frame = strict.base_frame(); - assert_eq!(frame, best.base_frame(), "admissions are frame-identical"); + assert_eq!( + frame, + best.base_frame(), + "{context}: admissions are frame-identical" + ); frame } +fn admit_both(source: &str) -> Frame { + admit_both_named(source, "filter source") +} + fn assert_target_skip(source: &str, reason: &str) { let strict = SvgFrameSource::from_standalone_svg(source, viewport()).expect_err("strict must refuse"); @@ -1032,6 +1041,167 @@ fn component_transfer_precision_patrols_name_paint_server_and_transform_boundari )); } +#[test] +fn direct_rect_patterns_feed_every_admitted_source_dependent_filter_family() { + let primitives = [ + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + r##""##, + ]; + for primitive in primitives { + admit_both_named( + &document(&format!( + r##" + + + {primitive} + + "## + )), + primitive, + ); + } + + admit_both(&document( + r##" + + + + + + "##, + )); +} + +/// A stylesheet geometry declaration that could round the filtered target is +/// already the `rx`/`ry` property's own named departure. Strict refuses at the +/// sheet; best effort records that declaration as ignored before compiling the +/// sharp rectangle it actually represents. The filter profile must not claim +/// to consume the missing geometry property or duplicate its refusal. +#[test] +fn stylesheet_rect_radius_keeps_its_own_departure_before_pattern_filtering() { + for property in ["rx", "ry"] { + let source = document(&format!( + r##" + + + + + + "## + )); + let strict = SvgFrameSource::from_standalone_svg(source.as_str(), viewport()) + .expect_err("strict refuses the unrepresented geometry property"); + assert!( + strict + .to_string() + .contains(&format!("stylesheet declares {property}")), + "{property}: {strict}" + ); + + let best = SvgFrameSource::from_standalone_svg_best_effort(source.as_str(), viewport()) + .expect("best effort declares the property departure"); + let declared: Vec<_> = best + .degradations() + .iter() + .filter(|degradation| degradation.action() == DegradationAction::DeclarationIgnored) + .collect(); + assert_eq!(declared.len(), 1, "{property}: {declared:?}"); + assert!( + declared[0] + .reason() + .contains(&format!("stylesheet declares {property}")), + "{property}: {}", + declared[0].reason() + ); + assert!( + best.degradations() + .iter() + .all(|degradation| degradation.action() != DegradationAction::Skipped), + "{property}: the own-row declaration, not a duplicate filter skip, owns the gap" + ); + resolved_filter(&best.base_frame()); + } +} + +#[test] +fn context_selected_gradients_reach_the_existing_filter_precision_patrols() { + for (primitive, reason) in [ + ( + r##""##, + "native-shadow source-layer precision boundary", + ), + ( + r##""##, + "convolution-filter paint-server precision boundary", + ), + ( + r##""##, + "morphology paint-server precision boundary", + ), + ( + r##""##, + "table-filter paint-server precision boundary", + ), + ( + r##""##, + "color-matrix source-layer precision boundary", + ), + ( + r##""##, + "translucent-source composition precision boundary", + ), + ] { + assert_target_skip( + &document(&format!( + r##" + + + {primitive} + + + "## + )), + reason, + ); + } +} + +#[test] +fn filtered_patterns_refuse_curved_and_rounded_source_profiles() { + for (primitive, target) in [ + ( + r##""##, + r##""##, + ), + ( + r##""##, + r##""##, + ), + ] { + assert_target_skip( + &document(&format!( + r##" + + + {primitive} + + {target}"## + )), + "filtered-pattern coverage precision boundary", + ); + } +} + #[test] fn filtered_descendants_refuse_same_scope_clip_and_partial_opacity() { let defs = r##" diff --git a/crates/websem/tests/pattern_contract.rs b/crates/websem/tests/pattern_contract.rs index e92e93c9..31eeb15b 100644 --- a/crates/websem/tests/pattern_contract.rs +++ b/crates/websem/tests/pattern_contract.rs @@ -9,7 +9,7 @@ mod support; use cg::{CGColor, Paint}; -use rframe::{Frame, PatternPaint}; +use rframe::{Frame, FrameItem, PatternPaint, ScopeEffect}; use support::render_through_n0; use websem::{DegradationAction, InitialViewport, SvgFrameSource}; @@ -275,6 +275,68 @@ fn href_beats_xlink_and_the_first_local_content_owner_wins() { assert_eq!(solid_of(paint), CGColor::from_rgb(255, 0, 0)); } +#[test] +fn filters_inside_pattern_content_keep_the_measured_source_programs() { + let frame = admit_both(&document( + r##" + + + + + + "##, + )); + let source = pattern_of(&frame, 0); + assert!(source.items().iter().any(|item| { + matches!( + item, + FrameItem::ScopeBegin(scope) if matches!(scope.effect, ScopeEffect::Filter(_)) + ) + })); + + let nested = admit_both(&document( + r##" + + + + + + + "##, + )); + assert!(pattern_of(&nested, 0).items().iter().any(|item| { + matches!( + item, + FrameItem::ScopeBegin(scope) if matches!(scope.effect, ScopeEffect::Filter(_)) + ) + })); + + let multi_draw = admit_both(&document( + r##" + + + + + + "##, + )); + let source = pattern_of(&multi_draw, 0); + assert_eq!( + source.items().nodes().count(), + 2, + "the P2 group-filter profile intentionally carries both source draws" + ); + assert!(source.items().iter().any(|item| { + matches!( + item, + FrameItem::ScopeBegin(scope) if matches!(scope.effect, ScopeEffect::Filter(_)) + ) + })); +} + #[test] fn every_measured_picture_shader_boundary_refuses_in_both_admissions() { let cases = [ @@ -290,10 +352,6 @@ fn every_measured_picture_shader_boundary_refuses_in_both_admissions() { r##""##, "source-effect precision boundary", ), - ( - r##""##, - "filter composition outside the admitted pattern source slice", - ), ( r##""##, "composition precision boundary", diff --git a/crates/websem/tests/unsupported_corpus.rs b/crates/websem/tests/unsupported_corpus.rs index 55aca627..06b6a503 100644 --- a/crates/websem/tests/unsupported_corpus.rs +++ b/crates/websem/tests/unsupported_corpus.rs @@ -307,6 +307,11 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "fractional device-space displacement", ), + ( + "svg-filter-pattern-source-coverage-precision", + DeclaredByBestEffort, + "filtered-pattern coverage precision boundary", + ), ( "svg-filter-primitive", DeclaredByBestEffort, @@ -568,11 +573,6 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "picture-shader affine precision boundary", ), - ( - "svg-pattern-context-selection", - DeclaredByBestEffort, - "pattern paint selected through context-fill/context-stroke", - ), ( "svg-pattern-css-transform-percentage", DeclaredByBestEffort, @@ -643,11 +643,6 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "picture-shader source-effect precision boundary", ), - ( - "svg-pattern-source-filter", - DeclaredByBestEffort, - "filter composition outside the admitted pattern source slice", - ), ( "svg-pattern-source-unsupported", DeclaredByBestEffort, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index 28bcd13c..ae145287 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -45,7 +45,8 @@ from the dated addenda below: gradient paint (``/`` paint servers, the gradient rung), or a bounded same-document repeating vector pattern resolved per client through both pattern unit systems, template chains, `viewBox`, - and the admitted transform envelope; including + the admitted transform envelope, and standard context-paint selection; + including `context-fill`/`context-stroke` selected through same-document use instances and fully resolved before the frame; with centred stroke geometry, the closed cap/join family, opacity, and resolved @@ -75,19 +76,21 @@ from the dated addenda below: `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; + transforms, ``, and the established effect order; admitted filters may + execute inside a pattern tile program, and a pattern-painted direct + sharp-cornered rectangle may supply a filter's source image; one declared-font, single-run `` profile; viewBox-only root sizing with 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 874 Chromium-baked primitive cells plus 10 sampled frames. +- **The corpus** is 936 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 170 rows. + register has 169 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 @@ -3920,3 +3923,104 @@ therefore moves from 152 to 170. The primitive corpus moves from 812 to 874 cell exact-time sampled frames and the 451-cell filter estate are unchanged. Exactly two checklist rows tick: `patternUnits` and `patternContentUnits`. This records no conformance score and takes no FLIP action. + +## Rung: SVG pattern context and filter composition (2026-08-27) + +The verdict is ADMIT/SPLIT with no checklist closure. The P1 resolved pattern +program is sufficient for three further static relations: selecting a pattern +outward through `context-fill` or `context-stroke`, executing an admitted SVG +filter inside pattern content, and using pattern paint as a filter's source +image in one bounded source profile. `` remains open for external I/O, +unsupported descendants, dynamics, and the retained picture-shader precision +classes. `patternTransform` and every shared attribute/property row keep their +previous verdicts. + +Context selection now carries all four destination/owner crossings: fill or +stroke may select either a context fill or context stroke. The eventual +pattern owner keeps its reference box and coordinate map through immediate and +recursive `` instances, every instance translation, object-box and +user-space units, axis maps, reflection, exact quarter turns, and a singular +destination. Presentation-attribute and inline-CSS server ingress agree. +Invalid selected URLs activate their fallback; valid empty patterns suppress +it. Destination paint opacity remains on the destination, and target filter +and mask scopes retain the established order. + +An admitted filter may now live inside the pattern's checked `FrameItems` +program. The matrix covers sRGB and linearRGB, both filter and primitive unit +systems, hard regions, SourceGraphic and SourceAlpha, generated inputs, named +results, one- and two-input graphs, groups and adjacent draws, and +representatives of every admitted primitive family. A filter around the sole +nested-pattern draw is admitted; the independently measured wrong case—another +draw beside a nested pattern—continues to refuse. No URL, DOM node, cascade +fact, backend object, or fixed-resolution raster was added to `rframe`. +A follow-up scratch crossing made each of the twelve admitted filter families +visibly exercise that sole nested-pattern draw; all thirteen controls and +candidates were exact through both admissions (twenty-six comparisons, +measured, not celled). + +Pattern paint also feeds source-dependent filters when the filtered source is +one direct sharp-cornered rectangle with exactly one pattern-painted fill or +simple stroke channel. The exact matrix includes transparent tile space, +source alpha, destination paint opacity, two-draw opaque tiles, gradients, +masks, strokes, and nested patterns inside the tile. Color matrix, component +transfer, morphology, convolution, native drop shadow, source-derived +multi-input composition, blur, offset, blend, merge, displacement, and diffuse +lighting all reproduce Chromium in that profile. +The six operation families not repeated on strokes in the first ingress matrix +were then crossed with direct and context-selected pattern strokes, both opaque +and partially opaque. All twenty-four visibly discriminating candidates plus +four controls were exact through strict and best effort (fifty-six comparisons, +measured, not celled). + +The crux found a pre-existing silent patrol bypass. Filter precision checks +inspected each target's authored paint token, so a `context-fill` or +`context-stroke` token hid the eventual gradient server. Before repair, +context-selected gradients changed 738 pixels at maximum channel delta 1 under +component transfer, 2,277 at delta 7 under convolution, 1,262 at delta 1 under +morphology, and 684 at delta 1 under native drop shadow. Filter resolution now +receives the active context-owner stack and whole-document paint-server table, +classifies the eventual source paint, and routes those gradients to the same +existing stable precision names as direct gradients. This is a producer-side +classification fact; nothing new crosses the frame seam (measured, not +celled). + +Measurement also rejected a blanket pattern exemption. A pattern-filled cubic +path differed by one pixel at delta 1 under color matrix and component +transfer, one pixel at delta 2 under offset, and two pixels at delta 2 under +merge. A rounded rectangle differed by fifteen pixels at delta 1 under blur, +one pixel at delta 7 under morphology, and four pixels at delta 4 under native +drop shadow. A single operation-independent filtered-pattern source-profile +patrol now quarantines curved, rounded, multi-draw, and wider container +filter targets before any filter executes. This is distinct from a filter +inside the tile program: the exact group and adjacent-draw cells above +deliberately admit multiple solid/gradient tile draws. Stylesheet `rx`/`ry` +remains the independent geometry-property departure—the pinned cascade does +not represent that rounded geometry—while authored radius attributes reach +this profile patrol. Its focused refusal witness protects both admissions. +Exact circle and ellipse-stroke controls do not widen that predicate; +over-refusal is deliberate until a complete geometry class earns its own +profile (measured, not celled). + +The P1 source residues were rechecked and remain separate. Curved geometry +inside the tile, isolated multi-draw source opacity, a geometric source clip, +and another draw beside a nested pattern still reach their original stable +picture-shader names. P2 changes neither those patrols nor the external, +unsupported-descendant, used-range, fractional-tile, affine, or depth +boundaries. + +Sixty-two cells entered only through `just add`: twenty-three context cells, +twenty-one filter-inside-source cells, twelve pattern-as-filter-source cells, +and six diverse source-profile cells. Every cell is twice-deterministic in +Chromium 149.0.7827.55 and exact through strict and best-effort n0 admission +without a tolerance. The two former context/source-filter refusal rows +graduate into cells; one filtered-pattern coverage row joins the register. +The primitive corpus therefore moves from 874 to 936 cells, the ten sampled +frames and 451-cell filter estate are unchanged, and the named register moves +from 170 to 169 rows. + +Gate sensitivity was proved at the new classification seam. Temporarily +classifying an eventual pattern as an unadmitted server made `just gate` fail +on `svg-pattern-context-filter-color-matrix` with the existing color-matrix +source-layer refusal. Restoring the classification returned the complete +936-cell gate to green. No conformance score was produced, and no FLIP record, +rule, or baseline changed. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index bb27cd92..d0ead31c 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -1713,13 +1713,24 @@ for attributes the platform ships ahead of the SVG 2 indexes. > transforms, ``, effects around the target, nested repetition, and the > invalid-reference-fallback versus valid-empty distinction are carried by 62 > exact Chromium cells. The element stays open: external template facts, -> context-selected pattern paint, unsupported source descendants, curved -> source coverage, source filters, isolated source effects, mixed nested +> unsupported source descendants, curved +> source coverage, isolated source effects, mixed nested > composition, used-length saturation, fractional tile sampling, and general > affine mapping refuse by stable name at measured pixel boundaries. A ninth > distinct nested program now refuses before source compilation begins. Shared > `x`/`y`/`width`/`height`, `href`, `viewBox`, CSS-token/value-type, resource, and > dynamics rows remain independently open. +> +> **2026-08-27 composition split:** 62 further exact Chromium cells admit a +> pattern selected through all four `fill`/`stroke` × +> `context-fill`/`context-stroke` crossings, filters inside the resolved tile +> program, and pattern paint as a filter source in the measured direct +> sharp-rectangle profile. The element remains open. A source-derived filter +> over curved, rounded, multi-draw, or otherwise wider pattern-painted target +> geometry now refuses at its own measured filtered-pattern coverage boundary; +> every P1 source-coverage/effect/nesting boundary above also remains. External +> I/O, unsupported source descendants, and pattern dynamics are unchanged. +> No checklist row closes in this composition rung. - [x] `` - [x] `` diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 44114fc0..722a18af 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -101,7 +101,7 @@ is exactly what the engine renders pixel-for-pixel. | `svg-context-paint-plain-no-context.svg` · `svg-context-paint-host-none.svg` · `svg-context-paint-currentcolor-alpha.svg` · `svg-context-paint-inheritance-css-wide.svg` | Selection and cascade edges: both keywords paint nothing without a context, a selected host `none` stays no paint, `currentColor` resolves at the context owner and the selected colour's alpha survives, and inherited context values plus explicit `inherit`/`unset`/`initial` retain their ordinary computed meanings. The no-context and host-none cells exercise all four fill/stroke crossings; the first also carries both source spellings. | | `svg-context-paint-nested.svg` · `svg-context-paint-multi-instance-light-tree.svg` | Instance identity: context keywords recurse through nested uses, a concrete nearest-use paint wins over an outer one, the uninstantiated light-tree source paints no context colour, and two instances of it resolve independently. | | `svg-context-paint-missing-url-fallback.svg` · `svg-context-paint-stopless-fallback-inert.svg` · `svg-context-paint-{linear,radial}-obb-host-box.svg` · `svg-context-paint-{linear,radial}-userspace-host.svg` · `svg-context-paint-nested-url-owner-box.svg` · `svg-context-paint-bbox-contributors.svg` | Paint-server selection and coordinates: an invalid URL fires its fallback before selection, while a valid stopless gradient paints nothing without firing it. Object-bounding-box linear/radial ramps span separated leaves without restarting; user-space linear/radial ramps stay in the use owner's coordinates across a translated leaf; recursive selection retains the eventual outer URL owner's box. The context box is the union of instance geometry: `opacity:0` and `visibility:hidden` contribute, while `display:none` does not. | -| *(measured, not celled)* | Paint opacity is not copied with a selected paint: fill/stroke opacity remains an ordinary independently inherited property. A 102-capture Chromium matrix also measured the standard-invalid `context-fill red`/`context-stroke none` tails dropping in presentation attributes and inline style; the pinned parser extension is therefore a named registered refusal, guarded at those ingresses and in author stylesheets. Two follow-up matrices measured every `` `x`/`y` translation accumulating while the eventual URL owner stays fixed, context object-bounding-box using transformed local AABBs rather than exact post-transform curve bounds, and singular destination transforms painting nothing. Same-document patterns and external paint URLs propagate through a context keyword in Chromium (measured) but retain their own named resource refusals here; marker context and author stylesheets across a use-shadow boundary likewise stay with their own checklist/register rows. These own-row gaps do not reopen the four `fill`/`stroke` rows under the gridaco/nothing#75/#80 precedent. | +| *(measured, not celled)* | Paint opacity is not copied with a selected paint: fill/stroke opacity remains an ordinary independently inherited property. A 102-capture Chromium matrix also measured the standard-invalid `context-fill red`/`context-stroke none` tails dropping in presentation attributes and inline style; the pinned parser extension is therefore a named registered refusal, guarded at those ingresses and in author stylesheets. Two follow-up matrices measured every `` `x`/`y` translation accumulating while the eventual URL owner stays fixed, context object-bounding-box using transformed local AABBs rather than exact post-transform curve bounds, and singular destination transforms painting nothing. Same-document patterns now propagate through a context keyword in the admitted pattern-composition profile; external paint URLs retain their named resource refusal. Marker context and author stylesheets across a use-shadow boundary likewise stay with their own checklist/register rows. These own-row gaps do not reopen the four `fill`/`stroke` rows under the gridaco/nothing#75/#80 precedent. | | `svg-gradient-stroke-css.svg` | The gradient stroke's CSS twin: `style="stroke:url(#g)"` bakes onto `svg-gradient-stroke`'s exact oracle bytes — one computed paint, both spellings. | | `svg-stroke-inherited.svg` | `stroke` and `stroke-width` inherit through a `` by the one cascade — the shape the tiger is built from. | | `svg-stroke-circle.svg` · `svg-stroke-ellipse.svg` · `svg-stroke-path-open.svg` · `svg-stroke-path-closed.svg` · `svg-stroke-line.svg` | A stroke on every admitted geometry. The closed path's round join at its closing corner is the corpus's only stroke cell that is not byte-exact — see the tolerance note below. | @@ -252,7 +252,11 @@ is exactly what the engine renders pixel-for-pixel. | `svg-pattern-{transform-hint,transform-css,plain-transform-inert,transform-quarter-turn,transform-axis-scale,target-axis-transform}.svg` | Transform ownership and the admitted mapping envelope: `patternTransform` as a presentation hint, author CSS precedence, inert plain `transform`, exact quarter turn, axis scale, and a mapped target. All six are byte-exact. | | `svg-pattern-{fill-circle,fill-path-cubic,fill-path-evenodd,fill-rounded-rect,stroke-rect,stroke-ellipse,stroke-dash-round,target-fill-opacity,target-element-opacity,target-clip,target-mask,target-filter,target-group-opacity,fill-stroke-opacity,overflow-default-clip}.svg` | Pattern consumers and outer effect order: every admitted geometry kind, fill rule, rounded geometry, centred and dashed strokes, both paint-opacity stages, target clip/mask/filter/group opacity, fill plus stroke, and default tile clipping. All fifteen are byte-exact. | | `svg-pattern-{source-one-draw-opacity,source-gradient,source-use,source-mask,nested-repeat,use-translate,use-scale,mask-source}.svg` · `html-inline-svg-pattern.html` | Admitted source programs and host composition: one-draw folded opacity, a gradient, ``, a mask, bounded nested repetition, translated/scaled use instances, a pattern inside a mask source, and the inline-HTML SVG entry. All nine are byte-exact. | -| *(measured, not celled — pattern split)* | Twice-deterministic Chromium 149 probes and both actual CLI admissions establish the conservative picture-shader envelope. General rotation is content-dependent: sampled layouts were exact, while two grids changed 2px/Δ1 and 1px/Δ3. Shear/skew changed 147–222px/Δ2; fractional final tile extents changed 164–407px up to Δ28; curved source geometry changed 189–315px up to Δ32; isolated multi-draw source opacity changed 1,152–1,728px/Δ2; a circular source clip changed 216px/Δ9; and another draw beside a nested pattern changed 108px/Δ1. Stable refusal fixtures guard each class in strict and best-effort modes. A manual-review probe found CSS comments around a valid tile length were honored by Chromium while both admissions silently selected fallback, changing all 2,304 target pixels at Δ202; `svg-pattern-length-css-comments` now names that route. The law pass also restored the planned boundary for a pattern selected through `context-fill`/`context-stroke`: Chromium paints it 1,152px/Δ255 apart from no paint, but the route has no committed composition matrix yet and now refuses by name. Chromium honors a sampled safe blur inside pattern source content (filtered versus plain: 2,304px/Δ182), and this route happened to match that one Chromium raster exactly; it still refuses pending a complete pattern×filter matrix. The used-range follow-up found Chromium clamps huge positive, adjacent, negative, and finite beyond-binary32 `x` sources; the former raw route changed 1,152, 1,152, 768, and 2,112px respectively, all at Δ205, and now refuses. The `57384.267578125007%` and direct midpoint-adjacent number probes found no second normalization alias at 64×64 because Chromium's adjacent controls were pixel-identical; the conservative raw-decoder provenance patrol remains, but no mismatch is claimed for that alias class. PR review added two producer guards. Chromium resolves inline CSS `transform:translate(50%, 0px)` on a 14-unit pattern against the 64-unit viewport, exact to `32px`; the former tile-width basis selected `7px` and changed 1,008px/Δ205, so that CSS route now refuses until its reference box is proved. A ninth distinct nested pattern now refuses before its source walk begins instead of recursing until the completed contract rejects it. Changing tile filtering to nearest moved no admitted cell and was rejected as a sensitivity proof. Changing horizontal repetition to clamp made 43 pattern cells fail, up to 1,824px/Δ255; restoration returned all 874 cells green. The corpus is now 874 cells plus 10 sampled frames, the filter estate remains 451 cells, and the named register has 170 rows. | +| `svg-pattern-context-*.svg` | Twenty-three context-composition cells: all four destination/owner paint crossings, attribute and CSS ingress, object-box ownership, recursive owners and instance translations, admitted maps and singular no-paint, invalid fallback versus valid empty, destination opacity, mask/filter ordering, and six precision-sensitive filters consuming a context-selected pattern. All are byte-exact. | +| `svg-pattern-source-filter*.svg` | Twenty-one filter-inside-tile cells: both color spaces and unit systems, hard regions, SourceGraphic/SourceAlpha, generated inputs, names and multi-input graphs, groups and adjacent draws, every admitted primitive family, and one filter around a sole nested-pattern draw. All are byte-exact. | +| `svg-pattern-target-filter-{blur,offset,composite,merge,drop-shadow,color-matrix,component-transfer,blend,morphology,displacement,convolve,diffuse}.svg` · `svg-pattern-filter-profile-*.svg` | Twelve pattern-as-SourceGraphic operation cells plus six source-profile cells. The measured direct sharp-rectangle profile includes fill/stroke paint opacity, transparent and alpha-bearing tiles, gradients, masks, strokes, and nested patterns. All are byte-exact. | +| *(measured, not celled — retained pattern splits)* | Twice-deterministic Chromium 149 probes and both actual CLI admissions establish the conservative picture-shader envelope. General rotation is content-dependent: sampled layouts were exact, while two grids changed 2px/Δ1 and 1px/Δ3. Shear/skew changed 147–222px/Δ2; fractional final tile extents changed 164–407px up to Δ28; curved source geometry changed 189–315px up to Δ32; isolated multi-draw source opacity changed 1,152–1,728px/Δ2; a circular source clip changed 216px/Δ9; and another draw beside a nested pattern changed 108px/Δ1. The used-range witnesses changed 768–2,112px at Δ205 before their patrol. CSS comments around a valid tile length changed all 2,304 target pixels at Δ202, and a CSS percentage transform using the former tile-width basis changed 1,008px at Δ205. Stable refusal fixtures guard each class. The `57384.267578125007%` and midpoint-adjacent controls remain pixel-identical at 64×64, so no second mismatch is claimed for that conservative provenance patrol. | +| *(measured, not celled — pattern/filter split)* | The context-aware filter audit found that an authored context keyword hid the eventual gradient from old source-profile patrols: component transfer changed 738px/Δ1, convolution 2,277px/Δ7, morphology 1,262px/Δ1, and native drop shadow 684px/Δ1. Those routes now reach their existing stable names. Pattern profiles were exact across 154 strict/best comparisons over transparent, alpha, opaque, gradient-bearing, masked, stroked, and nested tiles, and another 112 comparisons covered fill/stroke, both context crossings, and destination paint opacity. Follow-ups made all twelve admitted families visibly exercise a sole nested-pattern draw (26 exact strict/best comparisons including the control), then crossed the six remaining families with direct/context pattern strokes at opaque and partial paint opacity (56 exact comparisons). A blanket exemption was rejected: a pattern-filled cubic path differed under color matrix/component transfer (1px/Δ1), offset (1px/Δ2), and merge (2px/Δ2); a rounded rect differed under blur (15px/Δ1), morphology (1px/Δ7), and drop shadow (4px/Δ4). The new filtered-pattern coverage refusal admits only the complete direct sharp-rect profile. Misclassifying a pattern as an unadmitted server made `just gate` fail on the context/color-matrix cell; restoration returned all 936 cells green. The corpus is now 936 cells plus 10 sampled frames, the separately tracked filter estate remains 451 cells, and the named register has 169 rows. | | `svg-path-cubic-fill.svg` · `svg-path-smooth-cubic.svg` · `svg-path-quadratic.svg` | Curved path cells: a cubic, an `S` continuation, and a `Q`+`T` pair. All three bake **byte-exact** — see the note below. | | `svg-path-fill-rule-nonzero.svg` · `svg-path-fill-rule-evenodd.svg` · `svg-path-fill-rule-inherited.svg` | One self-intersecting star under each fill rule (core filled vs hollow), and the rule inherited from a `` through the one cascade. | | `svg-path-two-subpaths.svg` · `svg-path-in-scaled-group.svg` | Two closed contours in one `d`, and a path carried by a group's `scale(2)`. | diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index ef1f9abe..f82cabc5 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 (874) +## Chromium-baked cells (936) Each renders byte-exact against its committed Chromium oracle (seven curved cells and four gradient ramps carry a declared, bounded @@ -664,6 +664,29 @@ to its fixture source. No new image is committed for this view. svg-path-smooth-cubic svg-path-two-subpaths svg-path-unclosed-fill +svg-pattern-context-axis-transform +svg-pattern-context-css-ingress +svg-pattern-context-destination-opacity +svg-pattern-context-fill-from-stroke +svg-pattern-context-filter-color-matrix +svg-pattern-context-filter-component-transfer +svg-pattern-context-filter-composite +svg-pattern-context-filter-convolve +svg-pattern-context-filter-drop-shadow +svg-pattern-context-filter-morphology +svg-pattern-context-invalid-fallback +svg-pattern-context-nested-translate +svg-pattern-context-object-box +svg-pattern-context-quarter-turn +svg-pattern-context-recursive-owner +svg-pattern-context-reflection +svg-pattern-context-selection +svg-pattern-context-singular +svg-pattern-context-stroke-from-fill +svg-pattern-context-stroke-from-stroke +svg-pattern-context-target-filter +svg-pattern-context-target-mask +svg-pattern-context-valid-empty svg-pattern-degenerate-viewbox-fallback svg-pattern-descriptive-content-drop svg-pattern-duplicate-id-first @@ -672,6 +695,12 @@ to its fixture source. No new image is committed for this view. svg-pattern-fill-path-evenodd svg-pattern-fill-rounded-rect svg-pattern-fill-stroke-opacity +svg-pattern-filter-profile-alpha +svg-pattern-filter-profile-gradient +svg-pattern-filter-profile-mask +svg-pattern-filter-profile-nested +svg-pattern-filter-profile-stroke +svg-pattern-filter-profile-transparent svg-pattern-height-absent-fallback svg-pattern-height-negative-fallback svg-pattern-height-zero-fallback @@ -692,6 +721,27 @@ to its fixture source. No new image is committed for this view. svg-pattern-px-lengths svg-pattern-repeat svg-pattern-singular-transform-fallback +svg-pattern-source-filter +svg-pattern-source-filter-blend +svg-pattern-source-filter-blur-linear +svg-pattern-source-filter-color-matrix +svg-pattern-source-filter-component-transfer +svg-pattern-source-filter-composite-arithmetic +svg-pattern-source-filter-composite-in +svg-pattern-source-filter-convolve +svg-pattern-source-filter-diffuse +svg-pattern-source-filter-displacement +svg-pattern-source-filter-drop-shadow +svg-pattern-source-filter-flood +svg-pattern-source-filter-group-two-draws +svg-pattern-source-filter-hard-region +svg-pattern-source-filter-merge +svg-pattern-source-filter-morphology +svg-pattern-source-filter-nested-pattern +svg-pattern-source-filter-object-units +svg-pattern-source-filter-offset +svg-pattern-source-filter-plus-draw +svg-pattern-source-filter-turbulence svg-pattern-source-gradient svg-pattern-source-mask svg-pattern-source-one-draw-opacity @@ -704,6 +754,18 @@ to its fixture source. No new image is committed for this view. svg-pattern-target-element-opacity svg-pattern-target-fill-opacity svg-pattern-target-filter +svg-pattern-target-filter-blend +svg-pattern-target-filter-blur +svg-pattern-target-filter-color-matrix +svg-pattern-target-filter-component-transfer +svg-pattern-target-filter-composite +svg-pattern-target-filter-convolve +svg-pattern-target-filter-diffuse +svg-pattern-target-filter-displacement +svg-pattern-target-filter-drop-shadow +svg-pattern-target-filter-merge +svg-pattern-target-filter-morphology +svg-pattern-target-filter-offset svg-pattern-target-group-opacity svg-pattern-target-mask svg-pattern-template-style-owner @@ -903,7 +965,7 @@ to its fixture source. No new image is committed for this view. svg-visibility-rule-beats-attribute svg-visibility-unhide -## The refusal register (170) +## The refusal register (169) What the slice refuses, by name, in the compiler's own words — **both refuse** is a document-level contract; **declared** renders @@ -970,6 +1032,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-pattern-source-coverage-precision` | declared | skipped svg/path[1]: unsupported SVG filter: a source-derived filter reads pattern paint outside the admitted direct sharp-rect source profile at the pinned-backend filtered-pattern coverage precision boundary | | `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 | @@ -1029,7 +1092,6 @@ its row into the cells above. | `svg-path-css-d-property` | declared | declaration ignored at svg/style[1]: a stylesheet declares d, which this cascade does not represent; elements it matches render without it | | `svg-path-marker-end` | declared | skipped svg/path[1]: unsupported rendering attribute marker-end on (not yet consumed) | | `svg-pattern-affine-precision` | declared | skipped svg/rect[2]: unsupported fill value "target mapping carries a general rotation or shear at the pinned-backend picture-shader affine precision boundary" | -| `svg-pattern-context-selection` | declared | skipped svg/use[1]/rect[1]: unsupported fill value "url(#p) resolves to a pattern paint selected through context-fill/context-stroke, outside the admitted pattern composition slice" | | `svg-pattern-css-transform-percentage` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern transform percentage has no proved reference-box basis" | | `svg-pattern-external` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p needs attributes or content from an external template, and external resources are not resolved" | | `svg-pattern-length-calc` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern width uses a CSS function in \"calc(4px + 4px)\", which this direct decoder does not consume" | @@ -1044,7 +1106,6 @@ its row into the cells above. | `svg-pattern-source-clip-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p source carries an isolated opacity or geometric clip at the pinned-backend picture-shader source-effect precision boundary" | | `svg-pattern-source-coverage-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p source carries curved/vector geometry at the pinned-backend picture-shader source-coverage precision boundary" | | `svg-pattern-source-effect-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p source carries an isolated opacity or geometric clip at the pinned-backend picture-shader source-effect precision boundary" | -| `svg-pattern-source-filter` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p source uses a filter composition outside the admitted pattern source slice" | | `svg-pattern-source-unsupported` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): pattern #p source cannot compile completely: unsupported element " | | `svg-pattern-tile-sampling-precision` | declared | skipped svg/rect[2]: unsupported fill value "tile has a fractional final device extent at the pinned-backend picture-shader sampling precision boundary" | | `svg-pattern-transform-none-provenance` | declared | skipped svg/rect[2]: unsupported fill value "url(#p): an author stylesheet may set transform:none on a derived pattern; the empty computed value loses the provenance needed to decide template inheritance" | diff --git a/fixtures/web-first/chromium/svg-pattern-context-axis-transform.png b/fixtures/web-first/chromium/svg-pattern-context-axis-transform.png new file mode 100644 index 00000000..11433655 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-axis-transform.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-css-ingress.png b/fixtures/web-first/chromium/svg-pattern-context-css-ingress.png new file mode 100644 index 00000000..f3b4752c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-css-ingress.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-destination-opacity.png b/fixtures/web-first/chromium/svg-pattern-context-destination-opacity.png new file mode 100644 index 00000000..4ff33854 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-destination-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-fill-from-stroke.png b/fixtures/web-first/chromium/svg-pattern-context-fill-from-stroke.png new file mode 100644 index 00000000..f926ce4e Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-fill-from-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-color-matrix.png b/fixtures/web-first/chromium/svg-pattern-context-filter-color-matrix.png new file mode 100644 index 00000000..3da93fcb Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-color-matrix.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-component-transfer.png b/fixtures/web-first/chromium/svg-pattern-context-filter-component-transfer.png new file mode 100644 index 00000000..ad132091 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-component-transfer.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-composite.png b/fixtures/web-first/chromium/svg-pattern-context-filter-composite.png new file mode 100644 index 00000000..472c4566 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-composite.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-convolve.png b/fixtures/web-first/chromium/svg-pattern-context-filter-convolve.png new file mode 100644 index 00000000..75108e75 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-convolve.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-drop-shadow.png b/fixtures/web-first/chromium/svg-pattern-context-filter-drop-shadow.png new file mode 100644 index 00000000..9c11f353 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-drop-shadow.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-filter-morphology.png b/fixtures/web-first/chromium/svg-pattern-context-filter-morphology.png new file mode 100644 index 00000000..2776c0e1 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-filter-morphology.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-invalid-fallback.png b/fixtures/web-first/chromium/svg-pattern-context-invalid-fallback.png new file mode 100644 index 00000000..9dbc606a Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-invalid-fallback.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-nested-translate.png b/fixtures/web-first/chromium/svg-pattern-context-nested-translate.png new file mode 100644 index 00000000..293d89bb Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-nested-translate.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-object-box.png b/fixtures/web-first/chromium/svg-pattern-context-object-box.png new file mode 100644 index 00000000..f180788e Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-object-box.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-quarter-turn.png b/fixtures/web-first/chromium/svg-pattern-context-quarter-turn.png new file mode 100644 index 00000000..f3b4752c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-quarter-turn.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-recursive-owner.png b/fixtures/web-first/chromium/svg-pattern-context-recursive-owner.png new file mode 100644 index 00000000..f3b4752c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-recursive-owner.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-reflection.png b/fixtures/web-first/chromium/svg-pattern-context-reflection.png new file mode 100644 index 00000000..f3b4752c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-reflection.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-selection.png b/fixtures/web-first/chromium/svg-pattern-context-selection.png new file mode 100644 index 00000000..f3b4752c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-selection.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-singular.png b/fixtures/web-first/chromium/svg-pattern-context-singular.png new file mode 100644 index 00000000..d9b4b216 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-singular.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-stroke-from-fill.png b/fixtures/web-first/chromium/svg-pattern-context-stroke-from-fill.png new file mode 100644 index 00000000..5d910702 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-stroke-from-fill.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-stroke-from-stroke.png b/fixtures/web-first/chromium/svg-pattern-context-stroke-from-stroke.png new file mode 100644 index 00000000..5d910702 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-stroke-from-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-target-filter.png b/fixtures/web-first/chromium/svg-pattern-context-target-filter.png new file mode 100644 index 00000000..465dbec6 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-target-filter.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-target-mask.png b/fixtures/web-first/chromium/svg-pattern-context-target-mask.png new file mode 100644 index 00000000..a4a6bdc9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-target-mask.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-context-valid-empty.png b/fixtures/web-first/chromium/svg-pattern-context-valid-empty.png new file mode 100644 index 00000000..d9b4b216 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-context-valid-empty.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-alpha.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-alpha.png new file mode 100644 index 00000000..387e7fa3 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-gradient.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-gradient.png new file mode 100644 index 00000000..3d05ca6e Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-gradient.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-mask.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-mask.png new file mode 100644 index 00000000..d0138b9d Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-mask.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-nested.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-nested.png new file mode 100644 index 00000000..8901f459 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-nested.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-stroke.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-stroke.png new file mode 100644 index 00000000..2e4a20d5 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-filter-profile-transparent.png b/fixtures/web-first/chromium/svg-pattern-filter-profile-transparent.png new file mode 100644 index 00000000..da8a86f7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-filter-profile-transparent.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-blend.png b/fixtures/web-first/chromium/svg-pattern-source-filter-blend.png new file mode 100644 index 00000000..da15476f Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-blend.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-blur-linear.png b/fixtures/web-first/chromium/svg-pattern-source-filter-blur-linear.png new file mode 100644 index 00000000..19bd9024 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-blur-linear.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-color-matrix.png b/fixtures/web-first/chromium/svg-pattern-source-filter-color-matrix.png new file mode 100644 index 00000000..b891d7eb Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-color-matrix.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-component-transfer.png b/fixtures/web-first/chromium/svg-pattern-source-filter-component-transfer.png new file mode 100644 index 00000000..5c1261d0 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-component-transfer.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-composite-arithmetic.png b/fixtures/web-first/chromium/svg-pattern-source-filter-composite-arithmetic.png new file mode 100644 index 00000000..92cc565c Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-composite-arithmetic.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-composite-in.png b/fixtures/web-first/chromium/svg-pattern-source-filter-composite-in.png new file mode 100644 index 00000000..b08b520f Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-composite-in.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-convolve.png b/fixtures/web-first/chromium/svg-pattern-source-filter-convolve.png new file mode 100644 index 00000000..1fa42353 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-convolve.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-diffuse.png b/fixtures/web-first/chromium/svg-pattern-source-filter-diffuse.png new file mode 100644 index 00000000..a1401817 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-diffuse.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-displacement.png b/fixtures/web-first/chromium/svg-pattern-source-filter-displacement.png new file mode 100644 index 00000000..91f0193a Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-displacement.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-drop-shadow.png b/fixtures/web-first/chromium/svg-pattern-source-filter-drop-shadow.png new file mode 100644 index 00000000..80245448 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-drop-shadow.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-flood.png b/fixtures/web-first/chromium/svg-pattern-source-filter-flood.png new file mode 100644 index 00000000..aa3d44a3 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-flood.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-group-two-draws.png b/fixtures/web-first/chromium/svg-pattern-source-filter-group-two-draws.png new file mode 100644 index 00000000..ad66c828 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-group-two-draws.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-hard-region.png b/fixtures/web-first/chromium/svg-pattern-source-filter-hard-region.png new file mode 100644 index 00000000..589aa344 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-hard-region.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-merge.png b/fixtures/web-first/chromium/svg-pattern-source-filter-merge.png new file mode 100644 index 00000000..9d8589ef Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-merge.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-morphology.png b/fixtures/web-first/chromium/svg-pattern-source-filter-morphology.png new file mode 100644 index 00000000..1e8e3db8 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-morphology.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-nested-pattern.png b/fixtures/web-first/chromium/svg-pattern-source-filter-nested-pattern.png new file mode 100644 index 00000000..d7a2a85f Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-nested-pattern.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-object-units.png b/fixtures/web-first/chromium/svg-pattern-source-filter-object-units.png new file mode 100644 index 00000000..d780464b Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-object-units.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-offset.png b/fixtures/web-first/chromium/svg-pattern-source-filter-offset.png new file mode 100644 index 00000000..0f53b6cf Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-offset.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-plus-draw.png b/fixtures/web-first/chromium/svg-pattern-source-filter-plus-draw.png new file mode 100644 index 00000000..6ae62462 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-plus-draw.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter-turbulence.png b/fixtures/web-first/chromium/svg-pattern-source-filter-turbulence.png new file mode 100644 index 00000000..a8ecf2f5 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter-turbulence.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-source-filter.png b/fixtures/web-first/chromium/svg-pattern-source-filter.png new file mode 100644 index 00000000..19bd9024 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-source-filter.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-blend.png b/fixtures/web-first/chromium/svg-pattern-target-filter-blend.png new file mode 100644 index 00000000..305d9a23 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-blend.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-blur.png b/fixtures/web-first/chromium/svg-pattern-target-filter-blur.png new file mode 100644 index 00000000..465dbec6 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-blur.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-color-matrix.png b/fixtures/web-first/chromium/svg-pattern-target-filter-color-matrix.png new file mode 100644 index 00000000..a2616542 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-color-matrix.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-component-transfer.png b/fixtures/web-first/chromium/svg-pattern-target-filter-component-transfer.png new file mode 100644 index 00000000..c89baae9 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-component-transfer.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-composite.png b/fixtures/web-first/chromium/svg-pattern-target-filter-composite.png new file mode 100644 index 00000000..da8a86f7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-composite.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-convolve.png b/fixtures/web-first/chromium/svg-pattern-target-filter-convolve.png new file mode 100644 index 00000000..3ea43bfa Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-convolve.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-diffuse.png b/fixtures/web-first/chromium/svg-pattern-target-filter-diffuse.png new file mode 100644 index 00000000..07f2b312 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-diffuse.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-displacement.png b/fixtures/web-first/chromium/svg-pattern-target-filter-displacement.png new file mode 100644 index 00000000..fb00dffe Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-displacement.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-drop-shadow.png b/fixtures/web-first/chromium/svg-pattern-target-filter-drop-shadow.png new file mode 100644 index 00000000..0a98cdf3 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-drop-shadow.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-merge.png b/fixtures/web-first/chromium/svg-pattern-target-filter-merge.png new file mode 100644 index 00000000..31bb5f12 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-merge.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-morphology.png b/fixtures/web-first/chromium/svg-pattern-target-filter-morphology.png new file mode 100644 index 00000000..4225fd99 Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-morphology.png differ diff --git a/fixtures/web-first/chromium/svg-pattern-target-filter-offset.png b/fixtures/web-first/chromium/svg-pattern-target-filter-offset.png new file mode 100644 index 00000000..a2419e2b Binary files /dev/null and b/fixtures/web-first/chromium/svg-pattern-target-filter-offset.png differ diff --git a/fixtures/web-first/oracle-bake.json b/fixtures/web-first/oracle-bake.json index 0046842e..e3c21f1a 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": "25d5f7f1423060a73cbe6b9378e82b92ecf6b5ba93e9edb5555d75d59a34f6ae", + "suite_sha256": "30d3eec63248d55759c4f312d50acb4b0bd1dbac847611e5aa1a97da6a8e33dc", "capture": { "device_scale_factor": 1, "omit_background": true, @@ -5743,6 +5743,213 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-context-axis-transform", + "source": "svg-pattern-context-axis-transform.svg", + "source_sha256": "6019bcb7da2cab7622dbf9081163561259d2377bf71cd9b89e40147c703d6241", + "oracle": "chromium/svg-pattern-context-axis-transform.png", + "oracle_sha256": "0b761d1c78402a2d97a480f70506a7397c07316f736d8a4f621a7067a5e48ead", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-css-ingress", + "source": "svg-pattern-context-css-ingress.svg", + "source_sha256": "9b7898f4d13175c7348c1f1e40446454bba86d4eba2ec4de11047260b7732f7f", + "oracle": "chromium/svg-pattern-context-css-ingress.png", + "oracle_sha256": "5e334d78de9a5dd658a048cc4f8bd7411ddefddf95a7de9085b481f8f229b7d1", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-destination-opacity", + "source": "svg-pattern-context-destination-opacity.svg", + "source_sha256": "8316c6997ac4fbf75eb4ac38522eed3e264c4c6fcf3f4188f25fbc3f610d47db", + "oracle": "chromium/svg-pattern-context-destination-opacity.png", + "oracle_sha256": "f4b5c0651e5073b17d8eeb93828e76fdd49934cade34cf3625dbaa9ac0cf26cf", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-fill-from-stroke", + "source": "svg-pattern-context-fill-from-stroke.svg", + "source_sha256": "2f97c23b66797499c288b7d62c637e93742e4048e5617a7317a827e3a057d32d", + "oracle": "chromium/svg-pattern-context-fill-from-stroke.png", + "oracle_sha256": "402e4124208703d5df5e6aef5b0023267aaae0b708ee2e4df0a7e6c4d584432f", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-color-matrix", + "source": "svg-pattern-context-filter-color-matrix.svg", + "source_sha256": "3625a39ea249b68f78776142e48d88e77ef922352e59dd54ff70933714ba52dd", + "oracle": "chromium/svg-pattern-context-filter-color-matrix.png", + "oracle_sha256": "be934486381de815e242b9845d6e778acf709f6b55e260ab3b874214b65eb25b", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-component-transfer", + "source": "svg-pattern-context-filter-component-transfer.svg", + "source_sha256": "be7ff45ca0346303ba697011b37198d8640b831c752a8830af378e99dc31ec5b", + "oracle": "chromium/svg-pattern-context-filter-component-transfer.png", + "oracle_sha256": "21ff923f2038d1a1ca58daf169b122c9296238aa43fba759e0f56f738e852e74", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-composite", + "source": "svg-pattern-context-filter-composite.svg", + "source_sha256": "125a74f050fa25c9434dbffb6aebf800b2aff5aefe6f4e7af4d8aa2b21473932", + "oracle": "chromium/svg-pattern-context-filter-composite.png", + "oracle_sha256": "8e170bb90d2161cc7d18932fe8d40e2a9037b2d668c3846636bb3c390e459ff8", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-convolve", + "source": "svg-pattern-context-filter-convolve.svg", + "source_sha256": "d7d11986bd24b168e325948ee5667cf41e5b7e8b1b0bc7bfb7af7c03c5480c40", + "oracle": "chromium/svg-pattern-context-filter-convolve.png", + "oracle_sha256": "762296c86c292f7d539e8c20c83f98fce30c5ec17fb4bd3de62887ba034cdd42", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-drop-shadow", + "source": "svg-pattern-context-filter-drop-shadow.svg", + "source_sha256": "d9d4c02d72ad64a4392d6eeb1aab87c11d49a664ac5628fb0cc3c0ab3a67cea4", + "oracle": "chromium/svg-pattern-context-filter-drop-shadow.png", + "oracle_sha256": "656d1d65ee9a5544e561203be94396b67309c79102462938dc8c0c5374113c10", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-morphology", + "source": "svg-pattern-context-filter-morphology.svg", + "source_sha256": "792054a2e0576c65d808d6bf2a17e8f730626ce61b07359c49ba94d28f0b1c7c", + "oracle": "chromium/svg-pattern-context-filter-morphology.png", + "oracle_sha256": "b0e64cc278432fcb96dbedeb287a8cc5617120058a6dc886eaa79500b7051028", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-invalid-fallback", + "source": "svg-pattern-context-invalid-fallback.svg", + "source_sha256": "cbc72925435daf81c25540bd87da5973165593ae11f2eb6ae06396fc6c5f2e61", + "oracle": "chromium/svg-pattern-context-invalid-fallback.png", + "oracle_sha256": "0313552a823403fc05d9c3be5717f99e91ebd95618b8c2380831f20db0e5c884", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-nested-translate", + "source": "svg-pattern-context-nested-translate.svg", + "source_sha256": "8f78a6560dabfaffcb7a39e1189e5747203616891c7c6c7b79e86ac4d93d6868", + "oracle": "chromium/svg-pattern-context-nested-translate.png", + "oracle_sha256": "a59e3a2bc4c2468da0e0d03d14c54e848095ebe28af623882c0401e23151a968", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-object-box", + "source": "svg-pattern-context-object-box.svg", + "source_sha256": "400e3a721da95fe8a7635c42e05c3cb153ffe37be8d3c42a46af685f54544f0d", + "oracle": "chromium/svg-pattern-context-object-box.png", + "oracle_sha256": "c4577ec4ce2565a3f315cc5ddca73487e8bc33f6a230e42e4cca75f4c3ffcb2a", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-quarter-turn", + "source": "svg-pattern-context-quarter-turn.svg", + "source_sha256": "662c624124c1a22f04ea83bedc282272513898e51f84e5b09398fbd90a9b5218", + "oracle": "chromium/svg-pattern-context-quarter-turn.png", + "oracle_sha256": "5e334d78de9a5dd658a048cc4f8bd7411ddefddf95a7de9085b481f8f229b7d1", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-recursive-owner", + "source": "svg-pattern-context-recursive-owner.svg", + "source_sha256": "2c288311f7a9c0ca670a3d5b2014be89bbf87a805e259ab5815e9fa1af57770b", + "oracle": "chromium/svg-pattern-context-recursive-owner.png", + "oracle_sha256": "5e334d78de9a5dd658a048cc4f8bd7411ddefddf95a7de9085b481f8f229b7d1", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-reflection", + "source": "svg-pattern-context-reflection.svg", + "source_sha256": "3d0dd20969ec5defe68dea9ef856f84a41f51ac2d5e814cd0c97dcfc01aea430", + "oracle": "chromium/svg-pattern-context-reflection.png", + "oracle_sha256": "5e334d78de9a5dd658a048cc4f8bd7411ddefddf95a7de9085b481f8f229b7d1", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-selection", + "source": "svg-pattern-context-selection.svg", + "source_sha256": "0e3a70c5fdaba020a89a8bc0eb34466870b4c7acd02f24cd4d7caf76fd98788f", + "oracle": "chromium/svg-pattern-context-selection.png", + "oracle_sha256": "5e334d78de9a5dd658a048cc4f8bd7411ddefddf95a7de9085b481f8f229b7d1", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-singular", + "source": "svg-pattern-context-singular.svg", + "source_sha256": "d3e930be3bdb2ab908e1041fc3e3e2a659a752e3801b3a778a5a114cd285576d", + "oracle": "chromium/svg-pattern-context-singular.png", + "oracle_sha256": "4f852cfe622067e2872424c8add5d3977db6b7d6ad84a6329f288f6d7da566fa", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-stroke-from-fill", + "source": "svg-pattern-context-stroke-from-fill.svg", + "source_sha256": "6e4f0944ae990462b3ffc47909196f76c1be18b75a6e84eec9a3d54ae4fd02fa", + "oracle": "chromium/svg-pattern-context-stroke-from-fill.png", + "oracle_sha256": "8c5205039795c92343193a698d06318a7dd936c59ec4013dd9706d1f0eb8281e", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-stroke-from-stroke", + "source": "svg-pattern-context-stroke-from-stroke.svg", + "source_sha256": "e359041b655227b06de7e4b2825eac0d67b8d755355f8f894281489833ae613d", + "oracle": "chromium/svg-pattern-context-stroke-from-stroke.png", + "oracle_sha256": "8c5205039795c92343193a698d06318a7dd936c59ec4013dd9706d1f0eb8281e", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-target-filter", + "source": "svg-pattern-context-target-filter.svg", + "source_sha256": "47419e1495c67df805ffcd23085e72e13c9e3350ffe461573f3172a27eba81b8", + "oracle": "chromium/svg-pattern-context-target-filter.png", + "oracle_sha256": "86d9666370c82e8ee855172238fab7a62b0741745e16ef74ca9531c687e07605", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-target-mask", + "source": "svg-pattern-context-target-mask.svg", + "source_sha256": "df3bd4bda97cfda6ce8cd9c113141c7e238cca2740bf3485a5e7b260384e26ca", + "oracle": "chromium/svg-pattern-context-target-mask.png", + "oracle_sha256": "25798fe75333da27bfd5722f91b5cfafb699d07d4f2658ef8920461328afa3d8", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-valid-empty", + "source": "svg-pattern-context-valid-empty.svg", + "source_sha256": "5c9176d83ecf754221a1ddee0be4d6ce372ad316cb6fe5f20fcfb4d3deaba4aa", + "oracle": "chromium/svg-pattern-context-valid-empty.png", + "oracle_sha256": "4f852cfe622067e2872424c8add5d3977db6b7d6ad84a6329f288f6d7da566fa", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-degenerate-viewbox-fallback", "source": "svg-pattern-degenerate-viewbox-fallback.svg", @@ -5815,6 +6022,60 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-filter-profile-alpha", + "source": "svg-pattern-filter-profile-alpha.svg", + "source_sha256": "c33f99d84fed96f3ad2a97a9ca343a773a239d0dda83e45f755a6c01ab3bf412", + "oracle": "chromium/svg-pattern-filter-profile-alpha.png", + "oracle_sha256": "4e83aa4d5395c73fd8fc2ead38594cafca0f9966944c66783dd6c7ec44a8c044", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-gradient", + "source": "svg-pattern-filter-profile-gradient.svg", + "source_sha256": "2ef20e182ff3204dd40510fa5fb1409600c10336f88f38f3b46675c1fc59054b", + "oracle": "chromium/svg-pattern-filter-profile-gradient.png", + "oracle_sha256": "5ac4bdebed168b054cbae58f8546ce5d0daac917a8e97082a04b8bdd0220c6de", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-mask", + "source": "svg-pattern-filter-profile-mask.svg", + "source_sha256": "b5c619292d4928302be2948252b09808186b75536e414196c817361302a207c6", + "oracle": "chromium/svg-pattern-filter-profile-mask.png", + "oracle_sha256": "e6f367dac1c46c2f06b25001bb0f043b3762042132d0c923ea7b9823946785b9", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-nested", + "source": "svg-pattern-filter-profile-nested.svg", + "source_sha256": "747737991c1a8ff34ad097d68a9de99d8392ac1f178efe5fa5aa84810aa8b243", + "oracle": "chromium/svg-pattern-filter-profile-nested.png", + "oracle_sha256": "5df0bc94a4ebe516c48ead674b8e86aba3bd26db450ae9883fc067f8331cb793", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-stroke", + "source": "svg-pattern-filter-profile-stroke.svg", + "source_sha256": "2c0b57d01ce71859b29154af4c4d9dd1b34bc7243c1b13916aa637db35f2935c", + "oracle": "chromium/svg-pattern-filter-profile-stroke.png", + "oracle_sha256": "a2bb83488c0f5150fa39b04ff2f242da23050f2595912862a59164171afbc2a6", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-transparent", + "source": "svg-pattern-filter-profile-transparent.svg", + "source_sha256": "f709d47b2c9aa303b205f1a68a7a1a663cf0c8b9ce642a95e9391d504aea3570", + "oracle": "chromium/svg-pattern-filter-profile-transparent.png", + "oracle_sha256": "f440c12d66104e29c5e9384ffb89c128403a6e1797cdde2bce74ff02f8048595", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-height-absent-fallback", "source": "svg-pattern-height-absent-fallback.svg", @@ -5995,6 +6256,195 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-source-filter", + "source": "svg-pattern-source-filter.svg", + "source_sha256": "b8123a3f83972ca79cad650d94fc9900a33200fe28cd8e76334f6bdc0aa63071", + "oracle": "chromium/svg-pattern-source-filter.png", + "oracle_sha256": "8de934cca3ff48205b4535f3ec2f399b15ab585542ab954b724e854c494db6f0", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-blend", + "source": "svg-pattern-source-filter-blend.svg", + "source_sha256": "f687dccb5ad58763840ef86c2a76d04f256e120cd6e5531626ab936edb9f4072", + "oracle": "chromium/svg-pattern-source-filter-blend.png", + "oracle_sha256": "c7c63abe7dd99c58477dc19a03ac839b7bd1ff4ffe0634854334b5abdddffb0f", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-blur-linear", + "source": "svg-pattern-source-filter-blur-linear.svg", + "source_sha256": "34c7d667261f3e8394bff8a3e35bb2ea63e30f646eb00ee0b6b77aeada1ee9e6", + "oracle": "chromium/svg-pattern-source-filter-blur-linear.png", + "oracle_sha256": "8de934cca3ff48205b4535f3ec2f399b15ab585542ab954b724e854c494db6f0", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-color-matrix", + "source": "svg-pattern-source-filter-color-matrix.svg", + "source_sha256": "96f9850d1124a05306706e85455a013a4b0229b1418a42032436dfd5453f47bd", + "oracle": "chromium/svg-pattern-source-filter-color-matrix.png", + "oracle_sha256": "a21d0ba7c731f611f960460aeee8041947013c977e9246587a8a406d96c8920d", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-component-transfer", + "source": "svg-pattern-source-filter-component-transfer.svg", + "source_sha256": "99874bb9b33b62e4a621bf88d532ba849b160bffada4a58fb861ff57b07dd6ae", + "oracle": "chromium/svg-pattern-source-filter-component-transfer.png", + "oracle_sha256": "63210a8c09b388ade70afdd66d7b98b27d1d2a5206a3115ff9bcb5c36b2deb1e", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-composite-arithmetic", + "source": "svg-pattern-source-filter-composite-arithmetic.svg", + "source_sha256": "c094644a778659fe64a41120137ce4fa9eb5fb349ac4b9728b373820c8e6e08d", + "oracle": "chromium/svg-pattern-source-filter-composite-arithmetic.png", + "oracle_sha256": "a7b691fd37629eee479eeded3293f8d219249eb826c092a6f205f569e3aa0571", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-composite-in", + "source": "svg-pattern-source-filter-composite-in.svg", + "source_sha256": "5626022ff982199fae7afc016a2de7e3bbc941cd0e2836e02d1ca9459db1ad0f", + "oracle": "chromium/svg-pattern-source-filter-composite-in.png", + "oracle_sha256": "9f3f13765a5ecee80943ee829c2b62ec7800da2fb340295327a6b582acbd27f7", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-convolve", + "source": "svg-pattern-source-filter-convolve.svg", + "source_sha256": "215ecb2fca9a599c0acfc388b670998f36ac0ffe4bfe9e2d05850f2df3a4c842", + "oracle": "chromium/svg-pattern-source-filter-convolve.png", + "oracle_sha256": "d5c5feea23d1b5bb22f6dd458806a89853902d37ed252050786323b51c655bf9", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-diffuse", + "source": "svg-pattern-source-filter-diffuse.svg", + "source_sha256": "2fea754618811eb01d21a835a4d58594634dd1d9a53978b2e48ed5072b9727e2", + "oracle": "chromium/svg-pattern-source-filter-diffuse.png", + "oracle_sha256": "29b619871316da55073d7c4634971f68237feeb74c8791397009169977ff253e", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-displacement", + "source": "svg-pattern-source-filter-displacement.svg", + "source_sha256": "0ac02aff4d97202562f3331ca9e18220bf6784ea4f3a6c462a11059f3cb4694b", + "oracle": "chromium/svg-pattern-source-filter-displacement.png", + "oracle_sha256": "3f8678411d461815aab97bda1005751c5bcd25bcfc66614e7b4f830175975bf3", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-drop-shadow", + "source": "svg-pattern-source-filter-drop-shadow.svg", + "source_sha256": "fa6d5ba331ef7846b1b89bdc22ab6d85bf15a5412d3525262a8a03734c8e7a30", + "oracle": "chromium/svg-pattern-source-filter-drop-shadow.png", + "oracle_sha256": "77397d4fd1ac409d5f4b3f7a95437113175e5b960cb1033369b57fdf17b51841", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-flood", + "source": "svg-pattern-source-filter-flood.svg", + "source_sha256": "45933dfd042c4d568bbbb2c20a8824c3c3cf7d236ec2ecf263404799cc2eefd1", + "oracle": "chromium/svg-pattern-source-filter-flood.png", + "oracle_sha256": "688562ef4c3411678686485b5de92cc71b6c54e5f58d29ca931304311bbc0517", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-group-two-draws", + "source": "svg-pattern-source-filter-group-two-draws.svg", + "source_sha256": "5f26240350523a36cdca0f95ac2973355c14760694ab4e8215968dd35b50c957", + "oracle": "chromium/svg-pattern-source-filter-group-two-draws.png", + "oracle_sha256": "36d4e0a2ac2d15089193471019e52422b0fb81fb8729c33997fb856d4ae2efcc", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-hard-region", + "source": "svg-pattern-source-filter-hard-region.svg", + "source_sha256": "fe998089290188b4dc4b17d54a873c5b17d514fc2dbfd7ca146838e14e29f2a3", + "oracle": "chromium/svg-pattern-source-filter-hard-region.png", + "oracle_sha256": "e4171ad3da1be9a2b2627f4a7431f543db663d744537355561f0d00247083cec", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-merge", + "source": "svg-pattern-source-filter-merge.svg", + "source_sha256": "f11e1f906a971e6387341a6eb6d48f469b61c73ce51e5b5f2029ae0acde84b56", + "oracle": "chromium/svg-pattern-source-filter-merge.png", + "oracle_sha256": "84c19b23f3426a0bd76f4c608c2ad31f07a37d2097fb547f61e4299e146d3059", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-morphology", + "source": "svg-pattern-source-filter-morphology.svg", + "source_sha256": "113618ae6765896371fe7fa8e15e3f0ee9e537de9f1348522b45db5ed54e5c36", + "oracle": "chromium/svg-pattern-source-filter-morphology.png", + "oracle_sha256": "0f0a0e57c979ff64c9e0d52fe1bb099939f49beb8d79c391f9f97b4c6bef2783", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-nested-pattern", + "source": "svg-pattern-source-filter-nested-pattern.svg", + "source_sha256": "332a6c20b5388df327f5573e65b96db4ee654b77912cf9dc7da140cfdd07d85e", + "oracle": "chromium/svg-pattern-source-filter-nested-pattern.png", + "oracle_sha256": "d9ef058c1b6a33f60510777da8b4a27e8b12713a6ebfd347f9ee07840cf1afa3", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-object-units", + "source": "svg-pattern-source-filter-object-units.svg", + "source_sha256": "e0d7a9a1ec74b7cd6c30cb3aa65c74668ab304bb6a6ca2d2a03086d16ed8d3d4", + "oracle": "chromium/svg-pattern-source-filter-object-units.png", + "oracle_sha256": "c7e547316e58f41472bd738c63e7faabedd150ebca55a9dd24a6791cb62cee7d", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-offset", + "source": "svg-pattern-source-filter-offset.svg", + "source_sha256": "c332b417cc8244a9455c3d0e591afe008007baa5140101efcffa6c3c1f92c247", + "oracle": "chromium/svg-pattern-source-filter-offset.png", + "oracle_sha256": "dd2919fb73ef4cdcf5d1aab251a5600034018980b0f416b4d48a96affca6cff9", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-plus-draw", + "source": "svg-pattern-source-filter-plus-draw.svg", + "source_sha256": "cdcbd634894563bc62327f3030b95c5c0aad0b0eb4e9c0802b387d0676603afc", + "oracle": "chromium/svg-pattern-source-filter-plus-draw.png", + "oracle_sha256": "e7182a1eea0b106f5cb010df73b37053e2d3d026d12f8fb8c1345d78ca011d39", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-turbulence", + "source": "svg-pattern-source-filter-turbulence.svg", + "source_sha256": "9ccf034c1112bbb89e179c9c09ec28077ebc96c66580e47e7bcffde9b1de7254", + "oracle": "chromium/svg-pattern-source-filter-turbulence.png", + "oracle_sha256": "75f516ee45f9b8073a6078c17d304aa04ff256ea6b3ded2cca8286e5f87ba580", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-source-gradient", "source": "svg-pattern-source-gradient.svg", @@ -6103,6 +6553,114 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-target-filter-blend", + "source": "svg-pattern-target-filter-blend.svg", + "source_sha256": "fb7a4787bb3254c81f69371cd610415ef232c24508541d04bdc3c3747978e987", + "oracle": "chromium/svg-pattern-target-filter-blend.png", + "oracle_sha256": "0c557e5e1a2b2fdf4b2c2e1dea0581ac642f6f718236f5c97213381184e79e77", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-blur", + "source": "svg-pattern-target-filter-blur.svg", + "source_sha256": "36ebccb3c4b3b3b6bd5b7491bb6f4c0960ec5ff0066417606af6ad79cca30fca", + "oracle": "chromium/svg-pattern-target-filter-blur.png", + "oracle_sha256": "86d9666370c82e8ee855172238fab7a62b0741745e16ef74ca9531c687e07605", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-color-matrix", + "source": "svg-pattern-target-filter-color-matrix.svg", + "source_sha256": "e324a6592557b669323bb6e62f5e0285bb3a04860597f0041b26d4312f4d9196", + "oracle": "chromium/svg-pattern-target-filter-color-matrix.png", + "oracle_sha256": "38f5bc450e2c9a2b32f889efd1d601a07e1e792c6bda32e39b51adb7016d668c", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-component-transfer", + "source": "svg-pattern-target-filter-component-transfer.svg", + "source_sha256": "3b404cc9a1459a025b07247ef3334063879c3fb746fc6175ded3a08752c81ae6", + "oracle": "chromium/svg-pattern-target-filter-component-transfer.png", + "oracle_sha256": "847a65bb90ba11066f1bc22089ea0dc38174c8f7e9c744f481755e5f945213f2", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-composite", + "source": "svg-pattern-target-filter-composite.svg", + "source_sha256": "16d9d05d3da1db225ab4e8f4a492dc0da855ec72d28890252b257bdd56798147", + "oracle": "chromium/svg-pattern-target-filter-composite.png", + "oracle_sha256": "f440c12d66104e29c5e9384ffb89c128403a6e1797cdde2bce74ff02f8048595", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-convolve", + "source": "svg-pattern-target-filter-convolve.svg", + "source_sha256": "1dcf7e4d14795e36da0ccee6b8dff5ce41aa68ae9f55ebba99443e382cbb3e26", + "oracle": "chromium/svg-pattern-target-filter-convolve.png", + "oracle_sha256": "34d2c53a8b39d9234cfee199ecc70cd518ac3c596c8db4773b19c649dc9a07fe", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-diffuse", + "source": "svg-pattern-target-filter-diffuse.svg", + "source_sha256": "d4d709dc518fe01daa0fd901983b3baf72f30adba2735dfd705b323bc61393cf", + "oracle": "chromium/svg-pattern-target-filter-diffuse.png", + "oracle_sha256": "aa46c80682ded2e95a20cb5daecf54b33a6711ce226d8227f553070a757ad815", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-displacement", + "source": "svg-pattern-target-filter-displacement.svg", + "source_sha256": "2acc95a7cefe851a22340d3e935b0301544bac016ebccb581254923671769a16", + "oracle": "chromium/svg-pattern-target-filter-displacement.png", + "oracle_sha256": "e6b18d422ac0fe5355309f2adb6e66578f42770209b990c26f417fde26811a68", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-drop-shadow", + "source": "svg-pattern-target-filter-drop-shadow.svg", + "source_sha256": "ab5fe857d4c164963544b3f651c4bfef5ab713437fd68c08eb1585ff26406095", + "oracle": "chromium/svg-pattern-target-filter-drop-shadow.png", + "oracle_sha256": "a6cf4e13fcb078cc0894bd6a94ecabe9425ae3dfdf661f605851518210562079", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-merge", + "source": "svg-pattern-target-filter-merge.svg", + "source_sha256": "e104c6479654e2cdbaac8849c5c6fbab07445f1dd9959033f5481180898b6c2e", + "oracle": "chromium/svg-pattern-target-filter-merge.png", + "oracle_sha256": "ad7cb5a4ec7bec939fc4ae60d68bc9fbc49c6dcd1089f58d96cecc001e8f4e62", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-morphology", + "source": "svg-pattern-target-filter-morphology.svg", + "source_sha256": "96f1dfdda6c2ef3e7aebd068daae5993697ad35926620de35bab91ced318f94c", + "oracle": "chromium/svg-pattern-target-filter-morphology.png", + "oracle_sha256": "624803438ce05e1a9f2e22b0fa1035b35911e7781026775f9bb91fd7c4917c79", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-offset", + "source": "svg-pattern-target-filter-offset.svg", + "source_sha256": "b75236f40e6159a316f24163ca8eee052a34132718588c8db9762bff58e41422", + "oracle": "chromium/svg-pattern-target-filter-offset.png", + "oracle_sha256": "0020b37a1a71f15d25dd07e3b6817cd88c94953cf2b6a9f072562c762b2ef889", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-target-group-opacity", "source": "svg-pattern-target-group-opacity.svg", diff --git a/fixtures/web-first/primitives.json b/fixtures/web-first/primitives.json index 89e431e7..059b08fb 100644 --- a/fixtures/web-first/primitives.json +++ b/fixtures/web-first/primitives.json @@ -5187,6 +5187,190 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-context-axis-transform", + "source": "svg-pattern-context-axis-transform.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-axis-transform.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-css-ingress", + "source": "svg-pattern-context-css-ingress.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-css-ingress.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-destination-opacity", + "source": "svg-pattern-context-destination-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-destination-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-fill-from-stroke", + "source": "svg-pattern-context-fill-from-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-fill-from-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-color-matrix", + "source": "svg-pattern-context-filter-color-matrix.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-color-matrix.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-component-transfer", + "source": "svg-pattern-context-filter-component-transfer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-component-transfer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-composite", + "source": "svg-pattern-context-filter-composite.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-composite.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-convolve", + "source": "svg-pattern-context-filter-convolve.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-convolve.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-drop-shadow", + "source": "svg-pattern-context-filter-drop-shadow.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-drop-shadow.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-filter-morphology", + "source": "svg-pattern-context-filter-morphology.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-filter-morphology.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-invalid-fallback", + "source": "svg-pattern-context-invalid-fallback.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-invalid-fallback.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-nested-translate", + "source": "svg-pattern-context-nested-translate.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-nested-translate.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-object-box", + "source": "svg-pattern-context-object-box.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-object-box.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-quarter-turn", + "source": "svg-pattern-context-quarter-turn.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-quarter-turn.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-recursive-owner", + "source": "svg-pattern-context-recursive-owner.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-recursive-owner.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-reflection", + "source": "svg-pattern-context-reflection.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-reflection.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-selection", + "source": "svg-pattern-context-selection.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-selection.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-singular", + "source": "svg-pattern-context-singular.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-singular.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-stroke-from-fill", + "source": "svg-pattern-context-stroke-from-fill.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-stroke-from-fill.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-stroke-from-stroke", + "source": "svg-pattern-context-stroke-from-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-stroke-from-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-target-filter", + "source": "svg-pattern-context-target-filter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-target-filter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-target-mask", + "source": "svg-pattern-context-target-mask.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-target-mask.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-context-valid-empty", + "source": "svg-pattern-context-valid-empty.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-context-valid-empty.png", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-degenerate-viewbox-fallback", "source": "svg-pattern-degenerate-viewbox-fallback.svg", @@ -5251,6 +5435,54 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-filter-profile-alpha", + "source": "svg-pattern-filter-profile-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-gradient", + "source": "svg-pattern-filter-profile-gradient.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-gradient.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-mask", + "source": "svg-pattern-filter-profile-mask.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-mask.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-nested", + "source": "svg-pattern-filter-profile-nested.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-nested.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-stroke", + "source": "svg-pattern-filter-profile-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-filter-profile-transparent", + "source": "svg-pattern-filter-profile-transparent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-filter-profile-transparent.png", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-height-absent-fallback", "source": "svg-pattern-height-absent-fallback.svg", @@ -5411,6 +5643,174 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-source-filter", + "source": "svg-pattern-source-filter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-blend", + "source": "svg-pattern-source-filter-blend.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-blend.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-blur-linear", + "source": "svg-pattern-source-filter-blur-linear.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-blur-linear.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-color-matrix", + "source": "svg-pattern-source-filter-color-matrix.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-color-matrix.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-component-transfer", + "source": "svg-pattern-source-filter-component-transfer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-component-transfer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-composite-arithmetic", + "source": "svg-pattern-source-filter-composite-arithmetic.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-composite-arithmetic.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-composite-in", + "source": "svg-pattern-source-filter-composite-in.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-composite-in.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-convolve", + "source": "svg-pattern-source-filter-convolve.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-convolve.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-diffuse", + "source": "svg-pattern-source-filter-diffuse.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-diffuse.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-displacement", + "source": "svg-pattern-source-filter-displacement.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-displacement.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-drop-shadow", + "source": "svg-pattern-source-filter-drop-shadow.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-drop-shadow.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-flood", + "source": "svg-pattern-source-filter-flood.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-flood.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-group-two-draws", + "source": "svg-pattern-source-filter-group-two-draws.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-group-two-draws.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-hard-region", + "source": "svg-pattern-source-filter-hard-region.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-hard-region.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-merge", + "source": "svg-pattern-source-filter-merge.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-merge.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-morphology", + "source": "svg-pattern-source-filter-morphology.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-morphology.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-nested-pattern", + "source": "svg-pattern-source-filter-nested-pattern.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-nested-pattern.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-object-units", + "source": "svg-pattern-source-filter-object-units.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-object-units.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-offset", + "source": "svg-pattern-source-filter-offset.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-offset.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-plus-draw", + "source": "svg-pattern-source-filter-plus-draw.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-plus-draw.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-source-filter-turbulence", + "source": "svg-pattern-source-filter-turbulence.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-source-filter-turbulence.png", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-source-gradient", "source": "svg-pattern-source-gradient.svg", @@ -5507,6 +5907,102 @@ "width": 64, "height": 64 }, + { + "id": "svg-pattern-target-filter-blend", + "source": "svg-pattern-target-filter-blend.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-blend.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-blur", + "source": "svg-pattern-target-filter-blur.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-blur.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-color-matrix", + "source": "svg-pattern-target-filter-color-matrix.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-color-matrix.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-component-transfer", + "source": "svg-pattern-target-filter-component-transfer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-component-transfer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-composite", + "source": "svg-pattern-target-filter-composite.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-composite.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-convolve", + "source": "svg-pattern-target-filter-convolve.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-convolve.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-diffuse", + "source": "svg-pattern-target-filter-diffuse.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-diffuse.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-displacement", + "source": "svg-pattern-target-filter-displacement.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-displacement.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-drop-shadow", + "source": "svg-pattern-target-filter-drop-shadow.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-drop-shadow.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-merge", + "source": "svg-pattern-target-filter-merge.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-merge.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-morphology", + "source": "svg-pattern-target-filter-morphology.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-morphology.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-pattern-target-filter-offset", + "source": "svg-pattern-target-filter-offset.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-pattern-target-filter-offset.png", + "width": 64, + "height": 64 + }, { "id": "svg-pattern-target-group-opacity", "source": "svg-pattern-target-group-opacity.svg", diff --git a/fixtures/web-first/svg-pattern-context-axis-transform.svg b/fixtures/web-first/svg-pattern-context-axis-transform.svg new file mode 100644 index 00000000..b17e708b --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-axis-transform.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-css-ingress.svg b/fixtures/web-first/svg-pattern-context-css-ingress.svg new file mode 100644 index 00000000..90a7d241 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-css-ingress.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-destination-opacity.svg b/fixtures/web-first/svg-pattern-context-destination-opacity.svg new file mode 100644 index 00000000..f21742dc --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-destination-opacity.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-fill-from-stroke.svg b/fixtures/web-first/svg-pattern-context-fill-from-stroke.svg new file mode 100644 index 00000000..b82fe592 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-fill-from-stroke.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-color-matrix.svg b/fixtures/web-first/svg-pattern-context-filter-color-matrix.svg new file mode 100644 index 00000000..bd8d2e33 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-color-matrix.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-component-transfer.svg b/fixtures/web-first/svg-pattern-context-filter-component-transfer.svg new file mode 100644 index 00000000..559601e1 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-component-transfer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-composite.svg b/fixtures/web-first/svg-pattern-context-filter-composite.svg new file mode 100644 index 00000000..2c750bd4 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-composite.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-convolve.svg b/fixtures/web-first/svg-pattern-context-filter-convolve.svg new file mode 100644 index 00000000..293035a1 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-convolve.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-drop-shadow.svg b/fixtures/web-first/svg-pattern-context-filter-drop-shadow.svg new file mode 100644 index 00000000..d89f6791 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-drop-shadow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-filter-morphology.svg b/fixtures/web-first/svg-pattern-context-filter-morphology.svg new file mode 100644 index 00000000..51c7086c --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-filter-morphology.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-invalid-fallback.svg b/fixtures/web-first/svg-pattern-context-invalid-fallback.svg new file mode 100644 index 00000000..0dfcf71c --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-invalid-fallback.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-context-nested-translate.svg b/fixtures/web-first/svg-pattern-context-nested-translate.svg new file mode 100644 index 00000000..551ff393 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-nested-translate.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-object-box.svg b/fixtures/web-first/svg-pattern-context-object-box.svg new file mode 100644 index 00000000..cd60c158 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-object-box.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-quarter-turn.svg b/fixtures/web-first/svg-pattern-context-quarter-turn.svg new file mode 100644 index 00000000..f045ded4 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-quarter-turn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-recursive-owner.svg b/fixtures/web-first/svg-pattern-context-recursive-owner.svg new file mode 100644 index 00000000..8abb773a --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-recursive-owner.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-reflection.svg b/fixtures/web-first/svg-pattern-context-reflection.svg new file mode 100644 index 00000000..7be34fbd --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-reflection.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-pattern-context-selection.svg b/fixtures/web-first/svg-pattern-context-selection.svg similarity index 100% rename from fixtures/web-first/unsupported/svg-pattern-context-selection.svg rename to fixtures/web-first/svg-pattern-context-selection.svg diff --git a/fixtures/web-first/svg-pattern-context-singular.svg b/fixtures/web-first/svg-pattern-context-singular.svg new file mode 100644 index 00000000..171dbd81 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-singular.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-stroke-from-fill.svg b/fixtures/web-first/svg-pattern-context-stroke-from-fill.svg new file mode 100644 index 00000000..6e21caf5 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-stroke-from-fill.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-stroke-from-stroke.svg b/fixtures/web-first/svg-pattern-context-stroke-from-stroke.svg new file mode 100644 index 00000000..a14ed982 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-stroke-from-stroke.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-target-filter.svg b/fixtures/web-first/svg-pattern-context-target-filter.svg new file mode 100644 index 00000000..ae002ee0 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-target-filter.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-target-mask.svg b/fixtures/web-first/svg-pattern-context-target-mask.svg new file mode 100644 index 00000000..183af3ef --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-target-mask.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-context-valid-empty.svg b/fixtures/web-first/svg-pattern-context-valid-empty.svg new file mode 100644 index 00000000..55f06f32 --- /dev/null +++ b/fixtures/web-first/svg-pattern-context-valid-empty.svg @@ -0,0 +1,5 @@ + + + valid empty + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-alpha.svg b/fixtures/web-first/svg-pattern-filter-profile-alpha.svg new file mode 100644 index 00000000..fc373df6 --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-alpha.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-gradient.svg b/fixtures/web-first/svg-pattern-filter-profile-gradient.svg new file mode 100644 index 00000000..d21e56f6 --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-gradient.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-mask.svg b/fixtures/web-first/svg-pattern-filter-profile-mask.svg new file mode 100644 index 00000000..22d9e82c --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-mask.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-nested.svg b/fixtures/web-first/svg-pattern-filter-profile-nested.svg new file mode 100644 index 00000000..dac38f85 --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-nested.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-stroke.svg b/fixtures/web-first/svg-pattern-filter-profile-stroke.svg new file mode 100644 index 00000000..a7b2b424 --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-stroke.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-filter-profile-transparent.svg b/fixtures/web-first/svg-pattern-filter-profile-transparent.svg new file mode 100644 index 00000000..0ae88451 --- /dev/null +++ b/fixtures/web-first/svg-pattern-filter-profile-transparent.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-blend.svg b/fixtures/web-first/svg-pattern-source-filter-blend.svg new file mode 100644 index 00000000..b0a591b7 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-blend.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-blur-linear.svg b/fixtures/web-first/svg-pattern-source-filter-blur-linear.svg new file mode 100644 index 00000000..91b18a9b --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-blur-linear.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-color-matrix.svg b/fixtures/web-first/svg-pattern-source-filter-color-matrix.svg new file mode 100644 index 00000000..0dab00d2 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-color-matrix.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-component-transfer.svg b/fixtures/web-first/svg-pattern-source-filter-component-transfer.svg new file mode 100644 index 00000000..8e2876b8 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-component-transfer.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-composite-arithmetic.svg b/fixtures/web-first/svg-pattern-source-filter-composite-arithmetic.svg new file mode 100644 index 00000000..2ca57e39 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-composite-arithmetic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-composite-in.svg b/fixtures/web-first/svg-pattern-source-filter-composite-in.svg new file mode 100644 index 00000000..7f0f334c --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-composite-in.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-convolve.svg b/fixtures/web-first/svg-pattern-source-filter-convolve.svg new file mode 100644 index 00000000..3a8c41cf --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-convolve.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-diffuse.svg b/fixtures/web-first/svg-pattern-source-filter-diffuse.svg new file mode 100644 index 00000000..da4ce4a1 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-diffuse.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-displacement.svg b/fixtures/web-first/svg-pattern-source-filter-displacement.svg new file mode 100644 index 00000000..17f3001f --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-displacement.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-drop-shadow.svg b/fixtures/web-first/svg-pattern-source-filter-drop-shadow.svg new file mode 100644 index 00000000..9107a2e0 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-drop-shadow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-flood.svg b/fixtures/web-first/svg-pattern-source-filter-flood.svg new file mode 100644 index 00000000..06f8e3d7 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-flood.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-group-two-draws.svg b/fixtures/web-first/svg-pattern-source-filter-group-two-draws.svg new file mode 100644 index 00000000..a6c23d39 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-group-two-draws.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-hard-region.svg b/fixtures/web-first/svg-pattern-source-filter-hard-region.svg new file mode 100644 index 00000000..5ae32c68 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-hard-region.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-merge.svg b/fixtures/web-first/svg-pattern-source-filter-merge.svg new file mode 100644 index 00000000..47acdf95 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-merge.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-morphology.svg b/fixtures/web-first/svg-pattern-source-filter-morphology.svg new file mode 100644 index 00000000..8273af28 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-morphology.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-nested-pattern.svg b/fixtures/web-first/svg-pattern-source-filter-nested-pattern.svg new file mode 100644 index 00000000..dc30c26b --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-nested-pattern.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-object-units.svg b/fixtures/web-first/svg-pattern-source-filter-object-units.svg new file mode 100644 index 00000000..6e2eff88 --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-object-units.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-offset.svg b/fixtures/web-first/svg-pattern-source-filter-offset.svg new file mode 100644 index 00000000..c463a4ab --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-offset.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-plus-draw.svg b/fixtures/web-first/svg-pattern-source-filter-plus-draw.svg new file mode 100644 index 00000000..033c2d6e --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-plus-draw.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-pattern-source-filter-turbulence.svg b/fixtures/web-first/svg-pattern-source-filter-turbulence.svg new file mode 100644 index 00000000..11fa241e --- /dev/null +++ b/fixtures/web-first/svg-pattern-source-filter-turbulence.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/unsupported/svg-pattern-source-filter.svg b/fixtures/web-first/svg-pattern-source-filter.svg similarity index 100% rename from fixtures/web-first/unsupported/svg-pattern-source-filter.svg rename to fixtures/web-first/svg-pattern-source-filter.svg diff --git a/fixtures/web-first/svg-pattern-target-filter-blend.svg b/fixtures/web-first/svg-pattern-target-filter-blend.svg new file mode 100644 index 00000000..b1db6ba9 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-blend.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-blur.svg b/fixtures/web-first/svg-pattern-target-filter-blur.svg new file mode 100644 index 00000000..11a9b7e4 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-blur.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-color-matrix.svg b/fixtures/web-first/svg-pattern-target-filter-color-matrix.svg new file mode 100644 index 00000000..2addf998 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-color-matrix.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-component-transfer.svg b/fixtures/web-first/svg-pattern-target-filter-component-transfer.svg new file mode 100644 index 00000000..45097a47 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-component-transfer.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-composite.svg b/fixtures/web-first/svg-pattern-target-filter-composite.svg new file mode 100644 index 00000000..813d7307 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-composite.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-convolve.svg b/fixtures/web-first/svg-pattern-target-filter-convolve.svg new file mode 100644 index 00000000..81beab3c --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-convolve.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-diffuse.svg b/fixtures/web-first/svg-pattern-target-filter-diffuse.svg new file mode 100644 index 00000000..fc5e539e --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-diffuse.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-displacement.svg b/fixtures/web-first/svg-pattern-target-filter-displacement.svg new file mode 100644 index 00000000..2a252f49 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-displacement.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-drop-shadow.svg b/fixtures/web-first/svg-pattern-target-filter-drop-shadow.svg new file mode 100644 index 00000000..5b9777d2 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-drop-shadow.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-merge.svg b/fixtures/web-first/svg-pattern-target-filter-merge.svg new file mode 100644 index 00000000..801a7375 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-merge.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-morphology.svg b/fixtures/web-first/svg-pattern-target-filter-morphology.svg new file mode 100644 index 00000000..5ed950a0 --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-morphology.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/svg-pattern-target-filter-offset.svg b/fixtures/web-first/svg-pattern-target-filter-offset.svg new file mode 100644 index 00000000..4fc9712b --- /dev/null +++ b/fixtures/web-first/svg-pattern-target-filter-offset.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/fixtures/web-first/unsupported/README.md b/fixtures/web-first/unsupported/README.md index 5c140b84..441a6d40 100644 --- a/fixtures/web-first/unsupported/README.md +++ b/fixtures/web-first/unsupported/README.md @@ -58,14 +58,12 @@ The scannable, generated view of this register (beside the baked cells) is | `svg-image.svg` | `` refuses as an element: the glyphless product is declared resource-free, and websem is forbidden I/O by its architecture lock. The data:-URI sub-slice enters with the resource environment, not before. | | `svg-nested-svg.svg` | A nested `` establishes a new viewport and clip — a scope the flat frame cannot hold. Declared until the group-scope rung. | | `svg-pattern-external.svg` | Refuse a pattern whose local facts may inherit through an external template edge. `websem` owns no resource I/O, so it cannot prove that dropping the edge leaves the same tile. | -| `svg-pattern-context-selection.svg` | Refuse a pattern paint selected through `context-fill`/`context-stroke`. Chromium propagates the server through the context relation and the direct probe differs from no paint by 1,152 pixels at maximum delta 255, but per-context pattern composition is reserved for the next pattern rung and has no committed matrix yet (measured, not celled). | | `svg-pattern-css-transform-percentage.svg` | Refuse a CSS percentage transform on the pattern resource until its reference box is carried without invention. Chromium resolves inline `transform:translate(50%, 0px)` against the 64-unit viewport: it is exact to `32px`, while the former tile-width basis selected `7px` and changed 1,008 target pixels at maximum delta 205. The invalid percentage spelling in the `patternTransform` presentation attribute itself drops to identity, so the patrol is scoped to the computed CSS route (measured, not celled). | | `svg-pattern-length-unit.svg` · `svg-pattern-length-calc.svg` · `svg-pattern-length-var.svg` · `svg-pattern-length-css-wide.svg` · `svg-pattern-length-css-comments.svg` | Refuse a non-`px` unit, CSS math, custom-property substitution, a CSS-wide value, and CSS comments around an otherwise valid pattern tile length by the exact field. Chromium computes each route. The comment witness was formerly silent in both admissions and changed all 2,304 target pixels at maximum delta 202; their independent syntax/unit/value-type rows carry those missing contexts (measured, not celled). | | `svg-pattern-length-used-range.svg` | Refuse finite tile coordinates outside Chromium's unimplemented Web used-length clamp. Chromium makes `x="1000000000"`, `x="33554430"`, `x="-1000000000"`, and finite source `x="1e100"` equal their signed clamp controls. Before the patrol, both admissions differed by 1,152, 1,152, 768, and 2,112 pixels respectively, all at maximum delta 205 (measured, not celled). | | `svg-pattern-number-precision-alias.svg` | Conservatively refuse the established raw-number normalization alias before pattern tile geometry. At 64×64 the amplified percentage alias and direct midpoint pairs were pixel-identical in Chromium (measured, not celled), so this is a one-way provenance patrol rather than a claimed raster divergence: the direct f32 decoder still cannot prove which Blink CSS-parser used value entered the tile. The shared `x`/`y`/`width`/`height` rows remain open for their wider pattern applicability. | | `svg-pattern-source-coverage-precision.svg` | Refuse curved source geometry at the pinned Chromium/Skia picture-shader coverage boundary. A circle inside the tile changed 189 pixels at maximum delta 8; touching and overflowing circles changed 315/225 at delta 32/15. Integer-mapped rectangle programs remain exact (measured, not celled). | | `svg-pattern-source-effect-precision.svg` · `svg-pattern-source-clip-precision.svg` | Refuse a multi-draw isolated source opacity or geometric clip. Group opacity changed 1,152–1,728 pixels at maximum delta 2, and a circular clip changed 216 at delta 9. One-draw folded opacity and the sampled un-clipped rectangle programs are exact; a rectangle clip was exact but shares the conservative source-effect patrol (measured, not celled). | -| `svg-pattern-source-filter.svg` | Refuse filter composition inside the tile program until the pattern×filter family has its own matrix. Chromium honors the sampled safe blur—the filtered and plain controls differ by all 2,304 target pixels at maximum delta 182—and the current route happened to match that one Chromium raster exactly, but one sample cannot admit the complete filter graph inside a second picture-shader composition (measured, not celled). | | `svg-pattern-nested-composition-precision.svg` | A nested pattern alone is admitted and exact. Compositing another source draw over it changed 108 pixels at maximum delta 1, so that mixed picture program refuses by name (measured, not celled). | | `svg-pattern-nesting-too-deep.svg` | Refuse a ninth distinct nested pattern before its source walk begins. The resolved contract admits at most eight immutable programs; the producer applies the same bound before recursively measuring or compiling another source, while the separate active-id patrol still catches cycles. | | `svg-pattern-affine-precision.svg` | Refuse a pattern whose final tile map carries a general rotation or shear. General rotation is content-dependent: sampled half-tile subdivisions were exact while a six-unit grid changed two pixels at delta 1 and a related non-square grid changed one pixel at delta 3. Shear/skew witnesses changed 147–222 pixels at maximum delta 2. Translation, axis scales, reflection, and exact quarter turns remain admitted (measured, not celled). | @@ -105,6 +103,7 @@ The scannable, generated view of this register (beside the baked cells) is | `svg-filter-blend-transform-precision.svg` | Refuse `feBlend` under a target mapping outside axis maps and exact quarter turns. Fractional translation, fractional axis scale, and quarter turns are exact. A sampled 17-degree source-derived blend differs by 358 pixels at Δ212; generated-only controls differ by 104–108 pixels at Δ179/153, proving this is the filtered output's mapping boundary rather than source rasterization. | | `svg-filter-blend-clip-precision.svg` | Refuse `feBlend` across a geometric `clip-path`. A sampled circular clip differs by 92 generated-only pixels and 100 source-derived pixels, both at Δ85; same-target and ancestor placement agree in Chromium. Axis-aligned rectangular clips were exact but conservatively share the patrol until the backend boundary is narrower than antialiased clip coverage. | | `svg-filter-translucent-source-composition-precision.svg` | Refuse a source-derived multi-input `feComposite` or multi-input `feMerge` when the isolated source carries authored partial alpha. A no-blend `atop` control already differs by 2,147 pixels at Δ3, while blend→`atop` differs by 1,925 at Δ3 and blend→multi-input merge by 9 at Δ1. Generated-only controls are exact. The generic patrol owns the underlying layer boundary rather than making it an `feBlend` exception. | +| `svg-filter-pattern-source-coverage-precision.svg` | Refuse a source-derived filter when its eventual pattern-painted source is wider than one direct sharp-cornered rectangle with exactly one fill or simple stroke channel. A pattern-filled cubic path differed under color matrix and component transfer by 1px/Δ1, offset by 1px/Δ2, and merge by 2px/Δ2; a rounded rectangle differed under blur by 15px/Δ1, morphology by 1px/Δ7, and native drop shadow by 4px/Δ4. The complete direct sharp-rect profile is exact and celled across the admitted filter families; wider target coverage stops at this operation-independent boundary (measured, not celled). | | `svg-filter-blur-sigma-precision.svg` | Refuse the pinned-backend small-kernel boundary shared by `feGaussianBlur` and native `feDropShadow`. On the identity-mapped hard source, sampled effective sigmas `.5` through `1.875` differ from Chromium; `1` changes 556 pixels at maximum delta 12, while `.25` and `2` are exact. The patrol conservatively covers the open interval between those endpoints. The class follows the target mapping: local `1` scaled to effective `2` is exact, while local `3` scaled to `1.5` changes 312 pixels at delta 4. Safe-sigma graphs may exceed two operations; three chained `2` or `3` kernels, identity-merge chains, parallel branches, and native shadows at the admitted endpoints are exact (measured, not celled). | | `svg-filter-offset-fractional-precision.svg` · `svg-filter-offset-transform-precision.svg` · `svg-filter-offset-blur-precision.svg` | Refuse the three measured offset boundaries. A direct fractional displacement differs from Chromium by 48 pixels at maximum delta 128. Integer source offsets that scale, rotation, or `viewBox` mapping make fractional differ by 12–97 pixels, up to delta 122; integer-effective controls are pixel-exact. Sampled graphs combining blur and offset differ at a third composed-operation raster boundary (measured, not celled). The patrol conservatively covers every mixed graph; identity-mapped integer-only offset graphs, including three-node chains, remain exact. | | `svg-filter-flood-css-property.svg` · `svg-filter-flood-var.svg` · `svg-filter-flood-inherit.svg` · `svg-filter-flood-color-syntax.svg` · `svg-filter-flood-opacity-calc.svg` | Quarantine flood routes the direct decoder cannot prove: unavailable stylesheet/inline CSS properties, custom-property substitution, explicit inheritance, the wider CSS color-function grammar, and CSS math. Each is honored by Chromium and refuses by stable filter name here under its independently listed property, CSS-wide, color, math, or custom-property row. | diff --git a/fixtures/web-first/unsupported/svg-filter-pattern-source-coverage-precision.svg b/fixtures/web-first/unsupported/svg-filter-pattern-source-coverage-precision.svg new file mode 100644 index 00000000..0224fa95 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-filter-pattern-source-coverage-precision.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + +