瀏覽代碼

SpacePlan.Empty

Marcin Ziąbek 1 年之前
父節點
當前提交
877f1a6d7e
共有 44 個文件被更改,包括 165 次插入397 次删除
  1. 9 0
      Source/QuestPDF.UnitTests/AspectRatioTests.cs
  2. 8 0
      Source/QuestPDF.UnitTests/ConstrainedTests.cs
  3. 0 251
      Source/QuestPDF.UnitTests/GridTests.cs
  4. 2 0
      Source/QuestPDF.UnitTests/PaddingTests.cs
  5. 1 1
      Source/QuestPDF.UnitTests/PageBreakTests.cs
  6. 1 1
      Source/QuestPDF.UnitTests/ShowOnceTest.cs
  7. 0 37
      Source/QuestPDF.UnitTests/TestEngine/TestPlan.cs
  8. 3 1
      Source/QuestPDF/Drawing/SpacePlan.cs
  9. 1 0
      Source/QuestPDF/Drawing/SpacePlanType.cs
  10. 1 4
      Source/QuestPDF/Elements/Alignment.cs
  11. 3 6
      Source/QuestPDF/Elements/AspectRatio.cs
  12. 4 4
      Source/QuestPDF/Elements/Column.cs
  13. 8 0
      Source/QuestPDF/Elements/Constrained.cs
  14. 31 26
      Source/QuestPDF/Elements/Decoration.cs
  15. 3 3
      Source/QuestPDF/Elements/Dynamic.cs
  16. 1 1
      Source/QuestPDF/Elements/DynamicImage.cs
  17. 1 1
      Source/QuestPDF/Elements/DynamicSvgImage.cs
  18. 1 1
      Source/QuestPDF/Elements/Extend.cs
  19. 1 1
      Source/QuestPDF/Elements/Hyperlink.cs
  20. 4 1
      Source/QuestPDF/Elements/Image.cs
  21. 3 1
      Source/QuestPDF/Elements/Inlined.cs
  22. 1 1
      Source/QuestPDF/Elements/LayoutOverflowVisualization.cs
  23. 4 1
      Source/QuestPDF/Elements/Line.cs
  24. 6 9
      Source/QuestPDF/Elements/Padding.cs
  25. 3 2
      Source/QuestPDF/Elements/Page.cs
  26. 2 2
      Source/QuestPDF/Elements/PageBreak.cs
  27. 6 3
      Source/QuestPDF/Elements/Row.cs
  28. 2 2
      Source/QuestPDF/Elements/Scale.cs
  29. 1 4
      Source/QuestPDF/Elements/ScaleToFit.cs
  30. 1 1
      Source/QuestPDF/Elements/SectionLink.cs
  31. 1 1
      Source/QuestPDF/Elements/ShowEntire.cs
  32. 1 1
      Source/QuestPDF/Elements/ShowIf.cs
  33. 4 4
      Source/QuestPDF/Elements/ShowOnce.cs
  34. 4 0
      Source/QuestPDF/Elements/Shrink.cs
  35. 2 2
      Source/QuestPDF/Elements/SimpleRotate.cs
  36. 2 5
      Source/QuestPDF/Elements/SkipOnce.cs
  37. 1 3
      Source/QuestPDF/Elements/StopPaging.cs
  38. 4 1
      Source/QuestPDF/Elements/SvgImage.cs
  39. 4 1
      Source/QuestPDF/Elements/SvgPath.cs
  40. 9 6
      Source/QuestPDF/Elements/Table/Table.cs
  41. 9 2
      Source/QuestPDF/Elements/Text/TextBlock.cs
  42. 1 1
      Source/QuestPDF/Elements/Unconstrained.cs
  43. 6 0
      Source/QuestPDF/Fluent/ConstrainedExtensions.cs
  44. 5 5
      Source/QuestPDF/Infrastructure/ContainerElement.cs

+ 9 - 0
Source/QuestPDF.UnitTests/AspectRatioTests.cs

@@ -20,6 +20,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 201))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
@@ -35,6 +36,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 201))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(100, 50))
                 .CheckMeasureResult(SpacePlan.PartialRender(400, 200));
         }
@@ -50,6 +52,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 201))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
@@ -65,6 +68,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 201))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
@@ -80,6 +84,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 199))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
         
@@ -94,6 +99,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(401, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
@@ -109,6 +115,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(399, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
         
@@ -123,6 +130,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(400, 300))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
@@ -138,6 +146,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                 })
                 .MeasureElement(new Size(500, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }

+ 8 - 0
Source/QuestPDF.UnitTests/ConstrainedTests.cs

@@ -33,6 +33,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(400, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 100));
         }
@@ -47,6 +48,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(400, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
                 .CheckMeasureResult(SpacePlan.FullRender(400, 150));
         }
@@ -73,6 +75,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(400, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
                 .CheckMeasureResult(SpacePlan.PartialRender(400, 75));
         }
@@ -87,6 +90,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(400, 200))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
@@ -117,6 +121,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(200, 400))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(50, 400))
                 .CheckMeasureResult(SpacePlan.FullRender(100, 400));
         }
@@ -131,6 +136,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(200, 400))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(150, 400))
                 .CheckMeasureResult(SpacePlan.FullRender(150, 400));
         }
