Browse Source

Refactorization: space planning algorithm

Marcin Ziąbek 4 years ago
parent
commit
adec37007b
74 changed files with 454 additions and 508 deletions
  1. 7 1
      QuestPDF.ReportSample/Tests.cs
  2. 5 5
      QuestPDF.UnitTests/AlignmentTests.cs
  3. 17 17
      QuestPDF.UnitTests/AspectRatioTests.cs
  4. 3 3
      QuestPDF.UnitTests/BorderTests.cs
  5. 11 11
      QuestPDF.UnitTests/ConstrainedTests.cs
  6. 16 16
      QuestPDF.UnitTests/DecorationTests.cs
  7. 3 3
      QuestPDF.UnitTests/DynamicImageTests.cs
  8. 11 11
      QuestPDF.UnitTests/EnsureSpaceTests.cs
  9. 11 11
      QuestPDF.UnitTests/ExtendTests.cs
  10. 0 1
      QuestPDF.UnitTests/GridTests.cs
  11. 3 3
      QuestPDF.UnitTests/ImageTests.cs
  12. 9 9
      QuestPDF.UnitTests/PaddingTests.cs
  13. 3 3
      QuestPDF.UnitTests/PageBreakTests.cs
  14. 16 16
      QuestPDF.UnitTests/RowTests.cs
  15. 7 7
      QuestPDF.UnitTests/ShowEntireTests.cs
  16. 9 9
      QuestPDF.UnitTests/ShowOnceTest.cs
  17. 26 26
      QuestPDF.UnitTests/StackTests.cs
  18. 3 3
      QuestPDF.UnitTests/TestEngine/ElementMock.cs
  19. 3 3
      QuestPDF.UnitTests/TestEngine/Operations/ChildMeasureOperation.cs
  20. 2 2
      QuestPDF.UnitTests/TestEngine/SingleChildTests.cs
  21. 8 13
      QuestPDF.UnitTests/TestEngine/TestPlan.cs
  22. 2 1
      QuestPDF/Assembly.cs
  23. 7 14
      QuestPDF/Drawing/CacheProxy.cs
  24. 0 1
      QuestPDF/Drawing/DocumentContainer.cs
  25. 3 8
      QuestPDF/Drawing/DocumentGenerator.cs
  26. 0 2
      QuestPDF/Drawing/DocumentMetadata.cs
  27. 0 1
      QuestPDF/Drawing/FontManager.cs
  28. 3 3
      QuestPDF/Drawing/PdfCanvas.cs
  29. 0 3
      QuestPDF/Drawing/SkiaCanvasBase.cs
  30. 40 0
      QuestPDF/Drawing/SpacePlan.cs
  31. 0 19
      QuestPDF/Drawing/SpacePlan/FullRender.cs
  32. 0 7
      QuestPDF/Drawing/SpacePlan/ISpacePlan.cs
  33. 0 19
      QuestPDF/Drawing/SpacePlan/PartialRender.cs
  34. 0 7
      QuestPDF/Drawing/SpacePlan/Wrap.cs
  35. 1 1
      QuestPDF/Drawing/TextMeasurement.cs
  36. 4 3
      QuestPDF/Elements/Alignment.cs
  37. 13 13
      QuestPDF/Elements/AspectRatio.cs
  38. 1 1
      QuestPDF/Elements/Background.cs
  39. 1 1
      QuestPDF/Elements/Border.cs
  40. 5 4
      QuestPDF/Elements/Box.cs
  41. 3 3
      QuestPDF/Elements/Canvas.cs
  42. 24 28
      QuestPDF/Elements/Constrained.cs
  43. 15 15
      QuestPDF/Elements/Decoration.cs
  44. 3 3
      QuestPDF/Elements/DynamicImage.cs
  45. 3 3
      QuestPDF/Elements/Empty.cs
  46. 4 4
      QuestPDF/Elements/EnsureSpace.cs
  47. 9 9
      QuestPDF/Elements/Extend.cs
  48. 5 4
      QuestPDF/Elements/ExternalLink.cs
  49. 3 3
      QuestPDF/Elements/Image.cs
  50. 5 4
      QuestPDF/Elements/InternalLink.cs
  51. 1 1
      QuestPDF/Elements/InternalLocation.cs
  52. 3 3
      QuestPDF/Elements/Layers.cs
  53. 12 12
      QuestPDF/Elements/Padding.cs
  54. 4 5
      QuestPDF/Elements/PageBreak.cs
  55. 2 2
      QuestPDF/Elements/PageNumber.cs
  56. 1 1
      QuestPDF/Elements/Rotate.cs
  57. 13 14
      QuestPDF/Elements/Row.cs
  58. 10 10
      QuestPDF/Elements/Scale.cs
  59. 5 5
      QuestPDF/Elements/ShowEntire.cs
  60. 6 6
      QuestPDF/Elements/ShowOnce.cs
  61. 10 11
      QuestPDF/Elements/SimpleRotate.cs
  62. 21 22
      QuestPDF/Elements/Stack.cs
  63. 3 4
      QuestPDF/Elements/Text.cs
  64. 10 11
      QuestPDF/Elements/Unconstrained.cs
  65. 0 2
      QuestPDF/Fluent/RowExtensions.cs
  66. 0 2
      QuestPDF/Fluent/StackExtensions.cs
  67. 10 4
      QuestPDF/Helpers/PageSizes.cs
  68. 3 3
      QuestPDF/Infrastructure/ContainerElement.cs
  69. 2 3
      QuestPDF/Infrastructure/Element.cs
  70. 0 1
      QuestPDF/Infrastructure/ICanvas.cs
  71. 0 1
      QuestPDF/Infrastructure/PageContext.cs
  72. 3 3
      QuestPDF/Infrastructure/Position.cs
  73. 4 25
      QuestPDF/Infrastructure/Size.cs
  74. 4 0
      QuestPDF/QuestPDF.csproj

+ 7 - 1
QuestPDF.ReportSample/Tests.cs

@@ -3,6 +3,7 @@ using System.Diagnostics;
 using System.IO;
 using System.IO;
 using System.Linq;
 using System.Linq;
 using NUnit.Framework;
 using NUnit.Framework;
+using QuestPDF.Drawing;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;
 using QuestPDF.ReportSample.Layouts;
 using QuestPDF.ReportSample.Layouts;
 
 
@@ -45,7 +46,7 @@ namespace QuestPDF.ReportSample
             var sw = new Stopwatch();
             var sw = new Stopwatch();
             
             
             sw.Start();
             sw.Start();
-            var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
+            var totalSize = MethodToOptimize();
             sw.Stop();
             sw.Stop();
 
 
             // show summary
             // show summary
@@ -59,6 +60,11 @@ namespace QuestPDF.ReportSample
 
 
             if (speed < performanceTarget)
             if (speed < performanceTarget)
                 throw new Exception("Rendering algorithm is too slow.");
                 throw new Exception("Rendering algorithm is too slow.");
+
+            long MethodToOptimize()
+            {
+                return reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
+            }
         }
         }
     }
     }
 }
 }

+ 5 - 5
QuestPDF.UnitTests/AlignmentTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -27,7 +27,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .DrawElement(new Size(1000, 500))
                 .DrawElement(new Size(1000, 500))
-                .ExpectChildMeasure(expectedInput: new Size(1000, 500), returns: new PartialRender(new Size(400, 200)))
+                .ExpectChildMeasure(expectedInput: new Size(1000, 500), returns: SpacePlan.PartialRender(new Size(400, 200)))
                 .ExpectCanvasTranslate(new Position(300, 150))
                 .ExpectCanvasTranslate(new Position(300, 150))
                 .ExpectChildDraw(new Size(400, 200))
                 .ExpectChildDraw(new Size(400, 200))
                 .ExpectCanvasTranslate(new Position(-300, -150))
                 .ExpectCanvasTranslate(new Position(-300, -150))
@@ -46,7 +46,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
+                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
                 .ExpectCanvasTranslate(new Position(0, 125))
                 .ExpectCanvasTranslate(new Position(0, 125))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectCanvasTranslate(new Position(0, -125))
                 .ExpectCanvasTranslate(new Position(0, -125))
@@ -65,7 +65,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
+                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
                 .ExpectCanvasTranslate(new Position(150, 250))
                 .ExpectCanvasTranslate(new Position(150, 250))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectCanvasTranslate(new Position(-150, -250))
                 .ExpectCanvasTranslate(new Position(-150, -250))
@@ -84,7 +84,7 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
+                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
                 .ExpectCanvasTranslate(new Position(300, 0))
                 .ExpectCanvasTranslate(new Position(300, 0))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectChildDraw(new Size(100, 50))
                 .ExpectCanvasTranslate(new Position(-300, 0))
                 .ExpectCanvasTranslate(new Position(-300, 0))

+ 17 - 17
QuestPDF.UnitTests/AspectRatioTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -26,8 +26,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 201))
                 .MeasureElement(new Size(400, 201))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -41,8 +41,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 201))
                 .MeasureElement(new Size(400, 201))
-                .ExpectChildMeasure(new Size(400, 200), new PartialRender(100, 50))
-                .CheckMeasureResult(new PartialRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(100, 50))
+                .CheckMeasureResult(SpacePlan.PartialRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -56,8 +56,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 201))
                 .MeasureElement(new Size(400, 201))
-                .ExpectChildMeasure(new Size(400, 200), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -71,8 +71,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 201))
                 .MeasureElement(new Size(400, 201))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
 
 
         [Test]
         [Test]
@@ -86,7 +86,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 199))
                 .MeasureElement(new Size(400, 199))
-                .CheckMeasureResult(new Wrap());
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -100,8 +100,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(401, 200))
                 .MeasureElement(new Size(401, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -115,7 +115,7 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(399, 200))
                 .MeasureElement(new Size(399, 200))
-                .CheckMeasureResult(new Wrap());
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -129,8 +129,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -144,8 +144,8 @@ namespace QuestPDF.UnitTests
                     Ratio = 2f
                     Ratio = 2f
                 })
                 })
                 .MeasureElement(new Size(500, 200))
                 .MeasureElement(new Size(500, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]

+ 3 - 3
QuestPDF.UnitTests/BorderTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Helpers;
 using QuestPDF.Helpers;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
@@ -27,8 +27,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
-                .CheckMeasureResult( new FullRender(new Size(100, 50)));
+                .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
+                .CheckMeasureResult( SpacePlan.FullRender(new Size(100, 50)));
         }
         }
         
         
         [Test]
         [Test]

+ 11 - 11
QuestPDF.UnitTests/ConstrainedTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -24,7 +24,7 @@ namespace QuestPDF.UnitTests
                     MinHeight = 100
                     MinHeight = 100
                 })
                 })
                 .MeasureElement(new Size(400, 50))
                 .MeasureElement(new Size(400, 50))
