Skip to content

Commit c4519a0

Browse files
NickGerlemanfacebook-github-bot
authored andcommitted
Remove composite border comparisons (facebook#41568)
Summary: X-link: facebook/yoga#1475 Pull Request resolved: facebook#41568 Removes cases where we rely on comparing composite of Yoga edges, since we are removing that internal API (public API is already one at a time). Extracted from D50998164, with more sound facility for looping through edges. Changelog: [Internal] Reviewed By: javache Differential Revision: D51478403 fbshipit-source-id: 162170b91345ff86db44a49a04a2345f0fbd0911
1 parent bf4e229 commit c4519a0

File tree

4 files changed

+80
-15
lines changed

4 files changed

+80
-15
lines changed

packages/react-native/ReactCommon/react/renderer/components/view/ViewShadowNode.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,15 @@ ViewShadowNode::ViewShadowNode(
3939
void ViewShadowNode::initialize() noexcept {
4040
auto& viewProps = static_cast<const ViewProps&>(*props_);
4141

42+
auto hasBorder = [&]() {
43+
for (auto edge : yoga::ordinals<yoga::Edge>()) {
44+
if (viewProps.yogaStyle.border()[yoga::unscopedEnum(edge)].isDefined()) {
45+
return true;
46+
}
47+
}
48+
return false;
49+
};
50+
4251
bool formsStackingContext = !viewProps.collapsable ||
4352
viewProps.pointerEvents == PointerEventsMode::None ||
4453
!viewProps.nativeId.empty() || viewProps.accessible ||
@@ -55,8 +64,7 @@ void ViewShadowNode::initialize() noexcept {
5564
HostPlatformViewTraitsInitializer::formsStackingContext(viewProps);
5665

5766
bool formsView = formsStackingContext ||
58-
isColorMeaningful(viewProps.backgroundColor) ||
59-
!(viewProps.yogaStyle.border() == yoga::Style::Edges{}) ||
67+
isColorMeaningful(viewProps.backgroundColor) || hasBorder() ||
6068
!viewProps.testId.empty() ||
6169
HostPlatformViewTraitsInitializer::formsView(viewProps);
6270

packages/react-native/ReactCommon/react/renderer/components/view/platform/android/react/renderer/components/view/YogaStylablePropsMapBuffer.cpp

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,30 @@
1313

1414
namespace facebook::react {
1515

16-
MapBuffer convertBorderWidths(const yoga::Style::Edges& border) {
16+
MapBuffer convertBorderWidths(const yoga::Style& style) {
1717
MapBufferBuilder builder(7);
1818
putOptionalFloat(
19-
builder, EDGE_TOP, optionalFloatFromYogaValue(border[YGEdgeTop]));
19+
builder, EDGE_TOP, optionalFloatFromYogaValue(style.border()[YGEdgeTop]));
2020
putOptionalFloat(
21-
builder, EDGE_RIGHT, optionalFloatFromYogaValue(border[YGEdgeRight]));
21+
builder,
22+
EDGE_RIGHT,
23+
optionalFloatFromYogaValue(style.border()[YGEdgeRight]));
2224
putOptionalFloat(
23-
builder, EDGE_BOTTOM, optionalFloatFromYogaValue(border[YGEdgeBottom]));
25+
builder,
26+
EDGE_BOTTOM,
27+
optionalFloatFromYogaValue(style.border()[YGEdgeBottom]));
2428
putOptionalFloat(
25-
builder, EDGE_LEFT, optionalFloatFromYogaValue(border[YGEdgeLeft]));
29+
builder,
30+
EDGE_LEFT,
31+
optionalFloatFromYogaValue(style.border()[YGEdgeLeft]));
2632
putOptionalFloat(
27-
builder, EDGE_START, optionalFloatFromYogaValue(border[YGEdgeStart]));
33+
builder,
34+
EDGE_START,
35+
optionalFloatFromYogaValue(style.border()[YGEdgeStart]));
2836
putOptionalFloat(
29-
builder, EDGE_END, optionalFloatFromYogaValue(border[YGEdgeEnd]));
37+
builder, EDGE_END, optionalFloatFromYogaValue(style.border()[YGEdgeEnd]));
3038
putOptionalFloat(
31-
builder, EDGE_ALL, optionalFloatFromYogaValue(border[YGEdgeAll]));
39+
builder, EDGE_ALL, optionalFloatFromYogaValue(style.border()[YGEdgeAll]));
3240
return builder.build();
3341
}
3442

