diff --git a/crates/n0/README.md b/crates/n0/README.md index 085f53db..a3fa416b 100644 --- a/crates/n0/README.md +++ b/crates/n0/README.md @@ -314,7 +314,15 @@ hint. The first glyphless consumer accepts identity-mapped declarations over untransformed solid/linear rectangles and simple local strokes; it rejects under-enclosing domains, nested effects within the declaration, nonidentity declaration maps, enclosing filter/mask programs, and declarations inside -repeating programs. Ordinary undeclared scopes keep their existing profile. +repeating programs. An identity-mapped rectangle with an empty paint stack and +no stroke retains its geometry and identity without contributing a draw, +coverage, or source extent, so its geometry need not lie inside the declaration. +Ordinary finite geometry, exact transformed bounds, and unique-owner validation +still apply, including to zero-sized paintless rectangles. This exemption does +not admit mapped or nonrectangular paintless geometry; every painted rectangle, +including a stroke-only rectangle, must still be enclosed. The glyphless module +tests pin these rules and byte-identical changed-view replay. +Ordinary undeclared scopes keep their existing profile. The declaration targets the containing stream, independently of a scope item's drawing map. Current-view mapping and device enclosure are recalculated for every execution. Unsupported device bounds return an owner-bearing diff --git a/crates/n0/src/glyphless.rs b/crates/n0/src/glyphless.rs index b89980aa..cb701fc9 100644 --- a/crates/n0/src/glyphless.rs +++ b/crates/n0/src/glyphless.rs @@ -966,9 +966,16 @@ fn validate_source_domain_node( .paints .iter() .any(|paint| matches!(paint, CgPaint::RadialGradient(_))) - || (node.paints.is_empty() && node.stroke.is_none()) { - return Err("a declared source domain requires unmapped solid/linear painted rectangles"); + return Err( + "a declared source domain requires unmapped rectangles with solid/linear leaves", + ); + } + // Ordinary geometry/bounds/identity validation has already run. No paint + // contributes no source extent, even when its geometry lies outside the + // declaration. Keep the rectangular, identity-mapped profile above intact. + if node.paints.is_empty() && node.stroke.is_none() { + return Ok(()); } let width = if let Some(stroke) = &node.stroke { if stroke.space() != rframe::StrokeSpace::Local @@ -4434,6 +4441,220 @@ mod tests { .unwrap() } + const SOURCE_NODE_OWNER: VisualRef = VisualRef::new(Identity::new(70), Provenance::new(700)); + + fn paintless_rectangle(rect: Rectangle) -> FrameNode { + FrameNode { + owner: SOURCE_NODE_OWNER, + transform: AffineTransform::identity(), + geometry: Geometry::Rect(rect), + bounds: rect, + paints: PaintStack::empty(), + stroke: None, + } + } + + fn domain_illustration_with_node(node: FrameNode, mode: rframe::ScopeBlendMode) -> Frame { + let frame = domain_illustration(Some(source_domain()), mode); + let mut items: Vec<_> = frame.items.iter().cloned().collect(); + // Insert before the painted child so the private owner slots move too. + items.insert(2, FrameItem::Node(node)); + Frame { + items: FrameItems::try_new(items).unwrap(), + ..frame + } + } + + fn paintless_rectangles() -> [Rectangle; 6] { + [ + Rectangle::from_xywh(10.0, 14.0, 2.0, 3.0), // inside the source + Rectangle::from_xywh(0.0, 0.0, 64.0, 48.0), // exceeds the source + Rectangle::from_xywh(-20.0, -30.0, 4.0, 5.0), // outside the frame + Rectangle::from_xywh(50.0, 46.0, 0.0, 0.0), // degenerate, outside source + Rectangle::from_xywh(50.0, 46.0, 0.0, 2.0), + Rectangle::from_xywh(50.0, 46.0, 2.0, 0.0), + ] + } + + /// Geometry and identity survive compilation independently of paint. An + /// empty node contributes neither commands, source extent, nor damage. + #[test] + fn declared_source_paintless_rectangles_retain_geometry_without_draws_or_extent() { + let mode = rframe::ScopeBlendMode::Multiply; + let baseline = compile(domain_illustration(Some(source_domain()), mode)).unwrap(); + for rect in paintless_rectangles() { + let node = paintless_rectangle(rect); + let frame = domain_illustration_with_node(node.clone(), mode); + let product = compile(frame.clone()).unwrap(); + assert_eq!(product.resolved(), &frame); + assert_eq!(product.resolved().nodes()[1], &node); + assert_eq!(product.source_domains, baseline.source_domains); + assert!(product.drawlist.raster_eq(&baseline.drawlist)); + let coverage = |product: &FrameProduct| { + product + .provenance + .owners + .iter() + .copied() + .zip(product.provenance.coverage.iter().copied()) + .collect::>() + }; + let mut actual = coverage(&product); + assert_eq!(actual.remove(&SOURCE_NODE_OWNER), Some(None)); + assert_eq!(actual, coverage(&baseline)); + assert_eq!(diff_frame(&baseline, &product), Damage::default()); + } + } + + /// Equivalence law: adding no paint cannot alter any byte, even when the + /// current view changes device enclosure and then returns to its start. + #[test] + fn declared_source_paintless_replay_under_changed_views_matches_fresh() { + let context = PaintCtx::new(None); + for mode in [ + rframe::ScopeBlendMode::Normal, + rframe::ScopeBlendMode::Multiply, + rframe::ScopeBlendMode::Screen, + ] { + let baseline = compile(domain_illustration(Some(source_domain()), mode)).unwrap(); + for rect in paintless_rectangles() { + let frame = domain_illustration_with_node(paintless_rectangle(rect), mode); + let retained = compile(frame.clone()).unwrap(); + for matrix in [ + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], + [[1.0, 0.0, 3.25], [0.0, 1.0, -2.5]], + [[1.25, 0.0, -4.0], [0.0, 0.75, 2.0]], + [[1.0, 0.2, 0.0], [0.1, 1.0, 0.0]], + [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]], + ] { + let view = AffineTransform { matrix }; + let pixels = retained.raster_to_bytes(&view, 80, 64, &context).unwrap(); + assert_eq!( + pixels, + baseline.raster_to_bytes(&view, 80, 64, &context).unwrap(), + "paintless rectangle {rect:?}, mode {mode:?}, view {view:?}" + ); + assert_eq!( + pixels, + compile(frame.clone()) + .unwrap() + .raster_to_bytes(&view, 80, 64, &context) + .unwrap() + ); + let mut surface = surfaces::raster_n32_premul((80, 64)).unwrap(); + surface.canvas().clear(skia_safe::Color::WHITE); + let saves = surface.canvas().save_count(); + retained.execute(surface.canvas(), &view, &context).unwrap(); + assert_eq!(surface.canvas().save_count(), saves); + assert_eq!(crate::paint::read_pixels(&mut surface, 80, 64), pixels); + } + } + } + } + + /// No paint exempts only enclosure. The ordinary geometry, exact-bounds, + /// finite-transform and unique-owner checks still run before that exemption. + #[test] + fn declared_source_paintless_rectangles_keep_ordinary_validation() { + let node = paintless_rectangle(Rectangle::from_xywh(10.0, 14.0, 2.0, 3.0)); + for (label, invalid, expected) in [ + ( + "geometry", + FrameNode { + geometry: Geometry::Rect(Rectangle::from_xywh(10.0, 14.0, -1.0, 3.0)), + ..node.clone() + }, + BuildError::InvalidRectangle(SOURCE_NODE_OWNER), + ), + ( + "bounds", + FrameNode { + bounds: Rectangle::from_xywh(f32::NAN, 14.0, 2.0, 3.0), + ..node.clone() + }, + BuildError::InvalidVisualBounds(SOURCE_NODE_OWNER), + ), + ( + "exact transformed bounds", + FrameNode { + bounds: Rectangle::from_xywh(11.0, 14.0, 2.0, 3.0), + ..node.clone() + }, + BuildError::VisualBoundsMismatch(SOURCE_NODE_OWNER), + ), + ( + "transform", + FrameNode { + transform: AffineTransform { + matrix: [[1.0, 0.0, f32::INFINITY], [0.0, 1.0, 0.0]], + }, + ..node.clone() + }, + BuildError::InvalidTransform(SOURCE_NODE_OWNER), + ), + ( + "owner", + FrameNode { + owner: SCOPE_OWNER, + ..node + }, + BuildError::DuplicateOwner(SCOPE_OWNER), + ), + ] { + let frame = domain_illustration_with_node(invalid, rframe::ScopeBlendMode::Multiply); + assert_eq!(compile(frame).unwrap_err(), expected, "{label}"); + } + } + + /// A fill-less stroked rectangle still paints. Both it and a filled + /// rectangle must fit exactly; no epsilon or empty-fill shortcut applies. + #[test] + fn declared_source_enclosure_exemption_requires_no_fill_and_no_stroke() { + let mode = rframe::ScopeBlendMode::Multiply; + for stroked in [false, true] { + let mut node = paintless_rectangle(if stroked { + Rectangle::from_xywh(7.0, 11.0, 41.0, 32.0) + } else { + source_domain().rect() + }); + if stroked { + node.stroke = Some(checked_stroke( + 2.0, + rframe::StrokeCap::Butt, + rframe::StrokeJoin::Miter, + 4.0, + None, + )); + } else { + node.paints = PaintStack::solid(CGColor::BLACK); + } + compile(domain_illustration_with_node(node.clone(), mode)).unwrap(); + for edge in 0..4 { + let mut outside = node.clone(); + let Geometry::Rect(rect) = &mut outside.geometry else { + unreachable!() + }; + match edge { + 0 => rect.x = f32::from_bits(rect.x.to_bits() - 1), + 1 => rect.y = f32::from_bits(rect.y.to_bits() - 1), + 2 => rect.width = f32::from_bits(rect.width.to_bits() + 1), + 3 => rect.height = f32::from_bits(rect.height.to_bits() + 1), + _ => unreachable!(), + } + outside.bounds = math2::rect_transform(*rect, &outside.transform); + let error = compile(domain_illustration_with_node(outside, mode)).unwrap_err(); + assert!(matches!( + error, + BuildError::Blend { + owner: SCOPE_OWNER, + .. + } + )); + assert!(error.to_string().contains("does not enclose"), "{error}"); + } + } + } + #[test] fn declared_source_domain_is_raster_material_not_geometry_or_an_extra_draw() { let ordinary = @@ -4578,7 +4799,7 @@ mod tests { .collect(), ); } - for variant in 0..5 { + for variant in 0..6 { let mut items: Vec<_> = domain_illustration(Some(source_domain()), rframe::ScopeBlendMode::Multiply) .items @@ -4612,7 +4833,15 @@ mod tests { Some(vec![2.0, 3.0]), )) } - 4 => node.paints = PaintStack::empty(), + 4 => { + node.paints = PaintStack::empty(); + node.transform.matrix[0][2] = 1.0; + node.bounds = math2::rect_transform(node.geometry.local_box(), &node.transform); + } + 5 => { + node.paints = PaintStack::empty(); + node.geometry = Geometry::Ellipse(node.geometry.local_box()); + } _ => unreachable!(), } reject(items); diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index 72f481ec..f430f9aa 100644 --- a/crates/n0_cli/README.md +++ b/crates/n0_cli/README.md @@ -607,10 +607,10 @@ 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, 34 component-transfer, 38 blend, 37 morphology, 91 turbulence/displacement, 41 convolution-rung, and 71 diffuse-lighting - cells. The complete primitive corpus contains 1,467 Chromium-baked cells plus + cells. The complete primitive corpus contains 1,537 Chromium-baked cells plus 16 sampled frames; the text estate contains sixteen exact text pixel cells and eight exact-number artifact-geometry witnesses (six Allerta and two - Bungee), and the named refusal register has 329 rows. `feFlood`, `feComposite`, + Bungee), and the named refusal register has 351 rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, `feMorphology`, `feConvolveMatrix`, `feDiffuseLighting`, `feDistantLight`, `fePointLight`, `feSpotLight`, @@ -863,14 +863,26 @@ isolate` have a bounded static SVG group profile. One Stylo computed value simple strokes, solid/pattern-filled siblings and own Multiply/Screen group opacity. The temporary raster origin follows their outward-rounded drawable bounds. A live rectangular linear fill with a resolved positive-width - transparent or zero-alpha solid local stroke now retains a complete source - domain on its blend scope, without inventing stroke paint. This narrower - declaration includes untransformed solid/linear rectangle siblings and simple + transparent or zero-alpha solid local stroke retains a complete source + domain on its blend scope, without inventing stroke paint. At unit element + opacity, non-painted rectangle siblings now supply that domain when they + select transparent/zero-alpha fill, a stopless gradient with an admitted + invertible transform, or a resolved + transparent solid local stroke. The same stroke contribution is retained on + a solid-filled sibling. Explicit absent paint and an invalid fill reference + without fallback contribute no source extent; hidden/display-pruned shapes + likewise do not contribute. Empty-painted rectangle nodes retain their + geometry and identity without adding a draw, and need not be enclosed when + they are not source contributors. This narrower declaration includes + untransformed solid/linear rectangle siblings and simple local painted strokes, enclosing each contributor before union. Its local endpoints must stay within ±8,388,608 and enclose the resolved painted values without inward rounding; a repeating-pattern sibling cannot yet enter that declared domain. Mapped contributors, nested source scopes/opacity, - non-painted geometry contributors, omitted unresolved/context stroke extents, + zero-element/container-opacity contributors, paintless filter/mask/clip or + nested-viewport contributors (including filter-hidden targets), disabled + gradient and zero-opacity pattern fills, wider non-painted geometry, + omitted unresolved/context stroke extents, non-scaling invisible strokes, and patterned strokes in a source that also paints a linear ramp retain the named `linear-gradient source-extent` refusal. This conservatively includes otherwise harmless combinations; diff --git a/crates/websem/src/svg.rs b/crates/websem/src/svg.rs index 3da66b62..0e0dee5f 100644 --- a/crates/websem/src/svg.rs +++ b/crates/websem/src/svg.rs @@ -3430,7 +3430,7 @@ fn compile_svg_element( // Even a bare ramp with no omitted stroke exposes a different root raster // profile under authored non-normal blending. A full-canvas background // masking that difference does not establish the general admission. - if (has_root_blend_source && root_facts.needs_source_domain) + if (has_root_blend_source && root_facts.has_linear_source && root_facts.needs_source_domain) || (root_facts.has_linear_source && root_composite.is_some_and(|scope| scope.mode() != ScopeBlendMode::Normal)) { @@ -3563,6 +3563,16 @@ struct SpanFacts { } impl SpanFacts { + /// A valid filter may suppress every command without proving that its + /// target is absent from an enclosing source enclosure. Preserve only + /// that composition boundary, not fake geometry or an opacity pass. + fn filter_hidden() -> Self { + Self { + linear_source_boundary: Some("with a filter-hidden source contributor"), + ..Self::default() + } + } + fn absorb(&mut self, other: SpanFacts) { self.draws += other.draws; self.opacity_passes += other.opacity_passes; @@ -5286,6 +5296,13 @@ impl<'a> ChildWalk<'a> { mut facts: SpanFacts, mut filter: Filter, ) -> SpanFacts { + // Effect participation survives command elision: an invisible input + // can still change the enclosure used by an enclosing gradient blend. + if facts.has_geometry { + facts.linear_source_boundary = facts + .linear_source_boundary + .or(Some("with a filtered source contributor")); + } if facts.draws == 0 && !facts.has_scope { if !filter.program().may_paint_transparent_input() { return facts; @@ -5321,6 +5338,11 @@ impl<'a> ChildWalk<'a> { let Some(invocation) = invocation else { return Ok(facts); }; + if facts.has_geometry { + facts.linear_source_boundary = facts + .linear_source_boundary + .or(Some("with a masked source contributor")); + } if facts.draws == 0 && !facts.has_scope { return Ok(facts); } @@ -5454,6 +5476,11 @@ impl<'a> ChildWalk<'a> { clip: Option, isolate_blending: bool, ) -> SpanFacts { + if clip.is_some() && facts.has_geometry { + facts.linear_source_boundary = facts + .linear_source_boundary + .or(Some("with a clipped source contributor")); + } if let Some(clip) = clip && (facts.draws > 0 || facts.has_scope) { @@ -5744,7 +5771,7 @@ impl<'a> ChildWalk<'a> { self.elide_blend(blend_id); return Ok(facts); } - if facts.needs_source_domain { + if facts.needs_source_domain && facts.has_linear_source { let bounds = facts.source_domain_bounds.ok_or_else(|| { blend_linear_source_refusal("without a complete rectangular source domain") })?; @@ -5832,7 +5859,7 @@ impl<'a> ChildWalk<'a> { let clip = self.resolve_clip(el, transform, target_box, bases)?; let filter = match self.resolve_filter(el, transform, target_box, bases)? { filter_resource::Resolution::None => None, - filter_resource::Resolution::Hide => return Ok(SpanFacts::default()), + filter_resource::Resolution::Hide => return Ok(SpanFacts::filter_hidden()), filter_resource::Resolution::Apply(filter) => Some(filter), }; let mask = self.resolve_mask(el, transform, target_box, bases)?; @@ -5931,7 +5958,7 @@ impl<'a> ChildWalk<'a> { let filter = match self.resolve_filter(el, content_to_frame, target_box, viewport.child_bases)? { filter_resource::Resolution::None => None, - filter_resource::Resolution::Hide => return Ok(SpanFacts::default()), + filter_resource::Resolution::Hide => return Ok(SpanFacts::filter_hidden()), filter_resource::Resolution::Apply(filter) => Some(filter), }; let mask = self.resolve_mask(el, content_to_frame, target_box, viewport.child_bases)?; @@ -5978,8 +6005,13 @@ impl<'a> ChildWalk<'a> { }; self.context_paint_transform = previous_context_paint_transform; - let facts = + let mut facts = self.wrap_span_with_svg_clip(checkpoint, facts?, authored_clip, defer_own_opacity); + if facts.has_geometry && facts.draws == 0 { + facts.linear_source_boundary = facts + .linear_source_boundary + .or(Some("with a non-painted nested viewport contributor")); + } let viewport_mapping_is_identity = viewport.x == 0.0 && viewport.y == 0.0 && viewport.content_mapping == AffineTransform::identity(); @@ -6171,7 +6203,7 @@ impl<'a> ChildWalk<'a> { let clip = self.resolve_clip(el, transform, reference_box, bases)?; let filter = match self.resolve_filter(el, transform, reference_box, bases)? { filter_resource::Resolution::None => None, - filter_resource::Resolution::Hide => return Ok(SpanFacts::default()), + filter_resource::Resolution::Hide => return Ok(SpanFacts::filter_hidden()), filter_resource::Resolution::Apply(filter) => Some(filter), }; let mask = self.resolve_mask(el, transform, reference_box, bases)?; @@ -6542,7 +6574,7 @@ impl<'a> ChildWalk<'a> { if top_level { self.top_level_shapes.push(el.node_id()); } - return Ok(SpanFacts::default()); + return Ok(SpanFacts::filter_hidden()); } filter_resource::Resolution::Apply(filter) => Some(filter), }; @@ -6626,18 +6658,38 @@ impl<'a> ChildWalk<'a> { .chain(node.stroke.iter().flat_map(|stroke| stroke.paints().iter())) .any(|paint| matches!(paint, cg::Paint::LinearGradient(_))) }); - // Only a live linear fill with a fully resolved local solid stroke - // omission earns this domain. Missing/context servers and non-painted - // siblings keep their existing, independently named boundary. + // A selected paint can record a drawable enclosure without visible + // pixels. Structural passes alone are insufficient: a disabled + // gradient also remains an opacity pass but has different source + // membership. Preserve that private resolution boundary below. + // Keep the geometry node and its + // opacity facts unchanged; only the complete source domain gains + // this contribution. Zero element opacity and unresolved stroke + // extents still need their independently guarded source profile. + let paintless_rectangle = outcome.nodes.len() == 1 + && matches!(outcome.nodes[0].geometry, Geometry::Rect(_)) + && outcome.nodes[0].transform == AffineTransform::identity() + && outcome.nodes[0].paints.is_empty() + && outcome.nodes[0].stroke.is_none(); + let source_selected = outcome.has_geometry && outcome.opacity_passes > 0; let retained_omission = outcome.omitted_local_stroke_width.is_some() - && facts.has_linear_source - && outcome.draws > 0 + && !outcome.has_opacity && outcome.nodes.len() == 1 && blend_rect_source_domain(&outcome.nodes[0], outcome.omitted_local_stroke_width) .is_some(); - facts.needs_source_domain = retained_omission; + let retained_paintless = paintless_rectangle + && !outcome.has_opacity + && (!outcome.omitted_stroke_extent || retained_omission) + && (!source_selected + || blend_rect_source_domain( + &outcome.nodes[0], + outcome.omitted_local_stroke_width, + ) + .is_some()); + facts.needs_source_domain = + retained_omission || (retained_paintless && source_selected); for node in &outcome.nodes { - if outcome.draws > 0 { + if outcome.draws > 0 || (retained_paintless && source_selected) { match blend_rect_source_domain(node, outcome.omitted_local_stroke_width) { Some(bounds) => { facts.source_domain_bounds = Some(match facts.source_domain_bounds { @@ -6647,11 +6699,17 @@ impl<'a> ChildWalk<'a> { } None => facts.source_domain_incomplete = true, } + } else if !paintless_rectangle { + // The declared-domain consumer independently validates + // every retained node, even one with disabled geometry. + facts.source_domain_incomplete = true; } } - facts.linear_source_boundary = if outcome.omitted_stroke_extent && !retained_omission { + facts.linear_source_boundary = if outcome.unresolved_fill_source_extent { + Some("with an unresolved disabled paint-server source extent") + } else if outcome.omitted_stroke_extent && !retained_omission { Some("with a non-painted stroke extent") - } else if outcome.has_geometry && outcome.draws == 0 { + } else if outcome.has_geometry && outcome.draws == 0 && !retained_paintless { Some("with a non-painted source contributor") } else { outcome.nodes.iter().find_map(|node| { @@ -11784,6 +11842,7 @@ fn compile_tspan_text( transformed: false, omitted_stroke_extent: false, omitted_local_stroke_width: None, + unresolved_fill_source_extent: false, })); } let one_pass_fold = (replay_opacity < 1.0 && paths.len() == 1).then_some(replay_opacity); @@ -11832,6 +11891,7 @@ fn compile_tspan_text( transformed: false, omitted_stroke_extent: false, omitted_local_stroke_width: None, + unresolved_fill_source_extent: false, })) } @@ -12525,6 +12585,9 @@ struct ShapeOutcome { /// paint pass. Keep this separate from opacity-fold participation. omitted_stroke_extent: bool, omitted_local_stroke_width: Option, + /// A non-stopless server resolved to no fill. Its opacity pass does not + /// establish blend-source membership; retain the named source patrol. + unresolved_fill_source_extent: bool, /// The shape's own opacity composites fill and stroke through one /// isolated layer — the walk wraps the node in a scope. scope_opacity: Option, @@ -12870,6 +12933,7 @@ fn shape_node( )?; let mut paints = fill.paints; let fill_opacity_pass = fill.opacity_pass; + let unresolved_fill_source_extent = fill.source_extent_unresolved; let resolved_stroke = match strokable { Strokable::Yes => resolve_stroke( el, @@ -12929,6 +12993,7 @@ fn shape_node( transformed: false, omitted_stroke_extent, omitted_local_stroke_width, + unresolved_fill_source_extent, }); } if opacity < 1.0 && has_geometry { @@ -13001,6 +13066,7 @@ fn shape_node( opacity_passes, omitted_stroke_extent, omitted_local_stroke_width, + unresolved_fill_source_extent, scope_opacity, has_opacity, has_geometry, @@ -13312,22 +13378,45 @@ fn context_reference_space( struct PaintResolution { paints: PaintStack, opacity_pass: bool, + source_extent_unresolved: bool, } impl PaintResolution { + /// Absent paint or an invalid reference without fallback records no pass. fn none() -> Self { Self { paints: PaintStack::empty(), opacity_pass: false, + source_extent_unresolved: false, } } + /// A selected paint remains an opacity pass even when its stack is empty. fn selected(paints: PaintStack) -> Self { Self { paints, opacity_pass: true, + source_extent_unresolved: false, + } + } + + /// Retain a valid server's no-fallback opacity pass while refusing to infer + /// its blend-source extent from the missing paint. + fn disabled_server() -> Self { + Self { + source_extent_unresolved: true, + ..Self::selected(PaintStack::empty()) } } + + /// Attach the post-paint factor without erasing selection or extent provenance. + fn with_alpha_factor(mut self, opacity: f32) -> Self { + self.paints = self.paints.with_alpha_factor( + PaintAlphaFactor::new(opacity) + .expect("computed opacity is finite and clamped to [0, 1]"), + ); + self + } } fn resolve_fill( @@ -13400,12 +13489,7 @@ fn resolve_fill( extra_opacity, "fill", )? { - Some(stack) => Ok(PaintResolution::selected( - stack.with_alpha_factor( - PaintAlphaFactor::new(extra_opacity) - .expect("computed opacity is finite and clamped to [0, 1]"), - ), - )), + Some(resolved) => Ok(resolved.with_alpha_factor(extra_opacity)), None => fallback(), } } @@ -13430,7 +13514,7 @@ fn resolve_paint_server_stack( paint_opacity: f32, post_paint_opacity: f32, property: &str, -) -> Result, CompileError> { +) -> Result, CompileError> { let refusal = |reason: String| match property { "fill" => CompileError::UnsupportedFill(reason), _ => CompileError::UnsupportedStroke(reason), @@ -13465,12 +13549,17 @@ fn resolve_paint_server_stack( .map_err(|reason| refusal(format!("url(#{fragment}): {reason}")))?; Ok(match resolved { ResolvedPaintServer::Invalid => None, - ResolvedPaintServer::Nothing => Some(PaintStack::empty()), - ResolvedPaintServer::Solid(color) => Some(PaintStack::solid(color)), - ResolvedPaintServer::Gradient(paint) => Some( + ResolvedPaintServer::Nothing => Some(PaintResolution::disabled_server()), + ResolvedPaintServer::Stopless => { + Some(PaintResolution::selected(PaintStack::empty())) + } + ResolvedPaintServer::Solid(color) => { + Some(PaintResolution::selected(PaintStack::solid(color))) + } + ResolvedPaintServer::Gradient(paint) => Some(PaintResolution::selected( PaintStack::try_from_paints(cg::Paints::new([paint])) .map_err(|error| refusal(error.to_string()))?, - ), + )), }) } ClassifiedServer::Pattern(first) => { @@ -13479,7 +13568,7 @@ fn resolve_paint_server_stack( else { // A valid server through a singular context destination paints // nothing and does not select fallback, matching gradients. - return Ok(Some(PaintStack::empty())); + return Ok(Some(PaintResolution::disabled_server())); }; match patterns .resolve( @@ -13494,7 +13583,16 @@ fn resolve_paint_server_stack( .map_err(|reason| refusal(format!("url(#{fragment}): {reason}")))? { PatternResolution::Invalid => Ok(None), - PatternResolution::Paint(pattern) => Ok(Some(PaintStack::from_pattern(pattern))), + PatternResolution::Paint(pattern) => { + // Construction erases a zero-opacity pattern. Keep its + // unproved resource-source extent distinct from a selected + // transparent solid, without changing its opacity pass. + let source_extent_unresolved = pattern.opacity() == 0.0; + Ok(Some(PaintResolution { + source_extent_unresolved, + ..PaintResolution::selected(PaintStack::from_pattern(pattern)) + })) + } } } } @@ -14468,12 +14566,7 @@ fn resolve_stroke( extra_opacity, "stroke", )? { - Some(stack) => PaintResolution::selected( - stack.with_alpha_factor( - PaintAlphaFactor::new(extra_opacity) - .expect("computed opacity is finite and clamped to [0, 1]"), - ), - ), + Some(resolved) => resolved.with_alpha_factor(extra_opacity), None => stroke_fallback()?, } } diff --git a/crates/websem/src/svg_paint_server.rs b/crates/websem/src/svg_paint_server.rs index e5db29c1..aa450a4a 100644 --- a/crates/websem/src/svg_paint_server.rs +++ b/crates/websem/src/svg_paint_server.rs @@ -220,7 +220,11 @@ pub(crate) enum ResolvedPaintServer { /// The reference is invalid — no gradient carries the id. The authored /// fallback decides what paints. Invalid, - /// A valid reference that paints nothing (measured correct nothings). + /// A valid stopless gradient. It paints nothing but still participates in + /// the enclosing drawable's source extent, unlike a disabled gradient. + Stopless, + /// Other valid references that paint nothing (measured correct nothings). + /// Their blend-source membership is not implied by an opacity pass. Nothing, /// A valid reference that losslessly resolves to one RGBA8 solid color. Solid(CGColor), @@ -350,7 +354,14 @@ pub(crate) fn resolve( Some(owner) => resolve_stops(owner)?, }; if stops.is_empty() { - return Ok(ResolvedPaintServer::Nothing); + // Empty paint does not imply a drawable source contribution. A + // singular transform disables even a stopless gradient in Chromium. + // Preserve standalone no-paint/no-fallback behavior for otherwise + // inert, unadmitted transform grammar, but do not claim its extent. + return Ok(match resolve_gradient_transform(&chain) { + Ok(GradientTransform::Affine(_)) => ResolvedPaintServer::Stopless, + Ok(GradientTransform::NonInvertible) | Err(_) => ResolvedPaintServer::Nothing, + }); } let units = resolve_units(&chain); diff --git a/crates/websem/tests/svg_blending.rs b/crates/websem/tests/svg_blending.rs index 6e6e74a0..b5e404cf 100644 --- a/crates/websem/tests/svg_blending.rs +++ b/crates/websem/tests/svg_blending.rs @@ -26,6 +26,186 @@ const RECT: &str = r#""#; const RAMP: &str = ""; const RAMP_RECT: &str = ""; +#[test] +fn paintless_effects_and_disabled_servers_keep_the_source_patrol() { + let ghost = ""; + let definitions = ""; + let mut siblings = Vec::new(); + siblings.push(format!("{}", ghost.replace("fill='transparent'", "fill='url(#p)' fill-opacity='0'"))); + for filter in [ + "", + "", + ] { + for target in [ + ghost.replace("/>", " filter='url(#hide)'/>"), + format!("{ghost}"), + format!("{ghost}"), + format!( + "{}", + ghost.replace("{filter}{target}")); + } + } + for effect in ["filter='url(#f)'", "mask='url(#m)'", "clip-path='url(#c)'"] { + siblings.push(ghost.replace("/>", &format!(" {effect}/>"))); + siblings.push(format!("{ghost}")); + } + siblings.push(format!("{ghost}")); + siblings.push(format!( + "{ghost}" + )); + siblings.push(ghost.replace("fill='transparent'", "fill='url(#s)'")); + siblings.push(format!( + "{}", + ghost.replace("fill='transparent'", "fill='url(#stopless)'") + )); + // A declared source must also cover every retained painted node, even + // when its zero-width geometry paints no pixels. + siblings.push(format!( + "{}", + RAMP_RECT.replace("/>", " stroke='transparent' stroke-width='4'/>") + )); + for mode in ["multiply", "screen"] { + for sibling in &siblings { + let source = svg(&format!( + "{RAMP}{definitions}{RAMP_RECT}{sibling}{RECT}" + )); + let strict = compile_standalone_svg(&source, InitialViewport::new(64.0, 64.0)) + .unwrap_err() + .to_string(); + assert!( + strict.contains("linear-gradient source-extent"), + "{strict}: {source}" + ); + let best = SvgFrameSource::from_standalone_svg_best_effort( + source.as_str(), + InitialViewport::new(64.0, 64.0), + ) + .unwrap(); + assert_eq!( + best.base_frame().items.len(), + 1, + "complete group rollback: {source}" + ); + assert!( + best.degradations().iter().any(|d| d.path() == "svg/g[1]" + && d.reason().contains("linear-gradient source-extent")), + "{:?}", + best.degradations() + ); + } + } +} + +#[test] +fn nonpainted_sibling_membership_is_independent_of_visible_paint() { + for mode in ["multiply", "screen"] { + for (attrs, expected) in [ + ("fill='transparent'", Some((3.0, 5.0, 44.0, 37.0))), + ("fill='red' fill-opacity='0'", Some((3.0, 5.0, 44.0, 37.0))), + ("fill='url(#empty)'", Some((3.0, 5.0, 44.0, 37.0))), + ( + "fill='none' stroke='transparent' stroke-width='4'", + Some((1.0, 3.0, 46.0, 39.0)), + ), + ( + "fill='none' stroke='red' stroke-opacity='0' stroke-width='4'", + Some((1.0, 3.0, 46.0, 39.0)), + ), + ("fill='none' stroke='none'", None), + ("fill='url(#missing)'", None), + ] { + let sibling = format!(""); + let source = svg(&format!( + "{RAMP}{RAMP_RECT}{sibling}" + )); + let strict = compile_standalone_svg(&source, InitialViewport::new(64.0, 64.0)).unwrap(); + let best = SvgFrameSource::from_standalone_svg_best_effort( + source.as_str(), + InitialViewport::new(64.0, 64.0), + ) + .unwrap(); + assert_eq!(strict, best.base_frame()); + assert!( + !best + .degradations() + .iter() + .any(|d| d.action() == websem::DegradationAction::Skipped) + ); + let actual = blends(&strict) + .into_iter() + .find_map(|b| b.source_domain()) + .map(|d| d.rect()); + assert_eq!( + actual, + expected.map(|(x, y, w, h)| math2::Rectangle::from_xywh(x, y, w, h)), + "{mode}: {attrs}" + ); + assert_eq!( + strict.nodes().len(), + 2, + "retained geometry is not fake paint" + ); + assert_eq!( + strict.nodes()[1].geometry, + rframe::Geometry::Rect(math2::Rectangle::from_xywh(3.2, 5.7, 13.4, 17.2)) + ); + assert!(strict.nodes()[1].paints.is_empty()); + assert!(strict.nodes()[1].stroke.is_none()); + } + } +} + +#[test] +fn absent_paint_sibling_does_not_enlarge_an_existing_declared_source() { + let omitted = RAMP_RECT.replace("/>", " stroke='transparent' stroke-width='4'/>"); + for attrs in [ + "fill='none'", + "fill='url(#missing)'", + "fill='transparent' width='0'", + ] { + let sibling = if attrs.contains("width=") { + format!("") + } else { + format!("") + }; + let result = frame(&format!( + "{RAMP}{omitted}{sibling}" + )); + let domain = blends(&result) + .into_iter() + .find_map(|b| b.source_domain()) + .unwrap(); + assert_eq!( + domain.rect(), + math2::Rectangle::from_xywh(6.0, 10.0, 43.0, 34.0) + ); + assert_eq!(result.nodes().len(), 2); + } +} + +#[test] +fn sibling_contributions_do_not_create_domains_without_a_live_linear_source() { + for content in [ + "", + "", + ] { + for wrapper in [ + format!("{content}"), + format!("{content}"), + ] { + let result = frame(&wrapper); + assert!( + blends(&result) + .into_iter() + .all(|b| b.source_domain().is_none()) + ); + } + } +} + #[test] fn linear_source_extent_patrol_is_transactional_and_names_the_owner() { for content in [ @@ -33,8 +213,6 @@ fn linear_source_extent_patrol_is_transactional_and_names_the_owner() { format!("{RAMP_RECT}{RECT}"), format!("{RAMP_RECT}{RECT}"), format!("{RAMP_RECT}{RECT}"), - format!("{RAMP_RECT}"), - format!("{RAMP_RECT}"), format!("{RAMP_RECT}{RECT}"), format!("{RAMP_RECT}"), RAMP_RECT.replace( @@ -46,9 +224,6 @@ fn linear_source_extent_patrol_is_transactional_and_names_the_owner() { "{}", RAMP_RECT.replace("/>", " stroke='url(#empty)' stroke-width='4'/>") ), - format!( - "{RAMP_RECT}" - ), RAMP_RECT.replace("/>", " stroke='url(#missing)' stroke-width='4'/>"), RAMP_RECT.replace("/>", " stroke='context-stroke' stroke-width='4'/>"), format!( diff --git a/crates/websem/tests/unsupported_corpus.rs b/crates/websem/tests/unsupported_corpus.rs index 3aa428cd..4b091ef8 100644 --- a/crates/websem/tests/unsupported_corpus.rs +++ b/crates/websem/tests/unsupported_corpus.rs @@ -46,6 +46,136 @@ use Departure::{BothRefuse, DeclaredByBestEffort}; /// construct itself — a refusal that stopped naming what it refused would pass /// a bare "does it error" check and fail this one. const CORPUS: &[(&str, Departure, &str)] = &[ + ( + "svg-group-blend-sibling-review-zero-pattern", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-empty-leaf", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-empty-group", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-empty-use", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-empty-viewport", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-zero-region-leaf", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-zero-region-group", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-zero-region-use", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-hide-zero-region-viewport", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-leaf-offset", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-group-offset", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-leaf-blur", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-group-blur", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-leaf-mask", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-group-mask", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-leaf-clip", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-group-clip", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-nested-clipped", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-nested-visible", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-singular", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-stopless-singular", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-review-painted-zero-domain", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-domain-mapped", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-domain-circle", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-domain-non-scaling", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), + ( + "svg-group-blend-sibling-domain-opacity", + DeclaredByBestEffort, + "linear-gradient source-extent", + ), ( "svg-group-blend-source-domain-root-transparent", BothRefuse, @@ -101,11 +231,6 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "linear-gradient source-extent", ), - ( - "svg-group-blend-linear-extent-stroke-sibling", - DeclaredByBestEffort, - "linear-gradient source-extent", - ), ( "svg-group-blend-linear-extent-root-opacity", BothRefuse, @@ -141,21 +266,6 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "linear-gradient source-extent", ), - ( - "svg-group-blend-linear-extent-transparent", - DeclaredByBestEffort, - "linear-gradient source-extent", - ), - ( - "svg-group-blend-linear-extent-fill-zero", - DeclaredByBestEffort, - "linear-gradient source-extent", - ), - ( - "svg-group-blend-linear-extent-empty-gradient", - DeclaredByBestEffort, - "linear-gradient source-extent", - ), ( "svg-group-blend-linear-extent-pattern-stroke", DeclaredByBestEffort, diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index 184155ec..9ab9a2c2 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -62,7 +62,8 @@ from the dated addenda below: group blending/isolation through a combined resolved blend/opacity scope ([B1](#b1-svg-group-blending), with the [B2a source-extent correction](#b2a-linear-gradient-blend-source-extents) and - [B2b source-domain rung](#b2b-complete-blend-source-domains)); the whole + [B2b source-domain rung](#b2b-complete-blend-source-domains) and its + [sibling-extent follow-on](#b2b-sibling-extent-follow-on)); the whole `transform` grammar in both spellings (the attribute is a presentation hint of the CSS `transform` property, and `gradientTransform` is that attribute on gradient elements); @@ -118,7 +119,7 @@ from the dated addenda below: carrying admitted repeating-pattern paint and admitted source/target filter composition. `crates/n0_cli/README.md` is the statement of record. -- **The corpus** is 1,467 Chromium-baked primitive cells plus 16 sampled frames, +- **The corpus** is 1,537 Chromium-baked primitive cells plus 16 sampled frames, with a separate sixteen-cell exact text suite whose current cells select hash-pinned Ahem and Ahem-derived bytes from explicit family/face environments, and eight exact-number artifact-geometry @@ -129,7 +130,7 @@ from the dated addenda below: carrying declared one-code-value ramp-quantization bounds. The measured per-cell counts and causes are listed in the [corpus record](../../../fixtures/web-first/README.md). - The named refusal register has 329 rows. + The named refusal register has 351 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 @@ -6400,3 +6401,125 @@ reproduced manually; both pass after the root finding was applied. The reproducer renewed the original matrices and root refusals, verified the exact gate and additions-only bake records, and reran status without further diff. Post-root full Web compiler/CLI tests, trace pixels and strict Clippy pass. + +## B2b sibling-extent follow-on + +The same complete-domain contract now distinguishes non-painted rectangle +siblings that select a paint from those that have no paint. This is a bounded +source-membership extension, not a new blend mode or a checklist closure. +The [admitted-slice record](../../../crates/n0_cli/README.md) owns its boundaries. + +Pinned Chromium distinguishes a live fractional linear ramp alone from the +same ramp with a transparent-fill sibling at `(3.2,5.7)`, size `(13.4,17.2)`: +236 pixels change for Multiply and 342 for Screen, maximum channel delta one. +Zero fill opacity and a valid stopless gradient fill have the same effect; +transparent stroke-only siblings of width four change 291/387 pixels. Hidden +or display-pruned siblings, explicit absent paint, invalid fill references +without fallback and zero-width geometry match the absent-sibling control. +These exact pair comparisons are **(measured, not celled as separate pair +controls)**; the selected positive cases are independently Chromium-baked below. +Every candidate in that initial matrix also ran through the actual command in +both admissions under one binary hash per batch. Its unmodified-baseline admissions were exact; +the other cases reached the existing named source-extent guard. + +The cause is source contribution being discarded with visible paint. Selection +and drawing are different facts: a selected zero-alpha or empty-server paint +can still supply its rectangle's local drawable enclosure, while absent paint +does not. Opacity passes are insufficient to establish membership: singular +gradients also retain a pass but Chromium disables their source contribution. +The compiler now preserves stopless versus other disabled server resolutions +privately, alongside the existing opacity facts. Unproved disabled server +extents retain a named refusal; opacity passes, node geometry, identities and +paint order are unchanged. Each contributing rectangle +is locally enclosed before union; a declaration is installed only for an +actual blend source containing a linear ramp. A solid-filled sibling with an +omitted resolved solid local stroke retains its decorated enclosure too. +No paint is invented and no second traversal, source tree or public field is added. + +An independent consumer maintainer accepted a narrow relaxation of the existing +contract: an identity-mapped paintless rectangle remains valid inside a declared +source even when its noncontributing geometry lies outside the domain. Ordinary +finite geometry, exact bounds and unique-owner checks still run. Mapped and +nonrectangular paintless nodes still refuse; any node with fill or stroke must +remain enclosed. Four consumer tests independently prove retained geometry, +no added paint/coverage, strict painted enclosure, balanced saves and +changed-view reuse equal to fresh execution. The existing painter and +`rframe` vocabulary are unchanged. No timing or memory improvement is claimed. + +Seventy new exact cells cover fill-alpha spellings, empty/invalid paint-server +selection, invisible solid stroke widths and spellings, solid-filled siblings, +local enclosure and order, multiple contributors, neutral containers, +inheritance and author CSS, local instances, own/outer group opacity, ancestor +clipping, multiple ramps and elided Normal isolation. Absent/hidden/pruned +controls and noncontributing geometry outside an already declared source guard +the membership boundary. All use the unchanged hash-pinned Chromium capture; +no existing oracle or tolerance is changed. + +Four former refusal witnesses (`transparent`, `fill-zero`, `empty-gradient`, +and `stroke-sibling` under `svg-group-blend-linear-extent-`) are preserved as +`svg-group-blend-sibling-promoted-*` cells. Their minimal cleanup removes only +unused definitions and changes internal id/whitespace spelling; all four +old/new Chromium pairs are byte-identical, and both actual admissions are exact. +Only the obsolete refusal assertions are deliberately removed. Four new +registered siblings retain the mapped, circular, non-scaling invisible-stroke +and zero-element-opacity boundaries. The primitive corpus grows from 1,467 to +1,537; twenty-two additional review-regression witnesses bring the named refusal +register to 351. The sixteen sampled frames, +sixteen text-pixel cells and eight geometry witnesses are unchanged. + +Zero element opacity, a zero-opacity container, and an explicitly isolated +zero-opacity leaf also change 236/342 pixels in the initial sibling matrix +**(measured, not celled as positive cases)**. They remove visual nodes and carry +composition barriers; this rung does not infer their source contribution from +an empty surviving stream. They remain named refusals, together with mapped or +nested source effects, unrepresented repeating-program contributions, +unresolved/context stroke extents and the unproved root linear source. A root +cannot borrow a child-domain exemption. These composition gaps belong to the +still-open blending rows, not to a new untick of the opacity or visibility rows. + +Independent review found that paintless filter, mask and clip participation +could disappear with the elided commands, and a singular gradient could be +confused with a stopless one. The first prototype silently differed from +Chromium for offset-filter siblings at 236/342 pixels, blur-filter siblings at +240/350 pixels, and singular-gradient siblings at 236/342 pixels, all at +maximum channel delta one. The expanded matrix found the singular result also +holds when the gradient itself has no stops. These are **(measured, not celled +as positive cases)**, not admitted approximations. Effect and nested-viewport +participation now survives no-paint elision as private source-profile facts; +disabled server resolution does not select fallback or change opacity folding. +An ancestor clip around an already completed blend remains an exact control. + +The first thirteen registered review witnesses cover leaf/container filter, mask and +clip participation, clipped and overflow-visible paintless nested viewports, +singular gradients with and without stops, and a solid-painted zero-width +rectangle outside an already declared source. The latter must be refused by +the producer before consumer preflight, so best-effort can roll back the whole +blend group at its stable owner path. Regression tests prove that transaction +and fail on the first prototype. Ordinary stopless radial fills have their own +two exact cells; no disabled-gradient admission is inferred from those controls. + +Further source review found two earlier normalization points: zero-opacity +patterns become empty stacks, and valid empty filters or zero-sized filter +regions return `Hide` before the ordinary effect wrapper. The pattern control +was exact in both CLI admissions, but cannot establish the wider resource-source +profile. The filter controls silently differed at 236/342 pixels, maximum +channel delta one, on shapes, groups, local instances and nested viewports +**(measured, not celled as positive cases)**. Nine more registered witnesses +preserve these boundaries. Private pattern provenance survives stack +normalization; all four filter-hide call sites preserve a source-profile fact +without inventing geometry, paint or opacity passes. Transactional tests guard +all four callers, not merely the leaf case. + +The gate is sensitivity-tested: deliberately excluding only the new paintless +contributions from source-domain union makes `just gate` fail fifty-one new +pixel cells, including the original 236/342-pixel transparent-sibling pair. +Exact source restoration returns the complete primitive, text and refusal +gate to green. No existing oracle or tolerance is relaxed to obtain that result. + +No Workflow runner was exposed, so the saved verification workflow could not +be invoked through a Workflow tool. Its independent TICK/LAW and REPRO roles +were reproduced manually; both pass after all findings above were applied. +The reproducer renewed the captures and 284 CLI executions under one fixed +binary, verified old records and oracle bytes, and reran the full gate and +status without further diff. Full relevant tests, trace execution/pixels, +formatting, strict Clippy and link/OSS checks pass. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index f9c6ded2..c6a28f3f 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -695,6 +695,10 @@ excluded. > now carries a resolved invisible solid stroke's source contribution beside a > live rectangular linear fill. Its forty-four exact cells remove two bounded > refusals; wider source spaces and blend values still prevent a tick. +> Its [sibling-extent follow-on](./svg-engine-of-record.md#b2b-sibling-extent-follow-on) +> distinguishes selected transparent paint from absent paint on non-painted +> rectangle siblings, with seventy exact cells and four refusal promotions. +> Zero-element-opacity and wider source profiles remain guarded; no row ticks. ### CSS fonts diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index bcc0097a..5eda748b 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -19,15 +19,29 @@ Every root primitive here is a closed enumeration in `primitives.json` with a committed Chromium oracle beside it. Text follows the ratified corpus-growth law in its own closed [text estate](./text/README.md): sixteen exact text cells and eight exact-number real-font artifact-geometry witnesses. The current evidence -estate is 1,467 primitive cells plus 16 sampled frames, those twenty-four text -witnesses, and 329 named refusal rows. Pixel cells use byte equality: what each -corpus admits is exactly what the engine renders pixel-for-pixel, except only +estate is 1,537 primitive cells plus 16 sampled frames, those twenty-four text +witnesses, and 351 named refusal rows. Pixel cells require byte equality, except only the primitive rows carrying an explicit measured tolerance block. The real-font witness grades geometry before rasterization and makes no Chromium pixel claim. +The seventy sibling-extent additions below cover unit-opacity, identity-mapped +rectangle siblings, including paintless geometry with selected transparent +fill, zero paint alpha or a stopless gradient with an invertible map. Effects +inside the source, nested viewports, disabled gradient maps and zero element +opacity retain named refusal witnesses. The +[sibling-extent evidence](../../docs/wg/consolidation/svg-engine-of-record.md#b2b-sibling-extent-follow-on) +separates source membership from visible paint and records the bounded profile. + | File | Role | | --- | --- | +| `svg-group-blend-sibling-{multiply,screen}-{transparent,fill-zero,fill-alpha,empty-server,invalid-fallback}.svg` | Ten selected-paint sibling cells: transparent color, zero fill opacity, zero color alpha, a valid stopless linear server and a missing server with transparent fallback retain source contribution without visible fill. | +| `svg-group-blend-sibling-{multiply,screen}-{stroke-only,stroke-zero,stroke-thin,stroke-px,stroke-percent,stroke-dash,solid-stroke}.svg` | Fourteen decorated-rectangle cells: omitted transparent/zero-alpha solid strokes, width spellings and inert dash/join state retain local source enclosure, including beside a solid-filled sibling. | +| `svg-group-blend-sibling-{multiply,screen}-{boundary,edge,reversed,multiple,two-ramps}.svg` | Ten enclosure and composition controls: fractional boundaries, offscreen edges, sibling order, multiple paintless contributors and two live ramps. | +| `svg-group-blend-sibling-{multiply,screen}-{none,missing,hidden,display,none-outside-domain,zero-outside-domain}.svg` | Twelve noncontribution controls: absent or unresolved paint without fallback, hidden/pruned siblings and absent-paint or zero-width geometry outside an already declared source. Retained paintless geometry must not enlarge that domain. | +| `svg-group-blend-sibling-{multiply,screen}-{neutral,inherited,css,use,own-opacity,near-opacity,outer-opacity,ancestor-clip,normal-elided}.svg` | Eighteen ownership and boundary controls: neutral containers, inherited/computed fill, local instances, the blend's own opacity, outer opacity, an ancestor clip and elided redundant Normal isolation. The sibling itself remains at unit element opacity. | +| `svg-group-blend-sibling-promoted-{transparent,fill-zero,empty-server,solid-stroke}.svg` | Four preserved refusal witnesses, promoted from `svg-group-blend-linear-extent-{transparent,fill-zero,empty-gradient,stroke-sibling}.svg` respectively. All four old/new Chromium pairs have equal pixels; cleanup changes only unused definitions, resource ids and whitespace. | +| `svg-group-blend-sibling-review-{multiply,screen}-empty-radial.svg` | Two stopless-radial sibling controls. The ordinary invertible server retains source contribution and both CLI admissions have zero differing pixels against Chromium. Singular stopless maps remain separately quarantined, not positive cells. | | `svg-group-blend-source-{multiply,screen}-{fractional,zeroalpha,integer,width-one,width-fractional,pixel-boundary,edge,sibling,sibling-reversed,opacity-half,opacity-near,outer-opacity,leaf,nested-neutral}.svg` | Twenty-eight exact source-domain cells: a live linear fill retains the source contribution of a transparent or zero-alpha solid stroke. Fractional placement, width changes, source union/order, combined versus outer opacity and boundary ownership exercise the complete enclosure without adding visible stroke paint. | | `svg-group-blend-source-multiply-{dashed,bevel,width-px,currentcolor,normal-elided}.svg` · `svg-group-blend-source-screen-{round,width-percent,inherited}.svg` · `svg-group-blend-source-{multiply,screen}-{two-ramps,painted-stroke,outer-clip,use}.svg` | Sixteen exact adjacent controls: alternate omitted-stroke spellings, an elided redundant isolation, multiple drawable enclosures, a live stroke contributor, ancestor clipping and unpositioned local instances. The [source-domain evidence](../../docs/wg/consolidation/svg-engine-of-record.md#b2b-complete-blend-source-domains) separates these admissions from the retained source-space refusals. | | `svg-group-blend-extent-multiply-stroke-{none,clear-gradient}.svg` · `svg-group-blend-extent-screen-stroke-{zero-width,transparent-fill}.svg` | Four exact controls for the review-discovered omitted-stroke extent boundary. A retained all-transparent gradient stroke still supplies its geometry; `none` and zero width create no stroke extent; transparent fill does not lose the surrounding live gradient stroke's extent. The newer source-domain cells carry resolved transparent solid strokes; unresolved/context omissions remain separately refused. | diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index 7dc10b48..eb6670be 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 (1467) +## Chromium-baked cells (1537) Cells are checked against their committed Chromium oracles using exact bytes unless a manifest entry declares a measured, bounded @@ -732,6 +732,76 @@ to its fixture source. No new image is committed for this view. svg-group-blend-screen-opacity-small-partial svg-group-blend-screen-stroke svg-group-blend-screen-transparent +svg-group-blend-sibling-multiply-ancestor-clip +svg-group-blend-sibling-multiply-boundary +svg-group-blend-sibling-multiply-css +svg-group-blend-sibling-multiply-display +svg-group-blend-sibling-multiply-edge +svg-group-blend-sibling-multiply-empty-server +svg-group-blend-sibling-multiply-fill-alpha +svg-group-blend-sibling-multiply-fill-zero +svg-group-blend-sibling-multiply-hidden +svg-group-blend-sibling-multiply-inherited +svg-group-blend-sibling-multiply-invalid-fallback +svg-group-blend-sibling-multiply-missing +svg-group-blend-sibling-multiply-multiple +svg-group-blend-sibling-multiply-near-opacity +svg-group-blend-sibling-multiply-neutral +svg-group-blend-sibling-multiply-none +svg-group-blend-sibling-multiply-none-outside-domain +svg-group-blend-sibling-multiply-normal-elided +svg-group-blend-sibling-multiply-outer-opacity +svg-group-blend-sibling-multiply-own-opacity +svg-group-blend-sibling-multiply-reversed +svg-group-blend-sibling-multiply-solid-stroke +svg-group-blend-sibling-multiply-stroke-dash +svg-group-blend-sibling-multiply-stroke-only +svg-group-blend-sibling-multiply-stroke-percent +svg-group-blend-sibling-multiply-stroke-px +svg-group-blend-sibling-multiply-stroke-thin +svg-group-blend-sibling-multiply-stroke-zero +svg-group-blend-sibling-multiply-transparent +svg-group-blend-sibling-multiply-two-ramps +svg-group-blend-sibling-multiply-use +svg-group-blend-sibling-multiply-zero-outside-domain +svg-group-blend-sibling-promoted-empty-server +svg-group-blend-sibling-promoted-fill-zero +svg-group-blend-sibling-promoted-solid-stroke +svg-group-blend-sibling-promoted-transparent +svg-group-blend-sibling-review-multiply-empty-radial +svg-group-blend-sibling-review-screen-empty-radial +svg-group-blend-sibling-screen-ancestor-clip +svg-group-blend-sibling-screen-boundary +svg-group-blend-sibling-screen-css +svg-group-blend-sibling-screen-display +svg-group-blend-sibling-screen-edge +svg-group-blend-sibling-screen-empty-server +svg-group-blend-sibling-screen-fill-alpha +svg-group-blend-sibling-screen-fill-zero +svg-group-blend-sibling-screen-hidden +svg-group-blend-sibling-screen-inherited +svg-group-blend-sibling-screen-invalid-fallback +svg-group-blend-sibling-screen-missing +svg-group-blend-sibling-screen-multiple +svg-group-blend-sibling-screen-near-opacity +svg-group-blend-sibling-screen-neutral +svg-group-blend-sibling-screen-none +svg-group-blend-sibling-screen-none-outside-domain +svg-group-blend-sibling-screen-normal-elided +svg-group-blend-sibling-screen-outer-opacity +svg-group-blend-sibling-screen-own-opacity +svg-group-blend-sibling-screen-reversed +svg-group-blend-sibling-screen-solid-stroke +svg-group-blend-sibling-screen-stroke-dash +svg-group-blend-sibling-screen-stroke-only +svg-group-blend-sibling-screen-stroke-percent +svg-group-blend-sibling-screen-stroke-px +svg-group-blend-sibling-screen-stroke-thin +svg-group-blend-sibling-screen-stroke-zero +svg-group-blend-sibling-screen-transparent +svg-group-blend-sibling-screen-two-ramps +svg-group-blend-sibling-screen-use +svg-group-blend-sibling-screen-zero-outside-domain svg-group-blend-source-multiply-bevel svg-group-blend-source-multiply-currentcolor svg-group-blend-source-multiply-dashed @@ -1495,7 +1565,7 @@ to its fixture source. No new image is committed for this view. svg-visibility-rule-beats-attribute svg-visibility-unhide -## The refusal register (329) +## The refusal register (351) What the slice refuses, by name, in the compiler's own words — **both refuse** is a document-level contract; **declared** renders @@ -1614,9 +1684,7 @@ its row into the cells above. | `svg-group-blend-elided-mask-unit` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter or mask needs its own image-effect composition profile | | `svg-group-blend-filter` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter or mask needs its own image-effect composition profile | | `svg-group-blend-linear-extent-child-opacity` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a transformed or nested linear-gradient source needs the linear-gradient source-extent profile | -| `svg-group-blend-linear-extent-clip` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a transformed or nested linear-gradient source needs the linear-gradient source-extent profile | -| `svg-group-blend-linear-extent-empty-gradient` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | -| `svg-group-blend-linear-extent-fill-zero` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-linear-extent-clip` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a clipped source contributor needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-isolation` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a transformed or nested linear-gradient source needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-nested-blend` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a transformed or nested linear-gradient source needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-pattern-stroke` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a patterned source stroke needs the linear-gradient source-extent profile | @@ -1628,9 +1696,7 @@ its row into the cells above. | `svg-group-blend-linear-extent-stroke-empty-gradient` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-stroke-missing-reference` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-stroke-none-fallback` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | -| `svg-group-blend-linear-extent-stroke-sibling` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-transform` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a mapped source contributor needs the linear-gradient source-extent profile | -| `svg-group-blend-linear-extent-transparent` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-viewport` | declared | skipped svg/svg[1]/g[1]: unsupported computed style: mix-blend-mode/isolation with a mapped source contributor needs the linear-gradient source-extent profile | | `svg-group-blend-linear-extent-zero-opacity` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | | `svg-group-blend-mask` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter or mask needs its own image-effect composition profile | @@ -1657,6 +1723,32 @@ its row into the cells above. | `svg-group-blend-resource-pattern-root` | declared | skipped svg/rect[2]: unsupported fill value "url(#q): unsupported computed style: mix-blend-mode/isolation on needs its own source composition profile" | | `svg-group-blend-root-filter-sibling` | **both refuse** | unsupported computed style: mix-blend-mode/isolation with a filter or mask needs its own image-effect composition profile | | `svg-group-blend-root-opacity` | **both refuse** | unsupported computed style: mix-blend-mode with partial opacity on the root crosses the root-layer precision boundary | +| `svg-group-blend-sibling-domain-circle` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-domain-mapped` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-domain-non-scaling` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-domain-opacity` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-group-blur` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filtered source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-group-clip` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a clipped source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-group-mask` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a masked source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-group-offset` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filtered source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-empty-group` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-empty-leaf` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-empty-use` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-empty-viewport` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-zero-region-group` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-zero-region-leaf` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-zero-region-use` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-hide-zero-region-viewport` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filter-hidden source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-leaf-blur` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filtered source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-leaf-clip` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a clipped source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-leaf-mask` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a masked source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-leaf-offset` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a filtered source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-nested-clipped` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a clipped source contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-nested-visible` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted nested viewport contributor needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-painted-zero-domain` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with an unrepresented rectangular source domain needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-singular` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with an unresolved disabled paint-server source extent needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-stopless-singular` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with an unresolved disabled paint-server source extent needs the linear-gradient source-extent profile | +| `svg-group-blend-sibling-review-zero-pattern` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with an unresolved disabled paint-server source extent needs the linear-gradient source-extent profile | | `svg-group-blend-source-clip` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with curved, subpixel, or rotated clip coverage crosses the group-source precision boundary | | `svg-group-blend-source-domain-enclosure` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | | `svg-group-blend-source-domain-non-scaling` | declared | skipped svg/g[1]: unsupported computed style: mix-blend-mode/isolation with a non-painted stroke extent needs the linear-gradient source-extent profile | diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-ancestor-clip.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-ancestor-clip.png new file mode 100644 index 00000000..6a34f601 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-ancestor-clip.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-boundary.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-boundary.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-boundary.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-css.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-css.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-css.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-display.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-display.png new file mode 100644 index 00000000..f7b68cc7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-display.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-edge.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-edge.png new file mode 100644 index 00000000..d5d0397c Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-edge.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-empty-server.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-empty-server.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-empty-server.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-alpha.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-alpha.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-zero.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-zero.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-fill-zero.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-hidden.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-hidden.png new file mode 100644 index 00000000..f7b68cc7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-hidden.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-inherited.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-inherited.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-inherited.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-invalid-fallback.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-invalid-fallback.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-invalid-fallback.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-missing.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-missing.png new file mode 100644 index 00000000..f7b68cc7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-missing.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-multiple.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-multiple.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-multiple.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-near-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-near-opacity.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-near-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-neutral.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-neutral.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-neutral.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none-outside-domain.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none-outside-domain.png new file mode 100644 index 00000000..de5227ee Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none-outside-domain.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none.png new file mode 100644 index 00000000..f7b68cc7 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-none.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-normal-elided.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-normal-elided.png new file mode 100644 index 00000000..70ec02e2 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-normal-elided.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-outer-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-outer-opacity.png new file mode 100644 index 00000000..50bd4c7e Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-outer-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-own-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-own-opacity.png new file mode 100644 index 00000000..9fe65afa Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-own-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-reversed.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-reversed.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-reversed.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-solid-stroke.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-solid-stroke.png new file mode 100644 index 00000000..9c119ad2 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-solid-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-dash.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-dash.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-dash.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-only.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-only.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-only.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-percent.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-percent.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-percent.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-px.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-px.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-px.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-thin.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-thin.png new file mode 100644 index 00000000..86854004 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-thin.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-zero.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-zero.png new file mode 100644 index 00000000..750edf71 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-stroke-zero.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-transparent.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-transparent.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-transparent.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-two-ramps.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-two-ramps.png new file mode 100644 index 00000000..fe5de706 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-two-ramps.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-use.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-use.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-use.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png new file mode 100644 index 00000000..de5227ee Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-empty-server.png b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-empty-server.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-empty-server.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-fill-zero.png b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-fill-zero.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-fill-zero.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-solid-stroke.png b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-solid-stroke.png new file mode 100644 index 00000000..e2506670 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-solid-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-transparent.png b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-transparent.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-promoted-transparent.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-review-multiply-empty-radial.png b/fixtures/web-first/chromium/svg-group-blend-sibling-review-multiply-empty-radial.png new file mode 100644 index 00000000..c7223128 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-review-multiply-empty-radial.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-review-screen-empty-radial.png b/fixtures/web-first/chromium/svg-group-blend-sibling-review-screen-empty-radial.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-review-screen-empty-radial.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-ancestor-clip.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-ancestor-clip.png new file mode 100644 index 00000000..6a34f601 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-ancestor-clip.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-boundary.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-boundary.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-boundary.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-css.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-css.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-css.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-display.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-display.png new file mode 100644 index 00000000..0f7673a1 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-display.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-edge.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-edge.png new file mode 100644 index 00000000..42bf1c6b Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-edge.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-empty-server.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-empty-server.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-empty-server.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-alpha.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-alpha.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-alpha.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-zero.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-zero.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-fill-zero.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-hidden.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-hidden.png new file mode 100644 index 00000000..0f7673a1 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-hidden.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-inherited.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-inherited.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-inherited.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-invalid-fallback.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-invalid-fallback.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-invalid-fallback.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-missing.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-missing.png new file mode 100644 index 00000000..0f7673a1 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-missing.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-multiple.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-multiple.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-multiple.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-near-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-near-opacity.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-near-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-neutral.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-neutral.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-neutral.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none-outside-domain.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none-outside-domain.png new file mode 100644 index 00000000..b9e5502d Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none-outside-domain.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none.png new file mode 100644 index 00000000..0f7673a1 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-none.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-normal-elided.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-normal-elided.png new file mode 100644 index 00000000..70ec02e2 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-normal-elided.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-outer-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-outer-opacity.png new file mode 100644 index 00000000..50bd4c7e Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-outer-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-own-opacity.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-own-opacity.png new file mode 100644 index 00000000..ef01f100 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-own-opacity.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-reversed.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-reversed.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-reversed.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-solid-stroke.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-solid-stroke.png new file mode 100644 index 00000000..3a1b912e Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-solid-stroke.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-dash.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-dash.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-dash.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-only.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-only.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-only.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-percent.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-percent.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-percent.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-px.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-px.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-px.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-thin.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-thin.png new file mode 100644 index 00000000..77de2794 Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-thin.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-zero.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-zero.png new file mode 100644 index 00000000..aa49c91f Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-stroke-zero.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-transparent.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-transparent.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-transparent.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-two-ramps.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-two-ramps.png new file mode 100644 index 00000000..911bbcce Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-two-ramps.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-use.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-use.png new file mode 100644 index 00000000..2eba47dc Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-use.png differ diff --git a/fixtures/web-first/chromium/svg-group-blend-sibling-screen-zero-outside-domain.png b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-zero-outside-domain.png new file mode 100644 index 00000000..b9e5502d Binary files /dev/null and b/fixtures/web-first/chromium/svg-group-blend-sibling-screen-zero-outside-domain.png differ diff --git a/fixtures/web-first/oracle-bake.json b/fixtures/web-first/oracle-bake.json index fc9acf8b..edb4690b 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": "069296201718c43d29efe356fbea893781b73250dca51de3b6d47468d74027b0", "suite": "primitives.json", - "suite_sha256": "55efa526c68d14a8595087f50ab0361a0653be68fdd038e4db7f9fffbdea275b", + "suite_sha256": "afc67c1f35b4289366d72acd150b813b91e79dc4de9b4aba39dd7fad8286b652", "capture": { "device_scale_factor": 1, "omit_background": true, @@ -6364,6 +6364,636 @@ "width": 64, "height": 64 }, + { + "id": "svg-group-blend-sibling-multiply-ancestor-clip", + "source": "svg-group-blend-sibling-multiply-ancestor-clip.svg", + "source_sha256": "9219f76fa1165129ec865f7ffb479ad792105740a0633c75896d7a9e04a77ad6", + "oracle": "chromium/svg-group-blend-sibling-multiply-ancestor-clip.png", + "oracle_sha256": "201acf2b22ffa814ca140d35feb8be53ab9c127834f71b48ea5a228c9f358768", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-boundary", + "source": "svg-group-blend-sibling-multiply-boundary.svg", + "source_sha256": "46e1c8d0702c91df3411786c11e57aa7b8c59afe6972c583e78fd19c2b72d5cd", + "oracle": "chromium/svg-group-blend-sibling-multiply-boundary.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-css", + "source": "svg-group-blend-sibling-multiply-css.svg", + "source_sha256": "76a8d3cc27f355c587590d36a83386c3723fc80ef750ff3aa081284db7399eaf", + "oracle": "chromium/svg-group-blend-sibling-multiply-css.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-display", + "source": "svg-group-blend-sibling-multiply-display.svg", + "source_sha256": "111dbac0228d18dc4a856a999e0b4359a69f45f738411e05376f64595ac559e6", + "oracle": "chromium/svg-group-blend-sibling-multiply-display.png", + "oracle_sha256": "12cba9825574d6272239c8f5ea913c84f67e07ef01782ba3c7e45f3bdd3f94e9", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-edge", + "source": "svg-group-blend-sibling-multiply-edge.svg", + "source_sha256": "d359016c3eb954d4880eb19ed11f4756fdc22faccd7879ff30f5dd172a43e2f1", + "oracle": "chromium/svg-group-blend-sibling-multiply-edge.png", + "oracle_sha256": "a1be1289e13a5a2635a6bdb0851bf477de412a2fe3107059fdfaa00b54ab1aa6", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-empty-server", + "source": "svg-group-blend-sibling-multiply-empty-server.svg", + "source_sha256": "4461f73a751460d008bed1d0ff16938959403bed613adaba470cd3b723e33fc3", + "oracle": "chromium/svg-group-blend-sibling-multiply-empty-server.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-fill-alpha", + "source": "svg-group-blend-sibling-multiply-fill-alpha.svg", + "source_sha256": "46a233d2bd870c9006810a7522108a1e297c338305708dbe97747a19106c487b", + "oracle": "chromium/svg-group-blend-sibling-multiply-fill-alpha.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-fill-zero", + "source": "svg-group-blend-sibling-multiply-fill-zero.svg", + "source_sha256": "ff8dfed502655fa93b17495ec8261a7c028ff1f42a6f0953160fa4610071d5e8", + "oracle": "chromium/svg-group-blend-sibling-multiply-fill-zero.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-hidden", + "source": "svg-group-blend-sibling-multiply-hidden.svg", + "source_sha256": "f7abe4bc7da67db834d87362b4df050ddd2d9850be973cbf1b410291236668f1", + "oracle": "chromium/svg-group-blend-sibling-multiply-hidden.png", + "oracle_sha256": "12cba9825574d6272239c8f5ea913c84f67e07ef01782ba3c7e45f3bdd3f94e9", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-inherited", + "source": "svg-group-blend-sibling-multiply-inherited.svg", + "source_sha256": "b64e3af38f93fa7213098cef2f82d75dc929741e1a0fc25b95d2023e35764be9", + "oracle": "chromium/svg-group-blend-sibling-multiply-inherited.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-invalid-fallback", + "source": "svg-group-blend-sibling-multiply-invalid-fallback.svg", + "source_sha256": "cf06c48dec16f25182db43185b964efb517a8a851cf5012c414eec88b5866df1", + "oracle": "chromium/svg-group-blend-sibling-multiply-invalid-fallback.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-missing", + "source": "svg-group-blend-sibling-multiply-missing.svg", + "source_sha256": "6d4d50b9576f6a3233c1fd41483e81bf65fe90804d94aac93c491da2674b8eeb", + "oracle": "chromium/svg-group-blend-sibling-multiply-missing.png", + "oracle_sha256": "12cba9825574d6272239c8f5ea913c84f67e07ef01782ba3c7e45f3bdd3f94e9", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-multiple", + "source": "svg-group-blend-sibling-multiply-multiple.svg", + "source_sha256": "eeb265adbe7d3adb18fef6909d46904facf545f8b2f1eb11327cc4253648d94f", + "oracle": "chromium/svg-group-blend-sibling-multiply-multiple.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-near-opacity", + "source": "svg-group-blend-sibling-multiply-near-opacity.svg", + "source_sha256": "b52a8ca67d3d66c8732e558c863fa830f29205085fd7aa876fb61a0e3de36d1f", + "oracle": "chromium/svg-group-blend-sibling-multiply-near-opacity.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-neutral", + "source": "svg-group-blend-sibling-multiply-neutral.svg", + "source_sha256": "ddfd7220c50489ea898be5c1fa0aa5ad2ac91e34b503b088d48a0a45b47f9dda", + "oracle": "chromium/svg-group-blend-sibling-multiply-neutral.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-none", + "source": "svg-group-blend-sibling-multiply-none.svg", + "source_sha256": "8b3259d47c120f4da2f6654ff2d277744d2768d21d08dc8f3c74085ff2e802d7", + "oracle": "chromium/svg-group-blend-sibling-multiply-none.png", + "oracle_sha256": "12cba9825574d6272239c8f5ea913c84f67e07ef01782ba3c7e45f3bdd3f94e9", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-none-outside-domain", + "source": "svg-group-blend-sibling-multiply-none-outside-domain.svg", + "source_sha256": "c4956c9c39b6228ee6ec12ce89bf852c9351a59486b2236859fef0985d81bd9c", + "oracle": "chromium/svg-group-blend-sibling-multiply-none-outside-domain.png", + "oracle_sha256": "485f9a51950e3b21e8922c23877a300554b75906cc0ded35365bd51e09bfba9b", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-normal-elided", + "source": "svg-group-blend-sibling-multiply-normal-elided.svg", + "source_sha256": "a19638e2ec6e0434237c139095f6bd95d89239a15b18315d0042aed7b36c81f4", + "oracle": "chromium/svg-group-blend-sibling-multiply-normal-elided.png", + "oracle_sha256": "8fd768559ce902ae57f2f30cfbd47b99c3cb1d0236a462e23c115877f0e47f4d", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-outer-opacity", + "source": "svg-group-blend-sibling-multiply-outer-opacity.svg", + "source_sha256": "1e6315e892346b977da33c1775b8c4ece6e070f8f88a96401174aee703ff59a7", + "oracle": "chromium/svg-group-blend-sibling-multiply-outer-opacity.png", + "oracle_sha256": "529a07047b9c5a558d07702191a167bbe0e02b8e098b643a6d6b6d13025b660c", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-own-opacity", + "source": "svg-group-blend-sibling-multiply-own-opacity.svg", + "source_sha256": "b84363a65a51fdc746950f4be25a9138ffb4713015ed29b132a3e501814120eb", + "oracle": "chromium/svg-group-blend-sibling-multiply-own-opacity.png", + "oracle_sha256": "2a62e4a39933ba27854b14deeef6befe5cf353d6ee1ae4552f0c11618c9222bd", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-reversed", + "source": "svg-group-blend-sibling-multiply-reversed.svg", + "source_sha256": "b96dcd88ef348e8e8a713b9a48e0293e1357a50a9e342ef7ffa6e7de8b2ad5a4", + "oracle": "chromium/svg-group-blend-sibling-multiply-reversed.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-solid-stroke", + "source": "svg-group-blend-sibling-multiply-solid-stroke.svg", + "source_sha256": "c979c255509a782ff4175284afc56b046467d9470e7651f153090959110d73eb", + "oracle": "chromium/svg-group-blend-sibling-multiply-solid-stroke.png", + "oracle_sha256": "db7f19e2936bfcfbd862f5db05a9234870d34467d51d500f8c349445681e397a", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-dash", + "source": "svg-group-blend-sibling-multiply-stroke-dash.svg", + "source_sha256": "cc165bae539d3da8de4dd7ecb85e517fc9a8b736b8b862a78daf2798586865a8", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-dash.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-only", + "source": "svg-group-blend-sibling-multiply-stroke-only.svg", + "source_sha256": "eb395507d9e275a31a613f2d13912f4152806fba86e13d1a4c8067eb3a35ba14", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-only.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-percent", + "source": "svg-group-blend-sibling-multiply-stroke-percent.svg", + "source_sha256": "61a144147447262922d6d7db9c8e293ec7b1f974f0391db9ca465fb12a1b5bf2", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-percent.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-px", + "source": "svg-group-blend-sibling-multiply-stroke-px.svg", + "source_sha256": "db6cff5ebb76656f8ffa0fbaae00f728ce5a73da6749fd776f26b31df6ea8082", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-px.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-thin", + "source": "svg-group-blend-sibling-multiply-stroke-thin.svg", + "source_sha256": "60e6bcb657d7508d28b6dfc869a74519df19b642acb55c9e5ce1f83b34a13d43", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-thin.png", + "oracle_sha256": "ebc06e5c58bdc5ff5e3633c3bfec327a1bba4491c757b1b339c489a65ee25000", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-zero", + "source": "svg-group-blend-sibling-multiply-stroke-zero.svg", + "source_sha256": "07a124efec5059b44eb927dd6f1ab7a4ab13935e5bea895ec2e64c96a944f7e2", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-zero.png", + "oracle_sha256": "1772c176e0751e00b4dc9a639a888bc2e9279a7e58429781e12d0c5c58e56f19", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-transparent", + "source": "svg-group-blend-sibling-multiply-transparent.svg", + "source_sha256": "2e9dba5641a94505a1ec89c18130d0325d9a9cdb39267d7014adaab886a9077a", + "oracle": "chromium/svg-group-blend-sibling-multiply-transparent.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-two-ramps", + "source": "svg-group-blend-sibling-multiply-two-ramps.svg", + "source_sha256": "ac5f658d867f81a5951315f2c8b2d646ce4d779b4b75f1b075ff3486166abcc8", + "oracle": "chromium/svg-group-blend-sibling-multiply-two-ramps.png", + "oracle_sha256": "1229a730a3d8cc8ffbf5565320ecced3ca8b25875c820703f71db458fd8bca66", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-use", + "source": "svg-group-blend-sibling-multiply-use.svg", + "source_sha256": "e63e92c712aedd373bbf72e5366e0fcf2c4123928b196ea40e044abe19e3fa9c", + "oracle": "chromium/svg-group-blend-sibling-multiply-use.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-zero-outside-domain", + "source": "svg-group-blend-sibling-multiply-zero-outside-domain.svg", + "source_sha256": "5b25512087b315c5deb0a55d306326f02b0839bf8f302fbd5071e99016a680dd", + "oracle": "chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png", + "oracle_sha256": "485f9a51950e3b21e8922c23877a300554b75906cc0ded35365bd51e09bfba9b", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-empty-server", + "source": "svg-group-blend-sibling-promoted-empty-server.svg", + "source_sha256": "bf09f859739383acfd6fad7bc223d6988d9efd6d6c80cc4ef69ef7791fcb5694", + "oracle": "chromium/svg-group-blend-sibling-promoted-empty-server.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-fill-zero", + "source": "svg-group-blend-sibling-promoted-fill-zero.svg", + "source_sha256": "011edf12b3c3b27649da145991e72579c808f0a933bf206f19ad16d2cd05e558", + "oracle": "chromium/svg-group-blend-sibling-promoted-fill-zero.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-solid-stroke", + "source": "svg-group-blend-sibling-promoted-solid-stroke.svg", + "source_sha256": "7ae7ebb8f059273d49380b6df247371af41d35c44199de1633f9645f7f55f3e2", + "oracle": "chromium/svg-group-blend-sibling-promoted-solid-stroke.png", + "oracle_sha256": "0ac32876a29562b936e2afc5a0bf318d558e062a07b71eee5ca702d3c5dc2989", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-transparent", + "source": "svg-group-blend-sibling-promoted-transparent.svg", + "source_sha256": "f6cd678f79adae3ddc0652ef47dd2746134aad56cacc88083906f005c5fe917b", + "oracle": "chromium/svg-group-blend-sibling-promoted-transparent.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-review-multiply-empty-radial", + "source": "svg-group-blend-sibling-review-multiply-empty-radial.svg", + "source_sha256": "af0c04c644dd814ae09c2d1aa3cec85b9c98364e3a3f9c55f519299c827ba245", + "oracle": "chromium/svg-group-blend-sibling-review-multiply-empty-radial.png", + "oracle_sha256": "7a9c18d1f7bd1c250133deb1b098d01bd3141828632556c37f1ca9f47abd0d43", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-review-screen-empty-radial", + "source": "svg-group-blend-sibling-review-screen-empty-radial.svg", + "source_sha256": "335ada7a488f6b2e2a59e55ae4bf18db70798a7bf59c95d426895f0a960efb3c", + "oracle": "chromium/svg-group-blend-sibling-review-screen-empty-radial.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-ancestor-clip", + "source": "svg-group-blend-sibling-screen-ancestor-clip.svg", + "source_sha256": "f5f0c34507623ded8b3b0904d78327a3e73b0ded7eb71537966815c144fd41ae", + "oracle": "chromium/svg-group-blend-sibling-screen-ancestor-clip.png", + "oracle_sha256": "201acf2b22ffa814ca140d35feb8be53ab9c127834f71b48ea5a228c9f358768", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-boundary", + "source": "svg-group-blend-sibling-screen-boundary.svg", + "source_sha256": "9ead7e50bb14d8ea036558cef1d474cc498e30f1c3f899ea88841719a53d6b33", + "oracle": "chromium/svg-group-blend-sibling-screen-boundary.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-css", + "source": "svg-group-blend-sibling-screen-css.svg", + "source_sha256": "7a34db2872de1fde48ebeae49770b4b808cbd4d947ef18daac7faf18c9f07bb2", + "oracle": "chromium/svg-group-blend-sibling-screen-css.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-display", + "source": "svg-group-blend-sibling-screen-display.svg", + "source_sha256": "a085c8a439353947c39d4821b1eae9441a1ceb7b5b3e7ed05a7f102ce95b25c7", + "oracle": "chromium/svg-group-blend-sibling-screen-display.png", + "oracle_sha256": "a27a3a28784465b200d855437476628de1dda8a048b1f97be205e271a8d2d0d2", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-edge", + "source": "svg-group-blend-sibling-screen-edge.svg", + "source_sha256": "067f5805df0e081515fc1f538d1f841842f26b7ed18cc403802990062920b958", + "oracle": "chromium/svg-group-blend-sibling-screen-edge.png", + "oracle_sha256": "18cf809b8f81b77d65383ba3418236b9d5137177fe38f14d0191c9221d80576a", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-empty-server", + "source": "svg-group-blend-sibling-screen-empty-server.svg", + "source_sha256": "01cfac5e7b6bf276e1223db7f1c0ae894a596035b89d9fbe2fe019db4afb86f4", + "oracle": "chromium/svg-group-blend-sibling-screen-empty-server.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-fill-alpha", + "source": "svg-group-blend-sibling-screen-fill-alpha.svg", + "source_sha256": "934011488563d8198977bc963ec23472378912b1196878e6c55553214e446b57", + "oracle": "chromium/svg-group-blend-sibling-screen-fill-alpha.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-fill-zero", + "source": "svg-group-blend-sibling-screen-fill-zero.svg", + "source_sha256": "fd03b312106ffd32046a0e5da90763fff7c9e832aeea7920b6e3b31aa2b5a837", + "oracle": "chromium/svg-group-blend-sibling-screen-fill-zero.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-hidden", + "source": "svg-group-blend-sibling-screen-hidden.svg", + "source_sha256": "3aa348074416ac66d467c78f4e2395c79bb8f5d83b119ededb11c6d8f0f211ab", + "oracle": "chromium/svg-group-blend-sibling-screen-hidden.png", + "oracle_sha256": "a27a3a28784465b200d855437476628de1dda8a048b1f97be205e271a8d2d0d2", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-inherited", + "source": "svg-group-blend-sibling-screen-inherited.svg", + "source_sha256": "18a6f048f542a337fd586305485dffd7fb637c91cc0577fe586efa31075c390d", + "oracle": "chromium/svg-group-blend-sibling-screen-inherited.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-invalid-fallback", + "source": "svg-group-blend-sibling-screen-invalid-fallback.svg", + "source_sha256": "a9d2b4a07c557cfc464f100cfed769da914bb1ca153f8353f7f18ccfc3607e18", + "oracle": "chromium/svg-group-blend-sibling-screen-invalid-fallback.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-missing", + "source": "svg-group-blend-sibling-screen-missing.svg", + "source_sha256": "abe487dd89b643558658a5d076cf6625b21b660937a51c9fcc1949f2d0530828", + "oracle": "chromium/svg-group-blend-sibling-screen-missing.png", + "oracle_sha256": "a27a3a28784465b200d855437476628de1dda8a048b1f97be205e271a8d2d0d2", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-multiple", + "source": "svg-group-blend-sibling-screen-multiple.svg", + "source_sha256": "a0dbdf1f205c53c918259dea12c36a6c82061493da43d4380b422f12776b4629", + "oracle": "chromium/svg-group-blend-sibling-screen-multiple.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-near-opacity", + "source": "svg-group-blend-sibling-screen-near-opacity.svg", + "source_sha256": "2fe4fbc8d2fbf0ea42be14ed64ec4430becb3501a12b9c6a26b359c3501cf686", + "oracle": "chromium/svg-group-blend-sibling-screen-near-opacity.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-neutral", + "source": "svg-group-blend-sibling-screen-neutral.svg", + "source_sha256": "bd0c004d50490db2102621b7439b95a4fcc6b4ad18165c7ae47ff0b440e4304a", + "oracle": "chromium/svg-group-blend-sibling-screen-neutral.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-none", + "source": "svg-group-blend-sibling-screen-none.svg", + "source_sha256": "1169396fedb12089dd5de4f0a6e2d3caffbebbb3af9b30ac614a6fd0dadfc9c1", + "oracle": "chromium/svg-group-blend-sibling-screen-none.png", + "oracle_sha256": "a27a3a28784465b200d855437476628de1dda8a048b1f97be205e271a8d2d0d2", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-none-outside-domain", + "source": "svg-group-blend-sibling-screen-none-outside-domain.svg", + "source_sha256": "14f72d91a6ee1a45d860d8196e7ce6bfe51aa65f80d4178cdd1d1122eec52904", + "oracle": "chromium/svg-group-blend-sibling-screen-none-outside-domain.png", + "oracle_sha256": "facb046f0262098671f33936c27972390801dd8a96cd9eb5fe9f1c4fef40b9fe", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-normal-elided", + "source": "svg-group-blend-sibling-screen-normal-elided.svg", + "source_sha256": "a19638e2ec6e0434237c139095f6bd95d89239a15b18315d0042aed7b36c81f4", + "oracle": "chromium/svg-group-blend-sibling-screen-normal-elided.png", + "oracle_sha256": "8fd768559ce902ae57f2f30cfbd47b99c3cb1d0236a462e23c115877f0e47f4d", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-outer-opacity", + "source": "svg-group-blend-sibling-screen-outer-opacity.svg", + "source_sha256": "6b09cede8596157b9a3d63ba80572360b713a0e120c45e3b3f2f1584a759b383", + "oracle": "chromium/svg-group-blend-sibling-screen-outer-opacity.png", + "oracle_sha256": "529a07047b9c5a558d07702191a167bbe0e02b8e098b643a6d6b6d13025b660c", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-own-opacity", + "source": "svg-group-blend-sibling-screen-own-opacity.svg", + "source_sha256": "36b7300e23d40f2c0116bab3e3c80fdb89fe38b0bbe61c74368087dae2662303", + "oracle": "chromium/svg-group-blend-sibling-screen-own-opacity.png", + "oracle_sha256": "f80d28799f67802123c69c41fcb2b3dae42666848f2f08f602d04ba5a8be690b", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-reversed", + "source": "svg-group-blend-sibling-screen-reversed.svg", + "source_sha256": "bbceecfa1cc5b7d73a8354581cc5fe0b16d3cc5e6170aafea4a7a82f310662d1", + "oracle": "chromium/svg-group-blend-sibling-screen-reversed.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-solid-stroke", + "source": "svg-group-blend-sibling-screen-solid-stroke.svg", + "source_sha256": "0771662e760b09114c7ee4abc5e36426a3b36dffcd673335a23315c6adf8a48f", + "oracle": "chromium/svg-group-blend-sibling-screen-solid-stroke.png", + "oracle_sha256": "b51ad699b0474e358561f73193045ca5c4df144ee1c9423918191647b2ee3f8c", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-dash", + "source": "svg-group-blend-sibling-screen-stroke-dash.svg", + "source_sha256": "2419489058369b0972da4ee0505ca65d75bf1904dec84e1ee036554998078f8d", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-dash.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-only", + "source": "svg-group-blend-sibling-screen-stroke-only.svg", + "source_sha256": "fef5b04ac05378cef6572204b965ae7f820189c2b609f91d6082bf3cad90ad9a", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-only.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-percent", + "source": "svg-group-blend-sibling-screen-stroke-percent.svg", + "source_sha256": "36e9d17c0a1df57208ba9278c60744064b4804110bd45e2caadfa4df8d2f88d4", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-percent.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-px", + "source": "svg-group-blend-sibling-screen-stroke-px.svg", + "source_sha256": "d50f50fd12e1496c6f2bd9481c7268a1f3cc57b233ecb1e966a0782d5270bd02", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-px.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-thin", + "source": "svg-group-blend-sibling-screen-stroke-thin.svg", + "source_sha256": "533dd45da6e88507d8bccab00971eb887816d63299ab160dc0573a77b5861114", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-thin.png", + "oracle_sha256": "be3ac21a10c5593907ede9774f9dcc3c02b647484ddae660e564d7dd28eb9aee", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-zero", + "source": "svg-group-blend-sibling-screen-stroke-zero.svg", + "source_sha256": "5138d172d0fd9551f736667c80eb782838d7ddfedfe4c92c6a3811bd4b293cf1", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-zero.png", + "oracle_sha256": "5bb3301ffc45f798cc1ee095d13b2d37f75522df5beb425c655b94f0652d0405", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-transparent", + "source": "svg-group-blend-sibling-screen-transparent.svg", + "source_sha256": "c8f0c1c4b27080e3f51f035d4320adfde637a7e325d24ffccc34df24a9374b08", + "oracle": "chromium/svg-group-blend-sibling-screen-transparent.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-two-ramps", + "source": "svg-group-blend-sibling-screen-two-ramps.svg", + "source_sha256": "e64c75a58a89694240faa3eca6b1b76f212417562f120d11dd0b2169e3cec3c4", + "oracle": "chromium/svg-group-blend-sibling-screen-two-ramps.png", + "oracle_sha256": "d946fdd8692853b3c92d9f09204a9eecae014108072a8390d99caf0e168eada0", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-use", + "source": "svg-group-blend-sibling-screen-use.svg", + "source_sha256": "d78e8d511f13b02e618b60ef3c34a177709c2af68d2afc15375bfbdf6bc9b4fa", + "oracle": "chromium/svg-group-blend-sibling-screen-use.png", + "oracle_sha256": "19fed20cd96a55bff9e876cde3c0f30636cfd668d15615de3f3861c1008a4a50", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-zero-outside-domain", + "source": "svg-group-blend-sibling-screen-zero-outside-domain.svg", + "source_sha256": "f949a4e550177bb6e2cff8f0d5b9b312a3dd70d7deb7e08daaa585e590eda63d", + "oracle": "chromium/svg-group-blend-sibling-screen-zero-outside-domain.png", + "oracle_sha256": "facb046f0262098671f33936c27972390801dd8a96cd9eb5fe9f1c4fef40b9fe", + "width": 64, + "height": 64 + }, { "id": "svg-group-blend-source-multiply-bevel", "source": "svg-group-blend-source-multiply-bevel.svg", diff --git a/fixtures/web-first/primitives.json b/fixtures/web-first/primitives.json index ca0c4a2b..1e416a51 100644 --- a/fixtures/web-first/primitives.json +++ b/fixtures/web-first/primitives.json @@ -5729,6 +5729,566 @@ "width": 64, "height": 64 }, + { + "id": "svg-group-blend-sibling-multiply-ancestor-clip", + "source": "svg-group-blend-sibling-multiply-ancestor-clip.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-ancestor-clip.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-boundary", + "source": "svg-group-blend-sibling-multiply-boundary.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-boundary.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-css", + "source": "svg-group-blend-sibling-multiply-css.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-css.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-display", + "source": "svg-group-blend-sibling-multiply-display.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-display.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-edge", + "source": "svg-group-blend-sibling-multiply-edge.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-edge.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-empty-server", + "source": "svg-group-blend-sibling-multiply-empty-server.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-empty-server.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-fill-alpha", + "source": "svg-group-blend-sibling-multiply-fill-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-fill-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-fill-zero", + "source": "svg-group-blend-sibling-multiply-fill-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-fill-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-hidden", + "source": "svg-group-blend-sibling-multiply-hidden.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-hidden.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-inherited", + "source": "svg-group-blend-sibling-multiply-inherited.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-inherited.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-invalid-fallback", + "source": "svg-group-blend-sibling-multiply-invalid-fallback.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-invalid-fallback.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-missing", + "source": "svg-group-blend-sibling-multiply-missing.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-missing.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-multiple", + "source": "svg-group-blend-sibling-multiply-multiple.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-multiple.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-near-opacity", + "source": "svg-group-blend-sibling-multiply-near-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-near-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-neutral", + "source": "svg-group-blend-sibling-multiply-neutral.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-neutral.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-none", + "source": "svg-group-blend-sibling-multiply-none.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-none.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-none-outside-domain", + "source": "svg-group-blend-sibling-multiply-none-outside-domain.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-none-outside-domain.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-normal-elided", + "source": "svg-group-blend-sibling-multiply-normal-elided.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-normal-elided.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-outer-opacity", + "source": "svg-group-blend-sibling-multiply-outer-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-outer-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-own-opacity", + "source": "svg-group-blend-sibling-multiply-own-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-own-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-reversed", + "source": "svg-group-blend-sibling-multiply-reversed.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-reversed.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-solid-stroke", + "source": "svg-group-blend-sibling-multiply-solid-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-solid-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-dash", + "source": "svg-group-blend-sibling-multiply-stroke-dash.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-dash.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-only", + "source": "svg-group-blend-sibling-multiply-stroke-only.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-only.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-percent", + "source": "svg-group-blend-sibling-multiply-stroke-percent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-percent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-px", + "source": "svg-group-blend-sibling-multiply-stroke-px.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-px.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-thin", + "source": "svg-group-blend-sibling-multiply-stroke-thin.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-thin.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-stroke-zero", + "source": "svg-group-blend-sibling-multiply-stroke-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-stroke-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-transparent", + "source": "svg-group-blend-sibling-multiply-transparent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-transparent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-two-ramps", + "source": "svg-group-blend-sibling-multiply-two-ramps.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-two-ramps.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-use", + "source": "svg-group-blend-sibling-multiply-use.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-use.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-multiply-zero-outside-domain", + "source": "svg-group-blend-sibling-multiply-zero-outside-domain.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-multiply-zero-outside-domain.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-empty-server", + "source": "svg-group-blend-sibling-promoted-empty-server.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-promoted-empty-server.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-fill-zero", + "source": "svg-group-blend-sibling-promoted-fill-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-promoted-fill-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-solid-stroke", + "source": "svg-group-blend-sibling-promoted-solid-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-promoted-solid-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-promoted-transparent", + "source": "svg-group-blend-sibling-promoted-transparent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-promoted-transparent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-review-multiply-empty-radial", + "source": "svg-group-blend-sibling-review-multiply-empty-radial.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-review-multiply-empty-radial.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-review-screen-empty-radial", + "source": "svg-group-blend-sibling-review-screen-empty-radial.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-review-screen-empty-radial.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-ancestor-clip", + "source": "svg-group-blend-sibling-screen-ancestor-clip.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-ancestor-clip.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-boundary", + "source": "svg-group-blend-sibling-screen-boundary.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-boundary.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-css", + "source": "svg-group-blend-sibling-screen-css.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-css.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-display", + "source": "svg-group-blend-sibling-screen-display.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-display.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-edge", + "source": "svg-group-blend-sibling-screen-edge.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-edge.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-empty-server", + "source": "svg-group-blend-sibling-screen-empty-server.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-empty-server.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-fill-alpha", + "source": "svg-group-blend-sibling-screen-fill-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-fill-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-fill-zero", + "source": "svg-group-blend-sibling-screen-fill-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-fill-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-hidden", + "source": "svg-group-blend-sibling-screen-hidden.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-hidden.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-inherited", + "source": "svg-group-blend-sibling-screen-inherited.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-inherited.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-invalid-fallback", + "source": "svg-group-blend-sibling-screen-invalid-fallback.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-invalid-fallback.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-missing", + "source": "svg-group-blend-sibling-screen-missing.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-missing.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-multiple", + "source": "svg-group-blend-sibling-screen-multiple.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-multiple.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-near-opacity", + "source": "svg-group-blend-sibling-screen-near-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-near-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-neutral", + "source": "svg-group-blend-sibling-screen-neutral.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-neutral.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-none", + "source": "svg-group-blend-sibling-screen-none.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-none.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-none-outside-domain", + "source": "svg-group-blend-sibling-screen-none-outside-domain.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-none-outside-domain.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-normal-elided", + "source": "svg-group-blend-sibling-screen-normal-elided.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-normal-elided.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-outer-opacity", + "source": "svg-group-blend-sibling-screen-outer-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-outer-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-own-opacity", + "source": "svg-group-blend-sibling-screen-own-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-own-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-reversed", + "source": "svg-group-blend-sibling-screen-reversed.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-reversed.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-solid-stroke", + "source": "svg-group-blend-sibling-screen-solid-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-solid-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-dash", + "source": "svg-group-blend-sibling-screen-stroke-dash.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-dash.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-only", + "source": "svg-group-blend-sibling-screen-stroke-only.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-only.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-percent", + "source": "svg-group-blend-sibling-screen-stroke-percent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-percent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-px", + "source": "svg-group-blend-sibling-screen-stroke-px.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-px.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-thin", + "source": "svg-group-blend-sibling-screen-stroke-thin.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-thin.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-stroke-zero", + "source": "svg-group-blend-sibling-screen-stroke-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-stroke-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-transparent", + "source": "svg-group-blend-sibling-screen-transparent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-transparent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-two-ramps", + "source": "svg-group-blend-sibling-screen-two-ramps.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-two-ramps.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-use", + "source": "svg-group-blend-sibling-screen-use.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-use.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-group-blend-sibling-screen-zero-outside-domain", + "source": "svg-group-blend-sibling-screen-zero-outside-domain.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-group-blend-sibling-screen-zero-outside-domain.png", + "width": 64, + "height": 64 + }, { "id": "svg-group-blend-source-multiply-bevel", "source": "svg-group-blend-source-multiply-bevel.svg", diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-ancestor-clip.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-ancestor-clip.svg new file mode 100644 index 00000000..a2b96811 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-ancestor-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-boundary.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-boundary.svg new file mode 100644 index 00000000..144f49ab --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-boundary.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-css.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-css.svg new file mode 100644 index 00000000..6a178424 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-css.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-display.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-display.svg new file mode 100644 index 00000000..5b60058b --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-display.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-edge.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-edge.svg new file mode 100644 index 00000000..a7688fa1 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-edge.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-empty-server.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-empty-server.svg new file mode 100644 index 00000000..0546f10c --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-empty-server.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-fill-alpha.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-fill-alpha.svg new file mode 100644 index 00000000..46168533 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-fill-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-fill-zero.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-fill-zero.svg new file mode 100644 index 00000000..ed322485 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-fill-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-hidden.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-hidden.svg new file mode 100644 index 00000000..7a6dd7b6 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-hidden.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-inherited.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-inherited.svg new file mode 100644 index 00000000..a6928ff4 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-inherited.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-invalid-fallback.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-invalid-fallback.svg new file mode 100644 index 00000000..a0f24db8 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-invalid-fallback.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-missing.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-missing.svg new file mode 100644 index 00000000..d6c5fc6a --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-missing.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-multiple.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-multiple.svg new file mode 100644 index 00000000..36fdd9d8 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-multiple.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-near-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-near-opacity.svg new file mode 100644 index 00000000..751ee9bd --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-near-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-neutral.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-neutral.svg new file mode 100644 index 00000000..39b068a7 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-neutral.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-none-outside-domain.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-none-outside-domain.svg new file mode 100644 index 00000000..438b4360 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-none-outside-domain.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-none.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-none.svg new file mode 100644 index 00000000..57cd5d7e --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-none.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-normal-elided.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-normal-elided.svg new file mode 100644 index 00000000..70cebb8f --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-normal-elided.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-outer-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-outer-opacity.svg new file mode 100644 index 00000000..798a0934 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-outer-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-own-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-own-opacity.svg new file mode 100644 index 00000000..b80e1a32 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-own-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-reversed.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-reversed.svg new file mode 100644 index 00000000..5278c0d4 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-reversed.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-solid-stroke.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-solid-stroke.svg new file mode 100644 index 00000000..99ca89df --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-solid-stroke.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-dash.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-dash.svg new file mode 100644 index 00000000..2f368b20 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-dash.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-only.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-only.svg new file mode 100644 index 00000000..a6c87e9c --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-only.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-percent.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-percent.svg new file mode 100644 index 00000000..2bd01551 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-percent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-px.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-px.svg new file mode 100644 index 00000000..87aac772 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-px.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-thin.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-thin.svg new file mode 100644 index 00000000..8e1e6dc5 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-thin.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-zero.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-zero.svg new file mode 100644 index 00000000..e0a316a8 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-stroke-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-transparent.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-transparent.svg new file mode 100644 index 00000000..6a94080d --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-transparent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-two-ramps.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-two-ramps.svg new file mode 100644 index 00000000..dabefbc0 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-two-ramps.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-use.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-use.svg new file mode 100644 index 00000000..18175f9c --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-multiply-zero-outside-domain.svg b/fixtures/web-first/svg-group-blend-sibling-multiply-zero-outside-domain.svg new file mode 100644 index 00000000..9b08e0dc --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-multiply-zero-outside-domain.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-promoted-empty-server.svg b/fixtures/web-first/svg-group-blend-sibling-promoted-empty-server.svg new file mode 100644 index 00000000..36d2d1f7 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-promoted-empty-server.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-promoted-fill-zero.svg b/fixtures/web-first/svg-group-blend-sibling-promoted-fill-zero.svg new file mode 100644 index 00000000..e5fc026c --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-promoted-fill-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-promoted-solid-stroke.svg b/fixtures/web-first/svg-group-blend-sibling-promoted-solid-stroke.svg new file mode 100644 index 00000000..5cb541a9 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-promoted-solid-stroke.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-promoted-transparent.svg b/fixtures/web-first/svg-group-blend-sibling-promoted-transparent.svg new file mode 100644 index 00000000..799e7f38 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-promoted-transparent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-review-multiply-empty-radial.svg b/fixtures/web-first/svg-group-blend-sibling-review-multiply-empty-radial.svg new file mode 100644 index 00000000..5966c099 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-review-multiply-empty-radial.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-review-screen-empty-radial.svg b/fixtures/web-first/svg-group-blend-sibling-review-screen-empty-radial.svg new file mode 100644 index 00000000..b7f51f28 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-review-screen-empty-radial.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-ancestor-clip.svg b/fixtures/web-first/svg-group-blend-sibling-screen-ancestor-clip.svg new file mode 100644 index 00000000..9d7c8600 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-ancestor-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-boundary.svg b/fixtures/web-first/svg-group-blend-sibling-screen-boundary.svg new file mode 100644 index 00000000..788e7d6b --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-boundary.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-css.svg b/fixtures/web-first/svg-group-blend-sibling-screen-css.svg new file mode 100644 index 00000000..cd4b7e17 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-css.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-display.svg b/fixtures/web-first/svg-group-blend-sibling-screen-display.svg new file mode 100644 index 00000000..125e2276 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-display.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-edge.svg b/fixtures/web-first/svg-group-blend-sibling-screen-edge.svg new file mode 100644 index 00000000..681dd4e8 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-edge.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-empty-server.svg b/fixtures/web-first/svg-group-blend-sibling-screen-empty-server.svg new file mode 100644 index 00000000..1778e4dc --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-empty-server.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-fill-alpha.svg b/fixtures/web-first/svg-group-blend-sibling-screen-fill-alpha.svg new file mode 100644 index 00000000..c7acd267 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-fill-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-fill-zero.svg b/fixtures/web-first/svg-group-blend-sibling-screen-fill-zero.svg new file mode 100644 index 00000000..1e2aea30 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-fill-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-hidden.svg b/fixtures/web-first/svg-group-blend-sibling-screen-hidden.svg new file mode 100644 index 00000000..bf674388 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-hidden.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-inherited.svg b/fixtures/web-first/svg-group-blend-sibling-screen-inherited.svg new file mode 100644 index 00000000..54acf9dd --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-inherited.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-invalid-fallback.svg b/fixtures/web-first/svg-group-blend-sibling-screen-invalid-fallback.svg new file mode 100644 index 00000000..428f851b --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-invalid-fallback.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-missing.svg b/fixtures/web-first/svg-group-blend-sibling-screen-missing.svg new file mode 100644 index 00000000..eb15cee7 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-missing.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-multiple.svg b/fixtures/web-first/svg-group-blend-sibling-screen-multiple.svg new file mode 100644 index 00000000..321980fc --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-multiple.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-near-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-screen-near-opacity.svg new file mode 100644 index 00000000..48005800 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-near-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-neutral.svg b/fixtures/web-first/svg-group-blend-sibling-screen-neutral.svg new file mode 100644 index 00000000..299df510 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-neutral.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-none-outside-domain.svg b/fixtures/web-first/svg-group-blend-sibling-screen-none-outside-domain.svg new file mode 100644 index 00000000..7f2bec36 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-none-outside-domain.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-none.svg b/fixtures/web-first/svg-group-blend-sibling-screen-none.svg new file mode 100644 index 00000000..2d377ed6 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-none.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-normal-elided.svg b/fixtures/web-first/svg-group-blend-sibling-screen-normal-elided.svg new file mode 100644 index 00000000..70cebb8f --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-normal-elided.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-outer-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-screen-outer-opacity.svg new file mode 100644 index 00000000..4daec184 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-outer-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-own-opacity.svg b/fixtures/web-first/svg-group-blend-sibling-screen-own-opacity.svg new file mode 100644 index 00000000..b528034b --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-own-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-reversed.svg b/fixtures/web-first/svg-group-blend-sibling-screen-reversed.svg new file mode 100644 index 00000000..d3844298 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-reversed.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-solid-stroke.svg b/fixtures/web-first/svg-group-blend-sibling-screen-solid-stroke.svg new file mode 100644 index 00000000..4b33b2e4 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-solid-stroke.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-dash.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-dash.svg new file mode 100644 index 00000000..d2de5c94 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-dash.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-only.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-only.svg new file mode 100644 index 00000000..92676a16 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-only.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-percent.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-percent.svg new file mode 100644 index 00000000..e2e74b0a --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-percent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-px.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-px.svg new file mode 100644 index 00000000..ea9d7ac3 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-px.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-thin.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-thin.svg new file mode 100644 index 00000000..a282569c --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-thin.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-stroke-zero.svg b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-zero.svg new file mode 100644 index 00000000..24d5f2bc --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-stroke-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-transparent.svg b/fixtures/web-first/svg-group-blend-sibling-screen-transparent.svg new file mode 100644 index 00000000..1a4c574a --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-transparent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-two-ramps.svg b/fixtures/web-first/svg-group-blend-sibling-screen-two-ramps.svg new file mode 100644 index 00000000..f5ae17a0 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-two-ramps.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-use.svg b/fixtures/web-first/svg-group-blend-sibling-screen-use.svg new file mode 100644 index 00000000..21163752 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-group-blend-sibling-screen-zero-outside-domain.svg b/fixtures/web-first/svg-group-blend-sibling-screen-zero-outside-domain.svg new file mode 100644 index 00000000..1903af19 --- /dev/null +++ b/fixtures/web-first/svg-group-blend-sibling-screen-zero-outside-domain.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/README.md b/fixtures/web-first/unsupported/README.md index 2a8552e2..d09f6d5d 100644 --- a/fixtures/web-first/unsupported/README.md +++ b/fixtures/web-first/unsupported/README.md @@ -21,14 +21,32 @@ The scannable, generated view of this register (beside the baked cells) is [../STATUS.md](../STATUS.md), freshness-gated by `crates/websem/tests/capability_status.rs`. +The inventory contains 351 named refusal sources, including twenty-two +sibling-review witnesses. The +[sibling-extent follow-on](../../../docs/wg/consolidation/svg-engine-of-record.md#b2b-sibling-extent-follow-on) +preserves four former refusal witnesses as positive cells: `transparent`, +`fill-zero`, `empty-gradient` and `stroke-sibling` under +`svg-group-blend-linear-extent-` become `transparent`, `fill-zero`, +`empty-server` and `solid-stroke` under `svg-group-blend-sibling-promoted-`. +All four old/new Chromium pairs have equal pixels; only their obsolete refusal +memberships are removed. + | File | Required result | | --- | --- | +| `svg-group-blend-sibling-domain-{mapped,circle,non-scaling,opacity}.svg` | Four boundaries around the unit-opacity, identity-mapped rectangle profile: a mapped sibling, nonrectangular paintless geometry, an invisible non-scaling stroke and zero element opacity must retain the named `linear-gradient source-extent` refusal. | +| `svg-group-blend-sibling-review-{leaf,group}-{offset,blur,mask,clip}.svg` | Eight review witnesses for effects on a paintless sibling or its enclosing container inside the blend source. Name the source-extent boundary and skip the affected group; an effect's completed contribution cannot be inferred from the surviving paintless rectangle. These required refusals make no unmeasured per-witness pixel claim. | +| `svg-group-blend-sibling-review-{nested-clipped,nested-visible}.svg` | Two nested-viewport review witnesses, with default clipping and explicit visible overflow. Retain the named source-extent boundary; neither nesting route inherits the neutral-container exemption. | +| `svg-group-blend-sibling-review-singular.svg` | A selected gradient with stops and a singular map is disabled source material, not an ordinary transparent sibling. Retain the named source-extent refusal. | +| `svg-group-blend-sibling-review-stopless-singular.svg` | A singular stopless gradient matches the absent-sibling Chromium control and differs from the plain transparent-fill sibling by 236 pixels for Multiply and 342 for Screen, maximum channel delta one (measured, not celled as a positive case). Retain the named source-extent refusal; ordinary invertible stopless-gradient admission does not cover it. | +| `svg-group-blend-sibling-review-painted-zero-domain.svg` | A zero-width rectangle carrying paint lies outside an already declared source. Keep the named source-extent refusal; the paintless-geometry enclosure exemption requires an empty paint stack and no stroke. | +| `svg-group-blend-sibling-review-zero-pattern.svg` | A pattern-selected sibling at zero fill opacity rendered exactly in both CLI admissions before quarantine (measured, not celled as a positive case). Preserve its pattern provenance through zero-alpha normalization and retain the named source-extent refusal for the unproved resource profile. | +| `svg-group-blend-sibling-review-hide-{empty,zero-region}-{leaf,group,use,viewport}.svg` | Eight witnesses for an empty filter or zero filter region on a leaf, group, local instance or nested viewport. The formerly admitted renders silently differed from Chromium by 236 pixels for Multiply and 342 for Screen, maximum channel delta one, across all four callers (measured, not celled as positive cases). Retain the filter-hiding boundary even when no source nodes survive, and name the source-extent refusal. | | `svg-group-blend-linear-extent-stroke-context-{missing,none}.svg` | Preserve the original computed context-stroke/context-fill selection before following a missing provider or a provider selecting `none`. Chromium still retains the selected stroke's bounding-box contribution; both routes must reach the named source-extent guard, not become computed `stroke:none`. | -| `svg-group-blend-linear-extent-stroke-{empty-gradient,missing-reference,none-fallback,sibling}.svg` | A selected stroke can enlarge Chromium's drawable bounds even when a live fill remains and the stroke paint disappears. Unresolved references can do so without an opacity pass. Preserve the producer-private omitted-extent fact and refuse the containing linear source by name; do not treat it as `stroke:none`. The sibling case guards propagation across distinct leaves. The former transparent/zero-alpha solid-stroke refusals are now exact source-domain cells. | +| `svg-group-blend-linear-extent-stroke-{empty-gradient,missing-reference,none-fallback}.svg` | A selected stroke can enlarge Chromium's drawable bounds even when a live fill remains and the stroke paint disappears. Unresolved references can do so without an opacity pass. Preserve the producer-private omitted-extent fact and refuse the containing linear source by name; do not treat it as `stroke:none`. The former transparent/zero-alpha solid-stroke refusals are now exact source-domain cells; the solid-filled sibling witness is preserved by its promoted cell. | | `svg-group-blend-source-domain-{non-scaling,range,pattern-sibling}.svg` | The first complete source-domain profile excludes non-scaling invisible strokes, unrepresentable local enclosures and a repeating-program sibling whose source contribution is not represented by the rectangular domain. Each retains `linear-gradient source-extent` in strict and best-effort; these are conservative refusal witnesses, not claims of measured wrong pixels. | | `svg-group-blend-source-domain-enclosure.svg` | f32 decoration of `x=8.3`, `width=.7`, `stroke-width=.0000001` rounds the far edge to 9, which does not enclose the exact sum of the resolved painted values. Name `linear-gradient source-extent` and roll back the SVG group before the glyphless consumer's stricter complete-domain preflight. The prototype failed late in both CLI admissions without producing pixels (measured, not celled as a positive case). | | `svg-group-blend-source-domain-root-{transparent,bare}.svg` | The separately materialized outer root cannot borrow a child blend's complete-domain exemption. Transparent-stroke and bare root ramps under authored Multiply/Screen each silently differed from Chromium at 85 pixels, maximum delta 6, in both admissions; a full-canvas backdrop hid the difference. Both admissions now refuse the unproved root linear source by `linear-gradient source-extent` (measured, not celled as a positive case). | -| `svg-group-blend-linear-extent-{transform,rotation,viewport,clip,child-opacity,zero-opacity,transparent,fill-zero,empty-gradient,pattern-stroke,nested-blend,isolation}.svg` | Name `linear-gradient source-extent` and skip the complete affected group. The current resolved stream cannot prove the source-space extent for these combinations. The guard is conservative, not a claim that every member has a measured mismatch; the [B2a evidence](../../../docs/wg/consolidation/svg-engine-of-record.md#b2a-linear-gradient-blend-source-extents) separates those facts. | +| `svg-group-blend-linear-extent-{transform,rotation,viewport,clip,child-opacity,zero-opacity,pattern-stroke,nested-blend,isolation}.svg` | Name `linear-gradient source-extent` and skip the complete affected group. The current resolved stream cannot prove the source-space extent for these combinations. The guard is conservative, not a claim that every member has a measured mismatch; the [B2a evidence](../../../docs/wg/consolidation/svg-engine-of-record.md#b2a-linear-gradient-blend-source-extents) separates those facts. | | `svg-group-blend-linear-extent-root{,-opacity}.svg` | The required root boundary contains a bare ramp and a completed child blend, with unit or partial root opacity. Refuse in both admissions under the conservative source-extent profile, even though these full-background controls were exact before the patrol (measured, not celled). | | `svg-group-blend-mode-{overlay,darken,lighten,color-dodge,color-burn,hard-light,soft-light,difference,exclusion,hue,saturation,color,luminosity,plus-lighter}.svg` | Fourteen live computed values outside B1's normal/multiply/screen profile must name `mix-blend-mode`; best-effort skips the attributed group, never substitutes normal. | | `svg-group-blend-{filter,mask}.svg` | Name the unadmitted image-effect composition profile and skip the complete affected group transaction. | diff --git a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-empty-gradient.svg b/fixtures/web-first/unsupported/svg-group-blend-linear-extent-empty-gradient.svg deleted file mode 100644 index a7178035..00000000 --- a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-empty-gradient.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-fill-zero.svg b/fixtures/web-first/unsupported/svg-group-blend-linear-extent-fill-zero.svg deleted file mode 100644 index 24373255..00000000 --- a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-fill-zero.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-stroke-sibling.svg b/fixtures/web-first/unsupported/svg-group-blend-linear-extent-stroke-sibling.svg deleted file mode 100644 index 8cf8df66..00000000 --- a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-stroke-sibling.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-transparent.svg b/fixtures/web-first/unsupported/svg-group-blend-linear-extent-transparent.svg deleted file mode 100644 index 07a2a1a0..00000000 --- a/fixtures/web-first/unsupported/svg-group-blend-linear-extent-transparent.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-circle.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-circle.svg new file mode 100644 index 00000000..57c950de --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-circle.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-mapped.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-mapped.svg new file mode 100644 index 00000000..7d773d7e --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-mapped.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-non-scaling.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-non-scaling.svg new file mode 100644 index 00000000..84fc368c --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-non-scaling.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-opacity.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-opacity.svg new file mode 100644 index 00000000..f48559f3 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-domain-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-blur.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-blur.svg new file mode 100644 index 00000000..2963bc06 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-blur.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-clip.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-clip.svg new file mode 100644 index 00000000..23ebbd22 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-mask.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-mask.svg new file mode 100644 index 00000000..51650d9b --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-mask.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-offset.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-offset.svg new file mode 100644 index 00000000..96898cc4 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-group-offset.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-group.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-group.svg new file mode 100644 index 00000000..d4ce441a --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-group.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-leaf.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-leaf.svg new file mode 100644 index 00000000..41e83942 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-leaf.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-use.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-use.svg new file mode 100644 index 00000000..2cf67ecd --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-viewport.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-viewport.svg new file mode 100644 index 00000000..5efee959 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-empty-viewport.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-group.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-group.svg new file mode 100644 index 00000000..fcfc8362 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-group.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-leaf.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-leaf.svg new file mode 100644 index 00000000..fc88a54d --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-leaf.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-use.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-use.svg new file mode 100644 index 00000000..bff73a21 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-viewport.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-viewport.svg new file mode 100644 index 00000000..8295a729 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-hide-zero-region-viewport.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-blur.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-blur.svg new file mode 100644 index 00000000..54129d1f --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-blur.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-clip.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-clip.svg new file mode 100644 index 00000000..f39441aa --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-mask.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-mask.svg new file mode 100644 index 00000000..01e74471 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-mask.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-offset.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-offset.svg new file mode 100644 index 00000000..300b6819 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-leaf-offset.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-clipped.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-clipped.svg new file mode 100644 index 00000000..1beee9fb --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-clipped.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-visible.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-visible.svg new file mode 100644 index 00000000..7906d06c --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-nested-visible.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-painted-zero-domain.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-painted-zero-domain.svg new file mode 100644 index 00000000..cd27d888 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-painted-zero-domain.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-singular.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-singular.svg new file mode 100644 index 00000000..06c169c2 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-singular.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-stopless-singular.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-stopless-singular.svg new file mode 100644 index 00000000..e6181acf --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-stopless-singular.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-group-blend-sibling-review-zero-pattern.svg b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-zero-pattern.svg new file mode 100644 index 00000000..559ae184 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-group-blend-sibling-review-zero-pattern.svg @@ -0,0 +1 @@ +