-                .CheckMeasureResult(new Wrap());
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -37,8 +37,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(400, 50))
-                .CheckMeasureResult(new FullRender(400, 100));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 100));
         }
         }
         
         
         [Test]
         [Test]
@@ -51,8 +51,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(400, 150))
-                .CheckMeasureResult(new FullRender(400, 150));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 150));
         }
         }
         
         
         [Test]
         [Test]
@@ -64,7 +64,7 @@ namespace QuestPDF.UnitTests
                     MaxHeight = 100
                     MaxHeight = 100
                 })
                 })
                 .MeasureElement(new Size(400, 150))
                 .MeasureElement(new Size(400, 150))
-                .CheckMeasureResult(new FullRender(0, 0));
+                .CheckMeasureResult(SpacePlan.FullRender(0, 0));
         }
         }
         
         
         [Test]
         [Test]
@@ -77,8 +77,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 100), new PartialRender(400, 75))
-                .CheckMeasureResult(new PartialRender(400, 75));
+                .ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
+                .CheckMeasureResult(SpacePlan.PartialRender(400, 75));
         }
         }
         
         
         [Test]
         [Test]
@@ -91,8 +91,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 100), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
     }
     }
 }
 }

+ 16 - 16
QuestPDF.UnitTests/DecorationTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -22,8 +22,8 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -37,8 +37,8 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new PartialRender(300, 200))
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.PartialRender(300, 200))
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -52,9 +52,9 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
-                .ExpectChildMeasure("content", new Size(400, 200), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
+                .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -68,9 +68,9 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
-                .ExpectChildMeasure("content", new Size(400, 200), new PartialRender(200, 150))
-                .CheckMeasureResult(new PartialRender(400, 250));
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
+                .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.PartialRender(200, 150))
+                .CheckMeasureResult(SpacePlan.PartialRender(400, 250));
         }
         }
         
         
         [Test]
         [Test]
@@ -84,9 +84,9 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
-                .ExpectChildMeasure("content", new Size(400, 200), new FullRender(200, 150))
-                .CheckMeasureResult(new FullRender(400, 250));
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
+                .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.FullRender(200, 150))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 250));
         }
         }
         
         
         #endregion
         #endregion
@@ -104,7 +104,7 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
                 .ExpectChildDraw("decoration", new Size(400, 100))
                 .ExpectChildDraw("decoration", new Size(400, 100))
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectChildDraw("content", new Size(400, 200))
                 .ExpectChildDraw("content", new Size(400, 200))
@@ -123,7 +123,7 @@ namespace QuestPDF.UnitTests
                     ContentElement = x.CreateChild("content")
                     ContentElement = x.CreateChild("content")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
+                .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
                 .ExpectChildDraw("content", new Size(400, 200))
                 .ExpectChildDraw("content", new Size(400, 200))
                 .ExpectCanvasTranslate(0, 200)
                 .ExpectCanvasTranslate(0, 200)
                 .ExpectChildDraw("decoration", new Size(400, 100))
                 .ExpectChildDraw("decoration", new Size(400, 100))

+ 3 - 3
QuestPDF.UnitTests/DynamicImageTests.cs

@@ -1,6 +1,6 @@
 using FluentAssertions;
 using FluentAssertions;
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -20,7 +20,7 @@ namespace QuestPDF.UnitTests
                     Source = GenerateImage
                     Source = GenerateImage
                 })
                 })
                 .MeasureElement(new Size(300, 200))
                 .MeasureElement(new Size(300, 200))
-                .CheckMeasureResult(new FullRender(300, 200));
+                .CheckMeasureResult(SpacePlan.FullRender(300, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -51,7 +51,7 @@ namespace QuestPDF.UnitTests
         [Test]
         [Test]
         public void Draw_PassesCorrectSizeToSource()
         public void Draw_PassesCorrectSizeToSource()
         {
         {
-            Size passedSize = null;
+            Size passedSize = default;
 
 
             TestPlan
             TestPlan
                 .For(x => new DynamicImage
                 .For(x => new DynamicImage

+ 11 - 11
QuestPDF.UnitTests/EnsureSpaceTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -19,8 +19,8 @@ namespace QuestPDF.UnitTests
                     MinHeight = 200
                     MinHeight = 200
                 })
                 })
                 .MeasureElement(new Size(400, 100))
                 .MeasureElement(new Size(400, 100))
-                .ExpectChildMeasure(new Size(400, 100), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
                     MinHeight = 200
                     MinHeight = 200
                 })
                 })
                 .MeasureElement(new Size(400, 100))
                 .MeasureElement(new Size(400, 100))
-                .ExpectChildMeasure(new Size(400, 100), new PartialRender(300, 50))
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(300, 50))
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -47,8 +47,8 @@ namespace QuestPDF.UnitTests
                     MinHeight = 200
                     MinHeight = 200
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 250))
-                .CheckMeasureResult(new PartialRender(300, 250));
+                .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 250))
+                .CheckMeasureResult(SpacePlan.PartialRender(300, 250));
         }
         }
         
         
         [Test]
         [Test]
@@ -61,8 +61,8 @@ namespace QuestPDF.UnitTests
                     MinHeight = 200
                     MinHeight = 200
                 })
                 })
                 .MeasureElement(new Size(400, 100))
                 .MeasureElement(new Size(400, 100))
-                .ExpectChildMeasure(new Size(400, 100), new FullRender(300, 50))
-                .CheckMeasureResult(new FullRender(300, 50));
+                .ExpectChildMeasure(new Size(400, 100), SpacePlan.FullRender(300, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(300, 50));
         }
         }
         
         
         [Test]
         [Test]
@@ -75,8 +75,8 @@ namespace QuestPDF.UnitTests
                     MinHeight = 200
                     MinHeight = 200
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 300), new FullRender(300, 250))
-                .CheckMeasureResult(new FullRender(300, 250));
+                .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 250))
+                .CheckMeasureResult(SpacePlan.FullRender(300, 250));
         }
         }
     }
     }
 }
 }

+ 11 - 11
QuestPDF.UnitTests/ExtendTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -24,8 +24,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -39,8 +39,8 @@ namespace QuestPDF.UnitTests
                     ExtendVertical = true
                     ExtendVertical = true
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new PartialRender(300, 100))
-                .CheckMeasureResult(new PartialRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(300, 100))
+                .CheckMeasureResult(SpacePlan.PartialRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -54,8 +54,8 @@ namespace QuestPDF.UnitTests
                     ExtendVertical = true
                     ExtendVertical = true
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(300, 100))
-                .CheckMeasureResult(new FullRender(400, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(300, 100))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -69,8 +69,8 @@ namespace QuestPDF.UnitTests
                     ExtendVertical = false
                     ExtendVertical = false
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
-                .CheckMeasureResult(new FullRender(400, 100));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
+                .CheckMeasureResult(SpacePlan.FullRender(400, 100));
         }
         }
         
         
         [Test]
         [Test]
@@ -84,8 +84,8 @@ namespace QuestPDF.UnitTests
                     ExtendVertical = true
                     ExtendVertical = true
                 })
                 })
                 .MeasureElement(new Size(400, 200))
                 .MeasureElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
-                .CheckMeasureResult(new FullRender(100, 200));
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
+                .CheckMeasureResult(SpacePlan.FullRender(100, 200));
         }
         }
     }
     }
 }
 }

+ 0 - 1
QuestPDF.UnitTests/GridTests.cs

@@ -1,5 +1,4 @@
 using FluentAssertions;
 using FluentAssertions;
-using FluentAssertions.Equivalency;
 using NUnit.Framework;
 using NUnit.Framework;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;

+ 3 - 3
QuestPDF.UnitTests/ImageTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
@@ -26,7 +26,7 @@ namespace QuestPDF.UnitTests
                     InternalImage = GenerateImage(400, 300)
                     InternalImage = GenerateImage(400, 300)
                 })
                 })
                 .MeasureElement(new Size(300, 200))
                 .MeasureElement(new Size(300, 200))
-                .CheckMeasureResult(new FullRender(300, 200));
+                .CheckMeasureResult(SpacePlan.FullRender(300, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -55,7 +55,7 @@ namespace QuestPDF.UnitTests
                     return container;
                     return container;
                 })
                 })
                 .MeasureElement(new Size(300, 200))
                 .MeasureElement(new Size(300, 200))
-                .CheckMeasureResult(new FullRender(300, 100));;
+                .CheckMeasureResult(SpacePlan.FullRender(300, 100));;
         }
         }
         
         
         SKImage GenerateImage(int width, int height)
         SKImage GenerateImage(int width, int height)

+ 9 - 9
QuestPDF.UnitTests/PaddingTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -34,8 +34,8 @@ namespace QuestPDF.UnitTests
             TestPlan
             TestPlan
                 .For(GetPadding)
                 .For(GetPadding)
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(340, 260), new FullRender(140, 60))
-                .CheckMeasureResult(new FullRender(200, 100));
+                .ExpectChildMeasure(new Size(340, 260), SpacePlan.FullRender(140, 60))
+                .CheckMeasureResult(SpacePlan.FullRender(200, 100));
         } 
         } 
         
         
         [Test]
         [Test]
@@ -44,7 +44,7 @@ namespace QuestPDF.UnitTests
             TestPlan
             TestPlan
                 .For(GetPadding)
                 .For(GetPadding)
                 .MeasureElement(new Size(50, 300))
                 .MeasureElement(new Size(50, 300))
-                .CheckMeasureResult(new Wrap());
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -53,7 +53,7 @@ namespace QuestPDF.UnitTests
             TestPlan
             TestPlan
                 .For(GetPadding)
                 .For(GetPadding)
                 .MeasureElement(new Size(20, 300))
                 .MeasureElement(new Size(20, 300))
-                .CheckMeasureResult(new Wrap());
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -62,8 +62,8 @@ namespace QuestPDF.UnitTests
             TestPlan
             TestPlan
                 .For(GetPadding)
                 .For(GetPadding)
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(340, 260), new PartialRender(40, 160))
-                .CheckMeasureResult(new PartialRender(100, 200));
+                .ExpectChildMeasure(new Size(340, 260), SpacePlan.PartialRender(40, 160))
+                .CheckMeasureResult(SpacePlan.PartialRender(100, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -72,8 +72,8 @@ namespace QuestPDF.UnitTests
             TestPlan
             TestPlan
                 .For(GetPadding)
                 .For(GetPadding)
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(340, 260), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(340, 260), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]

+ 3 - 3
QuestPDF.UnitTests/PageBreakTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -16,13 +16,13 @@ namespace QuestPDF.UnitTests
                 .For(x => new PageBreak())
                 .For(x => new PageBreak())
                 
                 
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .CheckMeasureResult(new PartialRender(Size.Zero))
+                .CheckMeasureResult(SpacePlan.PartialRender(Size.Zero))
                 
                 
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
                 .CheckDrawResult()
                 .CheckDrawResult()
                 
                 
                 .MeasureElement(new Size(500, 400))
                 .MeasureElement(new Size(500, 400))
-                .CheckMeasureResult(new FullRender(Size.Zero));
+                .CheckMeasureResult(SpacePlan.FullRender(0, 0));
         }
         }
     }
     }
 }
 }

