From 07b7953af1436602d27c024367d7d0b9d348f3d9 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 2f0e23f5209..a67786fb650 100644 --- a/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm +++ b/packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm @@ -1003,15 +1003,10 @@ static RCTBorderStyle RCTBorderStyleFromBorderStyle(BorderStyle borderStyle) } // 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 { @@ -1033,9 +1028,17 @@ static RCTBorderStyle RCTBorderStyleFromBorderStyle(BorderStyle borderStyle) 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; } }