From a1fbbc6070a25530ab020efedc7cb62f84bcdd3f Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Mon, 8 May 2023 16:30:06 -0700 Subject: [PATCH] Fix YGNodeSetConfig causing excessive dirtying Summary: X-link: https://github.com/facebook/react-native/pull/37316 In Fabric, a ShadowNode may re-initialize YGConfig several times throughout the lifetime of a perpetually cloned Yoga Node. RN sets `pointScaleFactor` lazily, when laying out the rootview. So right now it initializes a config to `pointScaleFactor` of 1.0, sets it, sets a new `pointScaleFactor` on the config, then repeats. This cycles the config between two `pointScaleFactor` values and will excessively dirty the node now that `YGNodeSetConfig` dirties on config change (D45505089) This change makes it so that we retain previously used `pointScaleFactor` when cloning the Yoga nodes. Changelog: [Internal] Reviewed By: rozele Differential Revision: D45669878 fbshipit-source-id: bfd2e185d9264a1cda64e59132960060385e16f1 --- yoga/Yoga.cpp | 4 ++++ yoga/Yoga.h | 1 + 2 files changed, 5 insertions(+) diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index d9863a2f..8e2fdb4d 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -4075,6 +4075,10 @@ YOGA_EXPORT void YGConfigSetPointScaleFactor( } } +YOGA_EXPORT float YGConfigGetPointScaleFactor(const YGConfigRef config) { + return config->getPointScaleFactor(); +} + static void YGRoundToPixelGrid( const YGNodeRef node, const double pointScaleFactor, diff --git a/yoga/Yoga.h b/yoga/Yoga.h index 1beb320e..de07aeac 100644 --- a/yoga/Yoga.h +++ b/yoga/Yoga.h @@ -317,6 +317,7 @@ WIN_EXPORT void YGAssertWithConfig( WIN_EXPORT void YGConfigSetPointScaleFactor( YGConfigRef config, float pixelsInPoint); +WIN_EXPORT float YGConfigGetPointScaleFactor(YGConfigRef config); // Yoga previously had an error where containers would take the maximum space // possible instead of the minimum like they are supposed to. In practice this