@@ -54,9 +62,17 @@ void YogaStylableProps::propsDiffMapBuffer(
5462
const auto& oldStyle = oldProps.yogaStyle;
5563
const auto& newStyle = newProps.yogaStyle;
5664

57-
if (!(oldStyle.border() == newStyle.border())) {
58-
builder.putMapBuffer(
59-
YG_BORDER_WIDTH, convertBorderWidths(newStyle.border()));
65+
bool areBordersEqual = true;
66+
for (auto edge : yoga::ordinals<yoga::Edge>()) {
67+
if (oldStyle.border()[yoga::unscopedEnum(edge)] !=
68+
newStyle.border()[yoga::unscopedEnum(edge)]) {
69+
areBordersEqual = false;
70+
break;
71+
}
72+
}
73+
74+
if (!areBordersEqual) {
75+
builder.putMapBuffer(YG_BORDER_WIDTH, convertBorderWidths(newStyle));
6076
}
6177

6278
if (oldStyle.overflow() != newStyle.overflow()) {

packages/react-native/ReactCommon/yoga/yoga/enums/YogaEnums.h

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,60 @@
77

88
#pragma once
99

10+
#include <iterator>
1011
#include <type_traits>
1112

1213
namespace facebook::yoga {
1314

1415
template <typename EnumT>
1516
constexpr inline int32_t ordinalCount();
1617

18+
/**
19+
* Count of bits needed to represent every ordinal
20+
*/
1721
template <typename EnumT>
1822
constexpr inline int32_t bitCount();
1923

20-
// Polyfill of C++ 23 to_underlying()
21-
// https://en.cppreference.com/w/cpp/utility/to_underlying
24+
/**
25+
* Polyfill of C++ 23 to_underlying()
26+
* https://en.cppreference.com/w/cpp/utility/to_underlying
27+
*/
2228
constexpr auto to_underlying(auto e) noexcept {
2329
return static_cast<std::underlying_type_t<decltype(e)>>(e);
2430
}
2531

32+
/**
33+
* Convenience function to iterate through every value in a Yoga enum as part of
34+
* a range-based for loop.
35+
*/
36+
template <typename EnumT>
37+
auto ordinals() {
38+
struct Iterator {
39+
EnumT e{};
40+
41+
EnumT operator*() const {
42+
return e;
43+
}
44+
45+
Iterator& operator++() {
46+
e = static_cast<EnumT>(to_underlying(e) + 1);
47+
return *this;
48+
}
49+
50+
bool operator==(const Iterator& other) const = default;
51+
bool operator!=(const Iterator& other) const = default;
52+
};
53+
54+
struct Range {
55+
Iterator begin() const {
56+
return Iterator{};
57+
}
58+
Iterator end() const {
59+
return Iterator{static_cast<EnumT>(ordinalCount<EnumT>())};
60+
}
61+
};
62+
63+
return Range{};
64+
}
65+
2666
} // namespace facebook::yoga

packages/react-native/ReactCommon/yoga/yoga/style/Style.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <yoga/enums/Dimension.h>
2020
#include <yoga/enums/Direction.h>
2121
#include <yoga/enums/Display.h>
22+
#include <yoga/enums/Edge.h>
2223
#include <yoga/enums/FlexDirection.h>
2324
#include <yoga/enums/Gutter.h>
2425
#include <yoga/enums/Justify.h>

0 commit comments

Comments
 (0)