Files
yoga/yoga/algorithm/FlexDirection.h
Nick Gerleman 8744792f41 Simplify Edge Resolution (#1550)
Summary:
X-link: https://github.com/facebook/react-native/pull/42254

Pull Request resolved: https://github.com/facebook/yoga/pull/1550

This change aims to simplify how we resolve edges. This operation happens many, many times, and has gotten complex and slow when paired with StyleValuePool.

This starts reshaping so that `yoga::Style` can resolve a style prop for a given edge. This is closer to the ideal computed style API to avoid recalcing this so many times, but doesn't address that.

This relies on removing the errata related to row-reverse, and cleans up the removal started in the last change.

This has no measurable perf effect under CompactValue, but has a >10% uplift in perf when using StyleValueHandle, where we can trivially check if a handle points to a defined value without resolving it, but only within `yoga::Style` since we don't expose the handle outside of it.

More quantifiably, we go from 2.35 million StyleValuePool reads to 993k. The rest are checks on the handle.

Reviewed By: joevilches

Differential Revision: D52605596

fbshipit-source-id: 0b366963a899e376f99ce3d75cd5f14a25d60cec
2024-01-19 11:28:06 -08:00

121 lines
3.1 KiB
C++

/*
* 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.
*/
#pragma once
#include <yoga/Yoga.h>
#include <yoga/debug/AssertFatal.h>
#include <yoga/enums/Dimension.h>
#include <yoga/enums/Direction.h>
#include <yoga/enums/Edge.h>
#include <yoga/enums/FlexDirection.h>
#include <yoga/enums/PhysicalEdge.h>
namespace facebook::yoga {
inline bool isRow(const FlexDirection flexDirection) {
return flexDirection == FlexDirection::Row ||
flexDirection == FlexDirection::RowReverse;
}
inline bool isColumn(const FlexDirection flexDirection) {
return flexDirection == FlexDirection::Column ||
flexDirection == FlexDirection::ColumnReverse;
}
inline FlexDirection resolveDirection(
const FlexDirection flexDirection,
const Direction direction) {
if (direction == Direction::RTL) {
if (flexDirection == FlexDirection::Row) {
return FlexDirection::RowReverse;
} else if (flexDirection == FlexDirection::RowReverse) {
return FlexDirection::Row;
}
}
return flexDirection;
}
inline FlexDirection resolveCrossDirection(
const FlexDirection flexDirection,
const Direction direction) {
return isColumn(flexDirection)
? resolveDirection(FlexDirection::Row, direction)
: FlexDirection::Column;
}
inline PhysicalEdge flexStartEdge(FlexDirection flexDirection) {
switch (flexDirection) {
case FlexDirection::Column:
return PhysicalEdge::Top;
case FlexDirection::ColumnReverse:
return PhysicalEdge::Bottom;
case FlexDirection::Row:
return PhysicalEdge::Left;
case FlexDirection::RowReverse:
return PhysicalEdge::Right;
}
fatalWithMessage("Invalid FlexDirection");
}
inline PhysicalEdge flexEndEdge(FlexDirection flexDirection) {
switch (flexDirection) {
case FlexDirection::Column:
return PhysicalEdge::Bottom;
case FlexDirection::ColumnReverse:
return PhysicalEdge::Top;
case FlexDirection::Row:
return PhysicalEdge::Right;
case FlexDirection::RowReverse:
return PhysicalEdge::Left;
}
fatalWithMessage("Invalid FlexDirection");
}
inline PhysicalEdge inlineStartEdge(
FlexDirection flexDirection,
Direction direction) {
if (isRow(flexDirection)) {
return direction == Direction::RTL ? PhysicalEdge::Right
: PhysicalEdge::Left;
}
return PhysicalEdge::Top;
}
inline PhysicalEdge inlineEndEdge(
FlexDirection flexDirection,
Direction direction) {
if (isRow(flexDirection)) {
return direction == Direction::RTL ? PhysicalEdge::Left
: PhysicalEdge::Right;
}
return PhysicalEdge::Bottom;
}
inline Dimension dimension(FlexDirection flexDirection) {
switch (flexDirection) {
case FlexDirection::Column:
return Dimension::Height;
case FlexDirection::ColumnReverse:
return Dimension::Height;
case FlexDirection::Row:
return Dimension::Width;
case FlexDirection::RowReverse:
return Dimension::Width;
}
fatalWithMessage("Invalid FlexDirection");
}
} // namespace facebook::yoga