From e3645ab8fcaaae4146c5475419028ff8d5d3012c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 2 Oct 2026 03:59:08 -0700 Subject: [PATCH 1/3] Move leaf View parsers out of headers Summary: Move View CSS parsing implementation details for color and length coercion, box shadows, and filters from exported headers into compiled source files. Keep only the supported `coerceColor`, `coerceLength`, and `fromRawValue` declarations in public headers while preserving existing parsing behavior. Update existing conversion tests to exercise the same paths through the public entry points, and regenerate the C++ API snapshots to remove private helper declarations. Changelog: [Internal] Differential Revision: D119507169 --- .../view/BackgroundImagePropsConversions.cpp | 18 +- .../view/BoxShadowPropsConversions.cpp | 281 ++++++++++++ .../view/BoxShadowPropsConversions.h | 250 +--------- .../components/view/CSSConversions.cpp | 57 +++ .../renderer/components/view/CSSConversions.h | 81 +--- .../view/FilterPropsConversions.cpp | 434 ++++++++++++++++++ .../components/view/FilterPropsConversions.h | 353 +------------- .../components/view/tests/ConversionsTest.cpp | 91 ++-- .../api-snapshots/ReactAndroidDebugCxx.api | 17 - .../api-snapshots/ReactAndroidNewarchCxx.api | 17 - .../api-snapshots/ReactAndroidReleaseCxx.api | 17 - .../api-snapshots/ReactAppleDebugCxx.api | 17 - .../api-snapshots/ReactAppleNewarchCxx.api | 17 - .../api-snapshots/ReactAppleReleaseCxx.api | 17 - .../api-snapshots/ReactCommonDebugCxx.api | 17 - .../api-snapshots/ReactCommonNewarchCxx.api | 17 - .../api-snapshots/ReactCommonReleaseCxx.api | 17 - 17 files changed, 851 insertions(+), 867 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.cpp create mode 100644 packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.cpp create mode 100644 packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.cpp diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.cpp index 7759acebe2a6..d72c64a2548b 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.cpp @@ -438,20 +438,32 @@ void fromCSSColorStop( // first stop with start position colorStops.push_back( ColorStop{ - .color = fromCSSColor(colorStop.color), + .color = colorFromRGBA( + colorStop.color.r, + colorStop.color.g, + colorStop.color.b, + colorStop.color.a), .position = convertLengthPercentageToValueUnit( *colorStop.startPosition)}); // second stop with end position (same color) colorStops.push_back( ColorStop{ - .color = fromCSSColor(colorStop.color), + .color = colorFromRGBA( + colorStop.color.r, + colorStop.color.g, + colorStop.color.b, + colorStop.color.a), .position = convertLengthPercentageToValueUnit(*colorStop.endPosition)}); } else { // single color stop ColorStop stop; - stop.color = fromCSSColor(colorStop.color); + stop.color = colorFromRGBA( + colorStop.color.r, + colorStop.color.g, + colorStop.color.b, + colorStop.color.a); // handle start position if present if (colorStop.startPosition.has_value()) { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.cpp new file mode 100644 index 000000000000..f9d90fe32ce4 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.cpp @@ -0,0 +1,281 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "BoxShadowPropsConversions.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +namespace { + +void parseProcessedBoxShadow( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + react_native_expect(value.hasType>()); + if (!value.hasType>()) { + result = {}; + return; + } + + std::vector boxShadows{}; + auto rawBoxShadows = static_cast>(value); + for (const auto& rawBoxShadow : rawBoxShadows) { + bool isMap = + rawBoxShadow.hasType>(); + react_native_expect(isMap); + if (!isMap) { + // If any box shadow is malformed then we should not apply any of them + // which is the web behavior. + result = {}; + return; + } + + auto rawBoxShadowMap = + static_cast>(rawBoxShadow); + BoxShadow boxShadow{}; + auto offsetX = rawBoxShadowMap.find("offsetX"); + react_native_expect(offsetX != rawBoxShadowMap.end()); + if (offsetX == rawBoxShadowMap.end()) { + result = {}; + return; + } + react_native_expect(offsetX->second.hasType()); + if (!offsetX->second.hasType()) { + result = {}; + return; + } + boxShadow.offsetX = (Float)offsetX->second; + + auto offsetY = rawBoxShadowMap.find("offsetY"); + react_native_expect(offsetY != rawBoxShadowMap.end()); + if (offsetY == rawBoxShadowMap.end()) { + result = {}; + return; + } + react_native_expect(offsetY->second.hasType()); + if (!offsetY->second.hasType()) { + result = {}; + return; + } + boxShadow.offsetY = (Float)offsetY->second; + + auto blurRadius = rawBoxShadowMap.find("blurRadius"); + if (blurRadius != rawBoxShadowMap.end()) { + react_native_expect(blurRadius->second.hasType()); + if (!blurRadius->second.hasType()) { + result = {}; + return; + } + boxShadow.blurRadius = (Float)blurRadius->second; + } + + auto spreadDistance = rawBoxShadowMap.find("spreadDistance"); + if (spreadDistance != rawBoxShadowMap.end()) { + react_native_expect(spreadDistance->second.hasType()); + if (!spreadDistance->second.hasType()) { + result = {}; + return; + } + boxShadow.spreadDistance = (Float)spreadDistance->second; + } + + auto inset = rawBoxShadowMap.find("inset"); + if (inset != rawBoxShadowMap.end()) { + react_native_expect(inset->second.hasType()); + if (!inset->second.hasType()) { + result = {}; + return; + } + boxShadow.inset = (bool)inset->second; + } + + auto color = rawBoxShadowMap.find("color"); + if (color != rawBoxShadowMap.end()) { + fromRawValue( + context.contextContainer, + context.surfaceId, + color->second, + boxShadow.color); + } + + boxShadows.push_back(boxShadow); + } + + result = boxShadows; +} + +std::optional fromCSSShadow(const CSSShadow& cssShadow) { + // TODO: handle non-px values + if (cssShadow.offsetX.unit != CSSLengthUnit::Px || + cssShadow.offsetY.unit != CSSLengthUnit::Px || + cssShadow.blurRadius.unit != CSSLengthUnit::Px || + cssShadow.spreadDistance.unit != CSSLengthUnit::Px) { + return {}; + } + + return BoxShadow{ + .offsetX = cssShadow.offsetX.value, + .offsetY = cssShadow.offsetY.value, + .blurRadius = cssShadow.blurRadius.value, + .spreadDistance = cssShadow.spreadDistance.value, + .color = colorFromRGBA( + cssShadow.color.r, + cssShadow.color.g, + cssShadow.color.b, + cssShadow.color.a), + .inset = cssShadow.inset, + }; +} + +void parseUnprocessedBoxShadowString( + std::string&& value, + std::vector& result) { + auto boxShadowList = parseCSSProperty((std::string)value); + if (!std::holds_alternative(boxShadowList)) { + result = {}; + return; + } + + for (const auto& cssShadow : std::get(boxShadowList)) { + if (auto boxShadow = fromCSSShadow(cssShadow)) { + result.push_back(*boxShadow); + } else { + result = {}; + return; + } + } +} + +std::optional parseBoxShadowRawValue( + const PropsParserContext& context, + const RawValue& value) { + if (!value.hasType>()) { + return {}; + } + + auto boxShadow = std::unordered_map(value); + auto rawOffsetX = boxShadow.find("offsetX"); + if (rawOffsetX == boxShadow.end()) { + return {}; + } + auto offsetX = coerceLength(rawOffsetX->second); + if (!offsetX.has_value()) { + return {}; + } + + auto rawOffsetY = boxShadow.find("offsetY"); + if (rawOffsetY == boxShadow.end()) { + return {}; + } + auto offsetY = coerceLength(rawOffsetY->second); + if (!offsetY.has_value()) { + return {}; + } + + Float blurRadius = 0; + auto rawBlurRadius = boxShadow.find("blurRadius"); + if (rawBlurRadius != boxShadow.end()) { + if (auto blurRadiusValue = coerceLength(rawBlurRadius->second)) { + if (*blurRadiusValue < 0) { + return {}; + } + blurRadius = *blurRadiusValue; + } else { + return {}; + } + } + + Float spreadDistance = 0; + auto rawSpreadDistance = boxShadow.find("spreadDistance"); + if (rawSpreadDistance != boxShadow.end()) { + if (auto spreadDistanceValue = coerceLength(rawSpreadDistance->second)) { + spreadDistance = *spreadDistanceValue; + } else { + return {}; + } + } + + bool inset = false; + auto rawInset = boxShadow.find("inset"); + if (rawInset != boxShadow.end()) { + if (rawInset->second.hasType()) { + inset = (bool)rawInset->second; + } else { + return {}; + } + } + + SharedColor color; + auto rawColor = boxShadow.find("color"); + if (rawColor != boxShadow.end()) { + color = coerceColor(rawColor->second, context); + if (!color) { + return {}; + } + } + + return BoxShadow{ + .offsetX = *offsetX, + .offsetY = *offsetY, + .blurRadius = blurRadius, + .spreadDistance = spreadDistance, + .color = color, + .inset = inset}; +} + +void parseUnprocessedBoxShadowList( + const PropsParserContext& context, + std::vector&& value, + std::vector& result) { + for (const auto& rawValue : value) { + if (auto boxShadow = parseBoxShadowRawValue(context, rawValue)) { + result.push_back(*boxShadow); + } else { + result = {}; + return; + } + } +} + +void parseUnprocessedBoxShadow( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + if (value.hasType()) { + parseUnprocessedBoxShadowString((std::string)value, result); + } else if (value.hasType>()) { + parseUnprocessedBoxShadowList( + context, (std::vector)value, result); + } else { + result = {}; + } +} + +} // namespace + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + parseUnprocessedBoxShadow(context, value, result); + } else { + parseProcessedBoxShadow(context, value, result); + } +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h index a31e08d57139..671c9eb2389d 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h @@ -9,257 +9,13 @@ #include -#include -#include -#include -#include #include -#include -#include -#include +#include #include -#include -#include -#include +#include namespace facebook::react { -inline void -parseProcessedBoxShadow(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - react_native_expect(value.hasType>()); - if (!value.hasType>()) { - result = {}; - return; - } - - std::vector boxShadows{}; - auto rawBoxShadows = static_cast>(value); - for (const auto &rawBoxShadow : rawBoxShadows) { - bool isMap = rawBoxShadow.hasType>(); - react_native_expect(isMap); - if (!isMap) { - // If any box shadow is malformed then we should not apply any of them - // which is the web behavior. - result = {}; - return; - } - - auto rawBoxShadowMap = static_cast>(rawBoxShadow); - BoxShadow boxShadow{}; - auto offsetX = rawBoxShadowMap.find("offsetX"); - react_native_expect(offsetX != rawBoxShadowMap.end()); - if (offsetX == rawBoxShadowMap.end()) { - result = {}; - return; - } - react_native_expect(offsetX->second.hasType()); - if (!offsetX->second.hasType()) { - result = {}; - return; - } - boxShadow.offsetX = (Float)offsetX->second; - - auto offsetY = rawBoxShadowMap.find("offsetY"); - react_native_expect(offsetY != rawBoxShadowMap.end()); - if (offsetY == rawBoxShadowMap.end()) { - result = {}; - return; - } - react_native_expect(offsetY->second.hasType()); - if (!offsetY->second.hasType()) { - result = {}; - return; - } - boxShadow.offsetY = (Float)offsetY->second; - - auto blurRadius = rawBoxShadowMap.find("blurRadius"); - if (blurRadius != rawBoxShadowMap.end()) { - react_native_expect(blurRadius->second.hasType()); - if (!blurRadius->second.hasType()) { - result = {}; - return; - } - boxShadow.blurRadius = (Float)blurRadius->second; - } - - auto spreadDistance = rawBoxShadowMap.find("spreadDistance"); - if (spreadDistance != rawBoxShadowMap.end()) { - react_native_expect(spreadDistance->second.hasType()); - if (!spreadDistance->second.hasType()) { - result = {}; - return; - } - boxShadow.spreadDistance = (Float)spreadDistance->second; - } - - auto inset = rawBoxShadowMap.find("inset"); - if (inset != rawBoxShadowMap.end()) { - react_native_expect(inset->second.hasType()); - if (!inset->second.hasType()) { - result = {}; - return; - } - boxShadow.inset = (bool)inset->second; - } - - auto color = rawBoxShadowMap.find("color"); - if (color != rawBoxShadowMap.end()) { - fromRawValue(context.contextContainer, context.surfaceId, color->second, boxShadow.color); - } - - boxShadows.push_back(boxShadow); - } - - result = boxShadows; -} - -inline std::optional fromCSSShadow(const CSSShadow &cssShadow) -{ - // TODO: handle non-px values - if (cssShadow.offsetX.unit != CSSLengthUnit::Px || cssShadow.offsetY.unit != CSSLengthUnit::Px || - cssShadow.blurRadius.unit != CSSLengthUnit::Px || cssShadow.spreadDistance.unit != CSSLengthUnit::Px) { - return {}; - } - - return BoxShadow{ - .offsetX = cssShadow.offsetX.value, - .offsetY = cssShadow.offsetY.value, - .blurRadius = cssShadow.blurRadius.value, - .spreadDistance = cssShadow.spreadDistance.value, - .color = fromCSSColor(cssShadow.color), - .inset = cssShadow.inset, - }; -} - -inline void parseUnprocessedBoxShadowString(std::string &&value, std::vector &result) -{ - auto boxShadowList = parseCSSProperty((std::string)value); - if (!std::holds_alternative(boxShadowList)) { - result = {}; - return; - } - - for (const auto &cssShadow : std::get(boxShadowList)) { - if (auto boxShadow = fromCSSShadow(cssShadow)) { - result.push_back(*boxShadow); - } else { - result = {}; - return; - } - } -} - -inline std::optional parseBoxShadowRawValue(const PropsParserContext &context, const RawValue &value) -{ - if (!value.hasType>()) { - return {}; - } - - auto boxShadow = std::unordered_map(value); - auto rawOffsetX = boxShadow.find("offsetX"); - if (rawOffsetX == boxShadow.end()) { - return {}; - } - auto offsetX = coerceLength(rawOffsetX->second); - if (!offsetX.has_value()) { - return {}; - } - - auto rawOffsetY = boxShadow.find("offsetY"); - if (rawOffsetY == boxShadow.end()) { - return {}; - } - auto offsetY = coerceLength(rawOffsetY->second); - if (!offsetY.has_value()) { - return {}; - } - - Float blurRadius = 0; - auto rawBlurRadius = boxShadow.find("blurRadius"); - if (rawBlurRadius != boxShadow.end()) { - if (auto blurRadiusValue = coerceLength(rawBlurRadius->second)) { - if (*blurRadiusValue < 0) { - return {}; - } - blurRadius = *blurRadiusValue; - } else { - return {}; - } - } - - Float spreadDistance = 0; - auto rawSpreadDistance = boxShadow.find("spreadDistance"); - if (rawSpreadDistance != boxShadow.end()) { - if (auto spreadDistanceValue = coerceLength(rawSpreadDistance->second)) { - spreadDistance = *spreadDistanceValue; - } else { - return {}; - } - } - - bool inset = false; - auto rawInset = boxShadow.find("inset"); - if (rawInset != boxShadow.end()) { - if (rawInset->second.hasType()) { - inset = (bool)rawInset->second; - } else { - return {}; - } - } - - SharedColor color; - auto rawColor = boxShadow.find("color"); - if (rawColor != boxShadow.end()) { - color = coerceColor(rawColor->second, context); - if (!color) { - return {}; - } - } - - return BoxShadow{ - .offsetX = *offsetX, - .offsetY = *offsetY, - .blurRadius = blurRadius, - .spreadDistance = spreadDistance, - .color = color, - .inset = inset}; -} - -inline void parseUnprocessedBoxShadowList( - const PropsParserContext &context, - std::vector &&value, - std::vector &result) -{ - for (const auto &rawValue : value) { - if (auto boxShadow = parseBoxShadowRawValue(context, rawValue)) { - result.push_back(*boxShadow); - } else { - result = {}; - return; - } - } -} - -inline void -parseUnprocessedBoxShadow(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - if (value.hasType()) { - parseUnprocessedBoxShadowString((std::string)value, result); - } else if (value.hasType>()) { - parseUnprocessedBoxShadowList(context, (std::vector)value, result); - } else { - result = {}; - } -} - -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { - parseUnprocessedBoxShadow(context, value, result); - } else { - parseProcessedBoxShadow(context, value, result); - } -} +void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result); } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.cpp new file mode 100644 index 000000000000..e258f165c158 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "CSSConversions.h" + +#include +#include +#include +#include + +namespace facebook::react { + +SharedColor coerceColor( + const RawValue& value, + const PropsParserContext& context) { + if (value.hasType()) { + auto cssColor = parseCSSProperty((std::string)value); + if (!std::holds_alternative(cssColor)) { + return {}; + } + + const auto& color = std::get(cssColor); + return colorFromRGBA(color.r, color.g, color.b, color.a); + } + + SharedColor color; + fromRawValue(context.contextContainer, context.surfaceId, value, color); + return color; +} + +std::optional coerceLength(const RawValue& value) { + if (value.hasType()) { + return (Float)value; + } + + if (value.hasType()) { + auto length = parseCSSProperty((std::string)value); + if (!std::holds_alternative(length)) { + return {}; + } + + auto cssLength = std::get(length); + if (cssLength.unit != CSSLengthUnit::Px) { + return {}; + } + + return cssLength.value; + } + + return {}; +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h index ae3bf593b629..c29346ca990f 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h @@ -11,89 +11,14 @@ #include #include -#include -#include -#include -#include -#include -#include #include #include +#include namespace facebook::react { -inline SharedColor fromCSSColor(const CSSColor &cssColor) -{ - return hostPlatformColorFromRGBA(cssColor.r, cssColor.g, cssColor.b, cssColor.a); -} +SharedColor coerceColor(const RawValue &value, const PropsParserContext &context); -inline std::optional coerceAmount(const RawValue &value) -{ - if (value.hasType()) { - return (Float)value; - } - - if (value.hasType()) { - auto cssVal = parseCSSProperty((std::string)value); - if (std::holds_alternative(cssVal)) { - return std::get(cssVal).value; - } else if (std::holds_alternative(cssVal)) { - return std::get(cssVal).value / 100.0f; - } - } - return {}; -} - -inline std::optional coerceAngle(const RawValue &value) -{ - if (value.hasType()) { - return (Float)value; - } - - if (value.hasType()) { - auto cssVal = parseCSSProperty((std::string)value); - if (std::holds_alternative(cssVal)) { - return std::get(cssVal).degrees; - } - } - return {}; -} - -inline SharedColor coerceColor(const RawValue &value, const PropsParserContext &context) -{ - if (value.hasType()) { - auto cssColor = parseCSSProperty((std::string)value); - if (!std::holds_alternative(cssColor)) { - return {}; - } - return fromCSSColor(std::get(cssColor)); - } - - SharedColor color; - fromRawValue(context.contextContainer, context.surfaceId, value, color); - return color; -} - -inline std::optional coerceLength(const RawValue &value) -{ - if (value.hasType()) { - return (Float)value; - } - - if (value.hasType()) { - auto len = parseCSSProperty((std::string)value); - if (!std::holds_alternative(len)) { - return {}; - } - - auto cssLen = std::get(len); - if (cssLen.unit != CSSLengthUnit::Px) { - return {}; - } - - return cssLen.value; - } - return {}; -} +std::optional coerceLength(const RawValue &value); } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.cpp new file mode 100644 index 000000000000..388a51925f5e --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.cpp @@ -0,0 +1,434 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "FilterPropsConversions.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +namespace { + +std::optional coerceAmount(const RawValue& value) { + if (value.hasType()) { + return (Float)value; + } + + if (value.hasType()) { + auto cssValue = + parseCSSProperty((std::string)value); + if (std::holds_alternative(cssValue)) { + return std::get(cssValue).value; + } + if (std::holds_alternative(cssValue)) { + return std::get(cssValue).value / 100.0f; + } + } + + return {}; +} + +std::optional coerceAngle(const RawValue& value) { + if (value.hasType()) { + return (Float)value; + } + + if (value.hasType()) { + auto cssValue = parseCSSProperty((std::string)value); + if (std::holds_alternative(cssValue)) { + return std::get(cssValue).degrees; + } + } + + return {}; +} + +void parseProcessedFilter( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + react_native_expect(value.hasType>()); + if (!value.hasType>()) { + result = {}; + return; + } + + std::vector filter{}; + auto rawFilter = static_cast>(value); + for (const auto& rawFilterPrimitive : rawFilter) { + bool isMap = + rawFilterPrimitive.hasType>(); + react_native_expect(isMap); + if (!isMap) { + // If a filter is malformed then we should not apply any of them which + // is the web behavior. + result = {}; + return; + } + + auto rawFilterFunction = + static_cast>( + rawFilterPrimitive); + FilterFunction filterFunction{}; + auto filterType = filterTypeFromString(rawFilterFunction.begin()->first); + if (!filterType.has_value()) { + LOG(ERROR) << "Could not parse FilterFunction: " + << rawFilterFunction.begin()->first; + result = {}; + return; + } + filterFunction.type = *filterType; + if (filterFunction.type == FilterType::DropShadow) { + auto rawDropShadow = + static_cast>( + rawFilterFunction.begin()->second); + DropShadowParams dropShadowParams{}; + + auto offsetX = rawDropShadow.find("offsetX"); + react_native_expect(offsetX != rawDropShadow.end()); + if (offsetX == rawDropShadow.end()) { + result = {}; + return; + } + + react_native_expect(offsetX->second.hasType()); + if (!offsetX->second.hasType()) { + result = {}; + return; + } + dropShadowParams.offsetX = (Float)offsetX->second; + + auto offsetY = rawDropShadow.find("offsetY"); + react_native_expect(offsetY != rawDropShadow.end()); + if (offsetY == rawDropShadow.end()) { + result = {}; + return; + } + react_native_expect(offsetY->second.hasType()); + if (!offsetY->second.hasType()) { + result = {}; + return; + } + dropShadowParams.offsetY = (Float)offsetY->second; + + auto standardDeviation = rawDropShadow.find("standardDeviation"); + if (standardDeviation != rawDropShadow.end()) { + react_native_expect(standardDeviation->second.hasType()); + if (!standardDeviation->second.hasType()) { + result = {}; + return; + } + dropShadowParams.standardDeviation = (Float)standardDeviation->second; + } + + auto color = rawDropShadow.find("color"); + if (color != rawDropShadow.end()) { + fromRawValue( + context.contextContainer, + context.surfaceId, + color->second, + dropShadowParams.color); + } + + filterFunction.parameters = dropShadowParams; + } else { + filterFunction.parameters = (float)rawFilterFunction.begin()->second; + } + filter.push_back(filterFunction); + } + + result = filter; +} + +FilterType filterTypeFromVariant(const CSSFilterFunction& filter) { + return std::visit( + [](auto&& filter) -> FilterType { + using FilterT = std::decay_t; + + if constexpr (std::is_same_v) { + return FilterType::Blur; + } + if constexpr (std::is_same_v) { + return FilterType::Brightness; + } + if constexpr (std::is_same_v) { + return FilterType::Contrast; + } + if constexpr (std::is_same_v) { + return FilterType::DropShadow; + } + if constexpr (std::is_same_v) { + return FilterType::Grayscale; + } + if constexpr (std::is_same_v) { + return FilterType::HueRotate; + } + if constexpr (std::is_same_v) { + return FilterType::Invert; + } + if constexpr (std::is_same_v) { + return FilterType::Opacity; + } + if constexpr (std::is_same_v) { + return FilterType::Saturate; + } + if constexpr (std::is_same_v) { + return FilterType::Sepia; + } + }, + filter); +} + +std::optional fromCSSFilter( + const CSSFilterFunction& cssFilter) { + return std::visit( + [&](auto&& filter) -> std::optional { + using FilterT = std::decay_t; + + if constexpr (std::is_same_v) { + // TODO: support non-px values + if (filter.amount.unit != CSSLengthUnit::Px) { + return {}; + } + return FilterFunction{ + .type = filterTypeFromVariant(cssFilter), + .parameters = filter.amount.value, + }; + } + + if constexpr (std::is_same_v) { + // TODO: support non-px values + if (filter.offsetX.unit != CSSLengthUnit::Px || + filter.offsetY.unit != CSSLengthUnit::Px || + filter.standardDeviation.unit != CSSLengthUnit::Px) { + return {}; + } + + return FilterFunction{ + .type = FilterType::DropShadow, + .parameters = DropShadowParams{ + .offsetX = filter.offsetX.value, + .offsetY = filter.offsetY.value, + .standardDeviation = filter.standardDeviation.value, + .color = colorFromRGBA( + filter.color.r, + filter.color.g, + filter.color.b, + filter.color.a), + }}; + } + + if constexpr ( + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v || + std::is_same_v) { + return FilterFunction{ + .type = filterTypeFromVariant(cssFilter), + .parameters = filter.amount, + }; + } + + if constexpr (std::is_same_v) { + return FilterFunction{ + .type = filterTypeFromVariant(cssFilter), + .parameters = filter.degrees, + }; + } + }, + cssFilter); +} + +void parseUnprocessedFilterString( + std::string&& value, + std::vector& result) { + auto filterList = parseCSSProperty((std::string)value); + if (!std::holds_alternative(filterList)) { + result = {}; + return; + } + + for (const auto& cssFilter : std::get(filterList)) { + if (auto filter = fromCSSFilter(cssFilter)) { + result.push_back(*filter); + } else { + result = {}; + return; + } + } +} + +std::optional parseDropShadow( + const PropsParserContext& context, + const RawValue& value) { + if (value.hasType()) { + auto val = parseCSSProperty( + std::string("drop-shadow(") + (std::string)value + ")"); + if (std::holds_alternative(val)) { + return fromCSSFilter(std::get(val)); + } + return {}; + } + + if (!value.hasType>()) { + return {}; + } + auto rawDropShadow = + static_cast>(value); + + DropShadowParams dropShadowParams{}; + + auto offsetX = rawDropShadow.find("offsetX"); + if (offsetX == rawDropShadow.end()) { + return {}; + } + + if (auto parsedOffsetX = coerceLength(offsetX->second)) { + dropShadowParams.offsetX = *parsedOffsetX; + } else { + return {}; + } + + auto offsetY = rawDropShadow.find("offsetY"); + if (offsetY == rawDropShadow.end()) { + return {}; + } + + if (auto parsedOffsetY = coerceLength(offsetY->second)) { + dropShadowParams.offsetY = *parsedOffsetY; + } else { + return {}; + } + + auto standardDeviation = rawDropShadow.find("standardDeviation"); + if (standardDeviation != rawDropShadow.end()) { + if (auto parsedStandardDeviation = + coerceLength(standardDeviation->second)) { + if (*parsedStandardDeviation < 0.0f) { + return {}; + } + dropShadowParams.standardDeviation = *parsedStandardDeviation; + } else { + return {}; + } + } + + auto color = rawDropShadow.find("color"); + if (color != rawDropShadow.end()) { + if (auto parsedColor = coerceColor(color->second, context)) { + dropShadowParams.color = *parsedColor; + } else { + return {}; + } + } + + return FilterFunction{ + .type = FilterType::DropShadow, .parameters = dropShadowParams}; +} + +std::optional parseFilterRawValue( + const PropsParserContext& context, + const RawValue& value) { + if (!value.hasType>()) { + return {}; + } + auto rawFilter = + static_cast>(value); + + if (rawFilter.size() != 1) { + return {}; + } + + const auto& filterKey = rawFilter.begin()->first; + + if (filterKey == "drop-shadow") { + return parseDropShadow(context, rawFilter.begin()->second); + } else if (filterKey == "blur") { + if (auto length = coerceLength(rawFilter.begin()->second)) { + if (*length < 0.0f) { + return {}; + } + return FilterFunction{.type = FilterType::Blur, .parameters = *length}; + } + return {}; + } else if (filterKey == "hue-rotate") { + if (auto angle = coerceAngle(rawFilter.begin()->second)) { + return FilterFunction{ + .type = FilterType::HueRotate, .parameters = *angle}; + } + return {}; + } else { + auto filterType = filterTypeFromString(filterKey); + if (!filterType.has_value()) { + return {}; + } + if (auto amount = coerceAmount(rawFilter.begin()->second)) { + if (*amount < 0.0f) { + return {}; + } + return FilterFunction{.type = *filterType, .parameters = *amount}; + } + return {}; + } +} + +void parseUnprocessedFilterList( + const PropsParserContext& context, + std::vector&& value, + std::vector& result) { + for (const auto& rawValue : value) { + if (auto Filter = parseFilterRawValue(context, rawValue)) { + result.push_back(*Filter); + } else { + result = {}; + return; + } + } +} + +void parseUnprocessedFilter( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + if (value.hasType()) { + parseUnprocessedFilterString((std::string)value, result); + } else if (value.hasType>()) { + parseUnprocessedFilterList(context, (std::vector)value, result); + } else { + result = {}; + } +} + +} // namespace + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + std::vector& result) { + if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + parseUnprocessedFilter(context, value, result); + } else { + parseProcessedFilter(context, value, result); + } +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h index 2a35234576c4..657b90781711 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h @@ -9,360 +9,13 @@ #include -#include -#include -#include -#include #include -#include -#include -#include +#include #include -#include -#include -#include +#include namespace facebook::react { -inline void -parseProcessedFilter(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - react_native_expect(value.hasType>()); - if (!value.hasType>()) { - result = {}; - return; - } - - std::vector filter{}; - auto rawFilter = static_cast>(value); - for (const auto &rawFilterPrimitive : rawFilter) { - bool isMap = rawFilterPrimitive.hasType>(); - react_native_expect(isMap); - if (!isMap) { - // If a filter is malformed then we should not apply any of them which - // is the web behavior. - result = {}; - return; - } - - auto rawFilterFunction = static_cast>(rawFilterPrimitive); - FilterFunction filterFunction{}; - auto filterType = filterTypeFromString(rawFilterFunction.begin()->first); - if (!filterType.has_value()) { - LOG(ERROR) << "Could not parse FilterFunction: " << rawFilterFunction.begin()->first; - result = {}; - return; - } - filterFunction.type = *filterType; - if (filterFunction.type == FilterType::DropShadow) { - auto rawDropShadow = static_cast>(rawFilterFunction.begin()->second); - DropShadowParams dropShadowParams{}; - - auto offsetX = rawDropShadow.find("offsetX"); - react_native_expect(offsetX != rawDropShadow.end()); - if (offsetX == rawDropShadow.end()) { - result = {}; - return; - } - - react_native_expect(offsetX->second.hasType()); - if (!offsetX->second.hasType()) { - result = {}; - return; - } - dropShadowParams.offsetX = (Float)offsetX->second; - - auto offsetY = rawDropShadow.find("offsetY"); - react_native_expect(offsetY != rawDropShadow.end()); - if (offsetY == rawDropShadow.end()) { - result = {}; - return; - } - react_native_expect(offsetY->second.hasType()); - if (!offsetY->second.hasType()) { - result = {}; - return; - } - dropShadowParams.offsetY = (Float)offsetY->second; - - auto standardDeviation = rawDropShadow.find("standardDeviation"); - if (standardDeviation != rawDropShadow.end()) { - react_native_expect(standardDeviation->second.hasType()); - if (!standardDeviation->second.hasType()) { - result = {}; - return; - } - dropShadowParams.standardDeviation = (Float)standardDeviation->second; - } - - auto color = rawDropShadow.find("color"); - if (color != rawDropShadow.end()) { - fromRawValue(context.contextContainer, context.surfaceId, color->second, dropShadowParams.color); - } - - filterFunction.parameters = dropShadowParams; - } else { - filterFunction.parameters = (float)rawFilterFunction.begin()->second; - } - filter.push_back(filterFunction); - } - - result = filter; -} - -inline FilterType filterTypeFromVariant(const CSSFilterFunction &filter) -{ - return std::visit( - [](auto &&filter) -> FilterType { - using FilterT = std::decay_t; - - if constexpr (std::is_same_v) { - return FilterType::Blur; - } - if constexpr (std::is_same_v) { - return FilterType::Brightness; - } - if constexpr (std::is_same_v) { - return FilterType::Contrast; - } - if constexpr (std::is_same_v) { - return FilterType::DropShadow; - } - if constexpr (std::is_same_v) { - return FilterType::Grayscale; - } - if constexpr (std::is_same_v) { - return FilterType::HueRotate; - } - if constexpr (std::is_same_v) { - return FilterType::Invert; - } - if constexpr (std::is_same_v) { - return FilterType::Opacity; - } - if constexpr (std::is_same_v) { - return FilterType::Saturate; - } - if constexpr (std::is_same_v) { - return FilterType::Sepia; - } - }, - filter); -} - -inline std::optional fromCSSFilter(const CSSFilterFunction &cssFilter) -{ - return std::visit( - [&](auto &&filter) -> std::optional { - using FilterT = std::decay_t; - - if constexpr (std::is_same_v) { - // TODO: support non-px values - if (filter.amount.unit != CSSLengthUnit::Px) { - return {}; - } - return FilterFunction{ - .type = filterTypeFromVariant(cssFilter), - .parameters = filter.amount.value, - }; - } - - if constexpr (std::is_same_v) { - // TODO: support non-px values - if (filter.offsetX.unit != CSSLengthUnit::Px || filter.offsetY.unit != CSSLengthUnit::Px || - filter.standardDeviation.unit != CSSLengthUnit::Px) { - return {}; - } - - return FilterFunction{ - .type = FilterType::DropShadow, - .parameters = DropShadowParams{ - .offsetX = filter.offsetX.value, - .offsetY = filter.offsetY.value, - .standardDeviation = filter.standardDeviation.value, - .color = fromCSSColor(filter.color), - }}; - } - - if constexpr ( - std::is_same_v || std::is_same_v || - std::is_same_v || std::is_same_v || - std::is_same_v || std::is_same_v || - std::is_same_v) { - return FilterFunction{ - .type = filterTypeFromVariant(cssFilter), - .parameters = filter.amount, - }; - } - - if constexpr (std::is_same_v) { - return FilterFunction{ - .type = filterTypeFromVariant(cssFilter), - .parameters = filter.degrees, - }; - } - }, - cssFilter); -} - -inline void parseUnprocessedFilterString(std::string &&value, std::vector &result) -{ - auto filterList = parseCSSProperty((std::string)value); - if (!std::holds_alternative(filterList)) { - result = {}; - return; - } - - for (const auto &cssFilter : std::get(filterList)) { - if (auto filter = fromCSSFilter(cssFilter)) { - result.push_back(*filter); - } else { - result = {}; - return; - } - } -} - -inline std::optional parseDropShadow(const PropsParserContext &context, const RawValue &value) -{ - if (value.hasType()) { - auto val = parseCSSProperty(std::string("drop-shadow(") + (std::string)value + ")"); - if (std::holds_alternative(val)) { - return fromCSSFilter(std::get(val)); - } - return {}; - } - - if (!value.hasType>()) { - return {}; - } - auto rawDropShadow = static_cast>(value); - - DropShadowParams dropShadowParams{}; - - auto offsetX = rawDropShadow.find("offsetX"); - if (offsetX == rawDropShadow.end()) { - return {}; - } - - if (auto parsedOffsetX = coerceLength(offsetX->second)) { - dropShadowParams.offsetX = *parsedOffsetX; - } else { - return {}; - } - - auto offsetY = rawDropShadow.find("offsetY"); - if (offsetY == rawDropShadow.end()) { - return {}; - } - - if (auto parsedOffsetY = coerceLength(offsetY->second)) { - dropShadowParams.offsetY = *parsedOffsetY; - } else { - return {}; - } - - auto standardDeviation = rawDropShadow.find("standardDeviation"); - if (standardDeviation != rawDropShadow.end()) { - if (auto parsedStandardDeviation = coerceLength(standardDeviation->second)) { - if (*parsedStandardDeviation < 0.0f) { - return {}; - } - dropShadowParams.standardDeviation = *parsedStandardDeviation; - } else { - return {}; - } - } - - auto color = rawDropShadow.find("color"); - if (color != rawDropShadow.end()) { - if (auto parsedColor = coerceColor(color->second, context)) { - dropShadowParams.color = *parsedColor; - } else { - return {}; - } - } - - return FilterFunction{.type = FilterType::DropShadow, .parameters = dropShadowParams}; -} - -inline std::optional parseFilterRawValue(const PropsParserContext &context, const RawValue &value) -{ - if (!value.hasType>()) { - return {}; - } - auto rawFilter = static_cast>(value); - - if (rawFilter.size() != 1) { - return {}; - } - - const auto &filterKey = rawFilter.begin()->first; - - if (filterKey == "drop-shadow") { - return parseDropShadow(context, rawFilter.begin()->second); - } else if (filterKey == "blur") { - if (auto length = coerceLength(rawFilter.begin()->second)) { - if (*length < 0.0f) { - return {}; - } - return FilterFunction{.type = FilterType::Blur, .parameters = *length}; - } - return {}; - } else if (filterKey == "hue-rotate") { - if (auto angle = coerceAngle(rawFilter.begin()->second)) { - return FilterFunction{.type = FilterType::HueRotate, .parameters = *angle}; - } - return {}; - } else { - auto filterType = filterTypeFromString(filterKey); - if (!filterType.has_value()) { - return {}; - } - if (auto amount = coerceAmount(rawFilter.begin()->second)) { - if (*amount < 0.0f) { - return {}; - } - return FilterFunction{.type = *filterType, .parameters = *amount}; - } - return {}; - } -} - -inline void parseUnprocessedFilterList( - const PropsParserContext &context, - std::vector &&value, - std::vector &result) -{ - for (const auto &rawValue : value) { - if (auto Filter = parseFilterRawValue(context, rawValue)) { - result.push_back(*Filter); - } else { - result = {}; - return; - } - } -} - -inline void -parseUnprocessedFilter(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - if (value.hasType()) { - parseUnprocessedFilterString((std::string)value, result); - } else if (value.hasType>()) { - parseUnprocessedFilterList(context, (std::vector)value, result); - } else { - result = {}; - } -} - -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result) -{ - if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { - parseUnprocessedFilter(context, value, result); - } else { - parseProcessedFilter(context, value, result); - } -} +void fromRawValue(const PropsParserContext &context, const RawValue &value, std::vector &result); } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp index 4b704c2b17f2..07d1839a4c0a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp @@ -6,9 +6,12 @@ */ #include +#include #include +#include +#include #include #include #include @@ -17,6 +20,30 @@ namespace facebook::react { +namespace { + +class NativeCSSParsingEnabledFlags : public ReactNativeFeatureFlagsDefaults { + public: + bool enableNativeCSSParsing() override { + return true; + } +}; + +class NativeCSSConversionsTest : public ::testing::Test { + protected: + void SetUp() override { + ReactNativeFeatureFlags::dangerouslyReset(); + ReactNativeFeatureFlags::override( + std::make_unique()); + } + + void TearDown() override { + ReactNativeFeatureFlags::dangerouslyReset(); + } +}; + +} // namespace + TEST(ConversionsTest, accessibility_roles_round_trip) { struct AccessibilityRoleTestCase { AccessibilityRole role; @@ -122,13 +149,12 @@ TEST(ConversionsTest, accessibility_roles_round_trip) { } } -TEST(ConversionsTest, unprocessed_box_shadow_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_box_shadow_string) { RawValue value{ folly::dynamic("10px 2px 0 5px #fff, inset 20px 10px 5px 0 #000")}; std::vector boxShadows; - parseUnprocessedBoxShadow( - PropsParserContext{-1, ContextContainer{}}, value, boxShadows); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, boxShadows); EXPECT_EQ(boxShadows.size(), 2); EXPECT_EQ(boxShadows[0].offsetX, 10); @@ -146,7 +172,7 @@ TEST(ConversionsTest, unprocessed_box_shadow_string) { EXPECT_TRUE(boxShadows[1].inset); } -TEST(ConversionsTest, unprocessed_box_shadow_objects) { +TEST_F(NativeCSSConversionsTest, unprocessed_box_shadow_objects) { RawValue value{folly::dynamic::array( folly::dynamic::object("offsetX", 10)("offsetY", 2)("blurRadius", 3)( "spreadDistance", 5), @@ -154,8 +180,7 @@ TEST(ConversionsTest, unprocessed_box_shadow_objects) { "color", "#fff")("inset", true))}; std::vector boxShadows; - parseUnprocessedBoxShadow( - PropsParserContext{-1, ContextContainer{}}, value, boxShadows); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, boxShadows); EXPECT_EQ(boxShadows.size(), 2); EXPECT_EQ(boxShadows[0].offsetX, 10); @@ -173,37 +198,34 @@ TEST(ConversionsTest, unprocessed_box_shadow_objects) { EXPECT_TRUE(boxShadows[1].inset); } -TEST(ConversionsTest, unprocessed_box_object_invalid_color) { +TEST_F(NativeCSSConversionsTest, unprocessed_box_object_invalid_color) { RawValue value{folly::dynamic::array( folly::dynamic::object("offsetX", 10)("offsetY", 2)("blurRadius", 3)( "spreadDistance", 5)("color", "hello"))}; std::vector boxShadows; - parseUnprocessedBoxShadow( - PropsParserContext{-1, ContextContainer{}}, value, boxShadows); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, boxShadows); EXPECT_TRUE(boxShadows.empty()); } -TEST(ConversionsTest, unprocessed_box_object_negative_blur) { +TEST_F(NativeCSSConversionsTest, unprocessed_box_object_negative_blur) { RawValue value{folly::dynamic::array( folly::dynamic::object("offsetX", 10)("offsetY", 2)("blurRadius", -3)( "spreadDistance", 5))}; std::vector boxShadows; - parseUnprocessedBoxShadow( - PropsParserContext{-1, ContextContainer{}}, value, boxShadows); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, boxShadows); EXPECT_TRUE(boxShadows.empty()); } -TEST(ConversionsTest, unprocessed_filter_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_string) { RawValue value{folly::dynamic( "drop-shadow(10px -2px 0.5px #fff) blur(5px) hue-rotate(90deg) saturate(2) brightness(50%)")}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_EQ(filters.size(), 5); @@ -234,7 +256,7 @@ TEST(ConversionsTest, unprocessed_filter_string) { EXPECT_EQ(std::get(filters[4].parameters), 0.5f); } -TEST(ConversionsTest, unprocessed_filter_objects) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects) { RawValue value{folly::dynamic::array( folly::dynamic::object( "drop-shadow", @@ -247,8 +269,7 @@ TEST(ConversionsTest, unprocessed_filter_objects) { folly::dynamic::object("brightness", "50%"))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_EQ(filters.size(), 6); @@ -288,7 +309,9 @@ TEST(ConversionsTest, unprocessed_filter_objects) { EXPECT_EQ(std::get(filters[5].parameters), 0.5f); } -TEST(ConversionsTest, unprocessed_filter_objects_negative_shadow_blur) { +TEST_F( + NativeCSSConversionsTest, + unprocessed_filter_objects_negative_shadow_blur) { RawValue value{folly::dynamic::array( folly::dynamic::object( "drop-shadow", @@ -296,40 +319,38 @@ TEST(ConversionsTest, unprocessed_filter_objects_negative_shadow_blur) { "standardDeviation", -0.5)))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_TRUE(filters.empty()); } -TEST(ConversionsTest, unprocessed_filter_objects_negative_blur) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_negative_blur) { RawValue value{folly::dynamic::array(folly::dynamic::object("blur", -5))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_TRUE(filters.empty()); } -TEST(ConversionsTest, unprocessed_filter_objects_negative_contrast) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_negative_contrast) { RawValue value{ folly::dynamic::array(folly::dynamic::object("constrast", -5))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_TRUE(filters.empty()); } -TEST(ConversionsTest, unprocessed_filter_objects_negative_hue_rotate) { +TEST_F( + NativeCSSConversionsTest, + unprocessed_filter_objects_negative_hue_rotate) { RawValue value{ folly::dynamic::array(folly::dynamic::object("hue-rotate", -5))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_EQ(filters.size(), 1); @@ -338,24 +359,22 @@ TEST(ConversionsTest, unprocessed_filter_objects_negative_hue_rotate) { EXPECT_EQ(std::get(filters[0].parameters), -5.0f); } -TEST(ConversionsTest, unprocessed_filter_objects_multiple_objects) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_multiple_objects) { RawValue value{folly::dynamic::array( folly::dynamic::object("blur", 5)("hue-rotate", "90deg"))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_TRUE(filters.empty()); } -TEST(ConversionsTest, unprocessed_filter_objects_unknown_type) { +TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_unknown_type) { RawValue value{ folly::dynamic::array(folly::dynamic::object("unknown-filter", 5))}; std::vector filters; - parseUnprocessedFilter( - PropsParserContext{-1, ContextContainer{}}, value, filters); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, filters); EXPECT_TRUE(filters.empty()); } diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 458bb76080fb..c94106c4bb45 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -873,7 +873,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -895,7 +894,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -947,14 +945,7 @@ size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::At size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -1152,19 +1143,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 642535bf6bd7..ae0ae0624436 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -872,7 +872,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -894,7 +893,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -945,14 +943,7 @@ size_t facebook::react::attributedStringHashDisplayWise(const facebook::react::A size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -1148,19 +1139,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index a965c1b79d69..b37f14c4bff6 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -873,7 +873,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -895,7 +894,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -947,14 +945,7 @@ size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::At size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -1152,19 +1143,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index d0d014ec91cb..dbc52e12ad14 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -3694,7 +3694,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -3709,7 +3708,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -3745,14 +3743,7 @@ size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::At size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -3952,19 +3943,11 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index 4290dcb0e425..2a155bb00cc6 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3685,7 +3685,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -3700,7 +3699,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -3735,14 +3733,7 @@ size_t facebook::react::attributedStringHashDisplayWise(const facebook::react::A size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -3941,19 +3932,11 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 72a9805b05fd..2a4ecfc99f7a 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -3694,7 +3694,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::Float facebook::react::floatFromYogaFloat(float value); facebook::react::Float facebook::react::floatFromYogaOptionalFloat(facebook::yoga::FloatOptional value); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); @@ -3709,7 +3708,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::parsePlatformColor(const facebook::react::ContextContainer& contextContainer, int32_t surfaceId, const facebook::react::RawValue& value); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); @@ -3745,14 +3743,7 @@ size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::At size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); @@ -3952,19 +3943,11 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 8b46097a89f9..c0a0d541c77e 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -477,7 +477,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); facebook::react::ParagraphAttributes facebook::react::convertRawProp(const facebook::react::PropsParserContext& context, const facebook::react::RawProps& rawProps, const facebook::react::ParagraphAttributes& sourceParagraphAttributes, const facebook::react::ParagraphAttributes& defaultParagraphAttributes); facebook::react::Rect facebook::react::insetBy(const facebook::react::Rect& rect, const facebook::react::EdgeInsets& insets) noexcept; @@ -490,7 +489,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); @@ -518,17 +516,10 @@ size_t facebook::react::attributedStringHashDisplayWise(const facebook::react::A size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); @@ -712,19 +703,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 692b5064e583..f2936607e4a0 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -476,7 +476,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); facebook::react::ParagraphAttributes facebook::react::convertRawProp(const facebook::react::PropsParserContext& context, const facebook::react::RawProps& rawProps, const facebook::react::ParagraphAttributes& sourceParagraphAttributes, const facebook::react::ParagraphAttributes& defaultParagraphAttributes); facebook::react::Rect facebook::react::insetBy(const facebook::react::Rect& rect, const facebook::react::EdgeInsets& insets) noexcept; @@ -489,7 +488,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); @@ -516,17 +514,10 @@ size_t facebook::react::attributedStringFragmentHashLayoutWise(const facebook::r size_t facebook::react::attributedStringHashDisplayWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); @@ -709,19 +700,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index ff0ef95bbfdb..b4416c9a9247 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -477,7 +477,6 @@ facebook::react::ColorSpace facebook::react::getDefaultColorSpace(); facebook::react::ComponentBuilder facebook::react::simpleComponentBuilder(std::shared_ptr contextContainer = nullptr); facebook::react::ComponentRegistryFactory facebook::react::getDefaultComponentRegistryFactory(); facebook::react::DisplayType facebook::react::displayTypeFromYGDisplay(YGDisplay display); -facebook::react::FilterType facebook::react::filterTypeFromVariant(const facebook::react::CSSFilterFunction& filter); facebook::react::LayoutMetrics facebook::react::layoutMetricsFromYogaNode(facebook::yoga::Node& yogaNode); facebook::react::ParagraphAttributes facebook::react::convertRawProp(const facebook::react::PropsParserContext& context, const facebook::react::RawProps& rawProps, const facebook::react::ParagraphAttributes& sourceParagraphAttributes, const facebook::react::ParagraphAttributes& defaultParagraphAttributes); facebook::react::Rect facebook::react::insetBy(const facebook::react::Rect& rect, const facebook::react::EdgeInsets& insets) noexcept; @@ -490,7 +489,6 @@ facebook::react::SharedColor facebook::react::clearColor(); facebook::react::SharedColor facebook::react::coerceColor(const facebook::react::RawValue& value, const facebook::react::PropsParserContext& context); facebook::react::SharedColor facebook::react::colorFromComponents(facebook::react::ColorComponents components); facebook::react::SharedColor facebook::react::colorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a); -facebook::react::SharedColor facebook::react::fromCSSColor(const facebook::react::CSSColor& cssColor); facebook::react::SharedColor facebook::react::whiteColor(); facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); @@ -518,17 +516,10 @@ size_t facebook::react::attributedStringHashDisplayWise(const facebook::react::A size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::AttributedString& attributedString); size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); -std::optional facebook::react::coerceAmount(const facebook::react::RawValue& value); -std::optional facebook::react::coerceAngle(const facebook::react::RawValue& value); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); -std::optional facebook::react::fromCSSShadow(const facebook::react::CSSShadow& cssShadow); -std::optional facebook::react::parseBoxShadowRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::fromCSSFilter(const facebook::react::CSSFilterFunction& cssFilter); -std::optional facebook::react::parseDropShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); -std::optional facebook::react::parseFilterRawValue(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); @@ -712,19 +703,11 @@ void facebook::react::fromString(const std::string& string, facebook::react::Acc void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::TimePointFunction nowFunction); void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseProcessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadow(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedBoxShadowString(std::string&& value, std::vector& result); -void facebook::react::parseUnprocessedFilter(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); -void facebook::react::parseUnprocessedFilterList(const facebook::react::PropsParserContext& context, std::vector&& value, std::vector& result); -void facebook::react::parseUnprocessedFilterString(std::string&& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); From cfc8498725ff827cd5d718633c523dbc5f67be54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 2 Oct 2026 03:59:08 -0700 Subject: [PATCH 2/3] Make renderer View conversions CSS-free Summary: Move CSS-dependent View conversion implementations for Yoga lengths, value units, transforms, transform origins, and aspect ratios from the exported `conversions.h` header into `conversions.cpp`. Keep the supported conversion declarations public and preserve existing parsing behavior. Update existing conversion tests to exercise the same paths through supported public entry points, and regenerate the C++ API snapshots to remove private helper declarations. Changelog: [Internal] Differential Revision: D119507215 --- .../renderer/components/view/conversions.cpp | 779 ++++++++++++++++++ .../renderer/components/view/conversions.h | 644 +-------------- .../components/view/tests/ConversionsTest.cpp | 115 +-- .../api-snapshots/ReactAndroidDebugCxx.api | 9 - .../api-snapshots/ReactAndroidNewarchCxx.api | 9 - .../api-snapshots/ReactAndroidReleaseCxx.api | 9 - .../api-snapshots/ReactAppleDebugCxx.api | 9 - .../api-snapshots/ReactAppleNewarchCxx.api | 9 - .../api-snapshots/ReactAppleReleaseCxx.api | 9 - .../api-snapshots/ReactCommonDebugCxx.api | 9 - .../api-snapshots/ReactCommonNewarchCxx.api | 9 - .../api-snapshots/ReactCommonReleaseCxx.api | 9 - 12 files changed, 848 insertions(+), 771 deletions(-) create mode 100644 packages/react-native/ReactCommon/react/renderer/components/view/conversions.cpp diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.cpp new file mode 100644 index 000000000000..cfa123fb46c6 --- /dev/null +++ b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.cpp @@ -0,0 +1,779 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#include "conversions.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace facebook::react { + +void fromRawValue( + const PropsParserContext& /*context*/, + const RawValue& value, + yoga::Style::SizeLength& result) { + if (value.hasType()) { + result = yoga::StyleSizeLength::points((float)value); + return; + } else if (value.hasType()) { + const auto stringValue = (std::string)value; + if (stringValue == "auto") { + result = yoga::StyleSizeLength::ofAuto(); + return; + } else if (stringValue == "max-content") { + result = yoga::StyleSizeLength::ofMaxContent(); + return; + } else if (stringValue == "stretch") { + result = yoga::StyleSizeLength::ofStretch(); + return; + } else if (stringValue == "fit-content") { + result = yoga::StyleSizeLength::ofFitContent(); + return; + } else { + auto parsed = parseCSSProperty(stringValue); + if (std::holds_alternative(parsed)) { + result = yoga::StyleSizeLength::percent( + std::get(parsed).value); + return; + } else if (std::holds_alternative(parsed)) { + result = + yoga::StyleSizeLength::points(std::get(parsed).value); + return; + } + } + } + result = yoga::StyleSizeLength::undefined(); +} + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + yoga::Style::Length& result) { + if (value.hasType()) { + result = yoga::StyleLength::points((float)value); + return; + } else if (value.hasType()) { + const auto stringValue = (std::string)value; + if (stringValue == "auto") { + result = yoga::StyleLength::ofAuto(); + return; + } else { + auto parsed = parseCSSProperty(stringValue); + if (std::holds_alternative(parsed)) { + result = + yoga::StyleLength::percent(std::get(parsed).value); + return; + } else if (std::holds_alternative(parsed)) { + result = yoga::StyleLength::points(std::get(parsed).value); + return; + } + } + } + result = yoga::StyleLength::undefined(); +} + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + YGValue& result) { + yoga::Style::Length length{}; + fromRawValue(context, value, length); + result = (YGValue)length; +} + +yoga::FloatOptional convertAspectRatio( + const PropsParserContext& /*context*/, + const RawValue& value) { + if (value.hasType()) { + return yoga::FloatOptional((float)value); + } + if (ReactNativeFeatureFlags::enableNativeCSSParsing() && + value.hasType()) { + auto ratio = parseCSSProperty((std::string)value); + if (std::holds_alternative(ratio)) { + auto r = std::get(ratio); + if (!r.isDegenerate()) { + return yoga::FloatOptional(r.numerator / r.denominator); + } + } + } + return {}; +} + +namespace { + +std::optional toRadians(const RawValue& value) { + if (value.hasType()) { + return (Float)value; + } + if (!value.hasType()) { + return {}; + } + + auto angle = parseCSSProperty((std::string)value); + if (std::holds_alternative(angle)) { + return static_cast( + std::get(angle).degrees * M_PI / 180.0f); + } + + return {}; +} + +} // namespace + +ValueUnit toValueUnit(const RawValue& value) { + if (value.hasType()) { + return ValueUnit((Float)value, UnitType::Point); + } + if (!value.hasType()) { + return {}; + } + + auto pct = parseCSSProperty((std::string)value); + if (std::holds_alternative(pct)) { + return ValueUnit(std::get(pct).value, UnitType::Percent); + } + + return {}; +} + +void fromRawValue( + const PropsParserContext& /*context*/, + const RawValue& value, + ValueUnit& result) { + result = toValueUnit(value); +} + +namespace { + +ValueUnit cssLengthPercentageToValueUnit( + const std::variant& value) { + if (std::holds_alternative(value)) { + auto len = std::get(value); + if (len.unit != CSSLengthUnit::Px) { + return {}; + } + return {len.value, UnitType::Point}; + } else { + return {std::get(value).value, UnitType::Percent}; + } +} + +std::optional fromCSSTransformFunction( + const CSSTransformFunction& cssTransform) { + constexpr auto Zero = ValueUnit(0, UnitType::Point); + constexpr auto One = ValueUnit(1, UnitType::Point); + + return std::visit( + [&](auto&& func) -> std::optional { + using T = std::decay_t; + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Rotate, + .x = Zero, + .y = Zero, + .z = ValueUnit(radians, UnitType::Point)}; + } + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Rotate, + .x = ValueUnit(radians, UnitType::Point), + .y = Zero, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Rotate, + .x = Zero, + .y = ValueUnit(radians, UnitType::Point), + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Rotate, + .x = Zero, + .y = Zero, + .z = ValueUnit(radians, UnitType::Point)}; + } + + if constexpr (std::is_same_v) { + auto x = cssLengthPercentageToValueUnit(func.x); + auto y = cssLengthPercentageToValueUnit(func.y); + if (!x || !y) { + return std::nullopt; + } + return TransformOperation{ + .type = TransformOperationType::Translate, + .x = x, + .y = y, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto x = cssLengthPercentageToValueUnit(func.value); + if (!x) { + return std::nullopt; + } + return TransformOperation{ + .type = TransformOperationType::Translate, + .x = x, + .y = Zero, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto y = cssLengthPercentageToValueUnit(func.value); + if (!y) { + return std::nullopt; + } + return TransformOperation{ + .type = TransformOperationType::Translate, + .x = Zero, + .y = y, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto x = cssLengthPercentageToValueUnit(func.x); + auto y = cssLengthPercentageToValueUnit(func.y); + if (!x || !y || func.z.unit != CSSLengthUnit::Px) { + return std::nullopt; + } + return TransformOperation{ + .type = TransformOperationType::Translate, + .x = x, + .y = y, + .z = ValueUnit(func.z.value, UnitType::Point)}; + } + + if constexpr (std::is_same_v) { + return TransformOperation{ + .type = TransformOperationType::Scale, + .x = ValueUnit(func.x, UnitType::Point), + .y = ValueUnit(func.y, UnitType::Point), + .z = One}; + } + + if constexpr (std::is_same_v) { + return TransformOperation{ + .type = TransformOperationType::Scale, + .x = ValueUnit(func.value, UnitType::Point), + .y = One, + .z = One}; + } + + if constexpr (std::is_same_v) { + return TransformOperation{ + .type = TransformOperationType::Scale, + .x = One, + .y = ValueUnit(func.value, UnitType::Point), + .z = One}; + } + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Skew, + .x = ValueUnit(radians, UnitType::Point), + .y = Zero, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + auto radians = static_cast(func.degrees * M_PI / 180.0f); + return TransformOperation{ + .type = TransformOperationType::Skew, + .x = Zero, + .y = ValueUnit(radians, UnitType::Point), + .z = Zero}; + } + + if constexpr (std::is_same_v) { + if (func.length.unit != CSSLengthUnit::Px) { + return std::nullopt; + } + return TransformOperation{ + .type = TransformOperationType::Perspective, + .x = ValueUnit(func.length.value, UnitType::Point), + .y = Zero, + .z = Zero}; + } + + if constexpr (std::is_same_v) { + return TransformOperation{ + .type = TransformOperationType::Arbitrary, + .x = Zero, + .y = Zero, + .z = Zero}; + } + }, + cssTransform); +} + +void parseProcessedTransform( + const PropsParserContext& /*context*/, + const RawValue& value, + Transform& result) { + auto transformMatrix = Transform{}; + react_native_expect(value.hasType>()); + if (!value.hasType>()) { + result = transformMatrix; + return; + } + + auto configurations = static_cast>(value); + for (const auto& configuration : configurations) { + if (!configuration.hasType>()) { + result = {}; + return; + } + + auto configurationPair = + static_cast>(configuration); + if (configurationPair.size() != 1) { + result = {}; + return; + } + + auto pair = configurationPair.begin(); + auto operation = pair->first; + auto& parameters = pair->second; + auto Zero = ValueUnit(0, UnitType::Point); + auto One = ValueUnit(1, UnitType::Point); + + if (operation == "matrix") { + // T215634510: We should support matrix transforms as part of a list of + // transforms + if (configurations.size() > 1) { + result = {}; + return; + } + + if (!parameters.hasType>()) { + result = {}; + return; + } + + auto numbers = (std::vector)parameters; + if (numbers.size() != 9 && numbers.size() != 16) { + result = {}; + return; + } + + if (numbers.size() == 16) { + size_t i = 0; + + for (auto number : numbers) { + transformMatrix.matrix[i++] = number; + } + } else if (numbers.size() == 9) { + // We need to convert the 2d transform matrix into a 3d one as such: + // [ + // x00, x01, 0, x02 + // x10, x11, 0, x12 + // 0, 0, 1, 0 + // x20, x21, 0, x22 + // ] + transformMatrix.matrix[0] = numbers[0]; + transformMatrix.matrix[1] = numbers[1]; + transformMatrix.matrix[2] = 0; + transformMatrix.matrix[3] = numbers[2]; + transformMatrix.matrix[4] = numbers[3]; + transformMatrix.matrix[5] = numbers[4]; + transformMatrix.matrix[6] = 0; + transformMatrix.matrix[7] = numbers[5]; + transformMatrix.matrix[8] = 0; + transformMatrix.matrix[9] = 0; + transformMatrix.matrix[10] = 1; + transformMatrix.matrix[11] = 0; + transformMatrix.matrix[12] = numbers[6]; + transformMatrix.matrix[13] = numbers[7]; + transformMatrix.matrix[14] = 0; + transformMatrix.matrix[15] = numbers[8]; + } + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Arbitrary, + .x = Zero, + .y = Zero, + .z = Zero}); + } else if (operation == "perspective") { + if (!parameters.hasType()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Perspective, + .x = ValueUnit((Float)parameters, UnitType::Point), + .y = Zero, + .z = Zero}); + } else if (operation == "rotateX") { + auto radians = toRadians(parameters); + if (!radians.has_value()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Rotate, + .x = ValueUnit(*radians, UnitType::Point), + .y = Zero, + .z = Zero}); + } else if (operation == "rotateY") { + auto radians = toRadians(parameters); + if (!radians.has_value()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Rotate, + .x = Zero, + .y = ValueUnit(*radians, UnitType::Point), + .z = Zero}); + } else if (operation == "rotateZ" || operation == "rotate") { + auto radians = toRadians(parameters); + if (!radians.has_value()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Rotate, + .x = Zero, + .y = Zero, + .z = ValueUnit(*radians, UnitType::Point)}); + } else if (operation == "scale") { + if (!parameters.hasType()) { + result = {}; + return; + } + + auto number = ValueUnit((Float)parameters, UnitType::Point); + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Scale, + .x = number, + .y = number, + .z = number}); + } else if (operation == "scaleX") { + if (!parameters.hasType()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Scale, + .x = ValueUnit((Float)parameters, UnitType::Point), + .y = One, + .z = One}); + } else if (operation == "scaleY") { + if (!parameters.hasType()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Scale, + .x = One, + .y = ValueUnit((Float)parameters, UnitType::Point), + .z = One}); + } else if (operation == "scaleZ") { + if (!parameters.hasType()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Scale, + .x = One, + .y = One, + .z = ValueUnit((Float)parameters, UnitType::Point)}); + } else if (operation == "translate") { + if (!parameters.hasType>()) { + result = {}; + return; + } + + auto numbers = (std::vector)parameters; + if (numbers.size() != 2) { + result = {}; + return; + } + + auto valueX = toValueUnit(numbers[0]); + if (!valueX) { + result = {}; + return; + } + + auto valueY = toValueUnit(numbers[1]); + if (!valueY) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Translate, + .x = valueX, + .y = valueY, + .z = Zero}); + } else if (operation == "translateX") { + auto valueX = toValueUnit(parameters); + if (!valueX) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Translate, + .x = valueX, + .y = Zero, + .z = Zero}); + } else if (operation == "translateY") { + auto valueY = toValueUnit(parameters); + if (!valueY) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Translate, + .x = Zero, + .y = valueY, + .z = Zero}); + } else if (operation == "skewX") { + auto radians = toRadians(parameters); + if (!radians.has_value()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Skew, + .x = ValueUnit(*radians, UnitType::Point), + .y = Zero, + .z = Zero}); + } else if (operation == "skewY") { + auto radians = toRadians(parameters); + if (!radians.has_value()) { + result = {}; + return; + } + + transformMatrix.operations.push_back( + TransformOperation{ + .type = TransformOperationType::Skew, + .x = Zero, + .y = ValueUnit(*radians, UnitType::Point), + .z = Zero}); + } + } + + result = transformMatrix; +} + +void parseUnprocessedTransformString( + const std::string& value, + Transform& result) { + auto transformList = parseCSSProperty(value); + if (!std::holds_alternative(transformList)) { + result = {}; + return; + } + + auto transformMatrix = Transform{}; + const auto& cssFuncs = std::get(transformList); + transformMatrix.operations.reserve(cssFuncs.size()); + for (const auto& cssFunc : cssFuncs) { + auto op = fromCSSTransformFunction(cssFunc); + if (!op.has_value()) { + result = {}; + return; + } + + if (op->type == TransformOperationType::Arbitrary) { + // CSSMatrix: expand 6-value 2D matrix to 4x4 matrix + if (std::holds_alternative(cssFunc)) { + const auto& m = std::get(cssFunc); + transformMatrix.matrix[0] = m.values[0]; + transformMatrix.matrix[1] = m.values[1]; + transformMatrix.matrix[2] = 0; + transformMatrix.matrix[3] = 0; + transformMatrix.matrix[4] = m.values[2]; + transformMatrix.matrix[5] = m.values[3]; + transformMatrix.matrix[6] = 0; + transformMatrix.matrix[7] = 0; + transformMatrix.matrix[8] = 0; + transformMatrix.matrix[9] = 0; + transformMatrix.matrix[10] = 1; + transformMatrix.matrix[11] = 0; + transformMatrix.matrix[12] = m.values[4]; + transformMatrix.matrix[13] = m.values[5]; + transformMatrix.matrix[14] = 0; + transformMatrix.matrix[15] = 1; + } + } + + transformMatrix.operations.push_back(*op); + } + + result = transformMatrix; +} + +void parseUnprocessedTransform( + const PropsParserContext& context, + const RawValue& value, + Transform& result) { + if (value.hasType()) { + parseUnprocessedTransformString((std::string)value, result); + } else { + parseProcessedTransform(context, value, result); + } +} + +} // namespace + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + Transform& result) { + if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + parseUnprocessedTransform(context, value, result); + } else { + parseProcessedTransform(context, value, result); + } +} + +namespace { + +void parseProcessedTransformOrigin( + const PropsParserContext& /*context*/, + const RawValue& value, + TransformOrigin& result) { + if (!value.hasType>()) { + result = {}; + return; + } + + auto origins = (std::vector)value; + if (origins.size() != 3) { + result = {}; + return; + } + + TransformOrigin transformOrigin; + + for (size_t i = 0; i < 2; i++) { + auto origin = toValueUnit(origins[i]); + if (!origin) { + result = {}; + return; + } + + transformOrigin.xy[i] = origin; + } + + if (!origins[2].hasType()) { + result = {}; + return; + } + transformOrigin.z = (Float)origins[2]; + + result = transformOrigin; +} + +void parseUnprocessedTransformOriginString( + const std::string& value, + TransformOrigin& result) { + auto cssOrigin = parseCSSProperty(value); + if (!std::holds_alternative(cssOrigin)) { + result = {}; + return; + } + + const auto& origin = std::get(cssOrigin); + TransformOrigin transformOrigin; + + auto x = cssLengthPercentageToValueUnit(origin.x); + auto y = cssLengthPercentageToValueUnit(origin.y); + if (!x || !y) { + result = {}; + return; + } + + transformOrigin.xy[0] = x; + transformOrigin.xy[1] = y; + + if (origin.z.unit != CSSLengthUnit::Px) { + result = {}; + return; + } + transformOrigin.z = origin.z.value; + + result = transformOrigin; +} + +void parseUnprocessedTransformOrigin( + const PropsParserContext& context, + const RawValue& value, + TransformOrigin& result) { + if (value.hasType()) { + parseUnprocessedTransformOriginString((std::string)value, result); + } else { + parseProcessedTransformOrigin(context, value, result); + } +} + +} // namespace + +void fromRawValue( + const PropsParserContext& context, + const RawValue& value, + TransformOrigin& result) { + if (ReactNativeFeatureFlags::enableNativeCSSParsing()) { + parseUnprocessedTransformOrigin(context, value, result); + } else { + parseProcessedTransformOrigin(context, value, result); + } +} + +} // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h index e1be3a01a291..df11da0d3a34 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/conversions.h @@ -11,19 +11,11 @@ #include #include -#include #include #include #include #include #include -#include -#include -#include -#include -#include -#include -#include #include #include #include @@ -32,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -446,645 +437,26 @@ inline void fromRawValue(const PropsParserContext &context, const RawValue &valu LOG(ERROR) << "Could not parse yoga::Display: " << stringValue; } -inline void fromRawValue(const PropsParserContext & /*context*/, const RawValue &value, yoga::Style::SizeLength &result) -{ - if (value.hasType()) { - result = yoga::StyleSizeLength::points((float)value); - return; - } else if (value.hasType()) { - const auto stringValue = (std::string)value; - if (stringValue == "auto") { - result = yoga::StyleSizeLength::ofAuto(); - return; - } else if (stringValue == "max-content") { - result = yoga::StyleSizeLength::ofMaxContent(); - return; - } else if (stringValue == "stretch") { - result = yoga::StyleSizeLength::ofStretch(); - return; - } else if (stringValue == "fit-content") { - result = yoga::StyleSizeLength::ofFitContent(); - return; - } else { - auto parsed = parseCSSProperty(stringValue); - if (std::holds_alternative(parsed)) { - result = yoga::StyleSizeLength::percent(std::get(parsed).value); - return; - } else if (std::holds_alternative(parsed)) { - result = yoga::StyleSizeLength::points(std::get(parsed).value); - return; - } - } - } - result = yoga::StyleSizeLength::undefined(); -} +void fromRawValue(const PropsParserContext & /*context*/, const RawValue &value, yoga::Style::SizeLength &result); -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, yoga::Style::Length &result) -{ - if (value.hasType()) { - result = yoga::StyleLength::points((float)value); - return; - } else if (value.hasType()) { - const auto stringValue = (std::string)value; - if (stringValue == "auto") { - result = yoga::StyleLength::ofAuto(); - return; - } else { - auto parsed = parseCSSProperty(stringValue); - if (std::holds_alternative(parsed)) { - result = yoga::StyleLength::percent(std::get(parsed).value); - return; - } else if (std::holds_alternative(parsed)) { - result = yoga::StyleLength::points(std::get(parsed).value); - return; - } - } - } - result = yoga::StyleLength::undefined(); -} +void fromRawValue(const PropsParserContext &context, const RawValue &value, yoga::Style::Length &result); -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, YGValue &result) -{ - yoga::Style::Length length{}; - fromRawValue(context, value, length); - result = (YGValue)length; -} +void fromRawValue(const PropsParserContext &context, const RawValue &value, YGValue &result); inline void fromRawValue(const PropsParserContext &context, const RawValue &value, yoga::FloatOptional &result) { result = value.hasType() ? yoga::FloatOptional((float)value) : yoga::FloatOptional(); } -inline yoga::FloatOptional convertAspectRatio(const PropsParserContext & /*context*/, const RawValue &value) -{ - if (value.hasType()) { - return yoga::FloatOptional((float)value); - } - if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing() && value.hasType()) { - auto ratio = parseCSSProperty((std::string)value); - if (std::holds_alternative(ratio)) { - auto r = std::get(ratio); - if (!r.isDegenerate()) { - return yoga::FloatOptional(r.numerator / r.denominator); - } - } - } - return {}; -} - -inline std::optional toRadians(const RawValue &value) -{ - if (value.hasType()) { - return (Float)value; - } - if (!value.hasType()) { - return {}; - } - - auto angle = parseCSSProperty((std::string)value); - if (std::holds_alternative(angle)) { - return static_cast(std::get(angle).degrees * M_PI / 180.0f); - } - - return {}; -} - -inline ValueUnit toValueUnit(const RawValue &value) -{ - if (value.hasType()) { - return ValueUnit((Float)value, UnitType::Point); - } - if (!value.hasType()) { - return {}; - } - - auto pct = parseCSSProperty((std::string)value); - if (std::holds_alternative(pct)) { - return ValueUnit(std::get(pct).value, UnitType::Percent); - } - - return {}; -} - -inline void fromRawValue(const PropsParserContext & /*context*/, const RawValue &value, ValueUnit &result) -{ - result = toValueUnit(value); -} - -inline ValueUnit cssLengthPercentageToValueUnit(const std::variant &value) -{ - if (std::holds_alternative(value)) { - auto len = std::get(value); - if (len.unit != CSSLengthUnit::Px) { - return {}; - } - return {len.value, UnitType::Point}; - } else { - return {std::get(value).value, UnitType::Percent}; - } -} - -inline std::optional fromCSSTransformFunction(const CSSTransformFunction &cssTransform) -{ - constexpr auto Zero = ValueUnit(0, UnitType::Point); - constexpr auto One = ValueUnit(1, UnitType::Point); - - return std::visit( - [&](auto &&func) -> std::optional { - using T = std::decay_t; - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Rotate, .x = Zero, .y = Zero, .z = ValueUnit(radians, UnitType::Point)}; - } - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Rotate, .x = ValueUnit(radians, UnitType::Point), .y = Zero, .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Rotate, .x = Zero, .y = ValueUnit(radians, UnitType::Point), .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Rotate, .x = Zero, .y = Zero, .z = ValueUnit(radians, UnitType::Point)}; - } - - if constexpr (std::is_same_v) { - auto x = cssLengthPercentageToValueUnit(func.x); - auto y = cssLengthPercentageToValueUnit(func.y); - if (!x || !y) { - return std::nullopt; - } - return TransformOperation{.type = TransformOperationType::Translate, .x = x, .y = y, .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto x = cssLengthPercentageToValueUnit(func.value); - if (!x) { - return std::nullopt; - } - return TransformOperation{.type = TransformOperationType::Translate, .x = x, .y = Zero, .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto y = cssLengthPercentageToValueUnit(func.value); - if (!y) { - return std::nullopt; - } - return TransformOperation{.type = TransformOperationType::Translate, .x = Zero, .y = y, .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto x = cssLengthPercentageToValueUnit(func.x); - auto y = cssLengthPercentageToValueUnit(func.y); - if (!x || !y || func.z.unit != CSSLengthUnit::Px) { - return std::nullopt; - } - return TransformOperation{ - .type = TransformOperationType::Translate, .x = x, .y = y, .z = ValueUnit(func.z.value, UnitType::Point)}; - } - - if constexpr (std::is_same_v) { - return TransformOperation{ - .type = TransformOperationType::Scale, - .x = ValueUnit(func.x, UnitType::Point), - .y = ValueUnit(func.y, UnitType::Point), - .z = One}; - } - - if constexpr (std::is_same_v) { - return TransformOperation{ - .type = TransformOperationType::Scale, .x = ValueUnit(func.value, UnitType::Point), .y = One, .z = One}; - } - - if constexpr (std::is_same_v) { - return TransformOperation{ - .type = TransformOperationType::Scale, .x = One, .y = ValueUnit(func.value, UnitType::Point), .z = One}; - } - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Skew, .x = ValueUnit(radians, UnitType::Point), .y = Zero, .z = Zero}; - } - - if constexpr (std::is_same_v) { - auto radians = static_cast(func.degrees * M_PI / 180.0f); - return TransformOperation{ - .type = TransformOperationType::Skew, .x = Zero, .y = ValueUnit(radians, UnitType::Point), .z = Zero}; - } - - if constexpr (std::is_same_v) { - if (func.length.unit != CSSLengthUnit::Px) { - return std::nullopt; - } - return TransformOperation{ - .type = TransformOperationType::Perspective, - .x = ValueUnit(func.length.value, UnitType::Point), - .y = Zero, - .z = Zero}; - } - - if constexpr (std::is_same_v) { - return TransformOperation{.type = TransformOperationType::Arbitrary, .x = Zero, .y = Zero, .z = Zero}; - } - }, - cssTransform); -} - -inline void parseProcessedTransform(const PropsParserContext & /*context*/, const RawValue &value, Transform &result) -{ - auto transformMatrix = Transform{}; - react_native_expect(value.hasType>()); - if (!value.hasType>()) { - result = transformMatrix; - return; - } - - auto configurations = static_cast>(value); - for (const auto &configuration : configurations) { - if (!configuration.hasType>()) { - result = {}; - return; - } - - auto configurationPair = static_cast>(configuration); - if (configurationPair.size() != 1) { - result = {}; - return; - } +yoga::FloatOptional convertAspectRatio(const PropsParserContext & /*context*/, const RawValue &value); - auto pair = configurationPair.begin(); - auto operation = pair->first; - auto ¶meters = pair->second; - auto Zero = ValueUnit(0, UnitType::Point); - auto One = ValueUnit(1, UnitType::Point); - - if (operation == "matrix") { - // T215634510: We should support matrix transforms as part of a list of - // transforms - if (configurations.size() > 1) { - result = {}; - return; - } +ValueUnit toValueUnit(const RawValue &value); - if (!parameters.hasType>()) { - result = {}; - return; - } +void fromRawValue(const PropsParserContext & /*context*/, const RawValue &value, ValueUnit &result); - auto numbers = (std::vector)parameters; - if (numbers.size() != 9 && numbers.size() != 16) { - result = {}; - return; - } - - if (numbers.size() == 16) { - size_t i = 0; +void fromRawValue(const PropsParserContext &context, const RawValue &value, Transform &result); - for (auto number : numbers) { - transformMatrix.matrix[i++] = number; - } - } else if (numbers.size() == 9) { - // We need to convert the 2d transform matrix into a 3d one as such: - // [ - // x00, x01, 0, x02 - // x10, x11, 0, x12 - // 0, 0, 1, 0 - // x20, x21, 0, x22 - // ] - transformMatrix.matrix[0] = numbers[0]; - transformMatrix.matrix[1] = numbers[1]; - transformMatrix.matrix[2] = 0; - transformMatrix.matrix[3] = numbers[2]; - transformMatrix.matrix[4] = numbers[3]; - transformMatrix.matrix[5] = numbers[4]; - transformMatrix.matrix[6] = 0; - transformMatrix.matrix[7] = numbers[5]; - transformMatrix.matrix[8] = 0; - transformMatrix.matrix[9] = 0; - transformMatrix.matrix[10] = 1; - transformMatrix.matrix[11] = 0; - transformMatrix.matrix[12] = numbers[6]; - transformMatrix.matrix[13] = numbers[7]; - transformMatrix.matrix[14] = 0; - transformMatrix.matrix[15] = numbers[8]; - } - transformMatrix.operations.push_back( - TransformOperation{.type = TransformOperationType::Arbitrary, .x = Zero, .y = Zero, .z = Zero}); - } else if (operation == "perspective") { - if (!parameters.hasType()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Perspective, - .x = ValueUnit((Float)parameters, UnitType::Point), - .y = Zero, - .z = Zero}); - } else if (operation == "rotateX") { - auto radians = toRadians(parameters); - if (!radians.has_value()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Rotate, .x = ValueUnit(*radians, UnitType::Point), .y = Zero, .z = Zero}); - } else if (operation == "rotateY") { - auto radians = toRadians(parameters); - if (!radians.has_value()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Rotate, .x = Zero, .y = ValueUnit(*radians, UnitType::Point), .z = Zero}); - } else if (operation == "rotateZ" || operation == "rotate") { - auto radians = toRadians(parameters); - if (!radians.has_value()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Rotate, .x = Zero, .y = Zero, .z = ValueUnit(*radians, UnitType::Point)}); - } else if (operation == "scale") { - if (!parameters.hasType()) { - result = {}; - return; - } - - auto number = ValueUnit((Float)parameters, UnitType::Point); - transformMatrix.operations.push_back( - TransformOperation{.type = TransformOperationType::Scale, .x = number, .y = number, .z = number}); - } else if (operation == "scaleX") { - if (!parameters.hasType()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Scale, - .x = ValueUnit((Float)parameters, UnitType::Point), - .y = One, - .z = One}); - } else if (operation == "scaleY") { - if (!parameters.hasType()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Scale, - .x = One, - .y = ValueUnit((Float)parameters, UnitType::Point), - .z = One}); - } else if (operation == "scaleZ") { - if (!parameters.hasType()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Scale, - .x = One, - .y = One, - .z = ValueUnit((Float)parameters, UnitType::Point)}); - } else if (operation == "translate") { - if (!parameters.hasType>()) { - result = {}; - return; - } - - auto numbers = (std::vector)parameters; - if (numbers.size() != 2) { - result = {}; - return; - } - - auto valueX = toValueUnit(numbers[0]); - if (!valueX) { - result = {}; - return; - } - - auto valueY = toValueUnit(numbers[1]); - if (!valueY) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{.type = TransformOperationType::Translate, .x = valueX, .y = valueY, .z = Zero}); - } else if (operation == "translateX") { - auto valueX = toValueUnit(parameters); - if (!valueX) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{.type = TransformOperationType::Translate, .x = valueX, .y = Zero, .z = Zero}); - } else if (operation == "translateY") { - auto valueY = toValueUnit(parameters); - if (!valueY) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{.type = TransformOperationType::Translate, .x = Zero, .y = valueY, .z = Zero}); - } else if (operation == "skewX") { - auto radians = toRadians(parameters); - if (!radians.has_value()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Skew, .x = ValueUnit(*radians, UnitType::Point), .y = Zero, .z = Zero}); - } else if (operation == "skewY") { - auto radians = toRadians(parameters); - if (!radians.has_value()) { - result = {}; - return; - } - - transformMatrix.operations.push_back( - TransformOperation{ - .type = TransformOperationType::Skew, .x = Zero, .y = ValueUnit(*radians, UnitType::Point), .z = Zero}); - } - } - - result = transformMatrix; -} - -inline void parseUnprocessedTransformString(const std::string &value, Transform &result) -{ - auto transformList = parseCSSProperty(value); - if (!std::holds_alternative(transformList)) { - result = {}; - return; - } - - auto transformMatrix = Transform{}; - const auto &cssFuncs = std::get(transformList); - transformMatrix.operations.reserve(cssFuncs.size()); - for (const auto &cssFunc : cssFuncs) { - auto op = fromCSSTransformFunction(cssFunc); - if (!op.has_value()) { - result = {}; - return; - } - - if (op->type == TransformOperationType::Arbitrary) { - // CSSMatrix: expand 6-value 2D matrix to 4x4 matrix - if (std::holds_alternative(cssFunc)) { - const auto &m = std::get(cssFunc); - transformMatrix.matrix[0] = m.values[0]; - transformMatrix.matrix[1] = m.values[1]; - transformMatrix.matrix[2] = 0; - transformMatrix.matrix[3] = 0; - transformMatrix.matrix[4] = m.values[2]; - transformMatrix.matrix[5] = m.values[3]; - transformMatrix.matrix[6] = 0; - transformMatrix.matrix[7] = 0; - transformMatrix.matrix[8] = 0; - transformMatrix.matrix[9] = 0; - transformMatrix.matrix[10] = 1; - transformMatrix.matrix[11] = 0; - transformMatrix.matrix[12] = m.values[4]; - transformMatrix.matrix[13] = m.values[5]; - transformMatrix.matrix[14] = 0; - transformMatrix.matrix[15] = 1; - } - } - - transformMatrix.operations.push_back(*op); - } - - result = transformMatrix; -} - -inline void parseUnprocessedTransform(const PropsParserContext &context, const RawValue &value, Transform &result) -{ - if (value.hasType()) { - parseUnprocessedTransformString((std::string)value, result); - } else { - parseProcessedTransform(context, value, result); - } -} - -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, Transform &result) -{ - if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { - parseUnprocessedTransform(context, value, result); - } else { - parseProcessedTransform(context, value, result); - } -} - -inline void -parseProcessedTransformOrigin(const PropsParserContext & /*context*/, const RawValue &value, TransformOrigin &result) -{ - if (!value.hasType>()) { - result = {}; - return; - } - - auto origins = (std::vector)value; - if (origins.size() != 3) { - result = {}; - return; - } - - TransformOrigin transformOrigin; - - for (size_t i = 0; i < 2; i++) { - auto origin = toValueUnit(origins[i]); - if (!origin) { - result = {}; - return; - } - - transformOrigin.xy[i] = origin; - } - - if (!origins[2].hasType()) { - result = {}; - return; - } - transformOrigin.z = (Float)origins[2]; - - result = transformOrigin; -} - -inline void parseUnprocessedTransformOriginString(const std::string &value, TransformOrigin &result) -{ - auto cssOrigin = parseCSSProperty(value); - if (!std::holds_alternative(cssOrigin)) { - result = {}; - return; - } - - const auto &origin = std::get(cssOrigin); - TransformOrigin transformOrigin; - - auto x = cssLengthPercentageToValueUnit(origin.x); - auto y = cssLengthPercentageToValueUnit(origin.y); - if (!x || !y) { - result = {}; - return; - } - - transformOrigin.xy[0] = x; - transformOrigin.xy[1] = y; - - if (origin.z.unit != CSSLengthUnit::Px) { - result = {}; - return; - } - transformOrigin.z = origin.z.value; - - result = transformOrigin; -} - -inline void -parseUnprocessedTransformOrigin(const PropsParserContext &context, const RawValue &value, TransformOrigin &result) -{ - if (value.hasType()) { - parseUnprocessedTransformOriginString((std::string)value, result); - } else { - parseProcessedTransformOrigin(context, value, result); - } -} - -inline void fromRawValue(const PropsParserContext &context, const RawValue &value, TransformOrigin &result) -{ - if (ReactNativeFeatureFlags_DO_NOT_USE::enableNativeCSSParsing()) { - parseUnprocessedTransformOrigin(context, value, result); - } else { - parseProcessedTransformOrigin(context, value, result); - } -} +void fromRawValue(const PropsParserContext &context, const RawValue &value, TransformOrigin &result); inline void fromRawValue(const PropsParserContext &context, const RawValue &value, PointerEventsMode &result) { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp index 07d1839a4c0a..1ca47172f9fa 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp +++ b/packages/react-native/ReactCommon/react/renderer/components/view/tests/ConversionsTest.cpp @@ -379,10 +379,10 @@ TEST_F(NativeCSSConversionsTest, unprocessed_filter_objects_unknown_type) { EXPECT_TRUE(filters.empty()); } -TEST(ConversionsTest, unprocessed_transform_css_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_string) { + RawValue value{folly::dynamic("rotate(45deg) scale(2) translateX(10px)")}; Transform result; - parseUnprocessedTransformString( - "rotate(45deg) scale(2) translateX(10px)", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 3); @@ -405,9 +405,10 @@ TEST(ConversionsTest, unprocessed_transform_css_string) { EXPECT_EQ(result.operations[2].y.value, 0.0f); } -TEST(ConversionsTest, unprocessed_transform_css_translate_percent) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_translate_percent) { + RawValue value{folly::dynamic("translate(10px, 50%)")}; Transform result; - parseUnprocessedTransformString("translate(10px, 50%)", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 1); EXPECT_EQ(result.operations[0].type, TransformOperationType::Translate); @@ -417,27 +418,28 @@ TEST(ConversionsTest, unprocessed_transform_css_translate_percent) { EXPECT_EQ(result.operations[0].y.unit, UnitType::Percent); } -TEST(ConversionsTest, unprocessed_transform_css_perspective) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_perspective) { + RawValue value{folly::dynamic("perspective(500px)")}; Transform result; - parseUnprocessedTransformString("perspective(500px)", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 1); EXPECT_EQ(result.operations[0].type, TransformOperationType::Perspective); EXPECT_EQ(result.operations[0].x.value, 500.0f); } -TEST(ConversionsTest, unprocessed_transform_css_invalid_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_css_invalid_string) { + RawValue value{folly::dynamic("not-a-transform")}; Transform result; - parseUnprocessedTransformString("not-a-transform", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_TRUE(result.operations.empty()); } -TEST(ConversionsTest, unprocessed_transform_rawvalue_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_rawvalue_string) { RawValue value{folly::dynamic("rotate(45deg) scale(2)")}; Transform result; - parseUnprocessedTransform( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 2); EXPECT_EQ(result.operations[0].type, TransformOperationType::Rotate); @@ -449,8 +451,7 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_array) { folly::dynamic::object("rotate", "45deg"), folly::dynamic::object("scale", 2))}; Transform result; - parseUnprocessedTransform( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 2); EXPECT_EQ(result.operations[0].type, TransformOperationType::Rotate); @@ -465,8 +466,7 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_matrix) { folly::dynamic::array( 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)))}; Transform result; - parseUnprocessedTransform( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 1); EXPECT_EQ(result.operations[0].type, TransformOperationType::Arbitrary); @@ -476,8 +476,7 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_translate_percent) { RawValue value{ folly::dynamic::array(folly::dynamic::object("translateX", "50%"))}; Transform result; - parseUnprocessedTransform( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.operations.size(), 1); EXPECT_EQ(result.operations[0].type, TransformOperationType::Translate); @@ -485,9 +484,10 @@ TEST(ConversionsTest, unprocessed_transform_rawvalue_translate_percent) { EXPECT_EQ(result.operations[0].x.unit, UnitType::Percent); } -TEST(ConversionsTest, unprocessed_transform_origin_css_top_left) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_css_top_left) { + RawValue value{folly::dynamic("top left")}; TransformOrigin result; - parseUnprocessedTransformOriginString("top left", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 0.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -496,9 +496,10 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_top_left) { EXPECT_EQ(result.z, 0.0f); } -TEST(ConversionsTest, unprocessed_transform_origin_css_center) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_css_center) { + RawValue value{folly::dynamic("center")}; TransformOrigin result; - parseUnprocessedTransformOriginString("center", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 50.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -507,9 +508,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_center) { EXPECT_EQ(result.z, 0.0f); } -TEST(ConversionsTest, unprocessed_transform_origin_css_right_bottom) { +TEST_F( + NativeCSSConversionsTest, + unprocessed_transform_origin_css_right_bottom) { + RawValue value{folly::dynamic("right bottom")}; TransformOrigin result; - parseUnprocessedTransformOriginString("right bottom", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 100.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -518,9 +522,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_css_right_bottom) { EXPECT_EQ(result.z, 0.0f); } -TEST(ConversionsTest, unprocessed_transform_origin_css_length_percent) { +TEST_F( + NativeCSSConversionsTest, + unprocessed_transform_origin_css_length_percent) { + RawValue value{folly::dynamic("10px 50%")}; TransformOrigin result; - parseUnprocessedTransformOriginString("10px 50%", result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 10.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Point); @@ -533,8 +540,7 @@ TEST(ConversionsTest, unprocessed_transform_origin_processed_array) { RawValue value{folly::dynamic::array("50%", "50%", 0)}; TransformOrigin result; - parseProcessedTransformOrigin( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 50.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -543,11 +549,10 @@ TEST(ConversionsTest, unprocessed_transform_origin_processed_array) { EXPECT_EQ(result.z, 0.0f); } -TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string) { +TEST_F(NativeCSSConversionsTest, unprocessed_transform_origin_rawvalue_string) { RawValue value{folly::dynamic("top left")}; TransformOrigin result; - parseUnprocessedTransformOrigin( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 0.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -559,8 +564,7 @@ TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string) { TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_array) { RawValue value{folly::dynamic::array(10, "50%", 5)}; TransformOrigin result; - parseUnprocessedTransformOrigin( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 10.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Point); @@ -569,11 +573,12 @@ TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_array) { EXPECT_EQ(result.z, 5.0f); } -TEST(ConversionsTest, unprocessed_transform_origin_rawvalue_string_with_z) { +TEST_F( + NativeCSSConversionsTest, + unprocessed_transform_origin_rawvalue_string_with_z) { RawValue value{folly::dynamic("center center 15px")}; TransformOrigin result; - parseUnprocessedTransformOrigin( - PropsParserContext{-1, ContextContainer{}}, value, result); + fromRawValue(PropsParserContext{-1, ContextContainer{}}, value, result); EXPECT_EQ(result.xy[0].value, 50.0f); EXPECT_EQ(result.xy[0].unit, UnitType::Percent); @@ -616,28 +621,30 @@ TEST(ConversionsTest, convert_aspect_ratio_float) { EXPECT_EQ(result.unwrap(), 1.5f); } -TEST(ConversionsTest, convert_aspect_ratio_ratio_string) { - // CSSRatio parses "16/9" as {numerator: 16, denominator: 9} - auto ratio = parseCSSProperty("16/9"); - ASSERT_TRUE(std::holds_alternative(ratio)); - auto r = std::get(ratio); - EXPECT_FALSE(r.isDegenerate()); - EXPECT_NEAR(r.numerator / r.denominator, 16.0f / 9.0f, 0.001f); +TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_ratio_string) { + RawValue value{folly::dynamic("16/9")}; + auto result = + convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value); + + ASSERT_FALSE(result.isUndefined()); + EXPECT_NEAR(result.unwrap(), 16.0f / 9.0f, 0.001f); } -TEST(ConversionsTest, convert_aspect_ratio_number_string) { - // CSSRatio parses "1.5" as {numerator: 1.5, denominator: 1.0} - auto ratio = parseCSSProperty("1.5"); - ASSERT_TRUE(std::holds_alternative(ratio)); - auto r = std::get(ratio); - EXPECT_FALSE(r.isDegenerate()); - EXPECT_EQ(r.numerator / r.denominator, 1.5f); +TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_number_string) { + RawValue value{folly::dynamic("1.5")}; + auto result = + convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value); + + ASSERT_FALSE(result.isUndefined()); + EXPECT_EQ(result.unwrap(), 1.5f); } -TEST(ConversionsTest, convert_aspect_ratio_degenerate) { - auto ratio = parseCSSProperty("0/0"); - ASSERT_TRUE(std::holds_alternative(ratio)); - EXPECT_TRUE(std::get(ratio).isDegenerate()); +TEST_F(NativeCSSConversionsTest, convert_aspect_ratio_degenerate) { + RawValue value{folly::dynamic("0/0")}; + auto result = + convertAspectRatio(PropsParserContext{-1, ContextContainer{}}, value); + + EXPECT_TRUE(result.isUndefined()); } TEST(ConversionsTest, float_optional_from_rawvalue_float) { diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index c94106c4bb45..b905186c6dc5 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -900,7 +900,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -948,10 +947,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -1144,16 +1141,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::reactAndroidLoggingHook(const std::string& message, unsigned int logLevel); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index ae0ae0624436..4dcd113c22bd 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -899,7 +899,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -946,10 +945,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -1140,16 +1137,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::reactAndroidLoggingHook(const std::string& message, unsigned int logLevel); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index b37f14c4bff6..00bc539114a1 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -900,7 +900,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -948,10 +947,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -1144,16 +1141,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::reactAndroidLoggingHook(const std::string& message, unsigned int logLevel); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index dbc52e12ad14..29ecdea3fb25 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -3714,7 +3714,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -3746,10 +3745,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -3944,16 +3941,10 @@ void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const faceb void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index 2a155bb00cc6..f7e078e745c5 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3705,7 +3705,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -3736,10 +3735,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -3933,16 +3930,10 @@ void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const faceb void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 2a4ecfc99f7a..f6278ff723a6 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -3714,7 +3714,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(facebook::react::Float value); @@ -3746,10 +3745,8 @@ std::optional facebook::react::blendModeFromString(s std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -3944,16 +3941,10 @@ void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const faceb void facebook::react::installLegacyUIManagerConstantsProviderBinding(facebook::jsi::Runtime& runtime); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index c0a0d541c77e..c76bc5133d75 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -494,7 +494,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(Float value); @@ -518,12 +517,10 @@ size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::Text std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -704,16 +701,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index f2936607e4a0..9465e4a27910 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -493,7 +493,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(Float value); @@ -516,12 +515,10 @@ size_t facebook::react::attributedStringHashLayoutWise(const facebook::react::At size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::TextAttributes& textAttributes); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -701,16 +698,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index b4416c9a9247..0f87d392d191 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -494,7 +494,6 @@ facebook::react::Size facebook::react::ModalHostViewScreenSize(void); facebook::react::Size facebook::react::yogaMeassureToSize(int64_t value); facebook::react::SurfaceId facebook::react::getNextRootViewTag() noexcept; facebook::react::TurboModuleMethodValueKind facebook::react::getTurboModuleMethodValueKind(facebook::jsi::Runtime& rt, const facebook::jsi::Value* value); -facebook::react::ValueUnit facebook::react::cssLengthPercentageToValueUnit(const std::variant& value); facebook::react::ValueUnit facebook::react::toValueUnit(const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::convertAspectRatio(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value); facebook::yoga::FloatOptional facebook::react::yogaOptionalFloatFromFloat(Float value); @@ -518,12 +517,10 @@ size_t facebook::react::textAttributesHashLayoutWise(const facebook::react::Text std::function facebook::react::makeCallback(std::weak_ptr instance, const folly::dynamic& callbackId); std::optional facebook::react::coerceLength(const facebook::react::RawValue& value); std::optional facebook::react::optionalFloatFromYogaValue(const facebook::yoga::Style::Length& length, std::optional base = {}); -std::optional facebook::react::toRadians(const facebook::react::RawValue& value); std::optional facebook::react::blendModeFromString(std::string_view blendModeName); std::optional facebook::react::filterTypeFromString(std::string_view filterName); std::optional facebook::react::fontVariantFromCSSFontVariant(facebook::react::CSSFontVariant cssVariant); std::optional facebook::react::isolationFromString(std::string_view isolationSetting); -std::optional facebook::react::fromCSSTransformFunction(const facebook::react::CSSTransformFunction& cssTransform); std::pair facebook::react::calculateAnimationProgress(uint64_t now, const facebook::react::LayoutAnimation& animation, const facebook::react::AnimationConfig& mutationConfig); std::string facebook::react::base64Encode(const std::string_view s); std::string facebook::react::componentNameByReactViewName(std::string viewName); @@ -704,16 +701,10 @@ void facebook::react::g_setNativeAnimatedNowTimestampFunction(facebook::react::T void facebook::react::handleJSError(facebook::jsi::Runtime& runtime, const facebook::jsi::JSError& error, bool isFatal); void facebook::react::parseProcessedBackgroundImage(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, std::vector& result); void facebook::react::parseProcessedFontVariant(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::FontVariant& result); -void facebook::react::parseProcessedTransform(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseProcessedTransformOrigin(const facebook::react::PropsParserContext&, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); void facebook::react::parseUnprocessedBackgroundImageList(const facebook::react::PropsParserContext& context, const std::vector& value, std::vector& result); void facebook::react::parseUnprocessedBackgroundImageString(const std::string& value, std::vector& result); void facebook::react::parseUnprocessedFontVariant(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::FontVariant& result); void facebook::react::parseUnprocessedFontVariantString(const std::string& value, facebook::react::FontVariant& result); -void facebook::react::parseUnprocessedTransform(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::Transform& result); -void facebook::react::parseUnprocessedTransformOrigin(const facebook::react::PropsParserContext& context, const facebook::react::RawValue& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformOriginString(const std::string& value, facebook::react::TransformOrigin& result); -void facebook::react::parseUnprocessedTransformString(const std::string& value, facebook::react::Transform& result); void facebook::react::registerCxxModuleToGlobalModuleMap(std::string name, std::function(std::shared_ptr jsInvoker)> moduleProviderFunc); void facebook::react::serializeTransformAxis(const facebook::react::TransformOperation& operation, const std::string& operationName, float defaultValue, folly::dynamic& resultTranslateArray); void facebook::react::serializeTransformOperationValue(const std::string& operationName, const facebook::react::ValueUnit& valueUnit, folly::dynamic& resultArray); From 2c2bcf678d7119d41bd0e3a7af095dd88fdb35c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ma=C5=82ecki?= Date: Fri, 2 Oct 2026 05:46:55 -0700 Subject: [PATCH 3/3] Seal renderer View public boundary Summary: Reclassify the CSS-dependent View conversion headers as private implementation details: - `BackgroundImagePropsConversions.h` - `BoxShadowPropsConversions.h` - `CSSConversions.h` - `FilterPropsConversions.h` - `propsConversions.h` These headers now use the private guard and are removed from the `` umbrella, along with `conversions.h`. The public `accessibilityPropsConversions.h` stays in the umbrella: it is CSS-free, and framework-tier headers such as the attributed string conversions reach the accessibility role parsers through it. `LayoutConformanceProps.h` now includes the public `conversions.h` and core `propsConversions.h` instead of the private View `propsConversions.h`, so the umbrella stays self-contained under the strict API. Following the Graphics module, renderer CSS becomes an implementation dependency of View in Buck instead of an exported one. Header publishing in Buck, CocoaPods, SwiftPM, and Gradle prefab is unchanged, consistent with other private headers, and the C++ API snapshots are unchanged. Changelog: [Internal] Reviewed By: cipolleschi Differential Revision: D119970889 --- .../components/view/BackgroundImagePropsConversions.h | 2 +- .../renderer/components/view/BoxShadowPropsConversions.h | 2 +- .../react/renderer/components/view/CSSConversions.h | 2 +- .../react/renderer/components/view/FilterPropsConversions.h | 2 +- .../react/renderer/components/view/LayoutConformanceProps.h | 3 ++- .../ReactCommon/react/renderer/components/view/React/View.h | 6 ------ .../react/renderer/components/view/propsConversions.h | 2 +- 7 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h index a8c38ae5d9c7..b35fcaa0d04a 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BackgroundImagePropsConversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h index 671c9eb2389d..f34b32cc2832 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/BoxShadowPropsConversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h index c29346ca990f..258b137f56af 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/CSSConversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h index 657b90781711..539d89af88e5 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/FilterPropsConversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/LayoutConformanceProps.h b/packages/react-native/ReactCommon/react/renderer/components/view/LayoutConformanceProps.h index dcf81de41678..d66dfbfee722 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/LayoutConformanceProps.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/LayoutConformanceProps.h @@ -10,7 +10,8 @@ #include #include -#include +#include +#include namespace facebook::react { diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h b/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h index 05b502a52229..09d0f82ef11e 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/React/View.h @@ -33,14 +33,10 @@ #include #include -#include #include #include #include -#include -#include #include -#include #include #include #include @@ -60,9 +56,7 @@ #include #include #include -#include #include -#include #undef RN_UMBRELLA_CONTEXT #pragma pop_macro("RN_UMBRELLA_CONTEXT") diff --git a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h index 4644cfbf4722..8483e5981dc6 100644 --- a/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h +++ b/packages/react-native/ReactCommon/react/renderer/components/view/propsConversions.h @@ -7,7 +7,7 @@ #pragma once -#include +#include #include #include