Skip to content

Commit e0d6623

Browse files
ars18wrwiText-CI
authored andcommitted
Consider min and max container's heights while processing line's cross size
DEVSIX-5178 Autoported commit. Original commit hash: [ff71d20b0]
1 parent fad8145 commit e0d6623

11 files changed

+66
-5
lines changed

itext.tests/itext.layout.tests/itext/layout/element/FlexContainerTest.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,55 @@ public virtual void RespectFlexContainersWidthTest() {
720720
, "diff"));
721721
}
722722

723+
[NUnit.Framework.Test]
724+
public virtual void FlexItemsMinHeightShouldBeOverriddenTest() {
725+
String outFileName = destinationFolder + "flexItemsMinHeightShouldBeOverriddenTest" + testNumber + ".pdf";
726+
String cmpFileName = sourceFolder + "cmp_flexItemsMinHeightShouldBeOverriddenTest" + testNumber + ".pdf";
727+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
728+
Document document = new Document(pdfDocument);
729+
Div flexContainer = CreateFlexContainer();
730+
flexContainer.Add(new Div().SetWidth(100).SetBackgroundColor(ColorConstants.BLUE).SetHeight(100));
731+
flexContainer.Add(new Div().SetWidth(100).SetBackgroundColor(ColorConstants.YELLOW).SetMinHeight(20));
732+
document.Add(flexContainer);
733+
document.Close();
734+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder
735+
, "diff"));
736+
}
737+
738+
[NUnit.Framework.Test]
739+
public virtual void LinesMinHeightShouldBeRespectedTest() {
740+
String outFileName = destinationFolder + "linesMinHeightShouldBeRespectedTest" + testNumber + ".pdf";
741+
String cmpFileName = sourceFolder + "cmp_linesMinHeightShouldBeRespectedTest" + testNumber + ".pdf";
742+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
743+
Document document = new Document(pdfDocument);
744+
Div flexContainer = CreateFlexContainer();
745+
flexContainer.SetMinHeight(100);
746+
Div child = new Div().SetWidth(100).SetBackgroundColor(ColorConstants.BLUE);
747+
child.Add(new Paragraph().SetWidth(100).SetBackgroundColor(ColorConstants.YELLOW));
748+
flexContainer.Add(child);
749+
document.Add(flexContainer);
750+
document.Close();
751+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder
752+
, "diff"));
753+
}
754+
755+
[NUnit.Framework.Test]
756+
public virtual void LinesMaxHeightShouldBeRespectedTest() {
757+
String outFileName = destinationFolder + "linesMaxHeightShouldBeRespectedTest" + testNumber + ".pdf";
758+
String cmpFileName = sourceFolder + "cmp_linesMaxHeightShouldBeRespectedTest" + testNumber + ".pdf";
759+
PdfDocument pdfDocument = new PdfDocument(new PdfWriter(outFileName));
760+
Document document = new Document(pdfDocument);
761+
Div flexContainer = CreateFlexContainer();
762+
flexContainer.SetMaxHeight(100);
763+
Div child = new Div().SetWidth(100).SetBackgroundColor(ColorConstants.BLUE).SetHeight(150);
764+
child.Add(new Paragraph().SetWidth(100).SetBackgroundColor(ColorConstants.YELLOW));
765+
flexContainer.Add(child);
766+
document.Add(flexContainer);
767+
document.Close();
768+
NUnit.Framework.Assert.IsNull(new CompareTool().CompareByContent(outFileName, cmpFileName, destinationFolder
769+
, "diff"));
770+
}
771+
723772
private Div GetFlexContainer(OverflowPropertyValue? overflowX, Style style) {
724773
FlexContainer flexContainer = CreateFlexContainer();
725774
flexContainer.SetBackgroundColor(ColorConstants.GREEN).SetBorderRight(new SolidBorder(60));

itext/itext.layout/itext/layout/renderer/FlexUtil.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ public static IList<IList<FlexItemInfo>> CalculateChildrenRectangles(Rectangle f
8787
mainSize = layoutBox.GetWidth();
8888
}
8989
// We need to have crossSize only if its value is definite.
90-
// The calculation differs from width calculation because if width isn't definite, parent's width shall be taken
91-
float? crossSize = flexContainerRenderer.RetrieveMinHeight();
90+
float? crossSize = flexContainerRenderer.RetrieveHeight();
91+
float? minCrossSize = flexContainerRenderer.RetrieveMinHeight();
92+
float? maxCrossSize = flexContainerRenderer.RetrieveMaxHeight();
9293
DetermineFlexBasisAndHypotheticalMainSizeForFlexItems(flexItemCalculationInfos, (float)mainSize);
9394
// 9.3. Main Size Determination
9495
// 5. Collect flex items into flex lines:
@@ -105,7 +106,8 @@ public static IList<IList<FlexItemInfo>> CalculateChildrenRectangles(Rectangle f
105106
// performing layout with the used main size and the available space, treating auto as fit-content.
106107
DetermineHypotheticalCrossSizeForFlexItems(lines);
107108
// 8. Calculate the cross size of each flex line.
108-
IList<float> lineCrossSizes = CalculateCrossSizeOfEachFlexLine(lines, isSingleLine, crossSize);
109+
IList<float> lineCrossSizes = CalculateCrossSizeOfEachFlexLine(lines, isSingleLine, minCrossSize, crossSize
110+
, maxCrossSize);
109111
// TODO DEVSIX-5003 min/max height calculations are not supported
110112
// If the flex container is single-line, then clamp the line’s cross-size to be within
111113
// the container’s computed min and max cross sizes. Note that if CSS 2.1’s definition of min/max-width/height
@@ -353,7 +355,7 @@ internal static void DetermineHypotheticalCrossSizeForFlexItems(IList<IList<Flex
353355
}
354356

355357
internal static IList<float> CalculateCrossSizeOfEachFlexLine(IList<IList<FlexUtil.FlexItemCalculationInfo
356-
>> lines, bool isSingleLine, float? crossSize) {
358+
>> lines, bool isSingleLine, float? minCrossSize, float? crossSize, float? maxCrossSize) {
357359
IList<float> lineCrossSizes = new List<float>();
358360
if (isSingleLine && crossSize != null && !lines.IsEmpty()) {
359361
lineCrossSizes.Add((float)crossSize);
@@ -378,6 +380,16 @@ internal static IList<float> CalculateCrossSizeOfEachFlexLine(IList<IList<FlexUt
378380
}
379381
flexLinesCrossSize = Math.Max(0, largestHypotheticalCrossSize);
380382
}
383+
// 3. If the flex container is single-line, then clamp the line’s cross-size to be
384+
// within the container’s computed min and max cross sizes
385+
if (isSingleLine && !lines.IsEmpty()) {
386+
if (null != minCrossSize) {
387+
flexLinesCrossSize = Math.Max((float)minCrossSize, flexLinesCrossSize);
388+
}
389+
if (null != maxCrossSize) {
390+
flexLinesCrossSize = Math.Min((float)maxCrossSize, flexLinesCrossSize);
391+
}
392+
}
381393
lineCrossSizes.Add(flexLinesCrossSize);
382394
}
383395
}

0 commit comments

Comments
 (0)