diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index 699e62c2..bba34228 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -1544,9 +1544,10 @@ static void layoutNodeImpl(const CSSNodeRef node, // If we are using "at most" rules in the main axis. Calculate the remaining space when // constraint by the min size defined for the main axis. - if (measureModeMainDim == CSSMeasureModeAtMost) { + + if (measureModeMainDim == CSSMeasureModeAtMost && remainingFreeSpace > 0) { if (!CSSValueIsUndefined(node->style.minDimensions[dim[mainAxis]]) && node->style.minDimensions[dim[mainAxis]] >= 0) { - remainingFreeSpace = fmaxf(0, node->style.minDimensions[dim[mainAxis]] - (availableInnerMainDim - remainingFreeSpace)); + remainingFreeSpace = fmax(0, node->style.minDimensions[dim[mainAxis]] - (availableInnerMainDim - remainingFreeSpace)); } else { remainingFreeSpace = 0; } diff --git a/tests/CSSLayoutMinMaxDimensionTest.cpp b/tests/CSSLayoutMinMaxDimensionTest.cpp index 72501e43..b58f22db 100644 --- a/tests/CSSLayoutMinMaxDimensionTest.cpp +++ b/tests/CSSLayoutMinMaxDimensionTest.cpp @@ -35,6 +35,12 @@
+ +
+
+
+
+
* */ @@ -290,3 +296,70 @@ TEST(CSSLayoutTest, align_items_min_max) { CSSNodeFreeRecursive(root); } + +TEST(CSSLayoutTest, justify_content_overflow_min_max) { + const CSSNodeRef root = CSSNodeNew(); + CSSNodeStyleSetJustifyContent(root, CSSJustifyCenter); + CSSNodeStyleSetMinHeight(root, 100); + CSSNodeStyleSetMaxHeight(root, 110); + + const CSSNodeRef root_child0 = CSSNodeNew(); + CSSNodeStyleSetWidth(root_child0, 50); + CSSNodeStyleSetHeight(root_child0, 50); + CSSNodeInsertChild(root, root_child0, 0); + + const CSSNodeRef root_child1 = CSSNodeNew(); + CSSNodeStyleSetWidth(root_child1, 50); + CSSNodeStyleSetHeight(root_child1, 50); + CSSNodeInsertChild(root, root_child1, 1); + + const CSSNodeRef root_child2 = CSSNodeNew(); + CSSNodeStyleSetWidth(root_child2, 50); + CSSNodeStyleSetHeight(root_child2, 50); + CSSNodeInsertChild(root, root_child2, 2); + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionLTR); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(110, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(-20, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child0)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1)); + ASSERT_EQ(30, CSSNodeLayoutGetTop(root_child1)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child1)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child1)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child2)); + ASSERT_EQ(80, CSSNodeLayoutGetTop(root_child2)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child2)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child2)); + + CSSNodeCalculateLayout(root, CSSUndefined, CSSUndefined, CSSDirectionRTL); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root)); + ASSERT_EQ(0, CSSNodeLayoutGetTop(root)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root)); + ASSERT_EQ(110, CSSNodeLayoutGetHeight(root)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(-20, CSSNodeLayoutGetTop(root_child0)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child0)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child1)); + ASSERT_EQ(30, CSSNodeLayoutGetTop(root_child1)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child1)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child1)); + + ASSERT_EQ(0, CSSNodeLayoutGetLeft(root_child2)); + ASSERT_EQ(80, CSSNodeLayoutGetTop(root_child2)); + ASSERT_EQ(50, CSSNodeLayoutGetWidth(root_child2)); + ASSERT_EQ(50, CSSNodeLayoutGetHeight(root_child2)); + + CSSNodeFreeRecursive(root); +}