diff --git a/src/external-patches/firefox/corner_shape_support/D296935.patch b/src/external-patches/firefox/corner_shape_support/D296935.patch deleted file mode 100644 index df1f71702..000000000 --- a/src/external-patches/firefox/corner_shape_support/D296935.patch +++ /dev/null @@ -1,4114 +0,0 @@ -diff --git a/devtools/server/actors/animation-type-longhand.js b/devtools/server/actors/animation-type-longhand.js ---- a/devtools/server/actors/animation-type-longhand.js -+++ b/devtools/server/actors/animation-type-longhand.js -@@ -320,10 +320,18 @@ - "border-top-width", - "clip", - "clip-path", - "column-count", - "column-rule-width", -+ "corner-bottom-left-shape", -+ "corner-bottom-right-shape", -+ "corner-end-end-shape", -+ "corner-end-start-shape", -+ "corner-start-end-shape", -+ "corner-start-start-shape", -+ "corner-top-left-shape", -+ "corner-top-right-shape", - "d", - "filter", - "font-stretch", - "font-variation-settings", - "font-weight", -diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml ---- a/dom/base/use_counter_metrics.yaml -+++ b/dom/base/use_counter_metrics.yaml -@@ -21458,10 +21458,146 @@ - - emilio@mozilla.com - expires: never - send_in_pings: - - use-counters - -+ css_corner_bottom_left_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-bottom-left-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_bottom_right_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-bottom-right-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_end_end_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-end-end-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_end_start_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-end-start-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_start_end_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-start-end-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_start_start_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-start-start-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_left_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-top-left-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_right_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-top-right-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ - css_border_block_end_style: - type: counter - description: > - Whether a page used the CSS property border-block-end-style. - Compare against `use.counter.top_level_content_documents_destroyed` -@@ -27289,10 +27425,163 @@ - - emilio@mozilla.com - expires: never - send_in_pings: - - use-counters - -+ css_corner_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-top-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_right_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-right-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_bottom_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-bottom-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_left_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-left-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_block_start_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-block-start-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_block_end_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-block-end-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_inline_start_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-inline-start-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_inline_end_shape: -+ type: counter -+ description: > -+ Whether a page used the CSS property corner-inline-end-shape. -+ Compare against `use.counter.top_level_content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ - css_outline: - type: counter - description: > - Whether a page used the CSS property outline. - Compare against `use.counter.top_level_content_documents_destroyed` -@@ -31063,11 +31352,11 @@ - - emilio@mozilla.com - expires: never - send_in_pings: - - use-counters - --# Total of 711 'CSS (document)' use counters. -+# Total of 728 'CSS (document)' use counters. - use.counter.css.doc: - css_align_items: - type: counter - description: > - Whether a document used the CSS property align-items. -@@ -33547,10 +33836,146 @@ - - emilio@mozilla.com - expires: never - send_in_pings: - - use-counters - -+ css_corner_bottom_left_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-bottom-left-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_bottom_right_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-bottom-right-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_end_end_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-end-end-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_end_start_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-end-start-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_start_end_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-start-end-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_start_start_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-start-start-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_left_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-top-left-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_right_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-top-right-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ - css_border_block_end_style: - type: counter - description: > - Whether a document used the CSS property border-block-end-style. - Compare against `use.counter.content_documents_destroyed` -@@ -39378,10 +39803,163 @@ - - emilio@mozilla.com - expires: never - send_in_pings: - - use-counters - -+ css_corner_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_top_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-top-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_right_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-right-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_bottom_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-bottom-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_left_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-left-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_block_start_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-block-start-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_block_end_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-block-end-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_inline_start_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-inline-start-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ -+ css_corner_inline_end_shape: -+ type: counter -+ description: > -+ Whether a document used the CSS property corner-inline-end-shape. -+ Compare against `use.counter.content_documents_destroyed` -+ to calculate the rate. -+ bugs: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ data_reviews: -+ - https://bugzilla.mozilla.org/show_bug.cgi?id=1852098 -+ notification_emails: -+ - dom-core@mozilla.com -+ - emilio@mozilla.com -+ expires: never -+ send_in_pings: -+ - use-counters -+ - css_outline: - type: counter - description: > - Whether a document used the CSS property outline. - Compare against `use.counter.content_documents_destroyed` -diff --git a/layout/style/ServoBindings.toml b/layout/style/ServoBindings.toml ---- a/layout/style/ServoBindings.toml -+++ b/layout/style/ServoBindings.toml -@@ -493,10 +493,12 @@ - { gecko = "StyleGenericZIndex", servo = "crate::values::generics::position::ZIndex" }, - { gecko = "StyleTransformBox", servo = "crate::values::computed::TransformBox" }, - { gecko = "StyleTransformOrigin", servo = "crate::values::computed::TransformOrigin" }, - { gecko = "StyleTransformStyle", servo = "crate::values::computed::TransformStyle" }, - { gecko = "StyleGenericBorderRadius", servo = "crate::values::generics::border::BorderRadius" }, -+ { gecko = "StyleGenericCornerShapeRect", servo = "crate::values::generics::border::CornerShapeRect" }, -+ { gecko = "StyleCornerShape", servo = "crate::values::computed::CornerShape" }, - { gecko = "StyleLetterSpacing", servo = "crate::values::computed::text::LetterSpacing" }, - { gecko = "StyleGenericLineHeight", servo = "crate::values::generics::font::LineHeight" }, - { gecko = "StyleCaretColor", servo = "crate::values::computed::color::CaretColor" }, - { gecko = "StyleContain", servo = "crate::values::computed::Contain" }, - { gecko = "StyleContainerType", servo = "crate::values::computed::ContainerType" }, -diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h ---- a/layout/style/nsStyleStruct.h -+++ b/layout/style/nsStyleStruct.h -@@ -627,10 +627,11 @@ - return mBorderImageSource.GetImageRequest(); - } - - public: - mozilla::StyleBorderRadius mBorderRadius; // coord, percent -+ mozilla::StyleCornerShapeRect mCornerShape; - mozilla::StyleImage mBorderImageSource; - mozilla::StyleBorderImageWidth mBorderImageWidth; - mozilla::StyleNonNegativeLengthOrNumberRect mBorderImageOutset; - mozilla::StyleBorderImageSlice mBorderImageSlice; // factor, percent - mozilla::StyleBorderImageRepeat mBorderImageRepeat; -diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp ---- a/layout/style/nsStyleStruct.cpp -+++ b/layout/style/nsStyleStruct.cpp -@@ -469,12 +469,19 @@ - static inline BorderRadius ZeroBorderRadius() { - auto zero = LengthPercentage::Zero(); - return {{{zero, zero}}, {{zero, zero}}, {{zero, zero}}, {{zero, zero}}}; - } - -+static inline mozilla::StyleCornerShapeRect RoundCornerShapeRect() { -+ // Initial value of `corner-shape` is `round`, i.e. `superellipse(1)`. -+ mozilla::StyleCornerShape round{1.0f}; -+ return {round, round, round, round}; -+} -+ - nsStyleBorder::nsStyleBorder() - : mBorderRadius(ZeroBorderRadius()), -+ mCornerShape(RoundCornerShapeRect()), - mBorderImageSource(StyleImage::None()), - mBorderImageWidth( - StyleRectWithAllSides(StyleBorderImageSideWidth::Number(1.))), - mBorderImageOutset( - StyleRectWithAllSides(StyleNonNegativeLengthOrNumber::Number(0.))), -@@ -494,10 +501,11 @@ - MOZ_COUNT_CTOR(nsStyleBorder); - } - - nsStyleBorder::nsStyleBorder(const nsStyleBorder& aSrc) - : mBorderRadius(aSrc.mBorderRadius), -+ mCornerShape(aSrc.mCornerShape), - mBorderImageSource(aSrc.mBorderImageSource), - mBorderImageWidth(aSrc.mBorderImageWidth), - mBorderImageOutset(aSrc.mBorderImageOutset), - mBorderImageSlice(aSrc.mBorderImageSlice), - mBorderImageRepeat(aSrc.mBorderImageRepeat), -@@ -568,10 +576,14 @@ - // optimizations here should apply to both. - if (mBorderRadius != aNewData.mBorderRadius) { - return nsChangeHint_RepaintFrame; - } - -+ if (mCornerShape != aNewData.mCornerShape) { -+ return nsChangeHint_RepaintFrame; -+ } -+ - // Loading status of the border image can be accessed in main thread only - // while CalcDifference might be executed on a background thread. As a - // result, we have to check mBorderImage* fields even before border image was - // actually loaded. - if (!mBorderImageSource.IsNone() || !aNewData.mBorderImageSource.IsNone()) { -diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js ---- a/layout/style/test/property_database.js -+++ b/layout/style/test/property_database.js -@@ -14722,10 +14722,140 @@ - ], - }, - }); - } - -+if (IsCSSPropertyPrefEnabled("layout.css.corner-shape.enabled")) { -+ const cornerShapeLonghand = { -+ inherited: false, -+ type: CSS_TYPE_LONGHAND, -+ initial_values: ["round"], -+ other_values: [ -+ "scoop", -+ "bevel", -+ "notch", -+ "square", -+ "squircle", -+ "superellipse(0)", -+ "superellipse(1)", -+ "superellipse(2)", -+ "superellipse(-1)", -+ "superellipse(0.5)", -+ "superellipse(infinity)", -+ "superellipse(-infinity)", -+ ], -+ invalid_values: [ -+ "none", -+ "auto", -+ "1", -+ "2px", -+ "superellipse()", -+ "superellipse(round)", -+ "superellipse(1, 2)", -+ "superellipse 1", -+ "round scoop", -+ ], -+ }; -+ Object.assign(gCSSProperties, { -+ "corner-shape": { -+ domProp: "cornerShape", -+ subproperties: [ -+ "corner-top-left-shape", -+ "corner-top-right-shape", -+ "corner-bottom-right-shape", -+ "corner-bottom-left-shape", -+ ], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-top-left-shape": { -+ domProp: "cornerTopLeftShape", -+ ...cornerShapeLonghand, -+ }, -+ "corner-top-right-shape": { -+ domProp: "cornerTopRightShape", -+ ...cornerShapeLonghand, -+ }, -+ "corner-bottom-right-shape": { -+ domProp: "cornerBottomRightShape", -+ ...cornerShapeLonghand, -+ }, -+ "corner-bottom-left-shape": { -+ domProp: "cornerBottomLeftShape", -+ ...cornerShapeLonghand, -+ }, -+ "corner-start-start-shape": { -+ domProp: "cornerStartStartShape", -+ logical: true, -+ ...cornerShapeLonghand, -+ }, -+ "corner-start-end-shape": { -+ domProp: "cornerStartEndShape", -+ logical: true, -+ ...cornerShapeLonghand, -+ }, -+ "corner-end-start-shape": { -+ domProp: "cornerEndStartShape", -+ logical: true, -+ ...cornerShapeLonghand, -+ }, -+ "corner-end-end-shape": { -+ domProp: "cornerEndEndShape", -+ logical: true, -+ ...cornerShapeLonghand, -+ }, -+ "corner-top-shape": { -+ domProp: "cornerTopShape", -+ subproperties: ["corner-top-left-shape", "corner-top-right-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-right-shape": { -+ domProp: "cornerRightShape", -+ subproperties: ["corner-top-right-shape", "corner-bottom-right-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-bottom-shape": { -+ domProp: "cornerBottomShape", -+ subproperties: ["corner-bottom-left-shape", "corner-bottom-right-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-left-shape": { -+ domProp: "cornerLeftShape", -+ subproperties: ["corner-top-left-shape", "corner-bottom-left-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-block-start-shape": { -+ domProp: "cornerBlockStartShape", -+ subproperties: ["corner-start-start-shape", "corner-start-end-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-block-end-shape": { -+ domProp: "cornerBlockEndShape", -+ subproperties: ["corner-end-start-shape", "corner-end-end-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-inline-start-shape": { -+ domProp: "cornerInlineStartShape", -+ subproperties: ["corner-start-start-shape", "corner-end-start-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ "corner-inline-end-shape": { -+ domProp: "cornerInlineEndShape", -+ subproperties: ["corner-start-end-shape", "corner-end-end-shape"], -+ ...cornerShapeLonghand, -+ type: CSS_TYPE_TRUE_SHORTHAND, -+ }, -+ }); -+} -+ - // Copy aliased properties' fields from their alias targets. Keep this logic - // at the bottom of this file to ensure all the aliased properties are - // processed. - for (var prop in gCSSProperties) { - var entry = gCSSProperties[prop]; -diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml ---- a/modules/libpref/init/StaticPrefList.yaml -+++ b/modules/libpref/init/StaticPrefList.yaml -@@ -10594,10 +10594,17 @@ - type: RelaxedAtomicBool - value: true - mirror: always - rust: true - -+# Is support for CSS Borders 4 corner-shape enabled? -+- name: layout.css.corner-shape.enabled -+ type: RelaxedAtomicBool -+ value: false -+ mirror: always -+ rust: true -+ - # Is multiple color items upported for color-mix()? - - name: layout.css.color-mix-multi-color.enabled - type: RelaxedAtomicBool - value: true - mirror: always -diff --git a/servo/components/style/properties/longhands.toml b/servo/components/style/properties/longhands.toml ---- a/servo/components/style/properties/longhands.toml -+++ b/servo/components/style/properties/longhands.toml -@@ -3143,10 +3143,102 @@ - boxed = true - logical_group = "border-radius" - logical = true - affects = "paint" - -+[corner-top-left-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-left-shape" -+gecko_ffi_name = "mCornerShape.top_left" -+logical_group = "corner-shape" -+affects = "paint" -+ -+[corner-top-right-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-right-shape" -+gecko_ffi_name = "mCornerShape.top_right" -+logical_group = "corner-shape" -+affects = "paint" -+ -+[corner-bottom-right-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-right-shape" -+gecko_ffi_name = "mCornerShape.bottom_right" -+logical_group = "corner-shape" -+affects = "paint" -+ -+[corner-bottom-left-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-left-shape" -+gecko_ffi_name = "mCornerShape.bottom_left" -+logical_group = "corner-shape" -+affects = "paint" -+ -+[corner-start-start-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-start-start-shape" -+gecko_ffi_name = "mCornerShape.start_start" -+logical_group = "corner-shape" -+logical = true -+affects = "paint" -+ -+[corner-start-end-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-start-end-shape" -+gecko_ffi_name = "mCornerShape.start_end" -+logical_group = "corner-shape" -+logical = true -+affects = "paint" -+ -+[corner-end-start-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-end-start-shape" -+gecko_ffi_name = "mCornerShape.end_start" -+logical_group = "corner-shape" -+logical = true -+affects = "paint" -+ -+[corner-end-end-shape] -+type = "CornerShape" -+initial = "computed::CornerShape::round()" -+initial_specified_value = "specified::CornerShape::round()" -+struct = "border" -+gecko_pref = "layout.css.corner-shape.enabled" -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-end-end-shape" -+gecko_ffi_name = "mCornerShape.end_end" -+logical_group = "corner-shape" -+logical = true -+affects = "paint" -+ - [margin-top] - type = "Margin" - initial = "computed::Margin::zero()" - struct = "margin" - allow_quirks = true -diff --git a/servo/components/style/properties/shorthands.rs b/servo/components/style/properties/shorthands.rs ---- a/servo/components/style/properties/shorthands.rs -+++ b/servo/components/style/properties/shorthands.rs -@@ -229,10 +229,48 @@ - BorderRadius::serialize_rects(widths, heights, dest) - } - } - } - -+pub mod corner_shape { -+ pub use crate::properties::generated::shorthands::corner_shape::*; -+ -+ use super::*; -+ use crate::values::generics::rect::Rect; -+ use crate::values::specified::CornerShape; -+ -+ /// Parses 1-4 `` tokens with the standard CSS 4-side -+ /// shorthand expansion (top, right, bottom, left). -+ pub fn parse_value<'i, 't>( -+ context: &ParserContext, -+ input: &mut Parser<'i, 't>, -+ ) -> Result> { -+ let rect = Rect::parse_with(context, input, CornerShape::parse)?; -+ Ok(expanded! { -+ corner_top_left_shape: rect.0, -+ corner_top_right_shape: rect.1, -+ corner_bottom_right_shape: rect.2, -+ corner_bottom_left_shape: rect.3, -+ }) -+ } -+ -+ impl<'a> ToCss for LonghandsToSerialize<'a> { -+ fn to_css(&self, dest: &mut CssWriter) -> fmt::Result -+ where -+ W: fmt::Write, -+ { -+ Rect::new( -+ self.corner_top_left_shape, -+ self.corner_top_right_shape, -+ self.corner_bottom_right_shape, -+ self.corner_bottom_left_shape, -+ ) -+ .to_css(dest) -+ } -+ } -+} -+ - pub mod border_image { - pub use crate::properties::generated::shorthands::border_image::*; - - use super::*; - use crate::properties::longhands::{ -diff --git a/servo/components/style/properties/shorthands.toml b/servo/components/style/properties/shorthands.toml ---- a/servo/components/style/properties/shorthands.toml -+++ b/servo/components/style/properties/shorthands.toml -@@ -406,10 +406,63 @@ - [border-radius] - sub_properties = ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"] - spec = "https://drafts.csswg.org/css-backgrounds/#border-radius" - extra_prefixes = ["webkit"] - -+[corner-shape] -+sub_properties = ["corner-top-left-shape", "corner-top-right-shape", "corner-bottom-right-shape", "corner-bottom-left-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+ -+[corner-top-shape] -+sub_properties = ["corner-top-left-shape", "corner-top-right-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-top-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-right-shape] -+sub_properties = ["corner-top-right-shape", "corner-bottom-right-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-right-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-bottom-shape] -+sub_properties = ["corner-bottom-left-shape", "corner-bottom-right-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-bottom-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-left-shape] -+sub_properties = ["corner-top-left-shape", "corner-bottom-left-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-left-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-block-start-shape] -+sub_properties = ["corner-start-start-shape", "corner-start-end-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-block-start-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-block-end-shape] -+sub_properties = ["corner-end-start-shape", "corner-end-end-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-block-end-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-inline-start-shape] -+sub_properties = ["corner-start-start-shape", "corner-end-start-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-inline-start-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ -+[corner-inline-end-shape] -+sub_properties = ["corner-start-end-shape", "corner-end-end-shape"] -+spec = "https://drafts.csswg.org/css-borders-4/#propdef-corner-inline-end-shape" -+gecko_pref = "layout.css.corner-shape.enabled" -+kind = "two_properties" -+ - [outline] - sub_properties = ["outline-color", "outline-style", "outline-width"] - spec = "https://drafts.csswg.org/css-ui/#propdef-outline" - - [columns] -diff --git a/servo/components/style/values/computed/corner_shape.rs b/servo/components/style/values/computed/corner_shape.rs -new file mode 100644 ---- /dev/null -+++ b/servo/components/style/values/computed/corner_shape.rs -@@ -0,0 +1,155 @@ -+/* This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -+ -+//! Computed type for the `corner-shape` family of properties. -+ -+use crate::derives::*; -+use crate::values::animated::{Animate, Procedure, ToAnimatedZero}; -+use crate::values::distance::{ComputeSquaredDistance, SquaredDistance}; -+use crate::values::generics::border::GenericCornerShapeRect; -+use std::fmt::{self, Write}; -+use style_traits::{CssWriter, ToCss}; -+ -+/// The computed value for a single corner shape. -+/// -+/// Per the spec, the computed value is always `superellipse(K)` where `K` may -+/// be any real value, including +infinity (for `square`) and -infinity -+/// (for `notch`). -+#[derive( -+ Clone, Copy, Debug, MallocSizeOf, PartialEq, ToShmem, ToTyped, ToAnimatedValue, ToResolvedValue, -+)] -+#[repr(C)] -+#[typed(todo_derive_fields)] -+pub struct CornerShape { -+ /// The K parameter from the `superellipse()` function. -+ pub k: f32, -+} -+ -+impl CornerShape { -+ /// `round` -> superellipse(1). -+ #[inline] -+ pub fn round() -> Self { -+ Self { k: 1.0 } -+ } -+ /// `bevel` -> superellipse(0). -+ #[inline] -+ pub fn bevel() -> Self { -+ Self { k: 0.0 } -+ } -+ /// `square` -> superellipse(infinity). -+ #[inline] -+ pub fn square() -> Self { -+ Self { k: f32::INFINITY } -+ } -+ /// `notch` -> superellipse(-infinity). -+ #[inline] -+ pub fn notch() -> Self { -+ Self { -+ k: f32::NEG_INFINITY, -+ } -+ } -+ /// `scoop` -> superellipse(-1). -+ #[inline] -+ pub fn scoop() -> Self { -+ Self { k: -1.0 } -+ } -+ /// `squircle` -> superellipse(2). -+ #[inline] -+ pub fn squircle() -> Self { -+ Self { k: 2.0 } -+ } -+ -+ /// Whether this corner is the default `round` shape (K == 1). -+ #[inline] -+ pub fn is_round(&self) -> bool { -+ self.k == 1.0 -+ } -+} -+ -+impl ToCss for CornerShape { -+ fn to_css(&self, dest: &mut CssWriter) -> fmt::Result { -+ dest.write_str("superellipse(")?; -+ if self.k == f32::INFINITY { -+ dest.write_str("infinity")?; -+ } else if self.k == f32::NEG_INFINITY { -+ dest.write_str("-infinity")?; -+ } else { -+ self.k.to_css(dest)?; -+ } -+ dest.write_char(')') -+ } -+} -+ -+/// Compute the "normalized superellipse half corner" for a superellipse -+/// parameter `s`, per -+/// . -+fn s_to_interpolation_value(s: f32) -> f32 { -+ if s == f32::NEG_INFINITY { -+ return 0.0; -+ } -+ if s == f32::INFINITY { -+ return 1.0; -+ } -+ let k = 0.5f32.powf(s.abs()); -+ let convex_half_corner = 0.5f32.powf(k); -+ if s < 0.0 { -+ 1.0 - convex_half_corner -+ } else { -+ convex_half_corner -+ } -+} -+ -+/// Inverse of `s_to_interpolation_value`. -+fn interpolation_value_to_s(v: f32) -> f32 { -+ if v <= 0.0 { -+ return f32::NEG_INFINITY; -+ } -+ if v >= 1.0 { -+ return f32::INFINITY; -+ } -+ let convex_half_corner = if v < 0.5 { 1.0 - v } else { v }; -+ let k = 0.5f32.ln() / convex_half_corner.ln(); -+ let s = k.log2(); -+ if v < 0.5 { -+ -s -+ } else { -+ s -+ } -+} -+ -+impl Animate for CornerShape { -+ fn animate(&self, other: &Self, procedure: Procedure) -> Result { -+ let a = s_to_interpolation_value(self.k); -+ let b = s_to_interpolation_value(other.k); -+ let interp = a.animate(&b, procedure)?; -+ Ok(CornerShape { -+ k: interpolation_value_to_s(interp), -+ }) -+ } -+} -+ -+impl ComputeSquaredDistance for CornerShape { -+ fn compute_squared_distance(&self, other: &Self) -> Result { -+ let a = s_to_interpolation_value(self.k); -+ let b = s_to_interpolation_value(other.k); -+ a.compute_squared_distance(&b) -+ } -+} -+ -+impl ToAnimatedZero for CornerShape { -+ fn to_animated_zero(&self) -> Result { -+ Ok(CornerShape::round()) -+ } -+} -+ -+/// The four computed corner shapes for an element. -+pub type CornerShapeRect = GenericCornerShapeRect; -+ -+impl CornerShapeRect { -+ /// Initial value: `round` on every corner. -+ #[inline] -+ pub fn round_all() -> Self { -+ Self::all(CornerShape::round()) -+ } -+} -diff --git a/servo/components/style/values/computed/mod.rs b/servo/components/style/values/computed/mod.rs ---- a/servo/components/style/values/computed/mod.rs -+++ b/servo/components/style/values/computed/mod.rs -@@ -64,10 +64,11 @@ - }; - pub use self::color::{ - Color, ColorOrAuto, ColorPropertyValue, ColorScheme, ForcedColorAdjust, PrintColorAdjust, - }; - pub use self::column::ColumnCount; -+pub use self::corner_shape::{CornerShape, CornerShapeRect}; - pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset, CounterSet}; - pub use self::easing::TimingFunction; - pub use self::effects::{BoxShadow, Filter, SimpleShadow}; - pub use self::flex::FlexBasis; - pub use self::font::{FontFamily, FontLanguageOverride, FontPalette, FontStyle}; -@@ -140,10 +141,11 @@ - pub mod border; - #[path = "box.rs"] - pub mod box_; - pub mod color; - pub mod column; -+pub mod corner_shape; - pub mod counters; - pub mod easing; - pub mod effects; - pub mod flex; - pub mod font; -diff --git a/servo/components/style/values/generics/border.rs b/servo/components/style/values/generics/border.rs ---- a/servo/components/style/values/generics/border.rs -+++ b/servo/components/style/values/generics/border.rs -@@ -265,5 +265,40 @@ - let heights = Rect::new(&tl.height, &tr.height, &br.height, &bl.height); - - Self::serialize_rects(widths, heights, dest) - } - } -+ -+/// A generic value for the four corners of `corner-shape`. -+/// -+/// This mirrors the per-corner layout of `BorderRadius` so it can be used as -+/// the underlying storage for the four `corner-*-*-shape` longhands and their -+/// shorthand `corner-shape`. -+/// -+/// -+#[derive(Clone)] -+#[repr(C)] -+pub struct GenericCornerShapeRect { -+ /// The top-left corner shape. -+ pub top_left: S, -+ /// The top-right corner shape. -+ pub top_right: S, -+ /// The bottom-right corner shape. -+ pub bottom_right: S, -+ /// The bottom-left corner shape. -+ pub bottom_left: S, -+} -+ -+pub use self::GenericCornerShapeRect as CornerShapeRect; -+ -+impl CornerShapeRect { -+ /// Construct from a single value applied to all four corners. -+ #[inline] -+ pub fn all(s: S) -> Self { -+ Self { -+ top_left: s.clone(), -+ top_right: s.clone(), -+ bottom_right: s.clone(), -+ bottom_left: s.clone(), -+ } -+ } -+} -diff --git a/servo/components/style/values/specified/corner_shape.rs b/servo/components/style/values/specified/corner_shape.rs -new file mode 100644 ---- /dev/null -+++ b/servo/components/style/values/specified/corner_shape.rs -@@ -0,0 +1,159 @@ -+/* This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -+ -+//! Specified types for the `corner-shape` family of properties. -+//! -+//! -+ -+use crate::derives::*; -+use crate::parser::{Parse, ParserContext}; -+use crate::values::computed::corner_shape as computed; -+use crate::values::computed::{Context, ToComputedValue}; -+use crate::values::specified::Number; -+use cssparser::{Parser, Token}; -+use style_traits::{ParseError, StyleParseErrorKind}; -+ -+/// The argument to the `superellipse()` function. -+/// -+/// `superellipse(K)` defines the corner shape using the unit equation -+/// `x^(2^K) + y^(2^K) = 1`. `infinity` and `-infinity` are accepted as -+/// special-cased keyword arguments. -+#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem, ToTyped)] -+#[typed(todo_derive_fields)] -+pub enum SuperellipseArg { -+ /// `` argument. -+ Number(Number), -+ /// The `infinity` keyword. -+ Infinity, -+ /// The `-infinity` keyword (lexed as the literal text `-infinity`). -+ #[css(keyword = "-infinity")] -+ NegativeInfinity, -+} -+ -+impl SuperellipseArg { -+ fn parse<'i, 't>( -+ context: &ParserContext, -+ input: &mut Parser<'i, 't>, -+ ) -> Result> { -+ if let Ok(arg) = input.try_parse(|i| -> Result> { -+ let location = i.current_source_location(); -+ match i.next()? { -+ Token::Ident(ref ident) if ident.eq_ignore_ascii_case("infinity") => { -+ Ok(SuperellipseArg::Infinity) -+ }, -+ Token::Ident(ref ident) if ident.eq_ignore_ascii_case("-infinity") => { -+ Ok(SuperellipseArg::NegativeInfinity) -+ }, -+ _ => Err(location.new_custom_error(StyleParseErrorKind::UnspecifiedError)), -+ } -+ }) { -+ return Ok(arg); -+ } -+ Number::parse(context, input).map(SuperellipseArg::Number) -+ } -+ -+ /// Resolve to a numeric `K` value (possibly +/- infinity). -+ pub fn to_k(&self, context: &Context) -> f32 { -+ match self { -+ SuperellipseArg::Infinity => f32::INFINITY, -+ SuperellipseArg::NegativeInfinity => f32::NEG_INFINITY, -+ SuperellipseArg::Number(n) => n.to_computed_value(context), -+ } -+ } -+} -+ -+/// The specified value of a single corner-shape (e.g. `corner-top-left-shape`). -+/// -+/// -+#[derive(Clone, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToCss, ToShmem, ToTyped)] -+#[typed(todo_derive_fields)] -+pub enum CornerShape { -+ /// `round`, equivalent to `superellipse(1)`. Initial value. -+ Round, -+ /// `scoop`, equivalent to `superellipse(-1)`. -+ Scoop, -+ /// `bevel`, equivalent to `superellipse(0)`. -+ Bevel, -+ /// `notch`, equivalent to `superellipse(-infinity)`. -+ Notch, -+ /// `square`, equivalent to `superellipse(infinity)`. -+ Square, -+ /// `squircle`, equivalent to `superellipse(2)`. -+ Squircle, -+ /// `superellipse()`. -+ #[css(function)] -+ Superellipse(SuperellipseArg), -+} -+ -+impl CornerShape { -+ /// The initial value: `round`. -+ #[inline] -+ pub fn round() -> Self { -+ CornerShape::Round -+ } -+} -+ -+impl Parse for CornerShape { -+ fn parse<'i, 't>( -+ context: &ParserContext, -+ input: &mut Parser<'i, 't>, -+ ) -> Result> { -+ // Try the `superellipse(...)` function first. -+ if let Ok(arg) = input.try_parse(|i| { -+ i.expect_function_matching("superellipse")?; -+ i.parse_nested_block(|i| SuperellipseArg::parse(context, i)) -+ }) { -+ return Ok(CornerShape::Superellipse(arg)); -+ } -+ Ok(try_match_ident_ignore_ascii_case! { input, -+ "round" => CornerShape::Round, -+ "scoop" => CornerShape::Scoop, -+ "bevel" => CornerShape::Bevel, -+ "notch" => CornerShape::Notch, -+ "square" => CornerShape::Square, -+ "squircle" => CornerShape::Squircle, -+ }) -+ } -+} -+ -+impl ToComputedValue for CornerShape { -+ type ComputedValue = computed::CornerShape; -+ -+ fn to_computed_value(&self, context: &Context) -> Self::ComputedValue { -+ // Per spec, the computed value is always the corresponding -+ // `superellipse(K)` value. -+ computed::CornerShape { -+ k: match self { -+ CornerShape::Round => 1.0, -+ CornerShape::Scoop => -1.0, -+ CornerShape::Bevel => 0.0, -+ CornerShape::Notch => f32::NEG_INFINITY, -+ CornerShape::Square => f32::INFINITY, -+ CornerShape::Squircle => 2.0, -+ CornerShape::Superellipse(arg) => arg.to_k(context), -+ }, -+ } -+ } -+ -+ fn from_computed_value(c: &Self::ComputedValue) -> Self { -+ let arg = if c.k == f32::INFINITY { -+ SuperellipseArg::Infinity -+ } else if c.k == f32::NEG_INFINITY { -+ SuperellipseArg::NegativeInfinity -+ } else { -+ SuperellipseArg::Number(Number::new(c.k)) -+ }; -+ CornerShape::Superellipse(arg) -+ } -+} -+ -+/// The specified value of `corner-shape`. Stored per-corner. -+pub type CornerShapeRect = crate::values::generics::border::GenericCornerShapeRect; -+ -+impl CornerShapeRect { -+ /// Initial value: `round` for all four corners. -+ pub fn round() -> Self { -+ Self::all(CornerShape::Round) -+ } -+} -diff --git a/servo/components/style/values/specified/mod.rs b/servo/components/style/values/specified/mod.rs ---- a/servo/components/style/values/specified/mod.rs -+++ b/servo/components/style/values/specified/mod.rs -@@ -50,10 +50,11 @@ - pub use self::calc::{CalcLengthPercentage, CalcNumeric}; - pub use self::color::{ - Color, ColorOrAuto, ColorPropertyValue, ColorScheme, ForcedColorAdjust, PrintColorAdjust, - }; - pub use self::column::ColumnCount; -+pub use self::corner_shape::{CornerShape, CornerShapeRect, SuperellipseArg}; - pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset, CounterSet}; - pub use self::easing::TimingFunction; - pub use self::effects::{BoxShadow, Filter, SimpleShadow}; - pub use self::flex::FlexBasis; - pub use self::font::{FontFamily, FontLanguageOverride, FontPalette, FontStyle}; -@@ -125,10 +126,11 @@ - #[path = "box.rs"] - pub mod box_; - pub mod calc; - pub mod color; - pub mod column; -+pub mod corner_shape; - pub mod counters; - pub mod easing; - pub mod effects; - pub mod flex; - pub mod font; -diff --git a/servo/components/style/values/specified/position.rs b/servo/components/style/values/specified/position.rs ---- a/servo/components/style/values/specified/position.rs -+++ b/servo/components/style/values/specified/position.rs -@@ -747,11 +747,10 @@ - #[css(iterable, if_empty = "none")] - #[ignore_malloc_size_of = "Arc"] - pub crate::ArcSlice, - ); - -- - impl IsTreeScoped for PositionTryFallbacksList { - fn is_tree_scoped(&self) -> bool { - !self.is_none() - } - } -diff --git a/servo/ports/geckolib/cbindgen.toml b/servo/ports/geckolib/cbindgen.toml ---- a/servo/ports/geckolib/cbindgen.toml -+++ b/servo/ports/geckolib/cbindgen.toml -@@ -217,10 +217,12 @@ - "BorderImageSlice", - "BorderImageRepeat", - "BorderImageRepeatKeyword", - "BorderSpacing", - "BorderRadius", -+ "CornerShape", -+ "CornerShapeRect", - "ColorScheme", - "ColumnCount", - "CssRuleRef", - "NonNegativeLengthOrNumberRect", - "Perspective", -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/__dir__.ini b/testing/web-platform/meta/css/css-borders/corner-shape/__dir__.ini -new file mode 100644 ---- /dev/null -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/__dir__.ini -@@ -0,0 +1 @@ -+prefs: [layout.css.corner-shape.enabled:true] -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-computed.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-computed.html.ini -deleted file mode 100644 ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-computed.html.ini -+++ /dev/null -@@ -1,114 +0,0 @@ --[corner-shape-computed.html] -- [Property corner-top-left-shape value 'round'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'scoop'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(5)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(0.2)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(-infinity)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(infinity)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(1)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(0)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse(2)'] -- expected: FAIL -- -- [Property corner-top-left-shape value 'superellipse( -1)'] -- expected: FAIL -- -- [Property corner-top-right-shape value 'round'] -- expected: FAIL -- -- [Property corner-top-right-shape value 'superellipse(5)'] -- expected: FAIL -- -- [Property corner-bottom-right-shape value 'scoop'] -- expected: FAIL -- -- [Property corner-bottom-left-shape value 'superellipse(5)'] -- expected: FAIL -- -- [Property corner-shape value 'superellipse(5) round'] -- expected: FAIL -- -- [Property corner-shape value 'round'] -- expected: FAIL -- -- [Property corner-shape value 'bevel superellipse(0.1) round squircle'] -- expected: FAIL -- -- [Property corner-shape value 'superellipse(-5) superellipse(3) superellipse(7) superellipse(-5.5)'] -- expected: FAIL -- -- [Property corner-shape value 'round round round round'] -- expected: FAIL -- -- [Property corner-shape value 'round scoop'] -- expected: FAIL -- -- [Property corner-shape value 'round scoop round scoop'] -- expected: FAIL -- -- [Property corner-shape value 'bevel superellipse(1)'] -- expected: FAIL -- -- [Property corner-shape value 'superellipse(-1) superellipse(3) square'] -- expected: FAIL -- -- [Property corner-shape value 'superellipse(-1) superellipse(3) superellipse(0)'] -- expected: FAIL -- -- [Property corner-shape value 'bevel superellipse(1) squircle round'] -- expected: FAIL -- -- [Property corner-shape value 'superellipse(-1) superellipse(3) superellipse(0) superellipse(infinity)'] -- expected: FAIL -- -- [Property corner-left-shape value 'round scoop'] -- expected: FAIL -- -- [Property corner-top-shape value 'round scoop'] -- expected: FAIL -- -- [Property corner-top-shape value 'superellipse(4)'] -- expected: FAIL -- -- [Property corner-right-shape value 'superellipse(-1.5) superellipse(3)'] -- expected: FAIL -- -- [Property corner-right-shape value 'superellipse(-1) superellipse(2)'] -- expected: FAIL -- -- [Property corner-bottom-shape value 'scoop scoop'] -- expected: FAIL -- -- [Property corner-inline-start-shape value 'round scoop'] -- expected: FAIL -- -- [Property corner-block-start-shape value 'round scoop'] -- expected: FAIL -- -- [Property corner-block-end-shape value 'superellipse(4)'] -- expected: FAIL -- -- [Property corner-inline-end-shape value 'superellipse(-1.5) superellipse(3)'] -- expected: FAIL -- -- [Property corner-inline-start-shape value 'superellipse(-1) superellipse(2)'] -- expected: FAIL -- -- [Property corner-block-end-shape value 'scoop scoop'] -- expected: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-interpolation.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-interpolation.html.ini -deleted file mode 100644 ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-interpolation.html.ini -+++ /dev/null -@@ -1,1434 +0,0 @@ --[corner-shape-interpolation.html] -- [CSS Transitions: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to [bevel\] at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (-0.3) should be [superellipse(1.91)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (0.6) should be [superellipse(-0.18)\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [Web Animations: property from [initial\] to [scoop\] at (1.5) should be [superellipse(-2.95)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [squircle\] at (-0.3) should be [superellipse(-0.45)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [squircle\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [squircle\] at (0.6) should be [superellipse(0.98)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [squircle\] at (1) should be [squircle\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [squircle\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [squircle\] at (-0.3) should be [superellipse(-0.45)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [squircle\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [squircle\] at (0.6) should be [superellipse(0.98)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [squircle\] at (1) should be [squircle\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [squircle\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [squircle\] at (-0.3) should be [superellipse(-0.45)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [squircle\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [squircle\] at (0.6) should be [superellipse(0.98)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [squircle\] at (1) should be [squircle\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [squircle\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [squircle\] at (-0.3) should be [superellipse(-0.45)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [squircle\] at (0) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [squircle\] at (0.6) should be [superellipse(0.98)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [squircle\] at (1) should be [squircle\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [squircle\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [square\] at (-0.3) should be [superellipse(-0.69)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [square\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [square\] at (0.6) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [square\] at (-0.3) should be [superellipse(-0.69)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [square\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [square\] at (0.6) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [square\] at (-0.3) should be [superellipse(-0.69)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [square\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [square\] at (0.6) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [square\] at (-0.3) should be [superellipse(-0.69)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [square\] at (0) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [square\] at (0.6) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [scoop\] at (-0.3) should be [superellipse(0.27)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [scoop\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [scoop\] at (0.6) should be [superellipse(-0.56)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [scoop\] at (1.5) should be [superellipse(-1.72)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [scoop\] at (-0.3) should be [superellipse(0.27)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [scoop\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [scoop\] at (0.6) should be [superellipse(-0.56)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [scoop\] at (1.5) should be [superellipse(-1.72)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [scoop\] at (-0.3) should be [superellipse(0.27)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [scoop\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [scoop\] at (0.6) should be [superellipse(-0.56)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [scoop\] at (1.5) should be [superellipse(-1.72)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [scoop\] at (-0.3) should be [superellipse(0.27)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [scoop\] at (0) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [scoop\] at (0.6) should be [superellipse(-0.56)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [scoop\] at (1) should be [scoop\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [scoop\] at (1.5) should be [superellipse(-1.72)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [notch\] at (-0.3) should be [superellipse(0.69)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [notch\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [notch\] at (0.6) should be [superellipse(-1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [notch\] at (1) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [inherit\] to [notch\] at (1.5) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [notch\] at (-0.3) should be [superellipse(0.69)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [notch\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [notch\] at (0.6) should be [superellipse(-1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [notch\] at (1) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [inherit\] to [notch\] at (1.5) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [notch\] at (-0.3) should be [superellipse(0.69)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [notch\] at (0) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [notch\] at (0.6) should be [superellipse(-1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [notch\] at (1) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [inherit\] to [notch\] at (1.5) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [notch\] at (-0.3) should be [superellipse(0.69)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [notch\] at (0) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [notch\] at (0.6) should be [superellipse(-1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [notch\] at (1) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [inherit\] to [notch\] at (1.5) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (-0.3) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0) should be [notch\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.5) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (0.8) should be [superellipse(1.64)\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [notch\] to [square\] at (1.5) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [CSS Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (-0.3) should be [square\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0) should be [superellipse(3)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.5) should be [superellipse(0.16)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (0.8) should be [superellipse(-0.9)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1) should be [superellipse(-2)\]] -- expected: FAIL -- -- [Web Animations: property from [superellipse(3)\] to [superellipse(-2)\] at (1.1) should be [superellipse(-2.99)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to neutral at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to neutral at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to neutral at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to neutral at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions: property from [round\] to neutral at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to neutral at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to neutral at (0) should be [round\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to neutral at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to neutral at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Transitions with transition: all: property from [round\] to neutral at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to neutral at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to neutral at (0) should be [round\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to neutral at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to neutral at (1) should be [bevel\]] -- expected: FAIL -- -- [CSS Animations: property from [round\] to neutral at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to neutral at (-0.3) should be [superellipse(1.4)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to neutral at (0) should be [round\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to neutral at (0.6) should be [superellipse(0.36)\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to neutral at (1) should be [bevel\]] -- expected: FAIL -- -- [Web Animations: property from [round\] to neutral at (1.5) should be [superellipse(-0.46)\]] -- expected: FAIL -- -- [Compositing CSS Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (-0.3) should be [round\]] -- expected: FAIL -- -- [Compositing CSS Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (0) should be [round\]] -- expected: FAIL -- -- [Compositing CSS Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (0.6) should be [round\]] -- expected: FAIL -- -- [Compositing CSS Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (1) should be [round\]] -- expected: FAIL -- -- [Compositing CSS Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (1.5) should be [round\]] -- expected: FAIL -- -- [Compositing Web Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (-0.3) should be [round\]] -- expected: FAIL -- -- [Compositing Web Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (0) should be [round\]] -- expected: FAIL -- -- [Compositing Web Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (0.6) should be [round\]] -- expected: FAIL -- -- [Compositing Web Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (1) should be [round\]] -- expected: FAIL -- -- [Compositing Web Animations: property underlying [round\] from replace [round\] to replace [[object Object\]\] at (1.5) should be [round\]] -- expected: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-valid.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-valid.html.ini -deleted file mode 100644 ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-valid.html.ini -+++ /dev/null -@@ -1,723 +0,0 @@ --[corner-shape-valid.html] -- [e.style['corner-top-left-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "round" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "notch" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "bevel" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "squircle" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(7)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(0.3)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse( 0)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(2 )" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(calc(0.5 * 4))" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "round round round round" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "round scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "round scoop round scoop" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "bevel superellipse(2)" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) superellipse(1)" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "bevel superellipse(2) squircle round" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) superellipse(1) superellipse(infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-left-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-right-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-left-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-bottom-right-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-start-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-start-end-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-start-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "square" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(-infinity)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(-0.5)" should set the property value] -- expected: FAIL -- -- [e.style['corner-end-end-shape'\] = "superellipse(-4)" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) square" should set the property value] -- expected: FAIL -- -- [e.style['corner-shape'\] = "superellipse(-0.5) superellipse(3) square superellipse(-30)" should set the property value] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "scoop" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "scoop" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "bevel notch" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "bevel notch" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(-2) squircle" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(-2) squircle" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(3)" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(3)" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-top-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "scoop" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "scoop" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "bevel notch" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "bevel notch" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(-2) squircle" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(-2) squircle" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(3)" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(3)" should set corner-top-right-shape] -- expected: FAIL -- -- [e.style['corner-right-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "scoop" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "scoop" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "bevel notch" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "bevel notch" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(3)" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(3)" should set corner-bottom-right-shape] -- expected: FAIL -- -- [e.style['corner-bottom-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "scoop" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "scoop" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "bevel notch" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "bevel notch" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(-2) squircle" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(-2) squircle" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(3)" should set corner-bottom-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(3)" should set corner-top-left-shape] -- expected: FAIL -- -- [e.style['corner-left-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "scoop" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "scoop" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "bevel notch" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "bevel notch" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(-2) squircle" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(-2) squircle" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(3)" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(3)" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-inline-start-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "scoop" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "scoop" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "bevel notch" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "bevel notch" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(-2) squircle" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(-2) squircle" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(3)" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(3)" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-inline-end-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "scoop" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "scoop" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "bevel notch" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "bevel notch" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(-2) squircle" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(-2) squircle" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(3)" should set corner-start-end-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(3)" should set corner-start-start-shape] -- expected: FAIL -- -- [e.style['corner-block-start-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "scoop" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "scoop" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "scoop" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "bevel notch" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "bevel notch" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "bevel notch" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(-2) squircle" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(-2) squircle" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(-2) squircle" should not set unrelated longhands] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(3)" should set corner-end-end-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(3)" should set corner-end-start-shape] -- expected: FAIL -- -- [e.style['corner-block-end-shape'\] = "superellipse(3)" should not set unrelated longhands] -- expected: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini -@@ -1,20 +1,8 @@ --[render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40&border-width=10] -- expected: FAIL -- --[render-corner-shape.html?corner-shape=squircle&border-top-left-radius=30%] -- expected: FAIL -- - [render-corner-shape.html?border-radius=50&corner-shape=0&shadow-spread=10] - expected: FAIL - --[render-corner-shape.html?corner-shape=squircle&border-top-right-radius=30] -- expected: FAIL -- --[render-corner-shape.html?corner-shape=square&border-bottom-left-radius=5] -- expected: FAIL -- - [render-corner-shape.html?border-radius=40&corner-shape=3&shadow-spread=10] - expected: FAIL - - [render-corner-shape.html?border-top-left-radius=50%&corner-shape=0.7&border-left-width=30&border-top-width=30] - expected: FAIL -@@ -32,94 +20,106 @@ - expected: FAIL - - [render-corner-shape.html?corner-shape=scoop&border-radius=20%&border-width=20] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40&border-width=10] -- expected: FAIL -- - [render-corner-shape.html?border-radius=50%&corner-top-right-shape=scoop&corner-bottom-left-shape=scoop&corner-top-left-shape=notch&corner-bottom-right-shape=notch&border-width=10] - expected: FAIL - - [render-corner-shape.html?border-top-right-radius=100&corner-top-right-shape=0&shadow-spread=30] - expected: FAIL - --[render-corner-shape.html?corner-bottom-left-shape=bevel&border-width=10&border-radius=20] -+[render-corner-shape.html?corner-top-left-shape=scoop&border-radius=40] - expected: FAIL - --[render-corner-shape.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10] -+[render-corner-shape.html?corner-top-right-shape=-4&border-top-right-radius=50] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=2.5&border-radius=20%&border-width=10] -+[render-corner-shape.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40] -+[render-corner-shape.html?corner-top-left-shape=-4&border-radius=40%] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=scoop&border-radius=40] -+[render-corner-shape.html?corner-top-left-shape=0&corner-top-right-shape=notch&corner-bottom-right-shape=2&corner-bottom-left-shape=-1&border-width=20&shadow-spread=20&border-radius=50] - expected: FAIL - --[render-corner-shape.html?corner-top-right-shape=-4&border-top-right-radius=50] -+[render-corner-shape.html?corner-shape=-7&border-radius=20%&border-width=20] - expected: FAIL - --[render-corner-shape.html?corner-shape=3&border-top-right-radius=33] -+[render-corner-shape.html?border-radius=5&corner-top-left-shape=0.5&corner-bottom-right-shape=-0.5&shadow-spread=10] - expected: FAIL - --[render-corner-shape.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10] -+[render-corner-shape.html?corner-top-left-shape=-4&border-radius=40] - expected: FAIL - --[render-corner-shape.html?corner-shape=2.3&border-radius=40%] -+[render-corner-shape.html?border-radius=40&corner-shape=-infinity&shadow-spread=10] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=-4&border-radius=40%] -+[render-corner-shape.html?border-radius=40&corner-shape=-1.5&shadow-spread=10] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=0&corner-top-right-shape=notch&corner-bottom-right-shape=2&corner-bottom-left-shape=-1&border-width=20&shadow-spread=20&border-radius=50] -+[render-corner-shape.html?corner-shape=-2&border-top-left-radius=40%&border-width=20] - expected: FAIL - --[render-corner-shape.html?corner-shape=-7&border-radius=20%&border-width=20] -+[render-corner-shape.html?border-radius=25&corner-shape=2&shadow-spread=10] - expected: FAIL - --[render-corner-shape.html?border-radius=5&corner-top-left-shape=0.5&corner-bottom-right-shape=-0.5&shadow-spread=10] -+[render-corner-shape.html?border-radius=50%&corner-top-left-shape=scoop&corner-bottom-right-shape=scoop&corner-top-right-shape=notch&corner-bottom-left-shape=notch&border-width=10] - expected: FAIL - --[render-corner-shape.html?corner-bottom-right-shape=0.8&border-bottom-right-radius=50%] -+[render-corner-shape.html?corner-shape=0.8&border-radius=40&border-width=10] - expected: FAIL - --[render-corner-shape.html?corner-shape=5&border-radius=20%&border-width=20] -+[render-corner-shape.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30] - expected: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-radius=50%] - expected: FAIL - --[render-corner-shape.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30] -+[render-corner-shape.html?corner-shape=3&border-top-right-radius=33] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=-4&border-radius=40] -+[render-corner-shape.html?corner-shape=square&border-bottom-left-radius=5] - expected: FAIL - --[render-corner-shape.html?border-radius=40&corner-shape=-infinity&shadow-spread=10] -+[render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40] - expected: FAIL - --[render-corner-shape.html?border-radius=40&corner-shape=-1.5&shadow-spread=10] -+[render-corner-shape.html?corner-bottom-right-shape=bevel&border-width=10&border-radius=20] - expected: FAIL - --[render-corner-shape.html?corner-shape=-2&border-top-left-radius=40%&border-width=20] -+[render-corner-shape.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10] - expected: FAIL - --[render-corner-shape.html?border-radius=25&corner-shape=2&shadow-spread=10] -+[render-corner-shape.html?corner-bottom-right-shape=0.8&border-bottom-right-radius=50%] -+ expected: FAIL -+ -+[render-corner-shape.html?corner-top-left-shape=2.5&border-radius=20%&border-width=10] - expected: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-radius=25%&border-width=20] - expected: FAIL - --[render-corner-shape.html?corner-bottom-right-shape=bevel&border-width=10&border-radius=20] -+[render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40&border-width=10] - expected: FAIL - --[render-corner-shape.html?corner-top-left-shape=0.5&border-radius=40] -+[render-corner-shape.html?corner-shape=squircle&border-top-right-radius=30] - expected: FAIL - --[render-corner-shape.html?corner-shape=0.8&border-radius=40&border-width=10] -+[render-corner-shape.html?corner-bottom-left-shape=bevel&border-width=10&border-radius=20] - expected: FAIL - --[render-corner-shape.html?border-radius=50%&corner-top-left-shape=scoop&corner-bottom-right-shape=scoop&corner-top-right-shape=notch&corner-bottom-left-shape=notch&border-width=10] -+[render-corner-shape.html?corner-shape=5&border-radius=20%&border-width=20] -+ expected: FAIL -+ -+[render-corner-shape.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40&border-width=10] -+ expected: FAIL -+ -+[render-corner-shape.html?corner-shape=2.3&border-radius=40%] -+ expected: FAIL -+ -+[render-corner-shape.html?corner-top-left-shape=0.5&border-radius=40] -+ expected: FAIL -+ -+[render-corner-shape.html?corner-shape=squircle&border-top-left-radius=30%] - expected: FAIL -diff --git a/testing/web-platform/tests/css/css-borders/corner-shape/corner-shape-computed.html b/testing/web-platform/tests/css/css-borders/corner-shape/corner-shape-computed.html ---- a/testing/web-platform/tests/css/css-borders/corner-shape/corner-shape-computed.html -+++ b/testing/web-platform/tests/css/css-borders/corner-shape/corner-shape-computed.html -@@ -9,45 +9,45 @@ - - -
- - - diff --git a/src/external-patches/firefox/corner_shape_support/D297660.patch b/src/external-patches/firefox/corner_shape_support/D297660.patch deleted file mode 100644 index 589cf6ffa..000000000 --- a/src/external-patches/firefox/corner_shape_support/D297660.patch +++ /dev/null @@ -1,1336 +0,0 @@ -diff --git a/gfx/2d/Rect.h b/gfx/2d/Rect.h ---- a/gfx/2d/Rect.h -+++ b/gfx/2d/Rect.h -@@ -10,12 +10,14 @@ - #include "NumericTools.h" - #include "Point.h" - #include "Tools.h" - #include "mozilla/Maybe.h" - -+#include - #include - #include -+#include - - namespace mozilla { - - template - struct IsPixel; -@@ -398,10 +400,11 @@ - } - - template - struct BaseRectCornerRadii { - Size radii[eCornerCount]; -+ float mShapeK[eCornerCount] = {1.0f, 1.0f, 1.0f, 1.0f}; - - BaseRectCornerRadii() = default; - - explicit BaseRectCornerRadii(Coord radius) { - for (const auto i : mozilla::AllPhysicalCorners()) { -@@ -445,11 +448,19 @@ - } - - bool operator==(const BaseRectCornerRadii& aOther) const { - return TopLeft() == aOther.TopLeft() && TopRight() == aOther.TopRight() && - BottomRight() == aOther.BottomRight() && -- BottomLeft() == aOther.BottomLeft(); -+ BottomLeft() == aOther.BottomLeft() && -+ std::equal(std::begin(mShapeK), std::end(mShapeK), -+ std::begin(aOther.mShapeK)); -+ } -+ -+ // True if every corner uses the default round (K=1) shape. -+ bool AreShapesAllRound() const { -+ return std::all_of(std::begin(mShapeK), std::end(mShapeK), -+ [](float k) { return k == 1.0f; }); - } - - bool AreRadiiSame() const { - return TopLeft() == TopRight() && TopLeft() == BottomRight() && - TopLeft() == BottomLeft(); -diff --git a/gfx/webrender_bindings/WebRenderAPI.cpp b/gfx/webrender_bindings/WebRenderAPI.cpp ---- a/gfx/webrender_bindings/WebRenderAPI.cpp -+++ b/gfx/webrender_bindings/WebRenderAPI.cpp -@@ -1429,11 +1429,12 @@ - // little white dots at the center at some magnifications. - wr::BorderSide side = {aColor, wr::BorderStyle::Solid}; - float h = aBounds.width() * 0.6f; - float v = aBounds.height() * 0.6f; - wr::LayoutSideOffsets widths = {v, h, v, h}; -- wr::BorderRadius radii = {{h, v}, {h, v}, {h, v}, {h, v}}; -+ wr::BorderRadius radii = {{h, v}, {h, v}, {h, v}, {h, v}, -+ 1.0f, 1.0f, 1.0f, 1.0f}; - - // Anti-aliased borders are required for rounded borders. - wr_dp_push_border(mWrState, aBounds, aClip, aIsBackfaceVisible, - &mCurrentSpaceAndClipChain, wr::AntialiasBorder::Yes, - widths, side, side, side, side, radii); -diff --git a/gfx/webrender_bindings/WebRenderTypes.h b/gfx/webrender_bindings/WebRenderTypes.h ---- a/gfx/webrender_bindings/WebRenderTypes.h -+++ b/gfx/webrender_bindings/WebRenderTypes.h -@@ -390,39 +390,10 @@ - ls.width = size.width; - ls.height = size.height; - return ls; - } - --static inline wr::ComplexClipRegion ToComplexClipRegion( -- const gfx::RoundedRect& rect) { -- wr::ComplexClipRegion ret; -- ret.rect = ToLayoutRect(rect.rect); -- ret.radii.top_left = ToLayoutSize(LayoutDeviceSize::FromUnknownSize( -- rect.corners.radii[mozilla::eCornerTopLeft])); -- ret.radii.top_right = ToLayoutSize(LayoutDeviceSize::FromUnknownSize( -- rect.corners.radii[mozilla::eCornerTopRight])); -- ret.radii.bottom_left = ToLayoutSize(LayoutDeviceSize::FromUnknownSize( -- rect.corners.radii[mozilla::eCornerBottomLeft])); -- ret.radii.bottom_right = ToLayoutSize(LayoutDeviceSize::FromUnknownSize( -- rect.corners.radii[mozilla::eCornerBottomRight])); -- ret.mode = wr::ClipMode::Clip; -- return ret; --} -- --static inline wr::ComplexClipRegion SimpleRadii(const wr::LayoutRect& aRect, -- float aRadii) { -- wr::ComplexClipRegion ret; -- wr::LayoutSize radii{aRadii, aRadii}; -- ret.rect = aRect; -- ret.radii.top_left = radii; -- ret.radii.top_right = radii; -- ret.radii.bottom_left = radii; -- ret.radii.bottom_right = radii; -- ret.mode = wr::ClipMode::Clip; -- return ret; --} -- - static inline wr::LayoutSize ToLayoutSize( - const mozilla::LayoutDeviceIntSize& size) { - return ToLayoutSize(LayoutDeviceSize(size)); - } - -@@ -460,10 +431,15 @@ - } - - static inline wr::BorderRadius EmptyBorderRadius() { - wr::BorderRadius br; - PodZero(&br); -+ // PodZero leaves shape_* at 0.0, but the round (default) shape is K=1.0. -+ br.shape_top_left = 1.0f; -+ br.shape_top_right = 1.0f; -+ br.shape_bottom_left = 1.0f; -+ br.shape_bottom_right = 1.0f; - return br; - } - - static inline wr::BorderRadius ToBorderRadius( - const LayoutDeviceSize& topLeft, const LayoutDeviceSize& topRight, -@@ -471,30 +447,54 @@ - wr::BorderRadius br; - br.top_left = ToLayoutSize(topLeft); - br.top_right = ToLayoutSize(topRight); - br.bottom_left = ToLayoutSize(bottomLeft); - br.bottom_right = ToLayoutSize(bottomRight); -+ -+ br.shape_top_left = 1.0f; -+ br.shape_top_right = 1.0f; -+ br.shape_bottom_left = 1.0f; -+ br.shape_bottom_right = 1.0f; - return br; - } - -+static inline void SetCornerShapes(wr::BorderRadius& aRadius, float aTopLeftK, -+ float aTopRightK, float aBottomRightK, -+ float aBottomLeftK) { -+ aRadius.shape_top_left = aTopLeftK; -+ aRadius.shape_top_right = aTopRightK; -+ aRadius.shape_bottom_right = aBottomRightK; -+ aRadius.shape_bottom_left = aBottomLeftK; -+} -+ - static inline wr::BorderRadius ToBorderRadius( - const gfx::RectCornerRadii& aRadii) { -- return ToBorderRadius( -- LayoutDeviceSize::FromUnknownSize(aRadii.TopLeft()), -- LayoutDeviceSize::FromUnknownSize(aRadii.TopRight()), -- LayoutDeviceSize::FromUnknownSize(aRadii.BottomLeft()), -- LayoutDeviceSize::FromUnknownSize(aRadii.BottomRight())); -+ auto br = -+ ToBorderRadius(LayoutDeviceSize::FromUnknownSize(aRadii.TopLeft()), -+ LayoutDeviceSize::FromUnknownSize(aRadii.TopRight()), -+ LayoutDeviceSize::FromUnknownSize(aRadii.BottomLeft()), -+ LayoutDeviceSize::FromUnknownSize(aRadii.BottomRight())); -+ SetCornerShapes(br, aRadii.mShapeK[mozilla::eCornerTopLeft], -+ aRadii.mShapeK[mozilla::eCornerTopRight], -+ aRadii.mShapeK[mozilla::eCornerBottomRight], -+ aRadii.mShapeK[mozilla::eCornerBottomLeft]); -+ return br; - } - - static inline wr::BorderRadius ToBorderRadius(const nsRectCornerRadii& aRadii, - int32_t aAppUnitsPerDevPixel) { -- return ToBorderRadius( -+ auto br = ToBorderRadius( - LayoutDeviceSize::FromAppUnits(aRadii.TopLeft(), aAppUnitsPerDevPixel), - LayoutDeviceSize::FromAppUnits(aRadii.TopRight(), aAppUnitsPerDevPixel), - LayoutDeviceSize::FromAppUnits(aRadii.BottomLeft(), aAppUnitsPerDevPixel), - LayoutDeviceSize::FromAppUnits(aRadii.BottomRight(), - aAppUnitsPerDevPixel)); -+ SetCornerShapes(br, aRadii.mShapeK[mozilla::eCornerTopLeft], -+ aRadii.mShapeK[mozilla::eCornerTopRight], -+ aRadii.mShapeK[mozilla::eCornerBottomRight], -+ aRadii.mShapeK[mozilla::eCornerBottomLeft]); -+ return br; - } - - static inline wr::ComplexClipRegion ToComplexClipRegion( - const nsRect& aRect, const nsRectCornerRadii& aRadii, - int32_t aAppUnitsPerDevPixel) { -@@ -504,10 +504,33 @@ - ret.radii = ToBorderRadius(aRadii, aAppUnitsPerDevPixel); - ret.mode = ClipMode::Clip; - return ret; - } - -+static inline wr::ComplexClipRegion ToComplexClipRegion( -+ const gfx::RoundedRect& rect) { -+ wr::ComplexClipRegion ret; -+ ret.rect = ToLayoutRect(rect.rect); -+ ret.radii = ToBorderRadius(rect.corners); -+ ret.mode = wr::ClipMode::Clip; -+ return ret; -+} -+ -+static inline wr::ComplexClipRegion SimpleRadii(const wr::LayoutRect& aRect, -+ float aRadii) { -+ wr::ComplexClipRegion ret; -+ wr::LayoutSize radii{aRadii, aRadii}; -+ ret.rect = aRect; -+ ret.radii = EmptyBorderRadius(); -+ ret.radii.top_left = radii; -+ ret.radii.top_right = radii; -+ ret.radii.bottom_left = radii; -+ ret.radii.bottom_right = radii; -+ ret.mode = wr::ClipMode::Clip; -+ return ret; -+} -+ - static inline wr::DeviceIntSideOffsets ToDeviceIntSideOffsets(int32_t top, - int32_t right, - int32_t bottom, - int32_t left) { - wr::DeviceIntSideOffsets offset; -diff --git a/gfx/wr/webrender/res/ellipse.glsl b/gfx/wr/webrender/res/ellipse.glsl ---- a/gfx/wr/webrender/res/ellipse.glsl -+++ b/gfx/wr/webrender/res/ellipse.glsl -@@ -8,10 +8,17 @@ - // it as an ellipse with very small radii so that we don't need to branch. - vec2 inverse_radii_squared(vec2 radii) { - return 1.0 / max(radii * radii, 1.0e-6); - } - -+// Same as above, but the exponentiation will come later, -+// in the superellipse calculation. We sill want to precompute -+// the inverse though. -+vec2 inverse_radii(vec2 radii) { -+ return 1.0 / max(radii, 1.0e-3); -+} -+ - #ifdef WR_FRAGMENT_SHADER - - // One iteration of Newton's method on the 2D equation of an ellipse: - // - // E(x, y) = x^2/a^2 + y^2/b^2 - 1 -@@ -88,6 +95,155 @@ - // Calculate the distance of the selected corner and the rectangle bounds, - // whichever is greater. - return max(distance_to_ellipse_approx(corner.xy, corner.zw, 1.0), - signed_distance_rect(pos, rect_bounds.xy, rect_bounds.zw)); - } -+ -+// `superellipse(K)` defines the corner via |x/a|^n + |y/b|^n = 1 with -+// n = 2^K. The shader stores K (not n). Special cases by spec: -+// round K = 1 n = 2 (the standard ellipse — fast path) -+// squircle K = 2 n = 4 -+// bevel K = 0 n = 1 (straight cut) -+// scoop K = -1 n = 0.5 (concave bite into the corner) -+// square K = +inf -+// notch K = -inf -+// -+// `p` is the offset of the fragment from the ellipse center (matching -+// distance_to_ellipse's frame); the box corner is at (radii.x, radii.y) -+// in this frame, the box interior at one or both components negative. -+// The curve lives in the +x +y quadrant; F<0 marks the inside of the -+// shape, F>0 the carved-away corner region. -+float distance_to_superellipse_approx(vec2 p, vec2 inv_radii, float k) { -+ // Square: corner clings to the box (n=+inf). Inside the box's -+ // L-corner = inside the shape; treat the corner of the rect as the -+ // SDF reference. From the ellipse center, the box corner sits at -+ // +radii.{x,y}; if p is past either, we're outside the box. -+ if (k > 10.0) { -+ vec2 radii = 1.0 / inv_radii; -+ return max(p.x - radii.x, p.y - radii.y); -+ } -+ // Notch: K=-inf. The curve degenerates to the inner L (x=0 or y=0 -+ // within the corner box), so the whole corner box is cut away. -+ // Inside the corner box (p > 0), distance to the curve is the -+ // perpendicular to the nearer axis, positive because the box-corner -+ // side is outside the shape. -+ if (k < -10.0) { -+ return min(p.x, p.y); -+ } -+ -+ // Bevel: K=0, n=1 → straight chamfer x/a + y/b = 1. Use only the -+ // +x,+y projection so the line distance matches geometry inside -+ // the box (where p has negative components). -+ if (k == 0.0) { -+ vec2 pp = max(p, vec2(0.0)); -+ float g = dot(pp, inv_radii) - 1.0; -+ return g * inversesqrt(dot(inv_radii, inv_radii)); -+ } -+ -+ // Convex case (K>0): standard superellipse |p.x/a|^n + |p.y/b|^n = 1, n = 2^k, -+ // centred at the ellipse center. F<0 inside shape, F>0 outside. -+ // -+ // Concave case (K<0): mirrored superellipse |s/r|^n = 1, n = 2^|k| > 1, -+ // centered at the box-outer corner. p = radii - p re-centres the -+ // frame. The implicit ellipse's interior (F<0) is the lens around -+ // box-outer i.e. OUTSIDE the shape; flip sign so "inside shape" -+ // stays negative. -+ if (k < 0.0) { -+ vec2 radii = 1.0 / inv_radii; -+ p = radii - p; -+ } -+ -+ // Convert the CSS superellipse parameter (k) to the actual -+ // exponent: 2^k -+ float n = exp2(abs(k)); -+ -+ // Divide by radii: normalize the position to [0, 1] -+ vec2 q = p * inv_radii; -+ -+ // Compute the superellipse function -+ vec2 qn = pow(q, vec2(n)); -+ qn = clamp(qn, 0.0, 1.0e3); // Clamp to avoid numerical overflow -+ float f = qn.x + qn.y - 1.0; -+ -+ // Compute the gradient of the superellipse function -+ vec2 qn1 = pow(q, vec2(n - 1.0)); -+ qn1 = clamp(qn1, 0.0, 1.0e2); // Clamp to avoid numerical overflow -+ vec2 grad = n * qn1 * inv_radii; -+ -+ // Clamp the gradient to avoid numerical issues, it creates -+ // a discontinuity, but the estimated SDF is already way -+ // off at that point, and it avoids the distance going to -+ // infinity for larger exponents. -+ grad = max(grad, inv_radii); -+ -+ // SDF estimation; will be okay-ish close to the borders (around 0), -+ // but will quickly over/underestimate further away. Should be good -+ // enough for distance anti-aliasing, but not for general purpose -+ // distance estimation. -+ return sign(k) * f * inversesqrt(dot(grad, grad)); -+} -+ -+float distance_to_superellipse(vec2 p, vec2 radii, float k) { -+ return distance_to_superellipse_approx(p, inverse_radii(radii), k); -+} -+ -+// Same as distance_to_rounded_rect but with per-corner shape values. -+float distance_to_shaped_rect( -+ vec2 pos, -+ vec4 center_radius_tl, -+ vec4 center_radius_tr, -+ vec4 center_radius_br, -+ vec4 center_radius_bl, -+ vec4 rect_bounds, -+ vec4 corner_shapes -+) { -+ vec2 corner_p = vec2(1.0e-6); -+ vec2 corner_inv = vec2(1.0); -+ float corner_k = 1.0; -+ -+ float in_corner = 0.0; -+ -+ vec2 p_tl = center_radius_tl.xy - pos; -+ vec2 p_tr = (center_radius_tr.xy - pos) * vec2(-1.0, 1.0); -+ vec2 p_br = pos - center_radius_br.xy; -+ vec2 p_bl = (center_radius_bl.xy - pos) * vec2(1.0, -1.0); -+ -+ if (p_tl.x >= 0.0 && p_tl.y >= 0.0) { -+ corner_p = p_tl; -+ corner_inv = center_radius_tl.zw; -+ corner_k = corner_shapes.x; -+ in_corner = 1.0; -+ } -+ if (p_tr.x >= 0.0 && p_tr.y >= 0.0) { -+ corner_p = p_tr; -+ corner_inv = center_radius_tr.zw; -+ corner_k = corner_shapes.y; -+ in_corner = 1.0; -+ } -+ if (p_br.x >= 0.0 && p_br.y >= 0.0) { -+ corner_p = p_br; -+ corner_inv = center_radius_br.zw; -+ corner_k = corner_shapes.z; -+ in_corner = 1.0; -+ } -+ if (p_bl.x >= 0.0 && p_bl.y >= 0.0) { -+ corner_p = p_bl; -+ corner_inv = center_radius_bl.zw; -+ corner_k = corner_shapes.w; -+ in_corner = 1.0; -+ } -+ -+ float d_corner; -+ if (in_corner == 0.0) { -+ // Not in any corner. let the rect SDF decide. Use a strongly -+ // negative value so max() defers to the rect. -+ d_corner = -1.0e6; -+ } else if (corner_k == 1.0) { -+ d_corner = distance_to_ellipse_approx(corner_p, corner_inv, 1.0); -+ } else { -+ d_corner = distance_to_superellipse_approx(corner_p, corner_inv, corner_k); -+ } -+ -+ return max(d_corner, -+ signed_distance_rect(pos, rect_bounds.xy, rect_bounds.zw)); -+} - #endif -diff --git a/gfx/wr/webrender/res/ps_quad_mask.glsl b/gfx/wr/webrender/res/ps_quad_mask.glsl ---- a/gfx/wr/webrender/res/ps_quad_mask.glsl -+++ b/gfx/wr/webrender/res/ps_quad_mask.glsl -@@ -18,10 +18,13 @@ - flat varying highp vec4 vClipCenter_Radius_BL; - // We pack 4 vec3 clip planes into 3 vec4 to save a varying slot. - flat varying highp vec4 vClipPlane_A; - flat varying highp vec4 vClipPlane_B; - flat varying highp vec4 vClipPlane_C; -+ -+flat varying highp vec4 vClipShape; -+ - #endif - flat varying highp vec2 vClipMode; - - #ifdef WR_VERTEX_SHADER - -@@ -35,10 +38,12 @@ - #ifdef WR_FEATURE_FAST_PATH - vec4 radii; - #else - vec4 radii_top; - vec4 radii_bottom; -+ -+ vec4 shape; - #endif - float mode; - int space; - }; - -@@ -51,20 +56,31 @@ - vec4 texels[3] = fetch_from_gpu_buffer_3f(index); - clip.rect = RectWithEndpoint(texels[0].xy, texels[0].zw); - clip.radii = texels[1]; - clip.mode = texels[2].x; - #else -- vec4 texels[4] = fetch_from_gpu_buffer_4f(index); -+ vec4 texels[5] = fetch_from_gpu_buffer_5f(index); - clip.rect = RectWithEndpoint(texels[0].xy, texels[0].zw); - clip.radii_top = texels[1]; - clip.radii_bottom = texels[2]; - clip.mode = texels[3].x; -+ clip.shape = texels[4]; - #endif - - return clip; - } - -+vec4 precalc_corner(vec2 center, vec2 radii, float k) { -+ if (k == 1.0) { -+ // round/ellipse corner, precalc the ellipse parameters -+ return vec4(center, inverse_radii_squared(radii)); -+ } else { -+ // superellipse, precalc the superellipse parameters -+ return vec4(center, inverse_radii(radii)); -+ } -+} -+ - void pattern_vertex(PrimitiveInfo prim_info) { - - Clip clip = fetch_clip(aClipData.y); - Transform clip_transform = fetch_transform(aClipData.x); - -@@ -96,23 +112,27 @@ - vec2 r_tl = clip.radii_top.xy; - vec2 r_tr = clip.radii_top.zw; - vec2 r_br = clip.radii_bottom.zw; - vec2 r_bl = clip.radii_bottom.xy; - -- vClipCenter_Radius_TL = vec4(clip.rect.p0 + r_tl, -- inverse_radii_squared(r_tl)); -+ vClipCenter_Radius_TL = precalc_corner(clip.rect.p0 + r_tl, -+ r_tl, -+ clip.shape.x); - -- vClipCenter_Radius_TR = vec4(clip.rect.p1.x - r_tr.x, -- clip.rect.p0.y + r_tr.y, -- inverse_radii_squared(r_tr)); -+ vClipCenter_Radius_TR = precalc_corner(vec2(clip.rect.p1.x - r_tr.x, -+ clip.rect.p0.y + r_tr.y), -+ r_tr, -+ clip.shape.y); - -- vClipCenter_Radius_BR = vec4(clip.rect.p1 - r_br, -- inverse_radii_squared(r_br)); -+ vClipCenter_Radius_BR = precalc_corner(clip.rect.p1 - r_br, -+ r_br, -+ clip.shape.z); - -- vClipCenter_Radius_BL = vec4(clip.rect.p0.x + r_bl.x, -- clip.rect.p1.y - r_bl.y, -- inverse_radii_squared(r_bl)); -+ vClipCenter_Radius_BL = precalc_corner(vec2(clip.rect.p0.x + r_bl.x, -+ clip.rect.p1.y - r_bl.y), -+ r_bl, -+ clip.shape.w); - - // We need to know the half-spaces of the corners separate from the center - // and radius. We compute a point that falls on the diagonal (which is just - // an inner vertex pushed out along one axis, but not on both) to get the - // plane offset of the half-space. We also compute the direction vector of -@@ -132,10 +152,12 @@ - dot(n_bl, vec2(clip.rect.p0.x + r_bl.x, clip.rect.p1.y))); - - vClipPlane_A = vec4(tl.x, tl.y, tl.z, tr.x); - vClipPlane_B = vec4(tr.y, tr.z, br.x, br.y); - vClipPlane_C = vec4(br.z, bl.x, bl.y, bl.z); -+ -+ vClipShape = clip.shape; - #endif - - } - #endif - -@@ -164,22 +186,35 @@ - vec3 plane_tl = vec3(vClipPlane_A.x, vClipPlane_A.y, vClipPlane_A.z); - vec3 plane_tr = vec3(vClipPlane_A.w, vClipPlane_B.x, vClipPlane_B.y); - vec3 plane_br = vec3(vClipPlane_B.z, vClipPlane_B.w, vClipPlane_C.x); - vec3 plane_bl = vec3(vClipPlane_C.y, vClipPlane_C.z, vClipPlane_C.w); - -- float dist = distance_to_rounded_rect( -- clip_local_pos, -- plane_tl, -- vClipCenter_Radius_TL, -- plane_tr, -- vClipCenter_Radius_TR, -- plane_br, -- vClipCenter_Radius_BR, -- plane_bl, -- vClipCenter_Radius_BL, -- vTransformBounds -- ); -+ float dist; -+ if (vClipShape == vec4(1.0)) { -+ dist = distance_to_rounded_rect( -+ clip_local_pos, -+ plane_tl, -+ vClipCenter_Radius_TL, -+ plane_tr, -+ vClipCenter_Radius_TR, -+ plane_br, -+ vClipCenter_Radius_BR, -+ plane_bl, -+ vClipCenter_Radius_BL, -+ vTransformBounds -+ ); -+ } else { -+ dist = distance_to_shaped_rect( -+ clip_local_pos, -+ vClipCenter_Radius_TL, -+ vClipCenter_Radius_TR, -+ vClipCenter_Radius_BR, -+ vClipCenter_Radius_BL, -+ vTransformBounds, -+ vClipShape -+ ); -+ } - #endif - - // Compute AA for the given dist and range. - float alpha = distance_aa(aa_range, dist); - -diff --git a/gfx/wr/webrender/src/border.rs b/gfx/wr/webrender/src/border.rs ---- a/gfx/wr/webrender/src/border.rs -+++ b/gfx/wr/webrender/src/border.rs -@@ -41,19 +41,28 @@ - pub struct BorderRadiusAu { - pub top_left: LayoutSizeAu, - pub top_right: LayoutSizeAu, - pub bottom_left: LayoutSizeAu, - pub bottom_right: LayoutSizeAu, -+ -+ pub shape_top_left: u32, -+ pub shape_top_right: u32, -+ pub shape_bottom_left: u32, -+ pub shape_bottom_right: u32, - } - - impl From for BorderRadiusAu { - fn from(radius: BorderRadius) -> BorderRadiusAu { - BorderRadiusAu { - top_left: radius.top_left.to_au(), - top_right: radius.top_right.to_au(), - bottom_right: radius.bottom_right.to_au(), - bottom_left: radius.bottom_left.to_au(), -+ shape_top_left: radius.shape_top_left.to_bits(), -+ shape_top_right: radius.shape_top_right.to_bits(), -+ shape_bottom_left: radius.shape_bottom_left.to_bits(), -+ shape_bottom_right: radius.shape_bottom_right.to_bits(), - } - } - } - - impl From for BorderRadius { -@@ -61,10 +70,14 @@ - BorderRadius { - top_left: LayoutSize::from_au(radius.top_left), - top_right: LayoutSize::from_au(radius.top_right), - bottom_right: LayoutSize::from_au(radius.bottom_right), - bottom_left: LayoutSize::from_au(radius.bottom_left), -+ shape_top_left: f32::from_bits(radius.shape_top_left), -+ shape_top_right: f32::from_bits(radius.shape_top_right), -+ shape_bottom_left: f32::from_bits(radius.shape_bottom_left), -+ shape_bottom_right: f32::from_bits(radius.shape_bottom_right), - } - } - } - - #[derive(Clone, Debug, Hash, MallocSizeOf, PartialEq, Eq)] -diff --git a/gfx/wr/webrender/src/clip.rs b/gfx/wr/webrender/src/clip.rs ---- a/gfx/wr/webrender/src/clip.rs -+++ b/gfx/wr/webrender/src/clip.rs -@@ -2344,10 +2344,14 @@ - BorderRadius { - top_left: LayoutSize::new(tl, tl), - top_right: LayoutSize::new(tr, tr), - bottom_left: LayoutSize::new(bl, bl), - bottom_right: LayoutSize::new(br, br), -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - } - } - - #[test] - fn test_intersect_identical() { -@@ -2456,10 +2460,14 @@ - let result_rect = rect_a.intersection(&rect_b)?; - if result_rect.is_empty() { - return None; - } - -+ if !radius_a.shapes_all_round() || !radius_b.shapes_all_round() { -+ return None; -+ } -+ - let result_radius = BorderRadius { - top_left: resolve_corner_radius( - result_rect.min.x, result_rect.min.y, - rect_a.min.x, rect_a.min.y, radius_a.top_left, - rect_b.min.x, rect_b.min.y, radius_b.top_left, -@@ -2481,10 +2489,14 @@ - result_rect.max.x, result_rect.max.y, - rect_a.max.x, rect_a.max.y, radius_a.bottom_right, - rect_b.max.x, rect_b.max.y, radius_b.bottom_right, - -1.0, -1.0, - )?, -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - }; - - if !result_radius.can_use_fast_path_in(&result_rect) { - return None; - } -diff --git a/gfx/wr/webrender/src/prim_store/borders.rs b/gfx/wr/webrender/src/prim_store/borders.rs ---- a/gfx/wr/webrender/src/prim_store/borders.rs -+++ b/gfx/wr/webrender/src/prim_store/borders.rs -@@ -549,12 +549,12 @@ - // talos stress tests. If you get a failure here on CI, there's two possibilities: - // (a) You made a structure smaller than it currently is. Great work! Update the - // test expectations and move on. - // (b) You made a structure larger. This is not necessarily a problem, but should only - // be done with care, and after checking if talos performance regresses badly. -- assert_eq!(mem::size_of::(), 84, "NormalBorderPrim size changed"); -- assert_eq!(mem::size_of::(), 140, "NormalBorderTemplate size changed"); -- assert_eq!(mem::size_of::(), 88, "NormalBorderKey size changed"); -+ assert_eq!(mem::size_of::(), 100, "NormalBorderPrim size changed"); -+ assert_eq!(mem::size_of::(), 156, "NormalBorderTemplate size changed"); -+ assert_eq!(mem::size_of::(), 104, "NormalBorderKey size changed"); - assert_eq!(mem::size_of::(), 68, "ImageBorder size changed"); - assert_eq!(mem::size_of::(), 104, "ImageBorderTemplate size changed"); - assert_eq!(mem::size_of::(), 72, "ImageBorderKey size changed"); - } -diff --git a/gfx/wr/webrender/src/quad.rs b/gfx/wr/webrender/src/quad.rs ---- a/gfx/wr/webrender/src/quad.rs -+++ b/gfx/wr/webrender/src/quad.rs -@@ -1748,11 +1748,11 @@ - writer.push_one([mode as i32 as f32, 0.0, 0.0, 0.0]); - let clip_address = writer.finish(); - - (true, clip_address) - } else { -- let mut writer = gpu_buffer.write_blocks(4); -+ let mut writer = gpu_buffer.write_blocks(5); - writer.push_one(clip_instance.clip_rect); - writer.push_one([ - radius.top_left.width, - radius.top_left.height, - radius.top_right.width, -@@ -1763,10 +1763,16 @@ - radius.bottom_left.height, - radius.bottom_right.width, - radius.bottom_right.height, - ]); - writer.push_one([mode as i32 as f32, 0.0, 0.0, 0.0]); -+ writer.push_one([ -+ radius.shape_top_left, -+ radius.shape_top_right, -+ radius.shape_bottom_right, -+ radius.shape_bottom_left, -+ ]); - let clip_address = writer.finish(); - - (false, clip_address) - }; - -diff --git a/gfx/wr/webrender/src/tile_cache/mod.rs b/gfx/wr/webrender/src/tile_cache/mod.rs ---- a/gfx/wr/webrender/src/tile_cache/mod.rs -+++ b/gfx/wr/webrender/src/tile_cache/mod.rs -@@ -1141,10 +1141,14 @@ - BorderRadius { - top_left: so.map_size(&radius.top_left), - top_right: so.map_size(&radius.top_right), - bottom_left: so.map_size(&radius.bottom_left), - bottom_right: so.map_size(&radius.bottom_right), -+ shape_top_left: radius.shape_top_left, -+ shape_top_right: radius.shape_top_right, -+ shape_bottom_left: radius.shape_bottom_left, -+ shape_bottom_right: radius.shape_bottom_right, - }, - ), - ClipSpaceConversion::Transform(..) => unreachable!(), - }; - -@@ -1920,10 +1924,14 @@ - BorderRadius { - top_left: scale_offset.map_size(&radius.top_left), - top_right: scale_offset.map_size(&radius.top_right), - bottom_left: scale_offset.map_size(&radius.bottom_left), - bottom_right: scale_offset.map_size(&radius.bottom_right), -+ shape_top_left: radius.shape_top_left, -+ shape_top_right: radius.shape_top_right, -+ shape_bottom_left: radius.shape_bottom_left, -+ shape_bottom_right: radius.shape_bottom_right, - }, - ) - } - ClipSpaceConversion::Transform(..) => { - unreachable!(); -diff --git a/gfx/wr/webrender_api/src/display_item.rs b/gfx/wr/webrender_api/src/display_item.rs ---- a/gfx/wr/webrender_api/src/display_item.rs -+++ b/gfx/wr/webrender_api/src/display_item.rs -@@ -523,23 +523,41 @@ - pub struct BorderRadius { - pub top_left: LayoutSize, - pub top_right: LayoutSize, - pub bottom_left: LayoutSize, - pub bottom_right: LayoutSize, -+ pub shape_top_left: f32, -+ pub shape_top_right: f32, -+ pub shape_bottom_left: f32, -+ pub shape_bottom_right: f32, - } - - impl Default for BorderRadius { - fn default() -> Self { - BorderRadius { - top_left: LayoutSize::zero(), - top_right: LayoutSize::zero(), - bottom_left: LayoutSize::zero(), - bottom_right: LayoutSize::zero(), -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - } - } - } - -+impl BorderRadius { -+ /// True when every corner uses the default round (ellipse) shape. -+ pub fn shapes_all_round(&self) -> bool { -+ self.shape_top_left == 1.0 && -+ self.shape_top_right == 1.0 && -+ self.shape_bottom_left == 1.0 && -+ self.shape_bottom_right == 1.0 -+ } -+} -+ - #[repr(C)] - #[derive(Clone, Copy, Debug, Default, Deserialize, MallocSizeOf, PartialEq, Serialize, PeekPoke)] - pub struct BorderSide { - pub color: ColorF, - pub style: BorderStyle, -@@ -2069,28 +2087,40 @@ - BorderRadius { - top_left: LayoutSize::new(0.0, 0.0), - top_right: LayoutSize::new(0.0, 0.0), - bottom_left: LayoutSize::new(0.0, 0.0), - bottom_right: LayoutSize::new(0.0, 0.0), -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - } - } - - pub fn uniform(radius: f32) -> BorderRadius { - BorderRadius { - top_left: LayoutSize::new(radius, radius), - top_right: LayoutSize::new(radius, radius), - bottom_left: LayoutSize::new(radius, radius), - bottom_right: LayoutSize::new(radius, radius), -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - } - } - - pub fn uniform_size(radius: LayoutSize) -> BorderRadius { - BorderRadius { - top_left: radius, - top_right: radius, - bottom_left: radius, - bottom_right: radius, -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - } - } - - pub fn all_sides_uniform(&self) -> bool { - let corner_is_uniform = |corner: &LayoutSize| corner.width == corner.height; -@@ -2099,10 +2129,13 @@ - corner_is_uniform(&self.bottom_right) && - corner_is_uniform(&self.bottom_left) - } - - pub fn can_use_fast_path_in(&self, rect: &LayoutRect) -> bool { -+ if !self.shapes_all_round() { -+ return false; -+ } - if !self.all_sides_uniform() { - // The fast path needs uniform sides. - return false; - } - // The shader code that evaluates the rounded corners in the fast path relies on each -diff --git a/gfx/wr/wrench/src/test_invalidation.rs b/gfx/wr/wrench/src/test_invalidation.rs ---- a/gfx/wr/wrench/src/test_invalidation.rs -+++ b/gfx/wr/wrench/src/test_invalidation.rs -@@ -289,10 +289,14 @@ - let expected_radius = BorderRadius { - top_left: LayoutSize::new(20.0, 20.0), - top_right: LayoutSize::new(20.0, 20.0), - bottom_left: LayoutSize::new(15.0, 15.0), - bottom_right: LayoutSize::new(15.0, 15.0), -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - }; - assert_eq!(clip.radius, expected_radius, "Combined clip radii"); - } - - /// Render a YAML file by name (relative to invalidation/), and return the picture cache debug info -diff --git a/gfx/wr/wrench/src/yaml_frame_reader.rs b/gfx/wr/wrench/src/yaml_frame_reader.rs ---- a/gfx/wr/wrench/src/yaml_frame_reader.rs -+++ b/gfx/wr/wrench/src/yaml_frame_reader.rs -@@ -1231,10 +1231,14 @@ - BorderRadius { - top_left: adjust_corner(border_radius.top_left, spread_amount), - top_right: adjust_corner(border_radius.top_right, spread_amount), - bottom_right: adjust_corner(border_radius.bottom_right, spread_amount), - bottom_left: adjust_corner(border_radius.bottom_left, spread_amount), -+ shape_top_left: border_radius.shape_top_left, -+ shape_top_right: border_radius.shape_top_right, -+ shape_bottom_left: border_radius.shape_bottom_left, -+ shape_bottom_right: border_radius.shape_bottom_right, - } - }); - - dl.push_box_shadow( - info, -diff --git a/gfx/wr/wrench/src/yaml_helper.rs b/gfx/wr/wrench/src/yaml_helper.rs ---- a/gfx/wr/wrench/src/yaml_helper.rs -+++ b/gfx/wr/wrench/src/yaml_helper.rs -@@ -477,10 +477,14 @@ - Some(BorderRadius { - top_left, - top_right, - bottom_left, - bottom_right, -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - }) - } - Yaml::Hash(_) => { - let top_left = self["top-left"].as_border_radius_component(); - let top_right = self["top-right"].as_border_radius_component(); -@@ -489,10 +493,14 @@ - Some(BorderRadius { - top_left, - top_right, - bottom_left, - bottom_right, -+ shape_top_left: 1.0, -+ shape_top_right: 1.0, -+ shape_bottom_left: 1.0, -+ shape_bottom_right: 1.0, - }) - } - _ => { - panic!("Invalid border radius specified: {:?}", self); - } -diff --git a/layout/base/ShapeUtils.cpp b/layout/base/ShapeUtils.cpp ---- a/layout/base/ShapeUtils.cpp -+++ b/layout/base/ShapeUtils.cpp -@@ -145,12 +145,13 @@ - - /* static */ - bool ShapeUtils::ComputeRectRadii(const StyleBorderRadius& aBorderRadius, - const nsRect& aRefBox, const nsRect& aRect, - nsRectCornerRadii& aRadii) { -- return nsIFrame::ComputeBorderRadii(aBorderRadius, aRefBox.Size(), -- aRect.Size(), Sides(), aRadii); -+ return nsIFrame::ComputeBorderRadii( -+ aBorderRadius, {{1.0f}, {1.0f}, {1.0f}, {1.0f}}, aRefBox.Size(), -+ aRect.Size(), Sides(), aRadii); - } - - /* static */ - nsTArray ShapeUtils::ComputePolygonVertices( - const StyleBasicShape& aBasicShape, const nsRect& aRefBox) { -diff --git a/layout/generic/TextDrawTarget.h b/layout/generic/TextDrawTarget.h ---- a/layout/generic/TextDrawTarget.h -+++ b/layout/generic/TextDrawTarget.h -@@ -493,11 +493,12 @@ - wr::ToColorF(static_cast(aPattern).mColor); - wr::BorderSide sides[4] = {{color, wr::BorderStyle::Solid}, - {color, wr::BorderStyle::Solid}, - {color, wr::BorderStyle::Solid}, - {color, wr::BorderStyle::Solid}}; -- wr::BorderRadius radius = {{0, 0}, {0, 0}, {0, 0}, {0, 0}}; -+ wr::BorderRadius radius = {{0, 0}, {0, 0}, {0, 0}, {0, 0}, -+ 1.0f, 1.0f, 1.0f, 1.0f}; - LayoutDeviceRect rect = LayoutDeviceRect::FromUnknownRect(aRect); - rect.Inflate(aStrokeOptions.mLineWidth / 2); - if (!rect.Intersects(GeckoClipRect())) { - return; - } -diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h ---- a/layout/generic/nsIFrame.h -+++ b/layout/generic/nsIFrame.h -@@ -1670,10 +1670,11 @@ - * large. - * - * Return whether any radii are nonzero. - */ - static bool ComputeBorderRadii(const mozilla::BorderRadius&, -+ const mozilla::CornerShapeRect&, - const nsSize& aFrameSize, - const nsSize& aBorderArea, Sides aSkipSides, - nsRectCornerRadii&); - - /** -diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp ---- a/layout/generic/nsIFrame.cpp -+++ b/layout/generic/nsIFrame.cpp -@@ -1808,30 +1808,49 @@ - nsRect nsIFrame::GetContentRect() const { - return GetContentRectRelativeToSelf() + GetPosition(); - } - - bool nsIFrame::ComputeBorderRadii(const BorderRadius& aBorderRadius, -+ const CornerShapeRect& aCornerShape, - const nsSize& aFrameSize, - const nsSize& aBorderArea, Sides aSkipSides, - nsRectCornerRadii& aRadii) { - // Percentages are relative to whichever side they're on. - for (const auto i : mozilla::AllPhysicalHalfCorners()) { - const LengthPercentage& c = aBorderRadius.Get(i); - nscoord axis = HalfCornerIsX(i) ? aFrameSize.width : aFrameSize.height; - aRadii[i] = std::max(0, c.Resolve(axis)); - } - -- if (aSkipSides.Intersects(SideBits::eTop | SideBits::eLeft)) { -+ aRadii.mShapeK[mozilla::eCornerTopLeft] = aCornerShape.top_left.k; -+ aRadii.mShapeK[mozilla::eCornerTopRight] = aCornerShape.top_right.k; -+ aRadii.mShapeK[mozilla::eCornerBottomLeft] = aCornerShape.bottom_left.k; -+ aRadii.mShapeK[mozilla::eCornerBottomRight] = aCornerShape.bottom_right.k; -+ -+ bool isTopLeftSquare = -+ isinf(aCornerShape.top_left.k) && (aCornerShape.top_left.k > 0.0f); -+ bool isTopRightSquare = -+ isinf(aCornerShape.top_right.k) && (aCornerShape.top_right.k > 0.0f); -+ bool isBottomLeftSquare = -+ isinf(aCornerShape.bottom_left.k) && (aCornerShape.bottom_left.k > 0.0f); -+ bool isBottomRightSquare = isinf(aCornerShape.bottom_right.k) && -+ (aCornerShape.bottom_right.k > 0.0f); -+ -+ if (aSkipSides.Intersects(SideBits::eTop | SideBits::eLeft) || -+ isTopLeftSquare) { - aRadii.TopLeft() = {}; - } -- if (aSkipSides.Intersects(SideBits::eTop | SideBits::eRight)) { -+ if (aSkipSides.Intersects(SideBits::eTop | SideBits::eRight) || -+ isTopRightSquare) { - aRadii.TopRight() = {}; - } -- if (aSkipSides.Intersects(SideBits::eBottom | SideBits::eLeft)) { -+ if (aSkipSides.Intersects(SideBits::eBottom | SideBits::eLeft) || -+ isBottomLeftSquare) { - aRadii.BottomLeft() = {}; - } -- if (aSkipSides.Intersects(SideBits::eBottom | SideBits::eRight)) { -+ if (aSkipSides.Intersects(SideBits::eBottom | SideBits::eRight) || -+ isBottomRightSquare) { - aRadii.BottomRight() = {}; - } - - // css3-background specifies this algorithm for reducing - // corner radii when they are too big. -@@ -1887,12 +1906,13 @@ - // zero. - return false; - } - - const auto& radii = StyleBorder()->mBorderRadius; -- const bool hasRadii = -- ComputeBorderRadii(radii, aFrameSize, aBorderArea, aSkipSides, aRadii); -+ const auto& cornerShape = StyleBorder()->mCornerShape; -+ const bool hasRadii = ComputeBorderRadii(radii, cornerShape, aFrameSize, -+ aBorderArea, aSkipSides, aRadii); - if (!hasRadii) { - // TODO(emilio): Maybe we can just remove this bit and do the - // IsDefinitelyZero check unconditionally. That should still avoid most of - // the work, though maybe not the cache miss of going through the style and - // the border struct. -diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp ---- a/layout/generic/nsTextFrame.cpp -+++ b/layout/generic/nsTextFrame.cpp -@@ -7156,12 +7156,15 @@ - if (auto* style = - aParams.textPaintStyle->GetSelectionPseudoStyle()) { - nsSize size = LayoutDeviceRect::ToAppUnits(selectionRect, - appUnitsPerDevPixel) - .Size(); -+ -+ const auto& borderRadius = style->StyleBorder()->mBorderRadius; -+ const auto& cornerShape = style->StyleBorder()->mCornerShape; - hasRadii = nsIFrame::ComputeBorderRadii( -- style->StyleBorder()->mBorderRadius, size, size, {}, radii); -+ borderRadius, cornerShape, size, size, {}, radii); - } - } - - if (hasRadii) { - textDrawer->AppendSelectionRoundRect( -diff --git a/layout/painting/nsCSSRendering.cpp b/layout/painting/nsCSSRendering.cpp ---- a/layout/painting/nsCSSRendering.cpp -+++ b/layout/painting/nsCSSRendering.cpp -@@ -484,11 +484,12 @@ - if (&aBorder == aForFrame->StyleBorder() && - frameSize == aOrigBorderArea.Size()) { - haveRoundedCorners = aForFrame->GetBorderRadii(sz, sz, Sides(), aRadii); - } else { - haveRoundedCorners = nsIFrame::ComputeBorderRadii( -- aBorder.mBorderRadius, frameSize, sz, Sides(), aRadii); -+ aBorder.mBorderRadius, aBorder.mCornerShape, frameSize, sz, Sides(), -+ aRadii); - } - - return haveRoundedCorners; - } - -@@ -593,10 +594,11 @@ - RectCornerRadii* oBorderRadii) { - for (const auto corner : mozilla::AllPhysicalCorners()) { - (*oBorderRadii)[corner] = - LayoutDeviceSize::FromAppUnits(aRadii[corner], aAppUnitsPerPixel) - .ToUnknownSize(); -+ oBorderRadii->mShapeK[corner] = aRadii.mShapeK[corner]; - } - } - - static Maybe GetBorderIfVisited(const ComputedStyle& aStyle) { - Maybe result; -diff --git a/layout/style/ServoStyleConstsInlines.h b/layout/style/ServoStyleConstsInlines.h ---- a/layout/style/ServoStyleConstsInlines.h -+++ b/layout/style/ServoStyleConstsInlines.h -@@ -570,10 +570,11 @@ - using Length = StyleLength; - using LengthOrAuto = StyleLengthOrAuto; - using NonNegativeLength = StyleNonNegativeLength; - using NonNegativeLengthOrAuto = StyleNonNegativeLengthOrAuto; - using BorderRadius = StyleBorderRadius; -+using CornerShapeRect = StyleCornerShapeRect; - - bool StyleCSSPixelLength::IsZero() const { return _0 == 0.0f; } - - void StyleCSSPixelLength::ScaleBy(float aScale) { _0 *= aScale; } - -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-backdrop-filter-overflow.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-backdrop-filter-overflow.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-backdrop-filter-overflow.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-backdrop-filter-overflow.html.ini -@@ -1,4 +1,4 @@ - [corner-shape-backdrop-filter-overflow.html] - expected: - if not useDrawSnapshot and asan and not fission and not swgl: TIMEOUT -- if useDrawSnapshot: FAIL -+ FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-bevel-overflow-composite.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-bevel-overflow-composite.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-bevel-overflow-composite.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-bevel-overflow-composite.html.ini -@@ -1,2 +1,3 @@ - [corner-shape-bevel-overflow-composite.html] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-fill.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-fill.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-fill.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-fill.html.ini -@@ -1,2 +1,3 @@ - [corner-shape-fill.html] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-noop-keyframe.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-noop-keyframe.html.ini -new file mode 100644 ---- /dev/null -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-noop-keyframe.html.ini -@@ -0,0 +1,2 @@ -+[corner-shape-noop-keyframe.html] -+ fuzzy: maxDifference=0-13;totalPixels=0-350 -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-notch.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-notch.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-notch.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/corner-shape-notch.html.ini -@@ -1,2 +1,3 @@ - [corner-shape-notch.html] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL -diff --git a/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini b/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini ---- a/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini -+++ b/testing/web-platform/meta/css/css-borders/corner-shape/render-corner-shape.html.ini -@@ -1,125 +1,156 @@ - [render-corner-shape.html?border-radius=50&corner-shape=0&shadow-spread=10] - expected: FAIL - - [render-corner-shape.html?border-radius=40&corner-shape=3&shadow-spread=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-top-left-radius=50%&corner-shape=0.7&border-left-width=30&border-top-width=30] - expected: FAIL - - [render-corner-shape.html?corner-shape=-2&border-radius=20%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=scoop&corner-top-right-shape=scoop&border-radius=50%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=-0.5&border-radius=40] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=notch&border-radius=30&border-width=30] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=scoop&border-radius=20%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-radius=50%&corner-top-right-shape=scoop&corner-bottom-left-shape=scoop&corner-top-left-shape=notch&corner-bottom-right-shape=notch&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-top-right-radius=100&corner-top-right-shape=0&shadow-spread=30] - expected: FAIL - - [render-corner-shape.html?corner-top-left-shape=scoop&border-radius=40] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-right-shape=-4&border-top-right-radius=50] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-right-shape=scoop&border-radius=20%&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=-4&border-radius=40%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=0&corner-top-right-shape=notch&corner-bottom-right-shape=2&corner-bottom-left-shape=-1&border-width=20&shadow-spread=20&border-radius=50] - expected: FAIL - - [render-corner-shape.html?corner-shape=-7&border-radius=20%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-radius=5&corner-top-left-shape=0.5&corner-bottom-right-shape=-0.5&shadow-spread=10] - expected: FAIL - - [render-corner-shape.html?corner-top-left-shape=-4&border-radius=40] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-radius=40&corner-shape=-infinity&shadow-spread=10] - expected: FAIL - - [render-corner-shape.html?border-radius=40&corner-shape=-1.5&shadow-spread=10] - expected: FAIL - - [render-corner-shape.html?corner-shape=-2&border-top-left-radius=40%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-radius=25&corner-shape=2&shadow-spread=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?border-radius=50%&corner-top-left-shape=scoop&corner-bottom-right-shape=scoop&corner-top-right-shape=notch&corner-bottom-left-shape=notch&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=0.8&border-radius=40&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-bottom-left-shape=bevel&border-bottom-left-radius=30] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-radius=50%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=3&border-top-right-radius=33] -- expected: FAIL -- --[render-corner-shape.html?corner-shape=square&border-bottom-left-radius=5] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-bottom-right-shape=bevel&border-width=10&border-radius=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-top-left-radius=25%&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-bottom-right-shape=0.8&border-bottom-right-radius=50%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=2.5&border-radius=20%&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-radius=25%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=bevel&border-radius=40&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-top-right-radius=30] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-bottom-left-shape=bevel&border-width=10&border-radius=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=5&border-radius=20%&border-width=20] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=bevel&corner-bottom-right-shape=bevel&border-radius=40&border-width=10] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=2.3&border-radius=40%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-top-left-shape=0.5&border-radius=40] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - - [render-corner-shape.html?corner-shape=squircle&border-top-left-radius=30%] -- expected: FAIL -+ expected: -+ if useDrawSnapshot: FAIL - diff --git a/src/external-patches/firefox/corner_shape_support/D303334.patch b/src/external-patches/firefox/corner_shape_support/D303334.patch deleted file mode 100644 index 2881312b5..000000000 --- a/src/external-patches/firefox/corner_shape_support/D303334.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/servo/components/style/values/generics/border.rs b/servo/components/style/values/generics/border.rs ---- a/servo/components/style/values/generics/border.rs -+++ b/servo/components/style/values/generics/border.rs -@@ -296,9 +296,9 @@ - pub fn all(s: S) -> Self { - Self { - top_left: s.clone(), - top_right: s.clone(), - bottom_right: s.clone(), -- bottom_left: s.clone(), -+ bottom_left: s, - } - } - } - diff --git a/src/external-patches/firefox/corner_shape_support/D304517.patch b/src/external-patches/firefox/corner_shape_support/D304517.patch deleted file mode 100644 index 8007cb06e..000000000 --- a/src/external-patches/firefox/corner_shape_support/D304517.patch +++ /dev/null @@ -1,38 +0,0 @@ -diff --git a/gfx/wr/glsl-to-cxx/src/hir.rs b/gfx/wr/glsl-to-cxx/src/hir.rs ---- a/gfx/wr/glsl-to-cxx/src/hir.rs -+++ b/gfx/wr/glsl-to-cxx/src/hir.rs -@@ -3531,10 +3531,11 @@ - None, - Type::new(Float), - vec![Type::new(Vec2)], - ); - declare_function(state, "pow", None, Type::new(Vec3), vec![Type::new(Vec3)]); -+ declare_function(state, "pow", None, Type::new(Vec2), vec![Type::new(Vec2)]); - declare_function(state, "pow", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "exp", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "exp2", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "log", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "log2", None, Type::new(Float), vec![Type::new(Float)]); -diff --git a/gfx/wr/swgl/src/glsl.h b/gfx/wr/swgl/src/glsl.h ---- a/gfx/wr/swgl/src/glsl.h -+++ b/gfx/wr/swgl/src/glsl.h -@@ -800,10 +800,18 @@ - - Float pow(Float x, Float y) { - return if_then_else((x == 0) | (x == 1), x, approx_pow2(approx_log2(x) * y)); - } - -+vec2 pow(vec2 a, vec2 b) { -+ return vec2(pow(a.x, b.x), pow(a.y, b.y)); -+} -+ -+vec2_scalar pow(vec2_scalar a, vec2_scalar b) { -+ return vec2_scalar(pow(a.x, b.x), pow(a.y, b.y)); -+} -+ - #define exp __glsl_exp - - SI float exp(float x) { return expf(x); } - - Float exp(Float y) { - diff --git a/src/external-patches/firefox/corner_shape_support/D306773.patch b/src/external-patches/firefox/corner_shape_support/D306773.patch deleted file mode 100644 index c069216a7..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306773.patch +++ /dev/null @@ -1,19 +0,0 @@ -diff --git a/gfx/wr/swgl/src/glsl.h b/gfx/wr/swgl/src/glsl.h ---- a/gfx/wr/swgl/src/glsl.h -+++ b/gfx/wr/swgl/src/glsl.h -@@ -1611,10 +1611,14 @@ - - vec3_scalar make_vec3(const vec2_scalar& v, float z) { - return vec3_scalar{v.x, v.y, z}; - } - -+vec3_scalar make_vec3(float x, const vec2_scalar& v) { -+ return vec3_scalar{x, v.x, v.y}; -+} -+ - vec3_scalar make_vec3(float x, float y, float z) { - return vec3_scalar{x, y, z}; - } - - vec3_scalar make_vec3(int32_t x, int32_t y, float z) { - diff --git a/src/external-patches/firefox/corner_shape_support/D306774.patch b/src/external-patches/firefox/corner_shape_support/D306774.patch deleted file mode 100644 index fb9509b33..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306774.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/gfx/wr/swgl/src/glsl.h b/gfx/wr/swgl/src/glsl.h ---- a/gfx/wr/swgl/src/glsl.h -+++ b/gfx/wr/swgl/src/glsl.h -@@ -1599,10 +1599,17 @@ - x += a.x; - y += a.y; - z += a.z; - return *this; - } -+ -+ vec3& operator*=(Float a) { -+ x *= a; -+ y *= a; -+ z *= a; -+ return *this; -+ } - }; - - vec3_scalar force_scalar(const vec3& v) { - return vec3_scalar{force_scalar(v.x), force_scalar(v.y), force_scalar(v.z)}; - } - diff --git a/src/external-patches/firefox/corner_shape_support/D306775.patch b/src/external-patches/firefox/corner_shape_support/D306775.patch deleted file mode 100644 index 2093edeb4..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306775.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/gfx/wr/swgl/src/glsl.h b/gfx/wr/swgl/src/glsl.h ---- a/gfx/wr/swgl/src/glsl.h -+++ b/gfx/wr/swgl/src/glsl.h -@@ -469,10 +469,15 @@ - vec2_scalar_ref& operator=(const vec2_scalar& a) { - x = a.x; - y = a.y; - return *this; - } -+ vec2_scalar_ref& operator+=(vec2_scalar a) { -+ x += a.x; -+ y += a.y; -+ return *this; -+ } - vec2_scalar_ref& operator*=(vec2_scalar a) { - x *= a.x; - y *= a.y; - return *this; - } - diff --git a/src/external-patches/firefox/corner_shape_support/D306776.patch b/src/external-patches/firefox/corner_shape_support/D306776.patch deleted file mode 100644 index 33ee6f2d8..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306776.patch +++ /dev/null @@ -1,67 +0,0 @@ -diff --git a/gfx/wr/glsl-to-cxx/src/hir.rs b/gfx/wr/glsl-to-cxx/src/hir.rs ---- a/gfx/wr/glsl-to-cxx/src/hir.rs -+++ b/gfx/wr/glsl-to-cxx/src/hir.rs -@@ -3537,10 +3537,12 @@ - declare_function(state, "pow", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "exp", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "exp2", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "log", None, Type::new(Float), vec![Type::new(Float)]); - declare_function(state, "log2", None, Type::new(Float), vec![Type::new(Float)]); -+ declare_function(state, "isnan", None, Type::new(Bool), vec![Type::new(Float)]); -+ declare_function(state, "isinf", None, Type::new(Bool), vec![Type::new(Float)]); - for t in &[Float, Vec2] { - // recip is non-standard - declare_function( - state, - "recip", -diff --git a/gfx/wr/swgl/src/glsl.h b/gfx/wr/swgl/src/glsl.h ---- a/gfx/wr/swgl/src/glsl.h -+++ b/gfx/wr/swgl/src/glsl.h -@@ -205,10 +205,46 @@ - #else - return (Float){sqrtf(v.x), sqrtf(v.y), sqrtf(v.z), sqrtf(v.w)}; - #endif - } - -+// NOTE: the Bool type is actually int under the hood, -+// and is used for bitwise return value masking in the -+// generated code ("ret_mask" variable). -+// -+// The ret_mask is initialized to -1 (0xffffffff), and -+// is then subsequently masked with condition results. -+// -+// If we use the boolean result directly here (0 or 1), -+// the bitwise AND ends up removing just one bit from -+// the mask, and it doesn't work. -+// -+// Taking the negative transforms 1 (single bit) into -1 -+// (all bits 1), and correctly broadcasts the boolean -+// result into all bits of the ret_mask. -+// -+// If the condition is false, 0 becomes -0 which is the -+// same bit pattern for integers (all bits 0). -+ -+SI Bool isnan(Float v) { -+ return (Bool){ -+ -(fpclassify(v.x) == FP_NAN), -+ -(fpclassify(v.y) == FP_NAN), -+ -(fpclassify(v.z) == FP_NAN), -+ -(fpclassify(v.w) == FP_NAN) -+ }; -+} -+ -+SI Bool isinf(Float v) { -+ return (Bool){ -+ -(fpclassify(v.x) == FP_INFINITE), -+ -(fpclassify(v.y) == FP_INFINITE), -+ -(fpclassify(v.z) == FP_INFINITE), -+ -(fpclassify(v.w) == FP_INFINITE) -+ }; -+} -+ - SI float recip(float x) { - #if USE_SSE2 - return _mm_cvtss_f32(_mm_rcp_ss(_mm_set_ss(x))); - #else - return 1.0f / x; - diff --git a/src/external-patches/firefox/corner_shape_support/D306777.patch b/src/external-patches/firefox/corner_shape_support/D306777.patch deleted file mode 100644 index 6326a9efd..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306777.patch +++ /dev/null @@ -1,49 +0,0 @@ -diff --git a/gfx/wr/webrender/res/debug.glsl b/gfx/wr/webrender/res/debug.glsl -new file mode 100644 ---- /dev/null -+++ b/gfx/wr/webrender/res/debug.glsl -@@ -0,0 +1,43 @@ -+/* This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+// Display a signed distance field as color -+// -+// It will be orange outside the shape (positive distance), and blue -+// inside (negative distance). -+// -+// Color will cycle every 10px. -+// -+// The shape outline (distance = 0) is drawn as a thin white outline. -+// -+// NaNs and infinite values will be drawn as red and yellow respectively. -+// -+// Example usage: -+// -+// #include debug -+// -+// void main(void) { -+// float d = compute_some_distance_in_pixels(...); -+// oFragColor = debug_sdf(d); -+// } -+// -+vec4 debug_sdf(float d) { -+ if (isnan(d)) { -+ return vec4(1.0, 0.0, 0.0, 1.0); -+ } -+ if (isinf(d)) { -+ return vec4(1.0, 1.0, 0.0, 1.0); -+ } -+ -+ vec3 color = (d > 0.0) ? vec3(0.9, 0.6, 0.3) : vec3(0.6, 0.8, 1.0); -+ color *= 1.0 - exp(-0.32 * abs(d)); -+ color *= fract(d / 10.0) * 0.4 + 0.6; -+#ifdef SWGL -+ // SWGL doesn't support smoothstep() for now -+ color = mix(color, vec3(1.0), step(abs(d), 2.0)); -+#else -+ color = mix(color, vec3(1.0), smoothstep(2.0, 0.0, abs(d))); -+#endif -+ return vec4(color, 1.0); -+} - diff --git a/src/external-patches/firefox/corner_shape_support/D306778.patch b/src/external-patches/firefox/corner_shape_support/D306778.patch deleted file mode 100644 index 6fcc32e3a..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306778.patch +++ /dev/null @@ -1,456 +0,0 @@ -diff --git a/gfx/wr/wrench/reftests/clip/clip-superellipse.png b/gfx/wr/wrench/reftests/clip/clip-superellipse.png -new file mode 100644 -index 0000000000000000000000000000000000000000..4470f8b707c255bc3e4eb026368945267ee895e6 -GIT binary patch -literal 7953 -zc%1E7dpy(q+pko@P*RT39g>JG<;-rBRz#@W-Oki1IYx78me`i;cIad|q?J+$b*~&^ -z<}j3om6#-t=W@AbK^&-;>g#Pxu@ -zth(%q6)WTqqV{=!-@+9uR(@W$7W_r(iHupXLaX=SKKr9_`QQ3wZulO%+45t{8h3Xe -z*>`Bv`t|Gk)ShiwvF77G_uB_nZphMWb2+o`cH@W3O6y76h16K>j`2z|2sE2k9Jp2eM_9OUQD9X+Vb`Hl$H77&Oh;(PSw-djs53?zp`~CtIbUaSJhp!XX8ZyA`u3Met+#@d*b`fXLUKDIFW{$j#fK84W1(3) -zpHFS?u&unHmouqX#?}$sgj)wyw0=KiEV@s37<;)S=xR5vQ&nW_A4*7+DPT`W1XM6k -zxUZS41?zc68oIKdAU(7*iq@anF;G3vxTvHfD&?{|EnE3NhubG#K~Y&9FVg?oWTqa)+S=PlthZ(d(T2Ej!&_QfAUarL{vb-1xYyH&H%QM<7CL -zKt&Vk&J#J&m+S2cHmp$bMVqWP-LlwctofFu71Y&E)5nr{nYL)NaG#0J#s>*$6W?GW -z8d*kFe4^@0`6pI+Rb%L~sQsa9v(#hYf;2&ViYY@rhEQ^hrxapxIZ2DR+w+Lh9(jz} -z3daHY=xykOB!;^yuQ)%bqSFp7xA}AO2jCt|4Jyv$ng4NIH~Gds6g3-wKj -zU9)NQB=c|8v{t0xuz8qh#Z>{3G3(m+UHXXb_GQ+A7k2FHc7wHkZ>~FJcEr=J>EpEu -zW)k$=WNod+W)Iy_PKfE4xM^b`;N`Oo<2`uqEX%#7i&*!g{mQ=_q#PLgx8T2q;F6=; -zY?~q4gdRHg-WfeJmPh+}k2BMm*IsaLj%kW^LxOy{#UZJoGi`$A>ZMAlMQWxkp`WUH -z%4M7aJZd*kRYwn#_23Z=wenQuQD1U4`4r+lq9mZF{=3oHvKE(mmzKCECW3GqaTVt! -zJJ&b<0Y@+Ah4|EO%U1$b*46IXD+qsjiL;)%0WAkx2GmDeEN~Cl@H^A8*t?d|%nT%# -z-y8hnckyP7N^<2*HR12h!3y=7so6M%+QXFCSHlX_0?h83nb@9QTx$+O_SEn?`C*AvYg4D -zKD37B<>20ozzN}P4iK!qnXtL!CDKK$0_aTe8JNhAq_s-(vl|VMIxqy<{$gKZz -zB`|R*xZU*E-@DvmcjcleLbDo&X!7SZ(V^&a7XL+vDbQvvv_fDaH)2G -zzEyY8zO;$M@*w`l+5h1*s0JBzQjQu&(b8qH -ziA+n?H~xDmIN8F1evF2KM>S*Cc&ES{QOH1v+Z3_WC#fbES4u;D#M)6iePORt&<>=a -zv?4_GwEBZi6s>^bpE}r?>kJzqbWC0Ljz6VYWR^CuMb(NfH|Y+#N;vO;)>+KYK?_uv -z65ARsXo4RI(9JmS=#RZXHSmng`Uv`308cUScoRx<1fL|DMQem!N`czXHx|3qhnW3G -zn;f>B#@z18unz&AV0g$Dewu_TI77W{8kO~@URmW9A&j|$#PD$CnfITp;3il=UFt21 -z-TdiFc3hi`D9e$VVYycNG59iS!gu5pgp!*jWun!6@c6YaT$i!MW1x+hrXWHA1 -zYhV&t8jPw2(L^cQdltJ2BeUwVs<_BN@g~WE8L{N{g7g#to-y0eY=qAyFF9%>RxSUA -zZTkOE(f`i`L1aMfQ2dOX>-K8jYy{6U?+oqGq_%3A)=U^vOUicF3@co}_Lo|)S^RE= -zCT}H29e6~&QN|#ya?dD@oEcnq<%FEh$SZZzwZq^G9aZr=V-}vz8O|I|zHvF*bZ#}w -zrn!eKL*4}U$aqeEqv|$`ckL?93wx2x5zP-LR|S2B*}8}DUThmZ1gif~Iz7)+02;|x -z`GPpSe`1&>W0THle%jSk*V@K`j1B&z{O7H51$B$Q)Zol!dmnft!SDBXtno#13VbLf -z*)-;=nic)X{GE9+ZCX|f)v0P3Y;re`wSa$B43A)-rog(GOzAS~dr|khJ}vMwjCMEN -zp;!*Sw5mWrNH!HzR8a~q+~Tn5;qP^vI(p^4nh6Tv%lK?A{Co>{vw4gd(f7#R0>xIf -zaGY|eq|9V;&_P9suzZT5vU$v(QTwTCrjc1?5Hmj9v3Q*PPIX)X*e}(rAd>SxgMD@= -z3RX*;_cfs`t2ZegH^@jf`HEGs7TC_g7suVAvKoPXQyyS<^-LH^x%IVLVsS4;J2szV -zFO23iLQ3sTC^+e8Bd4ptcC334QJn7o`E8Z;;8r}OG{w(hS$))qq}=pcZSfvMp#a(4 -zGKI~F0S3-L%3&>dhAnYp54P5;2?Ky=&A@H!^mPl=Zs2L+2WQ?gp;}&N9GIZ(!e?p6 -z)$^sa>+P?B5KrFCVX^B!WoGYzJk`VSOi$pHK(gd -zt0_sH=4B+vU}c#8h~0bEcCb7lPcrLzgDhTW0rO&ktxNHO9Iy#=LYsn^caFiIVf`me -zDA(tu(U6(N(@D6Uf=?hSlP;7Tpl|LdcghWaXCpYz`7Y~iQ@vWkhF=tLh=c;d{fi<8 -z@!Vs*Z2&y(zbFt7L;*a%C{hql5le)KByi=Y=8GLVSAq|%=fM+0-;glB=t-HkhIk&b -zun^BKh-WGmJ-cQ?)&sl_2Dzec_y@zW?{J;!8qC!O|}IuvyEl}s`9tE=rwQOva!WN~g7pgoH}4s46aWz5bw@<=%*Q-UPsS8_MJBuKSd0HDQG -zT_68WB6G5)e0GkAB-@sH$uHC}W{+#o%^e@fF9EVCvJ!0(7R2WEUyPpkcFUWIZg0dH;C0K`rh>hQ -z38VbZfLqNdn$R#N$qw6pp|oo&X?Nq3 -zn&if2I|W7^SSb&)Lr -zy10>4JMi3VR>|`{e{iB?#G{ZgyIbH+-i7cE_}P6vtqCbeHx8j8V#aVUVt$K~_71LS -zgvU6UJpW0oo9($;Tc|rZxQ(Gy!R -zVT2Cc;3G~O7uKn4l9Fjt(;b(5)sk)`6(+Rt -z-{`laJND$+^@o1kLw)Sou9fhbpQiuad`*`^V*dqi`gGJv(#vp|$d)_;zYjMII^Ov7 -z>WM8>o9(%nUh}}8hT2`{RNWAc+6u$;A5PSB<$LpNs%K47KfzC~?LXC9ApA`*2p7-7 -zHG*1#e*S~3hSA6S5#)^Fc^2>Zqj^8>x|LqeQhVXqTX23It;>vTiM4pq*4G0t!DwNcqj4_CfY-2BXL<{i6F9E6-J$dSQIAxC&?bDp!5C{i -zk6ak|q$Nu&raUm#gLkYKV2=xRF0kA7Y-LRGC&%I$L~Tb-+Ha<3rk+_F2zKTtz2bz| -z41T`yn<>vurp7asMNhVr9|jD(zndnDSS9u4uW@r!3&ACbK^|gQ*tD?REVvBTPb3`Q -zTamd~o}-0wJ+luiOBZ{SqVMeg;yHc{K;F17@67#}u!l&=pNLnJN>Q -zcNcf@U1e#qnRdd?!D&Q_f)cb_P8x^hWU9r`i69PM$&^gBE?Fz!@x9cfy#)KQ%^;5d -zEUg0n}hDfF4_KJYQ1W -za!*!_KeRxd0+{D0FE7Bj6;<~{9?SN -zQ(;ci$9#EgpRNSiQ;&}iB}mJOW>oF)e?ypVetAw8jtYEoYbL}mZc#BY#} -z$~vS6wGQq2T5X;9lI;Sb*6u{Q-5((!w)^pQR-^W$FXg!`H_K*z-vH2;1ChnMm~Mz` -z^bm)EkdmIx0_Rx(bRMxx8o!Tq=;69k>zKRI(W9TY-UPt)ofVLR}^frW+hG8c7v1 -zHlhum0vABnhGFBG!>Vb;`7GRw2DKBX^$$Es4=!s!*?>MCb&unh2!i13W8yflaVD6= -z@O0&Y$C|SU0<&tC!8riS`j+FkNN7DP9E-ZSQP^gfcQ}vmOM%Fpc}Oyq&GFmq9VDY! -zWCBu6hIx_1_@e#F?Nsc+<$2&L;dUdhv-Io^E<&4hje{fn`NduonP{l!Qn#|A+&WEKBU -z{E?g}33$#yqz6K@KK7iK|K7z3|MolaEun2UdO9EZN3IlKK1wKbvR#4$T)4(DqP|vb -z#+VtRDkcfdR3CTfkmu}be-iC(c)IQF!^VPpYCRQ-X;HI)WgHm!u-I-XqSp+zEKZItvOq=|+SKY2Gv3OWUfnri{~WKD_n8(8~h${OTsW -zt9f8g1FD)!j8`3ge22AAEv)Dp+WH_6f|G}MOFp8Dq#MM-!e3xgrr?%87c{o0ERXMP -z9VLnPZm`B>nCDduq>;$6Zd+Gg4gd0Tc?ZM(5cI&m_W>Mte_rM4mkS^R=!73f{dr?| -z&Q&xiSfC8z!p3GHz}gqw(SWj)tXw5{Nb9eZDu6*~mp-r#1fl~N+5p8U>&Fb0RDVC_ -z%TOuj*S=E8Qn&ii?ep`A@ld)K#;@PtI8P(|kxGz}6o3wElx2KP7=I`Lqygwl#+FHy -z`9CGzuDY7qF?DS?_HCMpUtc`7_>W(ZP&hNPv1On`K2yGwl_9 -z3er(chSueiYc|PXy_xZ|5 -z$jzwr=Cu_wLTGd0@52|J)PFRcvo46B`g!&Z+#?|b`%77$&Ps|2ww`UFXk0Wewe5WY_MwX`_* -z8u!P?jtR-;dV9fN>M6JDvNA?H`gV!!@y}9S&GGY!$ze?Ip -zi8h6G7B4)74@n5C+Kv39n{~e@!1!fWgVqxuWkxNEl?SM0n*W -z68?S*lu+6(wXB8wsEd;p1{ukwF~FO#=$0SV!$lS#%0yt+6t83sfMuF4jBLB~v~RO`zEkXr>T{?vI|)EP_L-VnHzO!-)Y! -z781pWYFUcbFzvkup!r24VY29qWD<`;KrZWpgS9g4981AWOSg`}fS(I}Q|Q!}BeZC`t}Aj8FzgLuYI;5KK$bQWnpJW+>L4yb)+# -zb<-ij%8wI&A@(8bZ8MbPkChX;5dUe?AWIvE;@p4R!9=C}TWwvj2k$VHM>5I@@z9lZ -zpqQ&c!OOXOhDW++<3y0$l>H1j-+hOQ|J(o4{hu+2wQs)L6(GKt=(Ym<9Nh1^ugoFf -G@_zvPNe@N< - -literal 0 -Hc$@%O$L{C7@8`as-|zXoyRP?icvui_ -zCSj(Di3u)v4SNGvU&9|_0nk3G`Gkqd^jpDf)~3|L51LRk^jBiTaC2(*yRyZ3apZG1 -zb8+IQVYlO?jEao?yVx92`Kt3c`^RCCTW7m=kk}g~>IHF2veQPsJB*I4m~!l0nKC%3 -z85}DdyRLfO?0vC}I+&EAdRFBbGuO0HhzYV0%SQCymS;7UcZ=unq?McLJSK7qn?_cq -zB3?8}RtClqXuC;@b0noLB4?v2Um?X#GI|E%pxOx+#W@%H6-537RXGVMK9bQ4%tN4^ -zASpy7x)UPzL*-u)c^oQ#fXIcYJPnacP`M8xe~fzh3a`^7O<5R|Z-*yVJ1ZH8<#%Ug -zJ()IfQcK9fhGt3j5rwtM_#Hc~h*PMx|135X!H$SA&y2-H%uv^5@r*X=>}1Nr#%E -z0d$}lvBa_X4}*AnY$e~UYl@1{f!*err^ret#4^%KLlXKgXXn#7Rq3H;Yh7q+|28R^ -zwkx7Xi&%!PZ-cn84&vrYh!HY?UYlI$!r$ySqd6GH=>T@c#$G6&Uk2oD@!3F*>W~0A -z;u?^h^MKpmHXgXGI3Iz~#m)hb8`R)2HUOBdqV7U9K$L@p&s-03d4VT^AnRTQa=KJt -z4(CLJDtY1tDEE3oISsmJL<9GxQ<*?M-})Zni)Rqkf}pmhPh6x_}% -zuv83kwizuj=YGZwNPCyG0;zO8emnkhhL0kFFz#^tt-sSlCo?l&$4tk`$qg}Y&o;by -zQzI=28Xt)t(hi7MrxO@TW${@j+1Q{=6{gdy)IGmg^H&?COuBPu-=kmZnlA;Q7{kNm -z*s$M`&ujN4=U-;zI<7kB$RO2w+}^_G;f98a_}}iSU%F`&OKshrK99oJ#Pi1F{2md1 -zxErH7KW%`@;SUA;kz)SWgX8A1*a{RYc&BpEHR2yrX6*|wZ{L;g6@2uw_Rl(-C-GpD -z=$^!S|H}E2@0Hc8H7`YoDtGdm%s;c0NrU8qG)Pu;^aax$66edh?pvUZu*A+MgZ$jB -z6c<{FXx5?-F?v0p1zCe=n}z-IV$-p5YkXnK-|ZS#e!{QT+R)gdUFW -zWra5;(vxq8b?Pz$>3y}7J2qe>{hPTOrIAdfb9Jo-axJy}vK_TmKmoJxA|>Iz?1Z<7 -zy2(5;?u}E#>PaO>nMO4b5BY}q5tOb>nBCJfU-!Pl8#|>Z?OwVs!v>*kkP&p(-m;I%;qa0qrEe7z>8D}qO0?Ip9PyG=?R@) -z+;QiHz#iWFYWodYcNcE8+Rm)ABhz9;DRC?wOaEcerviA@Fm)AC -z*}xO$)qITu)r2mz7&x17^S&(Di3mFeC(6PX{s_Bt7mn8bkHXAA^Xa?(Yxy`w)7_^S -TV>Bg#Z@5WtKp0!@_p|UHon4m# - -literal 0 -Hc$@ Option { - match *self { - Yaml::Integer(iv) => Some(iv as f32), - Yaml::Real(ref sv) => f32::from_str(sv.as_str()).ok(), -+ Yaml::String(ref sv) if sv == "+Inf" => Some(f32::INFINITY), -+ Yaml::String(ref sv) if sv == "-Inf" => Some(f32::NEG_INFINITY), - _ => None, - } - } - - fn as_force_f32(&self) -> Option { -@@ -483,24 +485,48 @@ - shape_top_right: 1.0, - shape_bottom_left: 1.0, - shape_bottom_right: 1.0, - }) - } -+ Yaml::Array(ref array) if array.len() == 8 => { -+ let top_left = array[0].as_border_radius_component(); -+ let top_right = array[1].as_border_radius_component(); -+ let bottom_left = array[2].as_border_radius_component(); -+ let bottom_right = array[3].as_border_radius_component(); -+ let shape_top_left = array[4].as_f32().unwrap(); -+ let shape_top_right = array[5].as_f32().unwrap(); -+ let shape_bottom_left = array[6].as_f32().unwrap(); -+ let shape_bottom_right = array[7].as_f32().unwrap(); -+ Some(BorderRadius { -+ top_left, -+ top_right, -+ bottom_left, -+ bottom_right, -+ shape_top_left, -+ shape_top_right, -+ shape_bottom_left, -+ shape_bottom_right, -+ }) -+ } - Yaml::Hash(_) => { - let top_left = self["top-left"].as_border_radius_component(); - let top_right = self["top-right"].as_border_radius_component(); - let bottom_left = self["bottom-left"].as_border_radius_component(); - let bottom_right = self["bottom-right"].as_border_radius_component(); -+ let shape_top_left = self["shape-top-left"].as_f32().unwrap_or(1.0); -+ let shape_top_right = self["shape-top-right"].as_f32().unwrap_or(1.0); -+ let shape_bottom_left = self["shape-bottom-left"].as_f32().unwrap_or(1.0); -+ let shape_bottom_right = self["shape-bottom-right"].as_f32().unwrap_or(1.0); - Some(BorderRadius { - top_left, - top_right, - bottom_left, - bottom_right, -- shape_top_left: 1.0, -- shape_top_right: 1.0, -- shape_bottom_left: 1.0, -- shape_bottom_right: 1.0, -+ shape_top_left, -+ shape_top_right, -+ shape_bottom_left, -+ shape_bottom_right, - }) - } - _ => { - panic!("Invalid border radius specified: {:?}", self); - } - diff --git a/src/external-patches/firefox/corner_shape_support/D306779.patch b/src/external-patches/firefox/corner_shape_support/D306779.patch deleted file mode 100644 index ce05cadd3..000000000 --- a/src/external-patches/firefox/corner_shape_support/D306779.patch +++ /dev/null @@ -1,592 +0,0 @@ -diff --git a/gfx/wr/webrender/res/border_shared.glsl b/gfx/wr/webrender/res/border_shared.glsl -new file mode 100644 ---- /dev/null -+++ b/gfx/wr/webrender/res/border_shared.glsl -@@ -0,0 +1,47 @@ -+/* This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -+ -+#include gpu_buffer -+ -+#define SEGMENT_TOP_LEFT 0 -+#define SEGMENT_TOP_RIGHT 1 -+#define SEGMENT_BOTTOM_RIGHT 2 -+#define SEGMENT_BOTTOM_LEFT 3 -+#define SEGMENT_LEFT 4 -+#define SEGMENT_TOP 5 -+#define SEGMENT_RIGHT 6 -+#define SEGMENT_BOTTOM 7 -+ -+#ifdef WR_VERTEX_SHADER -+ -+PER_INSTANCE in vec2 aTaskOrigin; -+PER_INSTANCE in int aFlags; -+PER_INSTANCE in int aGpuDataAddress; -+PER_INSTANCE in vec4 aClipParams1; -+PER_INSTANCE in vec4 aClipParams2; -+ -+struct BorderInstanceGpuData { -+ vec4 rect; -+ vec4 color0; -+ vec4 color1; -+ vec2 widths; -+ vec2 radii; -+ float shape; -+}; -+ -+BorderInstanceGpuData fetch_gpu_data(int index) { -+ BorderInstanceGpuData data; -+ -+ vec4 texels[5] = fetch_from_gpu_buffer_5f(index); -+ data.rect = texels[0]; -+ data.color0 = texels[1]; -+ data.color1 = texels[2]; -+ data.widths = texels[3].xy; -+ data.radii = texels[3].zw; -+ data.shape = texels[4].x; -+ -+ return data; -+} -+ -+#endif -diff --git a/gfx/wr/webrender/res/cs_border_segment.glsl b/gfx/wr/webrender/res/cs_border_segment.glsl ---- a/gfx/wr/webrender/res/cs_border_segment.glsl -+++ b/gfx/wr/webrender/res/cs_border_segment.glsl -@@ -1,10 +1,10 @@ - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - --#include shared,rect,ellipse -+#include shared,rect,border_shared,ellipse - - // For edges, the colors are the same. For corners, these - // are the colors of each edge making up the corner. - flat varying mediump vec4 vColor00; - flat varying mediump vec4 vColor01; -@@ -44,19 +44,10 @@ - flat varying mediump vec4 vClipParams2; - - // Local space position - varying highp vec2 vPos; - --#define SEGMENT_TOP_LEFT 0 --#define SEGMENT_TOP_RIGHT 1 --#define SEGMENT_BOTTOM_RIGHT 2 --#define SEGMENT_BOTTOM_LEFT 3 --#define SEGMENT_LEFT 4 --#define SEGMENT_TOP 5 --#define SEGMENT_RIGHT 6 --#define SEGMENT_BOTTOM 7 -- - // Border styles as defined in webrender_api/types.rs - #define BORDER_STYLE_NONE 0 - #define BORDER_STYLE_SOLID 1 - #define BORDER_STYLE_DOUBLE 2 - #define BORDER_STYLE_DOTTED 3 -@@ -72,20 +63,10 @@ - #define CLIP_DASH_EDGE 2 - #define CLIP_DOT 3 - - #ifdef WR_VERTEX_SHADER - --PER_INSTANCE in vec2 aTaskOrigin; --PER_INSTANCE in vec4 aRect; --PER_INSTANCE in vec4 aColor0; --PER_INSTANCE in vec4 aColor1; --PER_INSTANCE in int aFlags; --PER_INSTANCE in vec2 aWidths; --PER_INSTANCE in vec2 aRadii; --PER_INSTANCE in vec4 aClipParams1; --PER_INSTANCE in vec4 aClipParams2; -- - vec2 get_outer_corner_scale(int segment) { - vec2 p; - - switch (segment) { - case SEGMENT_TOP_LEFT: -@@ -153,16 +134,18 @@ - - return result; - } - - void main(void) { -+ BorderInstanceGpuData data = fetch_gpu_data(aGpuDataAddress); -+ - int segment = aFlags & 0xff; - int style0 = (aFlags >> 8) & 0xff; - int style1 = (aFlags >> 16) & 0xff; - int clip_mode = (aFlags >> 24) & 0x0f; - -- vec2 size = aRect.zw - aRect.xy; -+ vec2 size = data.rect.zw - data.rect.xy; - vec2 outer_scale = get_outer_corner_scale(segment); - vec2 outer = outer_scale * size; - vec2 clip_sign = 1.0 - 2.0 * outer_scale; - - // Set some flags used by the FS to determine the -@@ -176,19 +159,19 @@ - edge_axis = ivec2(0, 1); - edge_reference = outer; - break; - case SEGMENT_TOP_RIGHT: - edge_axis = ivec2(1, 0); -- edge_reference = vec2(outer.x - aWidths.x, outer.y); -+ edge_reference = vec2(outer.x - data.widths.x, outer.y); - break; - case SEGMENT_BOTTOM_RIGHT: - edge_axis = ivec2(0, 1); -- edge_reference = outer - aWidths; -+ edge_reference = outer - data.widths; - break; - case SEGMENT_BOTTOM_LEFT: - edge_axis = ivec2(1, 0); -- edge_reference = vec2(outer.x, outer.y - aWidths.y); -+ edge_reference = vec2(outer.x, outer.y - data.widths.y); - break; - case SEGMENT_TOP: - case SEGMENT_BOTTOM: - edge_axis = ivec2(1, 1); - break; -@@ -199,23 +182,23 @@ - } - - vSegmentClipMode = vec2(float(segment), float(clip_mode)); - vStyleEdgeAxis = vec4(float(style0), float(style1), float(edge_axis.x), float(edge_axis.y)); - -- vPartialWidths = vec4(aWidths / 3.0, aWidths / 2.0); -+ vPartialWidths = vec4(data.widths / 3.0, data.widths / 2.0); - vPos = size * aPosition.xy; - -- vec4[2] color0 = get_colors_for_side(aColor0, style0); -+ vec4[2] color0 = get_colors_for_side(data.color0, style0); - vColor00 = color0[0]; - vColor01 = color0[1]; -- vec4[2] color1 = get_colors_for_side(aColor1, style1); -+ vec4[2] color1 = get_colors_for_side(data.color1, style1); - vColor10 = color1[0]; - vColor11 = color1[1]; -- vClipCenter_Sign = vec4(outer + clip_sign * aRadii, clip_sign); -- vClipRadii = vec4(aRadii, max(aRadii - aWidths, 0.0)); -- vColorLine = vec4(outer, aWidths.y * -clip_sign.y, aWidths.x * clip_sign.x); -- vEdgeReference = vec4(edge_reference, edge_reference + aWidths); -+ vClipCenter_Sign = vec4(outer + clip_sign * data.radii, clip_sign); -+ vClipRadii = vec4(data.radii, max(data.radii - data.widths, 0.0)); -+ vColorLine = vec4(outer, data.widths.y * -clip_sign.y, data.widths.x * clip_sign.x); -+ vEdgeReference = vec4(edge_reference, edge_reference + data.widths); - vClipParams1 = aClipParams1; - vClipParams2 = aClipParams2; - - // For the case of dot and dash clips, optimize the number of pixels that - // are hit to just include the dot itself. -@@ -234,17 +217,17 @@ - // This is a gross approximation which works out because dashes don't have - // a strong curvature and we will overshoot by inflating the geometry by - // this amount on each side (sqrt(2) * length(dash) would be enough and we - // compute 2 * approx_length(dash)). - float dash_length = length(aClipParams1.xy - aClipParams2.xy); -- float width = max(aWidths.x, aWidths.y); -+ float width = max(data.widths.x, data.widths.y); - // expand by a small amout for AA just like we do for dots. - vec2 r = vec2(max(dash_length, width)) + 2.0; - vPos = clamp(vPos, center - r, center + r); - } - -- gl_Position = uTransform * vec4(aTaskOrigin + aRect.xy + vPos, 0.0, 1.0); -+ gl_Position = uTransform * vec4(aTaskOrigin + data.rect.xy + vPos, 0.0, 1.0); - } - #endif - - #ifdef WR_FRAGMENT_SHADER - vec4 evaluate_color_for_style_in_corner( -diff --git a/gfx/wr/webrender/res/cs_border_solid.glsl b/gfx/wr/webrender/res/cs_border_solid.glsl ---- a/gfx/wr/webrender/res/cs_border_solid.glsl -+++ b/gfx/wr/webrender/res/cs_border_solid.glsl -@@ -1,10 +1,10 @@ - /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - --#include shared,rect,ellipse -+#include shared,rect,border_shared,ellipse - - #define DONT_MIX 0 - #define MIX_AA 1 - #define MIX_NO_AA 2 - -@@ -37,27 +37,12 @@ - flat varying highp vec2 vVerticalClipRadii; - - // Local space position - varying highp vec2 vPos; - --#define SEGMENT_TOP_LEFT 0 --#define SEGMENT_TOP_RIGHT 1 --#define SEGMENT_BOTTOM_RIGHT 2 --#define SEGMENT_BOTTOM_LEFT 3 -- - #ifdef WR_VERTEX_SHADER - --PER_INSTANCE in vec2 aTaskOrigin; --PER_INSTANCE in vec4 aRect; --PER_INSTANCE in vec4 aColor0; --PER_INSTANCE in vec4 aColor1; --PER_INSTANCE in int aFlags; --PER_INSTANCE in vec2 aWidths; --PER_INSTANCE in vec2 aRadii; --PER_INSTANCE in vec4 aClipParams1; --PER_INSTANCE in vec4 aClipParams2; -- - vec2 get_outer_corner_scale(int segment) { - vec2 p; - - switch (segment) { - case SEGMENT_TOP_LEFT: -@@ -80,15 +65,17 @@ - - return p; - } - - void main(void) { -+ BorderInstanceGpuData data = fetch_gpu_data(aGpuDataAddress); -+ - int segment = aFlags & 0xff; - bool do_aa = ((aFlags >> 24) & 0xf0) != 0; - - vec2 outer_scale = get_outer_corner_scale(segment); -- vec2 size = aRect.zw - aRect.xy; -+ vec2 size = data.rect.zw - data.rect.xy; - vec2 outer = outer_scale * size; - vec2 clip_sign = 1.0 - 2.0 * outer_scale; - - int mix_colors; - switch (segment) { -@@ -105,15 +92,15 @@ - } - - vMixColors.x = mix_colors; - vPos = size * aPosition.xy; - -- vColor0 = aColor0; -- vColor1 = aColor1; -- vClipCenter_Sign = vec4(outer + clip_sign * aRadii, clip_sign); -- vClipRadii = vec4(aRadii, max(aRadii - aWidths, 0.0)); -- vColorLine = vec4(outer, aWidths.y * -clip_sign.y, aWidths.x * clip_sign.x); -+ vColor0 = data.color0; -+ vColor1 = data.color1; -+ vClipCenter_Sign = vec4(outer + clip_sign * data.radii, clip_sign); -+ vClipRadii = vec4(data.radii, max(data.radii - data.widths, 0.0)); -+ vColorLine = vec4(outer, data.widths.y * -clip_sign.y, data.widths.x * clip_sign.x); - - vec2 horizontal_clip_sign = vec2(-clip_sign.x, clip_sign.y); - vHorizontalClipCenter_Sign = vec4(aClipParams1.xy + - horizontal_clip_sign * aClipParams1.zw, - horizontal_clip_sign); -@@ -123,11 +110,11 @@ - vVerticalClipCenter_Sign = vec4(aClipParams2.xy + - vertical_clip_sign * aClipParams2.zw, - vertical_clip_sign); - vVerticalClipRadii = aClipParams2.zw; - -- gl_Position = uTransform * vec4(aTaskOrigin + aRect.xy + vPos, 0.0, 1.0); -+ gl_Position = uTransform * vec4(aTaskOrigin + data.rect.xy + vPos, 0.0, 1.0); - } - #endif - - #ifdef WR_FRAGMENT_SHADER - void main(void) { -diff --git a/gfx/wr/webrender/src/border.rs b/gfx/wr/webrender/src/border.rs ---- a/gfx/wr/webrender/src/border.rs -+++ b/gfx/wr/webrender/src/border.rs -@@ -6,13 +6,14 @@ - use api::{NormalBorder as ApiNormalBorder, RepeatMode}; - use api::units::*; - use crate::clip::ClipNodeId; - use crate::ellipse::Ellipse; - use euclid::vec2; -+use crate::renderer::GpuBufferBuilderF; - use crate::scene_building::SceneBuilder; - use crate::spatial_tree::SpatialNodeIndex; --use crate::gpu_types::{BorderInstance, BorderSegment, BrushFlags}; -+use crate::gpu_types::{BorderInstance, BorderInstanceGpuData, BorderSegment, BrushFlags}; - use crate::prim_store::{BorderSegmentInfo, BrushSegment, NinePatchDescriptor}; - use crate::prim_store::borders::NormalBorderPrim; - use crate::util::{lerp, RectHelpers}; - use crate::internal_types::LayoutPrimitiveInfo; - use crate::segment::EdgeMask; -@@ -125,10 +126,11 @@ - #[cfg_attr(feature = "capture", derive(Serialize))] - #[cfg_attr(feature = "replay", derive(Deserialize))] - pub struct BorderSegmentCacheKey { - pub size: LayoutSizeAu, - pub radius: LayoutSizeAu, -+ pub shape: u32, - pub side0: BorderSideAu, - pub side1: BorderSideAu, - pub segment: BorderSegment, - pub do_aa: bool, - pub h_adjacent_corner_outer: LayoutPointAu, -@@ -762,10 +764,11 @@ - ), - border.left, - border.top, - LayoutSize::new(widths.left, widths.top), - border.radius.top_left, -+ border.radius.shape_top_left, - BorderSegment::TopLeft, - EdgeMask::TOP | EdgeMask::LEFT, - rect.top_right(), - border.radius.top_right, - rect.bottom_left(), -@@ -789,10 +792,11 @@ - ), - border.top, - border.right, - LayoutSize::new(widths.right, widths.top), - border.radius.top_right, -+ border.radius.shape_top_right, - BorderSegment::TopRight, - EdgeMask::TOP | EdgeMask::RIGHT, - rect.min, - border.radius.top_left, - rect.max, -@@ -816,10 +820,11 @@ - ), - border.right, - border.bottom, - LayoutSize::new(widths.right, widths.bottom), - border.radius.bottom_right, -+ border.radius.shape_bottom_right, - BorderSegment::BottomRight, - EdgeMask::BOTTOM | EdgeMask::RIGHT, - rect.bottom_left(), - border.radius.bottom_left, - rect.top_right(), -@@ -843,10 +848,11 @@ - ), - border.bottom, - border.left, - LayoutSize::new(widths.left, widths.bottom), - border.radius.bottom_left, -+ border.radius.shape_bottom_left, - BorderSegment::BottomLeft, - EdgeMask::BOTTOM | EdgeMask::LEFT, - rect.max, - border.radius.bottom_right, - rect.min, -@@ -881,30 +887,37 @@ - color1: ColorF, - segment: BorderSegment, - instances: &mut Vec, - widths: DeviceSize, - radius: DeviceSize, -+ shape: f32, - do_aa: bool, - h_adjacent_corner_outer: DevicePoint, - h_adjacent_corner_radius: DeviceSize, - v_adjacent_corner_outer: DevicePoint, - v_adjacent_corner_radius: DeviceSize, -+ gpu_buffer_builder: &mut GpuBufferBuilderF, - ) { - let base_flags = (segment as i32) | - ((style0 as i32) << 8) | - ((style1 as i32) << 16) | - ((do_aa as i32) << 28); - -- let base_instance = BorderInstance { -- task_origin: DevicePoint::zero(), -+ let instance_gpu_data = BorderInstanceGpuData { - local_rect: task_rect, -- flags: base_flags, - color0: color0.premultiplied(), - color1: color1.premultiplied(), - widths, - radius, -+ shape -+ }; -+ -+ let base_instance = BorderInstance { -+ task_origin: DevicePoint::zero(), -+ flags: base_flags, - clip_params: [0.0; 8], -+ gpu_data_address: instance_gpu_data.write(gpu_buffer_builder) - }; - - match segment { - BorderSegment::TopLeft | - BorderSegment::TopRight | -@@ -1018,10 +1031,11 @@ - non_overlapping_rect: LayoutRect, - side0: BorderSide, - side1: BorderSide, - widths: LayoutSize, - radius: LayoutSize, -+ shape: f32, - segment: BorderSegment, - edge_flags: EdgeMask, - h_adjacent_corner_outer: LayoutPoint, - h_adjacent_corner_radius: LayoutSize, - v_adjacent_corner_outer: LayoutPoint, -@@ -1137,10 +1151,11 @@ - do_aa, - side0: side0.into(), - side1: side1.into(), - segment, - radius: radius.to_au(), -+ shape: shape.to_bits(), - size: widths.to_au(), - h_adjacent_corner_outer: (h_corner_outer - image_rect.min).to_point().to_au(), - h_adjacent_corner_radius: h_corner_radius.to_au(), - v_adjacent_corner_outer: (v_corner_outer - image_rect.min).to_point().to_au(), - v_adjacent_corner_radius: v_corner_radius.to_au(), -@@ -1200,10 +1215,11 @@ - cache_key: BorderSegmentCacheKey { - do_aa, - side0: side.into(), - side1: side.into(), - radius: LayoutSizeAu::zero(), -+ shape: 0, - size: size.to_au(), - segment, - h_adjacent_corner_outer: LayoutPointAu::zero(), - h_adjacent_corner_radius: LayoutSizeAu::zero(), - v_adjacent_corner_outer: LayoutPointAu::zero(), -@@ -1217,10 +1233,11 @@ - pub fn build_border_instances( - cache_key: &BorderSegmentCacheKey, - cache_size: DeviceIntSize, - border: &ApiNormalBorder, - scale: LayoutToDeviceScale, -+ gpu_buffer_builder: &mut GpuBufferBuilderF, - ) -> Vec { - let mut instances = Vec::new(); - - let (side0, side1, flip0, flip1) = match cache_key.segment { - BorderSegment::Left => (&border.left, &border.left, false, false), -@@ -1247,10 +1264,11 @@ - let color0 = side0.border_color(flip0); - let color1 = side1.border_color(flip1); - - let widths = (LayoutSize::from_au(cache_key.size) * scale).ceil(); - let radius = (LayoutSize::from_au(cache_key.radius) * scale).ceil(); -+ let shape = f32::from_bits(cache_key.shape); - - let h_corner_outer = (LayoutPoint::from_au(cache_key.h_adjacent_corner_outer) * scale).round(); - let h_corner_radius = (LayoutSize::from_au(cache_key.h_adjacent_corner_radius) * scale).ceil(); - let v_corner_outer = (LayoutPoint::from_au(cache_key.v_adjacent_corner_outer) * scale).round(); - let v_corner_radius = (LayoutSize::from_au(cache_key.v_adjacent_corner_radius) * scale).ceil(); -@@ -1263,15 +1281,17 @@ - color1, - cache_key.segment, - &mut instances, - widths, - radius, -+ shape, - border.do_aa, - h_corner_outer, - h_corner_radius, - v_corner_outer, - v_corner_radius, -+ gpu_buffer_builder, - ); - - instances - } - -diff --git a/gfx/wr/webrender/src/gpu_types.rs b/gfx/wr/webrender/src/gpu_types.rs ---- a/gfx/wr/webrender/src/gpu_types.rs -+++ b/gfx/wr/webrender/src/gpu_types.rs -@@ -192,22 +192,40 @@ - Top, - Right, - Bottom, - } - -+pub struct BorderInstanceGpuData { -+ pub local_rect: DeviceRect, -+ pub color0: PremultipliedColorF, -+ pub color1: PremultipliedColorF, -+ pub widths: DeviceSize, -+ pub radius: DeviceSize, -+ pub shape: f32, -+} -+ -+impl BorderInstanceGpuData { -+ pub fn write(&self, gpu_buffer_builder: &mut GpuBufferBuilderF) -> GpuBufferAddress { -+ let mut writer = gpu_buffer_builder.write_blocks(5); -+ writer.push_one(self.local_rect); -+ writer.push_one(self.color0); -+ writer.push_one(self.color1); -+ writer.push_one([self.widths.width, self.widths.height, self.radius.width, self.radius.height]); -+ writer.push_one([self.shape, 0.0, 0.0, 0.0]); -+ -+ writer.finish() -+ } -+} -+ - #[derive(Debug, Clone)] - #[repr(C)] - #[cfg_attr(feature = "capture", derive(Serialize))] - #[cfg_attr(feature = "replay", derive(Deserialize))] - pub struct BorderInstance { - pub task_origin: DevicePoint, -- pub local_rect: DeviceRect, -- pub color0: PremultipliedColorF, -- pub color1: PremultipliedColorF, - pub flags: i32, -- pub widths: DeviceSize, -- pub radius: DeviceSize, -+ pub gpu_data_address: GpuBufferAddress, - pub clip_params: [f32; 8], - } - - #[derive(Copy, Clone, Debug)] - #[cfg_attr(feature = "capture", derive(Serialize))] -diff --git a/gfx/wr/webrender/src/prim_store/borders.rs b/gfx/wr/webrender/src/prim_store/borders.rs ---- a/gfx/wr/webrender/src/prim_store/borders.rs -+++ b/gfx/wr/webrender/src/prim_store/borders.rs -@@ -230,19 +230,20 @@ - false, // TODO(gw): We don't calculate opacity for borders yet! - RenderTaskParent::Surface, - &mut frame_state.frame_gpu_data.f32, - frame_state.rg_builder, - &mut frame_state.surface_builder, -- &mut |rg_builder, _| { -+ &mut |rg_builder, gpu_buffer_builder| { - rg_builder.add().init(RenderTask::new_dynamic( - cache_size, - RenderTaskKind::new_border_segment( - build_border_instances( - &segment.cache_key, - cache_size, - &self.border, - scale, -+ gpu_buffer_builder, - ) - ), - )) - } - ); -diff --git a/gfx/wr/webrender/src/renderer/vertex.rs b/gfx/wr/webrender/src/renderer/vertex.rs ---- a/gfx/wr/webrender/src/renderer/vertex.rs -+++ b/gfx/wr/webrender/src/renderer/vertex.rs -@@ -63,16 +63,12 @@ - - pub const BORDER: VertexDescriptor = VertexDescriptor { - vertex_attributes: &[VertexAttribute::quad_instance_vertex()], - instance_attributes: &[ - VertexAttribute::f32x2("aTaskOrigin"), -- VertexAttribute::f32x4("aRect"), -- VertexAttribute::f32x4("aColor0"), -- VertexAttribute::f32x4("aColor1"), - VertexAttribute::i32("aFlags"), -- VertexAttribute::f32x2("aWidths"), -- VertexAttribute::f32x2("aRadii"), -+ VertexAttribute::gpu_buffer_address("aGpuDataAddress"), - VertexAttribute::f32x4("aClipParams1"), - VertexAttribute::f32x4("aClipParams2"), - ], - }; - - diff --git a/src/external-patches/manifest.json b/src/external-patches/manifest.json index e75d33907..8f89a255f 100644 --- a/src/external-patches/manifest.json +++ b/src/external-patches/manifest.json @@ -2,24 +2,6 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. [ - { - "type": "phabricator", - "ids": [ - "D296935", - "D303334", - "D297660", - "D304517", - - "D306773", - "D306774", - "D306775", - "D306776", - "D306777", - "D306778", - "D306779" - ], - "name": "Corner shape support" - }, { "type": "phabricator", "id": "D299584",