From 3de44e7d51d497b17e5df4b5c217ca63ddd1d291 Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Thu, 11 May 2023 05:30:57 -0700 Subject: [PATCH] Add `hasErrata()`, `addErrata()`, `removeErrata()` (#37375) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/37375 Adds internal helpers to YGConfig to make bit manipulation more readable. We also expose `hasErrata()` to YGNode beacuse checking that will be a common pattern. We intentionally don't add mutating functions to the node, since current model is to inval a node on commiting whole config. This is not exposed via the C ABI. Reviewed By: yungsters Differential Revision: D45765971 fbshipit-source-id: eadaee4b9cf5204ac4984ecc52cc08650d144a30 --- .../react-native/ReactCommon/yoga/yoga/YGConfig.cpp | 12 ++++++++++++ .../react-native/ReactCommon/yoga/yoga/YGConfig.h | 3 +++ packages/react-native/ReactCommon/yoga/yoga/YGNode.h | 2 ++ packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp | 8 ++++---- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp index 687ee314402..5bf85f4a1b8 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.cpp @@ -59,10 +59,22 @@ void YGConfig::setErrata(YGErrata errata) { errata_ = errata; } +void YGConfig::addErrata(YGErrata errata) { + errata_ |= errata; +} + +void YGConfig::removeErrata(YGErrata errata) { + errata_ &= (~errata); +} + YGErrata YGConfig::getErrata() const { return errata_; } +bool YGConfig::hasErrata(YGErrata errata) const { + return (errata_ & errata) != YGErrataNone; +} + void YGConfig::setPointScaleFactor(float pointScaleFactor) { pointScaleFactor_ = pointScaleFactor; } diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h index 5f82e3f2291..d7c7f49fde9 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGConfig.h @@ -67,7 +67,10 @@ struct YOGA_EXPORT YGConfig { facebook::yoga::ExperimentalFeatureSet getEnabledExperiments() const; void setErrata(YGErrata errata); + void addErrata(YGErrata errata); + void removeErrata(YGErrata errata); YGErrata getErrata() const; + bool hasErrata(YGErrata errata) const; void setPointScaleFactor(float pointScaleFactor); float getPointScaleFactor() const; diff --git a/packages/react-native/ReactCommon/yoga/yoga/YGNode.h b/packages/react-native/ReactCommon/yoga/yoga/YGNode.h index 6f9cab38e5b..e3c202f2b9f 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/YGNode.h +++ b/packages/react-native/ReactCommon/yoga/yoga/YGNode.h @@ -118,6 +118,8 @@ public: float baseline(float width, float height, void* layoutContext); + bool hasErrata(YGErrata errata) const { return config_->hasErrata(errata); } + YGDirtiedFunc getDirtied() const { return dirtied_; } // For Performance reasons passing as reference. diff --git a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp index bf30d41cdb7..1eccddbd0f9 100644 --- a/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp +++ b/packages/react-native/ReactCommon/yoga/yoga/Yoga.cpp @@ -2984,7 +2984,7 @@ static void YGNodelayoutImpl( availableInnerMainDim = maxInnerMainDim; } else { bool useLegacyStretchBehaviour = - node->getConfig()->getErrata() & YGErrataStretchFlexBasis; + node->hasErrata(YGErrataStretchFlexBasis); if (!useLegacyStretchBehaviour && ((!YGFloatIsUndefined( @@ -4313,16 +4313,16 @@ YOGA_EXPORT void YGConfigSetUseWebDefaults( YOGA_EXPORT bool YGConfigGetUseLegacyStretchBehaviour( const YGConfigRef config) { - return config->getErrata() & YGErrataStretchFlexBasis; + return config->hasErrata(YGErrataStretchFlexBasis); } YOGA_EXPORT void YGConfigSetUseLegacyStretchBehaviour( const YGConfigRef config, const bool useLegacyStretchBehaviour) { if (useLegacyStretchBehaviour) { - config->setErrata(config->getErrata() | YGErrataStretchFlexBasis); + config->addErrata(YGErrataStretchFlexBasis); } else { - config->setErrata(config->getErrata() & ~YGErrataStretchFlexBasis); + config->removeErrata(YGErrataStretchFlexBasis); } }