+ 16 - 16
QuestPDF.UnitTests/RowTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -21,8 +21,8 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -35,9 +35,9 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
-                .ExpectChildMeasure("right", new Size(150, 300), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
+                .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -50,9 +50,9 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new PartialRender(250, 150))
-                .ExpectChildMeasure("right", new Size(150, 300), new FullRender(100, 100))
-                .CheckMeasureResult(new PartialRender(350, 150));
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.PartialRender(250, 150))
+                .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.FullRender(100, 100))
+                .CheckMeasureResult(SpacePlan.PartialRender(350, 150));
         }
         }
         
         
         [Test]
         [Test]
@@ -65,9 +65,9 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
-                .ExpectChildMeasure("right", new Size(150, 300), new PartialRender(100, 100))
-                .CheckMeasureResult(new PartialRender(350, 150));
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
+                .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.PartialRender(100, 100))
+                .CheckMeasureResult(SpacePlan.PartialRender(350, 150));
         }
         }
         
         
         [Test]
         [Test]
@@ -80,9 +80,9 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new FullRender(200, 150))
-                .ExpectChildMeasure("right", new Size(200, 300), new FullRender(100, 100))
-                .CheckMeasureResult(new FullRender(300, 150));
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(200, 150))
+                .ExpectChildMeasure("right", new Size(200, 300), SpacePlan.FullRender(100, 100))
+                .CheckMeasureResult(SpacePlan.FullRender(300, 150));
         }
         }
         
         
         #endregion
         #endregion
@@ -99,7 +99,7 @@ namespace QuestPDF.UnitTests
                     Right = x.CreateChild("right")
                     Right = x.CreateChild("right")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
+                .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
                 .ExpectChildDraw("left", new Size(250, 300))
                 .ExpectChildDraw("left", new Size(250, 300))
                 .ExpectCanvasTranslate(250, 0)
                 .ExpectCanvasTranslate(250, 0)
                 .ExpectChildDraw("right", new Size(150, 300))
                 .ExpectChildDraw("right", new Size(150, 300))

+ 7 - 7
QuestPDF.UnitTests/ShowEntireTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -18,8 +18,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 300), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -31,8 +31,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 200))
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -44,8 +44,8 @@ namespace QuestPDF.UnitTests
                     Child = x.CreateChild()
                     Child = x.CreateChild()
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure(new Size(400, 300), new FullRender(300, 200))
-                .CheckMeasureResult(new FullRender(300, 200));
+                .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 200))
+                .CheckMeasureResult(SpacePlan.FullRender(300, 200));
         }
         }
     }
     }
 }
 }

+ 9 - 9
QuestPDF.UnitTests/ShowOnceTest.cs

@@ -1,6 +1,6 @@
 using Moq;
 using Moq;
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -23,7 +23,7 @@ namespace QuestPDF.UnitTests
             
             
             child
             child
                 .Setup(x => x.Measure(It.IsAny<Size>()))
                 .Setup(x => x.Measure(It.IsAny<Size>()))
-                .Returns(() => new FullRender(Size.Zero));
+                .Returns(() => SpacePlan.FullRender(0, 0));
 
 
             var element = new ShowOnce()
             var element = new ShowOnce()
             {
             {
@@ -47,31 +47,31 @@ namespace QuestPDF.UnitTests
                 
                 
                 // Measure the element and return result
                 // Measure the element and return result
                 .MeasureElement(new Size(300, 200))
                 .MeasureElement(new Size(300, 200))
-                .ExpectChildMeasure("child", new Size(300, 200), new PartialRender(new Size(200, 200)))
-                .CheckMeasureResult(new PartialRender(new Size(200, 200)))
+                .ExpectChildMeasure("child", new Size(300, 200), SpacePlan.PartialRender(new Size(200, 200)))
+                .CheckMeasureResult(SpacePlan.PartialRender(new Size(200, 200)))
                 
                 
                 // Draw element partially
                 // Draw element partially
                 .DrawElement(new Size(200, 200))
                 .DrawElement(new Size(200, 200))
-                .ExpectChildMeasure(new Size(200, 200), new PartialRender(new Size(200, 200)))
+                .ExpectChildMeasure(new Size(200, 200), SpacePlan.PartialRender(new Size(200, 200)))
                 .ExpectChildDraw(new Size(200, 200))
                 .ExpectChildDraw(new Size(200, 200))
                 .CheckDrawResult()
                 .CheckDrawResult()
                 
                 
                 // Element was not fully drawn
                 // Element was not fully drawn
                 // It should be measured again for rendering on next page
                 // It should be measured again for rendering on next page
                 .MeasureElement(new Size(800, 200))
                 .MeasureElement(new Size(800, 200))
-                .ExpectChildMeasure(new Size(800, 200), new FullRender(new Size(400, 200)))
-                .CheckMeasureResult(new FullRender(new Size(400, 200)))
+                .ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(new Size(400, 200)))
+                .CheckMeasureResult(SpacePlan.FullRender(new Size(400, 200)))
 
 
                 // Draw element on next page
                 // Draw element on next page
                 // Element was fully drawn at this point
                 // Element was fully drawn at this point
                 .DrawElement(new Size(400, 200))
                 .DrawElement(new Size(400, 200))
-                .ExpectChildMeasure(new Size(400, 200), new FullRender(new Size(400, 200)))
+                .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(new Size(400, 200)))
                 .ExpectChildDraw(new Size(400, 200))
                 .ExpectChildDraw(new Size(400, 200))
                 .CheckDrawResult()
                 .CheckDrawResult()
                 
                 
                 // In the next attempt of measuring element, it should behave like empty parent.
                 // In the next attempt of measuring element, it should behave like empty parent.
                 .MeasureElement(new Size(600, 200))
                 .MeasureElement(new Size(600, 200))
-                .CheckMeasureResult(new FullRender(Size.Zero))
+                .CheckMeasureResult(SpacePlan.FullRender(0, 0))
                 
                 
                 // In the next attempt of measuring element, it should not draw its child
                 // In the next attempt of measuring element, it should not draw its child
                 .DrawElement(new Size(600, 200))
                 .DrawElement(new Size(600, 200))

+ 26 - 26
QuestPDF.UnitTests/StackTests.cs

@@ -1,5 +1,5 @@
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine;
 using QuestPDF.UnitTests.TestEngine;
@@ -21,8 +21,8 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new Wrap())
-                .CheckMeasureResult(new Wrap());
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.Wrap());
         }
         }
         
         
         [Test]
         [Test]
@@ -35,8 +35,8 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new PartialRender(300, 200))
-                .CheckMeasureResult(new PartialRender(300, 200));
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(300, 200))
+                .CheckMeasureResult(SpacePlan.PartialRender(300, 200));
         }
         }
         
         
         [Test]
         [Test]
@@ -49,9 +49,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new Wrap())
-                .CheckMeasureResult(new PartialRender(200, 100));
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
+                .CheckMeasureResult(SpacePlan.PartialRender(200, 100));
         }
         }
         
         
         [Test]
         [Test]
@@ -64,9 +64,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new PartialRender(300, 150))
-                .CheckMeasureResult(new PartialRender(300, 250));
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(300, 150))
+                .CheckMeasureResult(SpacePlan.PartialRender(300, 250));
         }
         }
         
         
         [Test]
         [Test]
@@ -79,9 +79,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new FullRender(100, 50))
-                .CheckMeasureResult(new FullRender(200, 150));
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(100, 50))
+                .CheckMeasureResult(SpacePlan.FullRender(200, 150));
         }
         }
         
         
         [Test]
         [Test]
@@ -96,8 +96,8 @@ namespace QuestPDF.UnitTests
                     IsFirstRendered = true
                     IsFirstRendered = true
                 })
                 })
                 .MeasureElement(new Size(400, 300))
                 .MeasureElement(new Size(400, 300))
-                .ExpectChildMeasure("second", new Size(400, 300), new FullRender(200, 300))
-                .CheckMeasureResult(new FullRender(200, 300));
+                .ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
+                .CheckMeasureResult(SpacePlan.FullRender(200, 300));
         }
         }
         
         
         #endregion
         #endregion
@@ -114,7 +114,7 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new Wrap())
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
                 .CheckDrawResult();
                 .CheckDrawResult();
         }
         }
         
         
@@ -128,7 +128,7 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new PartialRender(200, 100))
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(200, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
                 .CheckDrawResult();
                 .CheckDrawResult();
         }
         }
@@ -143,9 +143,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new Wrap())
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
                 .CheckDrawResult();
                 .CheckDrawResult();
         }
         }
         
         
@@ -159,9 +159,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new PartialRender(250, 150))
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(250, 150))
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectChildDraw("second", new Size(400, 150))
                 .ExpectChildDraw("second", new Size(400, 150))
                 .ExpectCanvasTranslate(0, -100)
                 .ExpectCanvasTranslate(0, -100)
@@ -178,9 +178,9 @@ namespace QuestPDF.UnitTests
                     Second = x.CreateChild("second")
                     Second = x.CreateChild("second")
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
+                .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
                 .ExpectChildDraw("first", new Size(400, 100))
-                .ExpectChildMeasure("second", new Size(400, 200), new FullRender(250, 150))
+                .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(250, 150))
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectCanvasTranslate(0, 100)
                 .ExpectChildDraw("second", new Size(400, 150))
                 .ExpectChildDraw("second", new Size(400, 150))
                 .ExpectCanvasTranslate(0, -100)
                 .ExpectCanvasTranslate(0, -100)
@@ -199,7 +199,7 @@ namespace QuestPDF.UnitTests
                     IsFirstRendered = true
                     IsFirstRendered = true
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("second", new Size(400, 300), new PartialRender(200, 300))
+                .ExpectChildMeasure("second", new Size(400, 300), SpacePlan.PartialRender(200, 300))
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectCanvasTranslate(0, 0)
@@ -219,7 +219,7 @@ namespace QuestPDF.UnitTests
                     IsFirstRendered = true
                     IsFirstRendered = true
                 })
                 })
                 .DrawElement(new Size(400, 300))
                 .DrawElement(new Size(400, 300))
-                .ExpectChildMeasure("second", new Size(400, 300), new FullRender(200, 300))
+                .ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectChildDraw("second", new Size(400, 300))
                 .ExpectCanvasTranslate(0, 0)
                 .ExpectCanvasTranslate(0, 0)

