Fix unnecessary measure calls
Summary: Fix #334 Closes https://github.com/facebook/yoga/pull/347 Reviewed By: dshahidehpour Differential Revision: D4455438 Pulled By: emilsjolander fbshipit-source-id: 013c89e71757d9048708ec85cbb6af9f33ac1ea6
This commit is contained in:
committed by
Facebook Github Bot
parent
a2a84532ff
commit
e4b50f2a8d
@@ -39,6 +39,22 @@ static YGSize _measureMin(YGNodeRef node,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static YGSize _measure_84_49(YGNodeRef node,
|
||||||
|
float width,
|
||||||
|
YGMeasureMode widthMode,
|
||||||
|
float height,
|
||||||
|
YGMeasureMode heightMode) {
|
||||||
|
int *measureCount = (int*) YGNodeGetContext(node);
|
||||||
|
if (measureCount) {
|
||||||
|
(*measureCount)++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return YGSize {
|
||||||
|
.width = 84.f,
|
||||||
|
.height = 49.f,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
TEST(YogaTest, measure_once_single_flexible_child) {
|
TEST(YogaTest, measure_once_single_flexible_child) {
|
||||||
const YGNodeRef root = YGNodeNew();
|
const YGNodeRef root = YGNodeNew();
|
||||||
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
|
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
|
||||||
@@ -131,3 +147,28 @@ TEST(YogaTest, remeasure_with_atmost_computed_width_undefined_height) {
|
|||||||
|
|
||||||
YGNodeFreeRecursive(root);
|
YGNodeFreeRecursive(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(YogaTest, remeasure_with_already_measured_value_smaller_but_still_float_equal) {
|
||||||
|
int measureCount = 0;
|
||||||
|
|
||||||
|
const YGNodeRef root = YGNodeNew();
|
||||||
|
YGNodeStyleSetWidth(root, 288.f);
|
||||||
|
YGNodeStyleSetHeight(root, 288.f);
|
||||||
|
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
|
||||||
|
|
||||||
|
const YGNodeRef root_child0 = YGNodeNew();
|
||||||
|
YGNodeStyleSetPadding(root_child0, YGEdgeAll, 2.88f);
|
||||||
|
YGNodeStyleSetFlexDirection(root_child0, YGFlexDirectionRow);
|
||||||
|
YGNodeInsertChild(root, root_child0, 0);
|
||||||
|
|
||||||
|
const YGNodeRef root_child0_child0 = YGNodeNew();
|
||||||
|
YGNodeSetContext(root_child0_child0, &measureCount);
|
||||||
|
YGNodeSetMeasureFunc(root_child0_child0, _measure_84_49);
|
||||||
|
YGNodeInsertChild(root_child0, root_child0_child0, 0);
|
||||||
|
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
|
|
||||||
|
YGNodeFreeRecursive(root);
|
||||||
|
|
||||||
|
ASSERT_EQ(1, measureCount);
|
||||||
|
}
|
||||||
|
@@ -2785,7 +2785,7 @@ static inline bool YGMeasureModeOldSizeIsUnspecifiedAndStillFits(YGMeasureMode s
|
|||||||
YGMeasureMode lastSizeMode,
|
YGMeasureMode lastSizeMode,
|
||||||
float lastComputedSize) {
|
float lastComputedSize) {
|
||||||
return sizeMode == YGMeasureModeAtMost && lastSizeMode == YGMeasureModeUndefined &&
|
return sizeMode == YGMeasureModeAtMost && lastSizeMode == YGMeasureModeUndefined &&
|
||||||
size >= lastComputedSize;
|
(size >= lastComputedSize || YGFloatsEqual(size, lastComputedSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(YGMeasureMode sizeMode,
|
static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(YGMeasureMode sizeMode,
|
||||||
@@ -2794,7 +2794,7 @@ static inline bool YGMeasureModeNewMeasureSizeIsStricterAndStillValid(YGMeasureM
|
|||||||
float lastSize,
|
float lastSize,
|
||||||
float lastComputedSize) {
|
float lastComputedSize) {
|
||||||
return lastSizeMode == YGMeasureModeAtMost && sizeMode == YGMeasureModeAtMost &&
|
return lastSizeMode == YGMeasureModeAtMost && sizeMode == YGMeasureModeAtMost &&
|
||||||
lastSize > size && lastComputedSize <= size;
|
lastSize > size && (lastComputedSize <= size || YGFloatsEqual(size, lastComputedSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool YGNodeCanUseCachedMeasurement(const YGMeasureMode widthMode,
|
bool YGNodeCanUseCachedMeasurement(const YGMeasureMode widthMode,
|
||||||
|
Reference in New Issue
Block a user