@@ -157,6 +163,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(200, 400))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(100, 400), SpacePlan.PartialRender(75, 400))
                 .CheckMeasureResult(SpacePlan.PartialRender(75, 400));
         }
@@ -171,6 +178,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                 })
                 .MeasureElement(new Size(200, 400))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .ExpectChildMeasure(new Size(100, 400), SpacePlan.Wrap())
                 .CheckMeasureResult(SpacePlan.Wrap());
         }

+ 0 - 251
Source/QuestPDF.UnitTests/GridTests.cs

@@ -1,251 +0,0 @@
-using FluentAssertions;
-using NUnit.Framework;
-using QuestPDF.Elements;
-using QuestPDF.Fluent;
-using QuestPDF.UnitTests.TestEngine;
-
-namespace QuestPDF.UnitTests
-{
-    [TestFixture]
-    public class GridTests
-    {
-        #region Alignment
-        
-        [Test]
-        public void AlignLeft()
-        {
-            // arrange
-            var structure = new Container();
-
-            var childA = TestPlan.CreateUniqueElement();
-            var childB = TestPlan.CreateUniqueElement();
-            var childC = TestPlan.CreateUniqueElement();
-            var childD = TestPlan.CreateUniqueElement();
-            var childE = TestPlan.CreateUniqueElement();
-
-            // act
-            structure
-                .Grid(grid =>
-                {
-                    grid.AlignLeft();
-                    
-                    grid.Item(6).Element(childA);
-                    grid.Item(4).Element(childB);
-                    grid.Item(4).Element(childC);
-                    grid.Item(2).Element(childD);
-                    grid.Item(8).Element(childE);
-                });
-            
-            // assert
-            var expected = new Container();
-            
-            expected.Column(column =>
-            {
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(6).Element(childA);
-                    row.RelativeItem(4).Element(childB);
-                    row.RelativeItem(2);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(4).Element(childC);
-                    row.RelativeItem(2).Element(childD);
-                    row.RelativeItem(6);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(8).Element(childE);
-                    row.RelativeItem(4);
-                });
-            });
-            
-            TestPlan.CompareOperations(structure, expected);
-        }
-        
-        [Test]
-        public void AlignCenter()
-        {
-            // arrange
-            var structure = new Container();
-
-            var childA = TestPlan.CreateUniqueElement();
-            var childB = TestPlan.CreateUniqueElement();
-            var childC = TestPlan.CreateUniqueElement();
-            var childD = TestPlan.CreateUniqueElement();
-            var childE = TestPlan.CreateUniqueElement();
-
-            // act
-            structure
-                .Grid(grid =>
-                {
-                    grid.AlignCenter();
-                    
-                    grid.Item(6).Element(childA);
-                    grid.Item(4).Element(childB);
-                    grid.Item(4).Element(childC);
-                    grid.Item(2).Element(childD);
-                    grid.Item(8).Element(childE);
-                });
-            
-            // assert
-            var expected = new Container();
-            
-            expected.Column(column =>
-            {
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(1);
-                    row.RelativeItem(6).Element(childA);
-                    row.RelativeItem(4).Element(childB);
-                    row.RelativeItem(1);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(3);
-                    row.RelativeItem(4).Element(childC);
-                    row.RelativeItem(2).Element(childD);
-                    row.RelativeItem(3);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(2);
-                    row.RelativeItem(8).Element(childE);
-                    row.RelativeItem(2);
-                });
-            });
-
-            TestPlan.CompareOperations(structure, expected);
-        }
-        
-        [Test]
-        public void AlignRight()
-        {
-            // arrange
-            var structure = new Container();
-
-            var childA = TestPlan.CreateUniqueElement();
-            var childB = TestPlan.CreateUniqueElement();
-            var childC = TestPlan.CreateUniqueElement();
-            var childD = TestPlan.CreateUniqueElement();
-            var childE = TestPlan.CreateUniqueElement();
-
-            // act
-            structure
-                .Grid(grid =>
-                {
-                    grid.AlignRight();
-                    
-                    grid.Item(6).Element(childA);
-                    grid.Item(4).Element(childB);
-                    grid.Item(4).Element(childC);
-                    grid.Item(2).Element(childD);
-                    grid.Item(8).Element(childE);
-                });
-            
-            // assert
-            var expected = new Container();
-            
-            expected.Column(column =>
-            {
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(2);
-                    row.RelativeItem(6).Element(childA);
-                    row.RelativeItem(4).Element(childB);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(6);
-                    row.RelativeItem(4).Element(childC);
-                    row.RelativeItem(2).Element(childD);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.RelativeItem(4);
-                    row.RelativeItem(8).Element(childE);
-                });
-            });
-            
-            TestPlan.CompareOperations(structure, expected);
-        }
-        
-        #endregion
-        
-        #region Spacing
-        
-        [Test]
-        public void Spacing()
-        {
-            // arrange
-            var structure = new Container();
-
-            var childA = TestPlan.CreateUniqueElement();
-            var childB = TestPlan.CreateUniqueElement();
-            var childC = TestPlan.CreateUniqueElement();
-            var childD = TestPlan.CreateUniqueElement();
-
-            // act
-            structure
-                .Grid(grid =>
-                {
-                    grid.Columns(16);
-                    grid.AlignCenter();
-                    
-                    grid.VerticalSpacing(20);
-                    grid.HorizontalSpacing(30);
-
-                    grid.Item(5).Element(childA);
-                    grid.Item(5).Element(childB);
-                    grid.Item(10).Element(childC);
-                    grid.Item(12).Element(childD);
-                });
-            
-            // assert
-            var expected = new Container();
-            
-            expected.Column(column =>
-            {
-                column.Spacing(20);
-                
-                column.Item().Row(row =>
-                {
-                    row.Spacing(30);
-                    
-                    row.RelativeItem(3);
-                    row.RelativeItem(5).Element(childA);
-                    row.RelativeItem(5).Element(childB);
-                    row.RelativeItem(3);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.Spacing(30);
-                    
-                    row.RelativeItem(3);
-                    row.RelativeItem(10).Element(childC);
-                    row.RelativeItem(3);
-                });
-                
-                column.Item().Row(row =>
-                {
-                    row.Spacing(30);
-                    
-                    row.RelativeItem(2);
-                    row.RelativeItem(12).Element(childD);
-                    row.RelativeItem(2);
-                });
-            });
-            
-            TestPlan.CompareOperations(structure, expected);
-        }
-        
-        #endregion
-    }
-}