+ 3 - 3
QuestPDF.UnitTests/TestEngine/ElementMock.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.UnitTests.TestEngine
 namespace QuestPDF.UnitTests.TestEngine
@@ -7,10 +7,10 @@ namespace QuestPDF.UnitTests.TestEngine
     internal class ElementMock : Element
     internal class ElementMock : Element
     {
     {
         public string Id { get; set; }
         public string Id { get; set; }
-        public Func<Size, ISpacePlan> MeasureFunc { get; set; }
+        public Func<Size, SpacePlan> MeasureFunc { get; set; }
         public Action<Size> DrawFunc { get; set; }
         public Action<Size> DrawFunc { get; set; }
 
 
-        internal override ISpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
+        internal override SpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
         internal override void Draw(Size availableSpace) => DrawFunc(availableSpace);
         internal override void Draw(Size availableSpace) => DrawFunc(availableSpace);
     }
     }
 }
 }

+ 3 - 3
QuestPDF.UnitTests/TestEngine/Operations/ChildMeasureOperation.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.UnitTests.TestEngine.Operations
 namespace QuestPDF.UnitTests.TestEngine.Operations
@@ -7,9 +7,9 @@ namespace QuestPDF.UnitTests.TestEngine.Operations
     {
     {
         public string ChildId { get; }
         public string ChildId { get; }
         public Size Input { get; }
         public Size Input { get; }
-        public ISpacePlan Output { get; }
+        public SpacePlan Output { get; }
 
 
-        public ChildMeasureOperationBase(string childId, Size input, ISpacePlan output)
+        public ChildMeasureOperationBase(string childId, Size input, SpacePlan output)
         {
         {
             ChildId = childId;
             ChildId = childId;
             Input = input;
             Input = input;

+ 2 - 2
QuestPDF.UnitTests/TestEngine/SingleChildTests.cs

@@ -1,6 +1,6 @@
 using FluentAssertions;
 using FluentAssertions;
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.UnitTests.TestEngine
 namespace QuestPDF.UnitTests.TestEngine
@@ -10,7 +10,7 @@ namespace QuestPDF.UnitTests.TestEngine
         internal static void MeasureWithoutChild<T>(this T element) where T : ContainerElement
         internal static void MeasureWithoutChild<T>(this T element) where T : ContainerElement
         {
         {
             element.Child = null;
             element.Child = null;
-            element.Measure(Size.Zero).Should().BeEquivalentTo(new FullRender(Size.Zero));
+            element.Measure(Size.Zero).Should().BeEquivalentTo(SpacePlan.FullRender(0, 0));
         }
         }
         
         
         internal static void DrawWithoutChild<T>(this T element) where T : ContainerElement
         internal static void DrawWithoutChild<T>(this T element) where T : ContainerElement

+ 8 - 13
QuestPDF.UnitTests/TestEngine/TestPlan.cs

@@ -2,7 +2,7 @@
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Text.Json;
 using System.Text.Json;
 using NUnit.Framework;
 using NUnit.Framework;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using QuestPDF.UnitTests.TestEngine.Operations;
 using QuestPDF.UnitTests.TestEngine.Operations;
@@ -158,12 +158,12 @@ namespace QuestPDF.UnitTests.TestEngine
             return this;
             return this;
         }
         }
         
         
-        public TestPlan ExpectChildMeasure(Size expectedInput, ISpacePlan returns)
+        public TestPlan ExpectChildMeasure(Size expectedInput, SpacePlan returns)
         {
         {
             return ExpectChildMeasure(DefaultChildName, expectedInput, returns);
             return ExpectChildMeasure(DefaultChildName, expectedInput, returns);
         }
         }
         
         
-        public TestPlan ExpectChildMeasure(string child, Size expectedInput, ISpacePlan returns)
+        public TestPlan ExpectChildMeasure(string child, Size expectedInput, SpacePlan returns)
         {
         {
             return AddOperation(new ChildMeasureOperationBase(child, expectedInput, returns));
             return AddOperation(new ChildMeasureOperationBase(child, expectedInput, returns));
         }
         }
@@ -203,22 +203,17 @@ namespace QuestPDF.UnitTests.TestEngine
             return AddOperation(new CanvasDrawImageOperationBase(position, size));
             return AddOperation(new CanvasDrawImageOperationBase(position, size));
         }
         }
         
         
-        public TestPlan CheckMeasureResult(ISpacePlan expected)
+        public TestPlan CheckMeasureResult(SpacePlan expected)
         {
         {
             Element.HandleVisitor(x => x?.Initialize(null, Canvas));
             Element.HandleVisitor(x => x?.Initialize(null, Canvas));
             
             
             var actual = Element.Measure(OperationInput);
             var actual = Element.Measure(OperationInput);
             
             
             Assert.AreEqual(expected.GetType(), actual.GetType());
             Assert.AreEqual(expected.GetType(), actual.GetType());
-
-            var expectedSize = expected as Size;
-            var actualSize = actual as Size;
-
-            if (expectedSize != null)
-            {
-                Assert.AreEqual(expectedSize.Width, actualSize.Width, "Measure: width");
-                Assert.AreEqual(expectedSize.Height, actualSize.Height, "Measure: height");
-            }
+            
+            Assert.AreEqual(expected.Width, actual.Width, "Measure: width");
+            Assert.AreEqual(expected.Height, actual.Height, "Measure: height");
+            Assert.AreEqual(expected.Type, actual.Type, "Measure: height");
             
             
             return this;
             return this;
         }
         }

+ 2 - 1
QuestPDF/Assembly.cs

