From ffc820e9ba43701ebb1643ce517d19bf80ba8571 Mon Sep 17 00:00:00 2001 From: Universe Date: Mon, 7 Sep 2026 06:42:41 +0900 Subject: [PATCH] websem: admit ordered radial gradient circles Preserve both circles and one-stop cone domains through the shared paint contract. Add 127 Chromium cells and 27 focused refusals without closing fx/fy/fr. Graduate the former focal refusal source unchanged; deliberately drop its obsolete inexpressibility assertion after re-homing the geometry in positive evidence. Keep frozen writers and preview-cache precision behind explicit guards. --- crates/cg/src/types.rs | 93 +- crates/cg/tests/radial_geometry.rs | 114 ++ crates/grida/examples/fixture_helpers/mod.rs | 1 + crates/grida/examples/fixtures/cover.rs | 2 + .../examples/fixtures/l0_paints_stack.rs | 1 + crates/grida/src/import/svg/paint.rs | 1 + crates/grida/src/io/io_grida_fbs.rs | 15 + crates/grida/src/painter/gradient.rs | 129 +- crates/grida/tests/fbs_roundtrip.rs | 75 ++ crates/n0-model/README.md | 8 + crates/n0-model/src/model.rs | 24 + crates/n0-model/src/renderability.rs | 14 + crates/n0-model/src/textir.rs | 22 +- .../n0-model/tests/paint_rfd_conformance.rs | 113 +- crates/n0-model/tests/radial_geometry.rs | 215 ++++ crates/n0/src/cache.rs | 66 +- crates/n0/src/glyphless.rs | 178 +++ crates/n0/src/paint.rs | 10 +- crates/n0/tests/cache.rs | 67 + crates/n0_cli/README.md | 31 +- crates/rframe/README.md | 13 +- crates/rframe/tests/paint_stack.rs | 10 + crates/websem/src/svg_paint_server.rs | 99 +- crates/websem/tests/capability_status.rs | 9 +- crates/websem/tests/gradients_contract.rs | 57 +- .../websem/tests/radial_gradients_contract.rs | 144 +++ crates/websem/tests/unsupported_corpus.rs | 136 +- docs/wg/consolidation/svg-engine-of-record.md | 109 +- docs/wg/consolidation/web-checklist.md | 14 + docs/wg/feat-painting/paint-model.md | 152 ++- fixtures/web-first/README.md | 19 +- fixtures/web-first/STATUS.md | 168 ++- .../chromium/html-inline-svg-radial-start.png | Bin 0 -> 289 bytes .../chromium/svg-radial-start-box-percent.png | Bin 0 -> 1986 bytes ...vg-radial-start-client-channel-opacity.png | Bin 0 -> 2856 bytes .../chromium/svg-radial-start-client-clip.png | Bin 0 -> 2167 bytes .../svg-radial-start-client-dashes.png | Bin 0 -> 918 bytes .../svg-radial-start-client-ellipse.png | Bin 0 -> 2662 bytes .../svg-radial-start-client-filter.png | Bin 0 -> 3186 bytes .../svg-radial-start-client-group-opacity.png | Bin 0 -> 2483 bytes .../chromium/svg-radial-start-client-mask.png | Bin 0 -> 2186 bytes .../svg-radial-start-client-nested.png | Bin 0 -> 1514 bytes .../svg-radial-start-client-order.png | Bin 0 -> 2606 bytes .../chromium/svg-radial-start-client-path.png | Bin 0 -> 3131 bytes .../svg-radial-start-client-pattern.png | Bin 0 -> 1016 bytes .../svg-radial-start-client-stroke.png | Bin 0 -> 1084 bytes .../svg-radial-start-client-transform.png | Bin 0 -> 3012 bytes .../chromium/svg-radial-start-client-use.png | Bin 0 -> 3503 bytes .../chromium/svg-radial-start-default.png | Bin 0 -> 3022 bytes .../svg-radial-start-explicit-default.png | Bin 0 -> 3022 bytes .../svg-radial-start-fr-decimal-higher.png | Bin 0 -> 386 bytes .../svg-radial-start-fr-decimal-lower.png | Bin 0 -> 405 bytes .../chromium/svg-radial-start-fr-equal-r.png | Bin 0 -> 406 bytes .../svg-radial-start-fr-greater-r.png | Bin 0 -> 1529 bytes .../svg-radial-start-fr-midpoint-higher.png | Bin 0 -> 370 bytes .../svg-radial-start-fr-midpoint-lower.png | Bin 0 -> 386 bytes .../svg-radial-start-fr-negative-zero.png | Bin 0 -> 3022 bytes .../chromium/svg-radial-start-fr-negative.png | Bin 0 -> 3022 bytes .../svg-radial-start-fr-percentage-higher.png | Bin 0 -> 371 bytes .../svg-radial-start-fr-percentage-lower.png | Bin 0 -> 384 bytes .../chromium/svg-radial-start-fr-quarter.png | Bin 0 -> 2991 bytes .../svg-radial-start-fx-decimal-higher.png | Bin 0 -> 1795 bytes .../svg-radial-start-fx-decimal-lower.png | Bin 0 -> 1796 bytes .../chromium/svg-radial-start-fx-negative.png | Bin 0 -> 519 bytes .../chromium/svg-radial-start-fx-on-end.png | Bin 0 -> 3083 bytes .../chromium/svg-radial-start-fx-outside.png | Bin 0 -> 525 bytes .../svg-radial-start-fx-percentage-higher.png | Bin 0 -> 1792 bytes .../svg-radial-start-fx-percentage-lower.png | Bin 0 -> 1796 bytes .../chromium/svg-radial-start-fx-quarter.png | Bin 0 -> 3146 bytes .../svg-radial-start-fxy-fr-quarter.png | Bin 0 -> 289 bytes .../chromium/svg-radial-start-fxy-quarter.png | Bin 0 -> 3153 bytes .../svg-radial-start-fy-decimal-higher.png | Bin 0 -> 1808 bytes .../svg-radial-start-fy-decimal-lower.png | Bin 0 -> 1796 bytes .../svg-radial-start-fy-percentage-higher.png | Bin 0 -> 1810 bytes .../svg-radial-start-fy-percentage-lower.png | Bin 0 -> 1796 bytes .../chromium/svg-radial-start-fy-quarter.png | Bin 0 -> 3133 bytes .../svg-radial-start-graduated-focal.png | Bin 0 -> 2343 bytes .../svg-radial-start-grammar-fr-comma.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fr-exponent.png | Bin 0 -> 3215 bytes .../svg-radial-start-grammar-fr-integer.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fr-nbsp.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fr-signed.png | Bin 0 -> 3215 bytes ...vg-radial-start-grammar-fr-trailingdot.png | Bin 0 -> 3146 bytes ...svg-radial-start-grammar-fr-whitespace.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fx-comma.png | Bin 0 -> 3123 bytes .../svg-radial-start-grammar-fx-exponent.png | Bin 0 -> 3147 bytes .../svg-radial-start-grammar-fx-integer.png | Bin 0 -> 716 bytes .../svg-radial-start-grammar-fx-nbsp.png | Bin 0 -> 3123 bytes .../svg-radial-start-grammar-fx-signed.png | Bin 0 -> 3147 bytes ...vg-radial-start-grammar-fx-trailingdot.png | Bin 0 -> 3123 bytes ...svg-radial-start-grammar-fx-whitespace.png | Bin 0 -> 3123 bytes .../svg-radial-start-grammar-fy-comma.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fy-exponent.png | Bin 0 -> 3153 bytes .../svg-radial-start-grammar-fy-integer.png | Bin 0 -> 670 bytes .../svg-radial-start-grammar-fy-nbsp.png | Bin 0 -> 3146 bytes .../svg-radial-start-grammar-fy-signed.png | Bin 0 -> 3153 bytes ...vg-radial-start-grammar-fy-trailingdot.png | Bin 0 -> 3146 bytes ...svg-radial-start-grammar-fy-whitespace.png | Bin 0 -> 3146 bytes .../svg-radial-start-mapped-viewbox.png | Bin 0 -> 1690 bytes .../svg-radial-start-on-end-reflect.png | Bin 0 -> 4127 bytes .../svg-radial-start-on-end-repeat.png | Bin 0 -> 4189 bytes .../svg-radial-start-one-stop-default.png | Bin 0 -> 207 bytes ...radial-start-one-stop-exterior-reflect.png | Bin 0 -> 265 bytes ...-radial-start-one-stop-exterior-repeat.png | Bin 0 -> 265 bytes .../svg-radial-start-one-stop-focal.png | Bin 0 -> 265 bytes .../svg-radial-start-outer-negative-focal.png | Bin 0 -> 790 bytes .../svg-radial-start-outer-zero-focal.png | Bin 0 -> 790 bytes .../svg-radial-start-outer-zero-fr.png | Bin 0 -> 652 bytes .../svg-radial-start-outer-zero-fx.png | Bin 0 -> 168 bytes ...radial-start-outer-zero-one-stop-focal.png | Bin 0 -> 289 bytes .../svg-radial-start-outside-positive-fr.png | Bin 0 -> 679 bytes .../svg-radial-start-relation-above.png | Bin 0 -> 572 bytes .../svg-radial-start-relation-below.png | Bin 0 -> 546 bytes .../svg-radial-start-relation-containing.png | Bin 0 -> 1440 bytes .../svg-radial-start-relation-disjoint.png | Bin 0 -> 756 bytes ...radial-start-relation-external-tangent.png | Bin 0 -> 737 bytes ...radial-start-relation-internal-tangent.png | Bin 0 -> 2888 bytes ...svg-radial-start-relation-intersecting.png | Bin 0 -> 534 bytes .../svg-radial-start-relation-left.png | Bin 0 -> 618 bytes .../svg-radial-start-relation-right.png | Bin 0 -> 618 bytes .../svg-radial-start-same-circle-reflect.png | Bin 0 -> 207 bytes .../svg-radial-start-same-circle-repeat.png | Bin 0 -> 207 bytes ...svg-radial-start-spread-circle-reflect.png | Bin 0 -> 4218 bytes .../svg-radial-start-spread-circle-repeat.png | Bin 0 -> 4375 bytes ...vg-radial-start-spread-outside-reflect.png | Bin 0 -> 3381 bytes ...svg-radial-start-spread-outside-repeat.png | Bin 0 -> 3430 bytes ...g-radial-start-spread-reversed-reflect.png | Bin 0 -> 4153 bytes ...vg-radial-start-spread-reversed-repeat.png | Bin 0 -> 4283 bytes ...g-radial-start-spread-zero-end-reflect.png | Bin 0 -> 1104 bytes ...vg-radial-start-spread-zero-end-repeat.png | Bin 0 -> 1185 bytes .../chromium/svg-radial-start-stops-alpha.png | Bin 0 -> 2527 bytes .../svg-radial-start-stops-duplicate.png | Bin 0 -> 1402 bytes .../chromium/svg-radial-start-stops-edges.png | Bin 0 -> 2103 bytes .../svg-radial-start-stops-unsorted.png | Bin 0 -> 2361 bytes .../svg-radial-start-template-all.png | Bin 0 -> 3178 bytes .../svg-radial-start-template-empty-fr.png | Bin 0 -> 3147 bytes .../svg-radial-start-template-empty-fx.png | Bin 0 -> 3201 bytes .../svg-radial-start-template-empty-fy.png | Bin 0 -> 3215 bytes ...g-radial-start-template-explicit-focus.png | Bin 0 -> 782 bytes .../svg-radial-start-template-fr-negative.png | Bin 0 -> 3147 bytes .../svg-radial-start-template-fr-zero.png | Bin 0 -> 3147 bytes .../svg-radial-start-template-invalid-fr.png | Bin 0 -> 3147 bytes ...svg-radial-start-template-local-center.png | Bin 0 -> 2121 bytes .../svg-radial-start-template-multihop.png | Bin 0 -> 3178 bytes .../svg-radial-start-template-override-fr.png | Bin 0 -> 400 bytes .../svg-radial-start-template-override-fx.png | Bin 0 -> 3171 bytes .../svg-radial-start-template-override-fy.png | Bin 0 -> 3166 bytes .../svg-radial-start-template-xlink.png | Bin 0 -> 3178 bytes .../svg-radial-start-transform-rotate.png | Bin 0 -> 3205 bytes .../svg-radial-start-transform-scale.png | Bin 0 -> 2733 bytes .../svg-radial-start-transform-singular.png | Bin 0 -> 168 bytes .../svg-radial-start-transform-skew.png | Bin 0 -> 2936 bytes .../svg-radial-start-transform-translate.png | Bin 0 -> 2714 bytes .../svg-radial-start-transparent-cone.png | Bin 0 -> 704 bytes .../svg-radial-start-user-percent-fr.png | Bin 0 -> 1690 bytes .../svg-radial-start-user-percent-fx.png | Bin 0 -> 1690 bytes .../svg-radial-start-user-percent-fy.png | Bin 0 -> 1690 bytes .../chromium/svg-radial-start-user-px.png | Bin 0 -> 405 bytes .../svg-radial-start-zero-stops-focal.png | Bin 0 -> 168 bytes .../html-inline-svg-radial-start.html | 9 + fixtures/web-first/oracle-bake.json | 1145 ++++++++++++++++- fixtures/web-first/primitives.json | 1056 +++++++++++++++ fixtures/web-first/probe_harness.ts | 6 +- .../svg-radial-start-box-percent.svg | 1 + ...vg-radial-start-client-channel-opacity.svg | 1 + .../svg-radial-start-client-clip.svg | 1 + .../svg-radial-start-client-dashes.svg | 1 + .../svg-radial-start-client-ellipse.svg | 1 + .../svg-radial-start-client-filter.svg | 1 + .../svg-radial-start-client-group-opacity.svg | 1 + .../svg-radial-start-client-mask.svg | 1 + .../svg-radial-start-client-nested.svg | 1 + .../svg-radial-start-client-order.svg | 1 + .../svg-radial-start-client-path.svg | 1 + .../svg-radial-start-client-pattern.svg | 1 + .../svg-radial-start-client-stroke.svg | 1 + .../svg-radial-start-client-transform.svg | 1 + .../web-first/svg-radial-start-client-use.svg | 1 + .../web-first/svg-radial-start-default.svg | 8 + .../svg-radial-start-explicit-default.svg | 8 + .../svg-radial-start-fr-decimal-higher.svg | 1 + .../svg-radial-start-fr-decimal-lower.svg | 1 + .../web-first/svg-radial-start-fr-equal-r.svg | 8 + .../svg-radial-start-fr-greater-r.svg | 8 + .../svg-radial-start-fr-midpoint-higher.svg | 1 + .../svg-radial-start-fr-midpoint-lower.svg | 1 + .../svg-radial-start-fr-negative-zero.svg | 8 + .../svg-radial-start-fr-negative.svg | 8 + .../svg-radial-start-fr-percentage-higher.svg | 1 + .../svg-radial-start-fr-percentage-lower.svg | 1 + .../web-first/svg-radial-start-fr-quarter.svg | 8 + .../svg-radial-start-fx-decimal-higher.svg | 1 + .../svg-radial-start-fx-decimal-lower.svg | 1 + .../svg-radial-start-fx-negative.svg | 8 + .../web-first/svg-radial-start-fx-on-end.svg | 8 + .../web-first/svg-radial-start-fx-outside.svg | 8 + .../svg-radial-start-fx-percentage-higher.svg | 1 + .../svg-radial-start-fx-percentage-lower.svg | 1 + .../web-first/svg-radial-start-fx-quarter.svg | 8 + .../svg-radial-start-fxy-fr-quarter.svg | 8 + .../svg-radial-start-fxy-quarter.svg | 8 + .../svg-radial-start-fy-decimal-higher.svg | 1 + .../svg-radial-start-fy-decimal-lower.svg | 1 + .../svg-radial-start-fy-percentage-higher.svg | 1 + .../svg-radial-start-fy-percentage-lower.svg | 1 + .../web-first/svg-radial-start-fy-quarter.svg | 8 + ...g => svg-radial-start-graduated-focal.svg} | 0 .../svg-radial-start-grammar-fr-comma.svg | 1 + .../svg-radial-start-grammar-fr-exponent.svg | 1 + .../svg-radial-start-grammar-fr-integer.svg | 1 + .../svg-radial-start-grammar-fr-nbsp.svg | 1 + .../svg-radial-start-grammar-fr-signed.svg | 1 + ...vg-radial-start-grammar-fr-trailingdot.svg | 1 + ...svg-radial-start-grammar-fr-whitespace.svg | 1 + .../svg-radial-start-grammar-fx-comma.svg | 1 + .../svg-radial-start-grammar-fx-exponent.svg | 1 + .../svg-radial-start-grammar-fx-integer.svg | 1 + .../svg-radial-start-grammar-fx-nbsp.svg | 1 + .../svg-radial-start-grammar-fx-signed.svg | 1 + ...vg-radial-start-grammar-fx-trailingdot.svg | 1 + ...svg-radial-start-grammar-fx-whitespace.svg | 1 + .../svg-radial-start-grammar-fy-comma.svg | 1 + .../svg-radial-start-grammar-fy-exponent.svg | 1 + .../svg-radial-start-grammar-fy-integer.svg | 1 + .../svg-radial-start-grammar-fy-nbsp.svg | 1 + .../svg-radial-start-grammar-fy-signed.svg | 1 + ...vg-radial-start-grammar-fy-trailingdot.svg | 1 + ...svg-radial-start-grammar-fy-whitespace.svg | 1 + .../svg-radial-start-mapped-viewbox.svg | 1 + .../svg-radial-start-on-end-reflect.svg | 8 + .../svg-radial-start-on-end-repeat.svg | 8 + .../svg-radial-start-one-stop-default.svg | 5 + ...radial-start-one-stop-exterior-reflect.svg | 1 + ...-radial-start-one-stop-exterior-repeat.svg | 1 + .../svg-radial-start-one-stop-focal.svg | 5 + .../svg-radial-start-outer-negative-focal.svg | 8 + .../svg-radial-start-outer-zero-focal.svg | 8 + .../svg-radial-start-outer-zero-fr.svg | 8 + .../svg-radial-start-outer-zero-fx.svg | 8 + ...radial-start-outer-zero-one-stop-focal.svg | 5 + .../svg-radial-start-outside-positive-fr.svg | 8 + .../svg-radial-start-relation-above.svg | 1 + .../svg-radial-start-relation-below.svg | 1 + .../svg-radial-start-relation-containing.svg | 1 + .../svg-radial-start-relation-disjoint.svg | 1 + ...radial-start-relation-external-tangent.svg | 1 + ...radial-start-relation-internal-tangent.svg | 1 + ...svg-radial-start-relation-intersecting.svg | 1 + .../svg-radial-start-relation-left.svg | 1 + .../svg-radial-start-relation-right.svg | 1 + .../svg-radial-start-same-circle-reflect.svg | 8 + .../svg-radial-start-same-circle-repeat.svg | 8 + ...svg-radial-start-spread-circle-reflect.svg | 1 + .../svg-radial-start-spread-circle-repeat.svg | 1 + ...vg-radial-start-spread-outside-reflect.svg | 1 + ...svg-radial-start-spread-outside-repeat.svg | 1 + ...g-radial-start-spread-reversed-reflect.svg | 1 + ...vg-radial-start-spread-reversed-repeat.svg | 1 + ...g-radial-start-spread-zero-end-reflect.svg | 1 + ...vg-radial-start-spread-zero-end-repeat.svg | 1 + .../svg-radial-start-stops-alpha.svg | 1 + .../svg-radial-start-stops-duplicate.svg | 1 + .../svg-radial-start-stops-edges.svg | 1 + .../svg-radial-start-stops-unsorted.svg | 1 + .../svg-radial-start-template-all.svg | 1 + .../svg-radial-start-template-empty-fr.svg | 1 + .../svg-radial-start-template-empty-fx.svg | 1 + .../svg-radial-start-template-empty-fy.svg | 1 + ...g-radial-start-template-explicit-focus.svg | 1 + .../svg-radial-start-template-fr-negative.svg | 1 + .../svg-radial-start-template-fr-zero.svg | 1 + .../svg-radial-start-template-invalid-fr.svg | 1 + ...svg-radial-start-template-local-center.svg | 1 + .../svg-radial-start-template-multihop.svg | 1 + .../svg-radial-start-template-override-fr.svg | 1 + .../svg-radial-start-template-override-fx.svg | 1 + .../svg-radial-start-template-override-fy.svg | 1 + .../svg-radial-start-template-xlink.svg | 1 + .../svg-radial-start-transform-rotate.svg | 1 + .../svg-radial-start-transform-scale.svg | 1 + .../svg-radial-start-transform-singular.svg | 1 + .../svg-radial-start-transform-skew.svg | 1 + .../svg-radial-start-transform-translate.svg | 1 + .../svg-radial-start-transparent-cone.svg | 1 + .../svg-radial-start-user-percent-fr.svg | 1 + .../svg-radial-start-user-percent-fx.svg | 1 + .../svg-radial-start-user-percent-fy.svg | 1 + .../web-first/svg-radial-start-user-px.svg | 1 + .../svg-radial-start-zero-stops-focal.svg | 5 + fixtures/web-first/unsupported/README.md | 5 +- .../svg-radial-start-fr-css-comments.svg | 1 + .../svg-radial-start-fr-css-wide.svg | 1 + .../svg-radial-start-fr-decimal-precision.svg | 1 + .../unsupported/svg-radial-start-fr-math.svg | 1 + ...svg-radial-start-fr-midpoint-precision.svg | 1 + ...g-radial-start-fr-percentage-precision.svg | 1 + .../unsupported/svg-radial-start-fr-units.svg | 1 + .../svg-radial-start-fr-used-range.svg | 1 + .../unsupported/svg-radial-start-fr-var.svg | 1 + .../svg-radial-start-fx-css-comments.svg | 1 + .../svg-radial-start-fx-css-wide.svg | 1 + .../svg-radial-start-fx-decimal-precision.svg | 1 + .../unsupported/svg-radial-start-fx-math.svg | 1 + ...svg-radial-start-fx-midpoint-precision.svg | 1 + ...g-radial-start-fx-percentage-precision.svg | 1 + .../unsupported/svg-radial-start-fx-units.svg | 1 + .../svg-radial-start-fx-used-range.svg | 1 + .../unsupported/svg-radial-start-fx-var.svg | 1 + .../svg-radial-start-fy-css-comments.svg | 1 + .../svg-radial-start-fy-css-wide.svg | 1 + .../svg-radial-start-fy-decimal-precision.svg | 1 + .../unsupported/svg-radial-start-fy-math.svg | 1 + ...svg-radial-start-fy-midpoint-precision.svg | 1 + ...g-radial-start-fy-percentage-precision.svg | 1 + .../unsupported/svg-radial-start-fy-units.svg | 1 + .../svg-radial-start-fy-used-range.svg | 1 + .../unsupported/svg-radial-start-fy-var.svg | 1 + 317 files changed, 4459 insertions(+), 200 deletions(-) create mode 100644 crates/cg/tests/radial_geometry.rs create mode 100644 crates/n0-model/tests/radial_geometry.rs create mode 100644 crates/websem/tests/radial_gradients_contract.rs create mode 100644 fixtures/web-first/chromium/html-inline-svg-radial-start.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-box-percent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-channel-opacity.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-clip.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-dashes.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-ellipse.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-filter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-group-opacity.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-mask.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-nested.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-order.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-path.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-pattern.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-stroke.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-transform.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-client-use.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-default.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-explicit-default.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-decimal-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-decimal-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-equal-r.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-greater-r.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-midpoint-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-midpoint-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-negative-zero.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-negative.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-percentage-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-percentage-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fr-quarter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-decimal-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-decimal-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-negative.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-on-end.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-outside.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-percentage-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-percentage-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fx-quarter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fxy-fr-quarter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fxy-quarter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fy-decimal-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fy-decimal-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fy-percentage-higher.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fy-percentage-lower.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-fy-quarter.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-graduated-focal.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-comma.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-exponent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-integer.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-nbsp.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-signed.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-trailingdot.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fr-whitespace.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-comma.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-exponent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-integer.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-nbsp.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-signed.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-trailingdot.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fx-whitespace.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-comma.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-exponent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-integer.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-nbsp.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-signed.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-trailingdot.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-grammar-fy-whitespace.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-mapped-viewbox.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-on-end-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-on-end-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-one-stop-default.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-one-stop-focal.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outer-negative-focal.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outer-zero-focal.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outer-zero-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outer-zero-fx.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outer-zero-one-stop-focal.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-outside-positive-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-above.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-below.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-containing.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-disjoint.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-external-tangent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-internal-tangent.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-intersecting.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-left.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-relation-right.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-same-circle-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-same-circle-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-circle-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-circle-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-outside-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-outside-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-reversed-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-reversed-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-zero-end-reflect.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-spread-zero-end-repeat.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-stops-alpha.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-stops-duplicate.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-stops-edges.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-stops-unsorted.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-all.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-empty-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-empty-fx.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-empty-fy.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-explicit-focus.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-fr-negative.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-fr-zero.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-invalid-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-local-center.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-multihop.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-override-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-override-fx.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-override-fy.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-template-xlink.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transform-rotate.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transform-scale.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transform-singular.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transform-skew.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transform-translate.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-transparent-cone.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-user-percent-fr.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-user-percent-fx.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-user-percent-fy.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-user-px.png create mode 100644 fixtures/web-first/chromium/svg-radial-start-zero-stops-focal.png create mode 100644 fixtures/web-first/html-inline-svg-radial-start.html create mode 100644 fixtures/web-first/svg-radial-start-box-percent.svg create mode 100644 fixtures/web-first/svg-radial-start-client-channel-opacity.svg create mode 100644 fixtures/web-first/svg-radial-start-client-clip.svg create mode 100644 fixtures/web-first/svg-radial-start-client-dashes.svg create mode 100644 fixtures/web-first/svg-radial-start-client-ellipse.svg create mode 100644 fixtures/web-first/svg-radial-start-client-filter.svg create mode 100644 fixtures/web-first/svg-radial-start-client-group-opacity.svg create mode 100644 fixtures/web-first/svg-radial-start-client-mask.svg create mode 100644 fixtures/web-first/svg-radial-start-client-nested.svg create mode 100644 fixtures/web-first/svg-radial-start-client-order.svg create mode 100644 fixtures/web-first/svg-radial-start-client-path.svg create mode 100644 fixtures/web-first/svg-radial-start-client-pattern.svg create mode 100644 fixtures/web-first/svg-radial-start-client-stroke.svg create mode 100644 fixtures/web-first/svg-radial-start-client-transform.svg create mode 100644 fixtures/web-first/svg-radial-start-client-use.svg create mode 100644 fixtures/web-first/svg-radial-start-default.svg create mode 100644 fixtures/web-first/svg-radial-start-explicit-default.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-decimal-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-decimal-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-equal-r.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-greater-r.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-midpoint-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-midpoint-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-negative-zero.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-negative.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-percentage-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-percentage-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fr-quarter.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-decimal-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-decimal-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-negative.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-on-end.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-outside.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-percentage-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-percentage-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fx-quarter.svg create mode 100644 fixtures/web-first/svg-radial-start-fxy-fr-quarter.svg create mode 100644 fixtures/web-first/svg-radial-start-fxy-quarter.svg create mode 100644 fixtures/web-first/svg-radial-start-fy-decimal-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fy-decimal-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fy-percentage-higher.svg create mode 100644 fixtures/web-first/svg-radial-start-fy-percentage-lower.svg create mode 100644 fixtures/web-first/svg-radial-start-fy-quarter.svg rename fixtures/web-first/{unsupported/svg-gradient-focal.svg => svg-radial-start-graduated-focal.svg} (100%) create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-comma.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-exponent.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-integer.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-nbsp.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-signed.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-trailingdot.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fr-whitespace.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-comma.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-exponent.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-integer.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-nbsp.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-signed.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-trailingdot.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fx-whitespace.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-comma.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-exponent.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-integer.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-nbsp.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-signed.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-trailingdot.svg create mode 100644 fixtures/web-first/svg-radial-start-grammar-fy-whitespace.svg create mode 100644 fixtures/web-first/svg-radial-start-mapped-viewbox.svg create mode 100644 fixtures/web-first/svg-radial-start-on-end-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-on-end-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-one-stop-default.svg create mode 100644 fixtures/web-first/svg-radial-start-one-stop-exterior-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-one-stop-exterior-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-one-stop-focal.svg create mode 100644 fixtures/web-first/svg-radial-start-outer-negative-focal.svg create mode 100644 fixtures/web-first/svg-radial-start-outer-zero-focal.svg create mode 100644 fixtures/web-first/svg-radial-start-outer-zero-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-outer-zero-fx.svg create mode 100644 fixtures/web-first/svg-radial-start-outer-zero-one-stop-focal.svg create mode 100644 fixtures/web-first/svg-radial-start-outside-positive-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-above.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-below.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-containing.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-disjoint.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-external-tangent.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-internal-tangent.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-intersecting.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-left.svg create mode 100644 fixtures/web-first/svg-radial-start-relation-right.svg create mode 100644 fixtures/web-first/svg-radial-start-same-circle-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-same-circle-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-circle-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-circle-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-outside-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-outside-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-reversed-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-reversed-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-zero-end-reflect.svg create mode 100644 fixtures/web-first/svg-radial-start-spread-zero-end-repeat.svg create mode 100644 fixtures/web-first/svg-radial-start-stops-alpha.svg create mode 100644 fixtures/web-first/svg-radial-start-stops-duplicate.svg create mode 100644 fixtures/web-first/svg-radial-start-stops-edges.svg create mode 100644 fixtures/web-first/svg-radial-start-stops-unsorted.svg create mode 100644 fixtures/web-first/svg-radial-start-template-all.svg create mode 100644 fixtures/web-first/svg-radial-start-template-empty-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-template-empty-fx.svg create mode 100644 fixtures/web-first/svg-radial-start-template-empty-fy.svg create mode 100644 fixtures/web-first/svg-radial-start-template-explicit-focus.svg create mode 100644 fixtures/web-first/svg-radial-start-template-fr-negative.svg create mode 100644 fixtures/web-first/svg-radial-start-template-fr-zero.svg create mode 100644 fixtures/web-first/svg-radial-start-template-invalid-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-template-local-center.svg create mode 100644 fixtures/web-first/svg-radial-start-template-multihop.svg create mode 100644 fixtures/web-first/svg-radial-start-template-override-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-template-override-fx.svg create mode 100644 fixtures/web-first/svg-radial-start-template-override-fy.svg create mode 100644 fixtures/web-first/svg-radial-start-template-xlink.svg create mode 100644 fixtures/web-first/svg-radial-start-transform-rotate.svg create mode 100644 fixtures/web-first/svg-radial-start-transform-scale.svg create mode 100644 fixtures/web-first/svg-radial-start-transform-singular.svg create mode 100644 fixtures/web-first/svg-radial-start-transform-skew.svg create mode 100644 fixtures/web-first/svg-radial-start-transform-translate.svg create mode 100644 fixtures/web-first/svg-radial-start-transparent-cone.svg create mode 100644 fixtures/web-first/svg-radial-start-user-percent-fr.svg create mode 100644 fixtures/web-first/svg-radial-start-user-percent-fx.svg create mode 100644 fixtures/web-first/svg-radial-start-user-percent-fy.svg create mode 100644 fixtures/web-first/svg-radial-start-user-px.svg create mode 100644 fixtures/web-first/svg-radial-start-zero-stops-focal.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-css-comments.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-css-wide.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-decimal-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-math.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-midpoint-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-percentage-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-units.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-used-range.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fr-var.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-css-comments.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-css-wide.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-decimal-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-math.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-midpoint-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-percentage-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-units.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-used-range.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fx-var.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-css-comments.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-css-wide.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-decimal-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-math.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-midpoint-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-percentage-precision.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-units.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-used-range.svg create mode 100644 fixtures/web-first/unsupported/svg-radial-start-fy-var.svg diff --git a/crates/cg/src/types.rs b/crates/cg/src/types.rs index dac18502..fa45ae24 100644 --- a/crates/cg/src/types.rs +++ b/crates/cg/src/types.rs @@ -2460,49 +2460,69 @@ impl Default for LinearGradientPaint { } } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +/// One intrinsic circle in gradient-local coordinates, before paint placement. +/// +/// The center is a direct `(x, y)` pair, not an alignment point. Both components +/// must be finite; the radius must be finite and nonnegative. Centers are not +/// confined to a unit box. Validation belongs to the admitting boundary. +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct RadialGradientCircle { + pub center: (f32, f32), + pub radius: f32, +} + +/// Ordered ramp-boundary circles: offset zero at `start`, offset one at `end`. +/// +/// Either radius may be zero, the start radius may exceed the end radius, and +/// equal circles are representable. None of these cases permits swapping or +/// clamping the circles. Representation does not guarantee backend support: +/// a consumer must preserve the geometry or explicitly refuse it. +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] +pub struct RadialGradientGeometry { + pub start: RadialGradientCircle, + pub end: RadialGradientCircle, +} + +#[derive(Clone, PartialEq, Serialize, Deserialize)] pub struct RadialGradientPaint { pub active: bool, - /// # Radial Gradient Transform Model - /// - /// ## Coordinate Space - /// The radial gradient is defined in **unit gradient space**: - /// - Center: `(0.5, 0.5)` - /// - Radius: `0.5` - /// - /// This forms a normalized circle inside a `[0.0, 1.0] x [0.0, 1.0]` box. - /// All geometry is defined relative to this unit space. - /// - /// ## Scaling to Object Space - /// The gradient is mapped to the target rectangle by applying a scale matrix derived from its size: - /// - /// ```text - /// local_matrix = scale(width, height) × user_transform - /// ``` - /// - /// - `scale(width, height)` transforms the unit circle to match the target rectangle, - /// allowing the gradient to become elliptical if `width ≠ height`. - /// - `user_transform` is an additional affine matrix defined in gradient space (centered at 0.5, 0.5). - /// - /// ## Rendering Behavior - /// When passed to Skia, the shader uses: - /// - `center = (0.5, 0.5)` - /// - `radius = 0.5` - /// - /// These are interpreted in **local gradient space**, and the `local_matrix` maps device coordinates - /// back into that space. - /// - /// ## Summary - /// - The gradient definition is resolution-independent. - /// - `width` and `height` determine how unit space is scaled — they do **not** directly affect center or radius. - /// - All transforms (e.g. rotation, skew) should be encoded in the `user_transform`, not baked into radius or center. + /// Maps gradient-local coordinates to the target box's normalized space. + /// Placement is `scale(width, height) × transform`; intrinsic circle values + /// are not converted through center-based alignment coordinates. pub transform: AffineTransform, + /// Explicit ordered circles, or the original centered radial when absent: + /// start `(0.5, 0.5), r=0`, end `(0.5, 0.5), r=0.5`. + /// + /// Absence preserves the original rendering path and serialized field set. + /// Present geometry survives copying and serialization without normalization, + /// including a present pair numerically equal to those implicit circles. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub geometry: Option, pub stops: Vec, pub opacity: f32, pub blend_mode: BlendMode, pub tile_mode: TileMode, } +impl std::fmt::Debug for RadialGradientPaint { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut debug = f.debug_struct("RadialGradientPaint"); + debug + .field("active", &self.active) + .field("transform", &self.transform); + // Keep diagnostics of old paint values stable without hiding new facts. + if let Some(geometry) = &self.geometry { + debug.field("geometry", geometry); + } + debug + .field("stops", &self.stops) + .field("opacity", &self.opacity) + .field("blend_mode", &self.blend_mode) + .field("tile_mode", &self.tile_mode) + .finish() + } +} + impl RadialGradientPaint { pub fn from_stops(stops: Vec) -> Self { Self { @@ -2524,6 +2544,7 @@ impl Default for RadialGradientPaint { Self { active: true, transform: AffineTransform::default(), + geometry: None, stops: Vec::new(), opacity: 1.0, blend_mode: BlendMode::default(), @@ -2539,8 +2560,8 @@ pub struct DiamondGradientPaint { /// /// Figma's Diamond Gradient is equivalent to a radial gradient evaluated /// using the Manhattan distance metric. The gradient is defined in the same - /// unit space as [`RadialGradientPaint`]: center at `(0.5, 0.5)` with a - /// nominal radius of `0.5`. + /// unit space as the implicit [`RadialGradientPaint`] default: center at + /// `(0.5, 0.5)` with a nominal radius of `0.5`. /// /// Scaling to object space follows the same rule: /// diff --git a/crates/cg/tests/radial_geometry.rs b/crates/cg/tests/radial_geometry.rs new file mode 100644 index 00000000..0b2e8b2a --- /dev/null +++ b/crates/cg/tests/radial_geometry.rs @@ -0,0 +1,114 @@ +//! Serialization contract for the ordered radial-circle value, without a backend. + +use cg::{RadialGradientCircle, RadialGradientGeometry, RadialGradientPaint}; +use serde_json::json; + +#[test] +fn absent_geometry_preserves_the_old_json_field_set_and_input() { + let old = json!({ + "active": true, + "transform": {"matrix": [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]}, + "stops": [], + "opacity": 1.0, + "blend_mode": "normal", + "tile_mode": "clamp" + }); + let paint: RadialGradientPaint = serde_json::from_value(old.clone()).unwrap(); + assert_eq!(paint, RadialGradientPaint::default()); + assert_eq!(paint.geometry, None); + assert_eq!(serde_json::to_value(&paint).unwrap(), old); + assert_eq!( + serde_json::to_string(&paint).unwrap(), + r#"{"active":true,"transform":{"matrix":[[1.0,0.0,0.0],[0.0,1.0,0.0]]},"stops":[],"opacity":1.0,"blend_mode":"normal","tile_mode":"clamp"}"# + ); +} + +#[test] +fn debug_preserves_absent_values_but_never_hides_present_geometry() { + let mut paint = RadialGradientPaint::default(); + assert_eq!(format!("{paint:?}"), "RadialGradientPaint { active: true, transform: AffineTransform { matrix: [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] }, stops: [], opacity: 1.0, blend_mode: Normal, tile_mode: Clamp }"); + paint.geometry = Some(RadialGradientGeometry { + start: RadialGradientCircle { + center: (-2.0, 1.0), + radius: 0.75, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.0, + }, + }); + let debug = format!("{paint:?}"); + assert!(debug.contains("geometry: RadialGradientGeometry { start: RadialGradientCircle { center: (-2.0, 1.0), radius: 0.75 }, end: RadialGradientCircle { center: (0.5, 0.5), radius: 0.0 } }")); +} + +fn circle_bits(circle: RadialGradientCircle) -> [u32; 3] { + [ + circle.center.0.to_bits(), + circle.center.1.to_bits(), + circle.radius.to_bits(), + ] +} + +#[test] +fn present_geometry_round_trips_without_alignment_conversion_or_circle_reordering() { + // A subnormal, signed zero, and a radius larger than the point-sized end + // discriminate arithmetic normalization and inferred circle order. + let paint = RadialGradientPaint { + geometry: Some(RadialGradientGeometry { + start: RadialGradientCircle { + center: (f32::from_bits(1), -0.0), + radius: 1.75, + }, + end: RadialGradientCircle { + center: (3.5, -2.25), + radius: 0.0, + }, + }), + ..Default::default() + }; + let encoded = serde_json::to_string(&paint).unwrap(); + let decoded: RadialGradientPaint = serde_json::from_str(&encoded).unwrap(); + let geometry = decoded.geometry.unwrap(); + assert_eq!(circle_bits(geometry.start), [1, 0x8000_0000, 0x3fe0_0000]); + assert_eq!(circle_bits(geometry.end), [0x4060_0000, 0xc010_0000, 0]); + assert_eq!(decoded, paint); + assert_eq!( + serde_json::to_value(&decoded).unwrap()["geometry"]["end"], + json!({"center": [3.5, -2.25], "radius": 0.0}) + ); +} + +#[test] +fn explicit_implicit_circle_values_remain_present() { + let geometry = RadialGradientGeometry { + start: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.0, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + let paint = RadialGradientPaint { + geometry: Some(geometry), + ..Default::default() + }; + let decoded: RadialGradientPaint = + serde_json::from_value(serde_json::to_value(paint).unwrap()).unwrap(); + assert_eq!(decoded.geometry, Some(geometry)); +} + +#[test] +fn a_present_geometry_requires_both_complete_circles() { + for incomplete in [ + json!({"start": {"center": [0.5, 0.5], "radius": 0.0}}), + json!({"end": {"center": [0.5, 0.5], "radius": 0.5}}), + json!({"start": {"center": [0.5, 0.5]}, "end": {"center": [0.5, 0.5], "radius": 0.5}}), + json!({"start": {"center": [0.5, 0.5], "radius": 0.0}, "end": {"radius": 0.5}}), + ] { + let mut json = serde_json::to_value(RadialGradientPaint::default()).unwrap(); + json["geometry"] = incomplete; + assert!(serde_json::from_value::(json).is_err()); + } +} diff --git a/crates/grida/examples/fixture_helpers/mod.rs b/crates/grida/examples/fixture_helpers/mod.rs index c4a2525d..abf40cb5 100644 --- a/crates/grida/examples/fixture_helpers/mod.rs +++ b/crates/grida/examples/fixture_helpers/mod.rs @@ -246,6 +246,7 @@ pub(crate) fn linear_gradient() -> Paint { pub(crate) fn radial_gradient() -> Paint { Paint::RadialGradient(RadialGradientPaint { + geometry: None, active: true, transform: AffineTransform::default(), stops: vec![ diff --git a/crates/grida/examples/fixtures/cover.rs b/crates/grida/examples/fixtures/cover.rs index b0b6f56c..3d900eec 100644 --- a/crates/grida/examples/fixtures/cover.rs +++ b/crates/grida/examples/fixtures/cover.rs @@ -131,6 +131,7 @@ pub(crate) fn build() -> Scene { height: 1100.0, }, fills: Paints::new(vec![Paint::RadialGradient(RadialGradientPaint { + geometry: None, active: true, transform: AffineTransform::default(), stops: vec![ @@ -190,6 +191,7 @@ pub(crate) fn build() -> Scene { height: 1000.0, }, fills: Paints::new(vec![Paint::RadialGradient(RadialGradientPaint { + geometry: None, active: true, transform: AffineTransform::default(), stops: vec![ diff --git a/crates/grida/examples/fixtures/l0_paints_stack.rs b/crates/grida/examples/fixtures/l0_paints_stack.rs index 3b502b06..dc2ae251 100644 --- a/crates/grida/examples/fixtures/l0_paints_stack.rs +++ b/crates/grida/examples/fixtures/l0_paints_stack.rs @@ -56,6 +56,7 @@ pub(crate) fn build() -> Scene { }), // [2] radial gradient yellow center→transparent Paint::RadialGradient(RadialGradientPaint { + geometry: None, active: true, transform: AffineTransform::default(), stops: vec![ diff --git a/crates/grida/src/import/svg/paint.rs b/crates/grida/src/import/svg/paint.rs index a36787d0..0312b6ca 100644 --- a/crates/grida/src/import/svg/paint.rs +++ b/crates/grida/src/import/svg/paint.rs @@ -99,6 +99,7 @@ fn svg_radial_gradient_to_paint( Paint::RadialGradient(RadialGradientPaint { active: true, transform: gradient_transform.compose(&alignment), + geometry: None, stops: radial.stops.clone(), opacity, blend_mode: BlendMode::Normal, diff --git a/crates/grida/src/io/io_grida_fbs.rs b/crates/grida/src/io/io_grida_fbs.rs index 48fd0711..092e8325 100644 --- a/crates/grida/src/io/io_grida_fbs.rs +++ b/crates/grida/src/io/io_grida_fbs.rs @@ -877,6 +877,7 @@ fn decode_paint_item(item: &fbs::PaintStackItem<'_>) -> Option { Some(Paint::RadialGradient(RadialGradientPaint { active: rgp.active(), transform, + geometry: None, stops, opacity: rgp.opacity(), blend_mode: decode_blend_mode(rgp.blend_mode()), @@ -2355,6 +2356,11 @@ use crate::node::schema::NodeId; /// - `id_map`: maps internal `NodeId` → string IDs. /// /// Returns the encoded bytes (including the `"GRID"` file identifier). +/// +/// # Panics +/// +/// Panics if a radial paint carries explicit ordered circles: the frozen +/// format cannot encode that geometry. It is never silently omitted. pub fn encode( scene: &Scene, scene_id: &str, @@ -2424,6 +2430,11 @@ pub fn encode( /// Each entry is `(scene_id, scene, id_map, position_map)`. /// All scenes share the same flat `nodes` vector; each scene's nodes /// are prefixed with a scene-type NodeSlot that references `scene_id`. +/// +/// # Panics +/// +/// Like [`encode`], refuses explicit radial circles by a named panic because +/// the frozen format has no representation for them. #[allow(clippy::type_complexity)] pub fn encode_multi( entries: &[( @@ -2910,6 +2921,10 @@ fn encode_paint_raw<'a, A: flatbuffers::Allocator + 'a>( Some((fbs::Paint::LinearGradientPaint, lgp.as_union_value())) } Paint::RadialGradient(rg) => { + assert!( + rg.geometry.is_none(), + "the frozen .grida format cannot encode explicit radial gradient circles" + ); let stops = encode_gradient_stops(fbb, &rg.stops); let transform = encode_affine_to_cg_transform(&rg.transform); let rgp = fbs::RadialGradientPaint::create( diff --git a/crates/grida/src/painter/gradient.rs b/crates/grida/src/painter/gradient.rs index 2983b689..14418f47 100644 --- a/crates/grida/src/painter/gradient.rs +++ b/crates/grida/src/painter/gradient.rs @@ -103,6 +103,12 @@ pub fn linear_gradient_shader( } } +/// Build the legacy paint while preserving explicitly ordered radial circles. +/// +/// # Panics +/// Panics if explicit circles are invalid or cannot construct a backend +/// shader. This legacy API has no typed error channel; it must not replace +/// unsupported explicit geometry with an unshaded paint. pub fn radial_gradient_paint( gradient: &RadialGradientPaint, (x, y): (f32, f32), @@ -114,9 +120,7 @@ pub fn radial_gradient_paint( matrix.pre_concat(&sk_matrix(gradient.transform.matrix)); let grad = make_gradient(&colors, &positions, gradient.tile_mode.into_skia()); - if let Some(shader) = - skia_safe::shaders::radial_gradient(((0.5_f32, 0.5_f32), 0.5_f32), &grad, Some(&matrix)) - { + if let Some(shader) = radial_geometry_shader(gradient.geometry, &grad, &matrix) { paint.set_shader(shader); } @@ -125,6 +129,11 @@ pub fn radial_gradient_paint( paint } +/// Build the legacy radial shader with the same explicit-circle boundary as +/// [`radial_gradient_paint`]. +/// +/// # Panics +/// Panics if explicit circles are invalid or the backend rejects the shader. pub fn radial_gradient_shader( gradient: &RadialGradientPaint, (x, y): (f32, f32), @@ -135,8 +144,7 @@ pub fn radial_gradient_shader( matrix.pre_concat(&sk_matrix(gradient.transform.matrix)); let grad = make_gradient(&colors, &positions, gradient.tile_mode.into_skia()); - let shader = - skia_safe::shaders::radial_gradient(((0.5_f32, 0.5_f32), 0.5_f32), &grad, Some(&matrix))?; + let shader = radial_geometry_shader(gradient.geometry, &grad, &matrix)?; if gradient.opacity < 1.0 { let opacity_color = @@ -152,6 +160,117 @@ pub fn radial_gradient_shader( } } +/// The legacy callers have no typed paint-error channel. Preserve their old +/// absent-geometry path, but fail loudly if explicit circles are invalid or +/// cannot be lowered; returning None would let callers paint a fallback. +fn radial_geometry_shader( + geometry: Option, + gradient: &Gradient<'_>, + matrix: &skia_safe::Matrix, +) -> Option { + let Some(geometry) = geometry else { + return skia_safe::shaders::radial_gradient(((0.5, 0.5), 0.5), gradient, Some(matrix)); + }; + for circle in [geometry.start, geometry.end] { + assert!( + circle.center.0.is_finite() + && circle.center.1.is_finite() + && circle.radius.is_finite() + && circle.radius >= 0.0, + "invalid explicit radial gradient circle at the legacy painter boundary" + ); + } + Some( + skia_safe::shaders::two_point_conical_gradient( + (geometry.start.center, geometry.start.radius), + (geometry.end.center, geometry.end.radius), + gradient, + Some(matrix), + ) + .expect("explicit radial gradient circles cannot be lowered by the legacy painter"), + ) +} + +#[cfg(test)] +mod radial_circle_tests { + use super::*; + + fn radial(geometry: Option) -> RadialGradientPaint { + RadialGradientPaint { + geometry, + ..RadialGradientPaint::from_colors(vec![CGColor::RED, CGColor::BLUE]) + } + } + + fn pixels(gradient: &RadialGradientPaint) -> Vec { + let mut surface = skia_safe::surfaces::raster_n32_premul((64, 64)).unwrap(); + surface.canvas().clear(skia_safe::Color::GREEN); + surface.canvas().draw_rect( + skia_safe::Rect::from_wh(64.0, 64.0), + &radial_gradient_paint(gradient, (64.0, 64.0)), + ); + let info = skia_safe::ImageInfo::new( + (64, 64), + skia_safe::ColorType::RGBA8888, + skia_safe::AlphaType::Unpremul, + None, + ); + let mut bytes = vec![0; 64 * 64 * 4]; + assert!(surface.read_pixels(&info, &mut bytes, 64 * 4, (0, 0))); + bytes + } + + #[test] + fn legacy_radial_painter_keeps_ordered_circles_and_the_unpainted_domain() { + let geometry = RadialGradientGeometry { + start: RadialGradientCircle { + center: (-0.25, 0.5), + radius: 0.125, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + let plain = pixels(&radial(None)); + let painted = pixels(&radial(Some(geometry))); + assert_ne!(plain, painted, "the new geometry cannot be ignored"); + assert!( + painted + .chunks_exact(4) + .any(|pixel| pixel == [0, 255, 0, 255]), + "no-solution exterior preserves the backdrop" + ); + assert_ne!( + painted, + pixels(&radial(Some(RadialGradientGeometry { + start: geometry.end, + end: geometry.start + }))), + "circle order is semantic" + ); + assert!(radial_gradient_shader(&radial(Some(geometry)), (64.0, 64.0)).is_some()); + } + + #[test] + #[should_panic( + expected = "invalid explicit radial gradient circle at the legacy painter boundary" + )] + fn legacy_radial_painter_cannot_turn_an_invalid_circle_into_a_fallback() { + let geometry = RadialGradientGeometry { + start: RadialGradientCircle { + center: (f32::NAN, 0.5), + radius: 0.0, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + let _ = radial_gradient_paint(&radial(Some(geometry)), (64.0, 64.0)); + } +} + pub fn sweep_gradient_paint(gradient: &SweepGradientPaint, (x, y): (f32, f32)) -> skia_safe::Paint { let mut paint = skia_safe::Paint::default(); let (colors, positions) = build_gradient_stops(&gradient.stops, 1.0); diff --git a/crates/grida/tests/fbs_roundtrip.rs b/crates/grida/tests/fbs_roundtrip.rs index 075faa45..3466a9ec 100644 --- a/crates/grida/tests/fbs_roundtrip.rs +++ b/crates/grida/tests/fbs_roundtrip.rs @@ -204,6 +204,7 @@ fn linear_gradient() -> Paint { fn radial_gradient() -> Paint { Paint::RadialGradient(RadialGradientPaint { + geometry: None, active: true, transform: AffineTransform::default(), stops: vec![ @@ -1345,6 +1346,80 @@ fn gen_all_paint_types() { assert_roundtrip_scene(&scene, "s1", "all_paint_types"); } +#[test] +fn frozen_format_rejects_explicit_radial_circles_instead_of_losing_them() { + let Paint::RadialGradient(mut paint) = radial_gradient() else { + unreachable!() + }; + paint.geometry = Some(RadialGradientGeometry { + start: RadialGradientCircle { + center: (0.25, 0.375), + radius: 0.125, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.0, + }, + }); + for (active, in_stroke) in [(true, false), (false, false), (true, true), (false, true)] { + let mut paint = paint.clone(); + paint.active = active; + let radial = Paints::new([solid(22, 163, 74, 255), Paint::RadialGradient(paint)]); + let node = Node::Rectangle(RectangleNodeRec { + active: true, + opacity: 1.0, + blend_mode: LayerBlendMode::PassThrough, + mask: None, + transform: AffineTransform::identity(), + size: Size { + width: 64.0, + height: 64.0, + }, + corner_radius: RectangularCornerRadius::default(), + corner_smoothing: CornerSmoothing(0.0), + fills: if in_stroke { + Paints::default() + } else { + radial.clone() + }, + strokes: if in_stroke { radial } else { Paints::default() }, + stroke_style: StrokeStyle::default(), + stroke_width: StrokeWidth::Uniform(0.0), + effects: LayerEffects::default(), + layout_child: None, + }); + let scene = build_scene( + "RadialCircles", + None, + vec![(1, node)], + HashMap::new(), + vec![1], + ); + let mut ids = HashMap::new(); + let mut positions = HashMap::new(); + build_maps(&scene, &mut ids, &mut positions); + for multi in [false, true] { + let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + if multi { + io_grida_fbs::encode_multi(&[("s1", &scene, &ids, &positions)]) + } else { + io_grida_fbs::encode(&scene, "s1", &ids, &positions) + } + })); + let error = result.expect_err("encoding must not omit circles or drop a paint entry"); + let reason = error + .downcast_ref::() + .map(String::as_str) + .or_else(|| error.downcast_ref::<&str>().copied()) + .unwrap_or(""); + assert_eq!( + reason, + "the frozen .grida format cannot encode explicit radial gradient circles" + ); + } + } +} + // ─── All effects on a single node ─────────────────────────────────────────── #[test] diff --git a/crates/n0-model/README.md b/crates/n0-model/README.md index 10a3f00f..b358e9e0 100644 --- a/crates/n0-model/README.md +++ b/crates/n0-model/README.md @@ -124,6 +124,14 @@ image `src` remains a logical RID and parsing performs no path I/O. Per-paint `visible`, `opacity`, and `blend-mode` lower directly to model state. Solid and stop opacity intentionally quantize into RGBA8 alpha. +The runtime radial paint can also carry ordered start/end circles in direct +gradient-local coordinates. Neither Draft 0 nor historical TextIr spells +this optional geometry: Draft 0 reads the original centered radial and its +writer refuses every present circle pair, including inactive paints and run +or stroke paints. Model validation rejects nonfinite centers and nonfinite or +negative radii, but permits zero, exterior, reversed-size, and equal circles; +backend support for such facts remains a separate admission check. + Paintable nodes also carry ordered `Vec` state. Each stroke owns its own existing `Paints` plus width, alignment, cap, join, miter, and dash geometry. Repeated strokes therefore remain independent and lossless; lines diff --git a/crates/n0-model/src/model.rs b/crates/n0-model/src/model.rs index 06f32942..1210fa1b 100644 --- a/crates/n0-model/src/model.rs +++ b/crates/n0-model/src/model.rs @@ -1030,7 +1030,13 @@ impl Default for LinearGradientPaint { #[derive(Debug, Clone, PartialEq)] pub struct RadialGradientPaint { pub active: bool, + /// Maps gradient-local coordinates into the target box's normalized space; + /// final placement is `scale(width, height) × transform`. pub transform: Affine, + /// Ordered circles, or the original centered radial when absent: start + /// `(0.5, 0.5), r=0`, end `(0.5, 0.5), r=0.5`. Present geometry is preserved + /// verbatim, never converted through alignment coordinates or normalized. + pub geometry: Option, pub stops: Vec, pub opacity: f32, pub blend_mode: BlendMode, @@ -1042,6 +1048,7 @@ impl Default for RadialGradientPaint { RadialGradientPaint { active: true, transform: Affine::IDENTITY, + geometry: None, stops: vec![], opacity: 1.0, blend_mode: BlendMode::Normal, @@ -1050,6 +1057,23 @@ impl Default for RadialGradientPaint { } } +/// One intrinsic gradient-local circle, before paint placement. The direct +/// `(x, y)` center is finite and unbounded; radius is finite and nonnegative. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct RadialGradientCircle { + pub center: (f32, f32), + pub radius: f32, +} + +/// Offset-zero and offset-one circles, in that order. Zero radii, exterior +/// centers, a larger start radius, and equal circles are representable facts. +/// Backends must paint or refuse them, never swap, clamp, or silently drop them. +#[derive(Debug, Clone, Copy, PartialEq)] +pub struct RadialGradientGeometry { + pub start: RadialGradientCircle, + pub end: RadialGradientCircle, +} + #[derive(Debug, Clone, PartialEq)] pub struct SweepGradientPaint { pub active: bool, diff --git a/crates/n0-model/src/renderability.rs b/crates/n0-model/src/renderability.rs index aad251d7..ae145b4d 100644 --- a/crates/n0-model/src/renderability.rs +++ b/crates/n0-model/src/renderability.rs @@ -320,6 +320,20 @@ pub fn validate_paint(paint: &Paint) -> Result<(), RenderabilityError> { Paint::RadialGradient(gradient) => { validate_opacity(gradient.opacity, "gradient")?; validate_affine(gradient.transform, "gradient")?; + if let Some(geometry) = gradient.geometry { + for (name, circle) in [("start", geometry.start), ("end", geometry.end)] { + if !circle.center.0.is_finite() || !circle.center.1.is_finite() { + return Err(RenderabilityError::new(format!( + "radial gradient {name} circle center must be finite" + ))); + } + if !circle.radius.is_finite() || circle.radius < 0.0 { + return Err(RenderabilityError::new(format!( + "radial gradient {name} circle radius must be finite and nonnegative" + ))); + } + } + } validate_gradient_stops(&gradient.stops, "gradient") } Paint::SweepGradient(gradient) => { diff --git a/crates/n0-model/src/textir.rs b/crates/n0-model/src/textir.rs index 3d3c6048..3682e649 100644 --- a/crates/n0-model/src/textir.rs +++ b/crates/n0-model/src/textir.rs @@ -591,6 +591,7 @@ fn parse_gradient( Paint::RadialGradient(RadialGradientPaint { active: common.active, transform, + geometry: None, stops, opacity: common.opacity, blend_mode: common.blend_mode, @@ -2602,13 +2603,20 @@ fn write_gradient(paint: &Paint, depth: usize, out: &mut String) -> Result<(), S Some(gradient.tile_mode), Some((gradient.xy1, gradient.xy2)), ), - Paint::RadialGradient(gradient) => ( - "radial", - gradient.transform, - gradient.stops.as_slice(), - Some(gradient.tile_mode), - None, - ), + Paint::RadialGradient(gradient) => { + if gradient.geometry.is_some() { + return Err( + " ordered circle geometry is not representable in Draft 0".into(), + ); + } + ( + "radial", + gradient.transform, + gradient.stops.as_slice(), + Some(gradient.tile_mode), + None, + ) + } Paint::SweepGradient(gradient) => ( "sweep", gradient.transform, diff --git a/crates/n0-model/tests/paint_rfd_conformance.rs b/crates/n0-model/tests/paint_rfd_conformance.rs index af5d8bf2..781da3bf 100644 --- a/crates/n0-model/tests/paint_rfd_conformance.rs +++ b/crates/n0-model/tests/paint_rfd_conformance.rs @@ -101,6 +101,8 @@ struct PaintObservation { struct GradientObservation { kind: PaintKind, endpoints: Option<([u32; 2], [u32; 2])>, + /// Start center/radius, then end center/radius: order and bits are facts. + radial_geometry: Option<([u32; 3], [u32; 3])>, tile: Option, transform_bits: [u32; 6], stop_count: usize, @@ -113,6 +115,13 @@ struct GradientObservation { blend: Blend, } +impl GradientObservation { + fn with_radial_geometry(mut self, geometry: Option<([u32; 3], [u32; 3])>) -> Self { + self.radial_geometry = geometry; + self + } +} + #[derive(Debug, Clone, PartialEq, Eq)] enum ResourceObservation { Hash(String), @@ -312,6 +321,7 @@ impl Cg { ) -> GradientObservation { GradientObservation { kind, + radial_geometry: None, endpoints: endpoints.map(|(from, to)| { ( [from.0.to_bits(), from.1.to_bits()], @@ -581,6 +591,7 @@ impl PaintVocabulary for Cg { let cg::RadialGradientPaint { active: radial_active, transform: radial_transform, + geometry: radial_geometry, stops: radial_stops, opacity: radial_opacity, blend_mode: radial_blend, @@ -620,7 +631,21 @@ impl PaintVocabulary for Cg { radial_active, radial_opacity, radial_blend, - ), + ) + .with_radial_geometry(radial_geometry.map(|geometry| { + ( + [ + geometry.start.center.0.to_bits(), + geometry.start.center.1.to_bits(), + geometry.start.radius.to_bits(), + ], + [ + geometry.end.center.0.to_bits(), + geometry.end.center.1.to_bits(), + geometry.end.radius.to_bits(), + ], + ) + })), Self::gradient( PaintKind::Sweep, None, @@ -674,6 +699,7 @@ impl PaintVocabulary for Cg { let cg::RadialGradientPaint { active: radial_active, transform: radial_transform, + geometry: radial_geometry, stops: radial_stops, opacity: radial_opacity, blend_mode: radial_blend, @@ -681,6 +707,16 @@ impl PaintVocabulary for Cg { } = cg::RadialGradientPaint { active: false, transform, + geometry: Some(cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (-2.25, 0.375), + radius: 1.75, + }, + end: cg::RadialGradientCircle { + center: (3.5, -0.625), + radius: 0.0, + }, + }), stops: stops.clone(), opacity: 0.625, blend_mode: cg::BlendMode::SoftLight, @@ -733,7 +769,21 @@ impl PaintVocabulary for Cg { radial_active, radial_opacity, radial_blend, - ), + ) + .with_radial_geometry(radial_geometry.map(|geometry| { + ( + [ + geometry.start.center.0.to_bits(), + geometry.start.center.1.to_bits(), + geometry.start.radius.to_bits(), + ], + [ + geometry.end.center.0.to_bits(), + geometry.end.center.1.to_bits(), + geometry.end.radius.to_bits(), + ], + ) + })), Self::gradient( PaintKind::Sweep, None, @@ -1035,6 +1085,7 @@ impl N0 { ) -> GradientObservation { GradientObservation { kind, + radial_geometry: None, endpoints: endpoints.map(|(from, to)| { ( [from.0.to_bits(), from.1.to_bits()], @@ -1301,6 +1352,7 @@ impl PaintVocabulary for N0 { let n::RadialGradientPaint { active: radial_active, transform: radial_transform, + geometry: radial_geometry, stops: radial_stops, opacity: radial_opacity, blend_mode: radial_blend, @@ -1340,7 +1392,21 @@ impl PaintVocabulary for N0 { radial_active, radial_opacity, radial_blend, - ), + ) + .with_radial_geometry(radial_geometry.map(|geometry| { + ( + [ + geometry.start.center.0.to_bits(), + geometry.start.center.1.to_bits(), + geometry.start.radius.to_bits(), + ], + [ + geometry.end.center.0.to_bits(), + geometry.end.center.1.to_bits(), + geometry.end.radius.to_bits(), + ], + ) + })), Self::gradient( PaintKind::Sweep, None, @@ -1402,6 +1468,7 @@ impl PaintVocabulary for N0 { let n::RadialGradientPaint { active: radial_active, transform: radial_transform, + geometry: radial_geometry, stops: radial_stops, opacity: radial_opacity, blend_mode: radial_blend, @@ -1409,6 +1476,16 @@ impl PaintVocabulary for N0 { } = n::RadialGradientPaint { active: false, transform, + geometry: Some(n::RadialGradientGeometry { + start: n::RadialGradientCircle { + center: (-2.25, 0.375), + radius: 1.75, + }, + end: n::RadialGradientCircle { + center: (3.5, -0.625), + radius: 0.0, + }, + }), stops: stops.clone(), opacity: 0.625, blend_mode: n::BlendMode::SoftLight, @@ -1461,7 +1538,21 @@ impl PaintVocabulary for N0 { radial_active, radial_opacity, radial_blend, - ), + ) + .with_radial_geometry(radial_geometry.map(|geometry| { + ( + [ + geometry.start.center.0.to_bits(), + geometry.start.center.1.to_bits(), + geometry.start.radius.to_bits(), + ], + [ + geometry.end.center.0.to_bits(), + geometry.end.center.1.to_bits(), + geometry.end.radius.to_bits(), + ], + ) + })), Self::gradient( PaintKind::Sweep, None, @@ -1739,6 +1830,7 @@ fn expected_gradient_defaults() -> Vec { vec![ GradientObservation { kind: PaintKind::Linear, + radial_geometry: None, endpoints: Some(( [(-1.0_f32).to_bits(), 0.0_f32.to_bits()], [1.0_f32.to_bits(), 0.0_f32.to_bits()], @@ -1760,6 +1852,7 @@ fn expected_gradient_defaults() -> Vec { }, GradientObservation { kind: PaintKind::Radial, + radial_geometry: None, endpoints: None, tile: Some(Tile::Clamp), transform_bits: [ @@ -1778,6 +1871,7 @@ fn expected_gradient_defaults() -> Vec { }, GradientObservation { kind: PaintKind::Sweep, + radial_geometry: None, endpoints: None, tile: None, transform_bits: [ @@ -1796,6 +1890,7 @@ fn expected_gradient_defaults() -> Vec { }, GradientObservation { kind: PaintKind::Diamond, + radial_geometry: None, endpoints: None, tile: None, transform_bits: [ @@ -1826,6 +1921,7 @@ fn expected_gradient_sentinels() -> Vec { ]; let common = |kind, endpoints, tile| GradientObservation { kind, + radial_geometry: None, endpoints, tile, transform_bits, @@ -1847,7 +1943,14 @@ fn expected_gradient_sentinels() -> Vec { )), Some(Tile::Mirror), ), - common(PaintKind::Radial, None, Some(Tile::Decal)), + common(PaintKind::Radial, None, Some(Tile::Decal)).with_radial_geometry(Some(( + [ + (-2.25_f32).to_bits(), + 0.375_f32.to_bits(), + 1.75_f32.to_bits(), + ], + [3.5_f32.to_bits(), (-0.625_f32).to_bits(), 0.0_f32.to_bits()], + ))), common(PaintKind::Sweep, None, None), common(PaintKind::Diamond, None, None), ] diff --git a/crates/n0-model/tests/radial_geometry.rs b/crates/n0-model/tests/radial_geometry.rs new file mode 100644 index 00000000..1e1819bd --- /dev/null +++ b/crates/n0-model/tests/radial_geometry.rs @@ -0,0 +1,215 @@ +//! Model-boundary laws for ordered radial circles, independent of a painter. + +use n0_model::model::*; +use n0_model::n0_xml::{self, PrintError}; +use n0_model::properties::{PropertyKey, PropertyTarget, PropertyValue, PropertyValues, ValueView}; +use n0_model::renderability::validate_paint; + +const SOURCE: &str = r##""##; + +fn source() -> (Document, NodeId) { + let doc = n0_xml::parse(SOURCE).unwrap(); + let container = doc.get(doc.root).children[0]; + let rect = doc.get(container).children[0]; + (doc, rect) +} + +fn circle(x: f32, y: f32, radius: f32) -> RadialGradientCircle { + RadialGradientCircle { + center: (x, y), + radius, + } +} + +fn paint(geometry: RadialGradientGeometry) -> Paint { + Paint::RadialGradient(RadialGradientPaint { + geometry: Some(geometry), + stops: vec![ + GradientStop { + offset: 0.0, + color: Color::BLACK.into(), + }, + GradientStop { + offset: 1.0, + color: Color(0xffff_ffff).into(), + }, + ], + ..Default::default() + }) +} + +fn projected( + doc: &Document, + node: NodeId, + paint: Paint, +) -> Result { + PropertyValues::new( + doc, + [( + PropertyTarget::new(doc.key_of(node).unwrap(), PropertyKey::Fills), + PropertyValue::Paints(Paints::new([paint])), + )], + ) +} + +#[test] +fn zero_exterior_reversed_and_equal_circles_are_valid_facts() { + let (doc, rect) = source(); + for (start, end) in [ + (circle(0.5, 0.5, 0.0), circle(0.5, 0.5, 0.5)), + (circle(-2.25, 3.5, 1.75), circle(0.5, 0.5, 0.0)), + (circle(0.0, 0.0, 0.0), circle(1.0, 1.0, 0.0)), + (circle(0.5, 0.5, 0.5), circle(0.5, 0.5, 0.5)), + (circle(0.5, 0.5, 0.0), circle(0.5, 0.5, 0.0)), + (circle(f32::MAX, -f32::MAX, f32::MAX), circle(0.0, 0.0, 0.0)), + ] { + let paint = paint(RadialGradientGeometry { start, end }); + validate_paint(&paint).unwrap(); + let values = projected(&doc, rect, paint.clone()).unwrap(); + assert_eq!(ValueView::new(&doc, &values).unwrap().fills(rect)[0], paint); + } +} + +#[test] +fn every_nonfinite_component_and_negative_radius_is_rejected_at_admission() { + let (doc, rect) = source(); + for is_end in [false, true] { + for component in 0..3 { + for invalid in [f32::NAN, f32::INFINITY, f32::NEG_INFINITY, -1.0] { + if component != 2 && invalid == -1.0 { + continue; + } + let mut geometry = RadialGradientGeometry { + start: circle(0.25, 0.375, 0.125), + end: circle(0.5, 0.625, 0.75), + }; + let circle = if is_end { + &mut geometry.end + } else { + &mut geometry.start + }; + match component { + 0 => circle.center.0 = invalid, + 1 => circle.center.1 = invalid, + _ => circle.radius = invalid, + } + let paint = paint(geometry); + let message = validate_paint(&paint).unwrap_err().to_string(); + let role = if is_end { "end" } else { "start" }; + let field = if component == 2 { "radius" } else { "center" }; + assert!( + message.contains(&format!("radial gradient {role} circle {field}")), + "{message}" + ); + assert!( + projected(&doc, rect, paint).is_err(), + "{role} {field}={invalid}" + ); + } + } + } +} + +#[test] +fn model_copy_keeps_direct_coordinate_bits_and_circle_order() { + let (doc, rect) = source(); + let geometry = RadialGradientGeometry { + start: circle(f32::from_bits(1), -0.0, 1.75), + end: circle(3.5, -2.25, 0.0), + }; + let values = projected(&doc, rect, paint(geometry)).unwrap().clone(); + let view = ValueView::new(&doc, &values).unwrap(); + let Paint::RadialGradient(paint) = &view.fills(rect)[0] else { + panic!("radial fact") + }; + let geometry = paint.geometry.unwrap(); + assert_eq!( + [ + geometry.start.center.0.to_bits(), + geometry.start.center.1.to_bits(), + geometry.start.radius.to_bits() + ], + [1, 0x8000_0000, 0x3fe0_0000] + ); + assert_eq!( + [ + geometry.end.center.0.to_bits(), + geometry.end.center.1.to_bits(), + geometry.end.radius.to_bits() + ], + [0x4060_0000, 0xc010_0000, 0] + ); +} + +#[test] +fn draft_zero_preserves_absence_and_refuses_every_present_circle_pair() { + let (mut doc, rect) = source(); + let printed = n0_xml::print(&doc).unwrap(); + let roundtrip = n0_xml::parse(&printed).unwrap(); + assert_eq!(doc, roundtrip); + let Paint::RadialGradient(original) = &doc.get(rect).fills[0] else { + panic!("radial fact") + }; + assert_eq!(original.geometry, None); + + for geometry in [ + RadialGradientGeometry { + start: circle(0.5, 0.5, 0.0), + end: circle(0.5, 0.5, 0.5), + }, + RadialGradientGeometry { + start: circle(-1.0, 2.0, 0.75), + end: circle(0.5, 0.5, 0.0), + }, + ] { + for active in [false, true] { + let mut paint = paint(geometry); + let Paint::RadialGradient(radial) = &mut paint else { + unreachable!() + }; + radial.active = active; + doc.get_mut(rect).fills = Paints::new([paint]); + assert!( + matches!(n0_xml::print(&doc), Err(PrintError::InvalidDocument(message)) + if message.contains("ordered circle geometry is not representable in Draft 0")) + ); + assert_eq!( + n0_model::textir::try_print(&doc).unwrap_err().0, + format!( + "node {rect} has a paint stack the historical TextIr dialect cannot represent" + ) + ); + } + } +} + +#[test] +fn draft_zero_cannot_drop_ordered_circles_from_strokes_or_run_overrides() { + let geometry = RadialGradientGeometry { + start: circle(-1.0, 2.0, 0.75), + end: circle(0.5, 0.5, 0.0), + }; + let (mut doc, rect) = source(); + let mut stroke = Stroke::default_for(&doc.get(rect).payload).unwrap(); + stroke.paints = Paints::new([paint(geometry)]); + doc.get_mut(rect).strokes.push(stroke); + assert!( + matches!(n0_xml::print(&doc), Err(PrintError::InvalidDocument(message)) + if message.contains("ordered circle geometry is not representable in Draft 0")) + ); + + let mut text = n0_xml::parse(r##"a"##).unwrap(); + let container = text.get(text.root).children[0]; + let id = text.get(container).children[0]; + let Payload::AttributedText { + attributed_string, .. + } = &mut text.get_mut(id).payload + else { + panic!("run-bearing text"); + }; + attributed_string.runs[0].fills = Some(Paints::new([paint(geometry)])); + assert!( + matches!(n0_xml::print(&text), Err(PrintError::InvalidDocument(message)) + if message.contains("ordered circle geometry is not representable in Draft 0")) + ); +} diff --git a/crates/n0/src/cache.rs b/crates/n0/src/cache.rs index 7ef0617c..18718ba6 100644 --- a/crates/n0/src/cache.rs +++ b/crates/n0/src/cache.rs @@ -20,10 +20,13 @@ //! rounded, dashed, translucent, or shaped geometry even when the translation //! is an integer. Fractional pan additionally resamples. Accurate static and //! exact-time export must execute the immutable frame product directly. +//! Explicit radial circle pairs are refused by node before cache or canvas +//! mutation: their measured translated-raster quantization is not admitted +//! by this preview policy. Direct immutable-frame execution carries them. use n0_model::animation::SampleError; use n0_model::math::Affine; -use n0_model::model::{Document, NodeKey}; +use n0_model::model::{Document, NodeId, NodeKey}; use n0_model::properties::{PropertyError, PropertyValues, ValueView}; use n0_model::resolve::{ResolveOptions, RotationInFlow}; use skia_safe::{Canvas, Color, FilterMode, Image, ImageInfo, MipmapMode, SamplingOptions}; @@ -47,6 +50,11 @@ pub enum SceneCacheError { Property(PropertyError), FrameBuild(FrameBuildError), FrameExecution(FrameExecutionError), + /// Translating the offscreen raster changes this paint's quantization. + /// Execute the immutable frame directly instead of using preview policy. + ExplicitRadialGeometry { + node: NodeId, + }, } impl std::fmt::Display for SceneCacheError { @@ -55,6 +63,8 @@ impl std::fmt::Display for SceneCacheError { SceneCacheError::Property(error) => error.fmt(f), SceneCacheError::FrameBuild(error) => error.fmt(f), SceneCacheError::FrameExecution(error) => error.fmt(f), + SceneCacheError::ExplicitRadialGeometry { node } => write!(f, + "node {node}: the translated preview raster cache does not admit explicit radial gradient circles; execute the frame directly"), } } } @@ -418,6 +428,18 @@ impl SceneCache { .or(self.list.as_ref()) .expect("a retained raster has one drawlist"); + // The source-neutral geometry remains renderable; only this policy's + // +MARGIN raster-and-crop is unproved for it. Refuse before changing + // the canvas or any cache field, never silently substitute a raster. + // A retained list already passed this guard. Inspect replacements + // only: a clean camera pan must not gain an O(items) paint scan. + if let Some(node) = replacement + .as_ref() + .and_then(|input| explicit_radial_owner(&input.list)) + { + return Err(SceneCacheError::ExplicitRadialGeometry { node }); + } + let dx = view.e - self.ref_view.e; let dy = view.f - self.ref_view.f; let same_zoom = view.a == self.ref_view.a @@ -486,6 +508,48 @@ impl SceneCache { } } +fn explicit_radial_owner(list: &crate::drawlist::DrawList) -> Option { + use crate::drawlist::ItemKind; + use n0_model::model::{Paint, Paints}; + let contains = |paints: &Paints| { + paints.iter().any( + |paint| matches!(paint, Paint::RadialGradient(radial) if radial.geometry.is_some()), + ) + }; + list.items.iter().find_map(|item| { + let present = match &item.kind { + ItemKind::RectFill { paints, .. } + | ItemKind::OvalFill { paints, .. } + | ItemKind::PathFill { paints, .. } => contains(paints), + ItemKind::TextFill { paints, .. } => { + contains(&paints.node) || paints.runs.iter().flatten().flatten().any(contains) + } + ItemKind::RectStroke { stroke, .. } + | ItemKind::OvalStroke { stroke, .. } + | ItemKind::AbsoluteDashedOvalStroke { stroke, .. } + | ItemKind::LineStroke { stroke, .. } + | ItemKind::PathStroke { stroke, .. } + | ItemKind::TextStroke { stroke, .. } => contains(&stroke.paints), + ItemKind::PatternFill { pattern, .. } | ItemKind::PatternStroke { pattern, .. } => { + explicit_radial_owner(&pattern.program).is_some() + } + ItemKind::BeginOpacity { .. } + | ItemKind::BeginIsolatedOpacity { .. } + | ItemKind::EndOpacity + | ItemKind::BeginClipRect { .. } + | ItemKind::BeginClipPath { .. } + | ItemKind::EndClip + | ItemKind::BeginMaskContent + | ItemKind::BeginMaskSource { .. } + | ItemKind::EndMaskSource + | ItemKind::EndMaskContent + | ItemKind::BeginFilter { .. } + | ItemKind::EndFilter => false, + }; + present.then_some(item.node) + }) +} + /// Render one preview-composited frame to a fresh raster surface and return its /// bytes. Pairs with [`crate::paint::raster_to_bytes_unchecked`] in /// fixture-scoped cache equivalence probes. A fresh cache is passed so the diff --git a/crates/n0/src/glyphless.rs b/crates/n0/src/glyphless.rs index 7a79783d..48f1c64f 100644 --- a/crates/n0/src/glyphless.rs +++ b/crates/n0/src/glyphless.rs @@ -1384,6 +1384,18 @@ fn compile_paints(paints: &PaintStack, unit_offset: Option<(f32, f32)>) -> Paint Paint::RadialGradient(n0_model::model::RadialGradientPaint { active: gradient.active, transform: compile_gradient_transform(&gradient.transform, unit_offset), + geometry: gradient.geometry.map(|geometry| { + n0_model::model::RadialGradientGeometry { + start: n0_model::model::RadialGradientCircle { + center: geometry.start.center, + radius: geometry.start.radius, + }, + end: n0_model::model::RadialGradientCircle { + center: geometry.end.center, + radius: geometry.end.radius, + }, + } + }), stops: compile_gradient_stops(&gradient.stops), opacity: gradient.opacity, blend_mode: BlendMode::Normal, @@ -2450,6 +2462,172 @@ mod tests { assert!(reason.contains("invertible"), "unexpected reason: {reason}"); } + fn radial_circle_stack(geometry: cg::RadialGradientGeometry) -> PaintStack { + PaintStack::try_from_paints(CgPaints::new([CgPaint::RadialGradient( + cg::RadialGradientPaint { + geometry: Some(geometry), + ..cg::RadialGradientPaint::from_colors(vec![CGColor::RED, CGColor::BLUE]) + }, + )])) + .unwrap() + } + + #[test] + fn radial_circles_cross_the_seam_without_normalization_or_reordering() { + let geometry = cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (-1.25, 2.5), + radius: 0.75, + }, + end: cg::RadialGradientCircle { + center: (0.375, 0.625), + radius: 0.0, + }, + }; + let compiled = compile_paints(&radial_circle_stack(geometry), None); + let Paint::RadialGradient(paint) = &compiled[0] else { + panic!("radial paint") + }; + let circles = paint.geometry.unwrap(); + assert_eq!(circles.start.center, (-1.25, 2.5)); + assert_eq!(circles.start.radius, 0.75); + assert_eq!(circles.end.center, (0.375, 0.625)); + assert_eq!(circles.end.radius, 0.0); + } + + #[test] + fn explicit_radial_circles_are_preflighted_at_the_source_owner() { + let valid = cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (0.25, 0.375), + radius: 0.125, + }, + end: cg::RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + for geometry in [ + valid, + cg::RadialGradientGeometry { + end: cg::RadialGradientCircle { + radius: 0.0, + ..valid.end + }, + ..valid + }, + cg::RadialGradientGeometry { + start: valid.end, + ..valid + }, + ] { + compile(resolved_frame(radial_circle_stack(geometry))).expect("finite ordered circles"); + } + for (center, radius) in [ + ((f32::NAN, 0.5), 0.125), + ((0.25, f32::INFINITY), 0.125), + ((0.25, 0.375), -0.125), + ((0.25, 0.375), f32::INFINITY), + ] { + let geometry = cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { center, radius }, + ..valid + }; + let error = compile(resolved_frame(radial_circle_stack(geometry))) + .expect_err("invalid circle before any painter call"); + let BuildError::Paint { owner, reason } = error else { + panic!("wrong error: {error:?}") + }; + assert_eq!(owner, RECT_OWNER); + assert!(reason.contains("radial"), "{reason}"); + } + } + + #[test] + fn retained_radial_circle_frame_matches_fresh_after_other_frames() { + let geometry = cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (0.25, 0.375), + radius: 0.125, + }, + end: cg::RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + let build = |geometry| compile(resolved_frame(radial_circle_stack(geometry))).unwrap(); + let retained = build(geometry); + let context = PaintCtx::new(None); + let raster = |frame: &FrameProduct| { + frame + .raster_to_bytes(&AffineTransform::identity(), 64, 48, &context) + .unwrap() + }; + let original = raster(&retained); + let changed = build(cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + radius: 0.25, + ..geometry.start + }, + ..geometry + }); + assert_ne!( + original, + raster(&changed), + "the changed frame is a live control" + ); + assert_eq!(original, raster(&retained)); + assert_eq!(raster(&retained), raster(&build(geometry))); + } + + #[test] + fn a_radial_circle_change_damages_the_owning_paint() { + let geometry = cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (0.25, 0.375), + radius: 0.125, + }, + end: cg::RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }; + let before = compile(resolved_frame(radial_circle_stack(geometry))).unwrap(); + for geometry in [ + cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (0.75, 0.375), + ..geometry.start + }, + ..geometry + }, + cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + radius: 0.25, + ..geometry.start + }, + ..geometry + }, + cg::RadialGradientGeometry { + end: cg::RadialGradientCircle { + radius: 0.0, + ..geometry.end + }, + ..geometry + }, + ] { + let after = compile(resolved_frame(radial_circle_stack(geometry))).unwrap(); + assert!(!before.drawlist.raster_eq(&after.drawlist)); + assert_eq!( + diff_frame(&before, &after), + Damage { + changed: vec![RECT_OWNER], + union_frame: Some(Rectangle::from_xywh(8.0, 6.0, 20.0, 16.0)) + } + ); + } + } + /// The source-neutral seam copies one checked local-space pattern exactly; /// it does not drop, repeat, scale, renormalize, or otherwise reinterpret /// producer facts. diff --git a/crates/n0/src/paint.rs b/crates/n0/src/paint.rs index 0fffe582..84ef6cd7 100644 --- a/crates/n0/src/paint.rs +++ b/crates/n0/src/paint.rs @@ -1175,7 +1175,15 @@ fn radial_gradient_shader_mapped( let (colors, positions) = gradient_stops(&paint.stops); let stops = gradient(&colors, &positions, sk_tile_mode(paint.tile_mode)); let matrix = mapped_paint_box_matrix(paint_box, &paint.transform, paint_to_canvas); - shaders::radial_gradient(((0.5, 0.5), 0.5), &stops, Some(&matrix)) + match paint.geometry { + None => shaders::radial_gradient(((0.5, 0.5), 0.5), &stops, Some(&matrix)), + Some(geometry) => shaders::two_point_conical_gradient( + (geometry.start.center, geometry.start.radius), + (geometry.end.center, geometry.end.radius), + &stops, + Some(&matrix), + ), + } } fn sweep_gradient_shader_mapped( diff --git a/crates/n0/tests/cache.rs b/crates/n0/tests/cache.rs index 162aaea4..4e42e15f 100644 --- a/crates/n0/tests/cache.rs +++ b/crates/n0/tests/cache.rs @@ -232,6 +232,73 @@ fn doc_dirty_forces_reraster_and_matches_fresh() { ); } +#[test] +fn radial_circle_preview_cache_refuses_without_changing_canvas_or_retained_state() { + let mut doc = scene(); + let view = Affine::IDENTITY; + let context = ctx(); + let mut cache = SceneCache::new(W, H); + let radial = |radius| { + Paint::RadialGradient(RadialGradientPaint { + geometry: Some(RadialGradientGeometry { + start: RadialGradientCircle { + center: (0.25, 0.375), + radius, + }, + end: RadialGradientCircle { + center: (0.5, 0.5), + radius: 0.5, + }, + }), + stops: vec![ + GradientStop { + offset: 0.0, + color: Color(0xffff0000).into(), + }, + GradientStop { + offset: 1.0, + color: Color(0xff0000ff).into(), + }, + ], + ..Default::default() + }) + }; + let original = doc.get(1).fills.clone(); + let (cold, _) = cached_frame_bytes(&mut cache, &doc, &view, &context, false); + doc.get_mut(1).fills = Paints::new([radial(0.125)]); + let direct = fresh_frame_bytes(&doc, &view, &context); + assert_eq!(direct, fresh_frame_bytes(&doc, &view, &context)); + let mut surface = surfaces::raster_n32_premul((W, H)).unwrap(); + surface.canvas().clear(SkColor::MAGENTA); + let before = n0::paint::read_pixels(&mut surface, W, H); + let error = cache + .frame(surface.canvas(), &doc, &opts(), &view, &context, true) + .unwrap_err(); + assert_eq!( + error, + n0::cache::SceneCacheError::ExplicitRadialGeometry { node: 1 } + ); + assert!(error.to_string().contains("execute the frame directly")); + assert_eq!( + before, + n0::paint::read_pixels(&mut surface, W, H), + "refusal precedes painting" + ); + doc.get_mut(1).fills = Paints::new([radial(0.25)]); + assert_ne!( + direct, + fresh_frame_bytes(&doc, &view, &context), + "radius change is visible in direct frames" + ); + doc.get_mut(1).fills = original; + let (recovered, rerastered) = cached_frame_bytes(&mut cache, &doc, &view, &context, false); + assert!( + !rerastered, + "refusal did not replace the retained source or raster" + ); + assert_eq!(cold, recovered); +} + #[test] fn cache_builds_text_with_the_same_shaping_oracle_as_a_fresh_frame() { let doc = text_scene(); diff --git a/crates/n0_cli/README.md b/crates/n0_cli/README.md index e0eec948..761f7c2c 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,157 Chromium-baked cells plus + cells. The complete primitive corpus contains 1,284 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 234 rows. `feFlood`, `feComposite`, + Bungee), and the named refusal register has 260 rows. `feFlood`, `feComposite`, `feMerge`, `feMergeNode`, `feDropShadow`, `feColorMatrix`, `feComponentTransfer`, `feBlend`, `feMorphology`, `feConvolveMatrix`, `feDiffuseLighting`, `feDistantLight`, `fePointLight`, `feSpotLight`, @@ -871,13 +871,32 @@ cargo run -p n0_cli --bin n0 -- \ or a non-gradient target); the measured correct nothings — zero stops (fallback unfired), a self-cycle, a non-invertible gradient transform, an object-bounding-box gradient on zero-area geometry — paint nothing. A - zero or negative radial radius and linear endpoints inside the backend's + zero or negative concentric radial radius and linear endpoints inside the backend's degenerate threshold resolve to the tile-specific measured solid: the last stop under `pad`, or the ramp's integral average under `reflect`/`repeat`. On zero-area line geometry, object-box paint is nothing before one-stop or degenerate classification; user-space one-stop and concentric degenerate ramps retain those source-neutral results before the live-gradient boundary. Two companion Chromium cells carry the complete unit/ordering split. + Radial `fx`/`fy`/`fr` carry signed finite numbers, percentages, and + case-insensitive `px` through the same guarded resource-length decoder. + Missing focus coordinates default to the final template-resolved `cx`/`cy`; + missing or negative `fr` resolves to zero. User-space focus percentages use + the viewport axes and `fr` uses its normalized diagonal; object-box values + use fraction space. The resolved paint preserves both circles in order, + including exterior focus, equal/reversed radii, and a zero end radius. + A one-stop explicit radial retains the conical transparent exterior instead + of filling the entire target. The default centered leaf remains unchanged. + The 127 `svg-radial-start-*` / `html-inline-svg-radial-start` cells cover + these branches, templates, mapped viewports, transforms, spread methods, + and admitted fill/stroke/resource/effect clients. Eight declare measured + one-code-value ramp bounds; the other 119 are byte-exact. This is a split, + not closure of the three attribute rows: precision aliases, CSS comments, + out-of-range used lengths, and wider computed value/context families still + refuse by the exact attribute. The shared paint contract's optional circle + pair adds no CSS matcher, external resource access, animation, or frozen + `.grida` format support. Direct frame execution carries the new paint; + translated preview raster caching refuses it by node before any mutation. The `` presentation attributes are consumed at their listed grammars (the stop rung). `stop-color` carries the `color` property's ``: hex in all four lengths, named colours, `transparent`, @@ -890,9 +909,9 @@ cargo run -p n0_cli --bin n0 -- \ the resolved contract carries that product **unquantized**, because the rasterizer interpolates the ramp before it quantizes. `initial`, `unset` and `revert` coincide with each attribute's initial and are admitted. - What refuses by name: a focal radial (`fx`/`fy` off - the center or `fr > 0` — the shared radial leaf is concentric), - `color-interpolation: linearRGB`, a degenerate paint server whose + What refuses by name: gradient geometry with source-number provenance + aliases, CSS comments, CSS-wide values, computed functions, or out-of-range + used values; `color-interpolation: linearRGB`; a degenerate paint server whose substituted colour does not land on a byte (Chromium keeps a dithering shader for those and no flat colour reproduces one — guarded as `svg-gradient-degenerate-precision`, and a gradient-geometry gap rather diff --git a/crates/rframe/README.md b/crates/rframe/README.md index 0790cd2c..92ce127a 100644 --- a/crates/rframe/README.md +++ b/crates/rframe/README.md @@ -69,13 +69,18 @@ helper never understates the mathematical bound. The vocabulary is deliberately narrower than SVG or CSS. Its ordinary leaves are solid, linear-gradient, and radial-gradient paints. A gradient is a -self-contained normal-blend color ramp stated in the unit square of the -geometry's own box. The alternative pattern value is likewise resolved: one +self-contained normal-blend color ramp with intrinsic gradient-local geometry +and affine placement in the painted geometry's box. A radial leaf may retain +an explicit ordered start/end circle pair, including exterior centers and +zero/equal/reversed radii, without renormalizing those six resolved scalars. +Absence preserves the original centered unit-circle form; the +[paint amendment](../../docs/wg/feat-painting/paint-model.md#amd-radial-circles) +states that boundary. The alternative pattern value is likewise resolved: one bounded immutable `FrameItems` program in tile-local coordinates, one positive tile extent, one finite tile-to-consumer transform, and no lookup key or resource handle. A paint that still _references_ an authored pattern, image -resource, or unresolved context-paint relationship remains inexpressible here; -so does a focal geometry the shared radial leaf cannot state. Source-level +resource, or unresolved context-paint relationship remains inexpressible here. +Source-level context paint is not a new render fact: a producer must select and fully rebase its eventual no-paint, leaf, or pattern result before this boundary, without carrying the context relation or its reference-box ownership into the frame. diff --git a/crates/rframe/tests/paint_stack.rs b/crates/rframe/tests/paint_stack.rs index 1bea5c22..ee9e646d 100644 --- a/crates/rframe/tests/paint_stack.rs +++ b/crates/rframe/tests/paint_stack.rs @@ -56,6 +56,16 @@ fn visible_gradients_are_admitted_with_their_fields_intact() { ..Default::default() }; let radial = RadialGradientPaint { + geometry: Some(cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (-0.25, 0.375), + radius: 0.75, + }, + end: cg::RadialGradientCircle { + center: (0.5, 0.625), + radius: 0.0, + }, + }), stops: ramp(), ..Default::default() }; diff --git a/crates/websem/src/svg_paint_server.rs b/crates/websem/src/svg_paint_server.rs index 48002ebb..e5db29c1 100644 --- a/crates/websem/src/svg_paint_server.rs +++ b/crates/websem/src/svg_paint_server.rs @@ -24,21 +24,20 @@ //! `currentColor` resolves against the stop's own computed `color`, and //! an unparseable `stop-color` (including the `inherit` keyword) is the //! initial black. -//! - The degenerate rules are the backend's own. A one-stop ramp is spatially -//! constant but retains gradient rasterization; zero/negative radial radius -//! and linear endpoints closer than the backend threshold resolve to a -//! solid — the last stop under `pad`, the ramp's integral average under -//! `reflect`/`repeat`. Resolving those cases here keeps downstream preflight -//! inside its checked gradient domain. +//! - A one-stop ramp retains gradient rasterization. Explicit radial circles +//! also retain their conical domain: a constant color does not paint its +//! transparent exterior. Only an implicit concentric zero/negative radial +//! radius collapses to a solid, like sufficiently close linear endpoints: +//! the last stop under `pad`, the integral average under `reflect`/`repeat`. //! - `gradientTransform` and an author `transform` declaration are one //! computed value (csscascade hints the attribute), applied about the raw //! origin of the gradient's own space; percentages in it are refused by //! name (Chromium resolves them against the viewport and then applies the //! number in fraction space — an incoherence this slice will not repeat). //! -//! What refuses by name: a focal radial (resolved `fx`/`fy` off the center, -//! or `fr > 0` — the shared radial leaf is concentric), font-relative or -//! viewport-relative units in gradient geometry, `color-interpolation: +//! What refuses by name: source-number provenance aliases, CSS comments, +//! computed functions, CSS-wide values, out-of-range used lengths, and +//! font-relative or viewport-relative units in gradient geometry; `color-interpolation: //! linearRGB`, author CSS on stops (`stop-color`/`stop-opacity` in a style //! attribute), resolved stop alpha or degenerate alpha staging that the RGBA8 //! paint contract cannot preserve, an external reference, and a user-space @@ -294,6 +293,7 @@ struct ResolvedStop { color: CGColor32F, } +#[derive(Clone, Copy)] enum GradientKind { Linear, Radial, @@ -371,13 +371,15 @@ pub(crate) fn resolve( return Ok(ResolvedPaintServer::Nothing); } - if stops.len() == 1 { + if stops.len() == 1 && matches!(kind, GradientKind::Linear) { // A one-stop ramp is spatially constant but retains the backend's // gradient material route (including dithering and paint-alpha // staging). Duplicate the sole resolved stop in a source-neutral - // constant gradient. Geometry and reference-box mappings are inert for - // a constant shader; the transform outcome above still decides the - // measured non-invertible nothing before this branch. + // constant gradient. Radial start-circle geometry is not inert even + // with one stop: Chromium leaves pixels outside the focal cone + // untouched, so radial gradients must inspect their geometry first. + // The transform outcome above still decides the measured + // non-invertible nothing before this branch. return Ok(constant_gradient(kind, stops[0].color, paint_opacity)); } @@ -1344,17 +1346,36 @@ fn resolve_radial( }); let fx = read("fx")?.unwrap_or(cx); let fy = read("fy")?.unwrap_or(cy); - let fr = read("fr")?.unwrap_or(0.0); + // Chromium resolves an erroneous negative radius to zero, preserving the + // other circle. Neither an exterior center nor a radius larger than the + // other circle is clamped. Preserve both circles in their resolved local + // coordinates: normalizing by r cannot represent a zero-radius end and + // can change the backend's float/degeneracy classification. + let fr = read("fr")?.unwrap_or(0.0).max(0.0); + let geometry = (fx != cx || fy != cy || fr > 0.0).then_some(cg::RadialGradientGeometry { + start: cg::RadialGradientCircle { + center: (fx, fy), + radius: fr, + }, + end: cg::RadialGradientCircle { + center: (cx, cy), + radius: r.max(0.0), + }, + }); - if fx != cx || fy != cy || fr > 0.0 { - return Err( - "the radial gradient has a focal point or focal radius, which the shared \ - radial paint leaf cannot state (concentric radials only)" - .to_string(), - ); + // Once focal geometry has been proved absent, a one-stop radial is the + // same spatially constant gradient this route has always emitted. Keep + // this before outer-radius degeneracy so the established one-stop + // material and opacity staging remain unchanged. + if stops.len() == 1 && geometry.is_none() { + return Ok(constant_gradient( + GradientKind::Radial, + stops[0].color, + paint_opacity, + )); } - if r <= 0.0 { + if r <= 0.0 && geometry.is_none() { // A non-positive radius reaches the same tile-specific backend // degeneracy as a collapsed linear ramp. Measured at zero: clamp is // the last stop, while repeat/reflect are the ramp's integral average. @@ -1381,8 +1402,8 @@ fn resolve_radial( }; } - // A non-positive radius is already a source-neutral solid. Only a live - // radial needs the context box/space. + // Only the implicit non-positive radius became a solid above. An explicit + // pair with a zero end still needs the context box/space. let Some((reference_box, reference_to_destination)) = reference_space()? else { return Ok(ResolvedPaintServer::Nothing); }; @@ -1392,11 +1413,15 @@ fn resolve_radial( return Ok(ResolvedPaintServer::Nothing); } - // The unit circle (center ½,½, radius ½) maps to the resolved circle - // through a similarity; objectBoundingBox composes in fraction space, - // user space returns through the box inverse. - let scale = 2.0 * r; - let similarity = AffineTransform::from_acebdf(scale, 0.0, cx - r, 0.0, scale, cy - r); + // The old implicit circle keeps its exact existing similarity. Explicit + // ordered circles already carry resolved local coordinates and need only + // the resource/client placement, not a second geometry normalization. + let similarity = if geometry.is_some() { + AffineTransform::identity() + } else { + let scale = 2.0 * r; + AffineTransform::from_acebdf(scale, 0.0, cx - r, 0.0, scale, cy - r) + }; let direct_reference = destination_box == reference_box && reference_to_destination == AffineTransform::identity(); let transform = match units { @@ -1420,7 +1445,23 @@ fn resolve_radial( cg::RadialGradientPaint { active: true, transform, - stops: cg_stops(&stops), + geometry, + stops: if stops.len() == 1 { + // A constant color ramp is not an infinite spatial domain. + // Keep the conical shader, including its unpainted exterior. + vec![ + cg::GradientStop { + offset: 0.0, + color: stops[0].color, + }, + cg::GradientStop { + offset: 1.0, + color: stops[0].color, + }, + ] + } else { + cg_stops(&stops) + }, opacity: paint_opacity, blend_mode: cg::BlendMode::Normal, tile_mode, diff --git a/crates/websem/tests/capability_status.rs b/crates/websem/tests/capability_status.rs index 772425d4..9ecdc91a 100644 --- a/crates/websem/tests/capability_status.rs +++ b/crates/websem/tests/capability_status.rs @@ -115,11 +115,10 @@ fn generate() -> String { writeln!(out, "## Chromium-baked cells ({})\n", suite.fixtures.len()).unwrap(); out.push_str( - "Each renders byte-exact against its committed Chromium oracle\n\ - (seven curved cells and four gradient ramps carry a declared, bounded\n\ - tolerance — see [README.md](./README.md)). Every thumbnail below\n\ - *is* that committed oracle, which byte-exactness makes this\n\ - engine's own render too; hover for the cell's name, click through\n\ + "Cells are checked against their committed Chromium oracles using\n\ + exact bytes unless a manifest entry declares a measured, bounded\n\ + tolerance — see [README.md](./README.md). Every thumbnail below\n\ + *is* that committed oracle; hover for the cell's name, click through\n\ to its fixture source. No new image is committed for this view.\n\n", ); for cell in &suite.fixtures { diff --git a/crates/websem/tests/gradients_contract.rs b/crates/websem/tests/gradients_contract.rs index b0d8f127..8c0f66a5 100644 --- a/crates/websem/tests/gradients_contract.rs +++ b/crates/websem/tests/gradients_contract.rs @@ -680,27 +680,12 @@ fn an_external_reference_refuses_by_name() { // ─── the named refusals ────────────────────────────────────────────────── -/// The refusal boundary, each by name: a focal radial (the shared radial -/// leaf is concentric), a focal radius, `color-interpolation: linearRGB`, +/// The refusal boundary, each by name: `color-interpolation: linearRGB`, /// author CSS on a stop's style attribute, and a geometry unit whose basis /// this slice does not consume. #[test] fn the_beyond_slice_gradient_family_refuses_by_name() { for (body, needle) in [ - ( - format!( - r##" {RAMP} - {RECT}"## - ), - "focal", - ), - ( - format!( - r##" {RAMP} - {RECT}"## - ), - "focal", - ), ( format!( r##" {RAMP} @@ -731,6 +716,31 @@ fn the_beyond_slice_gradient_family_refuses_by_name() { } } +/// A one-stop radial is constant only inside its two-circle shader domain. +/// Chromium leaves the focal cone's exterior untouched, so focal geometry +/// must survive the concentric-only constant-gradient fold. +#[test] +fn a_one_stop_focal_radial_keeps_its_spatial_domain() { + let source = document( + r##" + + "##, + ); + let frame = admit_both(&source); + let cg::Paint::RadialGradient(gradient) = frame.nodes()[1].paints.iter().next().unwrap() else { + panic!("a constant ramp retains radial geometry"); + }; + let geometry = gradient + .geometry + .expect("the one-stop cone cannot become an infinite solid"); + assert_eq!(geometry.start.center, (0.25, 0.25)); + assert_eq!(geometry.start.radius, 0.15); + assert_eq!(geometry.end.center, (0.5, 0.5)); + assert_eq!(geometry.end.radius, 0.5); + assert_eq!(gradient.stops.len(), 2); + assert_eq!(gradient.stops[0].color, gradient.stops[1].color); +} + /// A live user-space ramp on a line reaches a zero-height geometry box. The /// resolved paint contract states gradients in that box's unit square, so an /// inverse map would contain infinity. Refuse at the producer seam instead of @@ -828,19 +838,22 @@ fn zero_area_geometry_splits_object_box_from_userspace_constants() { } /// A template's focal attribute makes the referencing gradient focal too: -/// the refusal runs on the resolved attribute set, because an inherited +/// the paint carries the resolved attribute set, because an inherited /// `fx` does not re-default from an overridden `cx` (measured). #[test] -fn an_inherited_focal_point_still_refuses() { - let error = refusal(&document(&format!( +fn an_inherited_focal_point_survives_a_local_end_center_override() { + let frame = admit_both(&document(&format!( r##" {RAMP} {RECT}"## ))); - let CompileError::UnsupportedFill(reason) = error else { - panic!("expected a fill refusal, got {error:?}"); + let cg::Paint::RadialGradient(gradient) = sole_fill(&frame) else { + panic!("expected radial paint"); }; - assert!(reason.contains("focal"), "{reason}"); + let geometry = gradient.geometry.unwrap(); + assert_eq!(geometry.start.center, (0.15, 0.5)); + assert_eq!(geometry.end.center, (0.8, 0.5)); + assert_eq!(geometry.end.radius, 0.45); } diff --git a/crates/websem/tests/radial_gradients_contract.rs b/crates/websem/tests/radial_gradients_contract.rs new file mode 100644 index 00000000..3cde71cb --- /dev/null +++ b/crates/websem/tests/radial_gradients_contract.rs @@ -0,0 +1,144 @@ +//! Ordered radial circles: value and refusal laws. Chromium PNG cells own +//! pixel truth; these assertions attribute the source branch that produced it. +use websem::{CompileError, DegradationAction, InitialViewport, SvgFrameSource}; + +fn source(attributes: &str) -> String { + format!( + r##""## + ) +} + +fn paint(source: &str) -> cg::RadialGradientPaint { + let viewport = InitialViewport::new(64.0, 32.0); + let strict = SvgFrameSource::from_standalone_svg(source, viewport).unwrap(); + let best = SvgFrameSource::from_standalone_svg_best_effort(source, viewport).unwrap(); + assert!( + best.degradations() + .iter() + .all(|d| d.action() == DegradationAction::SamplesAsBase) + ); + let frame = strict.base_frame(); + assert_eq!(frame, best.base_frame()); + let cg::Paint::RadialGradient(paint) = frame.nodes()[0].paints.iter().next().unwrap() else { + panic!("radial leaf") + }; + paint.clone() +} + +#[test] +fn default_and_explicit_default_keep_the_old_leaf_while_radii_remain_ordered() { + assert_eq!( + paint(&source("")), + paint(&source(r#"fx=".5" fy=".5" fr="0""#)) + ); + assert!(paint(&source("")).geometry.is_none()); + for (attrs, start, end) in [ + ( + r#"fx="-.25" fy=".75" fr=".125""#, + (-0.25, 0.75, 0.125), + (0.5, 0.5, 0.5), + ), + ( + r#"fx=".25" fy=".375" fr=".75""#, + (0.25, 0.375, 0.75), + (0.5, 0.5, 0.5), + ), + ( + r#"fx=".25" fy=".375" fr=".125" r="0""#, + (0.25, 0.375, 0.125), + (0.5, 0.5, 0.0), + ), + ( + r#"fx=".25" fy=".375" fr=".125" r="-.25""#, + (0.25, 0.375, 0.125), + (0.5, 0.5, 0.0), + ), + (r#"fx=".25" fr="-.25""#, (0.25, 0.5, 0.0), (0.5, 0.5, 0.5)), + (r#"fr=".5""#, (0.5, 0.5, 0.5), (0.5, 0.5, 0.5)), + ] { + let paint = paint(&source(attrs)); + let g = paint.geometry.unwrap(); + assert_eq!((g.start.center.0, g.start.center.1, g.start.radius), start); + assert_eq!((g.end.center.0, g.end.center.1, g.end.radius), end); + assert_eq!( + paint.transform, + math2::transform::AffineTransform::identity() + ); + } +} + +#[test] +fn user_percentages_resolve_before_placement_with_a_diagonal_radius_basis() { + let g = paint(&source( + r#"gradientUnits="userSpaceOnUse" fx="25%" fy="37.5%" fr="12.5%""#, + )) + .geometry + .unwrap(); + assert_eq!(g.start.center, (16.0, 12.0)); + // Pin the contract's multiply-before-divide arithmetic, independently of + // the resolver. The Chromium percentage/numeric PNG pair proves the + // diagonal basis, not equality of their least-significant float bits. + assert_eq!(g.start.radius.to_bits(), 1_087_005_379); + assert_ne!(g.start.radius, 8.0, "width is not the radius basis"); + assert_ne!(g.start.radius, 4.0, "height is not the radius basis"); +} + +#[test] +fn every_retained_value_family_names_the_exact_attribute_in_both_admissions() { + for attr in ["fx", "fy", "fr"] { + for (value, needle) in [ + ("57384.267578125007", "numeric precision alias"), + ("57384.267578125007%", "numeric precision alias"), + ( + "8388608.500000000000000000000000000000000000000008388608", + "numeric precision alias", + ), + ("/*a*/.25/*b*/", "CSS comment"), + (".2/**/5", "CSS comment"), + ("1e999", "admitted Web used-value range"), + ("4em", "unit whose basis"), + ("calc(25%)", "uses calc()"), + ("min(25%,50%)", "uses min()"), + ("max(25%,50%)", "uses max()"), + ("clamp(0%,25%,50%)", "uses clamp()"), + ("var(--v)", "uses var()"), + ("env(safe-area-inset-left)", "uses env()"), + ("initial", "CSS-wide value"), + ("inherit", "CSS-wide value"), + ("unset", "CSS-wide value"), + ("revert", "CSS-wide value"), + ("revert-layer", "CSS-wide value"), + ] { + let input = source(&format!(r#"{attr}="{value}""#)); + let viewport = InitialViewport::new(64.0, 32.0); + let error = SvgFrameSource::from_standalone_svg(input.as_str(), viewport).unwrap_err(); + let CompileError::UnsupportedFill(reason) = error else { + panic!("wrong refusal {error:?}") + }; + assert!( + reason.contains(&format!("gradient geometry {attr}")), + "{reason}" + ); + assert!(reason.contains(needle), "{reason}"); + let best = + SvgFrameSource::from_standalone_svg_best_effort(input.as_str(), viewport).unwrap(); + let skipped: Vec<_> = best + .degradations() + .iter() + .filter(|d| d.action() == DegradationAction::Skipped) + .collect(); + assert_eq!(skipped.len(), 1); + assert!(skipped[0].reason().to_string().contains(needle)); + assert!( + skipped[0] + .reason() + .to_string() + .contains(&format!("gradient geometry {attr}")) + ); + assert!( + best.base_frame().nodes().is_empty(), + "a refused target cannot leak concentric paint" + ); + } + } +} diff --git a/crates/websem/tests/unsupported_corpus.rs b/crates/websem/tests/unsupported_corpus.rs index eeb2a8dd..4af7b251 100644 --- a/crates/websem/tests/unsupported_corpus.rs +++ b/crates/websem/tests/unsupported_corpus.rs @@ -448,7 +448,141 @@ const CORPUS: &[(&str, Departure, &str)] = &[ DeclaredByBestEffort, "attribute x", ), - ("svg-gradient-focal", DeclaredByBestEffort, "focal"), + ( + "svg-radial-start-fx-decimal-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fx-percentage-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fx-midpoint-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fx-css-comments", + DeclaredByBestEffort, + "CSS comment", + ), + ( + "svg-radial-start-fx-used-range", + DeclaredByBestEffort, + "admitted Web used-value range", + ), + ( + "svg-radial-start-fx-units", + DeclaredByBestEffort, + "unit whose basis", + ), + ( + "svg-radial-start-fx-math", + DeclaredByBestEffort, + "uses calc()", + ), + ( + "svg-radial-start-fx-var", + DeclaredByBestEffort, + "uses var()", + ), + ( + "svg-radial-start-fx-css-wide", + DeclaredByBestEffort, + "CSS-wide value", + ), + ( + "svg-radial-start-fy-decimal-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fy-percentage-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fy-midpoint-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fy-css-comments", + DeclaredByBestEffort, + "CSS comment", + ), + ( + "svg-radial-start-fy-used-range", + DeclaredByBestEffort, + "admitted Web used-value range", + ), + ( + "svg-radial-start-fy-units", + DeclaredByBestEffort, + "unit whose basis", + ), + ( + "svg-radial-start-fy-math", + DeclaredByBestEffort, + "uses calc()", + ), + ( + "svg-radial-start-fy-var", + DeclaredByBestEffort, + "uses var()", + ), + ( + "svg-radial-start-fy-css-wide", + DeclaredByBestEffort, + "CSS-wide value", + ), + ( + "svg-radial-start-fr-decimal-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fr-percentage-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fr-midpoint-precision", + DeclaredByBestEffort, + "numeric precision alias", + ), + ( + "svg-radial-start-fr-css-comments", + DeclaredByBestEffort, + "CSS comment", + ), + ( + "svg-radial-start-fr-used-range", + DeclaredByBestEffort, + "admitted Web used-value range", + ), + ( + "svg-radial-start-fr-units", + DeclaredByBestEffort, + "unit whose basis", + ), + ( + "svg-radial-start-fr-math", + DeclaredByBestEffort, + "uses calc()", + ), + ( + "svg-radial-start-fr-var", + DeclaredByBestEffort, + "uses var()", + ), + ( + "svg-radial-start-fr-css-wide", + DeclaredByBestEffort, + "CSS-wide value", + ), ("svg-gradient-linearrgb", DeclaredByBestEffort, "linearRGB"), // Sheet-level: the pinned cascade cannot represent stop-color, so the // declaration is named against the sheet and the gradient renders with diff --git a/docs/wg/consolidation/svg-engine-of-record.md b/docs/wg/consolidation/svg-engine-of-record.md index 056fd6a1..61ae7653 100644 --- a/docs/wg/consolidation/svg-engine-of-record.md +++ b/docs/wg/consolidation/svg-engine-of-record.md @@ -114,19 +114,18 @@ 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,157 Chromium-baked primitive cells plus 16 sampled frames, +- **The corpus** is 1,284 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 witnesses (six Allerta and two Bungee) under the ratified text corpus-growth law. All byte-exact except seven curved cells carrying a declared, geometrically - confined tolerance (the native-oval/conic boundary) and four gradient cells - carrying a declared one-code-value ramp-quantization tolerance (one pixel - against Chromium's Skia; 18 knife-edge pixels between this engine's own - macOS and Linux Skia builds; 336 ramp pixels under an isolated layer's - restore; 576 after a masked ramp becomes luminance alpha). The named refusal - register has 234 rows. + confined tolerance (the native-oval/conic boundary) and twelve gradient cells + 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 260 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 @@ -5581,3 +5580,99 @@ named refusal register moves from 230 to 234. The CSS-property twin, dynamic substitutions, wider text painting, external resources, and animation remain their own work. No conformance score was produced, and no FLIP record, rule, or baseline changed. + +## Radial-circle split — 2026-09-07 + +This rung replaces the broad focal-radial refusal with the bounded admission +recorded in [the command's statement of record](../../../crates/n0_cli/README.md). +It closes no checklist row. The complete listed length grammar includes +Chromium-honored source aliases and CSS comments still refused here, with no +independent row to carry those gaps: the gridaco/nothing#81/#89/#90 split +precedent applies. Wider units, calculations, substitution, and CSS-wide +context retain their own-row precedents. No CSS property matching is added. + +### The contract crux + +The original start-only proposal assumed an invertible mapping to a fixed +nonzero end circle. Chromium contradicts that restriction: a zero or negative +authored outer radius still has a live radial domain when a distinct start +circle is present. Normalizing by the outer radius cannot state that image. +The owner-ratified [ordered-circle amendment](../feat-painting/paint-model.md#amd-radial-circles) +therefore preserves both centers, both nonnegative radii, and their order. +It does not sort radii, clamp exterior centers, or add resource references to +the resolved contract. The absent extension preserves the old centered form. + +The same investigation found a shipped one-stop escape: treating a single +color as an infinite spatial domain filled 109 pixels that Chromium leaves +outside the cone, at maximum channel delta 217. The baked +`svg-radial-start-one-stop-focal` cell now preserves that exterior under the +constant ramp; repeat/reflect and zero-end companions discriminate the +related branches. Zero stops remain inert. The former broad refusal source +graduates unchanged to `svg-radial-start-graduated-focal`; its assertion of +inexpressibility is deliberately dropped only after the positive oracle +re-homes its geometry. The temporary one-stop refusal is likewise replaced +by positive domain evidence, not deleted without a witness. + +### Evidence and retained boundaries + +The [corpus record](../../../fixtures/web-first/README.md) identifies 127 new +cells: defaults, signed length syntax and invalid fallbacks; object-box and +axis/diagonal user-space percentages; viewBox mapping; independent template +inheritance and local overrides; transforms; zero, equal, reversed, tangent, +intersecting, disjoint, and containing circles; all spread modes; stop order +and alpha; and admitted fill/stroke, instance, pattern, clip, mask, filter, +nested-viewport, and HTML clients. Of those cells, 119 are byte-exact. Eight +carry the existing ramp-quantization rule with measured bounds: six singleton +pixels, 613 masked-ramp pixels, and 1,465 offset-filter restore pixels, all at +one code value. No existing oracle or tolerance changes; numeric controls +remain exact. + +The nine amplified source aliases are measured against adjacent numeric +controls before any admission claim. Chromium selects the lower neighbor in +all nine, while the opposing controls differ by 718–1,024 pixels with maximum +channel deltas 14–34. Decimal/percentage controls and the radius midpoint pair +are celled; focus midpoint pairs remain **(measured, not celled)**. The +existing direct-length provenance patrol now has nine exact-attribute refusal +fixtures here. Comments, range, units, math, substitution, and CSS-wide +context add eighteen more. The broad focal row retires, moving the named +register from 234 to 260 without weakening a remaining guard. + +Additional near-equal/tangent and effect-boundary probes are +**(measured, not celled)** where no committed witness is named. Marker-source +gradients retain their existing solid/context-solid source-profile refusal. +A highly magnified diagonal-radius experiment failed to discriminate its +adjacent Chromium controls and reached the checked shader-construction +refusal in both command admissions; it proves no new normalization order. +The diagonal cell proves the correct basis, not equality of invisible float +bits. + +The source-neutral extension crosses both paint consumers without losing any +of its six scalars. Contract tests guard exact copies, validation, attributed +preflight, and paint/damage changes. The unchanged frozen `.grida` encoder and +Draft0 writer cannot represent a present circle pair and reject it instead +of silently omitting it. The legacy importer is not broadened by this work. +Direct immutable-frame execution carries the new geometry. The translated +preview raster cache does not: a native scene exposed two one-code-value +differences between its offscreen translation and fresh drawing +**(measured, not celled)**. A typed owner-attributed refusal occurs before +cache or canvas mutation; its guarding test verifies rejection and recovery. +This is a cache-policy boundary, not a second semantic interpretation. + +### Gate sensitivity + +Four deliberate implementation mutations fail the full primitive gate loudly. +Discarding the start radius fails 79 cells, reaching 3,072 changed pixels and +maximum channel delta 255; the bounded mask/filter cells also fail well beyond +their declarations. Reversing the two circles fails 108 cells, reaching all +4,096 pixels and delta 255. Resolving `fr%` against width instead of the +normalized diagonal fails both the direct and viewBox-mapped radius cells by +1,116 pixels at delta 214 each. Restoring the premature one-stop constant fold +fails four domain cells: three change 109 pixels and the zero-end witness +changes 1,938, all at delta 217. These are mutation verdicts, not additional +corpus cells. Each mutation is removed before the final full gate. + +The corpus moves from 1,157 to 1,284 primitive cells. The sixteen sampled +frames, sixteen exact text cells, and eight real-font geometry witnesses are +unchanged. External I/O, text, marker-source expansion, animation, and the +separately tracked degenerate-gradient family remain separate work. No +conformance score or FLIP record, rule, or baseline is touched. diff --git a/docs/wg/consolidation/web-checklist.md b/docs/wg/consolidation/web-checklist.md index 13a30cd6..51532c6d 100644 --- a/docs/wg/consolidation/web-checklist.md +++ b/docs/wg/consolidation/web-checklist.md @@ -2483,6 +2483,20 @@ for attributes the platform ships ahead of the SVG 2 indexes. - [ ] `fr` - [ ] `fx` - [ ] `fy` + +> **2026-09-07 radial-circle split:** 127 Chromium-baked cells carry the +> signed number/percentage/`px` slice, independent template defaults, axis and +> diagonal bases, circle order, exterior focus, zero/equal/reversed radii, +> one-stop cone domains, spreads, transforms, and admitted paint clients. +> These three rows remain open: valid source-precision aliases and CSS +> comments are honored by Chromium but refused here, with no independent +> checklist row to carry that gap (gridaco/nothing#81/#89/#90). Wider units, +> computed functions, substitution, and CSS-wide context retain their own-row +> precedents; those do not excuse the precision/comment split. Twenty-seven +> exact-attribute refusal fixtures replace the former broad focal row. +> No CSS-property row changes. See the +> [radial-circle evidence](./svg-engine-of-record.md#radial-circle-split--2026-09-07). + - [x] `gradientTransform` - [x] `gradientUnits` - [ ] `href` diff --git a/docs/wg/feat-painting/paint-model.md b/docs/wg/feat-painting/paint-model.md index fed09afa..0f1d0a5f 100644 --- a/docs/wg/feat-painting/paint-model.md +++ b/docs/wg/feat-painting/paint-model.md @@ -14,9 +14,10 @@ format: md **Status:** Ratified — accepted via [gridaco/nothing#33](https://github.com/gridaco/nothing/issues/33) -(closed by the owner, 2026-07-18). Two items flagged in the body remain -pinned as follow-up amendments: diamond-gradient extension behavior and -the tri-state run-fill verification. +(closed by the owner, 2026-07-18), with the ordered radial-circle +amendment accepted by the same owner on 2026-09-07. Two items flagged in the +body remain pinned as proposed follow-up amendments: diamond-gradient +extension behavior and the tri-state run-fill verification. This document is written for an engine developer deciding, at promotion time, what the shared paint vocabulary is — the leaf-level value types @@ -70,7 +71,8 @@ Out of scope, each with its owning home: | **Paint** | A self-contained recipe for producing color over a region: one of solid, linear, radial, sweep, diamond gradient, or image. | | **Paint stack** | An ordered, finite list of paints composited in sequence; entry zero is bottommost. | | **Stroke application** | One stroke geometry — width, align, cap, join, miter limit, dash pattern — carrying its own paint stack. Repeatable per node. | -| **Unit gradient space**| The `[0,1] × [0,1]` box in which radial, sweep, and diamond gradients are defined, with implicit center `(0.5, 0.5)`. | +| **Gradient-local space** | The coordinate system of intrinsic gradient geometry, before placement into the paint target box. Coordinates are finite but not confined to that box. | +| **Unit gradient space**| The `[0,1] × [0,1]` reference box used by implicit radial, sweep, and diamond geometry, with center `(0.5, 0.5)`. | | **Alignment point** | A point in center-based normalized coordinates over the paint target box: `(-1,-1)` top-left, `(0,0)` center, `(1,1)` bottom-right. | | **Stop** | A pair of a scalar offset in `[0,1]` and a color. | | **Quantization policy**| The declared rule a boundary applies when converting a unit-interval scalar channel to an 8-bit channel. | @@ -383,14 +385,14 @@ statements** — declared, testable deviations — instead of silent drops. ### Evidence -- All three surfaces (production runtime, v2 proof, archive schema) - agree on the field sets below with two known pressure points: - per-stop opacity and the radial focal point. +- All three original surfaces (production runtime, v2 proof, archive schema) + agreed on the field sets below with two known pressure points: + per-stop opacity and radial circle geometry. - The SVG import path today drops a source gradient's per-stop opacity - and focal point on the way to the engine model — the focal point - survives into the import's intermediate representation and is - discarded at the packing step; both drops are annotated in-source as - model mismatches and are invisible to the user. + and off-center start point on the way to the engine model — that point + survives into the import's intermediate representation and is discarded at + the packing step, while a nonzero start radius is not represented there at + all. Both losses are model mismatches and are invisible to the user. - Source SVG patterns are mapped to a transparent paint — a silent erasure; pattern paint servers are a tracked capability ([gridaco/nothing#14](https://github.com/gridaco/nothing/issues/14)). @@ -400,19 +402,20 @@ statements** — declared, testable deviations — instead of silent drops. **Common to all six variants:** active flag, opacity, blend mode (decision 3). For solid paints, opacity is the color alpha (decision 1). -**One parameterization rule for gradients.** Every gradient is defined -in a normalized space over the paint target box and positioned by an -affine transform composed as `scale(width, height) × user-transform`: -the gradient definition itself is resolution-independent, and all -rotation, skew, and offset live in the user transform — never baked -into intrinsic parameters. +**One placement rule for gradients.** Every gradient has intrinsic geometry +in gradient-local space and an affine placement composed as +`scale(width, height) × user-transform`. The user transform maps gradient-local +coordinates into the target box's normalized space. Geometry and placement +remain distinct facts: rotation, skew, and target placement do not mutate the +intrinsic parameters. Explicit circle coordinates use the same direct scalar +space as their radii, without an intermediate alignment-point conversion. | Variant | Intrinsic parameters | Stops | Tile mode | Transform | | ------- | ------------------------------------------------------------------------------------ | ----- | ----------------------------- | --------- | | Linear | Two endpoints as alignment points (defaults: center-left → center-right) | Yes | Yes | Yes | -| Radial | Implicit center `(0.5, 0.5)`, radius `0.5` in unit gradient space | Yes | Yes | Yes | +| Radial | Optional ordered start and end circles; absent means centered start point `(0.5, 0.5)`, radius `0`, and end circle `(0.5, 0.5)`, radius `0.5` | Yes | Yes | Yes | | Sweep | Implicit center `(0.5, 0.5)`; angular domain one full turn, clockwise from 0° | Yes | No — the angular domain is closed; a full turn has no exterior to tile | Yes | -| Diamond | The radial field evaluated under the Manhattan distance metric, same unit space | Yes | No — no tile mode is carried on any surface today; beyond-unit clamp behavior is proposed by `AMD-DIAMOND-CLAMP` below | Yes | +| Diamond | Implicit centered radius-`0.5` field under the Manhattan distance metric in unit gradient space | Yes | No — no tile mode is carried on any surface today; beyond-unit clamp behavior is proposed by `AMD-DIAMOND-CLAMP` below | Yes | **Stop:** `(offset ∈ [0,1], color)` — recommended without a separate opacity field; see the contested point below. @@ -446,35 +449,37 @@ it is nonconformant. The sub-8-bit precision loss is bounded by half a quantization step and is accepted until the wide-gamut successor of decision 1 revisits channel depth. -### Contested point B — the radial focal point - -A focal (two-point) radial gradient places the 0-offset point away from -the circle's center, producing isolines that are non-concentric circles. -No affine transform of a concentric radial can express this: affine maps -send concentric circles to concentric ellipses, so the focal family is -strictly outside the current parameterization. This is why the import -pipeline can only drop a source focal point today. - -| Question | Keep radial concentric-only | Optional focal point in unit gradient space (recommended) | Full two-point conical (two circles) | -| ----------------------------------------------- | --------------------------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------- | -| Expressive coverage of the domain | Loses SVG focal gradients permanently | Covers SVG focal semantics (focus + one circle) | Covers SVG and more (two radii) | -| Backend support | Native everywhere | Native two-point conical exists in the raster backends | Same | -| Cost | None | One optional field, defaulting to center (degenerate = today) | Two extra parameters with no current producer | -| Design-tool precedent | Matches Figma-style radial | Superset; default behavior unchanged | No authoring surface wants the second radius today | - -**Recommendation:** extend the canonical radial with an *optional focal -point*, expressed in unit gradient space and defaulting to the center — -the default is byte-identical to today's behavior. Until the extension -is ratified and lands (a schema change, so promotion-program work — the -seam program forbids schema motion), the **conformance statement** is: -an importer meeting a source focal point must declare the deviation in -its import report; silent dropping is nonconformant. +### Contested point B — ordered radial circles + +A two-circle radial gradient maps the beginning and end of its ramp to two +circles. A zero-radius start circle is a focal point; a positive-radius start +circle maps offset zero to a perimeter. Moving either start center or start +radius can produce non-concentric isolines and a domain that does not cover +the whole paint target. No affine transform of a concentric radial can state +that family: affine maps preserve concentricity. A start circle beside a +fixed, nonzero end circle is also insufficient: an invertible affine cannot +collapse the end circle to a point while preserving a live start circle. + +| Candidate | Expressive boundary | Contract cost | Disposition | +| --------- | ------------------- | ------------- | ----------- | +| Concentric-only | No independent start geometry | No additional fact | Insufficient | +| Optional focal point | Cannot state a positive start radius | One optional point | Insufficient | +| Optional start circle, fixed end circle | Cannot state a point-sized end alongside a live start | One optional circle | Insufficient | +| Optional ordered circle pair | States both ramp boundaries, including either point-sized boundary | Two circles as one optional geometry fact | Chosen | + +**Decision:** carry an optional ordered pair of circles in gradient-local +space. Absence retains the original centered radial. Presence preserves both +centers and radii exactly, without normalizing either circle to the implicit +end circle. `AMD-RADIAL-CIRCLES` below fixes the domain. An interchange surface +that cannot state a present pair must reject that value or report a declared +deviation; silently replacing it with a concentric radial is nonconformant. ### Conformance statements (summary) 1. Per-stop opacity: fold into stop alpha; never drop. -2. Radial focal point: represent once ratified; until then, a declared - deviation, never a silent drop. +2. Ordered radial circles: preserve both centers, both radii, and their order; + a boundary that cannot carry any of these facts reports or rejects the + deviation, never silently drops it. 3. Source spread/tile methods on sweep or diamond gradients: not representable; declared deviation. 4. Source pattern paint servers: not representable @@ -504,20 +509,57 @@ contract the promotion program implements, in vocabulary terms: boundary: layout-affecting values remain with the text-resolution contract; run fills, decoration color, and text strokes are governed by this spec. -- **Gradients and images** — field sets follow the ratified decisions; - the radial focal extension remains proposed, so - importers upgrade every silent drop named in - decision 5 to its conformance behavior. +- **Gradients and images** — field sets follow the ratified decisions. The + ordered radial-circle extension is part of the shared vocabulary; boundaries + that predate it upgrade every silent drop named in decision 5 to an explicit + conformance behavior. ## Pinned amendments -These amendments are **proposed and re-pinned**, not ratified. Their named -owner is `universe@grida.co`, the -[consolidation program owner](../consolidation/index.md). Ratification remains -an owner gate under **AMD**. For a leaf whose conformance depends on an -amendment, ratification precedes that leaf's D-C disposition and deletion of -any mapping that depends on it. It does not block D-C dispositions for -unrelated leaves. +The named owner of these amendments is `universe@grida.co`, the +[consolidation program owner](../consolidation/index.md). Each amendment states +whether it is ratified or proposed. Ratification remains an owner gate under +**AMD**. For a leaf whose conformance depends on an amendment, ratification +precedes that leaf's D-C disposition and deletion of any mapping that depends +on it. It does not block D-C dispositions for unrelated leaves. + +### AMD-RADIAL-CIRCLES + +**Status:** Ratified by explicit owner GO on 2026-09-07. This replaces the +start-only proposal: a fixed nonzero end circle excluded point-sized ends, +which cannot be recovered by invertible placement. + +A radial gradient may carry one optional ordered geometry value consisting +of a start circle and an end circle in gradient-local space: + +- absence means start center `(0.5, 0.5)`, radius `0`, and end center + `(0.5, 0.5)`, radius `0.5`; it preserves the original centered radial; +- both present centers are finite direct coordinate pairs and may lie + outside the unit square; +- both present radii are finite and non-negative; either may be zero and + the start radius may exceed the end radius; +- equal circles, including equal point-sized circles, are representable; +- offset zero maps to the start-circle perimeter and offset one maps to the + end-circle perimeter, so the two circles are ordered facts; +- consumers do not swap circles, clamp a center into another circle, or + normalize away a radius; and +- presence is retained even when a pair numerically equals the implicit + geometry. This preserves exact supplied values without a hidden rewrite. + +The two circles state intrinsic geometry, not rasterization policy or a +resource reference. The affine carries placement, scale, rotation, and skew. +Representation of a numeric pair does not promise every backend can evaluate +it: a backend must preserve the ordered geometry and its painted domain or +refuse explicitly, including for equal circles and other degeneracies. A +constant color ramp does not by itself permit replacing that domain with an +unbounded solid color. Spread behavior operates on the ordered ramp parameter, +not by moving the circles. + +A serialization or import boundary whose radial representation lacks the +circle pair preserves the absent form exactly and rejects or declares every +present form. Schema evolution remains a separate owner decision. The circle +extension does not widen any earlier source grammar merely because the runtime +can carry the fact. ### AMD-DIAMOND-CLAMP diff --git a/fixtures/web-first/README.md b/fixtures/web-first/README.md index 31c35b0b..6a059c27 100644 --- a/fixtures/web-first/README.md +++ b/fixtures/web-first/README.md @@ -19,8 +19,8 @@ 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,157 primitive cells plus 16 sampled frames, those twenty-four text -witnesses, and 234 named refusal rows. Pixel cells use byte equality: what each +estate is 1,284 primitive cells plus 16 sampled frames, those twenty-four text +witnesses, and 260 named refusal rows. Pixel cells use byte equality: what each corpus admits is exactly what the engine renders pixel-for-pixel, except only the primitive rows carrying an explicit measured tolerance block. The real-font witness grades geometry before rasterization and makes no Chromium @@ -28,6 +28,10 @@ pixel claim. | File | Role | | --- | --- | +| `svg-radial-start-{default,explicit-default,fx-*,fy-*,fxy-*,fr-*,outer-*,one-stop-*,zero-stops-focal,same-circle-*}.svg` | Ordered radial-circle evidence: independent focus coordinates, signed/zero/positive start radius, equal/reversed/zero end radii, exterior focus, tile behavior, and one-stop transparent domains. The older focal refusal source graduates unchanged as `svg-radial-start-graduated-focal.svg`; the one-stop witness preserves the previously silent constant-fold escape as positive evidence. | +| `svg-radial-start-{grammar-*,box-percent,user-*,mapped-viewbox,template-*,transform-*,relation-*,spread-*,stops-*}.svg` | Resource-length grammar/defaults and placement: accepted signed/exponent forms versus invalid whitespace-only, trailing-dot, comma, and non-ASCII-whitespace fallbacks; axis and diagonal percentage bases; mapped user units; per-field template inheritance and local overrides; every spread mode across distinct circle relationships; transforms, stop order, duplicate stops, and alpha. Valid values surrounded by SVG whitespace match their unpadded controls in Chromium and both CLI admissions (measured, not celled). The decimal/percentage adjacent numeric controls and radius midpoint pair are byte-exact. | +| `svg-radial-start-client-*.svg` · `svg-radial-start-transparent-cone.svg` · `html-inline-svg-radial-start.html` | Paint clients through shapes, path/stroke/dashes, paint order, channel/group opacity, existing `` instances, pattern source, clip, mask, offset filter, nested viewport, transparent exterior, and HTML ingress. This does not expand the marker-source paint profile or external-resource boundary. | +| *(measured, not celled — radial-circle remainder)* | Twice-deterministic Chromium 149 matrices and both actual CLI admissions cover 35 core, 75 precision/grammar, 262 interaction, 64 boundary, two HTML, and two graduation sources. The nine amplified decimal/percentage/midpoint aliases each select the lower adjacent binary32 control; their opposing controls differ by 718–1,024 pixels at maximum channel deltas 14–34. Comments, wider units, computed functions, substitution, CSS-wide values, and range cases reach the exact-attribute refusals. Marker-source gradients reach the existing solid/context-solid marker-profile refusal. Sampled near-equal and tangent neighbors expose only the existing one-code-value ramp class; this is not a universal precision claim. A separate three-source, highly magnified diagonal-rounding experiment did not discriminate its adjacent Chromium controls and reached the checked shader-construction refusal in both CLI admissions: it establishes no new used-value rounding claim. | | `text/` | The closed text estate: sixteen exact pixel cells plus eight artifact-geometry witnesses (six Allerta, two Bungee); see [`text/README.md`](./text/README.md). | | `text/svg-text-tspan-paint-ownership.svg` · `text/geometry/svg-text-allerta-tspan-kerning.svg` | T4a's bounded flat `` split. The Ahem cell makes parent/child opaque solid fills, inherited paint, whitespace collapse across wrapper boundaries, and one parent anchor byte-exact. The Allerta `ff` geometry witness keeps Chromium's 2330/2355 advances and 4685 total across a paint boundary; shaping the fragments independently would total 4710. Bungee scratch probes establish whole-cluster ownership by the run containing the cluster's first scalar (measured, not celled). Replacing every run paint with the parent changes 1,600px/Δ197, and anchoring the runs independently changes 1,200px/Δ218. Nominal advances and parent-only paint each made `just gate` fail before restoration. Four focused refusal rows retained positioned, shaping-changing, wider-paint/effect, and nested children at that checkpoint. No checklist row closed. | | `text/svg-text-positioned-chunks.svg` · `text/geometry/svg-text-allerta-positioned-combining.svg` | T4b's bounded positioned-chunk split. The exact Ahem cell crosses x/y chunk resets, per-chunk middle anchoring, dx/dy lists, omitted members, paint ownership, integer transforms, canonical whitespace, and ``. The Allerta witness distinguishes an absolute shaping split (first `f` advance 2355) from preserved in-chunk kerning (2330/2355), and proves that a `dx` on the combining scalar carries to the following `Z`; Chromium and the projection agree exactly on total 13585 and starts 5000, 8330, 10685, and 15005. Repeated/negative positions, y-only chunks, excess members, and percentage bases are measured, not celled. Three new focused refusal rows retain wider value grammar, whitespace-index ambiguity, and an absolute split inside a combining cluster; parent lists, `rotate`, and `textLength` remain separate. Dropping first-character `dx` made the gate fail by 550 exact Ahem pixels before restoration. No checklist row closes. | @@ -367,7 +371,7 @@ still fails loudly, and `svg-circle-defaults-clip` shows the bar is not unreachable: it bakes byte-exact and declares no tolerance at all. The gradient cells brought a second tolerance kind, `ramp-quantization`, -declared on four cells with their measured bounds — always one code value, +declared on twelve cells with their measured bounds — always one code value, never confined to a boundary ring (a ramp has none; none is needed, since a wrong gradient moves far more pixels by far more than one code value and still fails loudly). `svg-gradient-radial-custom` differs in 1 pixel: an @@ -383,7 +387,14 @@ found the day the gate learned to sweep the whole suite before failing. and the two Skia builds round one code value apart across the ramp — the same physics, multiplied by the layer. `svg-mask-gradient-ramp` differs at 576 pixels by one code value after that dithered ramp is converted into -luminance alpha. Every other gradient cell — ramps, seams, hard stops, the +luminance alpha. The radial-circle rung adds eight declarations, never +changing an existing cell: `svg-radial-start-fxy-quarter`, `fx-on-end`, +`on-end-repeat`, `on-end-reflect`, `grammar-fy-signed`, and +`grammar-fy-exponent` each differ at one pixel; `client-mask` differs at 613 +pixels after mask composition, and `client-filter` at 1,465 after an offset +filter's layer restore. Each of those abbreviated names has the same +`svg-radial-start-` prefix. Bounds are measured counts, with no headroom; +adjacent numeric controls remain exact. Every other gradient cell — ramps, seams, hard stops, the dither itself, the ramp *under* the fold — is byte-exact. Render a primitive through the `n0` product command — since diff --git a/fixtures/web-first/STATUS.md b/fixtures/web-first/STATUS.md index 74ae7156..877ec689 100644 --- a/fixtures/web-first/STATUS.md +++ b/fixtures/web-first/STATUS.md @@ -19,13 +19,12 @@ 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 (1157) +## Chromium-baked cells (1284) -Each renders byte-exact against its committed Chromium oracle -(seven curved cells and four gradient ramps carry a declared, bounded -tolerance — see [README.md](./README.md)). Every thumbnail below -*is* that committed oracle, which byte-exactness makes this -engine's own render too; hover for the cell's name, click through +Cells are checked against their committed Chromium oracles using +exact bytes unless a manifest entry declares a measured, bounded +tolerance — see [README.md](./README.md). Every thumbnail below +*is* that committed oracle; hover for the cell's name, click through to its fixture source. No new image is committed for this view. html-inline-svg-ancestor-opacity @@ -33,6 +32,7 @@ to its fixture source. No new image is committed for this view. html-inline-svg-nested-viewport html-inline-svg-paint-order html-inline-svg-pattern +html-inline-svg-radial-start html-inline-svg-vector-effect html-webpage-mockup svg-anchor-container @@ -978,6 +978,132 @@ to its fixture source. No new image is committed for this view. svg-preserve-aspect-ratio-explicit svg-preserve-aspect-ratio-none-stretch svg-preserve-aspect-ratio-slice-clip +svg-radial-start-box-percent +svg-radial-start-client-channel-opacity +svg-radial-start-client-clip +svg-radial-start-client-dashes +svg-radial-start-client-ellipse +svg-radial-start-client-filter +svg-radial-start-client-group-opacity +svg-radial-start-client-mask +svg-radial-start-client-nested +svg-radial-start-client-order +svg-radial-start-client-path +svg-radial-start-client-pattern +svg-radial-start-client-stroke +svg-radial-start-client-transform +svg-radial-start-client-use +svg-radial-start-default +svg-radial-start-explicit-default +svg-radial-start-fr-decimal-higher +svg-radial-start-fr-decimal-lower +svg-radial-start-fr-equal-r +svg-radial-start-fr-greater-r +svg-radial-start-fr-midpoint-higher +svg-radial-start-fr-midpoint-lower +svg-radial-start-fr-negative +svg-radial-start-fr-negative-zero +svg-radial-start-fr-percentage-higher +svg-radial-start-fr-percentage-lower +svg-radial-start-fr-quarter +svg-radial-start-fx-decimal-higher +svg-radial-start-fx-decimal-lower +svg-radial-start-fx-negative +svg-radial-start-fx-on-end +svg-radial-start-fx-outside +svg-radial-start-fx-percentage-higher +svg-radial-start-fx-percentage-lower +svg-radial-start-fx-quarter +svg-radial-start-fxy-fr-quarter +svg-radial-start-fxy-quarter +svg-radial-start-fy-decimal-higher +svg-radial-start-fy-decimal-lower +svg-radial-start-fy-percentage-higher +svg-radial-start-fy-percentage-lower +svg-radial-start-fy-quarter +svg-radial-start-graduated-focal +svg-radial-start-grammar-fr-comma +svg-radial-start-grammar-fr-exponent +svg-radial-start-grammar-fr-integer +svg-radial-start-grammar-fr-nbsp +svg-radial-start-grammar-fr-signed +svg-radial-start-grammar-fr-trailingdot +svg-radial-start-grammar-fr-whitespace +svg-radial-start-grammar-fx-comma +svg-radial-start-grammar-fx-exponent +svg-radial-start-grammar-fx-integer +svg-radial-start-grammar-fx-nbsp +svg-radial-start-grammar-fx-signed +svg-radial-start-grammar-fx-trailingdot +svg-radial-start-grammar-fx-whitespace +svg-radial-start-grammar-fy-comma +svg-radial-start-grammar-fy-exponent +svg-radial-start-grammar-fy-integer +svg-radial-start-grammar-fy-nbsp +svg-radial-start-grammar-fy-signed +svg-radial-start-grammar-fy-trailingdot +svg-radial-start-grammar-fy-whitespace +svg-radial-start-mapped-viewbox +svg-radial-start-on-end-reflect +svg-radial-start-on-end-repeat +svg-radial-start-one-stop-default +svg-radial-start-one-stop-exterior-reflect +svg-radial-start-one-stop-exterior-repeat +svg-radial-start-one-stop-focal +svg-radial-start-outer-negative-focal +svg-radial-start-outer-zero-focal +svg-radial-start-outer-zero-fr +svg-radial-start-outer-zero-fx +svg-radial-start-outer-zero-one-stop-focal +svg-radial-start-outside-positive-fr +svg-radial-start-relation-above +svg-radial-start-relation-below +svg-radial-start-relation-containing +svg-radial-start-relation-disjoint +svg-radial-start-relation-external-tangent +svg-radial-start-relation-internal-tangent +svg-radial-start-relation-intersecting +svg-radial-start-relation-left +svg-radial-start-relation-right +svg-radial-start-same-circle-reflect +svg-radial-start-same-circle-repeat +svg-radial-start-spread-circle-reflect +svg-radial-start-spread-circle-repeat +svg-radial-start-spread-outside-reflect +svg-radial-start-spread-outside-repeat +svg-radial-start-spread-reversed-reflect +svg-radial-start-spread-reversed-repeat +svg-radial-start-spread-zero-end-reflect +svg-radial-start-spread-zero-end-repeat +svg-radial-start-stops-alpha +svg-radial-start-stops-duplicate +svg-radial-start-stops-edges +svg-radial-start-stops-unsorted +svg-radial-start-template-all +svg-radial-start-template-empty-fr +svg-radial-start-template-empty-fx +svg-radial-start-template-empty-fy +svg-radial-start-template-explicit-focus +svg-radial-start-template-fr-negative +svg-radial-start-template-fr-zero +svg-radial-start-template-invalid-fr +svg-radial-start-template-local-center +svg-radial-start-template-multihop +svg-radial-start-template-override-fr +svg-radial-start-template-override-fx +svg-radial-start-template-override-fy +svg-radial-start-template-xlink +svg-radial-start-transform-rotate +svg-radial-start-transform-scale +svg-radial-start-transform-singular +svg-radial-start-transform-skew +svg-radial-start-transform-translate +svg-radial-start-transparent-cone +svg-radial-start-user-percent-fr +svg-radial-start-user-percent-fx +svg-radial-start-user-percent-fy +svg-radial-start-user-px +svg-radial-start-zero-stops-focal svg-rect-rounded svg-rect-rounded-clamp svg-rect-rounded-elliptical @@ -1186,7 +1312,7 @@ to its fixture source. No new image is committed for this view. svg-visibility-rule-beats-attribute svg-visibility-unhide -## The refusal register (234) +## The refusal register (260) What the slice refuses, by name, in the compiler's own words — **both refuse** is a document-level contract; **declared** renders @@ -1284,7 +1410,6 @@ its row into the cells above. | `svg-geometry-xywh-used-range` | declared | skipped svg/rect[2]: unsupported SVG geometry: x exceeds the admitted Web used-value range; skipped svg/rect[3]: unsupported SVG geometry: x exceeds the admitted Web used-value range; skipped svg/rect[4]: unsupported SVG geometry: y exceeds the admitted Web used-value range; skipped svg/rect[5]: unsupported SVG geometry: y exceeds the admitted Web used-value range; skipped svg/rect[6]: unsupported SVG geometry: width exceeds the admitted Web used-value range; skipped svg/rect[7]: unsupported SVG geometry: height exceeds the admitted Web used-value range | | `svg-geometry-xywh-var-values` | declared | skipped svg/g[1]/rect[1]: attribute x="var(--x)" is not a number; skipped svg/g[1]/rect[2]: attribute y="var(--y)" is not a number; skipped svg/g[1]/rect[3]: attribute width="var(--w)" is not a number; skipped svg/g[1]/rect[4]: attribute height="var(--h)" is not a number | | `svg-gradient-degenerate-precision` | declared | skipped svg/rect[1]: unsupported fill value "url(#a): a degenerate paint server substitutes a colour this build cannot reproduce: the collapsed alpha is not exactly representable in eight bits, and Chromium dithers it"; skipped svg/rect[2]: unsupported fill value "url(#b): a degenerate paint server collapses two alpha stages, and their product is not exactly representable in eight bits"; skipped svg/rect[3]: unsupported fill value "url(#c): a degenerate paint server collapses before post-paint opacity, and the staged product is not exactly representable in eight bits"; skipped svg/rect[4]: unsupported fill value "url(#d): a degenerate paint server substitutes a colour this build cannot reproduce: the collapsed alpha is not exactly representable in eight bits, and Chromium dithers it"; skipped svg/rect[5]: unsupported fill value "url(#e): a degenerate paint server averages a ramp whose stop is not exactly representable in eight bits, and Chromium dithers the result" | -| `svg-gradient-focal` | declared | skipped svg/rect[1]: unsupported fill value "url(#g): the radial gradient has a focal point or focal radius, which the shared radial paint leaf cannot state (concentric radials only)" | | `svg-gradient-linearrgb` | declared | skipped svg/rect[1]: unsupported fill value "url(#g): color-interpolation: linearRGB interpolates stops in linear-light sRGB, which this slice does not execute (sRGB interpolation only)" | | `svg-gradient-stop-css` | declared | declaration ignored at svg/style[1]: a stylesheet declares stop-color, which this cascade does not represent; elements it matches render without it | | `svg-gradient-stop-function` | declared | skipped svg/rect[1]: unsupported fill value "url(#g): a stop-opacity is a function this build cannot evaluate without a computation context" | @@ -1367,6 +1492,33 @@ its row into the cells above. | `svg-preserve-aspect-ratio-case-folded` | **both refuse** | preserveAspectRatio "xmidymid meet" is invalid | | `svg-preserve-aspect-ratio-defer` | **both refuse** | preserveAspectRatio "defer xMidYMid meet" is invalid | | `svg-preserve-aspect-ratio-invalid-align` | **both refuse** | preserveAspectRatio "xMidYMiddle meet" is invalid | +| `svg-radial-start-fr-css-comments` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr contains a CSS comment this direct length parser cannot tokenize" | +| `svg-radial-start-fr-css-wide` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr uses the CSS-wide value initial, whose resource-side cascade is not represented at this Stylo pin" | +| `svg-radial-start-fr-decimal-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fr numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fr-math` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr uses calc(), whose computed length is not represented by the direct resource decoder" | +| `svg-radial-start-fr-midpoint-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fr-percentage-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fr numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fr-units` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr=\"4em\" uses a unit whose basis this slice does not consume (numbers, px, and percentages only)" | +| `svg-radial-start-fr-used-range` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr exceeds the admitted Web used-value range" | +| `svg-radial-start-fr-var` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fr uses var(), whose computed length is not represented by the direct resource decoder" | +| `svg-radial-start-fx-css-comments` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx contains a CSS comment this direct length parser cannot tokenize" | +| `svg-radial-start-fx-css-wide` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx uses the CSS-wide value initial, whose resource-side cascade is not represented at this Stylo pin" | +| `svg-radial-start-fx-decimal-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fx numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fx-math` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx uses calc(), whose computed length is not represented by the direct resource decoder" | +| `svg-radial-start-fx-midpoint-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fx-percentage-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fx numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fx-units` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx=\"4em\" uses a unit whose basis this slice does not consume (numbers, px, and percentages only)" | +| `svg-radial-start-fx-used-range` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx exceeds the admitted Web used-value range" | +| `svg-radial-start-fx-var` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fx uses var(), whose computed length is not represented by the direct resource decoder" | +| `svg-radial-start-fy-css-comments` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy contains a CSS comment this direct length parser cannot tokenize" | +| `svg-radial-start-fy-css-wide` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy uses the CSS-wide value initial, whose resource-side cascade is not represented at this Stylo pin" | +| `svg-radial-start-fy-decimal-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fy numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fy-math` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy uses calc(), whose computed length is not represented by the direct resource decoder" | +| `svg-radial-start-fy-midpoint-precision` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fy-percentage-precision` | declared | skipped svg/g[1]/rect[1]: unsupported fill value "url(#g): gradient geometry fy numeric precision alias loses Chromium used-value provenance" | +| `svg-radial-start-fy-units` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy=\"4em\" uses a unit whose basis this slice does not consume (numbers, px, and percentages only)" | +| `svg-radial-start-fy-used-range` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy exceeds the admitted Web used-value range" | +| `svg-radial-start-fy-var` | declared | skipped svg/rect[2]: unsupported fill value "url(#g): gradient geometry fy uses var(), whose computed length is not represented by the direct resource decoder" | | `svg-smil-animate-transform` | declared | skipped svg/g[1]: its authored state is overridden at document load by the unsupported animation at svg/g[1]/animateTransform[1]: animation element is outside the rect-x proving slice | | `svg-smil-number-precision-alias` | declared | skipped svg/rect[2]: its authored state is overridden at document load by the unsupported animation at svg/rect[2]/animate[1]: from source number loses Chromium used-value provenance at the binary32 normalization boundary | | `svg-smil-number-source-syntax` | declared | skipped svg/rect[2]: its authored state is overridden at document load by the unsupported animation at svg/rect[2]/animate[1]: from="1." is not a unitless SVG number | diff --git a/fixtures/web-first/chromium/html-inline-svg-radial-start.png b/fixtures/web-first/chromium/html-inline-svg-radial-start.png new file mode 100644 index 0000000000000000000000000000000000000000..9afa39cbd53452b927614eb6804c9a4dd55e0d94 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMYo0ESAr*7p+%n`kHR7^|M%nT_reVSHrQQ^VAvg(%<$t&IWwc6-7+nBdE zCtsa)HN%B_=exr76mHG@tjR4gTe~DWM4fP}Olb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-box-percent.png b/fixtures/web-first/chromium/svg-radial-start-box-percent.png new file mode 100644 index 0000000000000000000000000000000000000000..3e43dcc851abd9d139d096fa4349fc32bf572787 GIT binary patch literal 1986 zcmV;z2R-000MfNkl2{)2MyjXM(^uuP>-T&6vv>IC->^qn1bf7#C(yNcm;GS$ z?4Q`4638a;SA(DoMCnV-ndY2p!;SSCBO4P|%CB@(Hj%cH?J0|2{_zW+d+aNSC)9EF z?$Pk{X8d3jEfPPEyvi4i;2J+QOladZ+OM_4t)ildH!3cgLEa>JoviC5Z-%QnwU)E% z%5?|;3(N?Oej>y{brF)NJ-tn~~J4bY3o7+>?q#9^I85A5J9SLvbx)-ez- zS{;w)#b_Ch=jAdBSF>`ttR}N^gz(!1*iJ9~{5#M6{_(&5_6L90Z>0K}Lvt3|Wnc@5 zEOk~VlXIUC1Gf&KwG9n$>k#O1);u=Gos+0Y(|i;zhru{4S7|Uw%6#DE1Ai0KRYYD9 zdsQgQc{zsPz6Jund+cw2c=9hl_Fk=@Jv6Un`rVkR&lF#9plTdwvUjLNY+A&Y&cake z#M0J^#lkjRC}EUJ<4urMp;rfzF66y0l_wfh1<7&H?ul=9iuKzA=dwL(i6y*MccdS=(9;Uy!Y(T^nwDLV)I=+14kxb>}TZ zdWbwO>$p@QaeF3S4P9zg} zK(f-a$mxc9FziUt%qbqo4}zj)8#%3p?L%wH19s~T(iUV;O$3ezhJR9L$LwKo9>&`+Wn>Hs|X{mC1nqm@k*d7zNILT?hT-cvlYtsiVV3y~ir z5xD5k!guJM?ZH6_u`b7$i`JOxs$o0Tt(zg{Q_OtegNYUMU#W3`bD}FiUPa(^ee}wM z$B{#*)3DQV_Rj5_9|c*#3Ph1057fvpL9-B56-yIQo1JaGqTaU|+irJak*fkia~xrHH0ISmdXaT^6Mt3 z3M6O@LzEheLG*A#pitTF3ETaq+Uj+aA%4CT-cHl#S$=C?P9AIyPVB$9*%GTERX(OTdHenXW(4NymYG>X%L8AtRsU5jzjAc$D~eoTswE& z2k>o#(`kM*jn58}bIf7mc$xakB-lhAE=-ga_F!~VL9-c+Xh;gjL1^1fH38L1+KkB? z1-wD)WrR%4YZRYBTZ@n(%J^(&*>58wJJl!eEx(KXW)#kc;VKE%12@EnG!@r05eOQ3 z=xt6t2(F-7j^)_2li7tUK!73&JAOe-h=bXGIlj(L4Cmh89N+@bAw|(T4oWl%?8Khq zASjj|`T>cov~XRC`ff#a-FZWYZ5R8dm--7q&v$$6kmYoX1VA#ly@Zm1yTarq0`h}4 z7aTm?vad-lC2-mQVZLqB|7)>p=?Qc#J%O&JC(yO@1iF@i_@%07*qoM6N<$f-@t=TL1t6 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-channel-opacity.png b/fixtures/web-first/chromium/svg-radial-start-client-channel-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..dba16a20314da56cd7a2200fd1ada0849b4a6a58 GIT binary patch literal 2856 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-ellipse.png b/fixtures/web-first/chromium/svg-radial-start-client-ellipse.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb450d845c5e791927a67ff5987044a63345f0f GIT binary patch literal 2662 zcmV-s3YqnZP)000UbNkl>Ajbdq_mNvt!bcUHZb8h>-*7EnQy$5TQnK>qJ3F)F6&^MeI9bN0Oaody}^U)#qx?Q+TJ({Q?IolMa8*c zjB70_E0u&g5i!=iz&bwo;}+TYlYr?0wd+J*HT z)@ytMkKy<}shKp~Rm?No)6CP-SABofZx5znJc6wS+1hqH!+a9E(_x;3G68|1n*~`n z*m>lW@tMKdUmlT)BLQ$mXPy|Id-|@IzIFQLU|Z=oduqpJQ`cmIDFJ`yqPcY~weWH4 zinLcjGhea5F`nX~6ZvV}o<`X;a$$5DxVi6SzARjkdrk=tl=YMMz4JfYy6ab}bLnu~ z;vd|3$R{SJo*q8(%-t_OapL#lQlKt&)#aA{FxJ;Xv+J9o%O(%+5y4Yrg^ItxR3ofnQ z*1p=xCZ-!B=^f|wnLY&!+(F8M#hl_DP#Y~!J?Kmq(b9vvv(?ubH#Y(xxc2yuJAC<!wMG_l zC>Qxo6W`E*lXb2=Zgbp>0Nm||?vHm*^)}4dGgAi^u%if34PPg>K-5wsC~`3Jez;kE zR-9{#K?^Agn}3jn3J+(AGigr%65iwp_b6XN!!k2~-stRVyx9*1rVchwu_Fj~8V?}^ z+yb(ie5l4|=|6~%5!Z5eFx zv}h~dE!e@k+2fhyNWbw778#S(bP>yBs1VKNHCxB z^C?SstLaPY>{(|mi;XvEYgBH!Ix_&|fxHTad3z<^1sc(p=xKyww68=iO`Y$xwZ>Xz z9N3NTQw7pTRN>9;^bKWft9ZHBC=jL+O4%kQsa>go>D~xrUmVl zTB7%^G*T*MPawe!>izmq2G?c=u;)y6)8);{+DGGCPxP*d3SVc0YYcjuT>;KT@H_B z0{wlUcnSstFC9~|{ceYHi>KS0RxF;ps=kQRVCge zj5_!4^I*LkUPs;{YBp>h`_{5&*-& zGE>B3UhUrh96NBlJY*s>-stk_-?*2aMQX!@jvK-hJBXIL!JzApBX<&p=)Eu$8)PKW z)F8`)Ls3x~#G)*aYAVV$b~i!p4nL_k6jS0Mp4bh=q}fwIcW8Q6{?2{R8FzfJg@=!n zs)AE(Es9L zAA?Wng^=u1Q2{_yQ!!ZnOLE8aSc@Iis#!O4Jnwbhf9k~OY!3{0!h4$+jO!bSb4^kBl`hQJMzo5PU*<$N@ai;67D?d7x zu3Ilk$%`C{1eX9{A))KhnC4xB^i}&3V8}w(^|c9!y84c~?veZ@yO$n!Rp4mX(Y{m0xT8u=l~Yt4mXC|@YT3D>I`4i_*6W`N48l{czLv26t1SMB zY2LB`FmG7^n71qd%v%-!<}C{V^OgmGdCQj`z&`;10RR67Bo=l6000I_L_t&o0Ngi} U`^1L&&;S4c07*qoM6N<$g8M=s1^@s6 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-filter.png b/fixtures/web-first/chromium/svg-radial-start-client-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..672066bc5f9583f6cfc14941b49f20789b7944bb GIT binary patch literal 3186 zcmV-&42|=NP)000apNklVNB89v+H?|5GlaDbvpbWsr!s1j5yeD0s#!4S}Iymwa^bO74U(mge5VF9osYa z&Rxzqect!n89Q-^#}ii}Qcgy%k8ZB*_j&ilX6FyT70>cf;u$~B0X*&V9Kh2)=E65t z|MYvY)G^8?dK&3YODm=KUOKOOXF3prjAtm?~glTU~iMLarb0AnOBd7c!&cE11G*5|LR-h5&74aC2i9u?6fF^y3@WbcCP zt!Zu2SO7??E(7~FUG_@_$Kc2rpir~ni`lB-N0ue)tmUDY>yuYEzIbu;Rnl8ORlZijMovh2LwT=!6!}QkMO69hpz4Y- zJ}pdTQbePysRQfq7G}MJ-e7oIIVJ6Jv$6;qO9J@SjSt?r@!=c0AN_Ruv$*R0eq`%N zblUgeon@~HfQ-B|4%A0hCO(gdfOaE=`jtf80zSW|K&w_WBz4pvExOYBwGFH9?2I+e@N+z*sAn!=` zEOKTYOiPD!!M}mNc={>w+jq#mi**nPI zYo}u23`w134-8hO(pw7=JKHB|uhRnv8*M=&?FsY-fGhFc4%PyBJCZs-5C1DQvMq5BshPyK%8Zm0g+{P8c(_ygY$bBrefcgs&eQ7%~(>nW$Sp07XbpiadD#0ZLK_707yYmxut!XbIO5l#)5Y z(G!CwO?*nbB>~)6xpiaZYjqf2dl|3c_c*>FBUk6HiF|10}%lUec{v<5Ym$wl2E`IrhM;1 zb!29E!jn)VT@Ju%a-TXZQ*-q8GUmK_(LpI7W*EdQbI}(uBn2X#GeoE)#8AV5!n`QJ z3I`-|z;jA34FDx1Vgh|9tT^^EwX(d(i;<7vDT*)v2~|e{i439K2ezf0Lz$r_fQ}zi zVfP>^7iy6L6Kb;D%A!Zc{oZfjI+QS=e$j*k*(zW-)yZI80f}e*$iZir zeMUl5&Z!~?Qs)f#VgS%4xJP0q?o%hSUY5NmJGzSpf1G65!^XIZW(=M%XdjTUPN>|Z zZs9BvYW$UBh|Y&XniS;EYQ_)rA@(kgiTJswt5DOD)U#fd*43TrNwo-ml$%1W#%+Kw ze&9P|B;js6aUU>f;y%!@a9$D_DNzmYM_^$-P%nmy61CCxga zs*c~+qU#J{u!h?JWx1OPJq_Nrqz&zyJYUZ(0HDt?vAI88yH{`Ql!w0RWJ_ZQ(tvRS zon%LGLJVf)Lq|5(13Cm1b8i{$=rAcpk(AYd#P>9Er0T!-(Yz}F9y>!4FgR*@E)M_` zj+18PaJqI-Z|!dE%aX)JJqo$3_6=NwYlM(x*%L?)`XN1l+JNDVHeApKCXJXka!Ua5 z$6e^fs2z*gu7Y&|557TP8UTC%;yNR0X`f^bl-`v=I&3s9Q8#8DStjP$R}j;XQHewl#`5W$Q;m(%I7FrTe?zBB- zgBo7Q9?5$eOVXWM>}k>g!>Jzfpc#S(ZCKLAV_3Qz0A%IclWQ{ox^)r6QziL0J}EFU zH#9NlS^3a;Q2)sF84V0+S~$nRw$bsrY3>ihzHIR9stYuIWb|AT0M5N?(?}}@A7B7o zHcCqD#W0zQdCNj`EE<-g#KUw^(teVvnyBrmQfSU#7@{ZiVDnRd7$`PTNO0-n`B`Q^ zfP4%9mI1(oswA6q;~Z{4Yl|kLp-3M_{-JlL+88AoEhWK{wH_&@`|(1nf5tjPAW(K*#KJz0?%FgRFIJkvwYJL8~-JXp~p zoGia1LvBXBMRQ|ncTUQuXRtG?23&hwU8?)$Gg@MCfk$ZzZTIp6xFvD3Knhh8yyOxa7H-O+7lENm~|i zmFfx;W=xVX&BUCLCsP>6&t;E5 zpFbA^c?eiSK(>~8Ufd2si0RR6%Lq=i%000I_L_t&o Y0Ku+-b*X~B-T(jq07*qoM6N<$f?#^?U;qFB literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-group-opacity.png b/fixtures/web-first/chromium/svg-radial-start-client-group-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..a79e35ba97cee9eeccca6ddc32fdc06cb3b6c884 GIT binary patch literal 2483 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 M07*qoM6N<$f)}zh%m4rY literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-nested.png b/fixtures/web-first/chromium/svg-radial-start-client-nested.png new file mode 100644 index 0000000000000000000000000000000000000000..c860bd4e0ca21e24ace6f55ad5efd5ff7e135b26 GIT binary patch literal 1514 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-client-pattern.png b/fixtures/web-first/chromium/svg-radial-start-client-pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..b1c5b5e4755938ef22803b2c6c32e51f5fa93263 GIT binary patch literal 1016 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 Qv;Y7A07*qoM6N<$f=VW<_5c6? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-explicit-default.png b/fixtures/web-first/chromium/svg-radial-start-explicit-default.png new file mode 100644 index 0000000000000000000000000000000000000000..db364e69159ba04ec372f6558f22793e0eb3e86e GIT binary patch literal 3022 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 Qv;Y7A07*qoM6N<$f=VW<_5c6? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-decimal-higher.png b/fixtures/web-first/chromium/svg-radial-start-fr-decimal-higher.png new file mode 100644 index 0000000000000000000000000000000000000000..70b1e20d027d025c3da8c85b0e7a2aae2e8fc33d GIT binary patch literal 386 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFq(V1IEGZrc{A0}@34b_YkI*Y z;Ry}Q0YyD`_CFBYv5<436W8X=+d3yDeThA?Y3cVa&n?-JpKYb~p8Z~z|9#oZn(w7?TaW$sd|$Ug^2Hf%&8xPnD#e!t-G}%hzK+IpPN24X*M7*S0ZN zJdms7E1tBxT97bQ| T)T7r zEGxe-=vcbH-~U)>p^!AwB95NplS34R{+&{~s`GEPmG9maZ>sj)`}ehElJCv`Z{F?S zvipuL->uqTn@hys?)&|)pw8azyT88t@qcd%z7?@fs_ z=-y?&`dG5%^-X^nF3$9s>pDG*+tBl;2CMy1^@&^WBrsnL`Exnw*hZ`K5fbJC>8qtX zmaXvaN>V*ftjOztu znDOvi!z&$ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-equal-r.png b/fixtures/web-first/chromium/svg-radial-start-fr-equal-r.png new file mode 100644 index 0000000000000000000000000000000000000000..193800c802fdd92aea4e1f7943648ba8625134c8 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFnW8sIEGZrc{6LL;2{G6*Vf~f zlA5ss!j~BZw;Hl+ar6&i@vIP=`1D6F66^i7?j1jU{`l`FEOUSV&di$38OE5F_o&rP__AEU^70s$ zn~c+6OukyO_Cm=4^SyM4Qu&!Y&o=}<7-^!#ywl4*WP(!c*vyizWwYS y`652x08ngr#>~L*|Nl~<6(PXTWdj8(GsBH}snZs}JXQ!4VeoYIb6Mw<&;$T%?xr9B literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-greater-r.png b/fixtures/web-first/chromium/svg-radial-start-fr-greater-r.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2e384dbac17952b0fa4f1e7a7854ec5f221474 GIT binary patch literal 1529 zcmV000H9Nkla;s6m1ZQ9kfeGo|;r1@-g|%{8g&*Ff*2{9kH*1oJOvBa;uDE8%;{5C|+pboZGi= zH+>K$fBi{*W$@$|$6Y|%xC>|-cL8lfU|smp5o@XPIom*(Mn8PO1>qZ2Fj@~9Y)$=sO%@&Zme!* z`lb_CBs5nD~KEcz>FxR47NeX#xtQ9Nac!6-Zsk-t&rU39p z50Luomim)BU;6eYw4eOxE}Ct^@qua>;>F}mfZ)3K`p0B|KJ-#E$n+>z<6KG4a(?bE z%#~sK9LJS49nxGtL5z&I@>6Lp{f9?y@f6HgK03kP1k-Ia*@ojQ&wV{yu%}6AApCKG z@JrdbTbzY+)p;-n2NV5!|=J1BS+FufLVmRyh7%93#!4ZHF%3vFwf5-`2Zj&-`uZwcv%Wn z#dEZO%MM?DwZ1EQ+E@T;4n{3<28W?-CzCpfA|$N#YyrUpRllyA&@jUY z{si_H;6;d<*a7=g7E(osRWW8YW(wHXb!HnqYsfw(?^(cXxDIBrkksty#77u|fGJ=X zjh;1x)Ay}8uLNF-EYL*E*?}o}q|;CUX4zdd#EiQQN2Dbnf`;USy%o8{c)1NTt&j2G z7!ME8@LguBx1pkO937&8lMGpHm;x}#W1aKnmBM=g^R$x;oVdqoz)T^mPflr{+yI=U zcS@TJ@KVc7OmYJN6OYY=DZo$lPb>V_0UAMOu&y!%gn0|4lZ7DDSeKXr@L@r2263UX zE-?jM|1$h!Tv-R)cO}}!T|nEo3uqg60d3>|D*)fr@5Fnp=@`-hoDWI=7 zefem~Eo(sd2a3~^9aaOTfPs7*D%7{)TH6)^s*!paP#Vnz3{}d0tm4>`mH^LhsKWN! z50pKt4fB(7r0#-@`c`m$!c6`AZ+vWtB6d@4H&S+EZBNpdn=u7Uv^_|NaNVeHC11P~ z@>#&tJJZ+jTPNCPqHk#yq%Tut3V>hx>>1X+RbGle+%KQAQ-s1l*O#{bG^59Q3Juzh zI1PPbsIM(I>KW#xaPh6+oqV(guwNLD@L1=@Y7PM!G;F5YnvjM9;FZH|&Z%ce9Z#^o z_*N^={%M`3TDc zqZSE+%t7qI9vU9Zm2IrlGA%u^xd2b#cw(CVgSDi7Er$c_i`utJ;GOK_NmY?|LWP=v zQD+;-76^E<_0@xk@IP9dU%DcqNg50AMYzl0ZJ91-QNLE8>@%tMt>F9^QgHYWzZ(1m z=32}-sM;8*7_Ufobb@Wret2f@i%Vmh4%QgO$QSK8&@)NZC$wXrR>-d9PJzc@oLxZxz4WSOD=vnjjUS z1E3`E%HcM{uf?~8R{t!6WfGPsPI7dWUj3_vfj#7?P_IuHDDd+PUnZEo$?*89s%eV_@8+QS1<1V0W{0jg8|NlWxOfwV+VGvR%|*MGfr&ZqLm)Ti(7 zp1w9OyQgO3ow|SawSV^P^z-{LXJ_+lBT5AIvCL4uD_M#6BEOI9j*;PI`@X1X$ zz-(FJz{LOL0VAi)gu{Fu4;p0$HZO1Xje(57aql_Wed%V1WJq k|7qj0t3U=DD9D%@SQYq{UUN1~2Z}Iwy85}Sb4q9e0JvA2yZ`_I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-midpoint-lower.png b/fixtures/web-first/chromium/svg-radial-start-fr-midpoint-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..21f494ac03d675be3333bd4d14141226828ea07c GIT binary patch literal 386 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 Qv;Y7A07*qoM6N<$f=VW<_5c6? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-negative.png b/fixtures/web-first/chromium/svg-radial-start-fr-negative.png new file mode 100644 index 0000000000000000000000000000000000000000..db364e69159ba04ec372f6558f22793e0eb3e86e GIT binary patch literal 3022 zcmV;<3o-PGP)000YvNkl5nrjBOR)+l!0%;(lsq#nk(4Gh9ia+FHJdB~`7&Rw zQ26_Q{%L;Y%b8#N`U3FT*B5}#zPmhpdZuNEr5(BXfFxXPuTKt-Q%pv7=S({~T%|~4C z1pp~KKMl>?`g7-Fa7*KpuNGLH6AKu((gHrMJ{3qG;@X{4JFmkOyYfC7zYD$4z@2 zDg6XH^x+IS1OqIPyi3krEC5%a1Gq%>H!-(!>dv8`5`HzF;@mp^>KL~VnBr~#+jjrd zLHhl!gY<_@3p<>~cA_UhdS#J~!LQE12$a954-`;8i1h7D3-m)8juED#-5Pp7oG0&> z?OpQR2Vh6(f9$$F-fZ~-g^u(DIs+&KX=VvWv;d^Bj6x6{FLi(*4gmIdWPcp-{PE&8 zt_H5MpLe&5bO!+HzTZE!-=7EoFlYyO!X_MGf!+hg3{PkSEC7vGfy4>KgG&PoEV+XP z&U9SxhkoCP&-km)V5eelx5KRfpk_!6xgkA_Ks!_;9AJmBIbJ+LWU6k!TxKK+AqgZ2 zL16#9D*M47l1G?RLlzj9YtnEx`om2C7<1a=wjpx_1El}{ttWt8TkU{|G%^-JGKe*c z1rjMiCw9oeu)xgx1@?EtIv!ywADc=Zkgb@a?#_6XvR9A)7y#S$v}vemN=!TKzmZEs zvh5TDy!klPcse@}VWsw2Mu5~dbw zg(f?Rwo@A41puo)mr@!O`2-})bv-q>1YTtt^D1JVzD#O}y+!{Y$@ zW=5R@X7_#~muQDcFsN4$Lz8ovodI)jUm!g&SlXe+6-rMG0R=VelkLi2iO)i}f{hxW zDs8BB#93@KOw=8t?c)I8WUO!`y7$1qx(!H97q1`&GH3RXKA)Xke4d>Jix!K(SPi}SSfuL&n^l7G<}3USzR~K`U#xrQ{PKYgznlnOH5l}nMVL18lpl*p@Ish zb*yu$HNdFmEY>(F@6`gpU>30hK7j>R_Ay3$0Q@2QTS&hW6@!#74*p%n;mG8W5W!HH zLiecf&dev=owZ39Vq6{q&<4~ei*_o+z_qX_v@)x2fa_%Z;wlD6Uoqfw#v)72iv>Jb zUl^BY6F7mxH_n$5@VSFV`ey7RqZ4=Gj&sY(N;{;*n9bb)5PwjUNsSdXTUo@ z`jUj4%KBbbBp#w79%QSMB<4umd`5D$!va6%Qx==S zg2a0FE`@r(9{?&DRAZsuSN{S};5|vMwT$;*H5^irD2A&Yl2`zm?#O!s(gfrImB@7PzW)cY+U)fML=*hjKGD;9F% za;Ie2J=0622);@q%n@r410#MSXR6#)Vp*oXM>NtksSoa$K{Q4$+D~^ZKUefmE*a-o zQ@e5_Yl)Onpz)m%x#bHXim6Z6AE*|n25akoq(8RuBMyw@N2Sh=s@C+qy{uN`S9OQ` zEFhf}D`BZ;*j4F!-sz5@S7LmWt+d)6;(=^EG=^u2K1m%YG-q`E z%)MC4GE-mPU+#ATs4HeEaUm4Da_tNqCp_78j$U9?CJ(tGrLPgDpn8Sus93@(y*Z{M#!ZanB1e^* zaUC_BaGfznVn3AZn8mIb_@2+}Z!7*7gH%M=PVS}NE2?}y0QtR_d!rJgQjdJkni17Y z>8w=9B}1>!bR%_6&9z{N2XlR4eveY>sHRAm$5!M*tiFg8}?^fFpgK3^IpiAbO zxzqJ^b_6`v-E(=wiH%NS~9_cey%KhQm>*Lb2bY7Hcjj834y zN}bpN7}~7X0Fr6y&+BlGTp8SZugLJ4kgt6wJvi4A4RLk$8A)o!G@cf;zZ*;| zm}O-St-6;w2T{M&sLvS26l|oPqtJXkV>m`EIAYE<0RziY?xOpOzS>u6={EpGVM~>p zvk<%)WuC*CLhWn&h~CPvCtNj#(mNNpp1b-3>MHuNRzzSwxYSh)i)kC50jk+x7Bo>u1MM6uhSw#00{|_{zHXq_qs-8k`7+OWo++R+L~jM2 zN8^WD;9>+wd0Zg$Rxmt?^xK1S=>-NH9lR2MZUTS{ zX64BR`lE$?hR|kxo<`|Rp z_kG^&s~xsthw2r#Oc!sO%t0$n?K5O#>t4*#IM3m+*WAG4d+7|%jSif>PN#M3gT|JF z6HexMvec`lRreT2iyfZ!!l=V6Tv|SEHi|fKj5{GcXUNt(&oQO4VD@2N!(5SlZPaI3nPzPe06av)v{PXCZ5dbH7*Ow;R#f>8bSSGzdXUS-<&Ak4FDIm(fR%J40)~U zpPT-KxkylNk@Er0`vF+biS>M-p3u~|yZ|uVU{pIW7SX4_{SZ&MU8?&|XrLRN--||} zdpR=VB#`s|Q;_o_Uq}8g&j+LeuM>00vOJ=cI5S=%(&j+s><)kG5t9)+T=)=F8e#vy z>0Ov*p2Nw-@6U->p49tVQ{`@AG%EO?oS zNT`+0w;sAAmi0opTq_i*8hA*o5$UnB`v=d7>tS{3M#^zHsjuh6kUr{U!D_&&ogJjV zut;K&U>G!KnMbd8oz!D*P?cKCf5WCwb{oRt_`rTva^5(+4G@GZw|k*MACQa`}fyR z0sQRmbN*`A*Pony_Voqev#&1zpMCxE0R9I60RR6->G`Pu000I_L_t&o0MMDw4NxcM Qv;Y7A07*qoM6N<$f=VW<_5c6? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-percentage-higher.png b/fixtures/web-first/chromium/svg-radial-start-fr-percentage-higher.png new file mode 100644 index 0000000000000000000000000000000000000000..4f72091ccd0db9ceb3f7daa601420c0d09d96041 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFlukB)*5zL6ob)~N!}YT>RIKW)BS6#m)R82KvifmM;*|JVGb zcMs@XHA~oU&%F7{O^02_x6fnb{-4CGc=z$_^A2|B@85UW(VgDFCvt(2QTD?HMow9c z#mr1r4;DfQDXRb%c9xO@&gg_n$$}m}ju#E>5F+D+gP^Ry1x9{!VuH?%Mt@+4{r{i& hv*16F!3GL5W(I|34>8Md!K*+K22WQ%mvv4FO#o%enl}Id literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fr-percentage-lower.png b/fixtures/web-first/chromium/svg-radial-start-fr-percentage-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..116089c9c11285675bb7b3b07847952d0f014f03 GIT binary patch literal 384 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fx-decimal-lower.png b/fixtures/web-first/chromium/svg-radial-start-fx-decimal-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..4df98ef4097a23710170a89948640c6ee9ed9ee1 GIT binary patch literal 1796 zcmV+f2mAPmP)000KLNkl1o#{8Me z($sc@_mjE>iMYCww%T?8R*wh!ezYG)`*th<;A79{fEQQ<45MZjBV;I$nr2YQg8h}L z&tsn{r&yyPQ1~4LlVBHZvW)BB2Jb!8Nx2)l?0IZxy=?&iy|1$iG^fcr@E*)z4EEy>`*z@SI5kD7P?8~;pDIc#*|K`&mgQF)M-P0*a85%TbL_&0?ldi3wWQnbXvHy%i7o} z8uBn8M3D$c=!h(=ig2vn5xB&u4QT=1BQ4lED=!Y(Rd?#zg_>5{768b#1;6?#V+@Ge zDg&Kb&IYE9CmlNzFDi~II>F(hg0P+@PhRYHt+(p7@rdb+b3)4By){GUz8?VildB1V zXw8@_h5^kpFF7Fmpimwv`)sbXEV$OhPT)>GV`)=9Z-xIuLc19MwOP{XD#ORRKRf19N|or3qw}m{f!$ znaSW7H3~j_n18M*{J7Ge4HSwTn=(SgapIEj-~e7BI-@7yWpF|`8L;vmrLC4NF7MMn0@2A5!`UajF-KzhPwD~inXln1(;b3u zip!O^>(j4vdlSnFw9;0e0BT^=_jvdGt`Kt}U*`RlJ^fx3pL;nj-0EQ&G_|5rfDlZ28 zAsT=o)j59Gv{JI(i&C-X;0DDk5(S^Yd1_A69(7wc;Z^l>b#(==hBY@;)LQ_gJc{y* zcfB+X>U-qTrN$&aB3+kfWGm=BPJlH>Q8XURX~)BP+Q0XQ6F!VPU}(phPh%<gl^u+D7OBiq(<%S5R z&HVtLijod}BhyAAm9p{&9zAg9jyk7cVCd_)AAo9c_2$t};spRZc>iw<=ds3V&?egm z0GS7VXr_(7jUIwXjW0U)qA)cVXOeR-r4ztUh}5N{hp+Ja3&Y2-2d`q>(vHzRJu!p` z&t8}VrAfUN*Y~K9xvAHa7Sq>U2>J-^zdB5{cp`*dPZ*AGz%U%J6m7M;rV?o)BEsj` zCv_(U&wR{~r7G>`R3deiU>61umk9t6`T(&17!LQ0Bv4Uy}MYnL}(K z(Po$nrE7oz03ZYVVSe^t3x<9Dam~}v0rQAD@n=l4(fM;Wnnn*kMF=-yWyccSZ00>Z z767H%6#B?BLzVc$>akZ7%@NwikeB+Y7+6?FHc3_5$#1`|Sbz0{{U3 m|J5$0005JNklm4*+@(z}qQPBs`$51oL~ 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fxy-fr-quarter.png b/fixtures/web-first/chromium/svg-radial-start-fxy-fr-quarter.png new file mode 100644 index 0000000000000000000000000000000000000000..9afa39cbd53452b927614eb6804c9a4dd55e0d94 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMYo0ESAr*7p+%n`kHR7^|M%nT_reVSHrQQ^VAvg(%<$t&IWwc6-7+nBdE zCtsa)HN%B_=exr76mHG@tjR4gTe~DWM4fP}Olb literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fxy-quarter.png b/fixtures/web-first/chromium/svg-radial-start-fxy-quarter.png new file mode 100644 index 0000000000000000000000000000000000000000..6f14e08d3e6cadbd4dd34e92a6c5112811924882 GIT binary patch literal 3153 zcmV-X46gHuP)000aINkl#6`h&gnO#z($ctq`Uv#dm_+FHK=h#>o6XQ}$Ju6>ZDVV0p^Kp#+f8h@ady$qHt}fH&o8icNBL%9d?NyHpZw#kwX0K2K&8|O_*}|XC{I+%j_dc1?_&$OFVy4-S0Nrkeqjf)DHw*0gVpyE}^{QVY z-r9QGRNGa5j2JWfUxyI*>76fr@x~|by!PqaCx3r)`4I7Q(mtO1iwdx_HQ0V*x$%hj z$Z*G&UjY4pu)$+Jua~QS(-3zD#X{A4Hy{+xyW{mRH+x=t6ZqvDe|!J*ukXG7@w=~o z1_e%M-)10RRXNt#c$6Glne0;VDb%au*?HIabzH8x`FdE+>IGE7egn6!dgOY&9Z3`}=!5%zdH?jIU)}roojafA$07Y|mN!6;u(t`jU!i6u>vQ(W z1ZP5O!q|lGX4R(YWwW~hNm5q?jR!zi4yq*to}qlW@_D!19nu~Iu=gMQ=)>RK|MLg; zKm2k1&-7rP&b(Rs+*|IsNwzk*PBsAjXafi&)22L(=m%}s)U!B&PEJ5uf)>d9+v+NP z!|tBeyAt@>oi7kM@8A27=x5mmP0j)6ZH~m90kR=JK=n;T zrPAggpz)eZTmc$S+{j(1xMr*sl4loSI}t$5dGC!+5ch~2?0tSXPY>GkXqL}v6Dxe9 z?z(GpiqR4GD7hTDA~383hc$H*mti#~ftZL=)*5|!Ott*8j$;)AUg2XH{p}EV=e5sK zbKbrC8R9;DH6I@}*nV)xPlDmDC+>G^7)7SabPxy;;0CwRI;;jS=o*^-C|tl+44&;7 zD}izi0}+QIu<;Gv^WE{}76_nQy?yefuFP754IXDcKMja}Vg*`c;*hYK0Z~xpL0|cg z)uB4^XDkYT@0)(~eZmUdO&2$PjWx`C1HUxmyFuRFpmSdj?*(n#yNF)<*71Wkmk;it zVy^1Et{L~SGR)V6Fh+zJMmf?F*2m=$tIY_a(HXARM8kaG>JU~)8mXi`)|Pz$YkA)M z_w#N_nL`QOUwjRxa5{g4ZiRZEx0UHwMHu%@GL2Ns3cH@!!SHSJcTVI3GsKumtWm=1 zYW3CN9s598+0pQ%3$o%lU#ZIT8xa6*_?)}5vyCiFN^oH0lS8)7 zNY>iIgvH%}k5PS)2jGT!Ya?23%?7L-o_&tirmPCL!wHVd}w^1$1zT-i@_92NO>wL*VPfH6X7` z;^XjS*{t9((f{FdfLiLkVZ8@>IG>7`h|f_3Q_F))7&V0nS3}4Yf-Bn>atDEEQst5~ zW3FTZxRtDA0vfS`GHyiGI)uQYSmmY}h$gZMhiSFkd|`6g!AsbjYfMR42`BMwGtm)VWou*dZh8kd-lJ(q!Ue3!l9Sh&yMB z68(rHc^m3;qK5*E`$&(V3NVT!jwY1s5?VUqPUMDUj! zjCsbl?nOWv5l-be*WzRto8#G2qKET=S0fff?*Q~kzs_hM5FHdZGu})UHoK`hp^uOB za1#f|ehwy?5k+%qOmWw?Ffj+@z|~A)Y_>Sp#(9@Q6C(Y6p6VkM7$pac3?ZhPQ?gk& zFcT&nL?3pzm|@haC_YrwV7kCjm$;&@ws|@sP!ntSCV)?gG7;IvfJqL|NetBA}$&VAR4R`?ku8-0#}(J=tn*jZ~%+fH8V*FtIRA0a$qOII%pH_|Z z2Xx|^?vgpJ3a~3%y3opIH}zwwLb5n)HR5g|nPFFGKr0wzc>3qnAc=ow8oj3vvf zy$K|qN*kF3GWwxFTQ6a-oQ!N2VbwIf1In0H0huaj637WbeMG59*g-@N=W{^c=_)$N z+|EyGTt-wmTS}#3Tpf}FxVn*ZOpX3|K>Tdsft|Pr?8;HVQ0=0^S^iRiQZckf$(*I4 zXW*G@!1)Wf5tB2bAKR|1dh!a99OPg*MHKQ|vVzt28j#l!m~wZ1c z6+?4ue_vIjBrFuDhJYmTI03@D%b*J4Bt=i}R3f;RdM^>eXyJaV0-IPOO7np_NGx?F zv+FAksXCAVMbPS5FEPjTdd~vB$2h6nzOPZKL;*LHiIt?n)u=~A5FLV41qphIpKW|b z4dtMjO(vyAX-;2{@C9#Ul8gyBX2>|3Vvboc0fYb)@HKX;9eX)FVd@se(3H|yJWC^}3WaN|QNEY%32hS$u#5dq-9ln?O}SU>?W>x(hrp|gLU#4%ph z^M@@4T&d`;7U`}_bL{z`S9fO@FbLaiB z7EmYtY6@;-Fmr&><&XwCyH)F}8wZcciKosCrPr3I=ov+gc6vp>nRL($(Qds9ww(xI zC%{2k7*jaQ@Kx@7c_-L=umo^`Zc#{uM-swcMd_)A=Lo59cy));q0|&0^-LLl6<9 zCya`|RrD{+-MtAI2GUaR`!WYc^a0lFRwrszxoyFdxQtD-7EyueJ~6D^K#zcp*Ziqv zD$2UKm3+9=0c3VZwcj0@r`=KyI#FiGvl^ky`z}Egs8ob04P@@12ct4ik5e|YB57Ml zYKNp1ur9TGq2HT;k)ouP5fkuU`vB*doCi+xoFp>^&PkaGsnk;qyvuAZok21|YCjYR zyGPF91aRTriJBa#=s@3XIo6ayr1$D%I-)-;U707WaXNX4zwlC#w7Zqguw&NV0s&kS z11I=mC{S_${a7oh&e)t}KebLe%WJM}m%pn&K-Q<=_|d#0KO zDuSNPg@e1ituz@V_U4@JO)%W_cO`&N?SRb3N3k2U+?+=87N0Z@>n{DN)KjNk-`vJ^ zYrm}`zL$}}+2B<-D77eSE#iFPM*IE0*K-Lx@Aq@QZ`Z3|IeXdHD*`Y3dPU%6Uq5&P r{{{d6|NjpZoR|Or00v1!K~w_(9dZ-LCyP##00000NkvXXu0mjfZz>X_ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fy-decimal-higher.png b/fixtures/web-first/chromium/svg-radial-start-fy-decimal-higher.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46edf78baacdcf54968890f3feb78ae6161ef9 GIT binary patch literal 1808 zcmV+r2k-caP)000KXNkl^GM;fLF^Kz^mmA;MMX5@M?Jjc(uF%yjtD>UM-6KfM~I383hlLXA&+$6fx^1YW8e- zCIBsbttYEyD;Fia5{a{f?^EV6tB}+Z%^a#J)c$!$o&!LM*y?L*##)WFc3L2762%1pvJd_I#+Wo#}T3U}*Gg9*~CsK>JhmajebsViaYHx>H-PT-$ObQ1ird&V>L3>2ME1p@?tAO@} z+!S3Gw`cdu763>u$e6G+Si3X*fiRqp^%;CPzz?Qx!2~rbL-fP8Cxjf^T(Fa=p?YJcYME}!j@>C+09ZL8&s1tctRruBc4*CYPZ;2Yvz&7t zbe<%0G8YeInYoS0McoB39&ry!l&V}0rm6kdsHu`T(ES?#BoD~(MmoF?Os&s zbox3CWdSGPp4};TdjKRW(+T=}RqoLRC`yY-*Lum&*d*i}-o)&^kmM!NL{jlt#!0oJqD|cgo!lARwUk9Pr`_*STbLbosZXX>`{%BU-o= zOKd{#KrSGw*FkiVwVt;T&GYEHVWFqcp8`3~am5xmoZTr~Dly)QB055E-=IGmba!1w z6lO|}jW>JG5!D8{UxLczC5hq(Jl+K-RX-hix4Zcro*jKV6#QsZ=eVV#-UJ{tBlI@y zZD|{`tK38r7BYJ2bI_Sqr-|1J`Tn~SGgN>kjmci-)5mnYxI;hhuM0liK;8fnocV77 zK(4s?u30d7P1WoSEm5eyhvC;ghi1!aw4LLL@*+|TA_SPx>Y!&n6Nb~p9WN^e*TEZz ztGsDRwQ(N6`)ZnNQB7%sQYt9ro6_7@13W{Mv6JgOkQExax$xw+0KnnwPQRuTuDI`) z5>Z>H%Iza1Y+05+u>IHaC#kY`AU2n=-LGR;TqpWq5%GwbtJ@=lK4!vzh&oTl-W}Lh z*$x2x@W*@m5iB00(IQSMdWLWLxE- ztpsw>U*msLLLDtzH&T&yK9rG4XnoJbUt0;9U4{i1cCh++K7tPz$Jhh%=w1jq{W+>N zLdwkE(nL@FJx0f{a)9{R0yaBvg-T+=L yZvd~B-yXo<00030|4a_h)&Kwi21!IgR09BAUAI1ggd`>a0000( literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fy-decimal-lower.png b/fixtures/web-first/chromium/svg-radial-start-fy-decimal-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..4df98ef4097a23710170a89948640c6ee9ed9ee1 GIT binary patch literal 1796 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 A&;S4c literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-fy-percentage-lower.png b/fixtures/web-first/chromium/svg-radial-start-fy-percentage-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..4df98ef4097a23710170a89948640c6ee9ed9ee1 GIT binary patch literal 1796 zcmV+f2mAPmP)000KLNkl1o#{8Me z($sc@_mjE>iMYCww%T?8R*wh!ezYG)`*th<;A79{fEQQ<45MZjBV;I$nr2YQg8h}L z&tsn{r&yyPQ1~4LlVBHZvW)BB2Jb!8Nx2)l?0IZxy=?&iy|1$iG^fcr@E*)z4EEy>`*z@SI5kD7P?8~;pDIc#*|K`&mgQF)M-P0*a85%TbL_&0?ldi3wWQnbXvHy%i7o} z8uBn8M3D$c=!h(=ig2vn5xB&u4QT=1BQ4lED=!Y(Rd?#zg_>5{768b#1;6?#V+@Ge zDg&Kb&IYE9CmlNzFDi~II>F(hg0P+@PhRYHt+(p7@rdb+b3)4By){GUz8?VildB1V zXw8@_h5^kpFF7Fmpimwv`)sbXEV$OhPT)>GV`)=9Z-xIuLc19MwOP{XD#ORRKRf19N|or3qw}m{f!$ znaSW7H3~j_n18M*{J7Ge4HSwTn=(SgapIEj-~e7BI-@7yWpF|`8L;vmrLC4NF7MMn0@2A5!`UajF-KzhPwD~inXln1(;b3u zip!O^>(j4vdlSnFw9;0e0BT^=_jvdGt`Kt}U*`RlJ^fx3pL;nj-0EQ&G_|5rfDlZ28 zAsT=o)j59Gv{JI(i&C-X;0DDk5(S^Yd1_A69(7wc;Z^l>b#(==hBY@;)LQ_gJc{y* zcfB+X>U-qTrN$&aB3+kfWGm=BPJlH>Q8XURX~)BP+Q0XQ6F!VPU}(phPh%<gl^u+D7OBiq(<%S5R z&HVtLijod}BhyAAm9p{&9zAg9jyk7cVCd_)AAo9c_2$t};spRZc>iw<=ds3V&?egm z0GS7VXr_(7jUIwXjW0U)qA)cVXOeR-r4ztUh}5N{hp+Ja3&Y2-2d`q>(vHzRJu!p` z&t8}VrAfUN*Y~K9xvAHa7Sq>U2>J-^zdB5{cp`*dPZ*AGz%U%J6m7M;rV?o)BEsj` zCv_(U&wR{~r7G>`R3deiU>61umk9t6`T(&17!LQ0Bv4Uy}MYnL}(K z(Po$nrE7oz03ZYVVSe^t3x<9Dam~}v0rQAD@n=l4(fM;Wnnn*kMF=-yWyccSZ00>Z z767H%6#B?BLzVc$>akZ7%@NwikeB+Y7+6?FHc3_5$#1`|Sbz0{{U3 m|J5$000Z}NklAaPK0XM%_xK?2-s6M7dynwaA5Q=IcXQP6E|sn={pj83Z00a- zOnyvdJC-SXbJV!|%isRz`@y`?SQhJLxn2~TCTy$F6|N61I-BsPlx<8!pNej*wqvsy z7VCbw9+u`U#?KOfy-&;A)B1i@-k(&D%i?iSw3P>k!P~(*^?)CuA5yg)Kmh0$kHg7* zhu7(CdwR4_-hjY)b8}wvbz0qhs_#z9hgAs&9>Dq6<_}g8gCRK87wr zJoS1wdFWO|zdgOJ&%bZsw}<6s{e63}85(o=IEKJkeS5LEx&Zpc^_S-Ab93{#`F>X4 z;Qde4{YeQGt>J{y4<=cDz~&*B+o9eJ%LkfYY+n(*cx;WZsY83Uxx8)9%z@)z0zmwA zd3CY)?Q#k8f4f{V~DgYXmm;3!Kc=n&XdDvQ?hVD zcG(m;7tz+q)e)*&RSythT>yGlx*=FXwnDg(V; zxHODbJ(CRNME@9&#LLCxWA-e0ISeV>cc1nFwikgawCDBhnW&t3lQRh5S1|dW*FYRN z1O0=iA0EXIU^1W(7+a-WN4Io&99*(|hq$wK@aol=g1m|$76a-X=dzD{wPXD@1kS4a zPZg^b^8HzThe*}=yuLH7HEl>+B3At*<+Jk%z&4{@32v&xSeKJG&gXb?1{`?3cUaXcivEmqi7pKnTbEy~R7<^%@UyO@K&siER^sL`3MJCjPK%B(8W)ZyYNSpGlxeEg*>Hlcp{%Gb-L?g zbqs-$tMsL=>w0vT!43gC6;vM=^C-Bb{16L}!NzEyp_~$mfxRua0{Amn!6yN(5YKpW zu-YZzN4$pxgOA<~dX6tWMks9kO#YyJZ0qvsJmHqIV#`>Mu@PoTw$80f%QQNt^gA@NZ6MaZnQ7w zq8ACsehTQZ1dJVNOj_NDW?1C^m>&g(*xL-~wD$XzV4 z=0FaGaKNrkI8c&y3W`GsP%}u0v*M*qN5>l`^a=fASyio*tdAgM8bs`()ug7Oeu)8w z=#;NCX5g+}B&au{aXq`yvX_;~A;MT;%q)8n+%CW9fR_o#C+W?UsQ72-OFnO?T3;7q zkKPWkEBb-@5%|oWaE417!4#r%5*t&t%}+5P9NKZ!4z+Sn>+o5L95gDT*zpJgusRh# zOv;gc2J95rxK|#{I@$`R>bmSQ^Q@zdnLXLnF@m$56>Me|Nd=fVB%+tI7TpH)u@(-M z_yLLn0V*m%QR#33ie8n&T@po4<=}j?3iWoxxmAN&BMC0oWe@cOrbWU=2r7EoP4c=_ zWa%KJ63?;QXB@ON?YO{+i)>%2PB_3D;s=PzYh;7N!320B3*|^`!S~QN4Yn-Uy9`Tkz}{sG0w?<8hV=bhq>Uav^YjzZQlNQcV_b|< z2pGX)I%c6HC!|;a$U0FAlp}}L&1O>3?1$lZS^|t?3E)JQ%E8j;t1ILRwf!^kWT|mT zc0mY~g+mjMz`#9;JFcl3x`?9`sep{AQDSM}7G78IUrtA5}UD~)N~dAtWOG`n?v zQqFdeqbL=RbVgG48EREPH3j-o+F)^!blu`2qZwIGP&A^ZV+f4|IdgAE$w+($(3Jz9 z{yM@R5FmQ$zAHl=hG9mQ?9?M^f8oc1dA15b1_`kT_Ppnr2josx+4vcb+eYk2&d9sI{^Rm@#=*VYRfY`e|2$Z4t4T9m2@Ho3rYH zG<(2C+4x8dOf|6^3yH3Z_U>!=VNC+cfhv-$`bH;nu!pVzgG{XY`y_9$$2Q0e}wtY{h;cIKPx*D_F9!UNf zsQ!+-Z?913jAoK?lFbwD>%{dWYL(~B#)chk64E;lr=V`iLnD*{3Wd9T9g( z>H)22^$+`nw9d$1hLdKL7v#|Nk>1r*HrO00v1!K~w_( Xp{Vx?FZPGB00000NkvXXu0mjfw9N5Y literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-graduated-focal.png b/fixtures/web-first/chromium/svg-radial-start-graduated-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc5a0e12cb1ec10830da29d3e2ce781415778c6 GIT binary patch literal 2343 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fr-exponent.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fr-exponent.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9de0977f3e77a4f568fb023b13d10b7cc7fdea GIT binary patch literal 3215 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fr-nbsp.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fr-nbsp.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fr-signed.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fr-signed.png new file mode 100644 index 0000000000000000000000000000000000000000..1d9de0977f3e77a4f568fb023b13d10b7cc7fdea GIT binary patch literal 3215 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fr-whitespace.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fr-whitespace.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fx-comma.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fx-comma.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8d488cc0bd5f3dbeeb7f4ffe304b27f65c3a5 GIT binary patch literal 3123 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 N002ovPDHLkV1kl}_G|zE literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fx-exponent.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fx-exponent.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4902575e6e2548dc758778073a8e922fa5a18d GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fx-nbsp.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fx-nbsp.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8d488cc0bd5f3dbeeb7f4ffe304b27f65c3a5 GIT binary patch literal 3123 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 N002ovPDHLkV1kl}_G|zE literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fx-signed.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fx-signed.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4902575e6e2548dc758778073a8e922fa5a18d GIT binary patch literal 3147 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 N002ovPDHLkV1kl}_G|zE literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fx-whitespace.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fx-whitespace.png new file mode 100644 index 0000000000000000000000000000000000000000..83b8d488cc0bd5f3dbeeb7f4ffe304b27f65c3a5 GIT binary patch literal 3123 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 N002ovPDHLkV1kl}_G|zE literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-comma.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-comma.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-exponent.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-exponent.png new file mode 100644 index 0000000000000000000000000000000000000000..6f14e08d3e6cadbd4dd34e92a6c5112811924882 GIT binary patch literal 3153 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-integer.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-integer.png new file mode 100644 index 0000000000000000000000000000000000000000..cce640c3687dfbd22d4882d55d7fe43be8ed1e8a GIT binary patch literal 670 zcmV;P0%84$P)00070Nklr1(2ckew*xZQ z&aJ9aRh}d&$S|o&(=%r>)JGF~aT3m#|5SA+bo<={GGu%*aGU@(P5>JxfDN@NdU|;8 zpj@ulEU)66kC_~^>IzpOmqDchA*s~x#aEh2<>}6w;(OZnD(Wlh@qkvL&!T`uG@Fl) zcNRZhCGSa3tORl~&BY|ICb@`;Dk`CS37-%g>h2YEKhngrxs=kLs%@b=nxu-^xT>h!`A72@a4$#2OQ&;g(x<|36?d5;Bx^ZoVS* z@pgIr`{GNltC$lwD!1AM3h^fa=$kbOkWBz{*p4CycrbuHF)!j&%u*ixogdJskDKcL zA8=m|%lUqh-2L{f*NNr?QZ}t8hu3}A^HYtRnb|zB7!HaBA^k$INno16{8Vw9z!`Pl zBK2r5zjpKUOZ!s{-8|WSnDIDoyB8DPdqjH!yYOzhZC`H?_?0JFGe5A1^*US4I%w@D zpI%!Q8`i)vo3{y^>ExUQ)`MlGp{*60Lia)jqf;}e3!)sJtCHHHyN zc}(!IncJ?4TVG$mzDZCq4pLVF`{j~cc)AjRe?jB|&>cco0_VJSuE#K*$T~u}ypNQY zza!|lw-VSm0c@NAHckK=CxDF;z{Uw+;{>pA0@yeKY@7f#P5>JxfQ=Kt=G2$FNB19- zA>c*`8z+E`6ToKh0>1$O0RR7fZIasn000I_L_t&o08NG#9^5ko2mk;807*qoM6N<$ Eg34zpZvX%Q literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-nbsp.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-nbsp.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-signed.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-signed.png new file mode 100644 index 0000000000000000000000000000000000000000..6f14e08d3e6cadbd4dd34e92a6c5112811924882 GIT binary patch literal 3153 zcmV-X46gHuP)000aINkl#6`h&gnO#z($ctq`Uv#dm_+FHK=h#>o6XQ}$Ju6>ZDVV0p^Kp#+f8h@ady$qHt}fH&o8icNBL%9d?NyHpZw#kwX0K2K&8|O_*}|XC{I+%j_dc1?_&$OFVy4-S0Nrkeqjf)DHw*0gVpyE}^{QVY z-r9QGRNGa5j2JWfUxyI*>76fr@x~|by!PqaCx3r)`4I7Q(mtO1iwdx_HQ0V*x$%hj z$Z*G&UjY4pu)$+Jua~QS(-3zD#X{A4Hy{+xyW{mRH+x=t6ZqvDe|!J*ukXG7@w=~o z1_e%M-)10RRXNt#c$6Glne0;VDb%au*?HIabzH8x`FdE+>IGE7egn6!dgOY&9Z3`}=!5%zdH?jIU)}roojafA$07Y|mN!6;u(t`jU!i6u>vQ(W z1ZP5O!q|lGX4R(YWwW~hNm5q?jR!zi4yq*to}qlW@_D!19nu~Iu=gMQ=)>RK|MLg; zKm2k1&-7rP&b(Rs+*|IsNwzk*PBsAjXafi&)22L(=m%}s)U!B&PEJ5uf)>d9+v+NP z!|tBeyAt@>oi7kM@8A27=x5mmP0j)6ZH~m90kR=JK=n;T zrPAggpz)eZTmc$S+{j(1xMr*sl4loSI}t$5dGC!+5ch~2?0tSXPY>GkXqL}v6Dxe9 z?z(GpiqR4GD7hTDA~383hc$H*mti#~ftZL=)*5|!Ott*8j$;)AUg2XH{p}EV=e5sK zbKbrC8R9;DH6I@}*nV)xPlDmDC+>G^7)7SabPxy;;0CwRI;;jS=o*^-C|tl+44&;7 zD}izi0}+QIu<;Gv^WE{}76_nQy?yefuFP754IXDcKMja}Vg*`c;*hYK0Z~xpL0|cg z)uB4^XDkYT@0)(~eZmUdO&2$PjWx`C1HUxmyFuRFpmSdj?*(n#yNF)<*71Wkmk;it zVy^1Et{L~SGR)V6Fh+zJMmf?F*2m=$tIY_a(HXARM8kaG>JU~)8mXi`)|Pz$YkA)M z_w#N_nL`QOUwjRxa5{g4ZiRZEx0UHwMHu%@GL2Ns3cH@!!SHSJcTVI3GsKumtWm=1 zYW3CN9s598+0pQ%3$o%lU#ZIT8xa6*_?)}5vyCiFN^oH0lS8)7 zNY>iIgvH%}k5PS)2jGT!Ya?23%?7L-o_&tirmPCL!wHVd}w^1$1zT-i@_92NO>wL*VPfH6X7` z;^XjS*{t9((f{FdfLiLkVZ8@>IG>7`h|f_3Q_F))7&V0nS3}4Yf-Bn>atDEEQst5~ zW3FTZxRtDA0vfS`GHyiGI)uQYSmmY}h$gZMhiSFkd|`6g!AsbjYfMR42`BMwGtm)VWou*dZh8kd-lJ(q!Ue3!l9Sh&yMB z68(rHc^m3;qK5*E`$&(V3NVT!jwY1s5?VUqPUMDUj! zjCsbl?nOWv5l-be*WzRto8#G2qKET=S0fff?*Q~kzs_hM5FHdZGu})UHoK`hp^uOB za1#f|ehwy?5k+%qOmWw?Ffj+@z|~A)Y_>Sp#(9@Q6C(Y6p6VkM7$pac3?ZhPQ?gk& zFcT&nL?3pzm|@haC_YrwV7kCjm$;&@ws|@sP!ntSCV)?gG7;IvfJqL|NetBA}$&VAR4R`?ku8-0#}(J=tn*jZ~%+fH8V*FtIRA0a$qOII%pH_|Z z2Xx|^?vgpJ3a~3%y3opIH}zwwLb5n)HR5g|nPFFGKr0wzc>3qnAc=ow8oj3vvf zy$K|qN*kF3GWwxFTQ6a-oQ!N2VbwIf1In0H0huaj637WbeMG59*g-@N=W{^c=_)$N z+|EyGTt-wmTS}#3Tpf}FxVn*ZOpX3|K>Tdsft|Pr?8;HVQ0=0^S^iRiQZckf$(*I4 zXW*G@!1)Wf5tB2bAKR|1dh!a99OPg*MHKQ|vVzt28j#l!m~wZ1c z6+?4ue_vIjBrFuDhJYmTI03@D%b*J4Bt=i}R3f;RdM^>eXyJaV0-IPOO7np_NGx?F zv+FAksXCAVMbPS5FEPjTdd~vB$2h6nzOPZKL;*LHiIt?n)u=~A5FLV41qphIpKW|b z4dtMjO(vyAX-;2{@C9#Ul8gyBX2>|3Vvboc0fYb)@HKX;9eX)FVd@se(3H|yJWC^}3WaN|QNEY%32hS$u#5dq-9ln?O}SU>?W>x(hrp|gLU#4%ph z^M@@4T&d`;7U`}_bL{z`S9fO@FbLaiB z7EmYtY6@;-Fmr&><&XwCyH)F}8wZcciKosCrPr3I=ov+gc6vp>nRL($(Qds9ww(xI zC%{2k7*jaQ@Kx@7c_-L=umo^`Zc#{uM-swcMd_)A=Lo59cy));q0|&0^-LLl6<9 zCya`|RrD{+-MtAI2GUaR`!WYc^a0lFRwrszxoyFdxQtD-7EyueJ~6D^K#zcp*Ziqv zD$2UKm3+9=0c3VZwcj0@r`=KyI#FiGvl^ky`z}Egs8ob04P@@12ct4ik5e|YB57Ml zYKNp1ur9TGq2HT;k)ouP5fkuU`vB*doCi+xoFp>^&PkaGsnk;qyvuAZok21|YCjYR zyGPF91aRTriJBa#=s@3XIo6ayr1$D%I-)-;U707WaXNX4zwlC#w7Zqguw&NV0s&kS z11I=mC{S_${a7oh&e)t}KebLe%WJM}m%pn&K-Q<=_|d#0KO zDuSNPg@e1ituz@V_U4@JO)%W_cO`&N?SRb3N3k2U+?+=87N0Z@>n{DN)KjNk-`vJ^ zYrm}`zL$}}+2B<-D77eSE#iFPM*IE0*K-Lx@Aq@QZ`Z3|IeXdHD*`Y3dPU%6Uq5&P r{{{d6|NjpZoR|Or00v1!K~w_(9dZ-LCyP##00000NkvXXu0mjfZz>X_ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-trailingdot.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-trailingdot.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-grammar-fy-whitespace.png b/fixtures/web-first/chromium/svg-radial-start-grammar-fy-whitespace.png new file mode 100644 index 0000000000000000000000000000000000000000..096e78b8046eb3bb8d2410ba1db57bb09b441851 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-mapped-viewbox.png b/fixtures/web-first/chromium/svg-radial-start-mapped-viewbox.png new file mode 100644 index 0000000000000000000000000000000000000000..753e216af578324977fe4affad77c37fe267269c GIT binary patch literal 1690 zcmV;L24(q)P)W$$ypQYf#*FSoD@TLEGE&Nrekqr%zBBdf(6?LFID(hJ@PX#nk5mfF) zySSG$s@x&otB>#3!`<@uUOl{Bt?bpSyX8t34<*Kx)f890mu&35@$O;(X>1<*`<;_t z)L%aqt_|W|78|W1e8YW=7S@Amz(COl1o5#+VUYuvNYvX>R2i1AcNEs=pVK7R9q=DQ8|(@>4g^s1-WC;|(fYtX?vWFiLs zJK)e{m_VCIk+f!7EzE{vZSaoo+p_ks-a4*))w6Zw%APHtg)Iuv+*O6GOIOTsc$Ycw z^8UrIyC=UOi$Zu_DjPcfj=^DhxVC_|8q88TOiK z1gt5}B}R!^-Q>nW)p7vuJ@;w&v#;h4RE|SM(Znlj(9w75wYV2HRGJqOPnmYDKZ4!F zkYc`mAl80K0C(Ypx`&ZGiLztN3e_ol4Lp})tC-UANuCidGu}{Rp)ks^sKyn?vF@%f zmx0r(*Zt)cbx(u1mLe-ny~c@e)oFS+DNk&IxgcJH#QtFH!GQGPGnCe~g#ccA;@f!G z+&yH(boZD-YE^iYxbL*3io8DIGX`lQ007Q&tT@(_SaT95x-h^~>sP3lS9}NVK`JfQ zB+rVvC&p-qTP&6S1F9&>vxK(|R<1vNP^pcL#B=`m;bXPfr8TGSWx#}vqDt2OmO)K* zrUZCn<13v;`HZMc5yhpYWTv+<6E0CgAzFH*qTbz-K)fp}-luT0KrI7TN#c>rM9I?B zYw|6nN0KGkzeOcgZT@IR7Y5j^R`iLQHY%F8P({knP)KKC0yAL$HHl|J)w*wardf*o z3ARV9ky0E|rKM-1x;BDnVSt@GoAhXsrLjj~uF$C|UB9AxYm z8g0;dj9D8CLr6K%tV{xjTCy==aKWHTJ*xpjPzF5woyf!?Oh`=Z3UM)j-*(U3)T_hI z%I{nJ-Izxzv75@Wky4tfB|ZD(UX-t7;v4;TOTx9py|>hr5)vQLff^SqNW3U`99l#0 zv?@H3B~UF4@XM{Um;Tv$W#dPUE*iU!&BF+LqTx;i;RanE*gY6>si;&}S(^>v zl=+Y<&8WK0&{PWmlOzToJB?h9;PEZb;sE>g%B7uWUVY(vx?O6AXQ^~$oxO(#(0L~1rzj*QjOa{!wA`4?wkxBi%>_@_2cm;1~ZMQn5 zXOER;c8zk%j$Oa>{j%wm4zHpPJuuXX2QPPkB-PcD0Fs1f&kV1v7Pp>WzpVKf5_G{c z0p}I;^xTuB6{%bAwajT{59Xnp6=-foO&)pZ$R#-=7)C@+=u~9u3I|Kme zj{x9%8I*~{52T#>iGkHiU4>%K`jZAd{B86;kB0#Fd;A9g0RR6| k6Q9}u000I_L_t&o0B{NU8=aS9WdHyG07*qoM6N<$g6Qx!X8-^I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-on-end-reflect.png b/fixtures/web-first/chromium/svg-radial-start-on-end-reflect.png new file mode 100644 index 0000000000000000000000000000000000000000..859f9b13b132416a24f3d1d3f9fb11b3f71a10d6 GIT binary patch literal 4127 zcmV+)5a92LP)000lvNkl90t?_=(aXU1d4_V@wDwy;f{2Gn3iN!>=3Q-n+ff+(p%)n82-RcaHdp;B8_ zZSp6TiX&C&pQ=>^ZPhfTG*JS5(STgr0VfzR46zLczs3*7^SU$lJoY2sT6>>6W5kVg z`C~=$_0iIveeONy`_^l(y|$w@kKZePkw1a>1^?V6aHBsr3Eb$q!^bbDO5~S$I2$94wZ?O!2@L=RTx+)bRdPbR!V6st`OhB zd=h4j7*~6!Ha}9EUORAQL+jjaBX8{1!w4g6&0W?3p@wsqeQD3O5pA7FDdrco7`u?Zye{%M~ z4?h3_SioJms(i`Y0g~*HhQ&bCPNE_S@+1Uw;s84^6QIWh8X%xoa0oQ{QUptORBf>s zn9B#>ytZwTjF94P66O=P9Eq-^<#S_SdGzb)c3pgT{DFs_`h&}R`Xi8)wM^GLC3%sP zjJ}R|fP`l^lcglcYCs?6X;j34llT+rha^YBi&Qgz_WD?~yvV&tn)~GxRWV&|Hh*a_>*ueyf?2u$- zeW92cOu?ZIs~)>}XDgZCHgfXzJ1?z%)tE~I6T1$HYqfqYkZ`0XE_*`4Ln^GeI&~U% zyfxx{1rxFfa{v>dr}*Z`Mm&^JXaa!@Yh65OLv}!1byQ%3}t^U@_zx|ijzA2XCUO0OaP-KA!zLL7H7K$~8 zk20XkA(b_huX&a&_HN zr<5bF=MWf3(zKLC#i0`ja99k*LS*J*aV<4dwO<;3W&hTvkKXm`y>Rx70qj3QsUzZ` zJ%_FgRP1e{xl-Wl&XO(TYf>-?g<_9~K_z=XN%kcv9UqPd(6gHFYT7nfj%l-GWELPy zKKJ1#^m7fdy-xz#1aYi5ThqG3Ok8=aSI)4H5v#~siPkAsJ0Ry!jA~iQ3O(_uqM4Zp z&xGeGx1wUTGJs8>t6)=e>dEZ~ggDb50ZIyZUSN^)cwa(wm>bh>i z#9fL`>#_|gn6jr9U7HA}d*@x(+m~ zf%hmhBPEZ;iZNTpNx?au&{rI6C3zhnO70>)>qhr=tUvdMiJBxdE5PS~6!E8Fs$A*=83UHl>-DMLJoWoTs0$kkad zl+n+#09)Ci;T@pl8G4DK@{9K7Zij9?ZshOo_feN=&w+9&t6H)Rc?^kpLy~GZV6_^R z9Q=nKZK>7^sD6qA8=7eQf)GQZPYZZVc$9q)%C5wUgNtxu9HL+|&=}8P9rU;>NqDZ8 zgc}N>3Y6X^BTM>*jEqc-NVKdQF;E6$dGv`ZJyG_$p*=o&IndCvEw`l%&l{j*#Mg~O zd=nCN6r^AscV)$deqDJ8o@yO#;c;6LYnd9EYT3}DSq8%e`lNsO!^iq2KL@FZO z7_)XgN|q6@Y8pdEnsD=sVF|@{wHsRR(_S*-uD)a7hRPj!>|cT2$fgQbm2!0+Ze5(% zc&KjzC>9K1>S~n6U99SQiI%NGciLhL8o3@dB>IQmb3*o(E@J3Au5efAz3yv9)KtK_ zmxD?|{p+%KYHRO5b>xE(=<3*UcrR{UX_^o-dhKy{_tVOTKy16XN#B+bhby&ioX-UC z_?q(^6||HbD&YOW#>Ibp^>e|d#ScJ0!CRKG5^fkFcIN z@yI65PblG$zK!?wh|tS~wN6qy-AhII z1;YA64cg;Smo6=ZvV>l18PS?0x$bv zEohGr&1S<_=hvK>x#if@FaO_}egFL6XXQ*0G<8p$y>4KKu5FRfI#6(buDh8uVFkL{ z7*s{8sGu80&xbK8#DNl_FElig#EN&%?(`|p(tkfFOq>_!Q4d_}j9!>u|Hky~@Sl6P zJ-stKtshkS%|_n@(0lV)KMZj)fP6xs>Ce2_Rea&=u*+`M#H%$!H(?qfeqx}{wL7!H zeqV>^MuhG;uJFN|&}7FcL1Qi-zT95(_S~&6P3^&34s3r)9U1$L{2w0P^{=AQXLA?5 zH(q)}r%Rk?NnK;m*4MVxUV&*)q_bB; z=Vdr+!g1yF(&`Hf8-6;y1}`e`7ewgOuqWrKFo{y&0CoK=d;#KHagW_JDZK{S$q6r<1g&n{H%Uu2=D*$e?NBjhQq%%^Dkd(ZtT+naqgkB z#;a{EZQgNE*-=djahD%MxIxb7;Vns`oz`71)%U`>O9aPyz~+kiIh1)QbuNw}Hg=7@ z`q6bS-826G!?T^@#Jc$I>3i&<-D_UcuQqyhC3+JGJIj0AZg+@ss9V2?gZCMobC#^m z!XkGvsa&6ndOhrJlyhjmMmb7Ztb;gKY9RB>7ptb1hS#+&Z611i=h!6t=Z?YG%cG;_ zVk3Lx@)xK7F8`19>8CGjZsK)Yh5CHwDW<4b9@}8zF)1_ z>3zq}WnNq59P&C;gt-R#`cm0g$OmyKcH7A5@z(ji$$(_)WW09*MpiDxX{}p9O|KFoswn9~Q&%eCx z(GTG+n5%OvC0TUZ{n;>1-*A+)zIA@AIsKvL#VxDe*)ckK=lUN97bE>vOHb93`!2qI zcxSYG?%x0XcYH_eIM^Qnchct8-O%YCu&DOL=_SykBBGU*GA32mR7=C7a+9JP75Z~X z>;0Y=3f6su5W=ZcGj6YKF5+Mqhhl4*mp2Zc-#UEyjAv_x00006 dNkl000mGNkl4Qh=gcv6V#^Gf$fMbL4Q;uWHlCJK(yZb$I&iTGwNrYwQ z@{cDozT7#pe0R0`JLh*^-}xNOd-yZ#*ZCvZuleVM0>}GvLV@G`IibMu{scuo?AmdF zYhhE)Kq>~3si|v_+|acVOrx|KR=726$-)hSD=94A&6%~9b8akrWvbA@W`@I z^Ri(TC1z>Xp2)cg?{3J2wM~1M{oBibw$9x4*3jI=BfGbE4;-q_8+z!#q7|j)6ksXf zbBH-W2g&nmovmwkjo%CU9}YztNY%lQ1wsj~r7!|?VwS;|b5KMZ`TK+Sr6y{q(&l%r zw{^`M(!`1%ibo8oUck)uaMo`zZ$8wX=Q3 ziPPu2z73H`q9AP-$38{JpI;9CJ{n$ZJCs& zZ}7lp7yXZVwDWJ)++7K4H$8R#{g-@+z0>=_IE#9rom+q5ZLfrx$p*;t`yMWbfV)u! z^fE35Nhq9z{{{1dRNzSPbv%#`5D$iNVGK7cNK}xRQZ21aCT&OS9lxk|Z`$((jD+8) z$&XF)kB{B|xp1rowomupE&N4c$|Jbp!Z-^RCZ7Vvv$gZA`ur$4SX zc3nUJYv%_q+%4{Uob@)Rfb)B@J-SWqOH2E|)e-{wdKq!okp~GppaLaC5Bh)?#Suzk zgM&u_dQfJDFKN^vOcd%+OV^un#z_6*;1>8*2LQV-6# zim`1Ug#kXr1InROzf}nUE`0%a*eH4QD5D@QBM(j!WFzw^P$uUALe-)-0S`tfVi|739 zf4sI?gny3}%7joEAggwk$7V$n;Ek)#`pUXpcZxSUzA<$9_g?+fA6@?K zA{Q#mLOY(UqUR)-g_iU_QV9WQy(I*2wF*eIeI}6&fIGzrFi`P1DxQ|3Fe-qD0C~W| zE`^T=1-@i}gi?W5634n2x-tDVo-zQ_R9F2$|yKeTd4{! zg4obcx0l{HrgwCme8oP-K3IXmW{&zCbe@X_9ttxbAc;8O+F>fAVpDMpxIHJt738ay zpw=3}MRitbvL%=dt%kbGVrlDwK_5|gCxtw|<#}h6SJE7@+KKjGo8#++yZdw6M5>`+aS0Qyc0rd!wPw3ip z4WLP;kK@Ga<72&oc^0FBDLd6irPRYZOz>l8a@$)4;Tdx@0$bQ)Q zWXBb(<%5G*6f=O&g=nMPhZ)f2kcjEDAEqz^|ua^$j8pH|P$TlL*7ML5NWFmQhVddL8-uS87*fYzi5 zu7onzhgd>pNRuFSRSYE51SnU2FEK+0VL+x5vs{wt08s%tOiDHpn6Z!@Et!Mm-=6*Y zKY#KM%UA6y!daY!ESFqE{U@oXG!dkU=R`Xn3uq@0kavaNyHe0ZGR0=r6Th#Z9&uWq z>-QBPVcURJ8XT%-cte15tvYM{13Rx~r6yenJQBM|%+^?UNE6o{>**`xW2jZ&S;9Ky zdWV1~v{U1m%y&hMJ8 zER;;zmtY^}u5q`8rPTMyat1#pV=0ASEg-Wl+n|A6X3IHY`R?LZb{eRyMe}M0mQS`)R)yCBI@6A!rkf z5R7kO8^ptCWcIh*yX@Ac8F0AYFX7E%YDM}LrA+cM9C;38SP}8 zoTgQ-$rM*^N?+;Fh^-kk+s8=_}LjoLWc8ai&5#V11%u zn`vTk0ztZ=J}lG9PUFhO3}s$ZEB2J4AM)3c{oMapTCt4f>!c{9J)7&0{p=<}bm`Xp zDL5z64h7$BA%8rlJJTEUkXY`<`C?sn+bjowEaDdg~PzC%4A8jp7xghU_!b%e?nkbqJeFy^{6Fkbk4`nVb zNXVBsDX~_hf%;Tn+Y02=C z<}I4Freby?7SwKe?w+Ors*n0ISApkby?rv|>ntVRP$B>wVfw zLY&(>1l(Y9hu$(oZ+NQ`ohk2%<*Ab}7b?P8+{{5{Lrl3v@jAzW3LxEJ92T%u~v{Qrtw6YRi$$RDQXXbpm zXj5Mt1JH+LHg-C^AGgjdjfkbPfH)xBL25#ny1^7$S&6u%ndT=J?JcKU-8i2S;PGYW zIZCuC-jRU!i{8mcwy(NDJXQ>|n1QYDT|0#paRUi}Pdb!2;=};rC`H5`H_Y1-lo3pD z!OqT4kZkl8<9$6q^gN?2L;a{P(ucHSIz!SL9xythX^pMK&gTM_}(*!B3z= z1k+}?j&%v9R50;us4_^Hp*M5|D*|N3a4OG$)dk3sw>@vwtVMC~oVHYSDn2J3G2L7D zEqQXsm3CaCF=0f-W47(d3LJ2hj`p1!B1jD?9dZ#RcWN4Mg^wlFf*J? zP$o8TxG~Q-&nZ);uV~Q6fi!l`wD8)Y}u!tO&b zU#%JL5rSil*@wsHy*t{!?cllp@Z1Bz)uZ?9xa*_Lg`mVR$a+$O4rq0qZzhe*KxZ3+ ztZ8K#bVKOrFh)r@P(t*HhEYWnD%w4}(5>m-{d zX^1R1N22Gr#z!W2;smDzEo1R)IFsBxHt@>9kN?-+Tjj-L_rCO(&+fYPj~9QZXf9MZ z-2K@z<9^4jIGtGHcs-lu<`ect$)6SAP%#^WHgJ9_V}Ew$XS#S=6Vi#3z*&KDZ8)C2 z8ayw9Xc>>&kJP&MPb_%*$l!yot(9jUi#~I(e($2_@&oa=dk0sRn`8jHD@k3UL>?G_ ze%I=uQ-@h*b4HsP*W6Gi=dG?W^Tufqh8kvdr9frq{Y0ABbLg2+m>U3nshYNr);kYP zp8W3UDeGSOJ25aBoL1d*XxXw$UcGDdFYdVNo2=Ob4mhZyT`E?7kgoD?-nDuu>0lZ6 zVQO)T;-FKcLV|*UTu2_DHk6y*`I!a!9>t71u7p2<=&GmX$+UH>0q1-t?HliT?Dadu zg1S7VCKinkKXd(WEx&!uwg(#`|7kd6E&TtaWrk@t$?0~_%+RxVAc?_J3h1o=L z`stXP+i`!QG1K-E5}2YB@0w~IZ?ugz<{qqe|M%Os@Ogl~E*Fn(4L@tKookeq@;&b9{ zhhaC(@_BN0=4bqD5a$mU^$+J~VPSq27Pym1<>p*C>mhf;oP+x{%u!I+V+F@bEs%M} zlg_8!ypgwQ-Wkj8g!fDar%ya}c=@sod(4`5;e_E!|9AhtF2AYgoli8)08$MFCN;P- zL)yf(`@0%IL)uS2TSEfaD33nN$a zxr()?&^hyy>$11@9-IHaJ3qVp?60r=@tPe+PJ8si>px^JRLH=tpN=@&zwh6yOwBiq zyLR(7alt7M<>z1C_P`)b!Q6bs;!X%A?fz^S@&PZy-UYiL4*SMAuy<+5o`&j8)^A_+ zC*OUs@~7`K9_tOy8cVm$hI>xCwAp_v5#n~zTOImGP5q-|0J}(7(I8Fp? z{QSJWN2Nc9wBGMA;X2y~FYH+Qhq4Vq`ZU~I>9>aN8W+Yxm98J^5QJcW!Qg zuLJS$?Y{p`>HjUmAGc&N0pVr#H$Z3n|Nn`rWj2t(267KGL&yPEu~&>L=Yb*&p00i_ I>zopr0FQ)5_W%F@ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-reflect.png b/fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-reflect.png new file mode 100644 index 0000000000000000000000000000000000000000..63f513f3849525a181f2ec2728feb2a0737016dc GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMeV#6kAr*7p+&azM6d=L+P}o`L zpxB$EYHQ9$OkKO9=wMi0#mhh8>C@Jnb603NP_QfhQgM69JO(Sq5~dezZ!SLmcBb7r zzCXYJJ;RSfzucl3-~7s9d~o@A7*p4p^HvUXzeaLtnAYYnE_m?k&&B37&t9JQak%+) zCi99tcKhr3MeP4(GQV2y&wSzNuODv5)EoR5=0c2Sxxl$V*a1yo_MZcWU+ew0?rC`e sl7B7t0qBwc|2-p>^MO8L1NnrRVQ!47NZ#?rNT3LVr>mdKI;Vst01O0e@c;k- literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-repeat.png b/fixtures/web-first/chromium/svg-radial-start-one-stop-exterior-repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..63f513f3849525a181f2ec2728feb2a0737016dc GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMeV#6kAr*7p+&azM6d=L+P}o`L zpxB$EYHQ9$OkKO9=wMi0#mhh8>C@Jnb603NP_QfhQgM69JO(Sq5~dezZ!SLmcBb7r zzCXYJJ;RSfzucl3-~7s9d~o@A7*p4p^HvUXzeaLtnAYYnE_m?k&&B37&t9JQak%+) zCi99tcKhr3MeP4(GQV2y&wSzNuODv5)EoR5=0c2Sxxl$V*a1yo_MZcWU+ew0?rC`e sl7B7t0qBwc|2-p>^MO8L1NnrRVQ!47NZ#?rNT3LVr>mdKI;Vst01O0e@c;k- literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-one-stop-focal.png b/fixtures/web-first/chromium/svg-radial-start-one-stop-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..63f513f3849525a181f2ec2728feb2a0737016dc GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMeV#6kAr*7p+&azM6d=L+P}o`L zpxB$EYHQ9$OkKO9=wMi0#mhh8>C@Jnb603NP_QfhQgM69JO(Sq5~dezZ!SLmcBb7r zzCXYJJ;RSfzucl3-~7s9d~o@A7*p4p^HvUXzeaLtnAYYnE_m?k&&B37&t9JQak%+) zCi99tcKhr3MeP4(GQV2y&wSzNuODv5)EoR5=0c2Sxxl$V*a1yo_MZcWU+ew0?rC`e sl7B7t0qBwc|2-p>^MO8L1NnrRVQ!47NZ#?rNT3LVr>mdKI;Vst01O0e@c;k- literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outer-negative-focal.png b/fixtures/web-first/chromium/svg-radial-start-outer-negative-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7b541470c88a812a6d278f9653a7a567d67525 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFrD^vaSW-L^JZpr-em`ow*SW4 zlAm9?#w#lHC`>NkDBFYzw>=v;%>u#>a|xV&!8GB9<5l)1hQ^jzVpooIzMXkkvYkzI z<<#ITe%H^M8+9Tl{(1WUypP_)v*zau=LYV0R>623f?A%(-l(6u*vwkrs^G{~l?{{L zUVW7QKqOr8&wl3`!7j}d%ccWG8lux#+}F%#xRbtS<@$@-nF|axu2gmQ&Uv!phG%z} zXM@8=w-4It=QgNaj#;s`#^rZLcQNa~A1yiGZ#k9SIn@}s>{^-TA6tH-gIBbD z`zJm-xL5PmqeWc0GShx*&u_V6y6N8Jun9-qq?YCsuP8bZYA|zoq@eL3iy!7JVmgZj zgo|$kPJHHaFQ?U2Y7@UV-@=(^ECl z@3Y~{J&(l;1k+M&G}(@C4(Z#;cl;*r1CF!BGyNCy&tJ>@>A>%g9@k`MCb;f=n4re@ z^FhWmzwUjBt$ET+^kk;l9WW&x*)uXQ{Qo~|+WGas)XfG;*31lP+4?pY?=7AM6k+gm^>bP0l+XkK D8OU|H literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outer-zero-focal.png b/fixtures/web-first/chromium/svg-radial-start-outer-zero-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..0a7b541470c88a812a6d278f9653a7a567d67525 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFrD^vaSW-L^JZpr-em`ow*SW4 zlAm9?#w#lHC`>NkDBFYzw>=v;%>u#>a|xV&!8GB9<5l)1hQ^jzVpooIzMXkkvYkzI z<<#ITe%H^M8+9Tl{(1WUypP_)v*zau=LYV0R>623f?A%(-l(6u*vwkrs^G{~l?{{L zUVW7QKqOr8&wl3`!7j}d%ccWG8lux#+}F%#xRbtS<@$@-nF|axu2gmQ&Uv!phG%z} zXM@8=w-4It=QgNaj#;s`#^rZLcQNa~A1yiGZ#k9SIn@}s>{^-TA6tH-gIBbD z`zJm-xL5PmqeWc0GShx*&u_V6y6N8Jun9-qq?YCsuP8bZYA|zoq@eL3iy!7JVmgZj zgo|$kPJHHaFQ?U2Y7@UV-@=(^ECl z@3Y~{J&(l;1k+M&G}(@C4(Z#;cl;*r1CF!BGyNCy&tJ>@>A>%g9@k`MCb;f=n4re@ z^FhWmzwUjBt$ET+^kk;l9WW&x*)uXQ{Qo~|+WGas)XfG;*31lP+4?pY?=7AM6k+gm^>bP0l+XkK D8OU|H literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outer-zero-fr.png b/fixtures/web-first/chromium/svg-radial-start-outer-zero-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7ed064ae6dd7422be25d81ab8fdf0f5d5a2617 GIT binary patch literal 652 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFgbdb$=~&n@!J#aA3}DsKgRBPBRu0oZmgox{HD(bLn4_w*_F4e@p}GsTEJZV zBK~^)s%oJ(UzdL`I45CI9HL;NB_Jir(QEtV@brGwIYRmNNB;kfQx*YSK__8d*NXTzGF&xrGkmlTOo*Ok zwbD&jJfzJ{^T*-U4QtAmAIVePY_4xEyhG-1m16w&==;^?#!e=!54RrO`MJXWhls&i zsp#mMu#>k=zj?p^F7Na02mUOx-XneIyOsB>=*xZ@w-04Y z`}yCiyW8Wcvw~JVmYTcdlyuy8#+GHz-`Gn<9NWEc&wttKW9h6rTvqTr|FmgRwWr@> zmJhprmwqVmna$DF!L59~!G4ch#^Z|A%BK~t*5#)GmGrIId*)wP{Uw{lOIx>Q`}}#h zm1)zr&k?_Dk6bd?csl?w&AAn{oIjj0}(l>YzUaPj^Z fAcGB*n3x&Pn7$K!Bh@4h6k+gm^>bP0l+XkKf7c~? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outer-zero-fx.png b/fixtures/web-first/chromium/svg-radial-start-outer-zero-fx.png new file mode 100644 index 0000000000000000000000000000000000000000..118bdd83e8d41ca41b80e34c06f8d773277e5540 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMSWg$nkcv5P&NFf{C@>r_5HyxJ zHA~F&nBX?H=-=}`Znm^j4-j6#d4(m5$+U5ngYN=0;<;}b85sWmf5Loh1JEKikVVW4 YizOM`o_7c70Yw-*UHx3vIVCg!00(+8w*UYD literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outer-zero-one-stop-focal.png b/fixtures/web-first/chromium/svg-radial-start-outer-zero-one-stop-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..c651c7a7d200577fe877f52bec7469f63990b98b GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMYo0ESAr*7p+&IX|WGKS+P~)Ib z&cV2xL${8s$~ii@Ny6oh>c#CddC!!`^7GZlG*#AHE}NKp`2o)YNeAPGY0Kqe&TkKS zTX0L&;|!DU){TF7_XH^KV9+&UuyoaP;O2W#-xbp!CV%0l$j$@iw(c`{81hf}emb)` zow*`(-Nu#wlUHwDa=vZnzr|0v*Je#_Ye))Jt>4=!r)vCsiT^!)?wSO4P7aL;lTI`| z+MDvS{Gt-0YrFZ%a>ZGUCd?UZ7a)#EV>ruzB4Ac?K$d~w|Nj$@w(tRc$OiHuGeh)A Vy@pHckAOrNJYD@<);T3K0RT@$Zo~ip literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-outside-positive-fr.png b/fixtures/web-first/chromium/svg-radial-start-outside-positive-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..f09eb09c7f0458f747864e87fa182cabd78d8093 GIT binary patch literal 679 zcmV;Y0$BZtP)00079Nkl7K9Lp1*t5ZD|0ULr1A-(|<0|R1Z0I@KEid3hK z(o_j{9NXs?p0-jZUz?XU_gr;9oxJ>?i}H&t<$U*O%@5Cr$S6c`qyTTE0B@uKZ!}im ze0fi0uyMef9vcxot>6-c)R}h-pZf1YoEyM za1)qt=(oClYv0>?a(sWob~o$$r#`=*_N-~9^A`YeLONdiUt|x%Mn72Tjhe2v@y0%A zTkfXgHp^XdT;A$GDx8Z#;0!;u_Xd@50;4*j=7?ILG>96vtksr%K>EeA5D5S@(_OEf z=30`$(Bo96nGq#Mm{eF(a0vi;u5|ro4o?*+!8OlIS*~P6C8S$ek4^x9Z+sN2sY<4l zQsv}&GKe9L0056rKe(ZlsHP+^bTuJHaV1g#AWW)*uu<0HvKql4PH`Dt0bm$86)mi2 z<4P2=YETORUTm9DVCn&@0J}gyO`lq|*k=_8u$&&n=9t!4DfT-6j1x1URaPp10Q{GQ zsmKBVtR`5I7y@xxW<_EMB$>*JO00006NklDs z_N>TPf%E*U?%bUD{$1IvWm(66iCoz%amAABfE(it4TjlV6W3_WP48zm4-22S)Hm%$ z+@+5~IvvLG+=sHBha@*H+wj9)Ed1@1XG=^r>rQ-sDWC1q^3VTdPjm}ySS9)U=EK)c zYT;Su?YBnA@n1OHb>Zw6=cD|k%hw#2itw z?@eXromXD{6ePgO|1A0E>KDs$-rIkE?6|_Aidn^zU1yeX`_6^0lb+qnWY1{u*WTrM z+IQNiU9ZjcwEhKsUUnwqXT#sy7mGK~KhG7voT=b_iOtm6OjmacyjX4$HNz{ zulvVaKc}y#xrS?Hpb+C_@y+bz%6SVM&wiLJpW>dTmwvR}gC!@vcmJOASvo5;qNhK8 zbiA7_rEL0NgGcRcI(C8Y&uw~ea8dT7*|IgtAMZxK;FFl0{oyT(`d{YwX90Tqe_Yvk ze*U6mb}G|G)ax=^uN`AGF8(3l9}@-ru<~kiiTZywa=*iy3l68hV*FpbNhL zcQ$IqjOHqbegTN;S9T9185sWmzg9SZKQIljfg+!oq1j|(?h?bjuYn>Ap00i_>zopr E0Mxe&&j0`b literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-relation-below.png b/fixtures/web-first/chromium/svg-radial-start-relation-below.png new file mode 100644 index 0000000000000000000000000000000000000000..c6192a36a6f17747d1416b971b216cf91b0dc8cf GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFkbg`aSW-L^Jd0bze5fJ4a>Kb z9o)5GMQHMr?*Hun`PAZi();%@+_U*(-O6^7=Zny*iApAZ$rolz?B(zk&WK}lVOL-H|F~sC5KFt` z+^_?u_buqQ;C~+Sp!B;-S?B_7jdfkJ=N=|B%H801Nj=%br@VX3UWY3`D;OJ3J5(fF zEj#7|E(vi!QiWZspn zQ&b#(uXuUu`6By`rk^>QPTYF9=t4{M`Ol3<7*%#(T{A0alf)n1b7vy|*}bohoaZs8 zFSc2Mt7Efqb$a>cbdB{Z@6T+yukj&gW_Wgz=)?u5BB!lxyFYoRjNjRx_qHv6@3?1w zlpu##kFo7KE!A9&+2>}meV(a0PdoePrrjAEy|!Moe!I(X=ZmnMpLaU4`gY|uemQgE zc$0l)h>63TFqWJ?ZOsq2#JBW@otOBfb_^KYii|nG;vTRwF#P}jw#4)-Fs9i+QOwNX XQdy;%{$SGspa_GftDnm{r-UW|FZlO( literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-relation-containing.png b/fixtures/web-first/chromium/svg-radial-start-relation-containing.png new file mode 100644 index 0000000000000000000000000000000000000000..dbce8f288ac141ab2d536ed3335aebb7ec4bc61f GIT binary patch literal 1440 zcmV;R1z-A!P)000G5Nkl*;?Z2u)E&Pf;-70Kn>v;K^tv1QSHd}17 zyF+oe&x5d>MTM7EUQ*h5V;8kqxB9XBsf|<%Q!h;|w`F1JsUtI6Pdx+w#GaA3GWN~b zlTlzro(yMJ(eUykbZYyq z!+mh0OpF6?t3or^;cA^cJ;#qPF)<*EzR^fnqUFR{g`WIR+v|PWsNH+RcPjlI2_W3| z+hK`_(duY>L=T2Fjf53$BR)Z8W9~A&Y1Q|%LE9sB6!bCxI-$LYQ2@wwWXn1k7#^t~ z`jOCfXGj}P$oqXhABHRuh!&x%N~5W*uz&m&7T_&gelVr(I4^|4Oo@H7D?rbiwjd~T)GHdY9&@~t{Mxl%K?CEfqoDZDXBc# zbm&D==3Jd40P~*VJge2o!h(ZclclrE4hwJqK!&Z(OiZf0w({D}Dx0go0~Eobn2Re= z28PDsN?CxY3^138D-gCx*ynMjJV4=HY~nvI?1-?-;7VD5bc(5y6ZUyr(GdW4++1E& zYj8#S3E#QAutnvHZl@Ac>jp5jZU9s31~9e$zW|bd486SYbk7yB05~xgSED1R5-b2t zy2aH9C-Pho3*gEK=St!VghMVxOO6Ma zTl<;0o4gY&Jtq%J%eV?h0Cx8_t~X`MW1-HGDdt1R7!QEx@9gaZU9Vyyx#avM__TF) zN@O1?@2zcQ&th^QT|6IO{u$rYO0V}V;a-A)tHuI6INKQJX+@4Aj>rBEjZZRWekd%x zo)LNEx5j?&y>c~q0DF^A+ar4ThZOxk(U;4d6v5i?%@FgrFGJsqKmzBOtIPr{oVPxD zIu$D$GTva%yu_bwb0GSed4RL+n}>j0?r8A6x%w=?(%F!A+mQ7+7|yUeF(bjRuRkr9 zU?l~;FCQ3~#PJD+5KcXMLyQFwnYMJ+Wi1ESw(I9BSZoqteWGCh04kec6?>Ck3jfjjwdi1DIMj ufT{H_00030|K5hb*8l(j21!IgR09A>Arvx?h}PQx000000081Nkl73>I&RQwgZ15>O41H3XkOqB|gZ z{uzU z*7<4h<>u+?1pu+qn5VT#8VusYm*Z~8`VSht6aU*kbF~myv&jA4%uR9^zRa`QBsqBN zhlgx%T)3lB)j&Xsl!m@-cQd0o{ z`T$)01asTsHs-Q0eFac?Ut&&{6P&@PEJkYqV3|`Fr>>pJ0(2LEJ88n{GEZdz2E0xu zs|SLtRrh}YmA%4q0b=Nwc!O;jJEUA8T-(?|Jt|icGRKyViH#6QJaYwLA%_wWSjqx47Z8*z zDOvcAnF3I^Ph#ePKrD;VR{;7hBlEfo0<*e1mxXC6U|U7anKnEqeR|-{8g3+u)KLH? z(;HqCP$)fW(kSr8E#DjgsJ`i4HR<)yqEP*~MMtuDy#(N$2hMlfhtfxfY}BU1kc~oi z2`iRpDoH`w;FCq$AHe}j->Ws_ixc+!x@{`W(nLUnYjJM}-0T0h?fUvHkNUZC7+ z(ENS&`29KB1!V#bP6yA*%^q-n*{$?7`xe;WcAH!Or8}aUl~7G3pqffRHO3441pom5 m{~PDnCIA2c21!IgR09AiA?DXm@f-dC00000007(NklrznbY{!!+e$g<~xE3Y0So)Hn}qyn@_1!$8B&<2wV z#kVif#n6BB49yRWE}iMn%u9oUz?9Q}_#aKE37i5Zf{?5&?lv2n=={(Z0Fp%b^rKOK z_hQxDUoU^$D!n;-TP6gi^gLtdc)jNppAN3yDz)xjdB5R~{@98k0l<&suf3b&NO6L! z<(bd*Z?_j(4{F=BFZW4J*b)HZMC{nh@E*q44`nCF{dCROX8VaXyQ|Czpozors3Ho< z$!8=+iR4EL682|?Srhk&_+Ri=)0r<>jHq|Yi=e>s&XLUMVb?+q$&pj z@TBC&JPQEhP$rf55C~$<1)`WZcTZO(Xp;)iCKaGfDnOh6cX5{~Bq1V|_z=iQ0jb1? z0LOD;KtKsh?MYP*1hk9?^LkR12LU|FWgJqKbpZ{#c^L$TqyXarNkOsmvaPE&DZ#Wr zQ5h7KzM=LF#Uf?c6@Y8kP_2>%ukK>DONucn0IRtRTDP3*ma|7!^G8eh4l#+?19k=~ zx!?V+>W9_B!42a(vZR?|<^*6jV7bt_RyeHb2X&*pYVJL(Z`VF^vc&|C3|0MPyjP69 zdrKcSoFRf60J-;wDFH+6t(dJlm7Ohfvd!w8sTCsvNu#pcT-$6TbdD|J3G@Y~M-7_j zFQF#D@nMfkI&L%HpSd{FRSDXp0<=j5Xv4k0F8}}l|NoFuLzVyl00v1!K~w_(H+9N6 T=d`u~00000NkvXXu0mjf<2p000X8NklMtPSMPK!Wgg@X5F(!r> zG!b4*Fp4H5KBy2-n*cV@R0G{z-F2sP?-};sxAs0YICS+L3JQ{5Ia#&Oxu_cW zUTf{Ej{W>=?4vA#eZ=KDfy0*T1P)uS6F6*9SNov*+|SrjB881a8A&a<#+W(BI5$>m z8_nv(IJMl@4)6QU|9!sX*Zr@gs>q^gOBD$&S;mq$D4_*6oJa^`MQ!6kCwaX-EV_fD z#|}bPB_Oz6ize+P&(vfso~0_!BI1y$G8Ui#C)C~#7Vl~+!C_XX;ILKnHm5h9ADzGx zwt}ogpq-4{Fa{C( zv1MgR0tk|BI%>zm4sjT@lgTYee;Y;jqJ0PNjOhus9|agDmk$a4s;$jKYgB-?dGm=d)THM5*Cn$wQ6 ziY7xgD!Z4aM{n<)J=NKG@xt9Nymt>@KwJ$^Nsl-EkFR^daWUGNMZ6VVnTkPCq42B_>fOpvUG)TW#mf1fWG9U zE8;-jFamx6c1xjz8R2;3Tx|H7>38xk-TK^-Y!e~(i@!fSC#rb~tVKCuy&DgEWbfdI ztv;ld9T{{JoHja->?nLX33|Jr}3|J#%8jg<(bs>utoXa*)(Od2^)rt*+G z;JJ@)(L_iSEz5Mk$}TC# zM5Za>1l-QRD&i#zD`+Y0ZSB3$Fo93JXB=ls38L=Q^95Uu0J8Z=0B#*guLVHY#7EVEkJDjA zCk-aF%hn8h*sf1#^P(p!2xbCXf&kVZaS2DGRs6 zAv^&SKPKFc&<74ws01c^$Myiw?=M#+fU*e{ATnOS0SCgx10NQ~RF^Pc=rUUGnBPZv z7zb`F=tCml+c~}hY{ua+0S`gJ13v#jc#(%(fE?h$S8#rK9sm$aFa#Nz#_)o0+fOJ) z$PX+4ciWo#?+dUwIqrRT!Bq(a#KvnHJ7K95l*W(Ir2yYD ztzyzwwAS68It+Tb=e_+Lqp#U-Ev@m}q5 zqgq!MH9K2b9)0#PwkQEeO;};?KIwg_iF`gKz)+7Jv z3Zm}4w9lve5vX>tHX6O<%B0&mWs?S`x za5~xlt!tE&u=Ffy0c#dzd5!uQdWO0zt%}gKrJ6IE@nqZ5)->H7pG^q1+eM^x7Sp}- zbRa#-C!<~{2zN&o9d6nv(uWR0~{9Jhtif-BvdzZ-SilJ7U;7QMR6!H z!#b5bUWz-%uXj)V=$AjaCcL>ib2t%7Dl&FdqB^4jEgZV|A^}MSl2(V_C@0)NsvE20 zqUBYP)nniWdf+zP*PMQS`(zjRrJqHql0NgVEat-j^;;;m#>_D`qc-YI`geLfh}-8Fe*EtvY{KFKm#`}?I=5< zUC+|Kfo|z~I##h}CFd0J2K^%DPX?@}EQ!{r#`b;}PaJD$(bku3@1^sf|NR^H{rZ); z8tV%afDDSR+lFo^QKcl$r$*T9aHX>ZYi_n4uhWTTn#Zl$w^$6>-f-b-XzsTIvb{%- z{ozX4e`|2tE1RGA^ZC#I?(A0bj^KrkXSzKoI-3KW7N2~5>#i5xyZglt;E)e8sn%=COhclP&NOYz zd7MpZG^^Xb7vG?#O+%Ftt-0Dy9-8YQkN=%&98q?z%#OS}KK|zLj(=SImLoW^h`XQ_QTd(@DYv9c-Ksbe=%JFhJzsbiPu1Y;T#Wv?>kIXT!4hVfnGgj=-+C z80#a}eJ8l~KULYaJuHn0gN2J7s9cr6)qbDzVUz1WIXi5*PT;WRI)THMk34~Y0{{U3 m|9-zu*8l(j21!IgR09C&u`I@b3Q|4*0000XMkP{Lo-fG?rFHLk6 z6#m4~v0v?vrpgJ2B;F2#fXE};BstzXeUr$@U2GRG|r{85VpH+<7?}#Q6AHE9}sO)mkzkt5_Ag*&9ASZP$@w z_?mB?a&o`WjY$k}WE)r?FT1IN;l~}el#dJ?RbCU0E|^hlDV>-vSR~owkn+Ls*>#2K zj0e7)C{>!$9P=tz!*0z|CG~^LH8mWh4lFdeEZqKi*L4+Vsf5xZ_0P#O(qAyCxNnZ0 z*S*bf5yQoWzaL*{oT}p5(6GG5a$lyQ58r~)ud#1c{J9StJ8G-QP@T&j!jNO`JApwU z^XCC}ft(0OHi7)@fxExIxaU!KCE1%P0f@S757+}E_5c5Am(MK+GT1=T%FG~AowQoL RC>|8^44$rjF6*2Ung9fk0006XNkl0L&EMv3$mM-eYm^HW(yk&gRPxkKnn{iqu)f0jiry?PhcY2*cb~F zqXjWWO;8X7W_Zjn<48hhJR`{9J=ffSNp*kWbjZ#xA@DCX zwFy0|l$?F>aen|kJ-T<@0vH~>RaXG!r-wHKC>*_2$AHA)TG<=~GIao$zMMI@N|qlb zpj5kn$@9hi>_3Ot>7gCKQZad)`G1-pC3t%925iXcQD*EU_xqwaV%jp031w(vn(0{HgF~0m_i!=LVO_ zD@tr7SSJ9i69Cq64|oCq0RR7(f$>@Z000I_L_t&o07-|Yq@CgoLI3~&07*qoM6N<$ Ef0006XNklcrJ#^-aL71Aaggm!o5+^Ht^{E@XaLJ-qK5Ia!!bk9-*hF^Jz&@b&X_x2lw8gQmfM zdsBIbmjo)na6K#e)S=UYs`xAMo5MbnrVO|M` zfafC@C#=6EFp0*VqCT9#Ku zAYf{lsD}BQ*wma@7~#fN1ygtJNZO91cmd!7<(5dQ_0Rp^=q)b+dLfG&5AD&L&gSd? z_8Bh&w+AfU?XZ$P_QgQ^{2 zv15^k#w4y6r&%pZn9KImWvlJ!4%_u%+V}UyY2PF!3kQH;^f|HrUoF=?`F)G;x!(%4 z1;oR$`}GSq|DUtE(8-k1lyU1z<}#o&{{R0d=3NA2uz}pe%&^*o_35J8s3|}Z22WQ% Jmvv4FO#rWoO921? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-same-circle-repeat.png b/fixtures/web-first/chromium/svg-radial-start-same-circle-repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..65b0461c9cede7693906ab59272a588c5f705242 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJM7Ec$)kcv5PZf)c}2 zv15^k#w4y6r&%pZn9KImWvlJ!4%_u%+V}UyY2PF!3kQH;^f|HrUoF=?`F)G;x!(%4 z1;oR$`}GSq|DUtE(8-k1lyU1z<}#o&{{R0d=3NA2uz}pe%&^*o_35J8s3|}Z22WQ% Jmvv4FO#rWoO921? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-spread-circle-reflect.png b/fixtures/web-first/chromium/svg-radial-start-spread-circle-reflect.png new file mode 100644 index 0000000000000000000000000000000000000000..23daa4f845c314362895eaf836338f94d0b21b74 GIT binary patch literal 4218 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 LNkvXXu0mjfq;j7D literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-spread-outside-repeat.png b/fixtures/web-first/chromium/svg-radial-start-spread-outside-repeat.png new file mode 100644 index 0000000000000000000000000000000000000000..30f320ac79f20b435802ae2364e366f2387b00b3 GIT binary patch literal 3430 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 IM6N<$f?Bw>EdT%j literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-spread-reversed-reflect.png b/fixtures/web-first/chromium/svg-radial-start-spread-reversed-reflect.png new file mode 100644 index 0000000000000000000000000000000000000000..acd2b59af255f3d73d83e1e202b393f9234c75cd GIT binary patch literal 4153 zcmV-95XSF`P)000l}NklTY(|{Kk84zH{!Y?pCZ4RQ7@}z{kSn>uT1k z^WE2zO-Fe-cmYsRs zomHI$t!dtL=2ccS*`iJglNNPSnxtr=+QwBAI-#_z18tNr3j5cOPwPMHT_n346w#)2?piv~AYW#S}QY^Hm$E|Q>(bQ$Z4Fla+OC@ZCr zk`MqxV|8Q0vH^y4UZu0D|H1goez7qr2G||!0uV}RFWi5{Ewmnm^&6Y^!_JH6U%9Hz zh;>~EPshegXz%+|S^=O7HrSV1DzXr!-^s!p7}5X$iue!%yr|I~Vhp>!P83i@_61=F^%1Hq#q_Kd4 zNYJ&3^Ckh4*q6<8IE+WP7boA@eGGhBCqrHL&-{D;bZ&3W&7}=C5`;!d%V1`Ph%%S{DHLMbysV@rdBM<)ItSdhxUu!TMP*g7qK)RDcAm zK(ge4f`Q{fwLBmrX^LiG00^Wb1awp^BLQBtk&p0LJOqw+Y5RAQAm7UFoPYd1b!J}w z;M6yM|K-2lkJe?N1ye6jTq(^0RaXJ`%&YROM?nfx3Zm4 zu{TIY_zLVj5?5`5|GxFbvx5(wefmH3xdrN)h}L$YEN=({b_kx^O%^_CyGsmxW}}}R z@Bln553wplqg|@1AdaBbDmkEQ^REQDD9=|?ZT zapURNuRr(Y2Y+GT?}^W^37}|FBxb@;XTxN~md#rXhy>pC7DLNJ8xpc{t_Vbhy;lOS zM%o6dLb`@XuqX*mQa&OtVhq}f$k~OJsXpG>?QG2=T>&FD?&Zth`j6{he(tf?tC#Oz z8vtp921+4Coq|_Dy>Q0#80ba0=wlcr*n3w>Q3bTt+Eo&{$5vo~co0^(2Ht~601v!XxD^V%(oQkXm21_eE8axmc;K4S$^UMQPXDJwiwxN}=b~!Mh z^wk$nyj9ug&f?fVUi!|f*M9d8&c7-|XFUKYG|1Dj&RHX%LgmZoY%z2^23n_NeZh7Y zl2(sl$pb|KR-=48IMW8S@FJ;=1mQv>Q|k(?fZ2#A@4GZAhVSiNc=g)ze{}wbYco)p z1Q<|Xd{s(xky4$?muz?p3!g*TZbcYMFrZr=O4vtsRnUgJazKTE2Gc-&42xwetssduL+I9^+MVrAq;}Og?GL6 zA6rOSwmjHU%A-6qhy=<=wxNtf@jyVF3@Dl7sZ1?_s2|RrIrYY4TmSRF^?9)_ z1Mq$nMI;1|A@Uelawht~qw-MHt~s*P-gDS`qGE{w2ninLC3(OD`I65_f+9g^%BM0> zw$QR7#i0ZH#3PrUKl9Unz4CR@dHoaZT-j2hdjbQDfpjHQ4eMljp}w|$738#|9H~nT zM`EBL3>4XA;1&wyjMhb9=USj&nFR#Nu=V%@Jh^hC$li(Eo!IWgZaXnI6MG~3%IVjB zeDx)@9R>``m67O**ibN?{3<|Ut)cm`wd@;&LAQ9?IBt;~iD_g==>jV|23rnC zK>%>)$+;DH5W&*`xd<#N@RXS^J@e*%K3p3B^dnRxlyGo}0VLFf#Iq4pRGS*EP-cmt zURqf#*(g4S0lqHMMn=vB2AM~|?=|Tns%X@AlJuaMnQOO`8lXyy`7nFwb3b`^T>#Wc zaX$qW2_%6$z|e5VNNkXm|Ihjs1J~f%@47nRLB=S$hSt!k2)zw%$n}-x{pWCoW_5KV z)4)!x+fGg7WPC3opDT-hFyK0E+t$?xcVO z*7FKHOAJ(rSf7zb;Joe#$&!=ikPX5RxOVU3BP()F#B2n_1HJr(eZi+vBLfQo?yh&t z<<2TQR{~(ELVqt;dZD{rvSAJt0clKW2?^hOy>OHhd^F_!4wu#^zsdteGsOc}1>jei zwh_n|&3j#RmE!c80N_NNp~-y0;2c*@^yaO1u{Lfoe2j;djYA#~spRX(JcNN(+W3|S z+#A6>NajH*{#Hw+T_u6lLg$(oSQh|shpa%WSHIj2lK5J3f^YE%mn*$r}ST&Hj znsh&52#E)>II=2nE^1`b^5715;EV+PA~hQCRI+*Pg!t;Z0E9*@^b8GO`u(AeaYu4l$f*7h8mzJhc#F&7Qb1 z8uJg#p$s8`>G)AOo^o13qI_4yF4oFQNxU%PxE=uHpT-8phIp2-jD+!6FpbT0TFA=lFmYrBDn`=!oA10> zZ_-bwyQKaD(PHqiL7hO0VL>BD49-$$VSE=-A3CQ8PF`1M=d0{o2>^8pdag1-ZNmyM zYzTG4D+s}xnz)8pnk`elKa}irLbTr1`k0Ry?jeO@B>cf88_W34ZM>WU_AoiEEDC{y z2E*Lt(X*GujWq#arjR$-i5TnU(cD$F7#s&bbD~)7JI{$&_F&}S z^eMSSu3C>O3T%G{>&Hc(N2Q(8kl$l?+CMcG>oNeXHmUmDm&L_$1s+V){Mxt>MGfCg z(TScA{-Bq+{OC%$-}f$rMEO-N`$@!zB9Ft4R6MK0Bmq+#Ka<7W4rdPA^9nUoh@0yH zp#H1QG5be%Uxo=LP-T&Mk`6C04$-2dhRl!6YaU4OIyNhp_S> zQ+ZTUv`%Je(8aTB6Vk-4$uJ8Xmwki;X6|4^9RFkhYBd0~i}{?+WBfrz=BF%J{n-re zov%&7VSaRn_u}Av-wpf83Tm@p?Zowt`vLBcQQf)A6y7NjZ{QioXSP1?}Aw5Ku{)X}swYfm?ps|#(b5qve}S}R(0!0!N6&HW_z#0QG?u#4bot(~D$ z1!@3mJ{d8blNGWEW}6?3&#tmlcmD9gC;sAz=|y7^zQMTMKv%%s8ML%H(&doG?j#F1 zwPYR9`UdYSd5C|<@LUM1_C-xB?_fp{kaM)vfIOe?1vOpL&w51= z*f`E{k8F&`;uHe&;|GUVzjxoih}GB1ARfe{inAvMOgr=AlX4jO9)H=`pc_+;F>r9HXJ6{l= zdaVS26Qr8z7ZoxTGRwU|IwE?Ja3C$TJ>Sx_$$WT9FDKh> z0hioLx6@AL6<#YJxUN~nojccEi;R>9b`+A`MWZmMNJx#6CXIYq6qrre>)C~G4#a1> zRsz5Q2?eJ&#EWVnb{AW|Nnni)q1p;Nl6qDj%XWG_R0fhd-eMOzg&-uk7LcxNr=I~$ zP-cnoDhSzD^Hb4~8hM}q{m*`7icSd&8#IC5N@AnPoEBpzp>KS!r_Rs@Jmk)?_u9X1p>ukeZ z8mmwb$!UjD5QQ&zxH&t;f&wFWD$)x+3PHt~rZ^PrZ6&~an%(L{tG!BE&Vt29m(G=%z865=D0XS4- zA5{~_?t8_t;bLzi9V3qohLZ?`U$&cO&XrWYO3=vwIx;H;)ur(hfAY`YyDh#eeywYD zQ$Gziv%REW`e7)Ia{c*0d%!X6=hMA>^YZ>fBN&~-;$y>ne7=(LgUZ{~MK#pZr7xV-;xHk-9}Cv;}x&%gm2Ck)W^NVxEI#0=EO?&8>$(fN0G zFZ|Wl|AMUl&92o`iE(7BM$(wyY-OY2a6F7h`^Eld0*mj!RdD)%y&o3?9JNC>PRstJ z>Y-d99pShab6-#wlCYuqEg~M>1wMr{{V$yS`JX=Z_g{JA^7-PV_>C`l@BfY7000mGNklaG?MjNzfZB?=8=3ygh8?={>H!gxcG6tr1&wvZUea0*KGi|`nnC^R$u;F|MBfj zbFHGW)ah#%{Y#yCyXb4>^<`RXX<2XQNmeGyMV#qcR>U10XJuHJC@+Ik6Q8uwdQw== zdY-Trt7nbCcUFu2J6??Zv>v8?L33T)9E@i-*5BFOcV*karJd`}4y`+wZi_6DGt4=i>1TY3Ld-bX7T>1*de0_*F`WIer7hoOwe zE{zD^cuI&qSZ{^266{tOh-d<0#9Qwi7FycE`_Pt``lIIhc>O|WU9;1V+jh!GTXpZ| z@9RRUwtwos4*u5U7oNEP?*@LNEq5)6=^hzqX8o;Vpqce8F%Q7dBI}8bWx|jwm)In4 zoO_n+4y>pf&$m`#g<}#DVt{#&V8B`_hymiE^t@7zEgTZLvZ;Lh-al(*12`R=LTP=V z+my#Nmi3=j`sfUL$Ht?=+qd%}1E7z$}~?IrTqr6YUqd=h_Db++C; zZJXigsVDy6(ve?$|F@2vJtUHU>5+jB%g8Jb(`Y9t^A(Ua4#*y+n<-o)lBT$F~1@t|Mc;KoyOxqm3=8nQEWB z{Ls?F;jt5siwAoI&?;8Ezki9@!0LE7Ir+3#W4mE}SYePsmj_~iRtX-!0QMdoKApd1 zAeMP3JyB>cmo`%}RyH!nuO4|=zo@PBrS1z`k8b&nnu%UJd*t9cgcYRNY9swXy5w$INJR-QLco@5K*o)cR$as;i z0CZR9OLX?DeTjLX7i{NHAO?_CITBZhI;VpFdS)Lq_W3|RYNy^M{;**gZ@zRQCRV1c#pC9J;o0zuXzHe`i?mXTTUB^h>C;(?FfvB5kD#sJ?S+dYZ|@+L$x)r3-Z5Y4!=ZzBA> z0XL&lpZbNVFKru`*!RIPwPX41Z1-Ar-V8um5(fCvi3^|hYA}dwwIN&Y?2Z^uz?|^^ z^2+{0xs`aZidJpC(uRdr2H6V!gG(4c&_UD*WNAC4mlFe$8Bj=6R($i~?|iQR^W&4l zd$<4R@$&~o|69EQ$jTZLGhrwaj#0AAR+-1~pl?7DnHxfac`(YueX=ahb%Qk^77`|3+!Ew>zC#z%}>QOJLt`q@*Hdx!5IKmOWB#hxAkkVYt>6l$lh z92PO3Xuxq6R{P5Oc-0zFY~U0T4_+w1UYf7yr6@Nslu~JfQY-Q*M29DoSB8EOskAR# zZbXZB49xmb1}`EDN_qOs6VFcm;p79aygc!R-Fte>LYa=!A{ssaj36hea(u;r^OF@{ zia8@yd%{qNpp}yHYm-<4h8phHDWUm@2auqRg8c{tB|%ad`JI}dHln5ZbZ}FBX8oOW zq@#=nLGhR0{iDCX|KVRAdb8&=3TXw6N%0q~`1Gok&X~O=qP=iuA6pxisjaPO*yXa1 zc!2WDVLdho1Gtk99<-t4Dy;D(UPUd)lAtvRZI=z))3~zr&IxIRO_iFB-n{hC!J%)h zW#^gzayqlfDV*zTWj*Vk)oi#m(wR=GnoV_(Ra4Q$P>^T^4-^ju0DKf(Avl_)4mlEL z!{&T4hyvQt(e6!WEV9%5@>`eotA|=*vPS?N9gJNb5jE?qU-2T|n`$3)V}r7j&P>!K z!Pi(M#lhN%lq}Lf{|bf<#RC9Dg$4k?@Hiutp@Ji2{b749T@L}4mNf+W?#*ZHVlaAk zS|Zy)qkGs#XS>?G#jFMSZXiuhc8I5R9RWC@E>5vMP%V z<>|=JYd%7G!(wM0ejXG>cSDw5RojD2@x9`hh~DU z?SDM~5%FM;0MHqdT1Nd}u^#)b^%W=G*nl<8L%7#*{U<3X?kF0pqptUKqZgiG_Kc{r zR&~7_tJLv@gGm3-r;qRY3KEwTW_>dE(6-ZGd+qmoR->eSora-oVW=rojKp!G>~##j z=}@B_Gls-<%p{`d?1_zLx1#_LW0SusYT8?^m#B9$!~^{v&$2o?cKO%#7vDe_G~(t5 zKJXv$&UVjfRJbn0^|ewkhRT<06&3FMOkqR#G|~%J)GSmkSHID7lAf(JIpU#ldg>_= zJH^4O$#)!D$vp!FGrnqID7~8h=EC8<=5Lc=`Th<6^WmN7W;XT+V5O6CeJvxQ{Ytm4 z91o}%0XnG;y<${cU`Po}4ZcnuRV2=%$olK*gZ1o+UXtvYB(hm)m(q4nRrL7WlaEZl zv~%#>$L@PW%!=Ls@No#nAhDj?RSpa}v=&(~#e#F`#cOnc>A}LP*PEC$f zXCJLvyPXg#R(`olbH@x%^UaCrrw?EG(`!G|=otWRR_R`^yBDq_G4xKC6M$f8Kp0A_ zWl#_mkPH!fR1A+gap4&+UZtR-8?;lGhpvCRoP=H{Q3loB6W@6IcmLrhKP<%g-T)8= z>nx^**0T1Zd(&Gy?O_I>2r$ekjnWn*kVbH96i!Xb=A$exFU(f z{TjMWbO=hQRDEaSfY{zE0B*#E6?=v6P7n0$gccp)?7JaYzF4D;;|8 zs(=AojP8fEQ`O&9d5L-8jD-0Y@|D6nxi@+d0RFmH0M$HDxT&CF9t_0-4cSD6$6C(d zv`R)I35jJShLDV7Vwc!%4Y8{R3D_F6Fycyj1_PpdHc!fJ?X~P&6F{JHvR-=ZKw{N|2cMzAs3FE&J|O!= z75&w$j^kBU9+hP{{sh)9W(^*d){y}4vAJ}xardI=m4QfQ`?kI`KJy8hhL@U=5F2h! zv%&8B;3`ywFLNLX2nq1y=+=P>ol2Dnc#dK@7FK05S5GLWxP~BQp>EVrx!p__+7{0o zX4<(zOo^*M(9SiV(4fb|cnqC2)YZG!vbz!njB|3Jjr|T*XnOQkkt(nPRUq@dTaRLj zNHZ+$xhQh^O?0z@D>oeXR8KIVMg@eLf`(nl24`9uCl+^ncj~9tvhyYYmg_-kbBtgm zzZ6+tNLGu|?FHkJMmw}_jeWOvVwJ}9PR36(NFcCJ(o~f8G-ro5QuEHSWO(k*Nm&4f zj|vEFi{@r(Y4d+yd$4B!eL)*t_M^MLYIBLANJ#KJg77GMr;w}niQfiV^ivRzn9C+% zN*k>F4)X^5ay66QjeIJr5p~WR5liqrAcL==u0xYgEN<%=Ks{`sL+uNe_TBxm>B!1@ ztR2SFk%(B^p@NU;EJknjaH&6P^-<@C zWbQtVi0*(D^P)?`zrB{7YX&i%$11Ha-Cigqy6Zr_nNwE~I%(}j zaoFcE26Ex>mX}UVji6Ro>LPs9H{P?(RU}OiBVk?NkzAv)B~3tsmUOT-C%w0yQ)k55 z*O~wZqJ_!`6CT+9!szAC@SIuMZcjsYuk<(k{$OpvsUTYUrRiI!BT`CxH@z}8a|m_7 zFz?o7RYU5Qs*3hZ;RT7gE55q1ehsw@$*JDVwq4sJZhEZ=fUTiXCau~ZzWeJZr=Es3 zBn$ZbNK1HJSs~jcG9yhEFx011$wgUI^1k{81#WoL(NkAPkaTS8h-!0z5wKjlw4g)}XL4~oZ*}L)R_&bLUnWC&y)S?pH)JQR+ASo~# zBz-~UO#6z)w*h6_-V^bROtEw-VRechyev*^OT;N<0{b@1)>u z_@1|Bz0W=;db`#HfIGrm1x4VTL9#QDQpg`wU;XyPvzWzsoWi{V@h9OGCNDiC%1%k$ zAVx(sy{R^h#Deo~^5b|`2X$0gBsXXW5Qp54RCC{k|Gj5+c6;Z2qW5b}0GsPm@LhIa zGCCrGkU2lD`Pt78eR(dsV{H16(p*HUg*upAk zOgyK-sRy!?sLU(`_F{eS@#E8vd`|pO*V;|}Qh=#g++aUesH{*5R9{h;s7S##(xu13 zzc_a0H_$hkv=lL(meO-B9rH?^d$8*1rQv7yA{Ka(WT=F-l6-ow{P)3opG?FLYyHgt z;A|u`LM`1saFL9zs$&yAJrFOhix&oK^Xt>ukv-4PBOBMvFkjo>#$kK)Uaz0sv`t3BDG>GmWJ^z_%;_LbqE?Ro$N}ecc9dtFQkD00960eEV(m00006 dNkl$RG0t& literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-spread-zero-end-reflect.png b/fixtures/web-first/chromium/svg-radial-start-spread-zero-end-reflect.png new file mode 100644 index 0000000000000000000000000000000000000000..2fce270269b7e3a33b988d4dc3ee210b4ba14d5f GIT binary patch literal 1104 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-stops-alpha.png b/fixtures/web-first/chromium/svg-radial-start-stops-alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5ff9721fca7b7c8337de5b1f6d36be8d0f6da3 GIT binary patch literal 2527 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 IM6N<$f?mbP>i_@% literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-stops-edges.png b/fixtures/web-first/chromium/svg-radial-start-stops-edges.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3073a28ecf2dc1414c529d13b759071ce572d2 GIT binary patch literal 2103 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-all.png b/fixtures/web-first/chromium/svg-radial-start-template-all.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd1fdaf79e717d8003793912134a844174d64c2 GIT binary patch literal 3178 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 Qy8r+H07*qoM6N<$f>~1$0RR91 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-empty-fr.png b/fixtures/web-first/chromium/svg-radial-start-template-empty-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4902575e6e2548dc758778073a8e922fa5a18d GIT binary patch literal 3147 zcmV-R47Br!P)000aCNklY4z60P+vy$Or~V`G2IJkL+ew@u8C%&*uOTVsT+t(Uu1%{iIX0z5|U7K+d~f*Y6O z(rVOsGEZin%Ifg!Uw=1$<;$7B`1KjULtmc(JoNP$z(Zf*V?Q|g_dm^@F7HyXLvWL| zld~peyym9lrW}UJ=exS>;&1=>!`Fkkr>l+IHf);EMb`&EdYhchIh$;3qV;}EVMuY9 zVn5a0RP|G3?&JDY0Py#!I$zf7S-5UvSNUC}^`m#0=EM4I;rns&W3Ku!_NnT|s+*eK zSntMmJ2d&zX#7b4zG#1a)ckf*UoNWaS=`iNSNmS9PvDMNufE3($E)w_j-~@Zvju?A zZiaR{&dgn}I|7);_0##;7tPt@_F`FGEb4XZH+AgEAFvQV!* zcT>CRn`WBTepiRS>if+&2fNJi*IfWSY0th|{O9THjYeQqUja`Ox0MHg(OCeX|5Nr8 zc^`UVJRILuw0;-h^0xM~dgu_bsz=86p&x-^JGAD=>u3Nk7C(Kn`uW-H^w}H$-acv& zfy;TdfiEjRI6FFLNdN4I1OTxsz6W_|{Wi`v{k9(GmG20c)`N0maLM83L-aJA z*3)j>OdHD&0fzbECLI9)c7J#B>gDqLm#d$?TKvoiG;bfZ7xQ?H>X}DlGYY4%h=9q~ zn=!+-dJE=^$ke6{v-Lp6!|RcDqgc^yc-$y@?&QZ8i`NUgO_$zuKJ_#vv+#gG3BCsa z8*}o>R@scUt-4r~V8LpGqt^{hr?azETY#Qux1WT5Qz`}EegM2!o+5W&u3o=fy+Q=O zTm68tlCGoKgw#1R&~3sSV|}JEG3O!Kh{yng&9J3P$aS(sOgF`JdOGPU?LwOd-ahh< zL%+NS0MF;YJfEGuSpF>a=ckv;SJiIH7csAKJJb6-TC!hwpTzg3pJ=yQpCmU(Z#$1y znJJEczUOK7=`cq6n{oqHD@fmn@Dhqx^GN`_o4%aAdA|7N`5YKdzh1mGOQYy*{26RKgVu=WWV4-7Rk z>&^h4G-qGVaKAy#c{V?N6fV=5SpQozS21l+YlQufGhn=0U+=w+PgZ6*pPf`Em%UF- z*p8y=M%o(t0BJ?g9 zjzWxOFN~kW_v&x>-@4pqu0Z7+thbPOLvHH6rd5jnzz3 z6^1yXs=l+5tJm&U*2<6a%w{)!yd2#oWf#@us=7k;fZADA7pRzd>+{ZoImqC29?WHx z!6M}GV9BLX@?kX0<;jrqlhxIhSIX-QZKUnv# z-vt0Z1KHNbUE_CcKuYc4NcuPxy1+Gd{lSW!9b76x0cggQ$MJKb~=a^hOvDX^Ofxrp_+QUvKTF40? zRw3PSWp+7%qQ>AS?8ik5?N_7>2uD2om2yLn91Vb6l)X6>vK2R43KrTLCfj&st*5c2 zh6d>a(ur9yZ7!;gDeCFX=sBzoHDq12*Gr=;`|k{9*TXHYA@*&0&~DhiX4o3_*F72nHnf?=T=J@QBK0 z(V-%w84Qv#QHctRGSB_Yn{!XLKv#m?4@EV!dHj=qswR zxsq3d$RQR1>N%>Yq!{+AqAVD!A~_O(&O$nF#$_)%%uVwvt%uTt{V1poEiAEfO&Wc% zk6E52AMm@Uk`)C5u>bJ~}ZUGQwnt(lFvl(aC{rq}Z z%&wfOwgPTWi|4O5hN&HRB|~|Kg0U60T3h_8Pdt8r2CtK z;b;Kj`=a$1W_#WHYrEdv0FD`2c@-Wx59Wh6T3&*H;Phl)|Sqt82n8>6h@84Vt+`P!2)kt4c}D=aiuG~D;j`}` zkRZ9F!C`V(;l-xiG6GYXO*zQ~o(ymgNfxo1^;IWxX&p-MIOl42zyKs88C5VKAk1$7 ztA@Sxe>(B~698m?wZiNcx*GdE2zQ;E6TnpAv)kBK4x*Ji5AReftNM_sItE!}Ho4yO zOyIpZD3{8pz19;0$qm6URX17wNdRESMYn2Y_8%SjBT~hoPyoP;b(X3dd%{TFI;rZ? zS=Gc=81}REN`1^Z=~UvNHF_)0JI>sjPLSw3b-ktj90UN@Ww&aA@CN`~ncd2H5hBna zGCG&`+!@O5OU}izQMIGz1I3rh_?tNJlmJ{}92%k;iuD=?$%;QehB|06ciBCvWtc3- zURePk;pP#2ddqV$IT`S>b5P}yb2*;jgixwVFRfjxr*ei7AQCyM(Ptt7B#p*FhiC@@ zz;8V79jC3WfNTp}}E+1~< zu;F^pVEt$Sia`MkLg-n99f$xcY?LA!v=-f*R%j;3DYpbcX1B~~z^JGfrSjbL2dPL$ zSbsDCBSlG?KCQM$oYW&(0rjGcjM`e9NGVIPN5?+>h)_X$8Rp6rgTe#4+<4#-SX55G98GB@8g z$bv!3S2@Md?@gqt3{xHifT5Eex+!i(Am}XigIXjQbnXD_r8n=7Hq3oo_x5cS000a&NklG`tr?9D zyp$Qe9evu4sSj42b>08vZ~yb(oqD0GO7>N{tCBi*ZRWbf^v+C1dwk`Co`UPAv>UT# z%$uRw_0@i;)Jt67O91j-XSWymW|`hEvwi7yWzuH0N!?&Iln^ywhsh4qK-P}st}pk) z^1fYe`it9UeYQ?sfWT$(fGy00%fwlu0CJpHf+|=pUIRt?C?c(OT{CHJC5j6{gmM4UJKw^^?_sVMrToj4zWO?s2vHR8PfSck!iu zwQjE#$+o25H<{~GOQn6>zc~rdX$0O@AKoqA$NNq7;cfL1e6FjTtKw5->d@HGW}!2o zw`$aC(%x&R04$UX!3B*dnoULCm&LF2nR-`HU2u9tEjm4-mR8}z{_XLQP9Shy-n?6Y zz^}h7-@mJV#pk!xd+MS5U>fW9scIZ$-#OoEfC=Cb;K52GTUxKv5YkEKJ`|(rd|5Pq zUjHkzKrhgZCwjbrSCqNgUmuC;SOPHdH`UFxNFBJLfnOHj@ct_Q6t;=qyTIE<4xzKY zH{`%Hpn?e+8c4m)e8@*#8sANN(0Ur*Ej}V$P+5eIjDdV-;4tHq+_o3T06U66;p(gM z^JM|Y{REo<6WY(>!&L_Ksoz?)OZ?8NIth5T&NoK)cIvebOa$7h;3k~~pf{xr{h+{Y zQpRgAyjp!0soRO!I_W2btPClyrPCKLL*R9B`#S#uPrWQYgUQv*mf9-BBKVNWE2WE=mfH#bP3IjkiD8l*h^3YSh4+G3f+)Hx)?O?O6PK_|ppz zxXAC<`R%LX?t;%-MtxzTYQYM`zzq$6LwxR?7d@!(xCs1M7d~`@88u~($O_9csFFlK z)*}|T1YOocQ8U?<`+^n6eRuI)1mIY!?EWI#AWxAAo?w#QWnu750!fG324OPej@syc zQ{;j{Z8hRj7!17vp6w8qlnoxyDRF5!yvpxTAZ<}5AywzgU4M@!k_Hm_a|oX&uuQkO z7wLAD?NBMKGW_pmoo@mxq_y%CujP|I01lyha!r0!J1;iI-{UQ;(AoH0X7^Yhscn^W zFXlw-o^78;_zeP8${KT#?W+XK?PbNi9VgWTsFtVU^D7+BFBn?OUv}oJXIw`+AL1^D z=Po|g*#uCNA<0)sQ@VYbG)Ovpx_uaJfcxRuYkF$WsPEC_nn5P#5BVJ(Ns-i|1lGo}N#j@e(6 z1(snlbw?1uk1e97RCtd}s6Em_<*Fv^g6ha|UpyhT5lGG;fcLqU;giBKI_}3DMDR)w zXvT6@1qn({RBZlv{3<#85^o6yGLhAy1#12W1OlWUnOI?RG6CR5g^0BX_yMts=vn8} z5~NB~tP})O78L5uXY}Bto=YbAy}X4g)yg`LOh`g@5vd{NX@8ChMH>~NE9q;YVlzQ5 z#O>z_*~xR3y`ay%Le2AAJ!p}A4g#p^JU`<%4=dOZInX0eSFlVnvboes(PW>J$x~m1 zh+EV=v8=ZfZsdJK3#Qpn_JCp(D@{bhNlSG}U4fyq;+Im5nwckMp9@dnpi(lIb!0UI zN@|?2k@FtjX1pkcOte0kz@yZ;77BFMy2F%Ub!%l;Cm?7Qh^iCj4?&7g);VyR5pUvk zX^J628*Rp`OtduXL3G7+L>5lP`4=VtXbDhVi_}2NglDYssV`>So@))08v`o!r1uz& zq?KzSBMsRTP@wEH%HBv!*A_X|BWTT$QQ{_4s1qf+I%pt8-U?z%Vu50Z{Zw>QGWZOV z8fAA+Cgz#h(bEJXdP?05g1etEmSVA9Wi`9o0q7C*X4xD19g?c0q#e+E_O~%tL=8k= zPv{0Jqdy#MY1RY2ZQ8t>a6<{$4ovU?1c>Bh0)m@119@~~649f{sE2%!W=S##hgtTF zN-;x$M}kVpvpQg9F;6A<3-}w?a45jBLlqVH6G{wc*1#POJ_#L-Y-0U(|xWaElCuYSt;SazCS#-l_{Gks8xK zXa;dmGcMUf%%v5H?DOz|zM0B6@kKj^zO11h3hqw*r_X?VjsV+J4wIwo=T494d(>Nf zl7C6^iLwu|nviH{QCGqq#Dk*-M0T-zl-MP)D1G2S4UE=po5j9g?uEm?hZ4$KbWV$! zvU3ScG7XQi2l}BZhBoV3qUYRm!d%+rtVk6shZbTLJew0CA14k{;Q;#V$J9fj=87X) ze>S0J+%zk+j+prFdUTRd0%(+t=m8wgCxGkFWn;xAAKJVJ`Y!2E+r=pwI_8Zl808Fv zOz9f&4HK;^`arDqkf)4T5u$!n0ys?8ZratRUt?MtIqZi;>22O6R6t<(n38S9gMb z)3Sx%c1xTdJop1*#&;2b`eBzC9gF46vbU75mv3?Of?VOyxt3XNlX2F7=l9HNVm`d0 z57;>tP1@9>pzN2Mj=1mIHS_=uup-Rg_cSMRcqaZFMSw~estlIn`bYFEk%&H?Tp(lM z_z2#D;dAQRG#kkw%(*${0cK*uSTu&T9ny9x>z*-f*Hya#({`R1h!w5x$%i-e0NH&L z-cge|NJW~XF&=wqK_z7p#gBA>P+KO5RE>0@vx{3dr(z##!O?R3HqBY(5EvFao_A0W zIJ1cyHjzWOI0oBM1h6Z#EaUG<%b^9QnG`=Ub%F`#i=^ZEq#MwAI!i}3CN{u2R#u#Q zN?gb9C1=g&Wx%@QsmJo*&E$YhkHL2AbQ&3eEsk`(V*04DfnLrYneS?P`5;~{y0UYa zVkaaTFo)UgJOGu9ix9{B744oUH=RVJZdo6FhIzvI0OEs@Hi6;_N7A79sk;VR~+2M2sT}>n`g0^{ z#2;~h{*dWnv<(j)A2Y^RFFw?WrPM#wkzV@(1eC-j`O|^4O^X~HX#H)}Ktdnj1j)pM zBPMKvK0TfmM?Xd^LN-8eRI}PC&pRRhE&}mFCTgala0UN9Ld4HWo{3X19>qs>&yT60q#8M`i=)LA}KFVt=i|{000a`Nklk<;fweX{+ULN0anq=w^L8&+XcoBGDiZsUO^l(zijkmvvtPL!B1DP-m&lv9Ib} z+;-g(KtEaB@4es4ex0P#K{D&RWvT(7G71+m&sU$$w{xWba|Gt+Z*k(wUt zwrcu#jo5wN1^`5V(0_Zc_x?_HJaVT4x5$b8h1JzY{iOd8zDQ$D3|h}j zwyaBMddsSU+nB0Z)_pt|JFcApJRZJzG(7ye|Mq?l>OUH#vmWsW+KOMb>1-|ONy_X-2+zIi=t_*y&6*3@j3JD8{AT{|x?USM=-LIqWt1NADr%R`! z=uN~d1povPPe?+K&sc74hiw5o92|Z-dG&Jg-Luib!{Lu#_1@jdjxtq*N{OWkjTN5b z4x>O|3~*&5pk`;wHd(G4FsE>!OvfZEBiL2|#_7q+ zy;mCKd(hI9Z<3%EkZAR%-v$LwGb&6EvFf6)m<3*w)Zvcb+H~=8=v(f$w@P{zGQu7ez zE-W=!prm?-*iWX1+>ncy6QFyGlE^CycD17A!~m*?cHrim<5+Z7IcYs?w9bAH&xt!C z82tW&0D!MghX>Cmub+=!L3%xt9=e}fu`;0mc_1IDl6W9l_eMi{0o_|*kiPM<6~TK+ z;_{9p=$4nY4$)cPo`tp)b}I|%*QG(`My(-l4*(JK$@tAvvcSGs_;BpPi4F54tdyv9 zs31KRJ(9^ok%x6Jz@LP4kBTn%wu?@TQ!;gWb_uFP(II!mRR+pCT!^`qMY1cLajrq8 zD~oHr`6d9vLu9UJn_pP)d)U9;#JSRlo?&Q|&-yk0C)|E(q(06K4BSGIO>$|epDOgpU zD=2UoRfAx+0dT+f?!n;aZw7~ECEH^gPMl{8gayZ+me>FdOX%JJgCyQV`p|Z|C#^GQ z6lXVJ(@NCm7+k00ZbvRpRF#n26<4(}=GLgsZwUao_Fn!Db(?>0#MF6Uh(53~oA6DG zbexD_i19ukDp7=Cxrr@jT357lY;6MVtxs%qQDW|dC__iN&vq?q^h-Mfz$Z@9V_@is zm7n+hsUZu1MJxSZua%)f{fXx-`!dUYLDQlM0`_UdMtbHL{0Ft(xuzQv_wGWvIN#+( zgJShP;Cu41e_t6K07g-RrAfFAz^_RB)Uv30>uh?4W)t|gcmn1l9jdFHI*!7lwO9* zPbfx7dNtK^R2Ly6Qz{2y75I7Fh3Lxc9RYxOMmC55q*3sp+OGAEI;OOIelNo2iP(@i zg!rT@iX^`?$||_VxbP&tW@iAgPUI-g(fqn}e)(OJIq{Q>0RvefF-M0C1ky6oBDC24Q3i0tt%u#1+ML18b4Lp)2>rxn60H@z!$#;khi` z%#ny(p{uclxQ0O20HFT0#q1yxE=bqPoLDSw5I@F#e5&W2rKe0MIJVL~^*S=diU>GS z{Rb*Y@dr&MUw5zKJsYOG-x3W(w*R)Fwjnxp-XjEsvA`Q29vLD_pvvC zLF^eSAi2f@*VRIh{@vo<+r@)#hx=-RG+ZL7Q}vd5bTgE#LiAU3UV(Z@vH+^lutCz| zMwref9R|w)2#KfmrRh2^-p|?^TQQ!d!=|qh@;U(TmiK>NJ~*5|eE#^g8ds{&9tj8j z=e#JWYTy|he34k8Vx;O=gc~4XJGcwa?HLBbQ`C+pjS$@t657#BQa{-+2JS6^D!CmQ1W)wX)W};XEbSmDEPEBm~$YAv-ANaW4o-8=tFa zjU<#buA@0=MH4%kI#Mr&DOl{w2!@MOJ@D$50I&`hkKRllKj=ThAbNCXiHL?gA0Sz3 zAcAVB;EB^9!A%+Q1ib+%d*ca?Z(N8Nct@BK>yqZuJSRm%LsQ2%_odl2p^8Xozh1%{ z0Q@k0^k(?vtKQF;BL4aAzmhu@S-^Ua%uu2yR^0W5Zla~*M2K~4yNDFnD|lyKF_%{L zU|Huh?W!=e!wmrBH1}<20@)#Ha6?Ew2mrWvaQgIK{tJe1YJi(Fn-CJRNfvFgjci*1I4#Eer!O%eP(&&X-M}mE zoi&J8wcqN%X4~oX zkF$qpu_Xh5lR=Twax_j)L9M)x%v_N-bMXdC(9{-nj#Ly$h{_aa=vdqQ?e&a-OX8>5QPoIJ1WB~>+tA=BDGEC<^vq0~L8IIL)2r7KTCzDi-V^)Q! zTgo{L7~Hz)5!cBMS@h$`ACkT#4D%8gb~vQj?Sy9k7U zjTRIW5zQxj;p}uZ9@20`k9L4}vK{DTaz&hhxG+dW61nty9x-A4Fnf&fjBkYn;2Yy? z+P64mT01(WjHgV2&-gHK#()a|s3IUcba{%-`67n(#w&ox8{jCuRH#gE+xGw?jd8$e2qoLiE~R{eL@V#fouoS_~)I z=`fiNa87KN877;$q(eIt7^*wGxPaleb|@kS_6l*^^+6}~N9(&M#blgLktHxON2=zt z?%J>sxHsRN8ga#6o!bGWo8t;1yD``PjsURGD;=-*aAjtdCq<$P_Jq!x>C}wR>*>^$ zF|ZxDe*S~}*yC(*O-3$=`p$M|#@#%Jj+f%$7fzkRNB)Jn~#ea;_kefi1Rr(RzG zeCqWDz^7iHJ%IlJ009602Y4#~00006Nkl0008RNklSbCnwh~E`9(L_r}%1_yu%vaUii; z6%^5emI_FDJ2;NJ6GC!>(R%OCL%iPr2@^klf5P#9jz0Ey0~Q$)793vyHNF69d;!$Z z-~_^pZE%^+)y+S??tp*?@BRq>`|rTu)L1XD zC9WTiVt^Wp0@ZZkOXn0|fW;Ad(>>b~ItT5DQ!f8MO2AD2D3i416Xh0I60tT29D8D@bR#kzTzI%p}0Rzm95D}P6l?hN- zN)AvXzyK2kO3(VUu~#*Y9tUVK%!+^kMg@x7V}jOZW3P}LA@SURXS*S02&gepKvMu@ zQjj-;d+vRX~b~@4(by?M7Iw1+_*% zZLp`~<;+qg6Z;BCG5t%Ny(Ua{meg*RRN`gm5aIT2A_$i)sN9!q;x*{ z`pn8MK>#YO|D{YvGf>IYa?hJ$;$V<0?5_g~>~1Ae#f#OoCp{_J94zm3SHW`}SZtjv zUD)DwZswl~+#z_5W1G4A!NT234>?K#Z*g+9c#r(_3f6Ezad;!$>0;pMdfnNXs0RR8EVouor000I_L_t&o07qilUwiR&Q~&?~ M07*qoM6N<$f{CkLrvLx| literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-fr-negative.png b/fixtures/web-first/chromium/svg-radial-start-template-fr-negative.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4902575e6e2548dc758778073a8e922fa5a18d GIT binary patch literal 3147 zcmV-R47Br!P)000aCNklY4z60P+vy$Or~V`G2IJkL+ew@u8C%&*uOTVsT+t(Uu1%{iIX0z5|U7K+d~f*Y6O z(rVOsGEZin%Ifg!Uw=1$<;$7B`1KjULtmc(JoNP$z(Zf*V?Q|g_dm^@F7HyXLvWL| zld~peyym9lrW}UJ=exS>;&1=>!`Fkkr>l+IHf);EMb`&EdYhchIh$;3qV;}EVMuY9 zVn5a0RP|G3?&JDY0Py#!I$zf7S-5UvSNUC}^`m#0=EM4I;rns&W3Ku!_NnT|s+*eK zSntMmJ2d&zX#7b4zG#1a)ckf*UoNWaS=`iNSNmS9PvDMNufE3($E)w_j-~@Zvju?A zZiaR{&dgn}I|7);_0##;7tPt@_F`FGEb4XZH+AgEAFvQV!* zcT>CRn`WBTepiRS>if+&2fNJi*IfWSY0th|{O9THjYeQqUja`Ox0MHg(OCeX|5Nr8 zc^`UVJRILuw0;-h^0xM~dgu_bsz=86p&x-^JGAD=>u3Nk7C(Kn`uW-H^w}H$-acv& zfy;TdfiEjRI6FFLNdN4I1OTxsz6W_|{Wi`v{k9(GmG20c)`N0maLM83L-aJA z*3)j>OdHD&0fzbECLI9)c7J#B>gDqLm#d$?TKvoiG;bfZ7xQ?H>X}DlGYY4%h=9q~ zn=!+-dJE=^$ke6{v-Lp6!|RcDqgc^yc-$y@?&QZ8i`NUgO_$zuKJ_#vv+#gG3BCsa z8*}o>R@scUt-4r~V8LpGqt^{hr?azETY#Qux1WT5Qz`}EegM2!o+5W&u3o=fy+Q=O zTm68tlCGoKgw#1R&~3sSV|}JEG3O!Kh{yng&9J3P$aS(sOgF`JdOGPU?LwOd-ahh< zL%+NS0MF;YJfEGuSpF>a=ckv;SJiIH7csAKJJb6-TC!hwpTzg3pJ=yQpCmU(Z#$1y znJJEczUOK7=`cq6n{oqHD@fmn@Dhqx^GN`_o4%aAdA|7N`5YKdzh1mGOQYy*{26RKgVu=WWV4-7Rk z>&^h4G-qGVaKAy#c{V?N6fV=5SpQozS21l+YlQufGhn=0U+=w+PgZ6*pPf`Em%UF- z*p8y=M%o(t0BJ?g9 zjzWxOFN~kW_v&x>-@4pqu0Z7+thbPOLvHH6rd5jnzz3 z6^1yXs=l+5tJm&U*2<6a%w{)!yd2#oWf#@us=7k;fZADA7pRzd>+{ZoImqC29?WHx z!6M}GV9BLX@?kX0<;jrqlhxIhSIX-QZKUnv# z-vt0Z1KHNbUE_CcKuYc4NcuPxy1+Gd{lSW!9b76x0cggQ$MJKb~=a^hOvDX^Ofxrp_+QUvKTF40? zRw3PSWp+7%qQ>AS?8ik5?N_7>2uD2om2yLn91Vb6l)X6>vK2R43KrTLCfj&st*5c2 zh6d>a(ur9yZ7!;gDeCFX=sBzoHDq12*Gr=;`|k{9*TXHYA@*&0&~DhiX4o3_*F72nHnf?=T=J@QBK0 z(V-%w84Qv#QHctRGSB_Yn{!XLKv#m?4@EV!dHj=qswR zxsq3d$RQR1>N%>Yq!{+AqAVD!A~_O(&O$nF#$_)%%uVwvt%uTt{V1poEiAEfO&Wc% zk6E52AMm@Uk`)C5u>bJ~}ZUGQwnt(lFvl(aC{rq}Z z%&wfOwgPTWi|4O5hN&HRB|~|Kg0U60T3h_8Pdt8r2CtK z;b;Kj`=a$1W_#WHYrEdv0FD`2c@-Wx59Wh6T3&*H;Phl)|Sqt82n8>6h@84Vt+`P!2)kt4c}D=aiuG~D;j`}` zkRZ9F!C`V(;l-xiG6GYXO*zQ~o(ymgNfxo1^;IWxX&p-MIOl42zyKs88C5VKAk1$7 ztA@Sxe>(B~698m?wZiNcx*GdE2zQ;E6TnpAv)kBK4x*Ji5AReftNM_sItE!}Ho4yO zOyIpZD3{8pz19;0$qm6URX17wNdRESMYn2Y_8%SjBT~hoPyoP;b(X3dd%{TFI;rZ? zS=Gc=81}REN`1^Z=~UvNHF_)0JI>sjPLSw3b-ktj90UN@Ww&aA@CN`~ncd2H5hBna zGCG&`+!@O5OU}izQMIGz1I3rh_?tNJlmJ{}92%k;iuD=?$%;QehB|06ciBCvWtc3- zURePk;pP#2ddqV$IT`S>b5P}yb2*;jgixwVFRfjxr*ei7AQCyM(Ptt7B#p*FhiC@@ zz;8V79jC3WfNTp}}E+1~< zu;F^pVEt$Sia`MkLg-n99f$xcY?LA!v=-f*R%j;3DYpbcX1B~~z^JGfrSjbL2dPL$ zSbsDCBSlG?KCQM$oYW&(0rjGcjM`e9NGVIPN5?+>h)_X$8Rp6rgTe#4+<4#-SX55G98GB@8g z$bv!3S2@Md?@gqt3{xHifT5Eex+!i(Am}XigIXjQbnXD_r8n=7Hq3oo_x5cS000aCNklY4z60P+vy$Or~V`G2IJkL+ew@u8C%&*uOTVsT+t(Uu1%{iIX0z5|U7K+d~f*Y6O z(rVOsGEZin%Ifg!Uw=1$<;$7B`1KjULtmc(JoNP$z(Zf*V?Q|g_dm^@F7HyXLvWL| zld~peyym9lrW}UJ=exS>;&1=>!`Fkkr>l+IHf);EMb`&EdYhchIh$;3qV;}EVMuY9 zVn5a0RP|G3?&JDY0Py#!I$zf7S-5UvSNUC}^`m#0=EM4I;rns&W3Ku!_NnT|s+*eK zSntMmJ2d&zX#7b4zG#1a)ckf*UoNWaS=`iNSNmS9PvDMNufE3($E)w_j-~@Zvju?A zZiaR{&dgn}I|7);_0##;7tPt@_F`FGEb4XZH+AgEAFvQV!* zcT>CRn`WBTepiRS>if+&2fNJi*IfWSY0th|{O9THjYeQqUja`Ox0MHg(OCeX|5Nr8 zc^`UVJRILuw0;-h^0xM~dgu_bsz=86p&x-^JGAD=>u3Nk7C(Kn`uW-H^w}H$-acv& zfy;TdfiEjRI6FFLNdN4I1OTxsz6W_|{Wi`v{k9(GmG20c)`N0maLM83L-aJA z*3)j>OdHD&0fzbECLI9)c7J#B>gDqLm#d$?TKvoiG;bfZ7xQ?H>X}DlGYY4%h=9q~ zn=!+-dJE=^$ke6{v-Lp6!|RcDqgc^yc-$y@?&QZ8i`NUgO_$zuKJ_#vv+#gG3BCsa z8*}o>R@scUt-4r~V8LpGqt^{hr?azETY#Qux1WT5Qz`}EegM2!o+5W&u3o=fy+Q=O zTm68tlCGoKgw#1R&~3sSV|}JEG3O!Kh{yng&9J3P$aS(sOgF`JdOGPU?LwOd-ahh< zL%+NS0MF;YJfEGuSpF>a=ckv;SJiIH7csAKJJb6-TC!hwpTzg3pJ=yQpCmU(Z#$1y znJJEczUOK7=`cq6n{oqHD@fmn@Dhqx^GN`_o4%aAdA|7N`5YKdzh1mGOQYy*{26RKgVu=WWV4-7Rk z>&^h4G-qGVaKAy#c{V?N6fV=5SpQozS21l+YlQufGhn=0U+=w+PgZ6*pPf`Em%UF- z*p8y=M%o(t0BJ?g9 zjzWxOFN~kW_v&x>-@4pqu0Z7+thbPOLvHH6rd5jnzz3 z6^1yXs=l+5tJm&U*2<6a%w{)!yd2#oWf#@us=7k;fZADA7pRzd>+{ZoImqC29?WHx z!6M}GV9BLX@?kX0<;jrqlhxIhSIX-QZKUnv# z-vt0Z1KHNbUE_CcKuYc4NcuPxy1+Gd{lSW!9b76x0cggQ$MJKb~=a^hOvDX^Ofxrp_+QUvKTF40? zRw3PSWp+7%qQ>AS?8ik5?N_7>2uD2om2yLn91Vb6l)X6>vK2R43KrTLCfj&st*5c2 zh6d>a(ur9yZ7!;gDeCFX=sBzoHDq12*Gr=;`|k{9*TXHYA@*&0&~DhiX4o3_*F72nHnf?=T=J@QBK0 z(V-%w84Qv#QHctRGSB_Yn{!XLKv#m?4@EV!dHj=qswR zxsq3d$RQR1>N%>Yq!{+AqAVD!A~_O(&O$nF#$_)%%uVwvt%uTt{V1poEiAEfO&Wc% zk6E52AMm@Uk`)C5u>bJ~}ZUGQwnt(lFvl(aC{rq}Z z%&wfOwgPTWi|4O5hN&HRB|~|Kg0U60T3h_8Pdt8r2CtK z;b;Kj`=a$1W_#WHYrEdv0FD`2c@-Wx59Wh6T3&*H;Phl)|Sqt82n8>6h@84Vt+`P!2)kt4c}D=aiuG~D;j`}` zkRZ9F!C`V(;l-xiG6GYXO*zQ~o(ymgNfxo1^;IWxX&p-MIOl42zyKs88C5VKAk1$7 ztA@Sxe>(B~698m?wZiNcx*GdE2zQ;E6TnpAv)kBK4x*Ji5AReftNM_sItE!}Ho4yO zOyIpZD3{8pz19;0$qm6URX17wNdRESMYn2Y_8%SjBT~hoPyoP;b(X3dd%{TFI;rZ? zS=Gc=81}REN`1^Z=~UvNHF_)0JI>sjPLSw3b-ktj90UN@Ww&aA@CN`~ncd2H5hBna zGCG&`+!@O5OU}izQMIGz1I3rh_?tNJlmJ{}92%k;iuD=?$%;QehB|06ciBCvWtc3- zURePk;pP#2ddqV$IT`S>b5P}yb2*;jgixwVFRfjxr*ei7AQCyM(Ptt7B#p*FhiC@@ zz;8V79jC3WfNTp}}E+1~< zu;F^pVEt$Sia`MkLg-n99f$xcY?LA!v=-f*R%j;3DYpbcX1B~~z^JGfrSjbL2dPL$ zSbsDCBSlG?KCQM$oYW&(0rjGcjM`e9NGVIPN5?+>h)_X$8Rp6rgTe#4+<4#-SX55G98GB@8g z$bv!3S2@Md?@gqt3{xHifT5Eex+!i(Am}XigIXjQbnXD_r8n=7Hq3oo_x5cS000aCNklY4z60P+vy$Or~V`G2IJkL+ew@u8C%&*uOTVsT+t(Uu1%{iIX0z5|U7K+d~f*Y6O z(rVOsGEZin%Ifg!Uw=1$<;$7B`1KjULtmc(JoNP$z(Zf*V?Q|g_dm^@F7HyXLvWL| zld~peyym9lrW}UJ=exS>;&1=>!`Fkkr>l+IHf);EMb`&EdYhchIh$;3qV;}EVMuY9 zVn5a0RP|G3?&JDY0Py#!I$zf7S-5UvSNUC}^`m#0=EM4I;rns&W3Ku!_NnT|s+*eK zSntMmJ2d&zX#7b4zG#1a)ckf*UoNWaS=`iNSNmS9PvDMNufE3($E)w_j-~@Zvju?A zZiaR{&dgn}I|7);_0##;7tPt@_F`FGEb4XZH+AgEAFvQV!* zcT>CRn`WBTepiRS>if+&2fNJi*IfWSY0th|{O9THjYeQqUja`Ox0MHg(OCeX|5Nr8 zc^`UVJRILuw0;-h^0xM~dgu_bsz=86p&x-^JGAD=>u3Nk7C(Kn`uW-H^w}H$-acv& zfy;TdfiEjRI6FFLNdN4I1OTxsz6W_|{Wi`v{k9(GmG20c)`N0maLM83L-aJA z*3)j>OdHD&0fzbECLI9)c7J#B>gDqLm#d$?TKvoiG;bfZ7xQ?H>X}DlGYY4%h=9q~ zn=!+-dJE=^$ke6{v-Lp6!|RcDqgc^yc-$y@?&QZ8i`NUgO_$zuKJ_#vv+#gG3BCsa z8*}o>R@scUt-4r~V8LpGqt^{hr?azETY#Qux1WT5Qz`}EegM2!o+5W&u3o=fy+Q=O zTm68tlCGoKgw#1R&~3sSV|}JEG3O!Kh{yng&9J3P$aS(sOgF`JdOGPU?LwOd-ahh< zL%+NS0MF;YJfEGuSpF>a=ckv;SJiIH7csAKJJb6-TC!hwpTzg3pJ=yQpCmU(Z#$1y znJJEczUOK7=`cq6n{oqHD@fmn@Dhqx^GN`_o4%aAdA|7N`5YKdzh1mGOQYy*{26RKgVu=WWV4-7Rk z>&^h4G-qGVaKAy#c{V?N6fV=5SpQozS21l+YlQufGhn=0U+=w+PgZ6*pPf`Em%UF- z*p8y=M%o(t0BJ?g9 zjzWxOFN~kW_v&x>-@4pqu0Z7+thbPOLvHH6rd5jnzz3 z6^1yXs=l+5tJm&U*2<6a%w{)!yd2#oWf#@us=7k;fZADA7pRzd>+{ZoImqC29?WHx z!6M}GV9BLX@?kX0<;jrqlhxIhSIX-QZKUnv# z-vt0Z1KHNbUE_CcKuYc4NcuPxy1+Gd{lSW!9b76x0cggQ$MJKb~=a^hOvDX^Ofxrp_+QUvKTF40? zRw3PSWp+7%qQ>AS?8ik5?N_7>2uD2om2yLn91Vb6l)X6>vK2R43KrTLCfj&st*5c2 zh6d>a(ur9yZ7!;gDeCFX=sBzoHDq12*Gr=;`|k{9*TXHYA@*&0&~DhiX4o3_*F72nHnf?=T=J@QBK0 z(V-%w84Qv#QHctRGSB_Yn{!XLKv#m?4@EV!dHj=qswR zxsq3d$RQR1>N%>Yq!{+AqAVD!A~_O(&O$nF#$_)%%uVwvt%uTt{V1poEiAEfO&Wc% zk6E52AMm@Uk`)C5u>bJ~}ZUGQwnt(lFvl(aC{rq}Z z%&wfOwgPTWi|4O5hN&HRB|~|Kg0U60T3h_8Pdt8r2CtK z;b;Kj`=a$1W_#WHYrEdv0FD`2c@-Wx59Wh6T3&*H;Phl)|Sqt82n8>6h@84Vt+`P!2)kt4c}D=aiuG~D;j`}` zkRZ9F!C`V(;l-xiG6GYXO*zQ~o(ymgNfxo1^;IWxX&p-MIOl42zyKs88C5VKAk1$7 ztA@Sxe>(B~698m?wZiNcx*GdE2zQ;E6TnpAv)kBK4x*Ji5AReftNM_sItE!}Ho4yO zOyIpZD3{8pz19;0$qm6URX17wNdRESMYn2Y_8%SjBT~hoPyoP;b(X3dd%{TFI;rZ? zS=Gc=81}REN`1^Z=~UvNHF_)0JI>sjPLSw3b-ktj90UN@Ww&aA@CN`~ncd2H5hBna zGCG&`+!@O5OU}izQMIGz1I3rh_?tNJlmJ{}92%k;iuD=?$%;QehB|06ciBCvWtc3- zURePk;pP#2ddqV$IT`S>b5P}yb2*;jgixwVFRfjxr*ei7AQCyM(Ptt7B#p*FhiC@@ zz;8V79jC3WfNTp}}E+1~< zu;F^pVEt$Sia`MkLg-n99f$xcY?LA!v=-f*R%j;3DYpbcX1B~~z^JGfrSjbL2dPL$ zSbsDCBSlG?KCQM$oYW&(0rjGcjM`e9NGVIPN5?+>h)_X$8Rp6rgTe#4+<4#-SX55G98GB@8g z$bv!3S2@Md?@gqt3{xHifT5Eex+!i(Am}XigIXjQbnXD_r8n=7Hq3oo_x5cS000O6NklRfm23cwardvJbE7U&;Gkr;%P_ z(rMDdsW>YE3|@)=?>D?y6Hq zNHT^4Ftlb!C%A4X1EYzfmXoGDIGvDzppvHuh?HnS1_~jHAgh!X4{UfzWC)i?u_1t_ z92(PiMc)>uU3uz?FSDlOoT z6i85#5eNj}rL6$eX0~Q%%h47+Awf2(K4TD05aTCeKU0V?P#%<=HL+*`Po&5-poP#0 z>`%ymM{Th8xB|pdNnUpIxd19XS~J&rY>Ej;nu4;?mIHW|P6b7pF@XBH3>bq3m&B}+ zqe>8wYXC7eDWP^Nq$R-j2yoIQCDz*53V?B?o+>j}8UUu+AQh7>2E;DSl2>Lt<$>!M z7tW@*YfZaz*0w znvEweEr0e%;z}72Z4@s>{mFaEReiw+@eDI+DU`=rYF{V-SW4vxiE>n(o-r(EBu+gs z>aVK$W7PDN8H5A-$)OlyibLef-HZA9xOMEToLv0FYE{5h4J+ zkk|a4dN)QB90dld$cT4@gx2tBPmbK3&UdBDn4c%+(7)yHlTxzJ1S`t}LMUmi$gx^cVS}d`eeMynS zB*J%_Kv9R^WfUcJGU)lpP|uEbr%isaJe&zi(3DHlrk4Ub)@CST2==GB(w zh;NOC=O{%T!z+k|J0mgL%RH^#H#9GRtb?@J$KaMgNJt$;s8q290NB}Yto7{caj8e& z42!+%4&*nyr@a;Ck%vM~P-$F`QZY9wofe)LBCF9z%z@uFP?jv^L1hd8=C=Vbdbn=K z#bSluC3ivZCj0`>`6*sZ-r^#p)pCNtvUy&Q2sPFs7tEEB~Bbe?1iNl?MLm4^2V^eIU_8?7B_nyRD} z#~$YnF4Dfyvr5Yyl4qaH^9$X!@j?aa9-@Kb%i%kK*4sKsf?tSk`=7He}Lc{Fq zhkJWaCejWIdz2+APdXV2Bc-(l6xT6jposZw3-$0Y-yi1vyKyhJ1~B{TVcyf8hITn2 zi&R7w>WKA4F@<_p9NS%=T)-vk1PIUqT;Y;yz?^%LLEyV%kJ7q(moJ-H6ge02A~ zAoTVCU=Pz?t(zGIeVVa@=TtYBRW!*tVkce*fZ#m9n}w(k@2jaMZ@Q|(nHTs|(UfpF#V9mwlNB|gr;Jgx zILa7AVRLf05#1RW?k;`TCIAH2!xFMYtuy;i#Qvcs3Q@Ps=P?)*TrebTLt@IYwuP#N zz8Y|&TPs1lFaQ|E-oJ%X8i@TToHtt2XZ}=XG13{zK;R6J#zO`|qW#cW;o2S<;7aJ1 zYXHcGKG-i%8C~<9%3%HgLwL#n9llTv=!GbR)FE%xNM%6n2o)l(1wgD?V}}==Iu>)O zrqX~vDB_#}ku%_Fhi&rCj#&hWUVZf8F9G1mz-+wm=PO7IKFLEHWidpDFS&7Hk7_;; z??2m%0(i2>dr`c^v+ee0)@$1hz_slL;M#TraBaH*xVHU!|G&`T%df@fU^fa~+in1^ zZ8redw$C2GZvX%Q|Nn6J@gV>J00v1!K~w_(Tpfcl`#y1B00000NkvXXu0mjft~=zQ literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-multihop.png b/fixtures/web-first/chromium/svg-radial-start-template-multihop.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd1fdaf79e717d8003793912134a844174d64c2 GIT binary patch literal 3178 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 Qy8r+H07*qoM6N<$f>~1$0RR91 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-override-fr.png b/fixtures/web-first/chromium/svg-radial-start-template-override-fr.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8c8f925f00970732c86cfafbb29f19ddf3f258 GIT binary patch literal 400 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFuHoWIEGZrd2?&8ms6q4v5)G% zgOe`+K}>+RfS}9PEiNU@yu24xO}2bBy25K>+ET)})okiRDM63Be4rorT2gF3;F->tN*h`@$SE4*imN z%vNwcc@D#`FY5%Ed)6G!U@W_qe52v+{?jp)veS43H+(FfzIyF}8IJiW>OVg(+WS>P z<$?X(ii~w>T-63E{T;UKtDU|7eB8lRJBk&e?CYa$)SNqHknga?Zfi{aT-%(jlPlw9 zP1sRbe0=Ha@8&ne#6K8rX8yc~F>iI%o-T^J+BR#4Zcv9Gu;q5u#CZs6-8)|etGTv=MjsYJHX1g?G`XIF#P`??7Ev3 f7_Mxf0A*%yIc@h(MNjfDP=vwL)z4*}Q$iB}=U}Qa literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-template-override-fx.png b/fixtures/web-first/chromium/svg-radial-start-template-override-fx.png new file mode 100644 index 0000000000000000000000000000000000000000..f19c91c9eadc10fa0718dd668ac11e8aa45392e9 GIT binary patch literal 3171 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 Qy8r+H07*qoM6N<$f>~1$0RR91 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-transform-rotate.png b/fixtures/web-first/chromium/svg-radial-start-transform-rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..97675164e00a39e1dbf344284119ff17692f0590 GIT binary patch literal 3205 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-transform-scale.png b/fixtures/web-first/chromium/svg-radial-start-transform-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd0ee664d16f1b8ca9163d597bb9a515e1e9ae6 GIT binary patch literal 2733 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 literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-transform-singular.png b/fixtures/web-first/chromium/svg-radial-start-transform-singular.png new file mode 100644 index 0000000000000000000000000000000000000000..118bdd83e8d41ca41b80e34c06f8d773277e5540 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMSWg$nkcv5P&NFf{C@>r_5HyxJ zHA~F&nBX?H=-=}`Znm^j4-j6#d4(m5$+U5ngYN=0;<;}b85sWmf5Loh1JEKikVVW4 YizOM`o_7c70Yw-*UHx3vIVCg!00(+8w*UYD literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-transform-skew.png b/fixtures/web-first/chromium/svg-radial-start-transform-skew.png new file mode 100644 index 0000000000000000000000000000000000000000..db7af2b0c22441436b4a1f813a09e036afbb1bb5 GIT binary patch literal 2936 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 UnDF)BApigX07*qoM6N<$f=jk3N&o-= literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-transparent-cone.png b/fixtures/web-first/chromium/svg-radial-start-transparent-cone.png new file mode 100644 index 0000000000000000000000000000000000000000..c27c3137f6de9d2262bd9eab1db0c6bced59ac31 GIT binary patch literal 704 zcmV;x0zdtUP)3`OOft=n`Ll*dX=|{8N;kT2<3?~HUPl#gLS0@V+25Ri~wkk5dh6` zsKBL_tq2p~$E$M|P61NDr09zuw}`0~(C6qCI1U+8FW@LrhGj*#Uj2mE5AVhzgZz?7 z-2*7f>1|w@{f?XS?{RBusa6(DgFJ}wl0VX6F6$XLgNdyj_}p|k*rZS}BN_=AN) z9ko&&7mFKMu6)Dtoew9Hq0~L#IKn7_-@6OwMK*%afgiYNbaQz3rV=fcH?VkXZJ-F{ z1xP~i<2U!ui>o0#IFBL=y)c1J&lP8D13$|`fFuZ$_~%vN*j;f1uY zV7oaB*XbaY5QmUK!AgK+r(Hri*+M$e!i>`<^XvpjcKre}Ne`J+i_EeV;B~Ut@8q%P zdt{cS07=8o!b|1I99sd+KnUoj$sAh&axKsfGGvae07*M=$qZ`&hbzIsuoe)A^PG%Vjh%hgv#n-Bz#kl+lIU!~zpjND7_0er>^@Mp= z0xH=pynS|KsFDO50l8EIAD>?xx*@_sfGZ}!UtZKk>Io_TG9;h(Uti9RT#{1y3W%dO zsH}jvN|QSNGnqve&bF>%m9{>RV m|6``u`Tzg`21!IgR09CW$$ypQYf#*FSoD@TLEGE&Nrekqr%zBBdf(6?LFID(hJ@PX#nk5mfF) zySSG$s@x&otB>#3!`<@uUOl{Bt?bpSyX8t34<*Kx)f890mu&35@$O;(X>1<*`<;_t z)L%aqt_|W|78|W1e8YW=7S@Amz(COl1o5#+VUYuvNYvX>R2i1AcNEs=pVK7R9q=DQ8|(@>4g^s1-WC;|(fYtX?vWFiLs zJK)e{m_VCIk+f!7EzE{vZSaoo+p_ks-a4*))w6Zw%APHtg)Iuv+*O6GOIOTsc$Ycw z^8UrIyC=UOi$Zu_DjPcfj=^DhxVC_|8q88TOiK z1gt5}B}R!^-Q>nW)p7vuJ@;w&v#;h4RE|SM(Znlj(9w75wYV2HRGJqOPnmYDKZ4!F zkYc`mAl80K0C(Ypx`&ZGiLztN3e_ol4Lp})tC-UANuCidGu}{Rp)ks^sKyn?vF@%f zmx0r(*Zt)cbx(u1mLe-ny~c@e)oFS+DNk&IxgcJH#QtFH!GQGPGnCe~g#ccA;@f!G z+&yH(boZD-YE^iYxbL*3io8DIGX`lQ007Q&tT@(_SaT95x-h^~>sP3lS9}NVK`JfQ zB+rVvC&p-qTP&6S1F9&>vxK(|R<1vNP^pcL#B=`m;bXPfr8TGSWx#}vqDt2OmO)K* zrUZCn<13v;`HZMc5yhpYWTv+<6E0CgAzFH*qTbz-K)fp}-luT0KrI7TN#c>rM9I?B zYw|6nN0KGkzeOcgZT@IR7Y5j^R`iLQHY%F8P({knP)KKC0yAL$HHl|J)w*wardf*o z3ARV9ky0E|rKM-1x;BDnVSt@GoAhXsrLjj~uF$C|UB9AxYm z8g0;dj9D8CLr6K%tV{xjTCy==aKWHTJ*xpjPzF5woyf!?Oh`=Z3UM)j-*(U3)T_hI z%I{nJ-Izxzv75@Wky4tfB|ZD(UX-t7;v4;TOTx9py|>hr5)vQLff^SqNW3U`99l#0 zv?@H3B~UF4@XM{Um;Tv$W#dPUE*iU!&BF+LqTx;i;RanE*gY6>si;&}S(^>v zl=+Y<&8WK0&{PWmlOzToJB?h9;PEZb;sE>g%B7uWUVY(vx?O6AXQ^~$oxO(#(0L~1rzj*QjOa{!wA`4?wkxBi%>_@_2cm;1~ZMQn5 zXOER;c8zk%j$Oa>{j%wm4zHpPJuuXX2QPPkB-PcD0Fs1f&kV1v7Pp>WzpVKf5_G{c z0p}I;^xTuB6{%bAwajT{59Xnp6=-foO&)pZ$R#-=7)C@+=u~9u3I|Kme zj{x9%8I*~{52T#>iGkHiU4>%K`jZAd{B86;kB0#Fd;A9g0RR6| k6Q9}u000I_L_t&o0B{NU8=aS9WdHyG07*qoM6N<$g6Qx!X8-^I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-user-percent-fx.png b/fixtures/web-first/chromium/svg-radial-start-user-percent-fx.png new file mode 100644 index 0000000000000000000000000000000000000000..753e216af578324977fe4affad77c37fe267269c GIT binary patch literal 1690 zcmV;L24(q)P)W$$ypQYf#*FSoD@TLEGE&Nrekqr%zBBdf(6?LFID(hJ@PX#nk5mfF) zySSG$s@x&otB>#3!`<@uUOl{Bt?bpSyX8t34<*Kx)f890mu&35@$O;(X>1<*`<;_t z)L%aqt_|W|78|W1e8YW=7S@Amz(COl1o5#+VUYuvNYvX>R2i1AcNEs=pVK7R9q=DQ8|(@>4g^s1-WC;|(fYtX?vWFiLs zJK)e{m_VCIk+f!7EzE{vZSaoo+p_ks-a4*))w6Zw%APHtg)Iuv+*O6GOIOTsc$Ycw z^8UrIyC=UOi$Zu_DjPcfj=^DhxVC_|8q88TOiK z1gt5}B}R!^-Q>nW)p7vuJ@;w&v#;h4RE|SM(Znlj(9w75wYV2HRGJqOPnmYDKZ4!F zkYc`mAl80K0C(Ypx`&ZGiLztN3e_ol4Lp})tC-UANuCidGu}{Rp)ks^sKyn?vF@%f zmx0r(*Zt)cbx(u1mLe-ny~c@e)oFS+DNk&IxgcJH#QtFH!GQGPGnCe~g#ccA;@f!G z+&yH(boZD-YE^iYxbL*3io8DIGX`lQ007Q&tT@(_SaT95x-h^~>sP3lS9}NVK`JfQ zB+rVvC&p-qTP&6S1F9&>vxK(|R<1vNP^pcL#B=`m;bXPfr8TGSWx#}vqDt2OmO)K* zrUZCn<13v;`HZMc5yhpYWTv+<6E0CgAzFH*qTbz-K)fp}-luT0KrI7TN#c>rM9I?B zYw|6nN0KGkzeOcgZT@IR7Y5j^R`iLQHY%F8P({knP)KKC0yAL$HHl|J)w*wardf*o z3ARV9ky0E|rKM-1x;BDnVSt@GoAhXsrLjj~uF$C|UB9AxYm z8g0;dj9D8CLr6K%tV{xjTCy==aKWHTJ*xpjPzF5woyf!?Oh`=Z3UM)j-*(U3)T_hI z%I{nJ-Izxzv75@Wky4tfB|ZD(UX-t7;v4;TOTx9py|>hr5)vQLff^SqNW3U`99l#0 zv?@H3B~UF4@XM{Um;Tv$W#dPUE*iU!&BF+LqTx;i;RanE*gY6>si;&}S(^>v zl=+Y<&8WK0&{PWmlOzToJB?h9;PEZb;sE>g%B7uWUVY(vx?O6AXQ^~$oxO(#(0L~1rzj*QjOa{!wA`4?wkxBi%>_@_2cm;1~ZMQn5 zXOER;c8zk%j$Oa>{j%wm4zHpPJuuXX2QPPkB-PcD0Fs1f&kV1v7Pp>WzpVKf5_G{c z0p}I;^xTuB6{%bAwajT{59Xnp6=-foO&)pZ$R#-=7)C@+=u~9u3I|Kme zj{x9%8I*~{52T#>iGkHiU4>%K`jZAd{B86;kB0#Fd;A9g0RR6| k6Q9}u000I_L_t&o0B{NU8=aS9WdHyG07*qoM6N<$g6Qx!X8-^I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-user-percent-fy.png b/fixtures/web-first/chromium/svg-radial-start-user-percent-fy.png new file mode 100644 index 0000000000000000000000000000000000000000..753e216af578324977fe4affad77c37fe267269c GIT binary patch literal 1690 zcmV;L24(q)P)W$$ypQYf#*FSoD@TLEGE&Nrekqr%zBBdf(6?LFID(hJ@PX#nk5mfF) zySSG$s@x&otB>#3!`<@uUOl{Bt?bpSyX8t34<*Kx)f890mu&35@$O;(X>1<*`<;_t z)L%aqt_|W|78|W1e8YW=7S@Amz(COl1o5#+VUYuvNYvX>R2i1AcNEs=pVK7R9q=DQ8|(@>4g^s1-WC;|(fYtX?vWFiLs zJK)e{m_VCIk+f!7EzE{vZSaoo+p_ks-a4*))w6Zw%APHtg)Iuv+*O6GOIOTsc$Ycw z^8UrIyC=UOi$Zu_DjPcfj=^DhxVC_|8q88TOiK z1gt5}B}R!^-Q>nW)p7vuJ@;w&v#;h4RE|SM(Znlj(9w75wYV2HRGJqOPnmYDKZ4!F zkYc`mAl80K0C(Ypx`&ZGiLztN3e_ol4Lp})tC-UANuCidGu}{Rp)ks^sKyn?vF@%f zmx0r(*Zt)cbx(u1mLe-ny~c@e)oFS+DNk&IxgcJH#QtFH!GQGPGnCe~g#ccA;@f!G z+&yH(boZD-YE^iYxbL*3io8DIGX`lQ007Q&tT@(_SaT95x-h^~>sP3lS9}NVK`JfQ zB+rVvC&p-qTP&6S1F9&>vxK(|R<1vNP^pcL#B=`m;bXPfr8TGSWx#}vqDt2OmO)K* zrUZCn<13v;`HZMc5yhpYWTv+<6E0CgAzFH*qTbz-K)fp}-luT0KrI7TN#c>rM9I?B zYw|6nN0KGkzeOcgZT@IR7Y5j^R`iLQHY%F8P({knP)KKC0yAL$HHl|J)w*wardf*o z3ARV9ky0E|rKM-1x;BDnVSt@GoAhXsrLjj~uF$C|UB9AxYm z8g0;dj9D8CLr6K%tV{xjTCy==aKWHTJ*xpjPzF5woyf!?Oh`=Z3UM)j-*(U3)T_hI z%I{nJ-Izxzv75@Wky4tfB|ZD(UX-t7;v4;TOTx9py|>hr5)vQLff^SqNW3U`99l#0 zv?@H3B~UF4@XM{Um;Tv$W#dPUE*iU!&BF+LqTx;i;RanE*gY6>si;&}S(^>v zl=+Y<&8WK0&{PWmlOzToJB?h9;PEZb;sE>g%B7uWUVY(vx?O6AXQ^~$oxO(#(0L~1rzj*QjOa{!wA`4?wkxBi%>_@_2cm;1~ZMQn5 zXOER;c8zk%j$Oa>{j%wm4zHpPJuuXX2QPPkB-PcD0Fs1f&kV1v7Pp>WzpVKf5_G{c z0p}I;^xTuB6{%bAwajT{59Xnp6=-foO&)pZ$R#-=7)C@+=u~9u3I|Kme zj{x9%8I*~{52T#>iGkHiU4>%K`jZAd{B86;kB0#Fd;A9g0RR6| k6Q9}u000I_L_t&o0B{NU8=aS9WdHyG07*qoM6N<$g6Qx!X8-^I literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-user-px.png b/fixtures/web-first/chromium/svg-radial-start-user-px.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2d7305bb3f47a21abf2e1823ca0286c40c9323 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLH@YFnW2qIEGZrd2?&Mw{xJxv5)ER zl$PBL^J&}Ks1tEiflYAnQ3D>agNyz*)LzW`pcK~KbTutt;%Y~;r(%vb97>v{LtL7D zYo6Ebe7^TX%_HCU(~B+H`P5Im*H<{}Hlc_sA(&w{(+wt`Lq9S*>aWew{r{_$fzf%! zzTP_K9hVo+XZZEveicuFk!=h^yc({zKYmuRd8xFZAg*(=&77BC6lU+doAYC~ z++3C;SC4;P{&R&L>-2vdJND_Qp7B?G{(;Q4|r01><*V|@i zx4Ga9&xt4Z4Da6Q4tqFzXKz}!{_gPXg7Yzr3vO^NHo9XRt}ye&mbl`A^E?*obQO8e zG%Vijx};IE;O*BJe;v0AV9R62ZrhY k|2dIX)<6auC{&plZX9qr&2=T}IZ%Yb)78&qol`;+06XigOaK4? literal 0 HcmV?d00001 diff --git a/fixtures/web-first/chromium/svg-radial-start-zero-stops-focal.png b/fixtures/web-first/chromium/svg-radial-start-zero-stops-focal.png new file mode 100644 index 0000000000000000000000000000000000000000..118bdd83e8d41ca41b80e34c06f8d773277e5540 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1SD0tpLGJMSWg$nkcv5P&NFf{C@>r_5HyxJ zHA~F&nBX?H=-=}`Znm^j4-j6#d4(m5$+U5ngYN=0;<;}b85sWmf5Loh1JEKikVVW4 YizOM`o_7c70Yw-*UHx3vIVCg!00(+8w*UYD literal 0 HcmV?d00001 diff --git a/fixtures/web-first/html-inline-svg-radial-start.html b/fixtures/web-first/html-inline-svg-radial-start.html new file mode 100644 index 00000000..47774ca9 --- /dev/null +++ b/fixtures/web-first/html-inline-svg-radial-start.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/fixtures/web-first/oracle-bake.json b/fixtures/web-first/oracle-bake.json index 9b289dea..377c2b73 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": "fdd8b6dec491334a09867d0913c75861e2812a6e2cea161b244e4fdd26c5bca2", + "suite_sha256": "9cc3c4ad2a2e4e31483b2895e4458618189361e767c55a0b788605d8090ec468", "capture": { "device_scale_factor": 1, "omit_background": true, @@ -64,6 +64,15 @@ "width": 64, "height": 64 }, + { + "id": "html-inline-svg-radial-start", + "source": "html-inline-svg-radial-start.html", + "source_sha256": "e86031f1909d87ec8cd44eb4942d9b7da62c0c02ef1294f7506cfba3eb6dd845", + "oracle": "chromium/html-inline-svg-radial-start.png", + "oracle_sha256": "431394a51976e5721a7498470d69eedcebabef0c36d96846a734e618fe4c204f", + "width": 64, + "height": 64 + }, { "id": "html-inline-svg-vector-effect", "source": "html-inline-svg-vector-effect.html", @@ -8569,6 +8578,1140 @@ "width": 64, "height": 32 }, + { + "id": "svg-radial-start-box-percent", + "source": "svg-radial-start-box-percent.svg", + "source_sha256": "4af3e02a80db580d74459115c14ab584501c3d1fe0673452b1cef94e7797a907", + "oracle": "chromium/svg-radial-start-box-percent.png", + "oracle_sha256": "eae5604f7426036c13116059be0b93adc7c847d73570e0cab073011680c65f8b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-channel-opacity", + "source": "svg-radial-start-client-channel-opacity.svg", + "source_sha256": "eda98511e873788fae27fa3e8cb19c6cb09d7637c473d094efe45bdaf493a05c", + "oracle": "chromium/svg-radial-start-client-channel-opacity.png", + "oracle_sha256": "5f948dcda15edcc1361621d2f91965a19c7622ca3d6175ab259a8f6d342b5f9c", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-clip", + "source": "svg-radial-start-client-clip.svg", + "source_sha256": "724794298c2046d18445d28c8e1d68cec5bd6c6643124ae1705ed041f7663b95", + "oracle": "chromium/svg-radial-start-client-clip.png", + "oracle_sha256": "b40ee0aee40b0ffd441fcf5c56ee124997b11832eea1dd3084d2a7d9cc9581f2", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-dashes", + "source": "svg-radial-start-client-dashes.svg", + "source_sha256": "cb3711e7554f8756294c921084b196dbc0dc487aab15d22bbd798b56cdec4188", + "oracle": "chromium/svg-radial-start-client-dashes.png", + "oracle_sha256": "fc9e39903177dee5a9ad6e7260ea5e38eb3eced9ab8ab6be0b07f96861e17207", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-ellipse", + "source": "svg-radial-start-client-ellipse.svg", + "source_sha256": "0612dedb2a68b73fc809ed8d1aabee17a9790f96af42d0845a8b80c6c4e097fa", + "oracle": "chromium/svg-radial-start-client-ellipse.png", + "oracle_sha256": "6bf16910508a44ec6185d90bc81564c83de95c3fcd56e52668bc6c56b301fe90", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-filter", + "source": "svg-radial-start-client-filter.svg", + "source_sha256": "b765ab8ffe8f70d4e8921301de461e1712e7ad861ce0b67828a522b0f64df095", + "oracle": "chromium/svg-radial-start-client-filter.png", + "oracle_sha256": "4382643475775ebb6e1028c09312cef2ad05d2d7bde65a3d0010f3f87f302312", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-group-opacity", + "source": "svg-radial-start-client-group-opacity.svg", + "source_sha256": "341afecd8fb4e5c8a8f0343b87615762027aca19742941346626f074e02d4a7d", + "oracle": "chromium/svg-radial-start-client-group-opacity.png", + "oracle_sha256": "edb010afa22920ac3c885f8e64feee16c1ca2d505a3da2778cecddfaa1514797", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-mask", + "source": "svg-radial-start-client-mask.svg", + "source_sha256": "d4c9761124fc3bd0ef5623e2602175e99e402fcea54acd6768df148d5eb93046", + "oracle": "chromium/svg-radial-start-client-mask.png", + "oracle_sha256": "fe3cc50e9ba2a8ecd209f91c4e4dfe4f6e04f5b702e57a7666d495643e23a0cc", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-nested", + "source": "svg-radial-start-client-nested.svg", + "source_sha256": "b0fce77c0db8e48cc9a11f8ba62eb5ce4d0675af2fb9c9a6d85296c2ed8d61fe", + "oracle": "chromium/svg-radial-start-client-nested.png", + "oracle_sha256": "531733367de4787c7bcdd02cea7758c6e5884689aa57b7cfb13dba64f79a2f98", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-order", + "source": "svg-radial-start-client-order.svg", + "source_sha256": "92e8a4715c13ec4e0ea565bce0b46b80d425177d06bdd0250c77045457b586ff", + "oracle": "chromium/svg-radial-start-client-order.png", + "oracle_sha256": "745ca083ddbef622654e823b7c54e87e4f3820c2a378b1949a673d71633bf4a6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-path", + "source": "svg-radial-start-client-path.svg", + "source_sha256": "59de0c061638721ceb5c0ac7ccc4d42b572f65cd1b87f873bd1f416a6dbfa280", + "oracle": "chromium/svg-radial-start-client-path.png", + "oracle_sha256": "b0d2d4c8cf4d3872d51bf1282837daec0290ce948fb3b4b28b6a99a93a49e11a", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-pattern", + "source": "svg-radial-start-client-pattern.svg", + "source_sha256": "7263e4d83ffe51c34facbc36c8d7e04d39cd166ce8c7f69c4628615ad2a2ba78", + "oracle": "chromium/svg-radial-start-client-pattern.png", + "oracle_sha256": "70a35490638a5489e11d8205b538e43fd96444b19ee73714a58f60d179613d18", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-stroke", + "source": "svg-radial-start-client-stroke.svg", + "source_sha256": "389d8db642f5090c72457d69044798189dc484ab3e74aa3bb5ad7d9c1f5a237b", + "oracle": "chromium/svg-radial-start-client-stroke.png", + "oracle_sha256": "7367248a7fe4540da5c7f54b8946ffedfdc8bab83e919c0c4e2f927c68a1950b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-transform", + "source": "svg-radial-start-client-transform.svg", + "source_sha256": "b027142733f95ec756761d03dfac749daf8ab0703e883200b3a23766727c0b9b", + "oracle": "chromium/svg-radial-start-client-transform.png", + "oracle_sha256": "29de8801246f17f78aa4c1f1831b06a78f45c97ebccaf77ce055d0686c190efb", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-use", + "source": "svg-radial-start-client-use.svg", + "source_sha256": "8d0b977e4c4953164b09a6fc857d5cab0ce409d0c25961b2d54eefabe1d0ee3f", + "oracle": "chromium/svg-radial-start-client-use.png", + "oracle_sha256": "c077dca1df419ade7fded64b6338b936dad687f072fa5315b1ef88a8e42e0f05", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-default", + "source": "svg-radial-start-default.svg", + "source_sha256": "edee25f315a2c8b9095e419cb63b948325110a561673b3c2da738fbb4dfeed99", + "oracle": "chromium/svg-radial-start-default.png", + "oracle_sha256": "2521ab1422e4dbf213bb3655ad4efc9470e1bfe41f9f592ce506a8ed846d3a82", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-explicit-default", + "source": "svg-radial-start-explicit-default.svg", + "source_sha256": "e9b4bbc95c5e153abdba5fb4604a2f11167ade07ee051370f5a171dc8e00a99f", + "oracle": "chromium/svg-radial-start-explicit-default.png", + "oracle_sha256": "2521ab1422e4dbf213bb3655ad4efc9470e1bfe41f9f592ce506a8ed846d3a82", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-decimal-higher", + "source": "svg-radial-start-fr-decimal-higher.svg", + "source_sha256": "d290d163d90424c02e59c63dd968c878776db8b0c155662236d7b72aae06a6a2", + "oracle": "chromium/svg-radial-start-fr-decimal-higher.png", + "oracle_sha256": "666340d8e8634055aeb3e93adefac9a497a0344a3525593dcdce07eaab111d3a", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-decimal-lower", + "source": "svg-radial-start-fr-decimal-lower.svg", + "source_sha256": "432e2570a0802ddd0d6fd2ecd4289a07cdb17ea10b26b9554f72d9ad443c0a75", + "oracle": "chromium/svg-radial-start-fr-decimal-lower.png", + "oracle_sha256": "ee3e00b7a496bc55d8f141f77fd03cb5a766c15ed75410312af2ac2c26c9ba95", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-equal-r", + "source": "svg-radial-start-fr-equal-r.svg", + "source_sha256": "5abae6cc0237a065ad67b93c76800547a620c09a7458f9516c3d6aa3b8677f5d", + "oracle": "chromium/svg-radial-start-fr-equal-r.png", + "oracle_sha256": "fc9d92604b350638a0d198f01c24a9e15f683ec001e7e03ab28c6d309f83251f", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-greater-r", + "source": "svg-radial-start-fr-greater-r.svg", + "source_sha256": "9e43ebc581f35a202d60903b6cd2329a8b81fb339aa21cc91594157e60c9b9fe", + "oracle": "chromium/svg-radial-start-fr-greater-r.png", + "oracle_sha256": "65cf78f4fd59ba0bd2c4e6681de3cf7ffde12f147b85563e2e6a55ba3fdf0b06", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-midpoint-higher", + "source": "svg-radial-start-fr-midpoint-higher.svg", + "source_sha256": "301b48c9e6390754764c5bf1ea4092fdc0d35dc5cf7e8aaf89e9e46dba07bf02", + "oracle": "chromium/svg-radial-start-fr-midpoint-higher.png", + "oracle_sha256": "093c43915fada446b20e5ca09dfd1bd5aca6ecfb5160886803577aa5fa6b8135", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-midpoint-lower", + "source": "svg-radial-start-fr-midpoint-lower.svg", + "source_sha256": "32034be42b46297743af033ad304944ebdbac594847b892c139623a7b9b770a7", + "oracle": "chromium/svg-radial-start-fr-midpoint-lower.png", + "oracle_sha256": "77b6de01604f4575632b931b8e4bcd772fc9f69541daaf966ecb8de5d6b5cbb0", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-negative", + "source": "svg-radial-start-fr-negative.svg", + "source_sha256": "fb957fa71a676b8afea6e9d53e1d85eefd5675652a989d288f062cc028532449", + "oracle": "chromium/svg-radial-start-fr-negative.png", + "oracle_sha256": "2521ab1422e4dbf213bb3655ad4efc9470e1bfe41f9f592ce506a8ed846d3a82", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-negative-zero", + "source": "svg-radial-start-fr-negative-zero.svg", + "source_sha256": "aa3d75e31bc59b75f0fa18e8c104998d94fc53120bbb134719cfd12bd18cf23a", + "oracle": "chromium/svg-radial-start-fr-negative-zero.png", + "oracle_sha256": "2521ab1422e4dbf213bb3655ad4efc9470e1bfe41f9f592ce506a8ed846d3a82", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-percentage-higher", + "source": "svg-radial-start-fr-percentage-higher.svg", + "source_sha256": "5b2eec28b16211eb7a10ac553bf51d4b211d0eaa575b7960f406bd3a04753cbd", + "oracle": "chromium/svg-radial-start-fr-percentage-higher.png", + "oracle_sha256": "13849c6ef93b616263e5cf43f5c5e1c40f4fb8deb8f2c1666552bd8b52bc631a", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-percentage-lower", + "source": "svg-radial-start-fr-percentage-lower.svg", + "source_sha256": "d2fcb4cb933ce879daf11ff2dc75dd8c51c5921fd363ac31f365081534f453d3", + "oracle": "chromium/svg-radial-start-fr-percentage-lower.png", + "oracle_sha256": "f78bb8b118b0d02e662d25cb7703496503843369f4b076cbf8ed0eb802e505ce", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-quarter", + "source": "svg-radial-start-fr-quarter.svg", + "source_sha256": "9f0ab74d61a286f1849cae4ef4f54b2cb7cb7206f85164853bf32e1fef88b338", + "oracle": "chromium/svg-radial-start-fr-quarter.png", + "oracle_sha256": "80a2b84481dc3612b664c8218877abe79a3e6acd87bf49898f7555edb50d84cc", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-decimal-higher", + "source": "svg-radial-start-fx-decimal-higher.svg", + "source_sha256": "c100913c407ab32f8677ddbea5a311079998d388739ac5261bbf82f4bdf79e74", + "oracle": "chromium/svg-radial-start-fx-decimal-higher.png", + "oracle_sha256": "fdb707ffbb341a3d6f3c1873952e39256e65c651ef1c06fece2551dcde870970", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-decimal-lower", + "source": "svg-radial-start-fx-decimal-lower.svg", + "source_sha256": "c9f7f5a7dcade0c2c3104249fbf728d774547ace51e1076d1fb73c3353375bcf", + "oracle": "chromium/svg-radial-start-fx-decimal-lower.png", + "oracle_sha256": "0d5301e34192577504096ce24e2701d12f4c87718e5c7eb973c77cd417686788", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-negative", + "source": "svg-radial-start-fx-negative.svg", + "source_sha256": "4b1acadd38d22e820d407a5f7b1c7da84257d7cdd72b85b9961a4db39d42c643", + "oracle": "chromium/svg-radial-start-fx-negative.png", + "oracle_sha256": "9d487686544f2fc22fdd7226d021ee8981d5d4dc81c4b1360b20b085e08ed301", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-on-end", + "source": "svg-radial-start-fx-on-end.svg", + "source_sha256": "ace61df249dfaebf4f0162ea2f425085b6a15d4f96f94e364158ddf834fe9666", + "oracle": "chromium/svg-radial-start-fx-on-end.png", + "oracle_sha256": "b46960a20dcbce78b6d2f55c9a3833d62e05b5d7ec4751aa389ebaeb7d15c355", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-outside", + "source": "svg-radial-start-fx-outside.svg", + "source_sha256": "a566f438d8e6c7e9584467d19d9a00e3d74e2e1d3dbfd64093d01891bc44f2d3", + "oracle": "chromium/svg-radial-start-fx-outside.png", + "oracle_sha256": "14c681e4553c162af59d00e341aef5d70823b7e98d9439508d10178e6dd46edd", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-percentage-higher", + "source": "svg-radial-start-fx-percentage-higher.svg", + "source_sha256": "46a763d9c31e50975962b2824a4a7dd0b942689b20a9a434185e115167811b3a", + "oracle": "chromium/svg-radial-start-fx-percentage-higher.png", + "oracle_sha256": "3b12d84cc89f39b2c87d222c7899a4cbd0ea40c8062484128a79a081e2ca54bf", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-percentage-lower", + "source": "svg-radial-start-fx-percentage-lower.svg", + "source_sha256": "2c636a1458f627fb95c02de8f6c28d339582115f973b6aacf59340fbf01136da", + "oracle": "chromium/svg-radial-start-fx-percentage-lower.png", + "oracle_sha256": "0d5301e34192577504096ce24e2701d12f4c87718e5c7eb973c77cd417686788", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-quarter", + "source": "svg-radial-start-fx-quarter.svg", + "source_sha256": "a5c59a017a9c7cfa40c2b13aee92194ae5d9c1767e30806f524d64f860d4d096", + "oracle": "chromium/svg-radial-start-fx-quarter.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fxy-fr-quarter", + "source": "svg-radial-start-fxy-fr-quarter.svg", + "source_sha256": "d02390d8f32df5daa297870d5b164eb28abacbe1ea7a6c72f88634e3bff8415e", + "oracle": "chromium/svg-radial-start-fxy-fr-quarter.png", + "oracle_sha256": "431394a51976e5721a7498470d69eedcebabef0c36d96846a734e618fe4c204f", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fxy-quarter", + "source": "svg-radial-start-fxy-quarter.svg", + "source_sha256": "ea3500f44977115ebdf3799bd56a1ac95453b862619d4fac21b677f70eb00b3b", + "oracle": "chromium/svg-radial-start-fxy-quarter.png", + "oracle_sha256": "305ab2f625c42b9a5adfc6acc501687734e98b146b82210c3fc37b1060eea480", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-decimal-higher", + "source": "svg-radial-start-fy-decimal-higher.svg", + "source_sha256": "9e0ccfee412b09700358e386f9e52df41a095b68b412805898b4e7e1a46655e2", + "oracle": "chromium/svg-radial-start-fy-decimal-higher.png", + "oracle_sha256": "56408367f7f169c4f29dd0a7d5b732d8e10aa5246320300adbc2ad960240a615", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-decimal-lower", + "source": "svg-radial-start-fy-decimal-lower.svg", + "source_sha256": "92a8bd9a160713c65158442c0b9cc80a57c03ec0b1693fced6d8f0f1b85a086a", + "oracle": "chromium/svg-radial-start-fy-decimal-lower.png", + "oracle_sha256": "0d5301e34192577504096ce24e2701d12f4c87718e5c7eb973c77cd417686788", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-percentage-higher", + "source": "svg-radial-start-fy-percentage-higher.svg", + "source_sha256": "f325e0b9eccdb40a903e302b1e606f90d724c97acc9162cb010c43f5ee6fe6ff", + "oracle": "chromium/svg-radial-start-fy-percentage-higher.png", + "oracle_sha256": "5542e71d522e5778c99f9115a14f7dbbd2ef690d849f33e9d34ef07c025ac887", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-percentage-lower", + "source": "svg-radial-start-fy-percentage-lower.svg", + "source_sha256": "f17a0bf0cf09e13f2e061f2d8a0c5590b03c09ca425ada5a5eb92f2aa0b40627", + "oracle": "chromium/svg-radial-start-fy-percentage-lower.png", + "oracle_sha256": "0d5301e34192577504096ce24e2701d12f4c87718e5c7eb973c77cd417686788", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-quarter", + "source": "svg-radial-start-fy-quarter.svg", + "source_sha256": "c7286f99262d6f32cf271685c8c8c3d1e3596c5cfa31672faef41fca3d8ce480", + "oracle": "chromium/svg-radial-start-fy-quarter.png", + "oracle_sha256": "f940e782a2f68b2af833fde9870c4c163bd4a121c1d99c691534eb0cce74a0cd", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-graduated-focal", + "source": "svg-radial-start-graduated-focal.svg", + "source_sha256": "70c417e69bcc76c274f3c73596da711cc60efec8f7262abcb8b5851c4a16d06e", + "oracle": "chromium/svg-radial-start-graduated-focal.png", + "oracle_sha256": "c1477f001a2a2a7e1bb341cb393627b84e78ef28f25b1029a215b8516aa0e887", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-comma", + "source": "svg-radial-start-grammar-fr-comma.svg", + "source_sha256": "a06a6924b9ffb77ca2f6d9d279f73ef912158f2966a7235c0c9c5fcbde89ed84", + "oracle": "chromium/svg-radial-start-grammar-fr-comma.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-exponent", + "source": "svg-radial-start-grammar-fr-exponent.svg", + "source_sha256": "2cf7094a4e3f7d19e3a15d57849b73bf841b22c43ce0c072152327f41190202b", + "oracle": "chromium/svg-radial-start-grammar-fr-exponent.png", + "oracle_sha256": "ebef51b8e9e7a6be894c1a3809f65ceecbe6d0eca71c61737f064ca163d3d0b5", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-integer", + "source": "svg-radial-start-grammar-fr-integer.svg", + "source_sha256": "1199c54d60ae7f251ec20d56d5c787b82da7f40ac9163a5644ffe1010c157a50", + "oracle": "chromium/svg-radial-start-grammar-fr-integer.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-nbsp", + "source": "svg-radial-start-grammar-fr-nbsp.svg", + "source_sha256": "63f9e6d4bdfc4c79b4ec54f3d97c49d8e3743c45f2a81b7c1cda151b4d9bca8e", + "oracle": "chromium/svg-radial-start-grammar-fr-nbsp.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-signed", + "source": "svg-radial-start-grammar-fr-signed.svg", + "source_sha256": "962b39030c539bc373c00bc53e40841432582ee70162d5f240db9db0957aa65e", + "oracle": "chromium/svg-radial-start-grammar-fr-signed.png", + "oracle_sha256": "ebef51b8e9e7a6be894c1a3809f65ceecbe6d0eca71c61737f064ca163d3d0b5", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-trailingdot", + "source": "svg-radial-start-grammar-fr-trailingdot.svg", + "source_sha256": "d3d905b63226ca5401df8254084e02e68c9f81c8724c4be479039bbf84618cd0", + "oracle": "chromium/svg-radial-start-grammar-fr-trailingdot.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-whitespace", + "source": "svg-radial-start-grammar-fr-whitespace.svg", + "source_sha256": "593857c97a61bef7093e4219446771ab500390c7bbd1a9b71d64c2b507724278", + "oracle": "chromium/svg-radial-start-grammar-fr-whitespace.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-comma", + "source": "svg-radial-start-grammar-fx-comma.svg", + "source_sha256": "550b5c7e79943d010574448e5bda8699043b9c714213e3e43016162d5e646d4a", + "oracle": "chromium/svg-radial-start-grammar-fx-comma.png", + "oracle_sha256": "917e9e95db49d09af380721d53277dffa4218c4f89b15f0a34dad24cee584bd7", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-exponent", + "source": "svg-radial-start-grammar-fx-exponent.svg", + "source_sha256": "53afc6392613cb4602577add797e9c29a940a7637f407ab84a60286187cb980b", + "oracle": "chromium/svg-radial-start-grammar-fx-exponent.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-integer", + "source": "svg-radial-start-grammar-fx-integer.svg", + "source_sha256": "ff503adcf180eddc897419974ce9f09f81a6373279c99acdac6cb15baa1eb229", + "oracle": "chromium/svg-radial-start-grammar-fx-integer.png", + "oracle_sha256": "c64a039ab50019eaa1c7614b8b1e8ba68fa8a81c7f44d7e5728e75ce2cc4e72d", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-nbsp", + "source": "svg-radial-start-grammar-fx-nbsp.svg", + "source_sha256": "6413b6beaeae0ce9f7c1a83951d6a558490a672393219d5a020625c63351a950", + "oracle": "chromium/svg-radial-start-grammar-fx-nbsp.png", + "oracle_sha256": "917e9e95db49d09af380721d53277dffa4218c4f89b15f0a34dad24cee584bd7", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-signed", + "source": "svg-radial-start-grammar-fx-signed.svg", + "source_sha256": "831092b1c549586f536c235bcefdbc36ac669ea659604b4ebc48db8d605d71ad", + "oracle": "chromium/svg-radial-start-grammar-fx-signed.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-trailingdot", + "source": "svg-radial-start-grammar-fx-trailingdot.svg", + "source_sha256": "ac346555fadbba337168d4bd0eb28d5a8c6cee992800184bb177ddab12e86769", + "oracle": "chromium/svg-radial-start-grammar-fx-trailingdot.png", + "oracle_sha256": "917e9e95db49d09af380721d53277dffa4218c4f89b15f0a34dad24cee584bd7", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-whitespace", + "source": "svg-radial-start-grammar-fx-whitespace.svg", + "source_sha256": "c8deafec16ecacfe3daa99540a6c0d4760c4d4127ad6b3c5bbe2a9ff7575b0a5", + "oracle": "chromium/svg-radial-start-grammar-fx-whitespace.png", + "oracle_sha256": "917e9e95db49d09af380721d53277dffa4218c4f89b15f0a34dad24cee584bd7", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-comma", + "source": "svg-radial-start-grammar-fy-comma.svg", + "source_sha256": "9eb25501e987e39a4444f3a6e5309d456f96994eb681b6bb3f7cbf38a386c8a7", + "oracle": "chromium/svg-radial-start-grammar-fy-comma.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-exponent", + "source": "svg-radial-start-grammar-fy-exponent.svg", + "source_sha256": "524dd36cecb17d7cb2d0f1fc4fe0b7744e8e36dde065df16f49424d36389ba1c", + "oracle": "chromium/svg-radial-start-grammar-fy-exponent.png", + "oracle_sha256": "305ab2f625c42b9a5adfc6acc501687734e98b146b82210c3fc37b1060eea480", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-integer", + "source": "svg-radial-start-grammar-fy-integer.svg", + "source_sha256": "14ff0306d4a26f7e7f58858fff8acf2d76a9b247770645006aec097a678df8fa", + "oracle": "chromium/svg-radial-start-grammar-fy-integer.png", + "oracle_sha256": "2b425ae05af82f207be35dc76d4803ec44b5a6a80ddd7e804f54324ca01dab4b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-nbsp", + "source": "svg-radial-start-grammar-fy-nbsp.svg", + "source_sha256": "39e93a2cfc5b667c1e579d50e647ab458561a1ecf674c319fed12b0535b6d60f", + "oracle": "chromium/svg-radial-start-grammar-fy-nbsp.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-signed", + "source": "svg-radial-start-grammar-fy-signed.svg", + "source_sha256": "091931ddee48e758835703826499205a214f1d0c53a938d26acd4c3b0dcc3831", + "oracle": "chromium/svg-radial-start-grammar-fy-signed.png", + "oracle_sha256": "305ab2f625c42b9a5adfc6acc501687734e98b146b82210c3fc37b1060eea480", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-trailingdot", + "source": "svg-radial-start-grammar-fy-trailingdot.svg", + "source_sha256": "69bc7833cb3be8f879d7d700132d7d8c9952c355dfbdd6cf85c0860446af05c9", + "oracle": "chromium/svg-radial-start-grammar-fy-trailingdot.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-whitespace", + "source": "svg-radial-start-grammar-fy-whitespace.svg", + "source_sha256": "d5f8c6ad9b56ab9a1b84f3c6d0301b114e3b8b93f08e008ae2b2e23a55fc4ad1", + "oracle": "chromium/svg-radial-start-grammar-fy-whitespace.png", + "oracle_sha256": "e5334f527f556396ebb58a9f5fd7235304fce458d7b79134553c2fa4f1ad5018", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-mapped-viewbox", + "source": "svg-radial-start-mapped-viewbox.svg", + "source_sha256": "78d1108f8116f8281cce13d3fd3b441a668a03ef75d72d11bd9c647344b0dab3", + "oracle": "chromium/svg-radial-start-mapped-viewbox.png", + "oracle_sha256": "99b098487564030537529948bf95654428e511ec72e296a64f82eb39db92e5e9", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-on-end-reflect", + "source": "svg-radial-start-on-end-reflect.svg", + "source_sha256": "6737665bced7278e441b47357466f10f04a8ef699288b2857192c8389a4731c8", + "oracle": "chromium/svg-radial-start-on-end-reflect.png", + "oracle_sha256": "89c8444919f4d818f4af4fe14a82ab7ab7b13c86b6ca74ddce3147624b4cbe53", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-on-end-repeat", + "source": "svg-radial-start-on-end-repeat.svg", + "source_sha256": "658a63ff138b02afa93fb555372d4ad6fdd8859844b8a38cfa79f623c637f1d7", + "oracle": "chromium/svg-radial-start-on-end-repeat.png", + "oracle_sha256": "57ee46d50c23446d0d03df7c4ca47808f8b1354bbe1a34f255481010a4c6ea5c", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-default", + "source": "svg-radial-start-one-stop-default.svg", + "source_sha256": "621fe484dee548718c0e1389e5536a4b65f460ae0129982574e7d86eff82e663", + "oracle": "chromium/svg-radial-start-one-stop-default.png", + "oracle_sha256": "55b21ea5b5edbaec8ac477bba6274fa81ca5f4060a0443e4d71e100ffb51ecb9", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-exterior-reflect", + "source": "svg-radial-start-one-stop-exterior-reflect.svg", + "source_sha256": "4e8b7636df56a0d633cc579fc813c2b512f88a3f84743a1596fc461c8f071b4b", + "oracle": "chromium/svg-radial-start-one-stop-exterior-reflect.png", + "oracle_sha256": "df1860aa6733e26cf277a4a28252f05f859fc61cdeee7e90a9c65a981f508e71", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-exterior-repeat", + "source": "svg-radial-start-one-stop-exterior-repeat.svg", + "source_sha256": "9813b5c76707c77fe9ac20fb0fcb1467b9932a7a959f6b5f9b097d67a5d25ace", + "oracle": "chromium/svg-radial-start-one-stop-exterior-repeat.png", + "oracle_sha256": "df1860aa6733e26cf277a4a28252f05f859fc61cdeee7e90a9c65a981f508e71", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-focal", + "source": "svg-radial-start-one-stop-focal.svg", + "source_sha256": "f8cea8a66e37633f677d1c33911bb3a8c1d6dff1f55d2d1258954588da8b34bb", + "oracle": "chromium/svg-radial-start-one-stop-focal.png", + "oracle_sha256": "df1860aa6733e26cf277a4a28252f05f859fc61cdeee7e90a9c65a981f508e71", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-negative-focal", + "source": "svg-radial-start-outer-negative-focal.svg", + "source_sha256": "329e9d27b0671cdd77b2641470db92642f2bd0ee1aed6b88d67f0339c9efe448", + "oracle": "chromium/svg-radial-start-outer-negative-focal.png", + "oracle_sha256": "ac74c3bed32526a16ef620dff4610ad854f070130065a4bcac535c843e9ef531", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-focal", + "source": "svg-radial-start-outer-zero-focal.svg", + "source_sha256": "e5ecb4672323d67126cf042d14763319e0a9b489f204faa588572d6fab37ba97", + "oracle": "chromium/svg-radial-start-outer-zero-focal.png", + "oracle_sha256": "ac74c3bed32526a16ef620dff4610ad854f070130065a4bcac535c843e9ef531", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-fr", + "source": "svg-radial-start-outer-zero-fr.svg", + "source_sha256": "a4b19687c4ac2f99085f201b0b795291198e8ad36f71ba5eed024c520b5a1fee", + "oracle": "chromium/svg-radial-start-outer-zero-fr.png", + "oracle_sha256": "68da8f0feb4b29f520d5159fbdf75cc83e27036828e737fad4ce57ac2683c0db", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-fx", + "source": "svg-radial-start-outer-zero-fx.svg", + "source_sha256": "500c53da6c77884404273d44b2fe34ac67ad0042bf7b9f84fb79e77e86bfc7f3", + "oracle": "chromium/svg-radial-start-outer-zero-fx.png", + "oracle_sha256": "6f4bc09437add7d83beb4429ffec5327b45c94ae909eab27f1225d6f82451d29", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-one-stop-focal", + "source": "svg-radial-start-outer-zero-one-stop-focal.svg", + "source_sha256": "47f0d969aaae043e23b8d4e6cf6a8739f2af1e8b849a769884f6dab4eef25d7f", + "oracle": "chromium/svg-radial-start-outer-zero-one-stop-focal.png", + "oracle_sha256": "1924a802682cafbcbad1a56367a93306e74fa62754ef5ea5486364ed97a3d6dd", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outside-positive-fr", + "source": "svg-radial-start-outside-positive-fr.svg", + "source_sha256": "b473984c137fb3d8823f3733da7390cb7602ad70bf1052830511e1a7ba44de2a", + "oracle": "chromium/svg-radial-start-outside-positive-fr.png", + "oracle_sha256": "914e90d7e35715efad599840133a97dacf6a21ec5c16d33ae277a0b23616b838", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-above", + "source": "svg-radial-start-relation-above.svg", + "source_sha256": "8ef770cdca9b6ca502f40e8ad4c255907fba76e3cf5abb80bc9e89ba834b69ed", + "oracle": "chromium/svg-radial-start-relation-above.png", + "oracle_sha256": "b16b44d438dac193895dd352f169fca5796e8ced683183cddcfaee67e7ed5d2c", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-below", + "source": "svg-radial-start-relation-below.svg", + "source_sha256": "e8cb5906fa2bd8768185f1339695bb0bdc39443cec155a8989f0060d4edaf108", + "oracle": "chromium/svg-radial-start-relation-below.png", + "oracle_sha256": "4f0eadf498e6ed05d8362f29cf65bbc04d41c4859c80c0cebacb9ffe2f1ae41a", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-containing", + "source": "svg-radial-start-relation-containing.svg", + "source_sha256": "62a8d29313498b09280ddc8cdac9464d99c5074357ea7e375505fe1cb5f2df74", + "oracle": "chromium/svg-radial-start-relation-containing.png", + "oracle_sha256": "b6f7aa1f7efabd472aefb2d66477f24f40c642b69c80928448c6be841ae22265", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-disjoint", + "source": "svg-radial-start-relation-disjoint.svg", + "source_sha256": "151f537a12d993fdca8945fadedf21fb79a02a2ff4285351bc42f71b19b1f6e0", + "oracle": "chromium/svg-radial-start-relation-disjoint.png", + "oracle_sha256": "77d70ba0147ad931f86144fa91e6fa20a5273ab039217e6246f527a49f083895", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-external-tangent", + "source": "svg-radial-start-relation-external-tangent.svg", + "source_sha256": "1c5331a52099b7c4b90b6f68772f0695ee4a5337aef3b66896101627fa7b5f5f", + "oracle": "chromium/svg-radial-start-relation-external-tangent.png", + "oracle_sha256": "3feb78fe38869fd53292d212ca20637f234c1fbf56c285f542b7d2762cca38bc", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-internal-tangent", + "source": "svg-radial-start-relation-internal-tangent.svg", + "source_sha256": "3c2088f965e781024ca223f875539eabf7b0273f5f2e1b9405a81c6c7dcb990a", + "oracle": "chromium/svg-radial-start-relation-internal-tangent.png", + "oracle_sha256": "361cfdd770979e42392c0111311b2303fbff151a26f79ad24a66087994117746", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-intersecting", + "source": "svg-radial-start-relation-intersecting.svg", + "source_sha256": "27fe9450c5bc6cca03c3d0c2bcd40788367a6031c9e300112411e13cca759bf2", + "oracle": "chromium/svg-radial-start-relation-intersecting.png", + "oracle_sha256": "34ba1e3fa79bf92dea2d1197a269de4bfcd32864504ccefe29c33e1948fa9a6d", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-left", + "source": "svg-radial-start-relation-left.svg", + "source_sha256": "1f293eb11298eeeeab7cc2e0b9048ee913418974221e8804825c4e029b66b027", + "oracle": "chromium/svg-radial-start-relation-left.png", + "oracle_sha256": "3a664371ccd6fcca8c3c0cb4e19d8ef03c431aed35e2bbccafcdbd093596b051", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-right", + "source": "svg-radial-start-relation-right.svg", + "source_sha256": "3dc08cb2a7560e9a1dac16394be06b82389f8b4032c4263d2095746409c3cf03", + "oracle": "chromium/svg-radial-start-relation-right.png", + "oracle_sha256": "ab97caf638fef1190e57dfc4b547a5bf80dea8d235df857a2e6dc2413b76a99d", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-same-circle-reflect", + "source": "svg-radial-start-same-circle-reflect.svg", + "source_sha256": "5e868076070c6fe173335c998f80cb7fe8d653ed15d310bd962764fc94a5d525", + "oracle": "chromium/svg-radial-start-same-circle-reflect.png", + "oracle_sha256": "4693b5e85e4c51a97270905cfdf2242c746fd4d2397a933791c9724a05e36984", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-same-circle-repeat", + "source": "svg-radial-start-same-circle-repeat.svg", + "source_sha256": "e5196b827a06dd8114c1410e25fd963040086e15bf2d998f6575235166ef165f", + "oracle": "chromium/svg-radial-start-same-circle-repeat.png", + "oracle_sha256": "4693b5e85e4c51a97270905cfdf2242c746fd4d2397a933791c9724a05e36984", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-circle-reflect", + "source": "svg-radial-start-spread-circle-reflect.svg", + "source_sha256": "db4717b2853c41436d0d12a4379660078f8358570957841e59a2f8c44d233fcc", + "oracle": "chromium/svg-radial-start-spread-circle-reflect.png", + "oracle_sha256": "afad5d6014197fd02ed0c8757ac5bd1e8caa67c3692f1f42471cdce3e9036785", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-circle-repeat", + "source": "svg-radial-start-spread-circle-repeat.svg", + "source_sha256": "2d370178ee41ef10da5d5f27408fed8f557062b9467f8fd45a1b9d01f619569b", + "oracle": "chromium/svg-radial-start-spread-circle-repeat.png", + "oracle_sha256": "a4f330f8746e9f7fcc1c5e4c18e7f77c9dd58b8c055560099fc6e27416facf9f", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-outside-reflect", + "source": "svg-radial-start-spread-outside-reflect.svg", + "source_sha256": "51ee436bc421fb0393d84340f66e5b421305767f53dded980a16944feb465f81", + "oracle": "chromium/svg-radial-start-spread-outside-reflect.png", + "oracle_sha256": "29e0a6237be007419c18d998a449bc471e9cb935ab451a38acc292bb5556a169", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-outside-repeat", + "source": "svg-radial-start-spread-outside-repeat.svg", + "source_sha256": "70ebadfd58ebd96d38db2938ee9cfdea2174e8cbd985101c2143768faa295bea", + "oracle": "chromium/svg-radial-start-spread-outside-repeat.png", + "oracle_sha256": "4ab77c7b881a34009e862d601dd239e8aa4526729d0d2cffad196366458a6ccc", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-reversed-reflect", + "source": "svg-radial-start-spread-reversed-reflect.svg", + "source_sha256": "ea602c3bf8490d1af217006db23f4c28335a10d6f5f07fe4978fee2d000f7295", + "oracle": "chromium/svg-radial-start-spread-reversed-reflect.png", + "oracle_sha256": "c0291e09565d0a2364f55ec6aa36efdd8f11a60596b0c1057dd9255f90f5e26c", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-reversed-repeat", + "source": "svg-radial-start-spread-reversed-repeat.svg", + "source_sha256": "596457f8f588892bca1b232ea1f7019004ddfc8466ae4841f53d12e3db94ac6e", + "oracle": "chromium/svg-radial-start-spread-reversed-repeat.png", + "oracle_sha256": "3f026bf07ca7436a83fc386208981691d898b8b1690cfde9c5b6a68d9dcef5e6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-zero-end-reflect", + "source": "svg-radial-start-spread-zero-end-reflect.svg", + "source_sha256": "b5f499df2431372624d84c6c9a078cde3f06ee23a87a93308f62c096099bacc5", + "oracle": "chromium/svg-radial-start-spread-zero-end-reflect.png", + "oracle_sha256": "e7f9bfef44095b456546dce865ace8f27a1a60f80c204d9a6bda855a0308065b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-zero-end-repeat", + "source": "svg-radial-start-spread-zero-end-repeat.svg", + "source_sha256": "9ffaa0125d07eb43732915493085daa1253d281b0dfbffdfc74170eadf15c72d", + "oracle": "chromium/svg-radial-start-spread-zero-end-repeat.png", + "oracle_sha256": "1ae3ce11d5cd86740bc91144aa19ea06d2a092a88ae154e259422278326b488d", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-alpha", + "source": "svg-radial-start-stops-alpha.svg", + "source_sha256": "b2ff62a0e49262ffc0213d8e5d37b62136b58ef019cd103680b91959631e59bf", + "oracle": "chromium/svg-radial-start-stops-alpha.png", + "oracle_sha256": "4c0532e3496d4e1492df0234218efe9d62a2b7512d174c9f43598684510b3bb2", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-duplicate", + "source": "svg-radial-start-stops-duplicate.svg", + "source_sha256": "3c53a98d5252bf4fc4606c6fa8612ddf03218bab52748545daa8d78385ea92ac", + "oracle": "chromium/svg-radial-start-stops-duplicate.png", + "oracle_sha256": "e7782de5839d8cffa2454c12ddbc189e9be6c9675eed89dd94a0d9023830d8d6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-edges", + "source": "svg-radial-start-stops-edges.svg", + "source_sha256": "0850ba587968dc1b32c02e79142708b07820e2c298aa536cfc004aa7499a30f8", + "oracle": "chromium/svg-radial-start-stops-edges.png", + "oracle_sha256": "0e4d12b58618fb759e3ec51fe41675b31c76adbdfd5c43dee5fc68f3b13d9c65", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-unsorted", + "source": "svg-radial-start-stops-unsorted.svg", + "source_sha256": "905c239e0a0581c21aa4f628f1b590eeb894730f0442745243fe5ecf21d9ec63", + "oracle": "chromium/svg-radial-start-stops-unsorted.png", + "oracle_sha256": "7752804bc7de1c6f712a27b16e6e3bfdf410635440a483555aec2af9ef67e5e6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-all", + "source": "svg-radial-start-template-all.svg", + "source_sha256": "25e2d302ebcec8271104f17f13dba0efdd23e4a5d78d5afa99ebe7ca818147a3", + "oracle": "chromium/svg-radial-start-template-all.png", + "oracle_sha256": "6852a4292ec18dcc524b95a66d21525fef6bb772859e4ba5bf85b77dfc2ba647", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fr", + "source": "svg-radial-start-template-empty-fr.svg", + "source_sha256": "0c07dbdcef5f45accde316aa4fcddb71901047d3a44a299fff44d77930339209", + "oracle": "chromium/svg-radial-start-template-empty-fr.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fx", + "source": "svg-radial-start-template-empty-fx.svg", + "source_sha256": "97dd74cd44631f41b91fed502d8c01e020735409f5722bfa952b978a3650d1da", + "oracle": "chromium/svg-radial-start-template-empty-fx.png", + "oracle_sha256": "2d3fd98c7d079cee77cc194a0f9b667e591424655b98aa9647d0801b078ba72f", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fy", + "source": "svg-radial-start-template-empty-fy.svg", + "source_sha256": "8507edfd6ffb994185d5d1c43b02bc768970749517e35b954ecf2ce9dd58bb81", + "oracle": "chromium/svg-radial-start-template-empty-fy.png", + "oracle_sha256": "ebef51b8e9e7a6be894c1a3809f65ceecbe6d0eca71c61737f064ca163d3d0b5", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-explicit-focus", + "source": "svg-radial-start-template-explicit-focus.svg", + "source_sha256": "6c79e250e16d606af381c72e6ac1f9d31d075c11de73aafac6ea5694897dc819", + "oracle": "chromium/svg-radial-start-template-explicit-focus.png", + "oracle_sha256": "c83ec0ec82c5ef86e6616a8ee3c66cdeeb6ef0cfbdf4479fb630a46aa880a6c6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-fr-negative", + "source": "svg-radial-start-template-fr-negative.svg", + "source_sha256": "661de9aa0f2e75b7e5a0dd18746e03c59d1a255b05b8abc534b7cb96dd3af837", + "oracle": "chromium/svg-radial-start-template-fr-negative.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-fr-zero", + "source": "svg-radial-start-template-fr-zero.svg", + "source_sha256": "422fa949d37d35ee70ceb30bc3e15819dfccead87f5266360a6f7c5986b65381", + "oracle": "chromium/svg-radial-start-template-fr-zero.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-invalid-fr", + "source": "svg-radial-start-template-invalid-fr.svg", + "source_sha256": "e8aaec17c19df0f9f5886ae98e6567c6d7d9d557002779621da403253d6012ef", + "oracle": "chromium/svg-radial-start-template-invalid-fr.png", + "oracle_sha256": "6534f8dda4e541a71ef65bb7b3ee1455bd361e82cdf591404e3ddd35a37f1227", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-local-center", + "source": "svg-radial-start-template-local-center.svg", + "source_sha256": "82a4166d6506d6f71dff61ae3b36e9b70a9c82a6ec9b96748177cdbc16e49312", + "oracle": "chromium/svg-radial-start-template-local-center.png", + "oracle_sha256": "13fb674aec4eda5e29584853f8df1d8f67b3466342e760cc5df83cf965da9430", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-multihop", + "source": "svg-radial-start-template-multihop.svg", + "source_sha256": "1e9ef28aa2de31cbf23fbf0db3b9650270474eb4c77d0b3f4b721df093e85346", + "oracle": "chromium/svg-radial-start-template-multihop.png", + "oracle_sha256": "6852a4292ec18dcc524b95a66d21525fef6bb772859e4ba5bf85b77dfc2ba647", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fr", + "source": "svg-radial-start-template-override-fr.svg", + "source_sha256": "93b4b8950a846072eaefab48cf19d99252cf078c1ff76df5b0919c704053b9e8", + "oracle": "chromium/svg-radial-start-template-override-fr.png", + "oracle_sha256": "bf542f4067a8557e9baa211601d28aa4211b17827eb1f50194c623424fc85460", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fx", + "source": "svg-radial-start-template-override-fx.svg", + "source_sha256": "f33975ddf5cfdb308f6ca8723ff1c5c89e97215a643577c8a49329614831efbf", + "oracle": "chromium/svg-radial-start-template-override-fx.png", + "oracle_sha256": "1eb93120dfcdcec750e284b6e9df5087f35ba72239243f9c2e22258fdb55cb04", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fy", + "source": "svg-radial-start-template-override-fy.svg", + "source_sha256": "12e7607c7650ea55f5a5d97160ee3d8555ba3d94417930da0d9431dc5c2e8269", + "oracle": "chromium/svg-radial-start-template-override-fy.png", + "oracle_sha256": "1572b7f0d48e1e74e21a0440411dbb788e466d7db91d3b1c9040407abd70e02b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-xlink", + "source": "svg-radial-start-template-xlink.svg", + "source_sha256": "80728913316f097d22fad02884c15dddd7db90cfbbee106e7427ed65e385ce15", + "oracle": "chromium/svg-radial-start-template-xlink.png", + "oracle_sha256": "6852a4292ec18dcc524b95a66d21525fef6bb772859e4ba5bf85b77dfc2ba647", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-rotate", + "source": "svg-radial-start-transform-rotate.svg", + "source_sha256": "314b5e2223f3e223dcdaf4780d12da40ff95d75cf489c1744ec77fc95d11e684", + "oracle": "chromium/svg-radial-start-transform-rotate.png", + "oracle_sha256": "fec2d2fb756b3a804a520869f594e7fc546a7c1c6fec3858349d9f55ce61f76b", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-scale", + "source": "svg-radial-start-transform-scale.svg", + "source_sha256": "67ffcb5f5f8580fc4a1b02bc36ab41bb4d43909aed4d3c875c317297b6675cc4", + "oracle": "chromium/svg-radial-start-transform-scale.png", + "oracle_sha256": "2dc123861114172f7df4bc4007f7f21cce3e0f02a23ef4e96fc753d01598d176", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-singular", + "source": "svg-radial-start-transform-singular.svg", + "source_sha256": "32293b5fcd06f70625023e88996dc3e6dbc74298dfa8f1dab7c20114a8f3aded", + "oracle": "chromium/svg-radial-start-transform-singular.png", + "oracle_sha256": "6f4bc09437add7d83beb4429ffec5327b45c94ae909eab27f1225d6f82451d29", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-skew", + "source": "svg-radial-start-transform-skew.svg", + "source_sha256": "4d86c97659381d1ae7e0950fa075bf9a35cc8ab43289a529907f649e878d8112", + "oracle": "chromium/svg-radial-start-transform-skew.png", + "oracle_sha256": "f8d69958c99486194826dc4bbdb56d565d5131b1a382c9f73011f4477e507011", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-translate", + "source": "svg-radial-start-transform-translate.svg", + "source_sha256": "de502c4f4a8a481cd7805f181236386e40810894a04987b81c0bec5fdc8fae0b", + "oracle": "chromium/svg-radial-start-transform-translate.png", + "oracle_sha256": "7a3c12e9c0cb258f1fc7700f24c16800ec423225278e579c04f46c6c86e0097d", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transparent-cone", + "source": "svg-radial-start-transparent-cone.svg", + "source_sha256": "6fde32b5f7193fb3d04fb5f60db42ddcb4bb6da63952541cc9759bb2f8a753d4", + "oracle": "chromium/svg-radial-start-transparent-cone.png", + "oracle_sha256": "5499a18296e821d032ca84d0f309a4cf75e7bcc5ce1dbc8a9d5ba6005131edc6", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-user-percent-fr", + "source": "svg-radial-start-user-percent-fr.svg", + "source_sha256": "9743b6956a95d6f6fd69ce8b9d5088a69f18b453e2c6af3a2cf5ad0b7a7d86b5", + "oracle": "chromium/svg-radial-start-user-percent-fr.png", + "oracle_sha256": "99b098487564030537529948bf95654428e511ec72e296a64f82eb39db92e5e9", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-percent-fx", + "source": "svg-radial-start-user-percent-fx.svg", + "source_sha256": "db38a2dcb28a5a65bcbd2130a4c633d0324b3af7bdde3a75002156c1b452d83f", + "oracle": "chromium/svg-radial-start-user-percent-fx.png", + "oracle_sha256": "99b098487564030537529948bf95654428e511ec72e296a64f82eb39db92e5e9", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-percent-fy", + "source": "svg-radial-start-user-percent-fy.svg", + "source_sha256": "d7a9c23470a71c991492acd7e6ceba640e10e8ec0659ae79f08ca20588554615", + "oracle": "chromium/svg-radial-start-user-percent-fy.png", + "oracle_sha256": "99b098487564030537529948bf95654428e511ec72e296a64f82eb39db92e5e9", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-px", + "source": "svg-radial-start-user-px.svg", + "source_sha256": "d92eb0081af402a8ed835520d36cb38df7daa822d5216b9f229c2926559087a2", + "oracle": "chromium/svg-radial-start-user-px.png", + "oracle_sha256": "99a82542cf90d191408c0f560a80e1bd71ae5df5fcbf4535919591c36de2683f", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-zero-stops-focal", + "source": "svg-radial-start-zero-stops-focal.svg", + "source_sha256": "53b3ed6cfed8f5e6a3246108e82f86bb0553bf5bb2451122f401997c4f2192a5", + "oracle": "chromium/svg-radial-start-zero-stops-focal.png", + "oracle_sha256": "6f4bc09437add7d83beb4429ffec5327b45c94ae909eab27f1225d6f82451d29", + "width": 64, + "height": 64 + }, { "id": "svg-rect-rounded", "source": "svg-rect-rounded.svg", diff --git a/fixtures/web-first/primitives.json b/fixtures/web-first/primitives.json index 3875cfd2..d89a20ef 100644 --- a/fixtures/web-first/primitives.json +++ b/fixtures/web-first/primitives.json @@ -41,6 +41,14 @@ "width": 64, "height": 64 }, + { + "id": "html-inline-svg-radial-start", + "source": "html-inline-svg-radial-start.html", + "entry": "html-inline-svg", + "oracle": "chromium/html-inline-svg-radial-start.png", + "width": 64, + "height": 64 + }, { "id": "html-inline-svg-vector-effect", "source": "html-inline-svg-vector-effect.html", @@ -7699,6 +7707,1054 @@ "width": 64, "height": 32 }, + { + "id": "svg-radial-start-box-percent", + "source": "svg-radial-start-box-percent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-box-percent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-channel-opacity", + "source": "svg-radial-start-client-channel-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-channel-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-clip", + "source": "svg-radial-start-client-clip.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-clip.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-dashes", + "source": "svg-radial-start-client-dashes.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-dashes.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-ellipse", + "source": "svg-radial-start-client-ellipse.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-ellipse.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-filter", + "source": "svg-radial-start-client-filter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-filter.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1465, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-client-group-opacity", + "source": "svg-radial-start-client-group-opacity.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-group-opacity.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-mask", + "source": "svg-radial-start-client-mask.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-mask.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 613, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-client-nested", + "source": "svg-radial-start-client-nested.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-nested.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-order", + "source": "svg-radial-start-client-order.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-order.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-path", + "source": "svg-radial-start-client-path.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-path.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-pattern", + "source": "svg-radial-start-client-pattern.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-pattern.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-stroke", + "source": "svg-radial-start-client-stroke.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-stroke.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-transform", + "source": "svg-radial-start-client-transform.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-transform.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-client-use", + "source": "svg-radial-start-client-use.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-client-use.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-default", + "source": "svg-radial-start-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-explicit-default", + "source": "svg-radial-start-explicit-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-explicit-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-decimal-higher", + "source": "svg-radial-start-fr-decimal-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-decimal-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-decimal-lower", + "source": "svg-radial-start-fr-decimal-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-decimal-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-equal-r", + "source": "svg-radial-start-fr-equal-r.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-equal-r.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-greater-r", + "source": "svg-radial-start-fr-greater-r.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-greater-r.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-midpoint-higher", + "source": "svg-radial-start-fr-midpoint-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-midpoint-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-midpoint-lower", + "source": "svg-radial-start-fr-midpoint-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-midpoint-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-negative", + "source": "svg-radial-start-fr-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-negative-zero", + "source": "svg-radial-start-fr-negative-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-negative-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-percentage-higher", + "source": "svg-radial-start-fr-percentage-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-percentage-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-percentage-lower", + "source": "svg-radial-start-fr-percentage-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-percentage-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fr-quarter", + "source": "svg-radial-start-fr-quarter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fr-quarter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-decimal-higher", + "source": "svg-radial-start-fx-decimal-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-decimal-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-decimal-lower", + "source": "svg-radial-start-fx-decimal-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-decimal-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-negative", + "source": "svg-radial-start-fx-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-on-end", + "source": "svg-radial-start-fx-on-end.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-on-end.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-fx-outside", + "source": "svg-radial-start-fx-outside.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-outside.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-percentage-higher", + "source": "svg-radial-start-fx-percentage-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-percentage-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-percentage-lower", + "source": "svg-radial-start-fx-percentage-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-percentage-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fx-quarter", + "source": "svg-radial-start-fx-quarter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fx-quarter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fxy-fr-quarter", + "source": "svg-radial-start-fxy-fr-quarter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fxy-fr-quarter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fxy-quarter", + "source": "svg-radial-start-fxy-quarter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fxy-quarter.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-fy-decimal-higher", + "source": "svg-radial-start-fy-decimal-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fy-decimal-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-decimal-lower", + "source": "svg-radial-start-fy-decimal-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fy-decimal-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-percentage-higher", + "source": "svg-radial-start-fy-percentage-higher.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fy-percentage-higher.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-percentage-lower", + "source": "svg-radial-start-fy-percentage-lower.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fy-percentage-lower.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-fy-quarter", + "source": "svg-radial-start-fy-quarter.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-fy-quarter.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-graduated-focal", + "source": "svg-radial-start-graduated-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-graduated-focal.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-comma", + "source": "svg-radial-start-grammar-fr-comma.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-comma.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-exponent", + "source": "svg-radial-start-grammar-fr-exponent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-exponent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-integer", + "source": "svg-radial-start-grammar-fr-integer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-integer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-nbsp", + "source": "svg-radial-start-grammar-fr-nbsp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-nbsp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-signed", + "source": "svg-radial-start-grammar-fr-signed.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-signed.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-trailingdot", + "source": "svg-radial-start-grammar-fr-trailingdot.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-trailingdot.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fr-whitespace", + "source": "svg-radial-start-grammar-fr-whitespace.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fr-whitespace.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-comma", + "source": "svg-radial-start-grammar-fx-comma.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-comma.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-exponent", + "source": "svg-radial-start-grammar-fx-exponent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-exponent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-integer", + "source": "svg-radial-start-grammar-fx-integer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-integer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-nbsp", + "source": "svg-radial-start-grammar-fx-nbsp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-nbsp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-signed", + "source": "svg-radial-start-grammar-fx-signed.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-signed.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-trailingdot", + "source": "svg-radial-start-grammar-fx-trailingdot.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-trailingdot.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fx-whitespace", + "source": "svg-radial-start-grammar-fx-whitespace.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fx-whitespace.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-comma", + "source": "svg-radial-start-grammar-fy-comma.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-comma.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-exponent", + "source": "svg-radial-start-grammar-fy-exponent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-exponent.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-grammar-fy-integer", + "source": "svg-radial-start-grammar-fy-integer.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-integer.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-nbsp", + "source": "svg-radial-start-grammar-fy-nbsp.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-nbsp.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-signed", + "source": "svg-radial-start-grammar-fy-signed.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-signed.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-grammar-fy-trailingdot", + "source": "svg-radial-start-grammar-fy-trailingdot.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-trailingdot.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-grammar-fy-whitespace", + "source": "svg-radial-start-grammar-fy-whitespace.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-grammar-fy-whitespace.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-mapped-viewbox", + "source": "svg-radial-start-mapped-viewbox.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-mapped-viewbox.png", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-on-end-reflect", + "source": "svg-radial-start-on-end-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-on-end-reflect.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-on-end-repeat", + "source": "svg-radial-start-on-end-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-on-end-repeat.png", + "width": 64, + "height": 64, + "tolerance": { + "kind": "ramp-quantization", + "max_differing_pixels": 1, + "max_channel_delta": 1 + } + }, + { + "id": "svg-radial-start-one-stop-default", + "source": "svg-radial-start-one-stop-default.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-one-stop-default.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-exterior-reflect", + "source": "svg-radial-start-one-stop-exterior-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-one-stop-exterior-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-exterior-repeat", + "source": "svg-radial-start-one-stop-exterior-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-one-stop-exterior-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-one-stop-focal", + "source": "svg-radial-start-one-stop-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-one-stop-focal.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-negative-focal", + "source": "svg-radial-start-outer-negative-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outer-negative-focal.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-focal", + "source": "svg-radial-start-outer-zero-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outer-zero-focal.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-fr", + "source": "svg-radial-start-outer-zero-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outer-zero-fr.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-fx", + "source": "svg-radial-start-outer-zero-fx.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outer-zero-fx.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outer-zero-one-stop-focal", + "source": "svg-radial-start-outer-zero-one-stop-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outer-zero-one-stop-focal.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-outside-positive-fr", + "source": "svg-radial-start-outside-positive-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-outside-positive-fr.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-above", + "source": "svg-radial-start-relation-above.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-above.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-below", + "source": "svg-radial-start-relation-below.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-below.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-containing", + "source": "svg-radial-start-relation-containing.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-containing.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-disjoint", + "source": "svg-radial-start-relation-disjoint.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-disjoint.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-external-tangent", + "source": "svg-radial-start-relation-external-tangent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-external-tangent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-internal-tangent", + "source": "svg-radial-start-relation-internal-tangent.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-internal-tangent.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-intersecting", + "source": "svg-radial-start-relation-intersecting.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-intersecting.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-left", + "source": "svg-radial-start-relation-left.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-left.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-relation-right", + "source": "svg-radial-start-relation-right.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-relation-right.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-same-circle-reflect", + "source": "svg-radial-start-same-circle-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-same-circle-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-same-circle-repeat", + "source": "svg-radial-start-same-circle-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-same-circle-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-circle-reflect", + "source": "svg-radial-start-spread-circle-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-circle-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-circle-repeat", + "source": "svg-radial-start-spread-circle-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-circle-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-outside-reflect", + "source": "svg-radial-start-spread-outside-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-outside-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-outside-repeat", + "source": "svg-radial-start-spread-outside-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-outside-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-reversed-reflect", + "source": "svg-radial-start-spread-reversed-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-reversed-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-reversed-repeat", + "source": "svg-radial-start-spread-reversed-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-reversed-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-zero-end-reflect", + "source": "svg-radial-start-spread-zero-end-reflect.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-zero-end-reflect.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-spread-zero-end-repeat", + "source": "svg-radial-start-spread-zero-end-repeat.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-spread-zero-end-repeat.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-alpha", + "source": "svg-radial-start-stops-alpha.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-stops-alpha.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-duplicate", + "source": "svg-radial-start-stops-duplicate.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-stops-duplicate.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-edges", + "source": "svg-radial-start-stops-edges.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-stops-edges.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-stops-unsorted", + "source": "svg-radial-start-stops-unsorted.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-stops-unsorted.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-all", + "source": "svg-radial-start-template-all.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-all.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fr", + "source": "svg-radial-start-template-empty-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-empty-fr.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fx", + "source": "svg-radial-start-template-empty-fx.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-empty-fx.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-empty-fy", + "source": "svg-radial-start-template-empty-fy.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-empty-fy.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-explicit-focus", + "source": "svg-radial-start-template-explicit-focus.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-explicit-focus.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-fr-negative", + "source": "svg-radial-start-template-fr-negative.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-fr-negative.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-fr-zero", + "source": "svg-radial-start-template-fr-zero.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-fr-zero.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-invalid-fr", + "source": "svg-radial-start-template-invalid-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-invalid-fr.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-local-center", + "source": "svg-radial-start-template-local-center.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-local-center.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-multihop", + "source": "svg-radial-start-template-multihop.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-multihop.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fr", + "source": "svg-radial-start-template-override-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-override-fr.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fx", + "source": "svg-radial-start-template-override-fx.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-override-fx.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-override-fy", + "source": "svg-radial-start-template-override-fy.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-override-fy.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-template-xlink", + "source": "svg-radial-start-template-xlink.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-template-xlink.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-rotate", + "source": "svg-radial-start-transform-rotate.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transform-rotate.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-scale", + "source": "svg-radial-start-transform-scale.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transform-scale.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-singular", + "source": "svg-radial-start-transform-singular.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transform-singular.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-skew", + "source": "svg-radial-start-transform-skew.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transform-skew.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transform-translate", + "source": "svg-radial-start-transform-translate.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transform-translate.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-transparent-cone", + "source": "svg-radial-start-transparent-cone.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-transparent-cone.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-user-percent-fr", + "source": "svg-radial-start-user-percent-fr.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-user-percent-fr.png", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-percent-fx", + "source": "svg-radial-start-user-percent-fx.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-user-percent-fx.png", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-percent-fy", + "source": "svg-radial-start-user-percent-fy.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-user-percent-fy.png", + "width": 64, + "height": 32 + }, + { + "id": "svg-radial-start-user-px", + "source": "svg-radial-start-user-px.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-user-px.png", + "width": 64, + "height": 64 + }, + { + "id": "svg-radial-start-zero-stops-focal", + "source": "svg-radial-start-zero-stops-focal.svg", + "entry": "standalone-svg", + "oracle": "chromium/svg-radial-start-zero-stops-focal.png", + "width": 64, + "height": 64 + }, { "id": "svg-rect-rounded", "source": "svg-rect-rounded.svg", diff --git a/fixtures/web-first/probe_harness.ts b/fixtures/web-first/probe_harness.ts index c897069e..889735ee 100644 --- a/fixtures/web-first/probe_harness.ts +++ b/fixtures/web-first/probe_harness.ts @@ -60,8 +60,10 @@ export function comparePngs(a: Buffer, b: Buffer): ProbeComparison { } export interface ProbeMatrix { - /** id → standalone SVG source. */ + /** id → source in the declared entry grammar. */ probes: Record; + /** Same ingress choice as the baker; standalone SVG remains the default. */ + entry?: "standalone-svg" | "html-inline-svg"; /** [left id, right id, what identity/difference would mean]. */ pairs: Array<[string, string, string]>; /** Where captures are written for eyeballing (scratch space). */ @@ -88,7 +90,7 @@ export async function runProbeMatrix(matrix: ProbeMatrix): Promise { for (const [id, svg] of Object.entries(matrix.probes)) { const page = await context.newPage(); const capture = { - media: "image/svg+xml" as const, + media: matrix.entry === "html-inline-svg" ? "text/html" as const : "image/svg+xml" as const, source: Buffer.from(svg), width, height, diff --git a/fixtures/web-first/svg-radial-start-box-percent.svg b/fixtures/web-first/svg-radial-start-box-percent.svg new file mode 100644 index 00000000..8273a849 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-box-percent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-channel-opacity.svg b/fixtures/web-first/svg-radial-start-client-channel-opacity.svg new file mode 100644 index 00000000..8ac9bdec --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-channel-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-clip.svg b/fixtures/web-first/svg-radial-start-client-clip.svg new file mode 100644 index 00000000..8741455c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-clip.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-dashes.svg b/fixtures/web-first/svg-radial-start-client-dashes.svg new file mode 100644 index 00000000..19f2535f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-dashes.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-ellipse.svg b/fixtures/web-first/svg-radial-start-client-ellipse.svg new file mode 100644 index 00000000..47106e63 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-ellipse.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-filter.svg b/fixtures/web-first/svg-radial-start-client-filter.svg new file mode 100644 index 00000000..2c28199c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-filter.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-group-opacity.svg b/fixtures/web-first/svg-radial-start-client-group-opacity.svg new file mode 100644 index 00000000..2fa97be4 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-group-opacity.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-mask.svg b/fixtures/web-first/svg-radial-start-client-mask.svg new file mode 100644 index 00000000..5b06c66e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-mask.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-nested.svg b/fixtures/web-first/svg-radial-start-client-nested.svg new file mode 100644 index 00000000..a629a6b9 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-nested.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-order.svg b/fixtures/web-first/svg-radial-start-client-order.svg new file mode 100644 index 00000000..7fc31dad --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-order.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-path.svg b/fixtures/web-first/svg-radial-start-client-path.svg new file mode 100644 index 00000000..99ce188e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-path.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-pattern.svg b/fixtures/web-first/svg-radial-start-client-pattern.svg new file mode 100644 index 00000000..05c1ae41 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-pattern.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-stroke.svg b/fixtures/web-first/svg-radial-start-client-stroke.svg new file mode 100644 index 00000000..d3775aad --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-stroke.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-transform.svg b/fixtures/web-first/svg-radial-start-client-transform.svg new file mode 100644 index 00000000..acb40063 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-transform.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-client-use.svg b/fixtures/web-first/svg-radial-start-client-use.svg new file mode 100644 index 00000000..fdfcc2a0 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-client-use.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-default.svg b/fixtures/web-first/svg-radial-start-default.svg new file mode 100644 index 00000000..7f5648f4 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-default.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-explicit-default.svg b/fixtures/web-first/svg-radial-start-explicit-default.svg new file mode 100644 index 00000000..f12c013a --- /dev/null +++ b/fixtures/web-first/svg-radial-start-explicit-default.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fr-decimal-higher.svg b/fixtures/web-first/svg-radial-start-fr-decimal-higher.svg new file mode 100644 index 00000000..2be2409e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-decimal-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-decimal-lower.svg b/fixtures/web-first/svg-radial-start-fr-decimal-lower.svg new file mode 100644 index 00000000..a2080186 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-decimal-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-equal-r.svg b/fixtures/web-first/svg-radial-start-fr-equal-r.svg new file mode 100644 index 00000000..a857344f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-equal-r.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fr-greater-r.svg b/fixtures/web-first/svg-radial-start-fr-greater-r.svg new file mode 100644 index 00000000..2036849f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-greater-r.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fr-midpoint-higher.svg b/fixtures/web-first/svg-radial-start-fr-midpoint-higher.svg new file mode 100644 index 00000000..8c5bc892 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-midpoint-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-midpoint-lower.svg b/fixtures/web-first/svg-radial-start-fr-midpoint-lower.svg new file mode 100644 index 00000000..93b95608 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-midpoint-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-negative-zero.svg b/fixtures/web-first/svg-radial-start-fr-negative-zero.svg new file mode 100644 index 00000000..2102e7c7 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-negative-zero.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fr-negative.svg b/fixtures/web-first/svg-radial-start-fr-negative.svg new file mode 100644 index 00000000..b54162eb --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-negative.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fr-percentage-higher.svg b/fixtures/web-first/svg-radial-start-fr-percentage-higher.svg new file mode 100644 index 00000000..5c3ee8ce --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-percentage-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-percentage-lower.svg b/fixtures/web-first/svg-radial-start-fr-percentage-lower.svg new file mode 100644 index 00000000..5f4547f9 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-percentage-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fr-quarter.svg b/fixtures/web-first/svg-radial-start-fr-quarter.svg new file mode 100644 index 00000000..7f6a1bf8 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fr-quarter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fx-decimal-higher.svg b/fixtures/web-first/svg-radial-start-fx-decimal-higher.svg new file mode 100644 index 00000000..1eb669bd --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-decimal-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fx-decimal-lower.svg b/fixtures/web-first/svg-radial-start-fx-decimal-lower.svg new file mode 100644 index 00000000..33f9dedd --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-decimal-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fx-negative.svg b/fixtures/web-first/svg-radial-start-fx-negative.svg new file mode 100644 index 00000000..8b171dd9 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-negative.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fx-on-end.svg b/fixtures/web-first/svg-radial-start-fx-on-end.svg new file mode 100644 index 00000000..dac4d4df --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-on-end.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fx-outside.svg b/fixtures/web-first/svg-radial-start-fx-outside.svg new file mode 100644 index 00000000..6b96e33f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-outside.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fx-percentage-higher.svg b/fixtures/web-first/svg-radial-start-fx-percentage-higher.svg new file mode 100644 index 00000000..50dea443 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-percentage-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fx-percentage-lower.svg b/fixtures/web-first/svg-radial-start-fx-percentage-lower.svg new file mode 100644 index 00000000..48cf4e91 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-percentage-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fx-quarter.svg b/fixtures/web-first/svg-radial-start-fx-quarter.svg new file mode 100644 index 00000000..0c363b70 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fx-quarter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fxy-fr-quarter.svg b/fixtures/web-first/svg-radial-start-fxy-fr-quarter.svg new file mode 100644 index 00000000..4ae6cf67 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fxy-fr-quarter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fxy-quarter.svg b/fixtures/web-first/svg-radial-start-fxy-quarter.svg new file mode 100644 index 00000000..0b7c4c1a --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fxy-quarter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-fy-decimal-higher.svg b/fixtures/web-first/svg-radial-start-fy-decimal-higher.svg new file mode 100644 index 00000000..4da91830 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fy-decimal-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fy-decimal-lower.svg b/fixtures/web-first/svg-radial-start-fy-decimal-lower.svg new file mode 100644 index 00000000..41dce44a --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fy-decimal-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fy-percentage-higher.svg b/fixtures/web-first/svg-radial-start-fy-percentage-higher.svg new file mode 100644 index 00000000..6b4291d0 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fy-percentage-higher.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fy-percentage-lower.svg b/fixtures/web-first/svg-radial-start-fy-percentage-lower.svg new file mode 100644 index 00000000..d31bc339 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fy-percentage-lower.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-fy-quarter.svg b/fixtures/web-first/svg-radial-start-fy-quarter.svg new file mode 100644 index 00000000..d65fc897 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-fy-quarter.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/unsupported/svg-gradient-focal.svg b/fixtures/web-first/svg-radial-start-graduated-focal.svg similarity index 100% rename from fixtures/web-first/unsupported/svg-gradient-focal.svg rename to fixtures/web-first/svg-radial-start-graduated-focal.svg diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-comma.svg b/fixtures/web-first/svg-radial-start-grammar-fr-comma.svg new file mode 100644 index 00000000..c9a49c6a --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-comma.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-exponent.svg b/fixtures/web-first/svg-radial-start-grammar-fr-exponent.svg new file mode 100644 index 00000000..cec265eb --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-exponent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-integer.svg b/fixtures/web-first/svg-radial-start-grammar-fr-integer.svg new file mode 100644 index 00000000..70df71a8 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-integer.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-nbsp.svg b/fixtures/web-first/svg-radial-start-grammar-fr-nbsp.svg new file mode 100644 index 00000000..b5761d98 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-nbsp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-signed.svg b/fixtures/web-first/svg-radial-start-grammar-fr-signed.svg new file mode 100644 index 00000000..8129f933 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-signed.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-trailingdot.svg b/fixtures/web-first/svg-radial-start-grammar-fr-trailingdot.svg new file mode 100644 index 00000000..4e738e37 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-trailingdot.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fr-whitespace.svg b/fixtures/web-first/svg-radial-start-grammar-fr-whitespace.svg new file mode 100644 index 00000000..e3926cfd --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fr-whitespace.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-comma.svg b/fixtures/web-first/svg-radial-start-grammar-fx-comma.svg new file mode 100644 index 00000000..a2b84168 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-comma.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-exponent.svg b/fixtures/web-first/svg-radial-start-grammar-fx-exponent.svg new file mode 100644 index 00000000..8cab680c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-exponent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-integer.svg b/fixtures/web-first/svg-radial-start-grammar-fx-integer.svg new file mode 100644 index 00000000..bfca28ce --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-integer.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-nbsp.svg b/fixtures/web-first/svg-radial-start-grammar-fx-nbsp.svg new file mode 100644 index 00000000..0cb1f98c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-nbsp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-signed.svg b/fixtures/web-first/svg-radial-start-grammar-fx-signed.svg new file mode 100644 index 00000000..6b3eb53e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-signed.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-trailingdot.svg b/fixtures/web-first/svg-radial-start-grammar-fx-trailingdot.svg new file mode 100644 index 00000000..20a46dfe --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-trailingdot.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fx-whitespace.svg b/fixtures/web-first/svg-radial-start-grammar-fx-whitespace.svg new file mode 100644 index 00000000..f8ad0651 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fx-whitespace.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-comma.svg b/fixtures/web-first/svg-radial-start-grammar-fy-comma.svg new file mode 100644 index 00000000..80f27600 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-comma.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-exponent.svg b/fixtures/web-first/svg-radial-start-grammar-fy-exponent.svg new file mode 100644 index 00000000..75416145 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-exponent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-integer.svg b/fixtures/web-first/svg-radial-start-grammar-fy-integer.svg new file mode 100644 index 00000000..35e99cdc --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-integer.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-nbsp.svg b/fixtures/web-first/svg-radial-start-grammar-fy-nbsp.svg new file mode 100644 index 00000000..19dda84f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-nbsp.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-signed.svg b/fixtures/web-first/svg-radial-start-grammar-fy-signed.svg new file mode 100644 index 00000000..49d6dc30 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-signed.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-trailingdot.svg b/fixtures/web-first/svg-radial-start-grammar-fy-trailingdot.svg new file mode 100644 index 00000000..5f484e24 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-trailingdot.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-grammar-fy-whitespace.svg b/fixtures/web-first/svg-radial-start-grammar-fy-whitespace.svg new file mode 100644 index 00000000..281da21d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-grammar-fy-whitespace.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-mapped-viewbox.svg b/fixtures/web-first/svg-radial-start-mapped-viewbox.svg new file mode 100644 index 00000000..524b0d97 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-mapped-viewbox.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-on-end-reflect.svg b/fixtures/web-first/svg-radial-start-on-end-reflect.svg new file mode 100644 index 00000000..9879d0cd --- /dev/null +++ b/fixtures/web-first/svg-radial-start-on-end-reflect.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-on-end-repeat.svg b/fixtures/web-first/svg-radial-start-on-end-repeat.svg new file mode 100644 index 00000000..f295bffb --- /dev/null +++ b/fixtures/web-first/svg-radial-start-on-end-repeat.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-one-stop-default.svg b/fixtures/web-first/svg-radial-start-one-stop-default.svg new file mode 100644 index 00000000..e26c3a5d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-one-stop-default.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-radial-start-one-stop-exterior-reflect.svg b/fixtures/web-first/svg-radial-start-one-stop-exterior-reflect.svg new file mode 100644 index 00000000..ba1a5434 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-one-stop-exterior-reflect.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-one-stop-exterior-repeat.svg b/fixtures/web-first/svg-radial-start-one-stop-exterior-repeat.svg new file mode 100644 index 00000000..a54d027f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-one-stop-exterior-repeat.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-one-stop-focal.svg b/fixtures/web-first/svg-radial-start-one-stop-focal.svg new file mode 100644 index 00000000..c60d76ae --- /dev/null +++ b/fixtures/web-first/svg-radial-start-one-stop-focal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-radial-start-outer-negative-focal.svg b/fixtures/web-first/svg-radial-start-outer-negative-focal.svg new file mode 100644 index 00000000..0bbce2bd --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outer-negative-focal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-outer-zero-focal.svg b/fixtures/web-first/svg-radial-start-outer-zero-focal.svg new file mode 100644 index 00000000..9a8cd523 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outer-zero-focal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-outer-zero-fr.svg b/fixtures/web-first/svg-radial-start-outer-zero-fr.svg new file mode 100644 index 00000000..c842ead7 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outer-zero-fr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-outer-zero-fx.svg b/fixtures/web-first/svg-radial-start-outer-zero-fx.svg new file mode 100644 index 00000000..82496eb3 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outer-zero-fx.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-outer-zero-one-stop-focal.svg b/fixtures/web-first/svg-radial-start-outer-zero-one-stop-focal.svg new file mode 100644 index 00000000..1dcf09ce --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outer-zero-one-stop-focal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/svg-radial-start-outside-positive-fr.svg b/fixtures/web-first/svg-radial-start-outside-positive-fr.svg new file mode 100644 index 00000000..0c96108d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-outside-positive-fr.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-relation-above.svg b/fixtures/web-first/svg-radial-start-relation-above.svg new file mode 100644 index 00000000..20ae2359 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-above.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-below.svg b/fixtures/web-first/svg-radial-start-relation-below.svg new file mode 100644 index 00000000..e3a75447 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-below.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-containing.svg b/fixtures/web-first/svg-radial-start-relation-containing.svg new file mode 100644 index 00000000..f8d181b6 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-containing.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-disjoint.svg b/fixtures/web-first/svg-radial-start-relation-disjoint.svg new file mode 100644 index 00000000..3412e133 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-disjoint.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-external-tangent.svg b/fixtures/web-first/svg-radial-start-relation-external-tangent.svg new file mode 100644 index 00000000..e113e11d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-external-tangent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-internal-tangent.svg b/fixtures/web-first/svg-radial-start-relation-internal-tangent.svg new file mode 100644 index 00000000..a326673a --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-internal-tangent.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-intersecting.svg b/fixtures/web-first/svg-radial-start-relation-intersecting.svg new file mode 100644 index 00000000..dc8012e3 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-intersecting.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-left.svg b/fixtures/web-first/svg-radial-start-relation-left.svg new file mode 100644 index 00000000..93bef6b5 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-left.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-relation-right.svg b/fixtures/web-first/svg-radial-start-relation-right.svg new file mode 100644 index 00000000..1af9abbe --- /dev/null +++ b/fixtures/web-first/svg-radial-start-relation-right.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-same-circle-reflect.svg b/fixtures/web-first/svg-radial-start-same-circle-reflect.svg new file mode 100644 index 00000000..253b50c3 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-same-circle-reflect.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-same-circle-repeat.svg b/fixtures/web-first/svg-radial-start-same-circle-repeat.svg new file mode 100644 index 00000000..9f503468 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-same-circle-repeat.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/fixtures/web-first/svg-radial-start-spread-circle-reflect.svg b/fixtures/web-first/svg-radial-start-spread-circle-reflect.svg new file mode 100644 index 00000000..edd6ff1b --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-circle-reflect.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-circle-repeat.svg b/fixtures/web-first/svg-radial-start-spread-circle-repeat.svg new file mode 100644 index 00000000..b4f8c5d8 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-circle-repeat.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-outside-reflect.svg b/fixtures/web-first/svg-radial-start-spread-outside-reflect.svg new file mode 100644 index 00000000..36f451ca --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-outside-reflect.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-outside-repeat.svg b/fixtures/web-first/svg-radial-start-spread-outside-repeat.svg new file mode 100644 index 00000000..90d53121 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-outside-repeat.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-reversed-reflect.svg b/fixtures/web-first/svg-radial-start-spread-reversed-reflect.svg new file mode 100644 index 00000000..0e2b518d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-reversed-reflect.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-reversed-repeat.svg b/fixtures/web-first/svg-radial-start-spread-reversed-repeat.svg new file mode 100644 index 00000000..906d3b9d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-reversed-repeat.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-zero-end-reflect.svg b/fixtures/web-first/svg-radial-start-spread-zero-end-reflect.svg new file mode 100644 index 00000000..6d76566c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-zero-end-reflect.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-spread-zero-end-repeat.svg b/fixtures/web-first/svg-radial-start-spread-zero-end-repeat.svg new file mode 100644 index 00000000..cd1d7fc0 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-spread-zero-end-repeat.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-stops-alpha.svg b/fixtures/web-first/svg-radial-start-stops-alpha.svg new file mode 100644 index 00000000..e4440d8d --- /dev/null +++ b/fixtures/web-first/svg-radial-start-stops-alpha.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-stops-duplicate.svg b/fixtures/web-first/svg-radial-start-stops-duplicate.svg new file mode 100644 index 00000000..d864839e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-stops-duplicate.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-stops-edges.svg b/fixtures/web-first/svg-radial-start-stops-edges.svg new file mode 100644 index 00000000..310e7442 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-stops-edges.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-stops-unsorted.svg b/fixtures/web-first/svg-radial-start-stops-unsorted.svg new file mode 100644 index 00000000..d97a1aa5 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-stops-unsorted.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-all.svg b/fixtures/web-first/svg-radial-start-template-all.svg new file mode 100644 index 00000000..0437bfbf --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-all.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-empty-fr.svg b/fixtures/web-first/svg-radial-start-template-empty-fr.svg new file mode 100644 index 00000000..5a686dca --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-empty-fr.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-empty-fx.svg b/fixtures/web-first/svg-radial-start-template-empty-fx.svg new file mode 100644 index 00000000..4d5c15f5 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-empty-fx.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-empty-fy.svg b/fixtures/web-first/svg-radial-start-template-empty-fy.svg new file mode 100644 index 00000000..7be2cf14 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-empty-fy.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-explicit-focus.svg b/fixtures/web-first/svg-radial-start-template-explicit-focus.svg new file mode 100644 index 00000000..159ec64f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-explicit-focus.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-fr-negative.svg b/fixtures/web-first/svg-radial-start-template-fr-negative.svg new file mode 100644 index 00000000..f1ab92e1 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-fr-negative.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-fr-zero.svg b/fixtures/web-first/svg-radial-start-template-fr-zero.svg new file mode 100644 index 00000000..529ad7e4 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-fr-zero.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-invalid-fr.svg b/fixtures/web-first/svg-radial-start-template-invalid-fr.svg new file mode 100644 index 00000000..ff1661a0 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-invalid-fr.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-local-center.svg b/fixtures/web-first/svg-radial-start-template-local-center.svg new file mode 100644 index 00000000..fa4f01b5 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-local-center.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-multihop.svg b/fixtures/web-first/svg-radial-start-template-multihop.svg new file mode 100644 index 00000000..b764f334 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-multihop.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-override-fr.svg b/fixtures/web-first/svg-radial-start-template-override-fr.svg new file mode 100644 index 00000000..11c56655 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-override-fr.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-override-fx.svg b/fixtures/web-first/svg-radial-start-template-override-fx.svg new file mode 100644 index 00000000..a8414c02 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-override-fx.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-override-fy.svg b/fixtures/web-first/svg-radial-start-template-override-fy.svg new file mode 100644 index 00000000..e3c4bbb4 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-override-fy.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-template-xlink.svg b/fixtures/web-first/svg-radial-start-template-xlink.svg new file mode 100644 index 00000000..d087813e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-template-xlink.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transform-rotate.svg b/fixtures/web-first/svg-radial-start-transform-rotate.svg new file mode 100644 index 00000000..6c29ea12 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transform-rotate.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transform-scale.svg b/fixtures/web-first/svg-radial-start-transform-scale.svg new file mode 100644 index 00000000..ae5e436e --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transform-scale.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transform-singular.svg b/fixtures/web-first/svg-radial-start-transform-singular.svg new file mode 100644 index 00000000..7c49fd5f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transform-singular.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transform-skew.svg b/fixtures/web-first/svg-radial-start-transform-skew.svg new file mode 100644 index 00000000..33625b9f --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transform-skew.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transform-translate.svg b/fixtures/web-first/svg-radial-start-transform-translate.svg new file mode 100644 index 00000000..66e33413 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transform-translate.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-transparent-cone.svg b/fixtures/web-first/svg-radial-start-transparent-cone.svg new file mode 100644 index 00000000..e7e51af2 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-transparent-cone.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-user-percent-fr.svg b/fixtures/web-first/svg-radial-start-user-percent-fr.svg new file mode 100644 index 00000000..b76101c0 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-user-percent-fr.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-user-percent-fx.svg b/fixtures/web-first/svg-radial-start-user-percent-fx.svg new file mode 100644 index 00000000..b2c5cce8 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-user-percent-fx.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-user-percent-fy.svg b/fixtures/web-first/svg-radial-start-user-percent-fy.svg new file mode 100644 index 00000000..2f5f0f3c --- /dev/null +++ b/fixtures/web-first/svg-radial-start-user-percent-fy.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-user-px.svg b/fixtures/web-first/svg-radial-start-user-px.svg new file mode 100644 index 00000000..42256c25 --- /dev/null +++ b/fixtures/web-first/svg-radial-start-user-px.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/svg-radial-start-zero-stops-focal.svg b/fixtures/web-first/svg-radial-start-zero-stops-focal.svg new file mode 100644 index 00000000..f5e60ade --- /dev/null +++ b/fixtures/web-first/svg-radial-start-zero-stops-focal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/fixtures/web-first/unsupported/README.md b/fixtures/web-first/unsupported/README.md index a5f21e9e..220ac448 100644 --- a/fixtures/web-first/unsupported/README.md +++ b/fixtures/web-first/unsupported/README.md @@ -99,7 +99,10 @@ The scannable, generated view of this register (beside the baked cells) is | `svg-pattern-source-unsupported.svg` | Any unsupported child invalidates pattern-source compilation transactionally. The witness places a valid rectangle before an unsupported image; best effort skips the whole affected client, so a plausible partial tile can never escape. | | `svg-pattern-source-viewport.svg` | A nested `` in a pattern source retains the pattern element's own source-program boundary. A simple visible-overflow viewport was byte-exact to its flattened control in Chromium and both admissions, but that single probe does not admit viewport clipping, effects, nesting, or the picture-shader precision envelope for pattern sources (measured, not celled). | | `svg-pattern-transform-none-provenance.svg` | Refuse the narrow derived-template case where an author stylesheet may contribute `transform:none`. The computed empty transform loses whether the sheet supplied `none` or no declaration; inheriting the template's `patternTransform` would resurrect a transform Chromium suppresses. Inline declarations remain attributable and admitted. | -| `svg-gradient-focal.svg` | A focal radial (`fx`/`fy` off the center, `fr > 0` alike) refuses by name: the shared radial paint leaf is concentric, and Chromium's focal cone — unclamped, leaving pixels unpainted (measured) — is inexpressible in it until its owner amendment. | +| `svg-radial-start-{fx,fy,fr}-decimal-precision.svg` · `svg-radial-start-{fx,fy,fr}-percentage-precision.svg` · `svg-radial-start-{fx,fy,fr}-midpoint-precision.svg` | Nine exact-attribute provenance refusals. Amplified Chromium pairs make all nine valid source aliases equal the lower adjacent binary32 control and visibly different from the higher; the raw lexical route cannot recover that choice. Decimal/percentage controls and the radius midpoint pair are baked in the primitive suite; focus midpoint probes are measured, not celled. No private matcher or replacement CSS parser is introduced. | +| `svg-radial-start-{fx,fy,fr}-css-comments.svg` | Three exact-attribute refusals for CSS comment tokenization. Chromium honors a valid length surrounded by comments; silently defaulting it would move the focal cone (measured, not celled). This honored grammar member has no own checklist row and keeps these attribute rows open. | +| `svg-radial-start-{fx,fy,fr}-used-range.svg` | Three exact-attribute refusals for a resolved length outside the admitted finite Web range. The overflow sources are measured against missing values and are not harmless defaults (measured, not celled). | +| `svg-radial-start-{fx,fy,fr}-units.svg` · `svg-radial-start-{fx,fy,fr}-math.svg` · `svg-radial-start-{fx,fy,fr}-var.svg` · `svg-radial-start-{fx,fy,fr}-css-wide.svg` | Twelve named wider-value/context refusals. Unit bases, computed math, substitution, and CSS-wide resource-side resolution remain separate feature families; each source is attributed in strict and best-effort paths. Their own checklist rows carry these gaps, but do not excuse the precision/comment gaps above. Chromium counterparts were measured, not celled. | | `svg-gradient-linearrgb.svg` | `color-interpolation="linearRGB"` is honored by Chromium (measured: the linear-light midpoint, not the sRGB one) and refuses by name — one backend ramp cannot interpolate in a second space. | | `svg-gradient-stop-css.svg` | A stylesheet declaring `stop-color` is a document-level declaration: the pinned cascade has no such longhand (Gecko-only at the Stylo pin), so the sheet is named and the gradient renders with its attribute colors — a declared divergence, since Chromium honors the sheet. | | `svg-gradient-stop-style-attr.svg` | `stop-color` in a stop's own style attribute wins in Chromium (measured); the cascade cannot represent it, so the referencing paint refuses by name. | diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-css-comments.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-css-comments.svg new file mode 100644 index 00000000..3ae179d1 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-css-comments.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-css-wide.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-css-wide.svg new file mode 100644 index 00000000..d3ad6ace --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-css-wide.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-decimal-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-decimal-precision.svg new file mode 100644 index 00000000..db9a67ff --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-decimal-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-math.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-math.svg new file mode 100644 index 00000000..e14eb391 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-math.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-midpoint-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-midpoint-precision.svg new file mode 100644 index 00000000..6dfdad58 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-midpoint-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-percentage-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-percentage-precision.svg new file mode 100644 index 00000000..24a047e1 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-percentage-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-units.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-units.svg new file mode 100644 index 00000000..aa2fd59e --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-units.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-used-range.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-used-range.svg new file mode 100644 index 00000000..40122547 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-used-range.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fr-var.svg b/fixtures/web-first/unsupported/svg-radial-start-fr-var.svg new file mode 100644 index 00000000..6a1858fc --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fr-var.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-css-comments.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-css-comments.svg new file mode 100644 index 00000000..11c07682 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-css-comments.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-css-wide.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-css-wide.svg new file mode 100644 index 00000000..c54785bd --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-css-wide.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-decimal-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-decimal-precision.svg new file mode 100644 index 00000000..8f7196c0 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-decimal-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-math.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-math.svg new file mode 100644 index 00000000..b92c59e1 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-math.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-midpoint-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-midpoint-precision.svg new file mode 100644 index 00000000..e78a1240 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-midpoint-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-percentage-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-percentage-precision.svg new file mode 100644 index 00000000..e595ee80 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-percentage-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-units.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-units.svg new file mode 100644 index 00000000..f824bb27 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-units.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-used-range.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-used-range.svg new file mode 100644 index 00000000..73384a2d --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-used-range.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fx-var.svg b/fixtures/web-first/unsupported/svg-radial-start-fx-var.svg new file mode 100644 index 00000000..b26aef85 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fx-var.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-css-comments.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-css-comments.svg new file mode 100644 index 00000000..c9d39c27 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-css-comments.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-css-wide.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-css-wide.svg new file mode 100644 index 00000000..40f5a809 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-css-wide.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-decimal-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-decimal-precision.svg new file mode 100644 index 00000000..42e9b2b0 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-decimal-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-math.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-math.svg new file mode 100644 index 00000000..86c2adf5 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-math.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-midpoint-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-midpoint-precision.svg new file mode 100644 index 00000000..5c41edd6 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-midpoint-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-percentage-precision.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-percentage-precision.svg new file mode 100644 index 00000000..c273b964 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-percentage-precision.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-units.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-units.svg new file mode 100644 index 00000000..04ef8391 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-units.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-used-range.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-used-range.svg new file mode 100644 index 00000000..38ac1ce5 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-used-range.svg @@ -0,0 +1 @@ + diff --git a/fixtures/web-first/unsupported/svg-radial-start-fy-var.svg b/fixtures/web-first/unsupported/svg-radial-start-fy-var.svg new file mode 100644 index 00000000..9e7ed987 --- /dev/null +++ b/fixtures/web-first/unsupported/svg-radial-start-fy-var.svg @@ -0,0 +1 @@ +