+ 2 - 0
Source/QuestPDF.UnitTests/PaddingTests.cs

@@ -38,6 +38,7 @@ namespace QuestPDF.UnitTests
             TestPlan
                 .For(GetPadding)
                 .MeasureElement(new Size(50, 300))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
         
@@ -47,6 +48,7 @@ namespace QuestPDF.UnitTests
             TestPlan
                 .For(GetPadding)
                 .MeasureElement(new Size(20, 300))
+                .ExpectChildMeasure(Size.Zero, SpacePlan.PartialRender(Size.Zero))
                 .CheckMeasureResult(SpacePlan.Wrap());
         }
         

+ 1 - 1
Source/QuestPDF.UnitTests/PageBreakTests.cs

@@ -22,7 +22,7 @@ namespace QuestPDF.UnitTests
                 .CheckDrawResult()
                 
                 .MeasureElement(new Size(500, 400))
-                .CheckMeasureResult(SpacePlan.FullRender(0, 0));
+                .CheckMeasureResult(SpacePlan.Empty());
         }
     }
 }

+ 1 - 1
Source/QuestPDF.UnitTests/ShowOnceTest.cs

@@ -44,7 +44,7 @@ namespace QuestPDF.UnitTests
                 
                 // In the next attempt of measuring element, it should behave like empty parent.
                 .MeasureElement(new Size(600, 200))
-                .CheckMeasureResult(SpacePlan.FullRender(0, 0))
+                .CheckMeasureResult(SpacePlan.Empty())
                 
                 // In the next attempt of measuring element, it should not draw its child
                 .DrawElement(new Size(600, 200))

+ 0 - 37
Source/QuestPDF.UnitTests/TestEngine/TestPlan.cs

@@ -240,42 +240,5 @@ namespace QuestPDF.UnitTests.TestEngine
             
             return content;
         }
-
-        public static void CompareOperations(Element value, Element expected, Size? availableSpace = null)
-        {
-            CompareMeasureOperations(value, expected, availableSpace);
-            CompareDrawOperations(value, expected, availableSpace);
-        }
-        
-        private static void CompareMeasureOperations(Element value, Element expected, Size? availableSpace = null)
-        {
-            availableSpace ??= new Size(400, 900);
-            
-            var canvas = new FreeCanvas();
-            value.InjectDependencies(null, canvas);
-            var valueMeasure = value.Measure(availableSpace.Value);
-            
-            expected.InjectDependencies(null, canvas);
-            var expectedMeasure = expected.Measure(availableSpace.Value);
-            
-            valueMeasure.Should().BeEquivalentTo(expectedMeasure);
-        }
-        
-        private static void CompareDrawOperations(Element value, Element expected, Size? availableSpace = null)
-        {
-            availableSpace ??= new Size(400, 1200);
-            
-            var valueCanvas = new OperationRecordingCanvas();
-            value.InjectDependencies(null, valueCanvas);
-            value.ApplyDefaultImageConfiguration(144, ImageCompressionQuality.Medium, false);
-            value.Draw(availableSpace.Value);
-            
-            var expectedCanvas = new OperationRecordingCanvas();
-            expected.InjectDependencies(null, expectedCanvas);
-            expected.ApplyDefaultImageConfiguration(144, ImageCompressionQuality.Medium, false);
-            expected.Draw(availableSpace.Value);
-            
-            valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations);
-        }
     }
 }

+ 3 - 1
Source/QuestPDF/Drawing/SpacePlan.cs

@@ -15,7 +15,9 @@ namespace QuestPDF.Drawing
             Height = height;
         }
 
-        internal static SpacePlan  Wrap() => new SpacePlan(SpacePlanType.Wrap, 0, 0);
+        internal static SpacePlan Empty() => new SpacePlan(SpacePlanType.Empty, 0, 0);
+        
+        internal static SpacePlan Wrap() => new SpacePlan(SpacePlanType.Wrap, 0, 0);
         
         internal static SpacePlan PartialRender(float width, float height) => new SpacePlan(SpacePlanType.PartialRender, width, height);
 

+ 1 - 0
Source/QuestPDF/Drawing/SpacePlanType.cs