@@ -2,4 +2,5 @@
 
 
 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
 [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
 [assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
 [assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
-[assembly: InternalsVisibleTo("QuestPDF.Examples")]
+[assembly: InternalsVisibleTo("QuestPDF.Examples")]
+[assembly: InternalsVisibleTo("QuestPDF.ReportSample")]

+ 7 - 14
QuestPDF/Drawing/CacheProxy.cs

@@ -1,7 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
-using IContainer = System.ComponentModel.IContainer;
 
 
 namespace QuestPDF.Drawing
 namespace QuestPDF.Drawing
 {
 {
@@ -13,22 +11,22 @@ namespace QuestPDF.Drawing
     internal class CacheProxy : ElementProxy
     internal class CacheProxy : ElementProxy
     {
     {
         public Size? AvailableSpace { get; set; }
         public Size? AvailableSpace { get; set; }
-        public ISpacePlan? MeasurementResult { get; set; }
+        public SpacePlan? MeasurementResult { get; set; }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (MeasurementResult != null &&
             if (MeasurementResult != null &&
                 AvailableSpace != null &&
                 AvailableSpace != null &&
-                IsClose(AvailableSpace.Width, availableSpace.Width) &&
-                IsClose(AvailableSpace.Height, availableSpace.Height))
+                IsClose(AvailableSpace.Value.Width, availableSpace.Width) &&
+                IsClose(AvailableSpace.Value.Height, availableSpace.Height))
             {
             {
-                return MeasurementResult;
+                return MeasurementResult.Value;
             }
             }
 
 
             AvailableSpace = availableSpace;
             AvailableSpace = availableSpace;
-            MeasurementResult = Child?.Measure(availableSpace) ?? new FullRender(Size.Zero);
+            MeasurementResult = base.Measure(availableSpace);
 
 
-            return MeasurementResult;
+            return MeasurementResult.Value;
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
@@ -44,9 +42,4 @@ namespace QuestPDF.Drawing
             return Math.Abs(x - y) < Size.Epsilon;
             return Math.Abs(x - y) < Size.Epsilon;
         }
         }
     }
     }
-
-    internal class DebugProxy : ElementProxy
-    {
-        
-    }
 }
 }

+ 0 - 1
QuestPDF/Drawing/DocumentContainer.cs

@@ -3,7 +3,6 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;
-using QuestPDF.Helpers;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Drawing
 namespace QuestPDF.Drawing

+ 3 - 8
QuestPDF/Drawing/DocumentGenerator.cs

@@ -1,14 +1,9 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using System.Diagnostics;
 using System.IO;
 using System.IO;
 using QuestPDF.Drawing.Exceptions;
 using QuestPDF.Drawing.Exceptions;
-using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
-using QuestPDF.Fluent;
-using QuestPDF.Helpers;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
-using SkiaSharp;
 
 
 namespace QuestPDF.Drawing
 namespace QuestPDF.Drawing
 {
 {
@@ -59,9 +54,9 @@ namespace QuestPDF.Drawing
             while(true)
             while(true)
             {
             {
                 pageContext.SetPageNumber(currentPage);
                 pageContext.SetPageNumber(currentPage);
-                var spacePlan = content.Measure(Size.Max) as Size;
+                var spacePlan = content.Measure(Size.Max);
 
 
-                if (spacePlan == null)
+                if (spacePlan.Type == SpacePlanType.Wrap)
                     break;
                     break;
 
 
                 try
                 try
@@ -83,7 +78,7 @@ namespace QuestPDF.Drawing
                     throw new DocumentLayoutException("Composed layout generates infinite document.");
                     throw new DocumentLayoutException("Composed layout generates infinite document.");
                 }
                 }
                 
                 
-                if (spacePlan is FullRender)
+                if (spacePlan.Type == SpacePlanType.FullRender)
                     break;
                     break;
 
 
                 currentPage++;
                 currentPage++;

+ 0 - 2
QuestPDF/Drawing/DocumentMetadata.cs

@@ -1,6 +1,4 @@
 using System;
 using System;
-using QuestPDF.Helpers;
-using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Drawing
 namespace QuestPDF.Drawing
 {
 {

+ 0 - 1
QuestPDF/Drawing/FontManager.cs

@@ -1,7 +1,6 @@
 using System;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Concurrent;
 using System.IO;
 using System.IO;
-using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using SkiaSharp;
 using SkiaSharp;
 
 

+ 3 - 3
QuestPDF/Drawing/PdfCanvas.cs

@@ -25,10 +25,10 @@ namespace QuestPDF.Drawing
 
 
         public override void EndDocument()
         public override void EndDocument()
         {
         {
-            Canvas.Dispose();
+            Canvas?.Dispose();
             
             
-            Document.Close();
-            Document.Dispose();
+            Document?.Close();
+            Document?.Dispose();
         }
         }
 
 
         public override void BeginPage(Size size)
         public override void BeginPage(Size size)

+ 0 - 3
QuestPDF/Drawing/SkiaCanvasBase.cs

@@ -1,6 +1,3 @@
-using System;
-using System.Collections.Generic;
-using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using SkiaSharp;
 using SkiaSharp;
 
 

+ 40 - 0
QuestPDF/Drawing/SpacePlan.cs

@@ -0,0 +1,40 @@
+using QuestPDF.Infrastructure;
+
+namespace QuestPDF.Drawing
+{
+    public enum SpacePlanType
+    {
+        Wrap,
+        PartialRender,
+        FullRender
+    }
+    
+    public readonly struct SpacePlan
+    {
+        public readonly SpacePlanType Type;
+        public readonly float Width;
+        public readonly float Height;
+
+        public SpacePlan(SpacePlanType type, float width, float height)
+        {
+            Type = type;
+            Width = width;
+            Height = height;
+        }
+
+        public static SpacePlan Wrap() => new SpacePlan(SpacePlanType.Wrap, 0, 0);
+        
+        public static SpacePlan PartialRender(float width, float height) => new SpacePlan(SpacePlanType.PartialRender, width, height);
+
+        public static SpacePlan PartialRender(Size size) => PartialRender(size.Width, size.Height);
+        
+        public static SpacePlan FullRender(float width, float height) => new SpacePlan(SpacePlanType.FullRender, width, height);
+
+        public static SpacePlan FullRender(Size size) => FullRender(size.Width, size.Height);
+        
+        public static implicit operator Size(SpacePlan spacePlan)
+        {
+            return new Size(spacePlan.Width, spacePlan.Height);
+        }
+    }
+}

+ 0 - 19
QuestPDF/Drawing/SpacePlan/FullRender.cs

@@ -1,19 +0,0 @@
-using QuestPDF.Infrastructure;
-
-namespace QuestPDF.Drawing.SpacePlan
-{
-    internal class FullRender : Size, ISpacePlan
-    {
-        public FullRender(Size size) : this(size.Width, size.Height)
-        {
-            
-        }
-        
-        public FullRender(float width, float height) : base(width, height)
-        {
-            
-        }
-        
-        public override string ToString() => $"FullRender {base.ToString()}";
-    }
-}

+ 0 - 7
QuestPDF/Drawing/SpacePlan/ISpacePlan.cs

@@ -1,7 +0,0 @@
-namespace QuestPDF.Drawing.SpacePlan
-{
-    internal interface ISpacePlan
-    {
-        
-    }
-}

+ 0 - 19
QuestPDF/Drawing/SpacePlan/PartialRender.cs

@@ -1,19 +0,0 @@
-using QuestPDF.Infrastructure;
-
-namespace QuestPDF.Drawing.SpacePlan
-{
-    internal class PartialRender : Size, ISpacePlan
-    {
-        public PartialRender(Size size) : this(size.Width, size.Height)
-        {
-            
-        }
-        
-        public PartialRender(float width, float height) : base(width, height)
-        {
-            
-        }
-        
-        public override string ToString() => $"PartialRender {base.ToString()}";
-    }
-}

+ 0 - 7
QuestPDF/Drawing/SpacePlan/Wrap.cs

@@ -1,7 +0,0 @@
-namespace QuestPDF.Drawing.SpacePlan
-{
-    internal class Wrap : ISpacePlan
-    {
-        public override string ToString() => "Wrap";
-    }
-}

+ 1 - 1
QuestPDF/Drawing/SpacePlan/TextMeasurement.cs → QuestPDF/Drawing/TextMeasurement.cs

@@ -1,4 +1,4 @@
-namespace QuestPDF.Drawing.SpacePlan
+namespace QuestPDF.Drawing
 {
 {
     internal struct TextMeasurement
     internal struct TextMeasurement
     {
     {

+ 4 - 3
QuestPDF/Elements/Alignment.cs

@@ -1,4 +1,5 @@
 using System;
 using System;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -13,16 +14,16 @@ namespace QuestPDF.Elements
             if (Child == null)
             if (Child == null)
                 return;
                 return;
             
             
-            var childSize = Child.Measure(availableSpace) as Size;
+            var childSize = base.Measure(availableSpace);
             
             
-            if (childSize == null)
+            if (childSize.Type == SpacePlanType.Wrap)
                 return;
                 return;
             
             
             var top = GetTopOffset(availableSpace, childSize);
             var top = GetTopOffset(availableSpace, childSize);
             var left = GetLeftOffset(availableSpace, childSize);
             var left = GetLeftOffset(availableSpace, childSize);
             
             
             Canvas.Translate(new Position(left, top));
             Canvas.Translate(new Position(left, top));
-            Child.Draw(childSize);
+            base.Draw(childSize);
             Canvas.Translate(new Position(-left, -top));
             Canvas.Translate(new Position(-left, -top));
         }
         }
         
         

+ 13 - 13
QuestPDF/Elements/AspectRatio.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -9,29 +9,29 @@ namespace QuestPDF.Elements
         public float Ratio { get; set; } = 1;
         public float Ratio { get; set; } = 1;
         public AspectRatioOption Option { get; set; } = AspectRatioOption.FitWidth;
         public AspectRatioOption Option { get; set; } = AspectRatioOption.FitWidth;
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if(Child == null)
             if(Child == null)
-                return new FullRender(Size.Zero);
+                return SpacePlan.FullRender(0, 0);
             
             
             var targetSize = GetTargetSize(availableSpace);
             var targetSize = GetTargetSize(availableSpace);
             
             
             if (targetSize.Height > availableSpace.Height + Size.Epsilon)
             if (targetSize.Height > availableSpace.Height + Size.Epsilon)
-                return new Wrap();
+                return SpacePlan.Wrap();
             
             
             if (targetSize.Width > availableSpace.Width + Size.Epsilon)
             if (targetSize.Width > availableSpace.Width + Size.Epsilon)
-                return new Wrap();
+                return SpacePlan.Wrap();
 
 
-            var childSize = Child.Measure(targetSize);
+            var childSize = base.Measure(targetSize);
 
 
-            if (childSize is Wrap)
-                return new Wrap();
+            if (childSize.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
 
 
-            if (childSize is PartialRender)
-                return new PartialRender(targetSize);
+            if (childSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSize);
 
 
-            if (childSize is FullRender)
-                return new FullRender(targetSize);
+            if (childSize.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(targetSize);
             
             
             throw new NotSupportedException();
             throw new NotSupportedException();
         }
         }
@@ -42,7 +42,7 @@ namespace QuestPDF.Elements
                 return;
                 return;
             
             
             var size = GetTargetSize(availableSpace);
             var size = GetTargetSize(availableSpace);
-            Child?.Draw(size);
+            base.Draw(size);
         }
         }
         
         
         private Size GetTargetSize(Size availableSpace)
         private Size GetTargetSize(Size availableSpace)

+ 1 - 1
QuestPDF/Elements/Background.cs

@@ -10,7 +10,7 @@ namespace QuestPDF.Elements
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
             Canvas.DrawRectangle(Position.Zero, availableSpace, Color);
             Canvas.DrawRectangle(Position.Zero, availableSpace, Color);
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
         }
         }
     }
     }
 }
 }

+ 1 - 1
QuestPDF/Elements/Border.cs

@@ -14,7 +14,7 @@ namespace QuestPDF.Elements
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
             
             
             Canvas.DrawRectangle(
             Canvas.DrawRectangle(
                 new Position(-Left/2, -Top/2), 
                 new Position(-Left/2, -Top/2), 

+ 5 - 4
QuestPDF/Elements/Box.cs

@@ -1,4 +1,5 @@
-using QuestPDF.Infrastructure;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
 {
 {
@@ -6,12 +7,12 @@ namespace QuestPDF.Elements
     {
     {
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            var targetSize = Child?.Measure(availableSpace) as Size;
+            var targetSize = base.Measure(availableSpace);
             
             
-            if (targetSize == null)
+            if (targetSize.Type == SpacePlanType.Wrap)
                 return;
                 return;
             
             
-            Child?.Draw(targetSize);
+            base.Draw(targetSize);
         }
         }
     }
     }
 }
 }

+ 3 - 3
QuestPDF/Elements/Canvas.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using SkiaSharp;
 using SkiaSharp;
 
 
@@ -10,9 +10,9 @@ namespace QuestPDF.Elements
     {
     {
         public DrawOnCanvas Handler { get; set; }
         public DrawOnCanvas Handler { get; set; }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            return new FullRender(availableSpace);
+            return SpacePlan.FullRender(availableSpace);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 24 - 28
QuestPDF/Elements/Constrained.cs

@@ -1,6 +1,6 @@
 using System;
 using System;
 using System.Linq;
 using System.Linq;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -9,37 +9,36 @@ namespace QuestPDF.Elements
     {
     {
         public float? MinWidth { get; set; }
         public float? MinWidth { get; set; }
         public float? MaxWidth { get; set; }
         public float? MaxWidth { get; set; }
-        
+
         public float? MinHeight { get; set; }
         public float? MinHeight { get; set; }
         public float? MaxHeight { get; set; }
         public float? MaxHeight { get; set; }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (MinWidth > availableSpace.Width + Size.Epsilon)
             if (MinWidth > availableSpace.Width + Size.Epsilon)
-                return new Wrap();
+                return SpacePlan.Wrap();
             
             
             if (MinHeight > availableSpace.Height + Size.Epsilon)
             if (MinHeight > availableSpace.Height + Size.Epsilon)
-                return new Wrap();
+                return SpacePlan.Wrap();
             
             
             var available = new Size(
             var available = new Size(
-                MathHelpers.Min(MaxWidth, availableSpace.Width),
-                MathHelpers.Min(MaxHeight, availableSpace.Height));
+                LimitMin(availableSpace.Width, MaxWidth),
+                LimitMin(availableSpace.Height, MaxHeight));
 
 
-            var measurement = Child?.Measure(available) ?? new FullRender(Size.Zero);
-            var size = measurement as Size;
+            var measurement = base.Measure(available);
 
 
-            if (measurement is Wrap)
-                return new Wrap();
+            if (measurement.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
             
             
             var actualSize = new Size(
             var actualSize = new Size(
-                MathHelpers.Max(MinWidth, size.Width),
-                MathHelpers.Max(MinHeight, size.Height));
+                LimitMax(measurement.Width, MinWidth),
+                LimitMax(measurement.Height, MinHeight));
             
             
-            if (size is FullRender)
-                return new FullRender(actualSize);
+            if (measurement.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(actualSize);
             
             
-            if (size is PartialRender)
-                return new PartialRender(actualSize);
+            if (measurement.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(actualSize);
             
             
             throw new NotSupportedException();
             throw new NotSupportedException();
         }
         }
@@ -47,23 +46,20 @@ namespace QuestPDF.Elements
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
             var available = new Size(
             var available = new Size(
-                MathHelpers.Min(MaxWidth, availableSpace.Width),
-                MathHelpers.Min(MaxHeight, availableSpace.Height));
+                LimitMin(availableSpace.Width, MaxWidth),
+                LimitMin(availableSpace.Height, MaxHeight));
             
             
-            Child?.Draw(available);
+            base.Draw(available);
         }
         }
-    }
-    
-    static class MathHelpers
-    {
-        public static float Min(params float?[] values)
+
+        private float LimitMin(float value, float? limit)
         {
         {
-            return values.Where(x => x.HasValue).Min().Value;
+            return limit.HasValue ? Math.Min(value, limit.Value) : value;
         }
         }
         
         
-        public static float Max(params float?[] values)
+        private float LimitMax(float value, float? limit)
         {
         {
-            return values.Where(x => x.HasValue).Max().Value;
+            return limit.HasValue ? Math.Max(value, limit.Value) : value;
         }
         }
     }
     }
 }
 }

