From 9ee5fffae0b55bbad2c6c87887f78f4a17c96047 Mon Sep 17 00:00:00 2001 From: Joe Vilches Date: Wed, 25 Sep 2024 13:35:56 -0700 Subject: [PATCH] Small perf fix for new iOS view clipping (#46629) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/46629 If we clipped and had no border or corner radius we would end up hitting this path every time. We can optimize this a bit to avoid that. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D63299597 fbshipit-source-id: 90031f964b7669049a4a2efe00a553c888d28cd7 --- .../View/RCTViewComponentView.mm | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm index 0f817e2e6e2..04b2ede4f96 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -1080,15 +1080,10 @@ static RCTBorderStyle RCTBorderStyleFromOutlineStyle(OutlineStyle outlineStyle) } // clipping + self.currentContainerView.layer.mask = nil; if (self.currentContainerView.clipsToBounds) { BOOL clipToPaddingBox = ReactNativeFeatureFlags::enableIOSViewClipToPaddingBox(); - if (clipToPaddingBox) { - CALayer *maskLayer = [self createMaskLayer:RCTCGRectFromRect(_layoutMetrics.getPaddingFrame()) - cornerInsets:RCTGetCornerInsets( - RCTCornerRadiiFromBorderRadii(borderMetrics.borderRadii), - RCTUIEdgeInsetsFromEdgeInsets(borderMetrics.borderWidths))]; - self.currentContainerView.layer.mask = maskLayer; - } else { + if (!clipToPaddingBox) { if (borderMetrics.borderRadii.isUniform()) { self.currentContainerView.layer.cornerRadius = borderMetrics.borderRadii.topLeft.horizontal; } else { @@ -1110,9 +1105,17 @@ static RCTBorderStyle RCTBorderStyleFromOutlineStyle(OutlineStyle outlineStyle) subview.layer.mask = [self createMaskLayer:subview.bounds cornerInsets:cornerInsets]; } } + } else if ( + !borderMetrics.borderWidths.isUniform() || borderMetrics.borderWidths.left != 0 || + !borderMetrics.borderRadii.isUniform()) { + CALayer *maskLayer = [self createMaskLayer:RCTCGRectFromRect(_layoutMetrics.getPaddingFrame()) + cornerInsets:RCTGetCornerInsets( + RCTCornerRadiiFromBorderRadii(borderMetrics.borderRadii), + RCTUIEdgeInsetsFromEdgeInsets(borderMetrics.borderWidths))]; + self.currentContainerView.layer.mask = maskLayer; + } else { + self.currentContainerView.layer.cornerRadius = borderMetrics.borderRadii.topLeft.horizontal; } - } else { - self.currentContainerView.layer.mask = nil; } }