@@ -2,6 +2,7 @@
 {
     internal enum SpacePlanType
     {
+        Empty,
         Wrap,
         PartialRender,
         FullRender

+ 1 - 4
Source/QuestPDF/Elements/Alignment.cs

@@ -10,12 +10,9 @@ namespace QuestPDF.Elements
         
         internal override void Draw(Size availableSpace)
         {
-            if (Child == null)
-                return;
-            
             var childMeasurement = base.Measure(availableSpace);
             
-            if (childMeasurement.Type == SpacePlanType.Wrap)
+            if (childMeasurement.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
                 return;
 
             var childSize = new Size(

+ 3 - 6
Source/QuestPDF/Elements/AspectRatio.cs

@@ -15,9 +15,9 @@ namespace QuestPDF.Elements
         {
             if (Ratio == 0)
                 return SpacePlan.FullRender(0, 0);
-            
-            if (Child == null)
-                return SpacePlan.FullRender(0, 0);
+ 
+            if (Child.Measure(Size.Zero).Type == SpacePlanType.Empty)
+                return SpacePlan.Empty();
             
             var targetSize = GetTargetSize(availableSpace);
             
@@ -43,9 +43,6 @@ namespace QuestPDF.Elements
 
         internal override void Draw(Size availableSpace)
         {
-            if (Child == null)
-                return;
-            
             var size = GetTargetSize(availableSpace);
             
             var offset = ContentDirection == ContentDirection.LeftToRight

+ 4 - 4
Source/QuestPDF/Elements/Column.cs

@@ -39,10 +39,10 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (!Items.Any())
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             if (CurrentRenderingIndex == Items.Count)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             var renderingCommands = PlanLayout(availableSpace);
 
@@ -56,7 +56,7 @@ namespace QuestPDF.Elements
             if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
                 return SpacePlan.Wrap();
             
-            var totalRenderedItems = CurrentRenderingIndex + renderingCommands.Count(x => x.Measurement.Type is SpacePlanType.FullRender);
+            var totalRenderedItems = CurrentRenderingIndex + renderingCommands.Count(x => x.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender);
             var willBeFullyRendered = totalRenderedItems == Items.Count;
 
             return willBeFullyRendered
@@ -77,7 +77,7 @@ namespace QuestPDF.Elements
                 Canvas.Translate(command.Offset.Reverse());
             }
             
-            var fullyRenderedItems = renderingCommands.Count(x => x.Measurement.Type is SpacePlanType.FullRender);
+            var fullyRenderedItems = renderingCommands.Count(x => x.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender);
             CurrentRenderingIndex += fullyRenderedItems;
         }
 

+ 8 - 0
Source/QuestPDF/Elements/Constrained.cs

@@ -14,8 +14,13 @@ namespace QuestPDF.Elements
         public float? MinHeight { get; set; }
         public float? MaxHeight { get; set; }
 
+        public bool EnforceSizeWhenEmpty { get; set; }
+        
         internal override SpacePlan Measure(Size availableSpace)
         {
+            if (!EnforceSizeWhenEmpty && Child.Measure(Size.Zero).Type == SpacePlanType.Empty)
+                return SpacePlan.Empty();
+            
             if (MinWidth > availableSpace.Width + Size.Epsilon)
                 return SpacePlan.Wrap();
             
@@ -35,6 +40,9 @@ namespace QuestPDF.Elements
                 Max(MinWidth, measurement.Width),
                 Max(MinHeight, measurement.Height));
             
+            if (measurement.Type == SpacePlanType.Empty)
+                return EnforceSizeWhenEmpty ? SpacePlan.FullRender(actualSize) : SpacePlan.Empty();
+            
             if (measurement.Type == SpacePlanType.FullRender)
                 return SpacePlan.FullRender(actualSize);
             

+ 31 - 26
Source/QuestPDF/Elements/Decoration.cs

@@ -37,8 +37,11 @@ namespace QuestPDF.Elements
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            var renderingCommands = PlanLayout(availableSpace).ToList();
+            var renderingCommands = PlanLayout(availableSpace);
 
+            if (renderingCommands.Single(x => x.Element == Content).Measurement.Type == SpacePlanType.Empty)
+                return SpacePlan.Empty();
+            
             if (renderingCommands.Any(x => x.Measurement.Type == SpacePlanType.Wrap))
                 return SpacePlan.Wrap();
 
@@ -49,7 +52,7 @@ namespace QuestPDF.Elements
             if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
                 return SpacePlan.Wrap();
             
-            var willBeFullyRendered = renderingCommands.All(x => x.Measurement.Type == SpacePlanType.FullRender);
+            var willBeFullyRendered = renderingCommands.All(x => x.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender);
 
             return willBeFullyRendered
                 ? SpacePlan.FullRender(size)
@@ -75,15 +78,16 @@ namespace QuestPDF.Elements
             }
         }
 
-        private IEnumerable<DecorationItemRenderingCommand> PlanLayout(Size availableSpace)
+        private DecorationItemRenderingCommand[] PlanLayout(Size availableSpace)
         {
             SpacePlan GetDecorationMeasurement(Element element)
             {
                 var measurement = element.Measure(availableSpace);
-                
-                return measurement.Type == SpacePlanType.FullRender 
-                    ? measurement 
-                    : SpacePlan.Wrap();
+
+                if (measurement.Type is SpacePlanType.PartialRender or SpacePlanType.Wrap)
+                    return SpacePlan.Wrap();
+
+                return measurement;
             }
             
             var beforeMeasurement = GetDecorationMeasurement(Before);
@@ -92,25 +96,26 @@ namespace QuestPDF.Elements
             var contentSpace = new Size(availableSpace.Width, availableSpace.Height - beforeMeasurement.Height - afterMeasurement.Height);
             var contentMeasurement = Content.Measure(contentSpace);
 
-            yield return new DecorationItemRenderingCommand
-            {
-                Element = Before,
-                Measurement = beforeMeasurement,
-                Offset = Position.Zero
-            };
-            
-            yield return new DecorationItemRenderingCommand
-            {
-                Element = Content,
-                Measurement = contentMeasurement,
-                Offset = new Position(0, beforeMeasurement.Height)
-            };
-
-            yield return new DecorationItemRenderingCommand
-            {
-                Element = After,
-                Measurement = afterMeasurement,
-                Offset = new Position(0, beforeMeasurement.Height + contentMeasurement.Height)
+            return new[]
+            { 
+                new DecorationItemRenderingCommand
+                {
+                    Element = Before,
+                    Measurement = beforeMeasurement,
+                    Offset = Position.Zero
+                },
+                new DecorationItemRenderingCommand
+                {
+                    Element = Content,
+                    Measurement = contentMeasurement,
+                    Offset = new Position(0, beforeMeasurement.Height)
+                },
+                new DecorationItemRenderingCommand
+                {
+                    Element = After,
+                    Measurement = afterMeasurement,
+                    Offset = new Position(0, beforeMeasurement.Height + contentMeasurement.Height)
+                }
             };
         }
     }

+ 3 - 3
Source/QuestPDF/Elements/Dynamic.cs

@@ -36,13 +36,13 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (IsRendered)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             var result = ComposeContent(availableSpace, acceptNewState: false);
             var content = result.Content as Element ?? Empty.Instance;
             var measurement = content.Measure(availableSpace);
-
-            if (measurement.Type != SpacePlanType.FullRender)
+            
+            if (measurement.Type is SpacePlanType.PartialRender or SpacePlanType.Wrap)
                 throw new DocumentLayoutException("Dynamic component generated content that does not fit on a single page.");
             
             return result.HasMoreContent 

+ 1 - 1
Source/QuestPDF/Elements/DynamicImage.cs

@@ -37,7 +37,7 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (IsRendered)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
 
             if (availableSpace.IsNegative())
                 return SpacePlan.Wrap();

+ 1 - 1
Source/QuestPDF/Elements/DynamicSvgImage.cs

@@ -20,7 +20,7 @@ internal class DynamicSvgImage : Element, IStateResettable
     internal override SpacePlan Measure(Size availableSpace)
     {
         if (IsRendered)
-            return SpacePlan.FullRender(Size.Zero);
+            return SpacePlan.Empty();
 
         if (availableSpace.IsNegative())
             return SpacePlan.Wrap();

+ 1 - 1
Source/QuestPDF/Elements/Extend.cs

@@ -13,7 +13,7 @@ namespace QuestPDF.Elements
         {
             var childSize = base.Measure(availableSpace);
 
-            if (childSize.Type == SpacePlanType.Wrap)
+            if (childSize.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
                 return childSize;
             
             var targetSize = GetTargetSize(availableSpace, childSize);

+ 1 - 1
Source/QuestPDF/Elements/Hyperlink.cs

@@ -12,7 +12,7 @@ namespace QuestPDF.Elements
         {
             var targetSize = base.Measure(availableSpace);
 
-            if (targetSize.Type == SpacePlanType.Wrap)
+            if (targetSize.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
                 return;
             
             var horizontalOffset = ContentDirection == ContentDirection.LeftToRight

+ 4 - 1
Source/QuestPDF/Elements/Image.cs

@@ -23,7 +23,7 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (IsRendered)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
 
             if (availableSpace.IsNegative())
                 return SpacePlan.Wrap();
@@ -35,6 +35,9 @@ namespace QuestPDF.Elements
         {
             if (DocumentImage == null)
                 return;
+            
+            if (IsRendered)
+                return;
 
             var image = GetImageToDraw(availableSpace);
             Canvas.DrawImage(image, availableSpace);

+ 3 - 1
Source/QuestPDF/Elements/Inlined.cs

@@ -48,7 +48,7 @@ namespace QuestPDF.Elements
             SetDefaultAlignment();   
             
             if (CurrentRenderingIndex == Elements.Count)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             var lines = Compose(availableSpace);
 
@@ -79,6 +79,8 @@ namespace QuestPDF.Elements
 
         internal override void Draw(Size availableSpace)
         {
+            // TODO: empty elements should not introduce spacing?
+            
             SetDefaultAlignment();
             
             var lines = Compose(availableSpace);

+ 1 - 1
Source/QuestPDF/Elements/LayoutOverflowVisualization.cs

@@ -31,7 +31,7 @@ internal class LayoutOverflowVisualization : ContainerElement, IContentDirection
         // measure content area
         var childSize = base.Measure(availableSpace);
         
-        if (childSize.Type == SpacePlanType.FullRender)
+        if (childSize.Type is SpacePlanType.Empty or SpacePlanType.FullRender)
         {
             Child?.Draw(availableSpace);
             return;

+ 4 - 1
Source/QuestPDF/Elements/Line.cs

@@ -31,7 +31,7 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (IsRendered)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             if (availableSpace.IsNegative())
                 return SpacePlan.Wrap();
@@ -46,6 +46,9 @@ namespace QuestPDF.Elements
 
         internal override void Draw(Size availableSpace)
         {
+            if (IsRendered)
+                return;
+            
             if (Type == LineType.Vertical)
             {
                 Canvas.DrawFilledRectangle(new Position(-Thickness/2, 0), new Size(Thickness, availableSpace.Height), Color);

+ 6 - 9
Source/QuestPDF/Elements/Padding.cs

@@ -13,18 +13,18 @@ namespace QuestPDF.Elements
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            if (Child == null)
-                return SpacePlan.FullRender(0, 0);
-            
             var internalSpace = InternalSpace(availableSpace);
 
             if (internalSpace.Width < -Size.Epsilon || internalSpace.Height < -Size.Epsilon)
-                return SpacePlan.Wrap();
+            {
+                var isEmpty = Child.Measure(Size.Zero).Type == SpacePlanType.Empty;
+                return isEmpty ? SpacePlan.Empty() : SpacePlan.Wrap();
+            }
             
             var measure = base.Measure(internalSpace);
 
-            if (measure.Type == SpacePlanType.Wrap)
-                return SpacePlan.Wrap();
+            if (measure.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
+                return measure;
 
             var newSize = new Size(
                 measure.Width + Left + Right,
@@ -41,9 +41,6 @@ namespace QuestPDF.Elements
 
         internal override void Draw(Size availableSpace)
         {
-            if (Child == null)
-                return;
-
             var internalSpace = InternalSpace(availableSpace);
             
             Canvas.Translate(new Position(Left, Top));

+ 3 - 2
Source/QuestPDF/Elements/Page.cs

@@ -43,12 +43,13 @@ namespace QuestPDF.Elements
                     
                     layers
                         .PrimaryLayer()
+                        
                         .MinWidth(MinSize.Width)
                         .MinHeight(MinSize.Height)
-                
                         .MaxWidth(MaxSize.Width)
                         .MaxHeight(MaxSize.Height)
-
+                        .EnforceSizeWhenEmpty()
+                        
                         .PaddingLeft(MarginLeft)
                         .PaddingRight(MarginRight)
                         .PaddingTop(MarginTop)

+ 2 - 2
Source/QuestPDF/Elements/PageBreak.cs

@@ -17,9 +17,9 @@ namespace QuestPDF.Elements
         {
             if (availableSpace.IsNegative())
                 return SpacePlan.Wrap();
-            
+
             if (IsRendered)
-                return SpacePlan.FullRender(0, 0);
+                return SpacePlan.Empty();
 
             return SpacePlan.PartialRender(Size.Zero);
         }

+ 6 - 3
Source/QuestPDF/Elements/Row.cs

@@ -55,7 +55,10 @@ namespace QuestPDF.Elements
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (!Items.Any())
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
+
+            if (Items.All(x => x.IsRendered))
+                return SpacePlan.Empty();
             
             UpdateItemsWidth(availableSpace.Width);
             var renderingCommands = PlanLayout(availableSpace);
@@ -86,10 +89,10 @@ namespace QuestPDF.Elements
 
             foreach (var command in renderingCommands)
             {
-                if (command.Measurement.Type == SpacePlanType.FullRender)
+                if (command.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender)
                     command.RowItem.IsRendered = true;
                 
-                if (command.Measurement.Type == SpacePlanType.Wrap)
+                if (command.Measurement.Type is SpacePlanType.Wrap)
                     continue;
 
                 var offset = ContentDirection == ContentDirection.LeftToRight

+ 2 - 2
Source/QuestPDF/Elements/Scale.cs

@@ -17,8 +17,8 @@ namespace QuestPDF.Elements
             
             var measure = base.Measure(targetSpace);
 
-            if (measure.Type == SpacePlanType.Wrap)
-                return SpacePlan.Wrap();
+            if (measure.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
+                return measure;
 
             var targetSize = new Size(
                 Math.Abs(measure.Width * ScaleX), 

+ 1 - 4
Source/QuestPDF/Elements/ScaleToFit.cs

@@ -8,9 +8,6 @@ namespace QuestPDF.Elements
     {
         internal override SpacePlan Measure(Size availableSpace)
         {
-            if (Child == null)
-                return SpacePlan.FullRender(Size.Zero);
-
             var perfectScale = FindPerfectScale(Child, availableSpace);
 
             if (perfectScale == null)
@@ -72,7 +69,7 @@ namespace QuestPDF.Elements
             bool ChildFits(float scale)
             {
                 var scaledSpace = ScaleSize(availableSpace, 1 / scale);
-                return child.Measure(scaledSpace).Type == SpacePlanType.FullRender;
+                return child.Measure(scaledSpace).Type is SpacePlanType.Empty or SpacePlanType.FullRender;
             }
         }
     }

+ 1 - 1
Source/QuestPDF/Elements/SectionLink.cs

@@ -11,7 +11,7 @@ namespace QuestPDF.Elements
         {
             var targetSize = base.Measure(availableSpace);
 
-            if (targetSize.Type == SpacePlanType.Wrap)
+            if (targetSize.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
                 return;
 
             var targetName = PageContext.GetDocumentLocationName(SectionName);

+ 1 - 1
Source/QuestPDF/Elements/ShowEntire.cs

@@ -9,7 +9,7 @@ namespace QuestPDF.Elements
         {
             var childMeasurement = base.Measure(availableSpace);
 
-            if (childMeasurement.Type == SpacePlanType.FullRender)
+            if (childMeasurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender)
                 return childMeasurement;
 
             return SpacePlan.Wrap();

+ 1 - 1
Source/QuestPDF/Elements/ShowIf.cs

@@ -17,7 +17,7 @@ internal class ShowIf : ContainerElement
     internal override SpacePlan Measure(Size availableSpace)
     {
         if (!CheckVisibility())
-            return SpacePlan.FullRender(Size.Zero);
+            return SpacePlan.Empty();
 
         return base.Measure(availableSpace);
     }

+ 4 - 4
Source/QuestPDF/Elements/ShowOnce.cs

@@ -15,18 +15,18 @@ namespace QuestPDF.Elements
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            if (Child == null || IsRendered)
-                return SpacePlan.FullRender(0, 0);
+            if (IsRendered)
+                return SpacePlan.Empty();
             
             return base.Measure(availableSpace);
         }
 
         internal override void Draw(Size availableSpace)
         {
-            if (Child == null || IsRendered)
+            if (IsRendered)
                 return;
             
-            if (base.Measure(availableSpace).Type == SpacePlanType.FullRender)
+            if (base.Measure(availableSpace).Type is SpacePlanType.Empty or SpacePlanType.FullRender)
                 IsRendered = true;
             
             base.Draw(availableSpace);

+ 4 - 0
Source/QuestPDF/Elements/Shrink.cs

@@ -1,3 +1,4 @@
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 
 namespace QuestPDF.Elements
@@ -13,6 +14,9 @@ namespace QuestPDF.Elements
         {
             var childSize = base.Measure(availableSpace);
 
+            if (childSize.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
+                return;
+            
             var targetSize = new Size(
                 Horizontal ? childSize.Width : availableSpace.Width,
                 Vertical ? childSize.Height : availableSpace.Height);

+ 2 - 2
Source/QuestPDF/Elements/SimpleRotate.cs

@@ -17,8 +17,8 @@ namespace QuestPDF.Elements
             availableSpace = new Size(availableSpace.Height, availableSpace.Width);
             var childSpace = base.Measure(availableSpace);
 
-            if (childSpace.Type == SpacePlanType.Wrap)
-                return SpacePlan.Wrap();
+            if (childSpace.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
+                return childSpace;
 
             var targetSpace = new Size(childSpace.Height, childSpace.Width);
 

+ 2 - 5
Source/QuestPDF/Elements/SkipOnce.cs

@@ -15,17 +15,14 @@ namespace QuestPDF.Elements
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            if (Child == null || !FirstPageWasSkipped)
-                return SpacePlan.FullRender(Size.Zero);
+            if (!FirstPageWasSkipped)
+                return SpacePlan.Empty();
 
             return Child.Measure(availableSpace);
         }
 
         internal override void Draw(Size availableSpace)
         {
-            if (Child == null)
-                return;
-
             if (FirstPageWasSkipped)
                 Child.Draw(availableSpace);
 

+ 1 - 3
Source/QuestPDF/Elements/StopPaging.cs

@@ -8,9 +8,6 @@ namespace QuestPDF.Elements
     {
         internal override SpacePlan Measure(Size availableSpace)
         {
-            if (Child == null)
-                return SpacePlan.FullRender(Size.Zero);
-
             var measurement = Child.Measure(availableSpace);
 
             return measurement.Type switch
@@ -18,6 +15,7 @@ namespace QuestPDF.Elements
                 SpacePlanType.Wrap => SpacePlan.FullRender(Size.Zero),
                 SpacePlanType.PartialRender => SpacePlan.FullRender(measurement),
                 SpacePlanType.FullRender => measurement,
+                SpacePlanType.Empty => measurement,
                 _ => throw new ArgumentOutOfRangeException()
             };
         }

+ 4 - 1
Source/QuestPDF/Elements/SvgImage.cs

@@ -21,7 +21,7 @@ internal class SvgImage : Element, IStateResettable
     internal override SpacePlan Measure(Size availableSpace)
     {
         if (IsRendered)
-            return SpacePlan.FullRender(Size.Zero);
+            return SpacePlan.Empty();
 
         if (availableSpace.IsNegative())
             return SpacePlan.Wrap();
@@ -31,6 +31,9 @@ internal class SvgImage : Element, IStateResettable
 
     internal override void Draw(Size availableSpace)
     {
+        if (IsRendered)
+            return;
+        
         var widthScale = CalculateSpaceScale(availableSpace.Width, Image.SkSvgImage.Size.Width, Image.SkSvgImage.Size.WidthUnit);
         var heightScale = CalculateSpaceScale(availableSpace.Height, Image.SkSvgImage.Size.Height, Image.SkSvgImage.Size.HeightUnit);
         

+ 4 - 1
Source/QuestPDF/Elements/SvgPath.cs

@@ -20,7 +20,7 @@ internal class SvgPath : Element, IStateResettable
     internal override SpacePlan Measure(Size availableSpace)
     {
         if (IsRendered)
-            return SpacePlan.FullRender(Size.Zero);
+            return SpacePlan.Empty();
 
         if (availableSpace.IsNegative())
             return SpacePlan.Wrap();
@@ -30,6 +30,9 @@ internal class SvgPath : Element, IStateResettable
 
     internal override void Draw(Size availableSpace)
     {
+        if (IsRendered)
+            return;
+        
         Canvas.DrawSvgPath(Path, FillColor);
         IsRendered = true;
     }

+ 9 - 6
Source/QuestPDF/Elements/Table/Table.cs

@@ -15,6 +15,7 @@ namespace QuestPDF.Elements.Table
         public bool ExtendLastCellsToTableBottom { get; set; }
         
         private bool CacheInitialized { get; set; }
+        private bool IsRendered => CurrentRow > StartingRowsCount;
         private int StartingRowsCount { get; set; }
         private int RowsCount { get; set; }
         private int CurrentRow { get; set; }
@@ -84,11 +85,10 @@ namespace QuestPDF.Elements.Table
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (!Cells.Any())
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
-            // rows are indexed from 1
-            if (CurrentRow > StartingRowsCount)
-                return SpacePlan.FullRender(Size.Zero);
+            if (IsRendered)
+                return SpacePlan.Empty();
             
             UpdateColumnsWidth(availableSpace.Width);
             var renderingCommands = PlanLayout(availableSpace);
@@ -110,12 +110,15 @@ namespace QuestPDF.Elements.Table
 
         internal override void Draw(Size availableSpace)
         {
+            if (IsRendered)
+                return;
+            
             UpdateColumnsWidth(availableSpace.Width);
             var renderingCommands = PlanLayout(availableSpace);
 
             foreach (var command in renderingCommands.OrderBy(x => x.Cell.ZIndex))
             {
-                if (command.Measurement.Type == SpacePlanType.FullRender)
+                if (command.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender)
                     command.Cell.IsRendered = true;
 
                 if (command.Measurement.Type == SpacePlanType.Wrap)
@@ -137,7 +140,7 @@ namespace QuestPDF.Elements.Table
         {
             var lastFullyRenderedRow = commands
                 .GroupBy(x => x.Cell.Row)
-                .Where(x => x.All(y => y.Cell.IsRendered || y.Measurement.Type == SpacePlanType.FullRender))
+                .Where(x => x.All(y => y.Cell.IsRendered || y.Measurement.Type is SpacePlanType.Empty or SpacePlanType.FullRender))
                 .Select(x => x.Key)
                 .ToArray();
             

+ 9 - 2
Source/QuestPDF/Elements/Text/TextBlock.cs

@@ -57,12 +57,16 @@ namespace QuestPDF.Elements.Text
         internal override SpacePlan Measure(Size availableSpace)
         {
             if (Items.Count == 0)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             if (IsRendered)
-                return SpacePlan.FullRender(Size.Zero);
+                return SpacePlan.Empty();
             
             Initialize();
+            
+            if (Size.Equal(availableSpace, Size.Zero))
+                return SpacePlan.PartialRender(Size.Zero);
+            
             CalculateParagraphMetrics(availableSpace);
 
             if (MaximumWidth == 0)
@@ -100,6 +104,9 @@ namespace QuestPDF.Elements.Text
         {
             if (Items.Count == 0)
                 return;
+
+            if (IsRendered)
+                return;
             
             CalculateParagraphMetrics(availableSpace);
 

+ 1 - 1
Source/QuestPDF/Elements/Unconstrained.cs

@@ -24,7 +24,7 @@ namespace QuestPDF.Elements
         {
             var measurement = base.Measure(Size.Max);
             
-            if (measurement.Type == SpacePlanType.Wrap)
+            if (measurement.Type is SpacePlanType.Empty or SpacePlanType.Wrap)
                 return;
 
             var translate = ContentDirection == ContentDirection.RightToLeft

+ 6 - 0
Source/QuestPDF/Fluent/ConstrainedExtensions.cs

@@ -104,5 +104,11 @@ namespace QuestPDF.Fluent
         }
         
         #endregion
+        
+        internal static IContainer EnforceSizeWhenEmpty(this IContainer element)
+        {
+            (element as Constrained).EnforceSizeWhenEmpty = true;
+            return element;
+        }
     }
 }

+ 5 - 5
Source/QuestPDF/Infrastructure/ContainerElement.cs

@@ -7,27 +7,27 @@ namespace QuestPDF.Infrastructure
 {
     internal abstract class ContainerElement : Element, IContainer
     {
-        internal Element? Child { get; set; } = Empty.Instance;
+        internal Element Child { get; set; } = Empty.Instance;
 
-        IElement? IContainer.Child
+        IElement IContainer.Child
         {
             get => Child;
             set => Child = value as Element;
         }
 
-        internal override IEnumerable<Element?> GetChildren()
+        internal override IEnumerable<Element> GetChildren()
         {
             yield return Child;
         }
 
-        internal override void CreateProxy(Func<Element?, Element?> create)
+        internal override void CreateProxy(Func<Element, Element> create)
         {
             Child = create(Child);
         }
 
         internal override SpacePlan Measure(Size availableSpace)
         {
-            return Child?.Measure(availableSpace) ?? SpacePlan.FullRender(0, 0);
+            return Child.Measure(availableSpace);
         }
         
         internal override void Draw(Size availableSpace)