+ 15 - 15
QuestPDF/Elements/Decoration.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
@@ -31,34 +31,34 @@ namespace QuestPDF.Elements
             ContentElement = create(ContentElement);
             ContentElement = create(ContentElement);
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            var decorationMeasure = DecorationElement?.Measure(availableSpace);
+            var decorationMeasure = DecorationElement.Measure(availableSpace);
             
             
-            if (decorationMeasure is Wrap || decorationMeasure is PartialRender)
-                return new Wrap();
+            if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
+                return SpacePlan.Wrap();
 
 
-            var decorationSize = decorationMeasure as Size ?? Size.Zero;
-            var contentMeasure = ContentElement?.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height)) ?? new FullRender(Size.Zero);
+            var decorationSize = decorationMeasure;
+            var contentMeasure = ContentElement.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height));
             
             
-            if (contentMeasure is Wrap)
-                return new Wrap();
+            if (contentMeasure.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
 
 
-            var contentSize = contentMeasure as Size ?? Size.Zero;
+            var contentSize = contentMeasure;
             var resultSize = new Size(availableSpace.Width, decorationSize.Height + contentSize.Height);
             var resultSize = new Size(availableSpace.Width, decorationSize.Height + contentSize.Height);
             
             
-            if (contentSize is PartialRender)
-                return new PartialRender(resultSize);
+            if (contentSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(resultSize);
             
             
-            if (contentSize is FullRender)
-                return new FullRender(resultSize);
+            if (contentSize.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(resultSize);
             
             
             throw new NotSupportedException();
             throw new NotSupportedException();
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            var decorationSize = DecorationElement?.Measure(availableSpace) as Size ?? Size.Zero;
+            var decorationSize = DecorationElement.Measure(availableSpace);
             var contentSize = new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height);
             var contentSize = new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height);
 
 
             var translateHeight = Type == DecorationType.Prepend ? decorationSize.Height : contentSize.Height;
             var translateHeight = Type == DecorationType.Prepend ? decorationSize.Height : contentSize.Height;

+ 3 - 3
QuestPDF/Elements/DynamicImage.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using SkiaSharp;
 using SkiaSharp;
 
 
@@ -9,9 +9,9 @@ namespace QuestPDF.Elements
     {
     {
         public Func<Size, byte[]>? Source { get; set; }
         public Func<Size, byte[]>? Source { get; set; }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            return new FullRender(availableSpace.Width, availableSpace.Height);
+            return SpacePlan.FullRender(availableSpace.Width, availableSpace.Height);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 3 - 3
QuestPDF/Elements/Empty.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -7,9 +7,9 @@ namespace QuestPDF.Elements
     {
     {
         internal static Empty Instance { get; } = new Empty();
         internal static Empty Instance { get; } = new Empty();
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            return new FullRender(Size.Zero);
+            return SpacePlan.FullRender(0, 0);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 4 - 4
QuestPDF/Elements/EnsureSpace.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -8,12 +8,12 @@ namespace QuestPDF.Elements
         public const float DefaultMinHeight = 150;
         public const float DefaultMinHeight = 150;
         public float MinHeight { get; set; } = DefaultMinHeight;
         public float MinHeight { get; set; } = DefaultMinHeight;
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             var measurement = base.Measure(availableSpace);
             var measurement = base.Measure(availableSpace);
 
 
-            if (measurement is PartialRender && availableSpace.Height < MinHeight)
-                return new Wrap();
+            if (measurement.Type == SpacePlanType.PartialRender && availableSpace.Height < MinHeight)
+                return SpacePlan.Wrap();
 
 
             return measurement;
             return measurement;
         }
         }

+ 9 - 9
QuestPDF/Elements/Extend.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -9,20 +9,20 @@ namespace QuestPDF.Elements
         public bool ExtendVertical { get; set; }
         public bool ExtendVertical { get; set; }
         public bool ExtendHorizontal { get; set; }
         public bool ExtendHorizontal { get; set; }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            var childSize = Child?.Measure(availableSpace) ?? new FullRender(Size.Zero);
+            var childSize = base.Measure(availableSpace);
 
 
-            if (childSize is Wrap)
+            if (childSize.Type == SpacePlanType.Wrap)
                 return childSize;
                 return childSize;
             
             
-            var targetSize = GetTargetSize(availableSpace, childSize as Size);
+            var targetSize = GetTargetSize(availableSpace, childSize);
             
             
-            if (childSize is PartialRender)
-                return new PartialRender(targetSize);
+            if (childSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSize);
             
             
-            if (childSize is FullRender)
-                return new FullRender(targetSize);
+            if (childSize.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(targetSize);
             
             
             throw new NotSupportedException();
             throw new NotSupportedException();
         }
         }

+ 5 - 4
QuestPDF/Elements/ExternalLink.cs

@@ -1,4 +1,5 @@
-using QuestPDF.Infrastructure;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
 {
 {
@@ -8,13 +9,13 @@ namespace QuestPDF.Elements
         
         
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            var targetSize = Child?.Measure(availableSpace) as Size;
+            var targetSize = base.Measure(availableSpace);
 
 
-            if (targetSize == null)
+            if (targetSize.Type == SpacePlanType.Wrap)
                 return;
                 return;
 
 
             Canvas.DrawExternalLink(Url, targetSize);
             Canvas.DrawExternalLink(Url, targetSize);
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
         }
         }
     }
     }
 }
 }

+ 3 - 3
QuestPDF/Elements/Image.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using SkiaSharp;
 using SkiaSharp;
 
 
@@ -13,9 +13,9 @@ namespace QuestPDF.Elements
             InternalImage?.Dispose();
             InternalImage?.Dispose();
         }
         }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            return new FullRender(availableSpace);
+            return SpacePlan.FullRender(availableSpace);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 5 - 4
QuestPDF/Elements/InternalLink.cs

@@ -1,4 +1,5 @@
-using QuestPDF.Infrastructure;
+using QuestPDF.Drawing;
+using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
 {
 {
@@ -8,13 +9,13 @@ namespace QuestPDF.Elements
         
         
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            var targetSize = Child?.Measure(availableSpace) as Size;
+            var targetSize = base.Measure(availableSpace);
 
 
-            if (targetSize == null)
+            if (targetSize.Type == SpacePlanType.Wrap)
                 return;
                 return;
 
 
             Canvas.DrawLocationLink(LocationName, targetSize);
             Canvas.DrawLocationLink(LocationName, targetSize);
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
         }
         }
     }
     }
 }
 }

+ 1 - 1
QuestPDF/Elements/InternalLocation.cs

@@ -22,7 +22,7 @@ namespace QuestPDF.Elements
                 IsRendered = true;
                 IsRendered = true;
             }
             }
             
             
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
         }
         }
     }
     }
 }
 }

+ 3 - 3
QuestPDF/Elements/Layers.cs

@@ -1,7 +1,7 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -21,7 +21,7 @@ namespace QuestPDF.Elements
             base.HandleVisitor(visit);
             base.HandleVisitor(visit);
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             return Children
             return Children
                 .Single(x => x.IsPrimary)
                 .Single(x => x.IsPrimary)
@@ -31,7 +31,7 @@ namespace QuestPDF.Elements
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
             Children
             Children
-                .Where(x => x.Measure(availableSpace) is Size)
+                .Where(x => x.Measure(availableSpace).Type != SpacePlanType.Wrap)
                 .ToList()
                 .ToList()
                 .ForEach(x => x.Draw(availableSpace));
                 .ForEach(x => x.Draw(availableSpace));
         }
         }

+ 12 - 12
QuestPDF/Elements/Padding.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -11,30 +11,30 @@ namespace QuestPDF.Elements
         public float Bottom { get; set; }
         public float Bottom { get; set; }
         public float Left { get; set; }
         public float Left { get; set; }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (Child == null)
             if (Child == null)
-                return new FullRender(Size.Zero);
+                return SpacePlan.FullRender(0, 0);
             
             
             var internalSpace = InternalSpace(availableSpace);
             var internalSpace = InternalSpace(availableSpace);
 
 
             if (internalSpace.Width < 0 || internalSpace.Height < 0)
             if (internalSpace.Width < 0 || internalSpace.Height < 0)
-                return new Wrap();
+                return SpacePlan.Wrap();
             
             
-            var measure = Child.Measure(internalSpace) as Size;
+            var measure = base.Measure(internalSpace);
 
 
-            if (measure == null)
-                return new Wrap();
+            if (measure.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
 
 
             var newSize = new Size(
             var newSize = new Size(
                 measure.Width + Left + Right,
                 measure.Width + Left + Right,
                 measure.Height + Top + Bottom);
                 measure.Height + Top + Bottom);
             
             
-            if (measure is PartialRender)
-                return new PartialRender(newSize);
+            if (measure.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(newSize);
             
             
-            if (measure is FullRender)
-                return new FullRender(newSize);
+            if (measure.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(newSize);
             
             
             throw new NotSupportedException();
             throw new NotSupportedException();
         }
         }
@@ -47,7 +47,7 @@ namespace QuestPDF.Elements
             var internalSpace = InternalSpace(availableSpace);
             var internalSpace = InternalSpace(availableSpace);
             
             
             Canvas.Translate(new Position(Left, Top));
             Canvas.Translate(new Position(Left, Top));
-            Child?.Draw(internalSpace);
+            base.Draw(internalSpace);
             Canvas.Translate(new Position(-Left, -Top));
             Canvas.Translate(new Position(-Left, -Top));
         }
         }
 
 

+ 4 - 5
QuestPDF/Elements/PageBreak.cs

@@ -1,5 +1,4 @@
-using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -13,12 +12,12 @@ namespace QuestPDF.Elements
             IsRendered = false;
             IsRendered = false;
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (IsRendered)
             if (IsRendered)
-                return new FullRender(Size.Zero);
+                return SpacePlan.FullRender(0, 0);
 
 
-            return new PartialRender(Size.Zero);
+            return SpacePlan.PartialRender(Size.Zero);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 2 - 2
QuestPDF/Elements/PageNumber.cs

