mirror of
https://github.com/status-im/react-native.git
synced 2025-02-27 16:40:38 +00:00
Made a separate function for resolving flexible length
Reviewed By: emilsjolander Differential Revision: D6834269 fbshipit-source-id: 954bc7fe8eb9256d353cdda27e5c64c076808e25
This commit is contained in:
parent
ca91f0e3ac
commit
d4517ddb9f
@ -1701,6 +1701,10 @@ static YGCollectFlexItemsRowValues YGCalculateCollectFlexItemsRowValues(
|
|||||||
return flexAlgoRowMeasurement;
|
return flexAlgoRowMeasurement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// It distributes the free space to the flexible items and ensures that the size
|
||||||
|
// of the flex items abide the min and max constraints. At the end of this
|
||||||
|
// function the child nodes would have proper size. Prior using this function
|
||||||
|
// please ensure that YGDistributeFreeSpaceFirstPass is called.
|
||||||
static void YGDistributeFreeSpaceSecondPass(
|
static void YGDistributeFreeSpaceSecondPass(
|
||||||
YGCollectFlexItemsRowValues& collectedFlexItemsValues,
|
YGCollectFlexItemsRowValues& collectedFlexItemsValues,
|
||||||
const YGNodeRef node,
|
const YGNodeRef node,
|
||||||
@ -1878,9 +1882,9 @@ static void YGDistributeFreeSpaceSecondPass(
|
|||||||
collectedFlexItemsValues.remainingFreeSpace += deltaFreeSpace;
|
collectedFlexItemsValues.remainingFreeSpace += deltaFreeSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
// It distributes the free space to the flexible items, for those flexible items
|
// It distributes the free space to the flexible items.For those flexible items
|
||||||
// whose min and max constraints are triggered, the clamped size is removed from
|
// whose min and max constraints are triggered, those flex item's clamped size
|
||||||
// the remaingfreespace.
|
// is removed from the remaingfreespace.
|
||||||
static void YGDistributeFreeSpaceFirstPass(
|
static void YGDistributeFreeSpaceFirstPass(
|
||||||
YGCollectFlexItemsRowValues& collectedFlexItemsValues,
|
YGCollectFlexItemsRowValues& collectedFlexItemsValues,
|
||||||
const YGFlexDirection mainAxis,
|
const YGFlexDirection mainAxis,
|
||||||
@ -1959,6 +1963,70 @@ static void YGDistributeFreeSpaceFirstPass(
|
|||||||
collectedFlexItemsValues.remainingFreeSpace -= deltaFreeSpace;
|
collectedFlexItemsValues.remainingFreeSpace -= deltaFreeSpace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do two passes over the flex items to figure out how to distribute the
|
||||||
|
// remaining space.
|
||||||
|
// The first pass finds the items whose min/max constraints trigger,
|
||||||
|
// freezes them at those
|
||||||
|
// sizes, and excludes those sizes from the remaining space. The second
|
||||||
|
// pass sets the size
|
||||||
|
// of each flexible item. It distributes the remaining space amongst the
|
||||||
|
// items whose min/max
|
||||||
|
// constraints didn't trigger in pass 1. For the other items, it sets
|
||||||
|
// their sizes by forcing
|
||||||
|
// their min/max constraints to trigger again.
|
||||||
|
//
|
||||||
|
// This two pass approach for resolving min/max constraints deviates from
|
||||||
|
// the spec. The
|
||||||
|
// spec (https://www.w3.org/TR/YG-flexbox-1/#resolve-flexible-lengths)
|
||||||
|
// describes a process
|
||||||
|
// that needs to be repeated a variable number of times. The algorithm
|
||||||
|
// implemented here
|
||||||
|
// won't handle all cases but it was simpler to implement and it mitigates
|
||||||
|
// performance
|
||||||
|
// concerns because we know exactly how many passes it'll do.
|
||||||
|
//
|
||||||
|
// At the end of this function the child nodes would have the proper size
|
||||||
|
// assigned to them.
|
||||||
|
//
|
||||||
|
static void YGResolveFlexibleLength(
|
||||||
|
const YGNodeRef node,
|
||||||
|
YGCollectFlexItemsRowValues& collectedFlexItemsValues,
|
||||||
|
const YGFlexDirection mainAxis,
|
||||||
|
const YGFlexDirection crossAxis,
|
||||||
|
const float mainAxisParentSize,
|
||||||
|
const float availableInnerMainDim,
|
||||||
|
const float availableInnerCrossDim,
|
||||||
|
const float availableInnerWidth,
|
||||||
|
const float availableInnerHeight,
|
||||||
|
const bool flexBasisOverflows,
|
||||||
|
const YGMeasureMode measureModeCrossDim,
|
||||||
|
const bool performLayout,
|
||||||
|
const YGConfigRef config) {
|
||||||
|
// First pass: detect the flex items whose min/max constraints trigger
|
||||||
|
YGDistributeFreeSpaceFirstPass(
|
||||||
|
collectedFlexItemsValues,
|
||||||
|
mainAxis,
|
||||||
|
mainAxisParentSize,
|
||||||
|
availableInnerMainDim,
|
||||||
|
availableInnerWidth);
|
||||||
|
|
||||||
|
// Second pass: resolve the sizes of the flexible items
|
||||||
|
YGDistributeFreeSpaceSecondPass(
|
||||||
|
collectedFlexItemsValues,
|
||||||
|
node,
|
||||||
|
mainAxis,
|
||||||
|
crossAxis,
|
||||||
|
mainAxisParentSize,
|
||||||
|
availableInnerMainDim,
|
||||||
|
availableInnerCrossDim,
|
||||||
|
availableInnerWidth,
|
||||||
|
availableInnerHeight,
|
||||||
|
flexBasisOverflows,
|
||||||
|
measureModeCrossDim,
|
||||||
|
performLayout,
|
||||||
|
config);
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is the main routine that implements a subset of the flexbox layout
|
// This is the main routine that implements a subset of the flexbox layout
|
||||||
// algorithm
|
// algorithm
|
||||||
@ -2304,40 +2372,9 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!canSkipFlex) {
|
if (!canSkipFlex) {
|
||||||
// Do two passes over the flex items to figure out how to distribute the
|
YGResolveFlexibleLength(
|
||||||
// remaining space.
|
|
||||||
// The first pass finds the items whose min/max constraints trigger,
|
|
||||||
// freezes them at those
|
|
||||||
// sizes, and excludes those sizes from the remaining space. The second
|
|
||||||
// pass sets the size
|
|
||||||
// of each flexible item. It distributes the remaining space amongst the
|
|
||||||
// items whose min/max
|
|
||||||
// constraints didn't trigger in pass 1. For the other items, it sets
|
|
||||||
// their sizes by forcing
|
|
||||||
// their min/max constraints to trigger again.
|
|
||||||
//
|
|
||||||
// This two pass approach for resolving min/max constraints deviates from
|
|
||||||
// the spec. The
|
|
||||||
// spec (https://www.w3.org/TR/YG-flexbox-1/#resolve-flexible-lengths)
|
|
||||||
// describes a process
|
|
||||||
// that needs to be repeated a variable number of times. The algorithm
|
|
||||||
// implemented here
|
|
||||||
// won't handle all cases but it was simpler to implement and it mitigates
|
|
||||||
// performance
|
|
||||||
// concerns because we know exactly how many passes it'll do.
|
|
||||||
|
|
||||||
// First pass: detect the flex items whose min/max constraints trigger
|
|
||||||
YGDistributeFreeSpaceFirstPass(
|
|
||||||
collectedFlexItemsValues,
|
|
||||||
mainAxis,
|
|
||||||
mainAxisParentSize,
|
|
||||||
availableInnerMainDim,
|
|
||||||
availableInnerWidth);
|
|
||||||
|
|
||||||
// Second pass: resolve the sizes of the flexible items
|
|
||||||
YGDistributeFreeSpaceSecondPass(
|
|
||||||
collectedFlexItemsValues,
|
|
||||||
node,
|
node,
|
||||||
|
collectedFlexItemsValues,
|
||||||
mainAxis,
|
mainAxis,
|
||||||
crossAxis,
|
crossAxis,
|
||||||
mainAxisParentSize,
|
mainAxisParentSize,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user