|
@@ -1,522 +0,0 @@
|
|
|
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
-From: Calvin Watford <[email protected]>
|
|
|
-Date: Mon, 9 Dec 2024 16:58:15 -0700
|
|
|
-Subject: feat: Corner Smoothing CSS rule and Blink painting
|
|
|
-
|
|
|
-This patch implements the `-electron-corner-smoothing` CSS rule by
|
|
|
-making three primary changes to Blink:
|
|
|
-
|
|
|
-1. Adds the `-electron-corner-smoothing` CSS rule:
|
|
|
- * Metadata in `blink/renderer/core/css/css_properties.json5`
|
|
|
- * Parsing in `blink/renderer/core/css/properties/longhands/longhands_custom.cc`
|
|
|
- * Other required definitions for all CSS rules (`css_property_id.mojom`, `css_property_equality.cc`)
|
|
|
-
|
|
|
-2. Modifies how Blink paints rounded rectangles:
|
|
|
- * Augments `blink::FloatRoundedRect` to store smoothness & hook into
|
|
|
- drawing smooth corners.
|
|
|
- * Modifies all call sites of `blink::FloatRoundedRect::operator SkRRect`
|
|
|
- to identify and use smooth rounded corners.
|
|
|
-
|
|
|
-3. Adds a renderer preference / web setting:
|
|
|
- * Controls whether the CSS rule is available.
|
|
|
-
|
|
|
-diff --git a/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc b/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
|
|
|
-index 25cf6b544dcee15a9616b6963eaae0264aba3db6..13d5b30d00ce8dca96eb3bc5454f9d353375d4c6 100644
|
|
|
---- a/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
|
|
|
-+++ b/third_party/blink/common/renderer_preferences/renderer_preferences_mojom_traits.cc
|
|
|
-@@ -128,6 +128,8 @@ bool StructTraits<blink::mojom::RendererPreferencesDataView,
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
-+ out->electron_corner_smoothing_css = data.electron_corner_smoothing_css();
|
|
|
-+
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
-diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
|
|
|
-index cae096396b0635f1c4bba6ac8fee47fd957dc698..03db6cddab5cd1b9f3f7c90390bc53baa9e14b65 100644
|
|
|
---- a/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
|
|
|
-+++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences.h
|
|
|
-@@ -91,6 +91,7 @@ struct BLINK_COMMON_EXPORT RendererPreferences {
|
|
|
- bool caret_browsing_enabled{false};
|
|
|
- bool uses_platform_autofill{false};
|
|
|
- std::vector<uint16_t> explicitly_allowed_network_ports;
|
|
|
-+ bool electron_corner_smoothing_css;
|
|
|
-
|
|
|
- RendererPreferences();
|
|
|
- RendererPreferences(const RendererPreferences& other);
|
|
|
-diff --git a/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h b/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h
|
|
|
-index 33b4bd3f0c9488f1013aea026c7fe559ba750cd8..6b4157199c14a4c276e65512e89f2429253aec5c 100644
|
|
|
---- a/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h
|
|
|
-+++ b/third_party/blink/public/common/renderer_preferences/renderer_preferences_mojom_traits.h
|
|
|
-@@ -275,6 +275,11 @@ struct BLINK_COMMON_EXPORT
|
|
|
- return data.explicitly_allowed_network_ports;
|
|
|
- }
|
|
|
-
|
|
|
-+ static const bool& electron_corner_smoothing_css(
|
|
|
-+ const ::blink::RendererPreferences& data) {
|
|
|
-+ return data.electron_corner_smoothing_css;
|
|
|
-+ }
|
|
|
-+
|
|
|
- static bool Read(blink::mojom::RendererPreferencesDataView,
|
|
|
- ::blink::RendererPreferences* out);
|
|
|
- };
|
|
|
-diff --git a/third_party/blink/public/mojom/renderer_preferences.mojom b/third_party/blink/public/mojom/renderer_preferences.mojom
|
|
|
-index bbcec1dcdaaaf932b3d82c64e8aeb2e7c04b05bf..689205607a763c1d6e040069b1357d84e8ba4bd5 100644
|
|
|
---- a/third_party/blink/public/mojom/renderer_preferences.mojom
|
|
|
-+++ b/third_party/blink/public/mojom/renderer_preferences.mojom
|
|
|
-@@ -201,4 +201,6 @@ struct RendererPreferences {
|
|
|
- bool uses_platform_autofill = false;
|
|
|
-
|
|
|
- array<uint16> explicitly_allowed_network_ports;
|
|
|
-+
|
|
|
-+ bool electron_corner_smoothing_css;
|
|
|
- };
|
|
|
-diff --git a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
|
|
|
-index ff34492a1b3e0d57847a35f5921337debdf14d10..02e77d7f080de9311f8ac70e3e935dbd38cb285f 100644
|
|
|
---- a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
|
|
|
-+++ b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
|
|
|
-@@ -48,6 +48,7 @@ enum CSSSampleId {
|
|
|
- kInternalForcedVisitedColor = 0,
|
|
|
- kInternalOverflowBlock = 0,
|
|
|
- kInternalOverflowInline = 0,
|
|
|
-+ kElectronCornerSmoothing = 0,
|
|
|
-
|
|
|
- // This CSSSampleId represents page load for CSS histograms. It is recorded once
|
|
|
- // per page visit for each CSS histogram being logged on the blink side and the
|
|
|
-diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
|
|
|
-index 0255879e4ae048554041ca03891fbc7ba8484187..8248d8f54eb5d35caa39a306a6477ace6597b03a 100644
|
|
|
---- a/third_party/blink/public/web/web_settings.h
|
|
|
-+++ b/third_party/blink/public/web/web_settings.h
|
|
|
-@@ -284,6 +284,7 @@ class WebSettings {
|
|
|
- virtual void SetModalContextMenu(bool) = 0;
|
|
|
- virtual void SetRequireTransientActivationAndAuthorizationForSubAppsAPIs(
|
|
|
- bool) = 0;
|
|
|
-+ virtual void SetCornerSmoothingCSS(bool) = 0;
|
|
|
-
|
|
|
- protected:
|
|
|
- ~WebSettings() = default;
|
|
|
-diff --git a/third_party/blink/renderer/build/scripts/core/css/css_properties.py b/third_party/blink/renderer/build/scripts/core/css/css_properties.py
|
|
|
-index 753ba8990f722bafd1770a5e70307cff3764d3f1..16cec517d72887c089f85867e8e37c03199ab394 100755
|
|
|
---- a/third_party/blink/renderer/build/scripts/core/css/css_properties.py
|
|
|
-+++ b/third_party/blink/renderer/build/scripts/core/css/css_properties.py
|
|
|
-@@ -311,7 +311,13 @@ class CSSProperties(object):
|
|
|
- name_without_leading_dash = property_.name.original
|
|
|
- if name_without_leading_dash.startswith('-'):
|
|
|
- name_without_leading_dash = name_without_leading_dash[1:]
|
|
|
-+ # Extra sort level to avoid -internal-* properties being assigned
|
|
|
-+ # values too large to fit in a byte.
|
|
|
-+ internal_weight = 0
|
|
|
-+ if property_.name.original.startswith('-internal'):
|
|
|
-+ internal_weight = -1
|
|
|
- property_.sorting_key = (-property_.priority,
|
|
|
-+ internal_weight,
|
|
|
- name_without_leading_dash)
|
|
|
-
|
|
|
- sorting_keys = {}
|
|
|
-diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
|
|
|
-index 561cf75a5fc16e94485296e4607df70037e53525..23ece6535cab358fdc8f9dfc1481c1a020475daf 100644
|
|
|
---- a/third_party/blink/renderer/core/css/css_properties.json5
|
|
|
-+++ b/third_party/blink/renderer/core/css/css_properties.json5
|
|
|
-@@ -8732,6 +8732,24 @@
|
|
|
- property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"],
|
|
|
- },
|
|
|
-
|
|
|
-+ {
|
|
|
-+ name: "-electron-corner-smoothing",
|
|
|
-+ property_methods: ["ParseSingleValue"],
|
|
|
-+ field_group: "*",
|
|
|
-+ field_template: "external",
|
|
|
-+ // To keep this patch small, Length is used instead of a more descriptive
|
|
|
-+ // custom type.
|
|
|
-+ // - `system-ui` = `Length::Auto()`
|
|
|
-+ // - percent = `Length::Percent`
|
|
|
-+ type_name: "Length",
|
|
|
-+ converter: "ConvertCornerSmoothing",
|
|
|
-+ keywords: ["system-ui"],
|
|
|
-+ default_value: "Length::None()",
|
|
|
-+ typedom_types: ["Keyword", "Percentage"],
|
|
|
-+ is_border_radius: true,
|
|
|
-+ invalidate: ["paint", "border-radius", "clip"],
|
|
|
-+ },
|
|
|
-+
|
|
|
- // Visited properties.
|
|
|
- {
|
|
|
- name: "-internal-visited-color",
|
|
|
-diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc
|
|
|
-index d0c6c6b54dd773c6d3f8b9767b126689198df4ee..2348a1d8ebb1d734ee8cea32b9d67adf3f5fb605 100644
|
|
|
---- a/third_party/blink/renderer/core/css/css_property_equality.cc
|
|
|
-+++ b/third_party/blink/renderer/core/css/css_property_equality.cc
|
|
|
-@@ -346,6 +346,8 @@ bool CSSPropertyEquality::PropertiesEqual(const PropertyHandle& property,
|
|
|
- return a.DominantBaseline() == b.DominantBaseline();
|
|
|
- case CSSPropertyID::kDynamicRangeLimit:
|
|
|
- return a.GetDynamicRangeLimit() == b.GetDynamicRangeLimit();
|
|
|
-+ case CSSPropertyID::kElectronCornerSmoothing:
|
|
|
-+ return a.ElectronCornerSmoothing() == b.ElectronCornerSmoothing();
|
|
|
- case CSSPropertyID::kEmptyCells:
|
|
|
- return a.EmptyCells() == b.EmptyCells();
|
|
|
- case CSSPropertyID::kFill:
|
|
|
-diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
|
|
|
-index b1b513c8d89055f3e77d406f0d889243b5e7ad7f..2b0a37f496fad6b7b56896cc1811f624e89e9aad 100644
|
|
|
---- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
|
|
|
-+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
|
|
|
-@@ -11826,5 +11826,25 @@ const CSSValue* InternalEmptyLineHeight::ParseSingleValue(
|
|
|
- CSSValueID::kNone>(stream);
|
|
|
- }
|
|
|
-
|
|
|
-+const CSSValue* ElectronCornerSmoothing::ParseSingleValue(
|
|
|
-+ CSSParserTokenStream& stream,
|
|
|
-+ const CSSParserContext& context,
|
|
|
-+ const CSSParserLocalContext&) const {
|
|
|
-+ // Fail parsing if this rule is disabled by document settings.
|
|
|
-+ if (Settings* settings = context.GetDocument()->GetSettings();
|
|
|
-+ settings && !settings->GetElectronCornerSmoothingCSS()) {
|
|
|
-+ return nullptr;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ // Try to parse `system-ui` keyword first.
|
|
|
-+ if (auto* ident =
|
|
|
-+ css_parsing_utils::ConsumeIdent<CSSValueID::kSystemUi>(stream)) {
|
|
|
-+ return ident;
|
|
|
-+ }
|
|
|
-+ // Try to parse as percent.
|
|
|
-+ return css_parsing_utils::ConsumePercent(
|
|
|
-+ stream, context, CSSPrimitiveValue::ValueRange::kNonNegative);
|
|
|
-+}
|
|
|
-+
|
|
|
- } // namespace css_longhand
|
|
|
- } // namespace blink
|
|
|
-diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
|
|
|
-index 26222ba06232da5d98b35173a7ab0e55a3e6d076..92cdc2aed6a68581187ae654358cc7f2b2409cb3 100644
|
|
|
---- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
|
|
|
-+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
|
|
|
-@@ -3875,4 +3875,12 @@ PositionArea StyleBuilderConverter::ConvertPositionArea(
|
|
|
- return PositionArea(span[0], span[1], span[2], span[3]);
|
|
|
- }
|
|
|
-
|
|
|
-+Length StyleBuilderConverter::ConvertCornerSmoothing(StyleResolverState& state, const CSSValue& value) {
|
|
|
-+ auto* ident = DynamicTo<CSSIdentifierValue>(value);
|
|
|
-+ if (ident && ident->GetValueID() == CSSValueID::kSystemUi) {
|
|
|
-+ return Length::Auto();
|
|
|
-+ }
|
|
|
-+ return ConvertLength(state, value);
|
|
|
-+}
|
|
|
-+
|
|
|
- } // namespace blink
|
|
|
-diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
|
|
|
-index c0f4544a38dc486708dec5a4b3646fb3f15ff2e0..8b3d4e95fb690f9e7b38265be0a77d6e49271944 100644
|
|
|
---- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
|
|
|
-+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
|
|
|
-@@ -421,6 +421,8 @@ class StyleBuilderConverter {
|
|
|
- const CSSValue&);
|
|
|
-
|
|
|
- static PositionArea ConvertPositionArea(StyleResolverState&, const CSSValue&);
|
|
|
-+
|
|
|
-+ static Length ConvertCornerSmoothing(StyleResolverState&, const CSSValue&);
|
|
|
- };
|
|
|
-
|
|
|
- template <typename T>
|
|
|
-diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
|
|
|
-index 673bafce059a21da812155ef1c6c5577fe211a91..40dfafd5828cac131bb1b4bbc0c8d64f2d09d4f2 100644
|
|
|
---- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
|
|
|
-+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
|
|
|
-@@ -809,4 +809,8 @@ void WebSettingsImpl::
|
|
|
- is_required);
|
|
|
- }
|
|
|
-
|
|
|
-+void WebSettingsImpl::SetCornerSmoothingCSS(bool available) {
|
|
|
-+ settings_->SetElectronCornerSmoothingCSS(available);
|
|
|
-+}
|
|
|
-+
|
|
|
- } // namespace blink
|
|
|
-diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
|
|
|
-index ea27e0cfabfec4cba6d39b4dbfbaca59cae84f8e..48abf7909b9e6b095d431739094bf8145282a01c 100644
|
|
|
---- a/third_party/blink/renderer/core/exported/web_settings_impl.h
|
|
|
-+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
|
|
|
-@@ -236,6 +236,7 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings {
|
|
|
- void SetModalContextMenu(bool) override;
|
|
|
- void SetRequireTransientActivationAndAuthorizationForSubAppsAPIs(
|
|
|
- bool) override;
|
|
|
-+ void SetCornerSmoothingCSS(bool) override;
|
|
|
-
|
|
|
- bool RenderVSyncNotificationEnabled() const {
|
|
|
- return render_v_sync_notification_enabled_;
|
|
|
-diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
|
|
-index 64f243d595920a87e7115ca8047822a7368752df..1a1b92ae3dd892413c76d3d61a41d33736c04d9f 100644
|
|
|
---- a/third_party/blink/renderer/core/exported/web_view_impl.cc
|
|
|
-+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
|
|
|
-@@ -3579,6 +3579,9 @@ void WebViewImpl::UpdateRendererPreferences(
|
|
|
- #endif
|
|
|
-
|
|
|
- MaybePreloadSystemFonts(GetPage());
|
|
|
-+
|
|
|
-+ GetSettings()->SetCornerSmoothingCSS(
|
|
|
-+ renderer_preferences_.electron_corner_smoothing_css);
|
|
|
- }
|
|
|
-
|
|
|
- void WebViewImpl::SetHistoryIndexAndLength(int32_t history_index,
|
|
|
-diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
|
|
|
-index 6566580ef5e20ac5a66507e6ef625db9258ca906..b36ed88cf2f8c3e1554803caf9fd31c8ac70f733 100644
|
|
|
---- a/third_party/blink/renderer/core/frame/settings.json5
|
|
|
-+++ b/third_party/blink/renderer/core/frame/settings.json5
|
|
|
-@@ -1252,5 +1252,10 @@
|
|
|
- initial: false,
|
|
|
- type: "bool"
|
|
|
- },
|
|
|
-+ {
|
|
|
-+ name: "electronCornerSmoothingCSS",
|
|
|
-+ initial: true,
|
|
|
-+ invalidate: ["Style"],
|
|
|
-+ },
|
|
|
- ],
|
|
|
- }
|
|
|
-diff --git a/third_party/blink/renderer/core/paint/box_border_painter.cc b/third_party/blink/renderer/core/paint/box_border_painter.cc
|
|
|
-index 7996ba931a2482e9941ce4642b2c017c294fe89d..abc87db736b47b1bbaa8b9717b0520a747b1725f 100644
|
|
|
---- a/third_party/blink/renderer/core/paint/box_border_painter.cc
|
|
|
-+++ b/third_party/blink/renderer/core/paint/box_border_painter.cc
|
|
|
-@@ -246,7 +246,7 @@ FloatRoundedRect CalculateAdjustedInnerBorder(
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-- return FloatRoundedRect(new_rect, new_radii);
|
|
|
-+ return FloatRoundedRect(new_rect, new_radii, inner_border.GetSmoothness());
|
|
|
- }
|
|
|
-
|
|
|
- void DrawSolidBorderRect(GraphicsContext& context,
|
|
|
-diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc
|
|
|
-index 5c3e86f6476c58e771b16b485c4f5c0081af3f7b..6e49fcce3c7b6a9664a4a1bd63200fdb85d05980 100644
|
|
|
---- a/third_party/blink/renderer/core/paint/box_painter_base.cc
|
|
|
-+++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
|
|
|
-@@ -319,7 +319,8 @@ void BoxPainterBase::PaintNormalBoxShadow(const PaintInfo& info,
|
|
|
- context.SetDrawLooper(draw_looper_builder.DetachDrawLooper());
|
|
|
-
|
|
|
- if (has_border_radius) {
|
|
|
-- FloatRoundedRect rounded_fill_rect(fill_rect, border.GetRadii());
|
|
|
-+ FloatRoundedRect rounded_fill_rect(fill_rect, border.GetRadii(),
|
|
|
-+ border.GetSmoothness());
|
|
|
- ApplySpreadToShadowShape(rounded_fill_rect, shadow.Spread());
|
|
|
- context.FillRoundedRect(
|
|
|
- rounded_fill_rect, Color::kBlack,
|
|
|
-@@ -403,7 +404,8 @@ void BoxPainterBase::PaintInsetBoxShadow(const PaintInfo& info,
|
|
|
-
|
|
|
- gfx::RectF inner_rect = bounds.Rect();
|
|
|
- AdjustRectForSideClipping(inner_rect, shadow, sides_to_include);
|
|
|
-- FloatRoundedRect inner_rounded_rect(inner_rect, bounds.GetRadii());
|
|
|
-+ FloatRoundedRect inner_rounded_rect(inner_rect, bounds.GetRadii(),
|
|
|
-+ bounds.GetSmoothness());
|
|
|
- ApplySpreadToShadowShape(inner_rounded_rect, -shadow.Spread());
|
|
|
- if (inner_rounded_rect.IsEmpty()) {
|
|
|
- // |AutoDarkMode::Disabled()| is used because |shadow_color| has already
|
|
|
-diff --git a/third_party/blink/renderer/core/paint/rounded_border_geometry.cc b/third_party/blink/renderer/core/paint/rounded_border_geometry.cc
|
|
|
-index 7f4026755c285897a0892edfa40a91201a8a4830..795cece5a853662ede5a7439d17b4bee67d51fff 100644
|
|
|
---- a/third_party/blink/renderer/core/paint/rounded_border_geometry.cc
|
|
|
-+++ b/third_party/blink/renderer/core/paint/rounded_border_geometry.cc
|
|
|
-@@ -52,6 +52,24 @@ FloatRoundedRect::CornerCurvature CalcCurvatureFor(
|
|
|
- EffectiveCurvature(style.CornerBottomLeftShape(), radii.BottomLeft()));
|
|
|
- }
|
|
|
-
|
|
|
-+float SmoothnessFromLength(const Length& length) {
|
|
|
-+ // `none` = 0%
|
|
|
-+ if (length.IsNone()) {
|
|
|
-+ return 0.0f;
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ // `system-ui` keyword, represented internally as "auto" length
|
|
|
-+ if (length.HasAuto()) {
|
|
|
-+#if BUILDFLAG(IS_MAC)
|
|
|
-+ return 0.6f;
|
|
|
-+#else
|
|
|
-+ return 0.0f;
|
|
|
-+#endif // BUILDFLAG(IS_MAC)
|
|
|
-+ }
|
|
|
-+
|
|
|
-+ return length.Percent() / 100.0f;
|
|
|
-+}
|
|
|
-+
|
|
|
- FloatRoundedRect PixelSnappedRoundedBorderInternal(
|
|
|
- const ComputedStyle& style,
|
|
|
- const PhysicalRect& border_rect,
|
|
|
-@@ -64,6 +82,8 @@ FloatRoundedRect PixelSnappedRoundedBorderInternal(
|
|
|
- rounded_rect.ConstrainRadii();
|
|
|
- rounded_rect.SetCornerCurvature(
|
|
|
- CalcCurvatureFor(style, rounded_rect.GetRadii()));
|
|
|
-+ rounded_rect.SetSmoothness(
|
|
|
-+ SmoothnessFromLength(style.ElectronCornerSmoothing()));
|
|
|
- }
|
|
|
- return rounded_rect;
|
|
|
- }
|
|
|
-@@ -80,6 +100,8 @@ FloatRoundedRect RoundedBorderGeometry::RoundedBorder(
|
|
|
- rounded_rect.ConstrainRadii();
|
|
|
- rounded_rect.SetCornerCurvature(
|
|
|
- CalcCurvatureFor(style, rounded_rect.GetRadii()));
|
|
|
-+ rounded_rect.SetSmoothness(
|
|
|
-+ SmoothnessFromLength(style.ElectronCornerSmoothing()));
|
|
|
- }
|
|
|
- return rounded_rect;
|
|
|
- }
|
|
|
-@@ -167,6 +189,8 @@ FloatRoundedRect RoundedBorderGeometry::RoundedInnerBorder(
|
|
|
- .set_right(style.BorderRightWidth())
|
|
|
- .set_bottom(style.BorderBottomWidth())
|
|
|
- .set_left(style.BorderLeftWidth()));
|
|
|
-+ rounded_border.SetSmoothness(
|
|
|
-+ SmoothnessFromLength(style.ElectronCornerSmoothing()));
|
|
|
- return rounded_border;
|
|
|
- }
|
|
|
-
|
|
|
-@@ -214,6 +238,7 @@ FloatRoundedRect RoundedBorderGeometry::PixelSnappedRoundedBorderWithOutsets(
|
|
|
- rounded_rect.SetRadii(pixel_snapped_rounded_border.GetRadii());
|
|
|
- rounded_rect.SetCornerCurvature(
|
|
|
- pixel_snapped_rounded_border.GetCornerCurvature());
|
|
|
-+ rounded_rect.SetSmoothness(pixel_snapped_rounded_border.GetSmoothness());
|
|
|
- }
|
|
|
- return rounded_rect;
|
|
|
- }
|
|
|
-diff --git a/third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.cc b/third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.cc
|
|
|
-index f9f0cc13c043e4653d8a616d0ef4f2f776aace74..6217ca2a6c507c90980be54b1e3d12ce621be099 100644
|
|
|
---- a/third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.cc
|
|
|
-+++ b/third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.cc
|
|
|
-@@ -28,16 +28,16 @@ RoundedInnerRectClipper::RoundedInnerRectClipper(
|
|
|
- rect.Bottom() - clip_rect.Rect().y());
|
|
|
- FloatRoundedRect::Radii top_corner_radii;
|
|
|
- top_corner_radii.SetTopLeft(clip_rect.GetRadii().TopLeft());
|
|
|
-- rounded_rect_clips.push_back(
|
|
|
-- FloatRoundedRect(top_corner, top_corner_radii));
|
|
|
-+ rounded_rect_clips.push_back(FloatRoundedRect(
|
|
|
-+ top_corner, top_corner_radii, clip_rect.GetSmoothness()));
|
|
|
-
|
|
|
- gfx::RectF bottom_corner(rect.X().ToFloat(), rect.Y().ToFloat(),
|
|
|
- clip_rect.Rect().right() - rect.X().ToFloat(),
|
|
|
- clip_rect.Rect().bottom() - rect.Y().ToFloat());
|
|
|
- FloatRoundedRect::Radii bottom_corner_radii;
|
|
|
- bottom_corner_radii.SetBottomRight(clip_rect.GetRadii().BottomRight());
|
|
|
-- rounded_rect_clips.push_back(
|
|
|
-- FloatRoundedRect(bottom_corner, bottom_corner_radii));
|
|
|
-+ rounded_rect_clips.push_back(FloatRoundedRect(
|
|
|
-+ bottom_corner, bottom_corner_radii, clip_rect.GetSmoothness()));
|
|
|
- }
|
|
|
-
|
|
|
- if (!clip_rect.GetRadii().TopRight().IsEmpty() ||
|
|
|
-@@ -47,16 +47,16 @@ RoundedInnerRectClipper::RoundedInnerRectClipper(
|
|
|
- rect.Bottom() - clip_rect.Rect().y());
|
|
|
- FloatRoundedRect::Radii top_corner_radii;
|
|
|
- top_corner_radii.SetTopRight(clip_rect.GetRadii().TopRight());
|
|
|
-- rounded_rect_clips.push_back(
|
|
|
-- FloatRoundedRect(top_corner, top_corner_radii));
|
|
|
-+ rounded_rect_clips.push_back(FloatRoundedRect(
|
|
|
-+ top_corner, top_corner_radii, clip_rect.GetSmoothness()));
|
|
|
-
|
|
|
- gfx::RectF bottom_corner(clip_rect.Rect().x(), rect.Y().ToFloat(),
|
|
|
- rect.Right() - clip_rect.Rect().x(),
|
|
|
- clip_rect.Rect().bottom() - rect.Y().ToFloat());
|
|
|
- FloatRoundedRect::Radii bottom_corner_radii;
|
|
|
- bottom_corner_radii.SetBottomLeft(clip_rect.GetRadii().BottomLeft());
|
|
|
-- rounded_rect_clips.push_back(
|
|
|
-- FloatRoundedRect(bottom_corner, bottom_corner_radii));
|
|
|
-+ rounded_rect_clips.push_back(FloatRoundedRect(
|
|
|
-+ bottom_corner, bottom_corner_radii, clip_rect.GetSmoothness()));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
|
|
|
-index 8546d85128cc970cb2fd7b0b98642c1403fa5c7d..59f503cbde358d999ffc3a8499a94e1f785d7bed 100644
|
|
|
---- a/third_party/blink/renderer/platform/BUILD.gn
|
|
|
-+++ b/third_party/blink/renderer/platform/BUILD.gn
|
|
|
-@@ -1634,6 +1634,8 @@ component("platform") {
|
|
|
- "widget/widget_base.h",
|
|
|
- "widget/widget_base_client.h",
|
|
|
- "windows_keyboard_codes.h",
|
|
|
-+ "//electron/shell/renderer/electron_smooth_round_rect.h",
|
|
|
-+ "//electron/shell/renderer/electron_smooth_round_rect.cc",
|
|
|
- ]
|
|
|
-
|
|
|
- sources -= blink_platform_avx_files
|
|
|
-diff --git a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
|
|
|
-index 7bf6608b57f8fc2283026dac6bff0c81bca380fd..09f34525343dacacf966f7ab4918ee57ae0c1470 100644
|
|
|
---- a/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
|
|
|
-+++ b/third_party/blink/renderer/platform/geometry/float_rounded_rect.h
|
|
|
-@@ -197,15 +197,19 @@ class PLATFORM_EXPORT FloatRoundedRect {
|
|
|
- : rect_(rect), radii_(radius) {}
|
|
|
- FloatRoundedRect(const gfx::RectF& r, float radius_x, float radius_y)
|
|
|
- : FloatRoundedRect(r, Radii(radius_x, radius_y)) {}
|
|
|
-+ FloatRoundedRect(const gfx::RectF& r, const Radii& radii, float smoothness)
|
|
|
-+ : rect_(r), radii_(radii), smoothness_(smoothness) {}
|
|
|
-
|
|
|
- constexpr const gfx::RectF& Rect() const { return rect_; }
|
|
|
- constexpr const Radii& GetRadii() const { return radii_; }
|
|
|
- constexpr const CornerCurvature& GetCornerCurvature() const {
|
|
|
- return corner_curvature_;
|
|
|
- }
|
|
|
-+ constexpr float GetSmoothness() const { return smoothness_; }
|
|
|
- constexpr bool IsRounded() const { return !radii_.IsZero(); }
|
|
|
-+ constexpr bool IsSmooth() const { return smoothness_ > 0.0f; }
|
|
|
- constexpr bool HasSimpleRoundedCurvature() const {
|
|
|
-- return !IsRounded() || corner_curvature_.IsRound();
|
|
|
-+ return !IsRounded() || (corner_curvature_.IsRound() && !IsSmooth());
|
|
|
- }
|
|
|
- constexpr bool IsEmpty() const { return rect_.IsEmpty(); }
|
|
|
-
|
|
|
-@@ -214,6 +218,7 @@ class PLATFORM_EXPORT FloatRoundedRect {
|
|
|
- void SetCornerCurvature(const CornerCurvature& curvature) {
|
|
|
- corner_curvature_ = curvature;
|
|
|
- }
|
|
|
-+ void SetSmoothness(float smoothness) { smoothness_ = smoothness; }
|
|
|
-
|
|
|
- void Move(const gfx::Vector2dF& offset) { rect_.Offset(offset); }
|
|
|
-
|
|
|
-@@ -297,6 +302,7 @@ class PLATFORM_EXPORT FloatRoundedRect {
|
|
|
- gfx::RectF rect_;
|
|
|
- Radii radii_;
|
|
|
- CornerCurvature corner_curvature_;
|
|
|
-+ float smoothness_ = 0.0f;
|
|
|
- };
|
|
|
-
|
|
|
- inline FloatRoundedRect::operator SkRRect() const {
|
|
|
-diff --git a/third_party/blink/renderer/platform/geometry/path.cc b/third_party/blink/renderer/platform/geometry/path.cc
|
|
|
-index 96a1f38db9f42e8d47d70b82b6e1ee8034b96b47..08bc720fe0337f947461d74e29f7ce6f35509643 100644
|
|
|
---- a/third_party/blink/renderer/platform/geometry/path.cc
|
|
|
-+++ b/third_party/blink/renderer/platform/geometry/path.cc
|
|
|
-@@ -33,6 +33,7 @@
|
|
|
-
|
|
|
- #include <algorithm>
|
|
|
-
|
|
|
-+#include "electron/shell/renderer/electron_smooth_round_rect.h"
|
|
|
- #include "third_party/blink/renderer/platform/geometry/skia_geometry_utils.h"
|
|
|
- #include "third_party/blink/renderer/platform/geometry/stroke_data.h"
|
|
|
- #include "third_party/blink/renderer/platform/transforms/affine_transform.h"
|
|
|
-@@ -657,6 +658,18 @@ void Path::AddRoundedRect(const FloatRoundedRect& rect, bool clockwise) {
|
|
|
- // no canvas API (at this moment) to change corner curvature.
|
|
|
- DCHECK(clockwise);
|
|
|
-
|
|
|
-+ // TODO(clavin): decompose `electron::DrawSmoothRoundRect` into corners
|
|
|
-+ if (rect.IsSmooth()) {
|
|
|
-+ const gfx::RectF& box = rect.Rect();
|
|
|
-+ const FloatRoundedRect::Radii& radii = rect.GetRadii();
|
|
|
-+ path_.addPath(electron::DrawSmoothRoundRect(
|
|
|
-+ box.x(), box.y(), box.width(), box.height(),
|
|
|
-+ std::min(rect.GetSmoothness(), 1.0f), radii.TopLeft().width(),
|
|
|
-+ radii.TopRight().width(), radii.BottomRight().width(),
|
|
|
-+ radii.BottomLeft().width()));
|
|
|
-+ return;
|
|
|
-+ }
|
|
|
-+
|
|
|
- path_.moveTo(gfx::PointFToSkPoint(rect.TopLeftCorner().top_right()));
|
|
|
-
|
|
|
- path_.lineTo(gfx::PointFToSkPoint((rect.TopRightCorner().origin())));
|
|
|
-diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc
|
|
|
-index 5d7887ae589af529a9f4c3e29b9fa314903e26bb..0d2f753a3b189bae69729b4da3cc2af72a98453a 100644
|
|
|
---- a/third_party/blink/renderer/platform/graphics/graphics_context.cc
|
|
|
-+++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
|
|
|
-@@ -819,6 +819,13 @@ void GraphicsContext::FillRoundedRect(const FloatRoundedRect& rrect,
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
-+ if (!rrect.HasSimpleRoundedCurvature()) {
|
|
|
-+ Path path;
|
|
|
-+ path.AddRoundedRect(rrect);
|
|
|
-+ FillPath(path, auto_dark_mode);
|
|
|
-+ return;
|
|
|
-+ }
|
|
|
-+
|
|
|
- const cc::PaintFlags& fill_flags = ImmutableState()->FillFlags();
|
|
|
- const SkColor4f sk_color = color.toSkColor4f();
|
|
|
- if (sk_color == fill_flags.getColor4f()) {
|