@@ -1,6 +1,6 @@
 using System;
 using System;
 using System.Text.RegularExpressions;
 using System.Text.RegularExpressions;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using Size = QuestPDF.Infrastructure.Size;
 using Size = QuestPDF.Infrastructure.Size;
 
 
@@ -23,7 +23,7 @@ namespace QuestPDF.Elements
             base.HandleVisitor(visit);
             base.HandleVisitor(visit);
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             TextElement.Value = GetText();
             TextElement.Value = GetText();
             return TextElement.Measure(availableSpace);
             return TextElement.Measure(availableSpace);

+ 1 - 1
QuestPDF/Elements/Rotate.cs

@@ -16,7 +16,7 @@ namespace QuestPDF.Elements
             var currentMatrix = skiaCanvas.TotalMatrix;
             var currentMatrix = skiaCanvas.TotalMatrix;
             
             
             skiaCanvas.RotateDegrees(Angle);
             skiaCanvas.RotateDegrees(Angle);
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
             skiaCanvas.SetMatrix(currentMatrix);
             skiaCanvas.SetMatrix(currentMatrix);
         }
         }
     }
     }

+ 13 - 14
QuestPDF/Elements/Row.cs

@@ -1,8 +1,7 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
-using QuestPDF.Drawing.SpacePlan;
-using QuestPDF.Fluent;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -54,33 +53,33 @@ namespace QuestPDF.Elements
             Right = create(Right);
             Right = create(Right);
         }
         }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height)) as Size;
+            var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
             
             
-            if (leftMeasurement == null)
-                return new Wrap();
+            if (leftMeasurement.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
             
             
-            var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height)) as Size;
+            var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
 
 
-            if (rightMeasurement == null)
-                return new Wrap();
+            if (rightMeasurement.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
             
             
             var totalWidth = leftMeasurement.Width + rightMeasurement.Width;
             var totalWidth = leftMeasurement.Width + rightMeasurement.Width;
             var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height);
             var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height);
 
 
             var targetSize = new Size(totalWidth, totalHeight);
             var targetSize = new Size(totalWidth, totalHeight);
 
 
-            if (leftMeasurement is PartialRender || rightMeasurement is PartialRender)
-                return new PartialRender(targetSize);
+            if (leftMeasurement.Type == SpacePlanType.PartialRender || rightMeasurement.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSize);
             
             
-            return new FullRender(targetSize);
+            return SpacePlan.FullRender(targetSize);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
             var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
             var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
-            var leftWidth = (leftMeasurement as Size)?.Width ?? 0;
+            var leftWidth = leftMeasurement.Width;
             
             
             Left.Draw(new Size(leftWidth, availableSpace.Height));
             Left.Draw(new Size(leftWidth, availableSpace.Height));
             
             
@@ -106,7 +105,7 @@ namespace QuestPDF.Elements
             base.HandleVisitor(visit);
             base.HandleVisitor(visit);
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             UpdateElementsWidth(availableSpace.Width);
             UpdateElementsWidth(availableSpace.Width);
             return RootElement.Measure(availableSpace);
             return RootElement.Measure(availableSpace);

+ 10 - 10
QuestPDF/Elements/Scale.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -9,26 +9,26 @@ namespace QuestPDF.Elements
         public float ScaleX { get; set; } = 1;
         public float ScaleX { get; set; } = 1;
         public float ScaleY { get; set; } = 1;
         public float ScaleY { get; set; } = 1;
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             var targetSpace = new Size(
             var targetSpace = new Size(
                 Math.Abs(availableSpace.Width / ScaleX), 
                 Math.Abs(availableSpace.Width / ScaleX), 
                 Math.Abs(availableSpace.Height / ScaleY));
                 Math.Abs(availableSpace.Height / ScaleY));
             
             
-            var measure = base.Measure(targetSpace) as Size;
+            var measure = base.Measure(targetSpace);
 
 
-            if (measure == null)
-                return new Wrap();
+            if (measure.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
 
 
             var targetSize = new Size(
             var targetSize = new Size(
                 Math.Abs(measure.Width * ScaleX), 
                 Math.Abs(measure.Width * ScaleX), 
                 Math.Abs(measure.Height * ScaleY));
                 Math.Abs(measure.Height * ScaleY));
 
 
-            if (measure is PartialRender)
-                return new PartialRender(targetSize);
+            if (measure.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSize);
             
             
-            if (measure is FullRender)
-                return new FullRender(targetSize);
+            if (measure.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(targetSize);
             
             
             throw new ArgumentException();
             throw new ArgumentException();
         }
         }
@@ -53,7 +53,7 @@ namespace QuestPDF.Elements
                 skiaCanvas.Translate(0, availableSpace.Height);
                 skiaCanvas.Translate(0, availableSpace.Height);
             
             
             skiaCanvas.Scale(ScaleX, ScaleY);
             skiaCanvas.Scale(ScaleX, ScaleY);
-            Child?.Draw(targetSpace);
+            base.Draw(targetSpace);
             skiaCanvas.SetMatrix(currentMatrix);
             skiaCanvas.SetMatrix(currentMatrix);
         }
         }
     }
     }

+ 5 - 5
QuestPDF/Elements/ShowEntire.cs

@@ -1,18 +1,18 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
 {
 {
     internal class ShowEntire : ContainerElement
     internal class ShowEntire : ContainerElement
     {
     {
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            var childMeasurement = Child?.Measure(availableSpace) ?? new FullRender(Size.Zero);
+            var childMeasurement = base.Measure(availableSpace);
 
 
-            if (childMeasurement is FullRender)
+            if (childMeasurement.Type == SpacePlanType.FullRender)
                 return childMeasurement;
                 return childMeasurement;
 
 
-            return new Wrap();
+            return SpacePlan.Wrap();
         }
         }
     }
     }
 }
 }

+ 6 - 6
QuestPDF/Elements/ShowOnce.cs

@@ -1,4 +1,4 @@
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -12,12 +12,12 @@ namespace QuestPDF.Elements
             IsRendered = false;
             IsRendered = false;
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (Child == null || IsRendered)
             if (Child == null || IsRendered)
-                return new FullRender(Size.Zero);
+                return SpacePlan.FullRender(0, 0);
             
             
-            return Child.Measure(availableSpace);
+            return base.Measure(availableSpace);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
@@ -25,10 +25,10 @@ namespace QuestPDF.Elements
             if (Child == null || IsRendered)
             if (Child == null || IsRendered)
                 return;
                 return;
             
             
-            if (Child.Measure(availableSpace) is FullRender)
+            if (base.Measure(availableSpace).Type == SpacePlanType.FullRender)
                 IsRendered = true;
                 IsRendered = true;
             
             
-            Child.Draw(availableSpace);
+            base.Draw(availableSpace);
         }
         }
     }
     }
 }
 }

+ 10 - 11
QuestPDF/Elements/SimpleRotate.cs

@@ -1,6 +1,5 @@
 using System;
 using System;
-using System.Linq;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
@@ -10,24 +9,24 @@ namespace QuestPDF.Elements
         public int TurnCount { get; set; }
         public int TurnCount { get; set; }
         public int NormalizedTurnCount => (TurnCount % 4 + 4) % 4;
         public int NormalizedTurnCount => (TurnCount % 4 + 4) % 4;
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             if (NormalizedTurnCount == 0 || NormalizedTurnCount == 2)
             if (NormalizedTurnCount == 0 || NormalizedTurnCount == 2)
                 return base.Measure(availableSpace);
                 return base.Measure(availableSpace);
             
             
             availableSpace = new Size(availableSpace.Height, availableSpace.Width);
             availableSpace = new Size(availableSpace.Height, availableSpace.Width);
-            var childSpace = base.Measure(availableSpace) as Size;
+            var childSpace = base.Measure(availableSpace);
 
 
-            if (childSpace == null)
-                return new Wrap();
+            if (childSpace.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
 
 
             var targetSpace = new Size(childSpace.Height, childSpace.Width);
             var targetSpace = new Size(childSpace.Height, childSpace.Width);
 
 
-            if (childSpace is FullRender)
-                return new FullRender(targetSpace);
+            if (childSpace.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(targetSpace);
             
             
-            if (childSpace is PartialRender)
-                return new PartialRender(targetSpace);
+            if (childSpace.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSpace);
 
 
             throw new ArgumentException();
             throw new ArgumentException();
         }
         }
@@ -52,7 +51,7 @@ namespace QuestPDF.Elements
             if (NormalizedTurnCount == 1 || NormalizedTurnCount == 3)
             if (NormalizedTurnCount == 1 || NormalizedTurnCount == 3)
                 availableSpace = new Size(availableSpace.Height, availableSpace.Width);
                 availableSpace = new Size(availableSpace.Height, availableSpace.Width);
             
             
-            Child?.Draw(availableSpace);
+            base.Draw(availableSpace);
             skiaCanvas.SetMatrix(currentMatrix);
             skiaCanvas.SetMatrix(currentMatrix);
         }
         }
     }
     }

+ 21 - 22
QuestPDF/Elements/Stack.cs

@@ -1,8 +1,7 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using System.ComponentModel;
 using System.Linq;
 using System.Linq;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Fluent;
 using QuestPDF.Fluent;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using IComponent = QuestPDF.Infrastructure.IComponent;
 using IComponent = QuestPDF.Infrastructure.IComponent;
@@ -36,31 +35,31 @@ namespace QuestPDF.Elements
             Second = create(Second);
             Second = create(Second);
         }
         }
         
         
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             var firstElement = IsFirstRendered ? Empty.Instance : First;
             var firstElement = IsFirstRendered ? Empty.Instance : First;
-            var firstSize = firstElement.Measure(availableSpace) as Size;
+            var firstSize = firstElement.Measure(availableSpace);
 
 
-            if (firstSize == null)
-                return new Wrap();
+            if (firstSize.Type == SpacePlanType.Wrap)
+                return SpacePlan.Wrap();
             
             
-            if (firstSize is PartialRender partialRender)
-                return partialRender;
+            if (firstSize.Type == SpacePlanType.PartialRender)
+                return firstSize;
                 
                 
             var spaceForSecond = new Size(availableSpace.Width, availableSpace.Height - firstSize.Height);
             var spaceForSecond = new Size(availableSpace.Width, availableSpace.Height - firstSize.Height);
-            var secondSize = Second.Measure(spaceForSecond) as Size;
+            var secondSize = Second.Measure(spaceForSecond);
 
 
-            if (secondSize == null)
-                return new PartialRender(firstSize);
+            if (secondSize.Type == SpacePlanType.Wrap)
+                return SpacePlan.PartialRender(firstSize);
 
 
             var totalWidth = Math.Max(firstSize.Width, secondSize.Width);
             var totalWidth = Math.Max(firstSize.Width, secondSize.Width);
             var totalHeight = firstSize.Height + secondSize.Height;
             var totalHeight = firstSize.Height + secondSize.Height;
             var targetSize = new Size(totalWidth, totalHeight);
             var targetSize = new Size(totalWidth, totalHeight);
 
 
