Fix negative value rounding issue for nodes across an axis (#688)
Summary: This fix issue https://github.com/facebook/yoga/issues/683 the rounding calculation is incorrect if a node is crossing an axis and it will shrink it's width/height on layout calculation. The following test reproduce the issue : ``` TEST(YogaTest, node_shrink_on_axis) { const YGConfigRef config = YGConfigNew(); const YGNodeRef root = YGNodeNewWithConfig(config); const YGNodeRef child = YGNodeNewWithConfig(config); YGNodeInsertChild(root, child, 0); YGNodeStyleSetWidth(child, 10); YGNodeStyleSetHeight(child, 10); YGNodeStyleSetPosition(root, YGEdgeLeft, -0.75f); YGNodeStyleSetPosition(root, YGEdgeTop, -0.75f); YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); ASSERT_FLOAT_EQ(YGNodeLayoutGetWidth(child), 10); ASSERT_FLOAT_EQ(YGNodeLayoutGetHeight(child), 10); YGNodeFreeRecursive(root); YGConfigFree(config); } ``` Pull Request resolved: https://github.com/facebook/yoga/pull/688 Reviewed By: NickGerleman Differential Revision: D13866122 Pulled By: rozele fbshipit-source-id: 4faf8a9efc86723c303f600d730660a2e13d8a73
This commit is contained in:
committed by
Facebook GitHub Bot
parent
483e399158
commit
4266409934
@@ -80,3 +80,26 @@ TEST(YogaTest, consistent_rounding_during_repeated_layouts) {
|
|||||||
|
|
||||||
YGConfigFree(config);
|
YGConfigFree(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Regression test for https://github.com/facebook/yoga/issues/683
|
||||||
|
TEST(YogaTest, negative_value_rounding) {
|
||||||
|
const YGConfigRef config = YGConfigNew();
|
||||||
|
const YGNodeRef root = YGNodeNewWithConfig(config);
|
||||||
|
const YGNodeRef child = YGNodeNewWithConfig(config);
|
||||||
|
|
||||||
|
YGNodeInsertChild(root, child, 0);
|
||||||
|
|
||||||
|
YGNodeStyleSetWidth(child, 10);
|
||||||
|
YGNodeStyleSetHeight(child, 10);
|
||||||
|
YGNodeStyleSetPosition(root, YGEdgeLeft, -0.75f);
|
||||||
|
YGNodeStyleSetPosition(root, YGEdgeTop, -0.75f);
|
||||||
|
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(YGNodeLayoutGetWidth(child), 10);
|
||||||
|
ASSERT_FLOAT_EQ(YGNodeLayoutGetHeight(child), 10);
|
||||||
|
|
||||||
|
YGNodeFreeRecursive(root);
|
||||||
|
|
||||||
|
YGConfigFree(config);
|
||||||
|
}
|
||||||
|
@@ -3701,16 +3701,12 @@ YOGA_EXPORT float YGRoundValueToPixelGrid(
|
|||||||
scaledValue = scaledValue - fractial + 1.0;
|
scaledValue = scaledValue - fractial + 1.0;
|
||||||
} else if (forceCeil) {
|
} else if (forceCeil) {
|
||||||
// Next we check if we need to use forced rounding
|
// Next we check if we need to use forced rounding
|
||||||
scaledValue = scaledValue - fractial + 1.0;
|
scaledValue = ceil(scaledValue);
|
||||||
} else if (forceFloor) {
|
} else if (forceFloor) {
|
||||||
scaledValue = scaledValue - fractial;
|
scaledValue = floor(scaledValue);
|
||||||
} else {
|
} else {
|
||||||
// Finally we just round the value
|
// Finally we just round the value
|
||||||
scaledValue = scaledValue - fractial +
|
scaledValue = round(scaledValue);
|
||||||
(!YGDoubleIsUndefined(fractial) &&
|
|
||||||
(fractial > 0.5 || YGDoubleEqual(fractial, 0.5))
|
|
||||||
? 1.0
|
|
||||||
: 0.0);
|
|
||||||
}
|
}
|
||||||
return (YGDoubleIsUndefined(scaledValue) ||
|
return (YGDoubleIsUndefined(scaledValue) ||
|
||||||
YGDoubleIsUndefined(pointScaleFactor))
|
YGDoubleIsUndefined(pointScaleFactor))
|
||||||
|
Reference in New Issue
Block a user