-            if (secondSize is PartialRender)
-                return new PartialRender(targetSize);
+            if (secondSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(targetSize);
                 
                 
-            return new FullRender(targetSize);
+            return SpacePlan.FullRender(targetSize);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
@@ -69,29 +68,29 @@ namespace QuestPDF.Elements
 
 
             var firstMeasurement = firstElement.Measure(availableSpace);
             var firstMeasurement = firstElement.Measure(availableSpace);
 
 
-            if (firstMeasurement is FullRender)
+            if (firstMeasurement.Type == SpacePlanType.FullRender)
                 IsFirstRendered = true;
                 IsFirstRendered = true;
 
 
-            var firstSize = firstMeasurement as Size;
+            var firstSize = firstMeasurement;
 
 
-            if (firstSize != null)
+            if (firstSize.Type != SpacePlanType.Wrap)
                 firstElement.Draw(new Size(availableSpace.Width, firstSize.Height));
                 firstElement.Draw(new Size(availableSpace.Width, firstSize.Height));
 
 
-            if (firstMeasurement is Wrap || firstMeasurement is PartialRender)
+            if (firstMeasurement.Type == SpacePlanType.Wrap || firstMeasurement.Type == SpacePlanType.PartialRender)
                 return;
                 return;
 
 
-            var firstHeight = firstSize?.Height ?? 0;
+            var firstHeight = firstSize.Height;
             var spaceForSecond = new Size(availableSpace.Width, availableSpace.Height - firstHeight);
             var spaceForSecond = new Size(availableSpace.Width, availableSpace.Height - firstHeight);
-            var secondMeasurement = Second?.Measure(spaceForSecond) as Size;
+            var secondMeasurement = Second.Measure(spaceForSecond);
 
 
-            if (secondMeasurement == null)
+            if (secondMeasurement.Type == SpacePlanType.Wrap)
                 return;
                 return;
 
 
             Canvas.Translate(new Position(0, firstHeight));
             Canvas.Translate(new Position(0, firstHeight));
             Second.Draw(new Size(availableSpace.Width, secondMeasurement.Height));
             Second.Draw(new Size(availableSpace.Width, secondMeasurement.Height));
             Canvas.Translate(new Position(0, -firstHeight));
             Canvas.Translate(new Position(0, -firstHeight));
             
             
-            if (secondMeasurement is FullRender)
+            if (secondMeasurement.Type == SpacePlanType.FullRender)
                 IsFirstRendered = false;
                 IsFirstRendered = false;
         }
         }
     }
     }

+ 3 - 4
QuestPDF/Elements/Text.cs

@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using QuestPDF.Drawing;
 using QuestPDF.Drawing;
-using QuestPDF.Drawing.SpacePlan;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 using Size = QuestPDF.Infrastructure.Size;
 using Size = QuestPDF.Infrastructure.Size;
 
 
@@ -15,7 +14,7 @@ namespace QuestPDF.Elements
 
 
         private float LineHeight => Style.Size * Style.LineHeight;
         private float LineHeight => Style.Size * Style.LineHeight;
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
             var lines = BreakLines(availableSpace.Width);
             var lines = BreakLines(availableSpace.Width);
             
             
@@ -27,9 +26,9 @@ namespace QuestPDF.Elements
             var realHeight = lines.Count * LineHeight;
             var realHeight = lines.Count * LineHeight;
             
             
             if (realHeight > availableSpace.Height + Size.Epsilon)
             if (realHeight > availableSpace.Height + Size.Epsilon)
-                return new Wrap();
+                return SpacePlan.Wrap();
             
             
-            return new FullRender(realWidth, realHeight);
+            return SpacePlan.FullRender(realWidth, realHeight);
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 10 - 11
QuestPDF/Elements/Unconstrained.cs

@@ -1,32 +1,31 @@
-using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Elements
 namespace QuestPDF.Elements
 {
 {
     internal class Unconstrained : ContainerElement
     internal class Unconstrained : ContainerElement
     {
     {
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            var childSize = Child?.Measure(Size.Max) ?? new FullRender(Size.Zero);
+            var childSize = base.Measure(Size.Max);
             
             
-            if (childSize is PartialRender)
-                return new PartialRender(Size.Zero);
+            if (childSize.Type == SpacePlanType.PartialRender)
+                return SpacePlan.PartialRender(0, 0);
             
             
-            if (childSize is FullRender)
-                return new FullRender(Size.Zero);
+            if (childSize.Type == SpacePlanType.FullRender)
+                return SpacePlan.FullRender(0, 0);
             
             
             return childSize;
             return childSize;
         }
         }
 
 
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)
         {
         {
-            var measurement = Child?.Measure(Size.Max) as Size;
+            var measurement = base.Measure(Size.Max);
             
             
-            if (measurement == null)
+            if (measurement.Type == SpacePlanType.Wrap)
                 return;
                 return;
 
 
-            Child?.Draw(measurement);
+            base.Draw(measurement);
         }
         }
     }
     }
 }
 }

+ 0 - 2
QuestPDF/Fluent/RowExtensions.cs

@@ -1,6 +1,4 @@
 using System;
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 

+ 0 - 2
QuestPDF/Fluent/StackExtensions.cs

@@ -1,6 +1,4 @@
 using System;
 using System;
-using System.Collections.Generic;
-using System.Linq;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 using QuestPDF.Infrastructure;
 using QuestPDF.Infrastructure;
 
 

+ 10 - 4
QuestPDF/Helpers/PageSizes.cs

@@ -3,15 +3,21 @@ using QuestPDF.Infrastructure;
 
 
 namespace QuestPDF.Helpers
 namespace QuestPDF.Helpers
 {
 {
-    public class PageSize : Size
+    public class PageSize
     {
     {
-        public PageSize(float width, float height) : base(width, height)
+        public readonly float Width;
+        public readonly float Height;
+        
+        public PageSize(float width, float height)
         {
         {
-
+            Width = width;
+            Height = height;
         }
         }
+
+        public static implicit operator Size(PageSize pageSize) => new Size(pageSize.Width, pageSize.Height);
     }
     }
 
 
-    public static class PageSizes
+    public struct PageSizes
     {
     {
         public const int PointsPerInch = 72;
         public const int PointsPerInch = 72;
 
 

+ 3 - 3
QuestPDF/Infrastructure/ContainerElement.cs

@@ -1,5 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
+using QuestPDF.Drawing;
 using QuestPDF.Elements;
 using QuestPDF.Elements;
 
 
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure
@@ -25,9 +25,9 @@ namespace QuestPDF.Infrastructure
             Child = create(Child);
             Child = create(Child);
         }
         }
 
 
-        internal override ISpacePlan Measure(Size availableSpace)
+        internal override SpacePlan Measure(Size availableSpace)
         {
         {
-            return Child?.Measure(availableSpace) ?? new FullRender(Size.Zero);
+            return Child?.Measure(availableSpace) ?? SpacePlan.FullRender(0, 0);
         }
         }
         
         
         internal override void Draw(Size availableSpace)
         internal override void Draw(Size availableSpace)

+ 2 - 3
QuestPDF/Infrastructure/Element.cs

@@ -1,6 +1,5 @@
 using System;
 using System;
-using QuestPDF.Drawing.SpacePlan;
-using QuestPDF.Elements;
+using QuestPDF.Drawing;
 
 
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure
 {
 {
@@ -25,7 +24,7 @@ namespace QuestPDF.Infrastructure
             
             
         }
         }
         
         
-        internal abstract ISpacePlan Measure(Size availableSpace);
+        internal abstract SpacePlan Measure(Size availableSpace);
         internal abstract void Draw(Size availableSpace);
         internal abstract void Draw(Size availableSpace);
     }
     }
 }
 }

+ 0 - 1
QuestPDF/Infrastructure/ICanvas.cs

@@ -1,4 +1,3 @@
-using System.Collections.Generic;
 using SkiaSharp;
 using SkiaSharp;
 
 
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure

+ 0 - 1
QuestPDF/Infrastructure/PageContext.cs

@@ -1,6 +1,5 @@
 using System;
 using System;
 using System.Collections.Generic;
 using System.Collections.Generic;
-using QuestPDF.Elements;
 
 
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure
 {
 {

+ 3 - 3
QuestPDF/Infrastructure/Position.cs

@@ -1,9 +1,9 @@
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure
 {
 {
-    internal class Position
+    internal readonly struct Position
     {
     {
-        public float X { get; set; }
-        public float Y { get; set; }
+        public readonly float X;
+        public readonly float Y;
 
 
         public static Position Zero => new Position(0, 0);
         public static Position Zero => new Position(0, 0);
         
         

+ 4 - 25
QuestPDF/Infrastructure/Size.cs

@@ -1,11 +1,11 @@
 namespace QuestPDF.Infrastructure
 namespace QuestPDF.Infrastructure
 {
 {
-    public class Size
+    public readonly struct Size
     {
     {
         public const float Epsilon = 0.001f;
         public const float Epsilon = 0.001f;
-        
-        public float Width { get; }
-        public float Height { get; }
+
+        public readonly float Width;
+        public readonly float Height;
         
         
         public static Size Zero => new Size(0, 0);
         public static Size Zero => new Size(0, 0);
         public static Size Max => new Size(14_400, 14_400);
         public static Size Max => new Size(14_400, 14_400);
@@ -17,26 +17,5 @@
         }
         }
         
         
         public override string ToString() => $"(W: {Width}, H: {Height})";
         public override string ToString() => $"(W: {Width}, H: {Height})";
-        
-        protected bool Equals(Size other)
-        {
-            return Width.Equals(other.Width) && Height.Equals(other.Height);
-        }
-
-        public override bool Equals(object? obj)
-        {
-            if (ReferenceEquals(null, obj)) return false;
-            if (ReferenceEquals(this, obj)) return true;
-            if (obj.GetType() != this.GetType()) return false;
-            return Equals((Size) obj);
-        }
-
-        public override int GetHashCode()
-        {
-            unchecked
-            {
-                return (Width.GetHashCode() * 397) ^ Height.GetHashCode();
-            }
-        }
     }
     }
 }
 }

+ 4 - 0
QuestPDF/QuestPDF.csproj

@@ -36,4 +36,8 @@
       </None>
       </None>
     </ItemGroup>
     </ItemGroup>
 
 
+    <ItemGroup>
+      <Folder Include="Drawing\SpacePlan" />
+    </ItemGroup>
+
 </Project>
 </Project>