Compare commits

...

12 Commits

Author SHA1 Message Date
Marcin Ziąbek fc33056434 API improvements 2021-10-22 01:38:08 +02:00
Marcin Ziąbek d3e8386418 Dynamic element prototype 2021-10-19 01:40:56 +02:00
Marcin Ziąbek 68f050a154 Adjusted tests for better benchmarking 2021-10-16 22:34:54 +02:00
Marcin Ziąbek 88e58500a8 Improved caching 2021-10-07 21:26:14 +02:00
Marcin Ziąbek 7980befb77 Synced with 2021.10 2021-10-01 02:32:35 +02:00
Marcin Ziąbek f3b75b43ac Merge branch 'main' of https://github.com/QuestPDF/library into element-proxy
 Conflicts:
	QuestPDF.ReportSample/QuestPDF.ReportSample.csproj
	QuestPDF.ReportSample/Tests.cs
	QuestPDF.UnitTests/ShowOnceTest.cs
	QuestPDF.UnitTests/StackTests.cs
	QuestPDF.UnitTests/TestEngine/Operations/ChildMeasureOperation.cs
	QuestPDF.UnitTests/TestEngine/SingleChildTests.cs
	QuestPDF.UnitTests/TestEngine/TestPlan.cs
	QuestPDF/Drawing/DocumentGenerator.cs
	QuestPDF/Drawing/TextRender.cs
	QuestPDF/Elements/PageBreak.cs
	QuestPDF/Elements/PageNumber.cs
	QuestPDF/Elements/Rotate.cs
	QuestPDF/Elements/Row.cs
	QuestPDF/Elements/Scale.cs
	QuestPDF/Elements/SimpleRotate.cs
	QuestPDF/Elements/Text.cs
	QuestPDF/Elements/Unconstrained.cs
	QuestPDF/Infrastructure/Element.cs
2021-10-01 02:20:21 +02:00
Marcin Ziąbek eca93b7e66 Added debug pointers to page 2021-09-07 11:17:49 +02:00
Marcin Ziąbek 6a3bfd855e Improved infinite layout debugging experience 2021-09-07 00:32:51 +02:00
Marcin Ziąbek 5e7f2a3adf Simple layout debugging when overflow 2021-09-06 21:43:31 +02:00
Marcin Ziąbek 2f1dd4b383 Improved tests with Benchmark.net 2021-09-06 21:43:12 +02:00
Marcin Ziąbek adec37007b Refactorization: space planning algorithm 2021-09-02 21:48:20 +02:00
Marcin Ziąbek 814d325376 Implemented measurement cache proxy 2021-09-02 13:30:39 +02:00
98 changed files with 1390 additions and 683 deletions
+33
View File
@@ -0,0 +1,33 @@
using NUnit.Framework;
using QuestPDF.Examples.Engine;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
namespace QuestPDF.Examples
{
public class DebuggingTesting
{
[Test]
public void Stack()
{
RenderingTest
.Create()
.PageSize(500, 360)
.FileName()
.Render(container =>
{
container
.Background(Colors.White)
.Padding(15)
.Grid(grid =>
{
grid.Spacing(15);
grid.Item().Background(Colors.Grey.Medium).Text(Placeholders.LoremIpsum());
grid.Item().DebugPointer("Test").Background(Colors.Grey.Lighten1).Height(1000); // <-- problem
grid.Item().Background(Colors.Grey.Lighten2).Height(150);
});
});
}
}
}
+170
View File
@@ -0,0 +1,170 @@
using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using QuestPDF.Elements;
using QuestPDF.Examples.Engine;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.Examples
{
public class OrderItem
{
public string ItemName { get; set; } = Placeholders.Label();
public int Price { get; set; } = Placeholders.Random.Next(1, 11) * 10;
public int Count { get; set; } = Placeholders.Random.Next(1, 11);
}
public class OrdersTable : IDynamicComponent
{
private ICollection<OrderItem> Items { get; }
private ICollection<OrderItem> ItemsLeft { get; set; }
public OrdersTable(ICollection<OrderItem> items)
{
Items = items;
}
public void Compose(DynamicContext context, IDynamicContainer container)
{
if (context.Operation == DynamicLayoutOperation.Reset)
{
ItemsLeft = new List<OrderItem>(Items);
return;
}
var header = ComposeHeader(context);
var sampleFooter = ComposeFooter(context, Enumerable.Empty<OrderItem>());
var decorationHeight = header.Size.Height + sampleFooter.Size.Height;
var rows = GetItemsForPage(context, decorationHeight).ToList();
var footer = ComposeFooter(context, rows.Select(x => x.Item));
if (ItemsLeft.Count > rows.Count)
container.HasMoreContent();
if (context.Operation == DynamicLayoutOperation.Draw)
ItemsLeft = ItemsLeft.Skip(rows.Count).ToList();
container.Box().Decoration(decoration =>
{
decoration.Header().Element(header);
decoration.Content().Box().Stack(stack =>
{
foreach (var row in rows)
stack.Item().Element(row.Element);
});
decoration.Footer().Element(footer);
});
}
private IDynamicElement ComposeHeader(DynamicContext context)
{
return context.CreateElement(element =>
{
element
.BorderBottom(1)
.BorderColor(Colors.Grey.Darken2)
.Padding(5)
.Row(row =>
{
var textStyle = TextStyle.Default.SemiBold();
row.ConstantColumn(30).Text("#", textStyle);
row.RelativeColumn().Text("Item name", textStyle);
row.ConstantColumn(50).AlignRight().Text("Count", textStyle);
row.ConstantColumn(50).AlignRight().Text("Price", textStyle);
row.ConstantColumn(50).AlignRight().Text("Total", textStyle);
});
});
}
private IDynamicElement ComposeFooter(DynamicContext context, IEnumerable<OrderItem> items)
{
var total = items.Sum(x => x.Count * x.Price);
return context.CreateElement(element =>
{
element
.Padding(5)
.AlignRight()
.Text($"Subtotal: {total}$", TextStyle.Default.Size(14).SemiBold());
});
}
private IEnumerable<(OrderItem Item, IDynamicElement Element)> GetItemsForPage(DynamicContext context, float decorationHeight)
{
var totalHeight = decorationHeight;
var counter = Items.Count - ItemsLeft.Count + 1;
foreach (var orderItem in ItemsLeft)
{
var element = context.CreateElement(content =>
{
content
.BorderBottom(1)
.BorderColor(Colors.Grey.Lighten2)
.Padding(5)
.Row(row =>
{
row.ConstantColumn(30).Text(counter++);
row.RelativeColumn().Text(orderItem.ItemName);
row.ConstantColumn(50).AlignRight().Text(orderItem.Count);
row.ConstantColumn(50).AlignRight().Text($"{orderItem.Price}$");
row.ConstantColumn(50).AlignRight().Text($"{orderItem.Count*orderItem.Price}$");
});
});
var elementHeight = element.Size.Height;
if (totalHeight + elementHeight > context.AvailableSize.Height)
break;
totalHeight += elementHeight;
yield return (orderItem, element);
}
}
}
public static class DynamicExamples
{
[Test]
public static void Dynamic()
{
RenderingTest
.Create()
.PageSize(PageSizes.A5)
.FileName()
.ShowResults()
.Render(container =>
{
var items = Enumerable.Range(0, 25).Select(x => new OrderItem()).ToList();
container
.Background(Colors.White)
.Padding(25)
.Decoration(decoration =>
{
decoration
.Header()
.PaddingBottom(5)
.Text(text =>
{
text.DefaultTextStyle(TextStyle.Default.SemiBold().Color(Colors.Blue.Darken2).Size(16));
text.Span("Page ");
text.CurrentPageNumber();
text.Span(" of ");
text.TotalPages();
});
decoration
.Content()
.Dynamic(new OrdersTable(items));
});
});
}
}
}
+1 -1
View File
@@ -154,7 +154,7 @@ namespace QuestPDF.Examples
{ {
container container
.Padding(25) .Padding(25)
.Debug("Grid example", Colors.Blue.Medium) .DebugArea("Grid example", Colors.Blue.Medium)
.Grid(grid => .Grid(grid =>
{ {
grid.Columns(3); grid.Columns(3);
+1 -1
View File
@@ -6,7 +6,7 @@ namespace QuestPDF.ReportSample
{ {
public static class Helpers public static class Helpers
{ {
public static Random Random { get; } = new Random(); public static Random Random { get; } = new Random(1);
public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path); public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path);
@@ -30,14 +30,14 @@ namespace QuestPDF.ReportSample.Layouts
container container
.Row(row => .Row(row =>
{ {
row.RelativeColumn(2).AspectRatio(4 / 3f).Image(Placeholders.Image); row.RelativeColumn(2).AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
row.RelativeColumn().PaddingLeft(5).Stack(stack => row.RelativeColumn().PaddingLeft(5).Stack(stack =>
{ {
stack.Spacing(7f); stack.Spacing(7f);
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image); stack.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image); stack.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
}); });
}); });
} }
@@ -59,7 +59,7 @@ namespace QuestPDF.ReportSample.Layouts
{ {
stack.Spacing(5); stack.Spacing(5);
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Image(Placeholders.Image); stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
stack.Item().Text(model.Location.Format(), Typography.Normal); stack.Item().Text(model.Location.Format(), Typography.Normal);
}); });
} }
@@ -72,12 +72,12 @@ namespace QuestPDF.ReportSample.Layouts
return; return;
} }
container.Debug("Photos").Grid(grid => container.DebugArea("Photos").Grid(grid =>
{ {
grid.Spacing(5); grid.Spacing(5);
grid.Columns(3); grid.Columns(3);
model.Photos.ForEach(x => grid.Item().AspectRatio(4 / 3f).Image(Placeholders.Image)); model.Photos.ForEach(x => grid.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3));
}); });
} }
} }
@@ -55,7 +55,7 @@ namespace QuestPDF.ReportSample.Layouts
row.Spacing(50); row.Spacing(50);
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title); row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData); row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Background(Colors.Grey.Lighten3);
}); });
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal(); stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
+70
View File
@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Running;
using Microsoft.VisualStudio.TestPlatform.TestHost;
using NUnit.Framework;
using QuestPDF.Drawing;
using QuestPDF.Drawing.Proxy;
using QuestPDF.Elements;
using QuestPDF.Infrastructure;
using QuestPDF.ReportSample.Layouts;
namespace QuestPDF.ReportSample
{
[SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 1, targetCount: 100)]
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
public class PerformanceTests
{
private PageContext PageContext { get; set; }
private DocumentMetadata Metadata { get; set; }
private Container Content { get; set; }
[Test]
public void Run()
{
var configuration = ManualConfig
.Create(DefaultConfig.Instance)
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
BenchmarkRunner.Run<PerformanceTests>(configuration);
}
[IterationSetup]
public void GenerateReportData()
{
var model = DataSource.GetReport();
var report = new StandardReport(model);
Metadata = report.GetMetadata();
var documentContainer = new DocumentContainer();
report.Compose(documentContainer);
Content = documentContainer.Compose();
PageContext = new PageContext();
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
var sw = new Stopwatch();
sw.Start();
Content.HandleVisitor(x =>
{
if (x is ICacheable)
x.CreateProxy(y => new CacheProxy(y));
});
sw.Stop();
Console.WriteLine($"Creating cache took: {sw.ElapsedMilliseconds}");
}
[Benchmark]
public void GenerationTest()
{
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
}
}
}
@@ -8,9 +8,10 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
<PackageReference Include="nunit" Version="3.13.2" /> <PackageReference Include="nunit" Version="3.13.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" /> <PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
<PackageReference Include="SkiaSharp" Version="2.80.3" /> <PackageReference Include="SkiaSharp" Version="2.80.3" />
</ItemGroup> </ItemGroup>
+20 -37
View File
@@ -3,62 +3,45 @@ 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.Infrastructure;
using QuestPDF.ReportSample.Layouts; using QuestPDF.ReportSample.Layouts;
namespace QuestPDF.ReportSample namespace QuestPDF.ReportSample
{ {
public class ReportGeneration public class ReportGeneration
{ {
private StandardReport Report { get; set; }
[SetUp]
public void SetUp()
{
var model = DataSource.GetReport();
Report = new StandardReport(model);
}
[Test] [Test]
public void GenerateAndShow() public void GenerateAndShow()
{ {
var reportModel = DataSource.GetReport();
var report = new StandardReport(reportModel);
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf"); var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
report.GeneratePdf(path); Report.GeneratePdf(path);
Process.Start("explorer.exe", path); Process.Start("explorer.exe", path);
} }
[Test] [Test]
public void PerformanceBenchmark() public void Profile()
{ {
// target document length should be around 100 pages var container = new DocumentContainer();
Report.Compose(container);
var content = container.Compose();
// test size var metadata = Report.GetMetadata();
const int testSize = 10; var pageContext = new PageContext();
const decimal performanceTarget = 1; // documents per second
// create report models DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
var reports = Enumerable DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
.Range(0, testSize)
.Select(x =>
{
var reportModel = DataSource.GetReport();
return new StandardReport(reportModel);
})
.ToList();
// generate documents
var sw = new Stopwatch();
sw.Start();
var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
sw.Stop();
// show summary
Console.WriteLine($"Total size: {totalSize:N0} bytes");
var performance = sw.ElapsedMilliseconds / (decimal)testSize;
var speed = 1000M / performance;
Console.WriteLine($"Test time: {sw.ElapsedMilliseconds} ms");
Console.WriteLine($"Time per document: {performance:N} ms");
Console.WriteLine($"Documents per second: {speed:N} d/s");
//if (speed < performanceTarget)
// throw new Exception("Rendering algorithm is too slow.");
} }
} }
} }
+5 -5
View File
@@ -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;
@@ -23,7 +23,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))
@@ -42,7 +42,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))
@@ -61,7 +61,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))
@@ -80,7 +80,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
View File
@@ -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;
@@ -20,8 +20,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
@@ -35,8 +35,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(100, 50))
.CheckMeasureResult(new PartialRender(400, 200)); .CheckMeasureResult(SpacePlan.PartialRender(400, 200));
} }
[Test] [Test]
@@ -50,8 +50,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()) .ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -65,8 +65,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
@@ -80,7 +80,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]
@@ -94,8 +94,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
@@ -109,7 +109,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]
@@ -123,8 +123,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
@@ -138,8 +138,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
+3 -3
View File
@@ -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))) .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
.CheckMeasureResult( new FullRender(new Size(100, 50))); .CheckMeasureResult( SpacePlan.FullRender(new Size(100, 50)));
} }
[Test] [Test]
+4 -4
View File
@@ -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,7 +21,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 Wrap()) .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.Wrap())
.CheckDrawResult(); .CheckDrawResult();
} }
@@ -34,7 +34,7 @@ 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 PartialRender(200, 100)) .ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.PartialRender(200, 100))
.ExpectChildDraw(new Size(200, 100)) .ExpectChildDraw(new Size(200, 100))
.CheckDrawResult(); .CheckDrawResult();
} }
@@ -48,7 +48,7 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(500, 400)) .MeasureElement(new Size(500, 400))
.ExpectChildMeasure(expectedInput: new Size(500, 400), returns: new FullRender(300, 200)) .ExpectChildMeasure(expectedInput: new Size(500, 400), returns: SpacePlan.FullRender(300, 200))
.ExpectChildDraw(new Size(300, 200)) .ExpectChildDraw(new Size(300, 200))
.CheckDrawResult(); .CheckDrawResult();
} }
+11 -11
View File
@@ -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,7 +18,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]
@@ -31,8 +31,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
.CheckMeasureResult(new FullRender(400, 100)); .CheckMeasureResult(SpacePlan.FullRender(400, 100));
} }
[Test] [Test]
@@ -45,8 +45,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
.CheckMeasureResult(new FullRender(400, 150)); .CheckMeasureResult(SpacePlan.FullRender(400, 150));
} }
[Test] [Test]
@@ -58,7 +58,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]
@@ -71,8 +71,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)) .ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
.CheckMeasureResult(new PartialRender(400, 75)); .CheckMeasureResult(SpacePlan.PartialRender(400, 75));
} }
[Test] [Test]
@@ -85,8 +85,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()) .ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
} }
} }
+23 -23
View File
@@ -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;
@@ -15,78 +15,78 @@ namespace QuestPDF.UnitTests
public void Measure_ReturnsWrap_WhenDecorationReturnsWrap() public void Measure_ReturnsWrap_WhenDecorationReturnsWrap()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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()) .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsWrap_WhenDecorationReturnsPartialRender() public void Measure_ReturnsWrap_WhenDecorationReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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)) .ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.PartialRender(300, 200))
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsWrap_WhenContentReturnsWrap() public void Measure_ReturnsWrap_WhenContentReturnsWrap()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
.ExpectChildMeasure("content", new Size(400, 200), new Wrap()) .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenContentReturnsPartialRender() public void Measure_ReturnsPartialRender_WhenContentReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
.ExpectChildMeasure("content", new Size(400, 200), new PartialRender(200, 150)) .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.PartialRender(200, 150))
.CheckMeasureResult(new PartialRender(400, 250)); .CheckMeasureResult(SpacePlan.PartialRender(400, 250));
} }
[Test] [Test]
public void Measure_ReturnsFullRender_WhenContentReturnsFullRender() public void Measure_ReturnsFullRender_WhenContentReturnsFullRender()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
.ExpectChildMeasure("content", new Size(400, 200), new FullRender(200, 150)) .ExpectChildMeasure("content", new Size(400, 200), SpacePlan.FullRender(200, 150))
.CheckMeasureResult(new FullRender(400, 250)); .CheckMeasureResult(SpacePlan.FullRender(400, 250));
} }
#endregion #endregion
@@ -97,14 +97,14 @@ namespace QuestPDF.UnitTests
public void Draw_Prepend() public void Draw_Prepend()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Prepend, Type = DecorationType.Prepend,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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))
@@ -116,14 +116,14 @@ namespace QuestPDF.UnitTests
public void Draw_Append() public void Draw_Append()
{ {
TestPlan TestPlan
.For(x => new SimpleDecoration .For(x => new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
DecorationElement = x.CreateChild("decoration"), DecorationElement = x.CreateChild("decoration"),
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
View File
@@ -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
View File
@@ -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()) .ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
.CheckMeasureResult(new 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)) .ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(300, 50))
.CheckMeasureResult(new Wrap()); .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)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 250))
.CheckMeasureResult(new 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)) .ExpectChildMeasure(new Size(400, 100), SpacePlan.FullRender(300, 50))
.CheckMeasureResult(new 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)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 250))
.CheckMeasureResult(new FullRender(300, 250)); .CheckMeasureResult(SpacePlan.FullRender(300, 250));
} }
[Test] [Test]
+11 -11
View File
@@ -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, 200)) .MeasureElement(new Size(400, 200))
.ExpectChildMeasure(new Size(400, 200), new Wrap()) .ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -33,8 +33,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(300, 100))
.CheckMeasureResult(new PartialRender(400, 200)); .CheckMeasureResult(SpacePlan.PartialRender(400, 200));
} }
[Test] [Test]
@@ -48,8 +48,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(300, 100))
.CheckMeasureResult(new FullRender(400, 200)); .CheckMeasureResult(SpacePlan.FullRender(400, 200));
} }
[Test] [Test]
@@ -63,8 +63,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
.CheckMeasureResult(new FullRender(400, 100)); .CheckMeasureResult(SpacePlan.FullRender(400, 100));
} }
[Test] [Test]
@@ -78,8 +78,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)) .ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
.CheckMeasureResult(new FullRender(100, 200)); .CheckMeasureResult(SpacePlan.FullRender(100, 200));
} }
[Test] [Test]
+3 -3
View File
@@ -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;
@@ -20,7 +20,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]
@@ -49,7 +49,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)
+16 -16
View File
@@ -1,6 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
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;
@@ -45,8 +45,8 @@ namespace QuestPDF.UnitTests
TestPlan TestPlan
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(MainLayer, new Size(800, 600), new Wrap()) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -55,8 +55,8 @@ namespace QuestPDF.UnitTests
TestPlan TestPlan
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(700, 500)) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(700, 500))
.CheckMeasureResult(new PartialRender(700, 500)); .CheckMeasureResult(SpacePlan.PartialRender(700, 500));
} }
[Test] [Test]
@@ -65,8 +65,8 @@ namespace QuestPDF.UnitTests
TestPlan TestPlan
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(MainLayer, new Size(800, 600), new FullRender(500, 400)) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.FullRender(500, 400))
.CheckMeasureResult(new FullRender(500, 400)); .CheckMeasureResult(SpacePlan.FullRender(500, 400));
} }
#endregion #endregion
@@ -80,9 +80,9 @@ namespace QuestPDF.UnitTests
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new FullRender(100, 200)) .ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.FullRender(100, 200))
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300)) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new FullRender(300, 400)) .ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.FullRender(300, 400))
.ExpectChildDraw(BackgroundLayer, new Size(800, 600)) .ExpectChildDraw(BackgroundLayer, new Size(800, 600))
@@ -99,9 +99,9 @@ namespace QuestPDF.UnitTests
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new PartialRender(100, 200)) .ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.PartialRender(100, 200))
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300)) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new Wrap()) .ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.Wrap())
.ExpectChildDraw(BackgroundLayer, new Size(800, 600)) .ExpectChildDraw(BackgroundLayer, new Size(800, 600))
.ExpectChildDraw(MainLayer, new Size(800, 600)) .ExpectChildDraw(MainLayer, new Size(800, 600))
@@ -116,9 +116,9 @@ namespace QuestPDF.UnitTests
.For(GetLayers) .For(GetLayers)
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new Wrap()) .ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.Wrap())
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300)) .ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new PartialRender(300, 400)) .ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.PartialRender(300, 400))
.ExpectChildDraw(MainLayer, new Size(800, 600)) .ExpectChildDraw(MainLayer, new Size(800, 600))
.ExpectChildDraw(ForegroundLayer, new Size(800, 600)) .ExpectChildDraw(ForegroundLayer, new Size(800, 600))
+9 -9
View File
@@ -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;
@@ -28,8 +28,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)) .ExpectChildMeasure(new Size(340, 260), SpacePlan.FullRender(140, 60))
.CheckMeasureResult(new FullRender(200, 100)); .CheckMeasureResult(SpacePlan.FullRender(200, 100));
} }
[Test] [Test]
@@ -38,7 +38,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]
@@ -47,7 +47,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]
@@ -56,8 +56,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)) .ExpectChildMeasure(new Size(340, 260), SpacePlan.PartialRender(40, 160))
.CheckMeasureResult(new PartialRender(100, 200)); .CheckMeasureResult(SpacePlan.PartialRender(100, 200));
} }
[Test] [Test]
@@ -66,8 +66,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()) .ExpectChildMeasure(new Size(340, 260), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
+3 -3
View File
@@ -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));
} }
} }
} }
-1
View File
@@ -1,5 +1,4 @@
using NUnit.Framework; using NUnit.Framework;
using QuestPDF.Drawing.SpacePlan;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using QuestPDF.UnitTests.TestEngine; using QuestPDF.UnitTests.TestEngine;
+30 -30
View File
@@ -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;
@@ -16,74 +16,74 @@ namespace QuestPDF.UnitTests
public void Measure_ReturnsWrap_WhenLeftChildReturnsWrap() public void Measure_ReturnsWrap_WhenLeftChildReturnsWrap()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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()) .ExpectChildMeasure("left", new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsWrap_WhenRightChildReturnsWrap() public void Measure_ReturnsWrap_WhenRightChildReturnsWrap()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
.ExpectChildMeasure("right", new Size(150, 300), new Wrap()) .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenLeftChildReturnsPartialRender() public void Measure_ReturnsPartialRender_WhenLeftChildReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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("left", new Size(400, 300), SpacePlan.PartialRender(250, 150))
.ExpectChildMeasure("right", new Size(150, 300), new FullRender(100, 100)) .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.FullRender(100, 100))
.CheckMeasureResult(new PartialRender(350, 150)); .CheckMeasureResult(SpacePlan.PartialRender(350, 150));
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenRightChildReturnsPartialRender() public void Measure_ReturnsPartialRender_WhenRightChildReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
.ExpectChildMeasure("right", new Size(150, 300), new PartialRender(100, 100)) .ExpectChildMeasure("right", new Size(150, 300), SpacePlan.PartialRender(100, 100))
.CheckMeasureResult(new PartialRender(350, 150)); .CheckMeasureResult(SpacePlan.PartialRender(350, 150));
} }
[Test] [Test]
public void Measure_ReturnsFullRender_WhenBothChildrenReturnFullRender() public void Measure_ReturnsFullRender_WhenBothChildrenReturnFullRender()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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("left", new Size(400, 300), SpacePlan.FullRender(200, 150))
.ExpectChildMeasure("right", new Size(200, 300), new FullRender(100, 100)) .ExpectChildMeasure("right", new Size(200, 300), SpacePlan.FullRender(100, 100))
.CheckMeasureResult(new FullRender(300, 150)); .CheckMeasureResult(SpacePlan.FullRender(300, 150));
} }
#endregion #endregion
@@ -94,13 +94,13 @@ namespace QuestPDF.UnitTests
public void Draw() public void Draw()
{ {
TestPlan TestPlan
.For(x => new SimpleRow .For(x => new BinaryRow
{ {
Left = x.CreateChild("left"), Left = x.CreateChild("left"),
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))
@@ -184,11 +184,11 @@ namespace QuestPDF.UnitTests
}); });
// assert // assert
var expected = new SimpleRow var expected = new BinaryRow
{ {
Left = new SimpleRow Left = new BinaryRow
{ {
Left = new SimpleRow Left = new BinaryRow
{ {
Left = new Constrained Left = new Constrained
{ {
@@ -202,7 +202,7 @@ namespace QuestPDF.UnitTests
MaxWidth = 25 MaxWidth = 25
} }
}, },
Right = new SimpleRow Right = new BinaryRow
{ {
Left = new Constrained Left = new Constrained
{ {
@@ -217,9 +217,9 @@ namespace QuestPDF.UnitTests
} }
} }
}, },
Right = new SimpleRow Right = new BinaryRow
{ {
Left = new SimpleRow Left = new BinaryRow
{ {
Left = new Constrained Left = new Constrained
{ {
@@ -233,7 +233,7 @@ namespace QuestPDF.UnitTests
MaxWidth = 25 MaxWidth = 25
} }
}, },
Right = new SimpleRow Right = new BinaryRow
{ {
Left = new Constrained Left = new Constrained
{ {
@@ -241,7 +241,7 @@ namespace QuestPDF.UnitTests
MaxWidth = 200, MaxWidth = 200,
Child = childD Child = childD
}, },
Right = new SimpleRow Right = new BinaryRow
{ {
Left = new Constrained Left = new Constrained
{ {
+11 -11
View File
@@ -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
ScaleY = 2 ScaleY = 2
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(new Size(300, 400), new Wrap()) .ExpectChildMeasure(new Size(300, 400), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -37,8 +37,8 @@ namespace QuestPDF.UnitTests
ScaleY = 2 ScaleY = 2
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(new Size(300, 400), new PartialRender(200, 350)) .ExpectChildMeasure(new Size(300, 400), SpacePlan.PartialRender(200, 350))
.CheckMeasureResult(new PartialRender(600, 700)); .CheckMeasureResult(SpacePlan.PartialRender(600, 700));
} }
[Test] [Test]
@@ -52,8 +52,8 @@ namespace QuestPDF.UnitTests
ScaleY = 2 ScaleY = 2
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(new Size(300, 400), new FullRender(250, 300)) .ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(250, 300))
.CheckMeasureResult(new FullRender(750, 600)); .CheckMeasureResult(SpacePlan.FullRender(750, 600));
} }
[Test] [Test]
@@ -67,8 +67,8 @@ namespace QuestPDF.UnitTests
ScaleY = 1 ScaleY = 1
}) })
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(new Size(400, 600), new FullRender(300, 500)) .ExpectChildMeasure(new Size(400, 600), SpacePlan.FullRender(300, 500))
.CheckMeasureResult(new FullRender(600, 500)); .CheckMeasureResult(SpacePlan.FullRender(600, 500));
} }
[Test] [Test]
@@ -82,8 +82,8 @@ namespace QuestPDF.UnitTests
ScaleY = -3 ScaleY = -3
}) })
.MeasureElement(new Size(800, 600)) .MeasureElement(new Size(800, 600))
.ExpectChildMeasure(new Size(800, 200), new FullRender(800, 100)) .ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(800, 100))
.CheckMeasureResult(new FullRender(800, 300)); .CheckMeasureResult(SpacePlan.FullRender(800, 300));
} }
#endregion #endregion
+7 -7
View File
@@ -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()) .ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new 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)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
.CheckMeasureResult(new Wrap()); .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)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 200))
.CheckMeasureResult(new FullRender(300, 200)); .CheckMeasureResult(SpacePlan.FullRender(300, 200));
} }
[Test] [Test]
+8 -8
View File
@@ -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;
@@ -20,31 +20,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))) .ExpectChildMeasure("child", new Size(300, 200), SpacePlan.PartialRender(new Size(200, 200)))
.CheckMeasureResult(new 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))) .ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(new Size(400, 200)))
.CheckMeasureResult(new 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))
+11 -11
View File
@@ -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
TurnCount = 0 TurnCount = 0
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new Wrap()) .ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -35,8 +35,8 @@ namespace QuestPDF.UnitTests
TurnCount = 0 TurnCount = 0
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 200)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
.CheckMeasureResult(new PartialRender(300, 200)); .CheckMeasureResult(SpacePlan.PartialRender(300, 200));
} }
[Test] [Test]
@@ -49,8 +49,8 @@ namespace QuestPDF.UnitTests
TurnCount = 1 TurnCount = 1
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(300, 400), new FullRender(200, 300)) .ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(200, 300))
.CheckMeasureResult(new FullRender(300, 200)); .CheckMeasureResult(SpacePlan.FullRender(300, 200));
} }
[Test] [Test]
@@ -63,8 +63,8 @@ namespace QuestPDF.UnitTests
TurnCount = 2 TurnCount = 2
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new FullRender(200, 100)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(200, 100))
.CheckMeasureResult(new FullRender(200, 100)); .CheckMeasureResult(SpacePlan.FullRender(200, 100));
} }
[Test] [Test]
@@ -77,8 +77,8 @@ namespace QuestPDF.UnitTests
TurnCount = 3 // or -1 TurnCount = 3 // or -1
}) })
.MeasureElement(new Size(500, 400)) .MeasureElement(new Size(500, 400))
.ExpectChildMeasure(new Size(400, 500), new FullRender(300, 350)) .ExpectChildMeasure(new Size(400, 500), SpacePlan.FullRender(300, 350))
.CheckMeasureResult(new FullRender(350, 300)); .CheckMeasureResult(SpacePlan.FullRender(350, 300));
} }
#endregion #endregion
+46 -47
View File
@@ -1,6 +1,5 @@
using FluentAssertions; using NUnit.Framework;
using NUnit.Framework; using QuestPDF.Drawing;
using QuestPDF.Drawing.SpacePlan;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Fluent; using QuestPDF.Fluent;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -17,80 +16,80 @@ namespace QuestPDF.UnitTests
public void Measure_ReturnsWrap_WhenFirstChildWraps() public void Measure_ReturnsWrap_WhenFirstChildWraps()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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()) .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender() public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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)) .ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(300, 200))
.CheckMeasureResult(new PartialRender(300, 200)); .CheckMeasureResult(SpacePlan.PartialRender(300, 200));
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenSecondChildWraps() public void Measure_ReturnsPartialRender_WhenSecondChildWraps()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
.ExpectChildMeasure("second", new Size(400, 200), new Wrap()) .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
.CheckMeasureResult(new PartialRender(200, 100)); .CheckMeasureResult(SpacePlan.PartialRender(200, 100));
} }
[Test] [Test]
public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender() public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
.ExpectChildMeasure("second", new Size(400, 200), new PartialRender(300, 150)) .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(300, 150))
.CheckMeasureResult(new PartialRender(300, 250)); .CheckMeasureResult(SpacePlan.PartialRender(300, 250));
} }
[Test] [Test]
public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender() public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
.ExpectChildMeasure("second", new Size(400, 200), new FullRender(100, 50)) .ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(100, 50))
.CheckMeasureResult(new FullRender(200, 150)); .CheckMeasureResult(SpacePlan.FullRender(200, 150));
} }
[Test] [Test]
public void Measure_UsesEmpty_WhenFirstChildIsRendered() public void Measure_UsesEmpty_WhenFirstChildIsRendered()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
Second = x.CreateChild("second"), Second = x.CreateChild("second"),
@@ -98,8 +97,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)) .ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
.CheckMeasureResult(new FullRender(200, 300)); .CheckMeasureResult(SpacePlan.FullRender(200, 300));
} }
#endregion #endregion
@@ -110,13 +109,13 @@ namespace QuestPDF.UnitTests
public void Draw_WhenFirstChildWraps() public void Draw_WhenFirstChildWraps()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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();
} }
@@ -124,13 +123,13 @@ namespace QuestPDF.UnitTests
public void Draw_WhenFirstChildPartiallyRenders() public void Draw_WhenFirstChildPartiallyRenders()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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();
} }
@@ -139,15 +138,15 @@ namespace QuestPDF.UnitTests
public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps() public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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();
} }
@@ -155,15 +154,15 @@ namespace QuestPDF.UnitTests
public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders() public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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)
@@ -174,15 +173,15 @@ namespace QuestPDF.UnitTests
public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders() public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
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)
@@ -193,7 +192,7 @@ namespace QuestPDF.UnitTests
public void Draw_UsesEmpty_WhenFirstChildIsRendered() public void Draw_UsesEmpty_WhenFirstChildIsRendered()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
Second = x.CreateChild("second"), Second = x.CreateChild("second"),
@@ -201,11 +200,11 @@ 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)
.CheckState<SimpleStack>(x => x.IsFirstRendered) .CheckState<BinaryStack>(x => x.IsFirstRendered)
.CheckDrawResult(); .CheckDrawResult();
} }
@@ -213,7 +212,7 @@ namespace QuestPDF.UnitTests
public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders() public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders()
{ {
TestPlan TestPlan
.For(x => new SimpleStack .For(x => new BinaryStack
{ {
First = x.CreateChild("first"), First = x.CreateChild("first"),
Second = x.CreateChild("second"), Second = x.CreateChild("second"),
@@ -221,12 +220,12 @@ 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)
.CheckDrawResult() .CheckDrawResult()
.CheckState<SimpleStack>(x => !x.IsFirstRendered); .CheckState<BinaryStack>(x => !x.IsFirstRendered);
} }
#endregion #endregion
@@ -264,9 +263,9 @@ namespace QuestPDF.UnitTests
{ {
Bottom = -spacing, Bottom = -spacing,
Child = new SimpleStack Child = new BinaryStack
{ {
First = new SimpleStack First = new BinaryStack
{ {
First = new Padding First = new Padding
{ {
@@ -279,14 +278,14 @@ namespace QuestPDF.UnitTests
Child = childB Child = childB
} }
}, },
Second = new SimpleStack Second = new BinaryStack
{ {
First = new Padding First = new Padding
{ {
Bottom = spacing, Bottom = spacing,
Child = childC Child = childC
}, },
Second = new SimpleStack Second = new BinaryStack
{ {
First = new Padding First = new Padding
{ {
+3 -3
View File
@@ -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);
} }
} }
@@ -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 ChildMeasureOperation(string childId, Size input, ISpacePlan output) public ChildMeasureOperation(string childId, Size input, SpacePlan output)
{ {
ChildId = childId; ChildId = childId;
Input = input; Input = input;
@@ -1,5 +1,4 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Elements;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.UnitTests.TestEngine namespace QuestPDF.UnitTests.TestEngine
@@ -23,8 +22,8 @@ namespace QuestPDF.UnitTests.TestEngine
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new Wrap()) .ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
private static void Measure_PartialRender<TElement>() where TElement : Element, IContainer, new() private static void Measure_PartialRender<TElement>() where TElement : Element, IContainer, new()
@@ -35,8 +34,8 @@ namespace QuestPDF.UnitTests.TestEngine
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new PartialRender(200, 100)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(200, 100))
.CheckMeasureResult(new PartialRender(200, 100)); .CheckMeasureResult(SpacePlan.PartialRender(200, 100));
} }
private static void Measure_FullRender<TElement>() where TElement : Element, IContainer, new() private static void Measure_FullRender<TElement>() where TElement : Element, IContainer, new()
@@ -47,8 +46,8 @@ namespace QuestPDF.UnitTests.TestEngine
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(400, 300)) .MeasureElement(new Size(400, 300))
.ExpectChildMeasure(new Size(400, 300), new FullRender(250, 150)) .ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(250, 150))
.CheckMeasureResult(new FullRender(250, 150)); .CheckMeasureResult(SpacePlan.FullRender(250, 150));
} }
#endregion #endregion
+10 -16
View File
@@ -4,7 +4,6 @@ using System.Text.Json;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using QuestPDF.Drawing; using QuestPDF.Drawing;
using QuestPDF.Drawing.SpacePlan;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Helpers; using QuestPDF.Helpers;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -157,12 +156,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 ChildMeasureOperation(child, expectedInput, returns)); return AddOperation(new ChildMeasureOperation(child, expectedInput, returns));
} }
@@ -212,7 +211,7 @@ namespace QuestPDF.UnitTests.TestEngine
return AddOperation(new CanvasDrawImageOperation(position, size)); return AddOperation(new CanvasDrawImageOperation(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));
@@ -220,14 +219,9 @@ namespace QuestPDF.UnitTests.TestEngine
Assert.AreEqual(expected.GetType(), actual.GetType()); Assert.AreEqual(expected.GetType(), actual.GetType());
var expectedSize = expected as Size; Assert.AreEqual(expected.Width, actual.Width, "Measure: width");
var actualSize = actual as Size; Assert.AreEqual(expected.Height, actual.Height, "Measure: height");
Assert.AreEqual(expected.Type, actual.Type, "Measure: height");
if (expectedSize != null)
{
Assert.AreEqual(expectedSize.Width, actualSize.Width, "Measure: width");
Assert.AreEqual(expectedSize.Height, actualSize.Height, "Measure: height");
}
return this; return this;
} }
@@ -278,10 +272,10 @@ namespace QuestPDF.UnitTests.TestEngine
var canvas = new FreeCanvas(); var canvas = new FreeCanvas();
value.HandleVisitor(x => x.Initialize(null, canvas)); value.HandleVisitor(x => x.Initialize(null, canvas));
var valueMeasure = value.Measure(availableSpace); var valueMeasure = value.Measure(availableSpace.Value);
expected.HandleVisitor(x => x.Initialize(null, canvas)); expected.HandleVisitor(x => x.Initialize(null, canvas));
var expectedMeasure = expected.Measure(availableSpace); var expectedMeasure = expected.Measure(availableSpace.Value);
valueMeasure.Should().BeEquivalentTo(expectedMeasure); valueMeasure.Should().BeEquivalentTo(expectedMeasure);
} }
@@ -292,11 +286,11 @@ namespace QuestPDF.UnitTests.TestEngine
var valueCanvas = new OperationRecordingCanvas(); var valueCanvas = new OperationRecordingCanvas();
value.HandleVisitor(x => x.Initialize(null, valueCanvas)); value.HandleVisitor(x => x.Initialize(null, valueCanvas));
value.Draw(availableSpace); value.Draw(availableSpace.Value);
var expectedCanvas = new OperationRecordingCanvas(); var expectedCanvas = new OperationRecordingCanvas();
expected.HandleVisitor(x => x.Initialize(null, expectedCanvas)); expected.HandleVisitor(x => x.Initialize(null, expectedCanvas));
expected.Draw(availableSpace); expected.Draw(availableSpace.Value);
valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations); valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations);
} }
-1
View File
@@ -1,5 +1,4 @@
using NUnit.Framework; using NUnit.Framework;
using QuestPDF.Drawing.SpacePlan;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using QuestPDF.UnitTests.TestEngine; using QuestPDF.UnitTests.TestEngine;
+10 -10
View File
@@ -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;
@@ -20,8 +20,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new Wrap()) .ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new PartialRender(1200, 1600)) .ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
.CheckMeasureResult(new PartialRender(Size.Zero)); .CheckMeasureResult(SpacePlan.PartialRender(Size.Zero));
} }
[Test] [Test]
@@ -46,8 +46,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(900, 800)) .MeasureElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new FullRender(1200, 1600)) .ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1200, 1600))
.CheckMeasureResult(new FullRender(Size.Zero)); .CheckMeasureResult(SpacePlan.FullRender(Size.Zero));
} }
#endregion #endregion
@@ -63,7 +63,7 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.DrawElement(new Size(900, 800)) .DrawElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new Wrap()) .ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
.CheckDrawResult(); .CheckDrawResult();
} }
@@ -76,7 +76,7 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.DrawElement(new Size(900, 800)) .DrawElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new PartialRender(1200, 1600)) .ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
.ExpectChildDraw(new Size(1200, 1600)) .ExpectChildDraw(new Size(1200, 1600))
.CheckDrawResult(); .CheckDrawResult();
} }
@@ -90,7 +90,7 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.DrawElement(new Size(900, 800)) .DrawElement(new Size(900, 800))
.ExpectChildMeasure(Size.Max, new FullRender(1600, 1000)) .ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1600, 1000))
.ExpectChildDraw(new Size(1600, 1000)) .ExpectChildDraw(new Size(1600, 1000))
.CheckDrawResult(); .CheckDrawResult();
} }
+1
View File
@@ -3,3 +3,4 @@
[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")]
+46 -9
View File
@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using QuestPDF.Drawing.Exceptions; using QuestPDF.Drawing.Exceptions;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing.Proxy;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -36,11 +36,22 @@ namespace QuestPDF.Drawing
var metadata = document.GetMetadata(); var metadata = document.GetMetadata();
var pageContext = new PageContext(); var pageContext = new PageContext();
RenderPass(pageContext, new FreeCanvas(), content, metadata); DebuggingState debuggingState = null;
RenderPass(pageContext, canvas, content, metadata);
if (System.Diagnostics.Debugger.IsAttached)
{
debuggingState = ApplyDebugging(content);
}
else
{
ApplyCaching(content);
}
RenderPass(pageContext, new FreeCanvas(), content, metadata, debuggingState);
RenderPass(pageContext, canvas, content, metadata, debuggingState);
} }
private static void RenderPass<TCanvas>(PageContext pageContext, TCanvas canvas, Container content, DocumentMetadata documentMetadata) internal static void RenderPass<TCanvas>(PageContext pageContext, TCanvas canvas, Container content, DocumentMetadata documentMetadata, DebuggingState? debuggingState)
where TCanvas : ICanvas, IRenderingCanvas where TCanvas : ICanvas, IRenderingCanvas
{ {
content.HandleVisitor(x => x?.Initialize(pageContext, canvas)); content.HandleVisitor(x => x?.Initialize(pageContext, canvas));
@@ -53,9 +64,11 @@ namespace QuestPDF.Drawing
while(true) while(true)
{ {
pageContext.SetPageNumber(currentPage); pageContext.SetPageNumber(currentPage);
var spacePlan = content.Measure(Size.Max) as Size; debuggingState?.Reset();
if (spacePlan == null) var spacePlan = content.Measure(Size.Max);
if (spacePlan.Type == SpacePlanType.Wrap)
{ {
canvas.EndDocument(); canvas.EndDocument();
ThrowLayoutException(); ThrowLayoutException();
@@ -77,10 +90,10 @@ namespace QuestPDF.Drawing
if (currentPage >= documentMetadata.DocumentLayoutExceptionThreshold) if (currentPage >= documentMetadata.DocumentLayoutExceptionThreshold)
{ {
canvas.EndDocument(); canvas.EndDocument();
throw new DocumentLayoutException("Composed layout generates infinite document."); ThrowLayoutException();
} }
if (spacePlan is FullRender) if (spacePlan.Type == SpacePlanType.FullRender)
break; break;
currentPage++; currentPage++;
@@ -90,8 +103,32 @@ namespace QuestPDF.Drawing
void ThrowLayoutException() void ThrowLayoutException()
{ {
throw new DocumentLayoutException("Composed layout generates infinite document."); throw new DocumentLayoutException("Composed layout generates infinite document.")
{
ElementTrace = debuggingState?.BuildTrace() ?? "Debug trace is available only in the DEBUG mode."
};
} }
} }
private static void ApplyCaching(Container content)
{
content.HandleVisitor(x =>
{
if (x is ICacheable)
x.CreateProxy(y => new CacheProxy(y));
});
}
private static DebuggingState ApplyDebugging(Container content)
{
var debuggingState = new DebuggingState();
content.HandleVisitor(x =>
{
x.CreateProxy(y => new DebuggingProxy(debuggingState, y));
});
return debuggingState;
}
} }
} }
@@ -4,6 +4,8 @@ namespace QuestPDF.Drawing.Exceptions
{ {
public class DocumentLayoutException : Exception public class DocumentLayoutException : Exception
{ {
public string ElementTrace { get; set; }
public DocumentLayoutException() public DocumentLayoutException()
{ {
-1
View File
@@ -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
View File
@@ -25,10 +25,10 @@ namespace QuestPDF.Drawing
public override void EndDocument() public override void EndDocument()
{ {
Canvas.Dispose(); Canvas?.Dispose();
Document.Close(); Document?.Close();
Document.Dispose(); Document?.Dispose();
} }
public override void BeginPage(Size size) public override void BeginPage(Size size)
+45
View File
@@ -0,0 +1,45 @@
using System;
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing.Proxy
{
internal class CacheProxy : ElementProxy
{
public Size? AvailableSpace { get; set; }
public SpacePlan? MeasurementResult { get; set; }
public CacheProxy(Element child)
{
Child = child;
}
internal override SpacePlan Measure(Size availableSpace)
{
if (MeasurementResult != null &&
AvailableSpace != null &&
IsClose(AvailableSpace.Value.Width, availableSpace.Width) &&
IsClose(AvailableSpace.Value.Height, availableSpace.Height))
{
return MeasurementResult.Value;
}
AvailableSpace = availableSpace;
MeasurementResult = base.Measure(availableSpace);
return MeasurementResult.Value;
}
internal override void Draw(Size availableSpace)
{
AvailableSpace = null;
MeasurementResult = null;
base.Draw(availableSpace);
}
private bool IsClose(float x, float y)
{
return Math.Abs(x - y) < Size.Epsilon;
}
}
}
+14
View File
@@ -0,0 +1,14 @@
using System.Collections.Generic;
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing.Proxy
{
public class DebugStackItem
{
public IElement Element { get; internal set; }
public Size AvailableSpace { get; internal set; }
public SpacePlan SpacePlan { get; internal set; }
public ICollection<DebugStackItem> Stack { get; internal set; } = new List<DebugStackItem>();
}
}
+24
View File
@@ -0,0 +1,24 @@
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing.Proxy
{
internal class DebuggingProxy : ElementProxy
{
private DebuggingState DebuggingState { get; }
public DebuggingProxy(DebuggingState debuggingState, Element child)
{
DebuggingState = debuggingState;
Child = child;
}
internal override SpacePlan Measure(Size availableSpace)
{
DebuggingState.RegisterMeasure(Child, availableSpace);
var spacePlan = base.Measure(availableSpace);
DebuggingState.RegisterMeasureResult(Child, spacePlan);
return spacePlan;
}
}
}
+130
View File
@@ -0,0 +1,130 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuestPDF.Elements;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing.Proxy
{
internal class DebuggingState
{
private DebugStackItem Root { get; set; }
private Stack<DebugStackItem> Stack { get; set; }
public DebuggingState()
{
Reset();
}
public void Reset()
{
Root = null;
Stack = new Stack<DebugStackItem>();
}
public void RegisterMeasure(IElement element, Size availableSpace)
{
if (element.GetType() == typeof(Container))
return;
var item = new DebugStackItem
{
Element = element,
AvailableSpace = availableSpace
};
Root ??= item;
if (Stack.Any())
Stack.Peek().Stack.Add(item);
Stack.Push(item);
}
public void RegisterMeasureResult(IElement element, SpacePlan spacePlan)
{
if (element.GetType() == typeof(Container))
return;
var item = Stack.Pop();
if (item.Element != element)
throw new Exception();
item.SpacePlan = spacePlan;
}
public string BuildTrace()
{
var builder = new StringBuilder();
var nestingLevel = 0;
Traverse(Root);
return builder.ToString();
void Traverse(DebugStackItem item)
{
var indent = new string(' ', nestingLevel * 4);
var title = item.Element.GetType().Name;
if (item.Element is DebugPointer debugPointer)
{
title = debugPointer.Target;
title += debugPointer.Highlight ? " 🌟" : string.Empty;
}
if (item.SpacePlan.Type == SpacePlanType.Wrap)
title = "🔥 " + title;
builder.AppendLine(indent + title);
builder.AppendLine(indent + new string('-', title.Length));
builder.AppendLine(indent + "Available space: " + item.AvailableSpace);
builder.AppendLine(indent + "Requested space: " + item.SpacePlan);
foreach (var configuration in GetElementConfiguration(item.Element))
builder.AppendLine(indent + configuration);
builder.AppendLine();
nestingLevel++;
item.Stack.ToList().ForEach(Traverse);
nestingLevel--;
}
static IEnumerable<string> GetElementConfiguration(IElement element)
{
if (element is DebugPointer)
return Enumerable.Empty<string>();
return element
.GetType()
.GetProperties()
.Select(x => new
{
Property = x.Name.PrettifyName(),
Value = x.GetValue(element)
})
.Where(x => !(x.Value is IElement))
.Where(x => !(x.Value is IEnumerable<IElement>))
.Where(x => !(x.Value is TextStyle))
.Select(x => $"{x.Property}: {FormatValue(x.Value)}");
string FormatValue(object value)
{
const int maxLength = 100;
var text = value?.ToString() ?? "-";
if (text.Length < maxLength)
return text;
return text.AsSpan(0, maxLength).ToString() + "...";
}
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing.Proxy
{
internal class ElementProxy : ContainerElement
{
}
}
+42
View File
@@ -0,0 +1,42 @@
using System.Collections.Generic;
using QuestPDF.Infrastructure;
namespace QuestPDF.Drawing
{
public readonly struct SpacePlan
{
public readonly SpacePlanType Type;
public readonly float Width;
public readonly float Height;
internal SpacePlan(SpacePlanType type, float width, float height)
{
Type = type;
Width = width;
Height = height;
}
internal static SpacePlan Wrap() => new SpacePlan(SpacePlanType.Wrap, 0, 0);
internal static SpacePlan PartialRender(float width, float height) => new SpacePlan(SpacePlanType.PartialRender, width, height);
internal static SpacePlan PartialRender(Size size) => PartialRender(size.Width, size.Height);
internal static SpacePlan FullRender(float width, float height) => new SpacePlan(SpacePlanType.FullRender, width, height);
internal static SpacePlan FullRender(Size size) => FullRender(size.Width, size.Height);
public override string ToString()
{
if (Type == SpacePlanType.Wrap)
return Type.ToString();
return $"{Type} | width {Width:N2} | height {Height:N2}";
}
public static implicit operator Size(SpacePlan spacePlan)
{
return new Size(spacePlan.Width, spacePlan.Height);
}
}
}
-19
View File
@@ -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()}";
}
}
-7
View File
@@ -1,7 +0,0 @@
namespace QuestPDF.Drawing.SpacePlan
{
internal interface ISpacePlan
{
}
}
@@ -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()}";
}
}
-13
View File
@@ -1,13 +0,0 @@
namespace QuestPDF.Drawing.SpacePlan
{
internal class TextRender : FullRender
{
public float Ascent { get; set; }
public float Descent { get; set; }
public TextRender(float width, float height) : base(width, height)
{
}
}
}
-7
View File
@@ -1,7 +0,0 @@
namespace QuestPDF.Drawing.SpacePlan
{
internal class Wrap : ISpacePlan
{
public override string ToString() => "Wrap";
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace QuestPDF.Drawing
{
public enum SpacePlanType
{
Wrap,
PartialRender,
FullRender
}
}
@@ -1,4 +1,4 @@
namespace QuestPDF.Drawing.SpacePlan namespace QuestPDF.Drawing
{ {
internal struct TextMeasurement internal struct TextMeasurement
{ {
+4 -3
View File
@@ -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));
} }
+14 -14
View File
@@ -1,37 +1,37 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class AspectRatio : ContainerElement internal class AspectRatio : ContainerElement, ICacheable
{ {
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) if (childSize.Type == SpacePlanType.Wrap)
return new Wrap(); return SpacePlan.Wrap();
if (childSize is PartialRender) if (childSize.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSize); return SpacePlan.PartialRender(targetSize);
if (childSize is FullRender) if (childSize.Type == SpacePlanType.FullRender)
return new FullRender(targetSize); 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
View File
@@ -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);
} }
} }
} }
+6 -1
View File
@@ -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),
@@ -36,5 +36,10 @@ namespace QuestPDF.Elements
new Size(Right, availableSpace.Height + Top/2 + Bottom/2), new Size(Right, availableSpace.Height + Top/2 + Bottom/2),
Color); Color);
} }
public override string ToString()
{
return $"Border: Top({Top}) Right({Right}) Bottom({Bottom}) Left({Left}) Color({Color})";
}
} }
} }
+5 -4
View File
@@ -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);
} }
} }
} }
+4 -4
View File
@@ -1,4 +1,4 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using SkiaSharp; using SkiaSharp;
@@ -6,13 +6,13 @@ namespace QuestPDF.Elements
{ {
public delegate void DrawOnCanvas(SKCanvas canvas, Size availableSpace); public delegate void DrawOnCanvas(SKCanvas canvas, Size availableSpace);
internal class Canvas : Element internal class Canvas : Element, ICacheable
{ {
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)
+26 -30
View File
@@ -1,11 +1,11 @@
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
{ {
internal class Constrained : ContainerElement internal class Constrained : ContainerElement, ICacheable
{ {
public float? MinWidth { get; set; } public float? MinWidth { get; set; }
public float? MaxWidth { get; set; } public float? MaxWidth { get; set; }
@@ -13,33 +13,32 @@ namespace QuestPDF.Elements
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), LimitMin(availableSpace.Width, MaxWidth),
MathHelpers.Min(MaxHeight, availableSpace.Height)); LimitMin(availableSpace.Height, MaxHeight));
var measurement = Child?.Measure(available) ?? new FullRender(Size.Zero); var measurement = base.Measure(available);
var size = measurement as Size;
if (measurement is Wrap) if (measurement.Type == SpacePlanType.Wrap)
return new Wrap(); return SpacePlan.Wrap();
var actualSize = new Size( var actualSize = new Size(
MathHelpers.Max(MinWidth, size.Width), LimitMax(measurement.Width, MinWidth),
MathHelpers.Max(MinHeight, size.Height)); LimitMax(measurement.Height, MinHeight));
if (size is FullRender) if (measurement.Type == SpacePlanType.FullRender)
return new FullRender(actualSize); return SpacePlan.FullRender(actualSize);
if (size is PartialRender) if (measurement.Type == SpacePlanType.PartialRender)
return new PartialRender(actualSize); 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), LimitMin(availableSpace.Width, MaxWidth),
MathHelpers.Min(MaxHeight, availableSpace.Height)); LimitMin(availableSpace.Height, MaxHeight));
Child?.Draw(available); base.Draw(available);
}
}
static class MathHelpers
{
public static float Min(params float?[] values)
{
return values.Where(x => x.HasValue).Min().Value;
} }
public static float Max(params float?[] values) private float LimitMin(float value, float? limit)
{ {
return values.Where(x => x.HasValue).Max().Value; return limit.HasValue ? Math.Min(value, limit.Value) : value;
}
private float LimitMax(float value, float? limit)
{
return limit.HasValue ? Math.Max(value, limit.Value) : value;
} }
} }
} }
@@ -5,7 +5,7 @@ using SkiaSharp;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class Debug : IComponent internal class DebugArea : IComponent
{ {
public IElement? Child { get; set; } public IElement? Child { get; set; }
@@ -30,7 +30,7 @@ namespace QuestPDF.Elements
.Box() .Box()
.Background(Colors.White) .Background(Colors.White)
.Padding(2) .Padding(2)
.Text(Text, TextStyle.Default.Color(Color).FontType("Consolas").Size(8)); .Text(Text, TextStyle.Default.Color(Color).FontType(Fonts.Consolas).Size(8));
}); });
} }
} }
+10
View File
@@ -0,0 +1,10 @@
using System.ComponentModel;
namespace QuestPDF.Elements
{
internal class DebugPointer : Container
{
public string Target { get; set; }
public bool Highlight { get; set; }
}
}
+24 -18
View File
@@ -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;
@@ -11,7 +11,7 @@ namespace QuestPDF.Elements
Append Append
} }
internal class SimpleDecoration : Element internal class BinaryDecoration : Element, ICacheable
{ {
public Element DecorationElement { get; set; } = Empty.Instance; public Element DecorationElement { get; set; } = Empty.Instance;
public Element ContentElement { get; set; } = Empty.Instance; public Element ContentElement { get; set; } = Empty.Instance;
@@ -25,34 +25,40 @@ namespace QuestPDF.Elements
base.HandleVisitor(visit); base.HandleVisitor(visit);
} }
internal override ISpacePlan Measure(Size availableSpace) internal override void CreateProxy(Func<Element, Element> create)
{ {
var decorationMeasure = DecorationElement?.Measure(availableSpace); DecorationElement = create(DecorationElement);
ContentElement = create(ContentElement);
}
if (decorationMeasure is Wrap || decorationMeasure is PartialRender) internal override SpacePlan Measure(Size availableSpace)
return new Wrap(); {
var decorationMeasure = DecorationElement.Measure(availableSpace);
var decorationSize = decorationMeasure as Size ?? Size.Zero; if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
var contentMeasure = ContentElement?.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height)) ?? new FullRender(Size.Zero); return SpacePlan.Wrap();
if (contentMeasure is Wrap) var decorationSize = decorationMeasure;
return new Wrap(); var contentMeasure = ContentElement.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height));
var contentSize = contentMeasure as Size ?? Size.Zero; if (contentMeasure.Type == SpacePlanType.Wrap)
return SpacePlan.Wrap();
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) if (contentSize.Type == SpacePlanType.PartialRender)
return new PartialRender(resultSize); return SpacePlan.PartialRender(resultSize);
if (contentSize is FullRender) if (contentSize.Type == SpacePlanType.FullRender)
return new FullRender(resultSize); 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;
@@ -77,11 +83,11 @@ namespace QuestPDF.Elements
public void Compose(IContainer container) public void Compose(IContainer container)
{ {
container.Element(new SimpleDecoration container.Element(new BinaryDecoration
{ {
Type = DecorationType.Prepend, Type = DecorationType.Prepend,
DecorationElement = Header, DecorationElement = Header,
ContentElement = new SimpleDecoration ContentElement = new BinaryDecoration
{ {
Type = DecorationType.Append, Type = DecorationType.Append,
ContentElement = Content, ContentElement = Content,
+120
View File
@@ -0,0 +1,120 @@
using System;
using QuestPDF.Drawing;
using QuestPDF.Drawing.Exceptions;
using QuestPDF.Infrastructure;
namespace QuestPDF.Elements
{
internal class DynamicHost : Element, IStateResettable
{
private IDynamicComponent Child { get; }
public DynamicHost(IDynamicComponent child)
{
Child = child;
}
public void ResetState()
{
GetContent(Size.Zero, DynamicLayoutOperation.Reset);
}
internal override SpacePlan Measure(Size availableSpace)
{
var content = GetContent(availableSpace, DynamicLayoutOperation.Measure);
var measurement = content.Measure(availableSpace);
if (measurement.Type != SpacePlanType.FullRender)
throw new DocumentLayoutException("Dynamic component generated content that does not fit on a single page.");
return content.HasMoreContent
? SpacePlan.PartialRender(measurement)
: SpacePlan.FullRender(measurement);
}
internal override void Draw(Size availableSpace)
{
GetContent(availableSpace, DynamicLayoutOperation.Draw).Draw(availableSpace);
}
DynamicContainer GetContent(Size availableSize, DynamicLayoutOperation operation)
{
var context = new DynamicContext
{
PageNumber = PageContext.GetLocationPage(Infrastructure.PageContext.CurrentPageSlot),
PageContext = PageContext,
Canvas = Canvas,
AvailableSize = availableSize,
Operation = operation
};
var container = new DynamicContainer();
Child.Compose(context, container);
container.HandleVisitor(x => x?.Initialize(PageContext, Canvas));
container.HandleVisitor(x => (x as IStateResettable)?.ResetState());
return container;
}
}
public enum DynamicLayoutOperation
{
Reset,
Measure,
Draw
}
public class DynamicContext
{
internal IPageContext PageContext { get; set; }
internal ICanvas Canvas { get; set; }
public int PageNumber { get; internal set; }
public Size AvailableSize { get; internal set; }
public DynamicLayoutOperation Operation { get; internal set; }
public IDynamicElement CreateElement(Action<IContainer> content)
{
var container = new DynamicElement();
content(container);
container.HandleVisitor(x => x?.Initialize(PageContext, Canvas));
container.HandleVisitor(x => (x as IStateResettable)?.ResetState());
container.Size = container.Measure(AvailableSize);
return container;
}
}
public interface IDynamicContainer : IContainer
{
}
internal class DynamicContainer : Container, IDynamicContainer
{
internal bool HasMoreContent { get; set; }
}
public static class DynamicContainerExtensions
{
public static IDynamicContainer HasMoreContent(this IDynamicContainer container)
{
(container as DynamicContainer).HasMoreContent = true;
return container;
}
}
public interface IDynamicElement : IElement
{
Size Size { get; }
}
internal class DynamicElement : ContainerElement, IDynamicElement
{
public Size Size { get; internal set; }
}
}
+3 -3
View File
@@ -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
View File
@@ -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)
+5 -5
View File
@@ -1,19 +1,19 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class EnsureSpace : ContainerElement internal class EnsureSpace : ContainerElement, ICacheable
{ {
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) if (measurement.Type == SpacePlanType.PartialRender && availableSpace.Height < MinHeight)
return new Wrap(); return SpacePlan.Wrap();
return measurement; return measurement;
} }
+10 -10
View File
@@ -1,28 +1,28 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class Extend : ContainerElement internal class Extend : ContainerElement, ICacheable
{ {
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) if (childSize.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSize); return SpacePlan.PartialRender(targetSize);
if (childSize is FullRender) if (childSize.Type == SpacePlanType.FullRender)
return new FullRender(targetSize); return SpacePlan.FullRender(targetSize);
throw new NotSupportedException(); throw new NotSupportedException();
} }
+5 -4
View File
@@ -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);
} }
} }
} }
+4 -4
View File
@@ -1,10 +1,10 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using SkiaSharp; using SkiaSharp;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class Image : Element internal class Image : Element, ICacheable
{ {
public SKImage? InternalImage { get; set; } public SKImage? InternalImage { get; set; }
@@ -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
View File
@@ -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
View File
@@ -22,7 +22,7 @@ namespace QuestPDF.Elements
IsRendered = true; IsRendered = true;
} }
Child?.Draw(availableSpace); base.Draw(availableSpace);
} }
} }
} }
+4 -4
View File
@@ -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
@@ -11,7 +11,7 @@ namespace QuestPDF.Elements
public bool IsPrimary { get; set; } public bool IsPrimary { get; set; }
} }
internal class Layers : Element internal class Layers : Element, ICacheable
{ {
public List<Layer> Children { get; set; } = new List<Layer>(); public List<Layer> Children { get; set; } = new List<Layer>();
@@ -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));
} }
+18 -13
View File
@@ -1,40 +1,40 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class Padding : ContainerElement internal class Padding : ContainerElement, ICacheable
{ {
public float Top { get; set; } public float Top { get; set; }
public float Right { get; set; } public float Right { get; set; }
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) if (measure.Type == SpacePlanType.Wrap)
return new 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) if (measure.Type == SpacePlanType.PartialRender)
return new PartialRender(newSize); return SpacePlan.PartialRender(newSize);
if (measure is FullRender) if (measure.Type == SpacePlanType.FullRender)
return new FullRender(newSize); 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));
} }
@@ -57,5 +57,10 @@ namespace QuestPDF.Elements
availableSpace.Width - Left - Right, availableSpace.Width - Left - Right,
availableSpace.Height - Top - Bottom); availableSpace.Height - Top - Bottom);
} }
public override string ToString()
{
return $"Padding: Top({Top}) Right({Right}) Bottom({Bottom}) Left({Left})";
}
} }
} }
+9 -2
View File
@@ -36,15 +36,22 @@ namespace QuestPDF.Elements
.Decoration(decoration => .Decoration(decoration =>
{ {
decoration.Header().Element(Header); decoration
.Header()
.DebugPointer("Page header")
.Element(Header);
decoration decoration
.Content() .Content()
.Element(x => IsClose(MinSize.Width, MaxSize.Width) ? x.ExtendHorizontal() : x) .Element(x => IsClose(MinSize.Width, MaxSize.Width) ? x.ExtendHorizontal() : x)
.Element(x => IsClose(MinSize.Height, MaxSize.Height) ? x.ExtendVertical() : x) .Element(x => IsClose(MinSize.Height, MaxSize.Height) ? x.ExtendVertical() : x)
.DebugPointer("Page content")
.Element(Content); .Element(Content);
decoration.Footer().Element(Footer); decoration
.Footer()
.DebugPointer("Page footer")
.Element(Footer);
}); });
bool IsClose(float x, float y) bool IsClose(float x, float y)
+4 -4
View File
@@ -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 (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)
+21 -15
View File
@@ -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
@@ -34,7 +34,7 @@ namespace QuestPDF.Elements
} }
} }
internal class SimpleRow : Element internal class BinaryRow : Element, ICacheable
{ {
internal Element Left { get; set; } internal Element Left { get; set; }
internal Element Right { get; set; } internal Element Right { get; set; }
@@ -47,33 +47,39 @@ namespace QuestPDF.Elements
base.HandleVisitor(visit); base.HandleVisitor(visit);
} }
internal override ISpacePlan Measure(Size availableSpace) internal override void CreateProxy(Func<Element?, Element?> create)
{ {
var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height)) as Size; Left = create(Left);
Right = create(Right);
}
if (leftMeasurement == null) internal override SpacePlan Measure(Size availableSpace)
return new Wrap(); {
var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height)) as Size; if (leftMeasurement.Type == SpacePlanType.Wrap)
return SpacePlan.Wrap();
if (rightMeasurement == null) var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
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) if (leftMeasurement.Type == SpacePlanType.PartialRender || rightMeasurement.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSize); 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));
@@ -99,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);
@@ -163,7 +169,7 @@ namespace QuestPDF.Elements
var half = elements.Length / 2; var half = elements.Length / 2;
return new SimpleRow return new BinaryRow
{ {
Left = BuildTree(elements.Slice(0, half)), Left = BuildTree(elements.Slice(0, half)),
Right = BuildTree(elements.Slice(half)) Right = BuildTree(elements.Slice(half))
+10 -10
View File
@@ -1,34 +1,34 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class Scale : ContainerElement internal class Scale : ContainerElement, ICacheable
{ {
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) if (measure.Type == SpacePlanType.Wrap)
return new 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) if (measure.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSize); return SpacePlan.PartialRender(targetSize);
if (measure is FullRender) if (measure.Type == SpacePlanType.FullRender)
return new FullRender(targetSize); return SpacePlan.FullRender(targetSize);
throw new ArgumentException(); throw new ArgumentException();
} }
+6 -6
View File
@@ -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, ICacheable
{ {
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();
} }
} }
} }
+7 -7
View File
@@ -1,9 +1,9 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class ShowOnce : ContainerElement, IStateResettable internal class ShowOnce : ContainerElement, IStateResettable, ICacheable
{ {
private bool IsRendered { get; set; } private bool IsRendered { get; set; }
@@ -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 -10
View File
@@ -1,32 +1,32 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class SimpleRotate : ContainerElement internal class SimpleRotate : ContainerElement, ICacheable
{ {
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) if (childSpace.Type == SpacePlanType.Wrap)
return new Wrap(); return SpacePlan.Wrap();
var targetSpace = new Size(childSpace.Height, childSpace.Width); var targetSpace = new Size(childSpace.Height, childSpace.Width);
if (childSpace is FullRender) if (childSpace.Type == SpacePlanType.FullRender)
return new FullRender(targetSpace); return SpacePlan.FullRender(targetSpace);
if (childSpace is PartialRender) if (childSpace.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSpace); return SpacePlan.PartialRender(targetSpace);
throw new ArgumentException(); throw new ArgumentException();
} }
+29 -23
View File
@@ -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.Fluent; using QuestPDF.Fluent;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
using IComponent = QuestPDF.Infrastructure.IComponent; using IComponent = QuestPDF.Infrastructure.IComponent;
@@ -9,7 +9,7 @@ using IContainer = QuestPDF.Infrastructure.IContainer;
namespace QuestPDF.Elements namespace QuestPDF.Elements
{ {
internal class SimpleStack : Element, IStateResettable internal class BinaryStack : Element, IStateResettable, ICacheable
{ {
internal Element First { get; set; } = Empty.Instance; internal Element First { get; set; } = Empty.Instance;
internal Element Second { get; set; } = Empty.Instance; internal Element Second { get; set; } = Empty.Instance;
@@ -29,31 +29,37 @@ namespace QuestPDF.Elements
IsFirstRendered = false; IsFirstRendered = false;
} }
internal override ISpacePlan Measure(Size availableSpace) internal override void CreateProxy(Func<Element?, Element?> create)
{
First = create(First);
Second = create(Second);
}
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) if (firstSize.Type == SpacePlanType.Wrap)
return new Wrap(); return SpacePlan.Wrap();
if (firstSize is PartialRender partialRender) if (firstSize.Type == SpacePlanType.PartialRender)
return 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) if (secondSize.Type == SpacePlanType.Wrap)
return new PartialRender(firstSize); 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) if (secondSize.Type == SpacePlanType.PartialRender)
return new PartialRender(targetSize); return SpacePlan.PartialRender(targetSize);
return new FullRender(targetSize); return SpacePlan.FullRender(targetSize);
} }
internal override void Draw(Size availableSpace) internal override void Draw(Size availableSpace)
@@ -62,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;
} }
} }
@@ -129,7 +135,7 @@ namespace QuestPDF.Elements
var half = elements.Length / 2; var half = elements.Length / 2;
return new SimpleStack return new BinaryStack
{ {
First = BuildTree(elements.Slice(0, half)), First = BuildTree(elements.Slice(0, half)),
Second = BuildTree(elements.Slice(half)) Second = BuildTree(elements.Slice(half))
@@ -1,4 +1,4 @@
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing;
using QuestPDF.Elements.Text.Calculation; using QuestPDF.Elements.Text.Calculation;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -15,16 +15,14 @@ namespace QuestPDF.Elements.Text.Items
var measurement = Element.Measure(new Size(request.AvailableWidth, Size.Max.Height)); var measurement = Element.Measure(new Size(request.AvailableWidth, Size.Max.Height));
if (measurement is Wrap || measurement is PartialRender) if (measurement.Type != SpacePlanType.FullRender)
return null; return null;
var elementSize = measurement as Size;
return new TextMeasurementResult return new TextMeasurementResult
{ {
Width = elementSize.Width, Width = measurement.Width,
Ascent = -elementSize.Height, Ascent = -measurement.Height,
Descent = 0, Descent = 0,
LineHeight = 1, LineHeight = 1,
+7 -7
View File
@@ -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.Elements.Text.Calculation; using QuestPDF.Elements.Text.Calculation;
using QuestPDF.Elements.Text.Items; using QuestPDF.Elements.Text.Items;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -22,21 +22,21 @@ namespace QuestPDF.Elements.Text
CurrentElementIndex = 0; CurrentElementIndex = 0;
} }
internal override ISpacePlan Measure(Size availableSpace) internal override SpacePlan Measure(Size availableSpace)
{ {
if (!RenderingQueue.Any()) if (!RenderingQueue.Any())
return new FullRender(Size.Zero); return SpacePlan.FullRender(Size.Zero);
var lines = DivideTextItemsIntoLines(availableSpace.Width, availableSpace.Height).ToList(); var lines = DivideTextItemsIntoLines(availableSpace.Width, availableSpace.Height).ToList();
if (!lines.Any()) if (!lines.Any())
return new PartialRender(Size.Zero); return SpacePlan.PartialRender(Size.Zero);
var width = lines.Max(x => x.Width); var width = lines.Max(x => x.Width);
var height = lines.Sum(x => x.LineHeight); var height = lines.Sum(x => x.LineHeight);
if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon) if (width > availableSpace.Width + Size.Epsilon || height > availableSpace.Height + Size.Epsilon)
return new Wrap(); return SpacePlan.Wrap();
var fullyRenderedItemsCount = lines var fullyRenderedItemsCount = lines
.SelectMany(x => x.Elements) .SelectMany(x => x.Elements)
@@ -44,9 +44,9 @@ namespace QuestPDF.Elements.Text
.Count(x => x.Any(y => y.Measurement.IsLast)); .Count(x => x.Any(y => y.Measurement.IsLast));
if (fullyRenderedItemsCount == RenderingQueue.Count) if (fullyRenderedItemsCount == RenderingQueue.Count)
return new FullRender(width, height); return SpacePlan.FullRender(width, height);
return new PartialRender(width, height); return SpacePlan.PartialRender(width, height);
} }
internal override void Draw(Size availableSpace) internal override void Draw(Size availableSpace)
+11 -11
View File
@@ -1,31 +1,31 @@
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, ICacheable
{ {
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) if (childSize.Type == SpacePlanType.PartialRender)
return new PartialRender(Size.Zero); return SpacePlan.PartialRender(0, 0);
if (childSize is FullRender) if (childSize.Type == SpacePlanType.FullRender)
return new FullRender(Size.Zero); 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);
} }
} }
} }
+4 -1
View File
@@ -22,7 +22,7 @@ namespace QuestPDF.Fluent
var existingValue = Component.GetPropertyValue(selector); var existingValue = Component.GetPropertyValue(selector);
if (existingValue != null) if (existingValue != null)
throw new DocumentComposeException($"The slot {selector.GetPropertyName()} of the component {(typeof( T).Name)} was already used."); throw new DocumentComposeException($"The slot {selector.GetPropertyName()} of the component {(typeof(T).Name)} was already used.");
var slot = new Slot(); var slot = new Slot();
Component.SetPropertyValue(selector, slot); Component.SetPropertyValue(selector, slot);
@@ -56,6 +56,9 @@ namespace QuestPDF.Fluent
var descriptor = new ComponentDescriptor<T>(component); var descriptor = new ComponentDescriptor<T>(component);
handler?.Invoke(descriptor); handler?.Invoke(descriptor);
if (System.Diagnostics.Debugger.IsAttached)
element = element.DebugPointer(component.GetType().Name, highlight: false);
component.Compose(element.Container()); component.Compose(element.Container());
} }
+24 -6
View File
@@ -6,11 +6,11 @@ namespace QuestPDF.Fluent
{ {
public static class DebugExtensions public static class DebugExtensions
{ {
public static IContainer Debug(this IContainer parent, string text, string color) public static IContainer DebugArea(this IContainer parent, string text, string color)
{ {
var container = new Container(); var container = new Container();
parent.Component(new Debug parent.Component(new DebugArea
{ {
Child = container, Child = container,
Text = text, Text = text,
@@ -20,14 +20,32 @@ namespace QuestPDF.Fluent
return container; return container;
} }
public static IContainer Debug(this IContainer parent, string text) public static IContainer DebugArea(this IContainer parent, string text)
{ {
return parent.Debug(text, Colors.Red.Medium); return parent.DebugArea(text, Colors.Red.Medium);
} }
public static IContainer Debug(this IContainer parent) public static IContainer DebugArea(this IContainer parent)
{ {
return parent.Debug(string.Empty, Colors.Red.Medium); return parent.DebugArea(string.Empty, Colors.Red.Medium);
}
/// <summary>
/// Creates a virtual element that is visible on the elements trace when the layout overflow exception is thrown.
/// This can be used to easily identify elements inside the elements trace tree and faster find issue root cause.
/// </summary>
public static IContainer DebugPointer(this IContainer parent, string elementTraceText)
{
return parent.DebugPointer(elementTraceText, true);
}
internal static IContainer DebugPointer(this IContainer parent, string elementTraceText, bool highlight)
{
return parent.Element(new DebugPointer
{
Target = elementTraceText,
Highlight = highlight
});
} }
} }
} }
+10
View File
@@ -41,6 +41,16 @@ namespace QuestPDF.Fluent
return handler(parent.Container()).Container(); return handler(parent.Container()).Container();
} }
public static void Dynamic<TDynamic>(this IContainer element) where TDynamic : IDynamicComponent, new()
{
element.Dynamic(new TDynamic());
}
public static void Dynamic(this IContainer element, IDynamicComponent dynamicElement)
{
element.Element(new DynamicHost(dynamicElement));
}
public static IContainer AspectRatio(this IContainer element, float ratio, AspectRatioOption option = AspectRatioOption.FitWidth) public static IContainer AspectRatio(this IContainer element, float ratio, AspectRatioOption option = AspectRatioOption.FitWidth)
{ {
return element.Element(new AspectRatio return element.Element(new AspectRatio
+6
View File
@@ -2,6 +2,7 @@
using System.IO; using System.IO;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using System.Text.RegularExpressions;
namespace QuestPDF.Helpers namespace QuestPDF.Helpers
{ {
@@ -35,5 +36,10 @@ namespace QuestPDF.Helpers
var property = selector.ToPropertyInfo() ?? throw new Exception("Expected property with getter and setter."); var property = selector.ToPropertyInfo() ?? throw new Exception("Expected property with getter and setter.");
property?.SetValue(target, value); property?.SetValue(target, value);
} }
internal static string PrettifyName(this string text)
{
return Regex.Replace(text, @"([a-z])([A-Z])", "$1 $2");
}
} }
} }
+10 -4
View File
@@ -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;
+1 -1
View File
@@ -7,7 +7,7 @@ namespace QuestPDF.Helpers
{ {
public static class Placeholders public static class Placeholders
{ {
private static Random Random = new Random(); public static readonly Random Random = new Random();
#region Word Cache #region Word Cache
+9 -4
View File
@@ -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
@@ -16,13 +16,18 @@ namespace QuestPDF.Infrastructure
internal override void HandleVisitor(Action<Element?> visit) internal override void HandleVisitor(Action<Element?> visit)
{ {
base.HandleVisitor(visit);
Child?.HandleVisitor(visit); Child?.HandleVisitor(visit);
base.HandleVisitor(visit);
} }
internal override ISpacePlan Measure(Size availableSpace) internal override void CreateProxy(Func<Element?, Element?> create)
{ {
return Child?.Measure(availableSpace) ?? new FullRender(Size.Zero); Child = create(Child);
}
internal override SpacePlan Measure(Size availableSpace)
{
return Child?.Measure(availableSpace) ?? SpacePlan.FullRender(0, 0);
} }
internal override void Draw(Size availableSpace) internal override void Draw(Size availableSpace)
+9 -2
View File
@@ -1,5 +1,7 @@
using System; using System;
using QuestPDF.Drawing.SpacePlan; using System.Collections;
using System.Collections.Generic;
using QuestPDF.Drawing;
namespace QuestPDF.Infrastructure namespace QuestPDF.Infrastructure
{ {
@@ -19,7 +21,12 @@ namespace QuestPDF.Infrastructure
Canvas = canvas; Canvas = canvas;
} }
internal abstract ISpacePlan Measure(Size availableSpace); internal virtual void CreateProxy(Func<Element?, Element?> create)
{
}
internal abstract SpacePlan Measure(Size availableSpace);
internal abstract void Draw(Size availableSpace); internal abstract void Draw(Size availableSpace);
} }
} }
+7
View File
@@ -0,0 +1,7 @@
namespace QuestPDF.Infrastructure
{
public interface ICacheable
{
}
}
@@ -0,0 +1,9 @@
using QuestPDF.Elements;
namespace QuestPDF.Infrastructure
{
public interface IDynamicComponent
{
void Compose(DynamicContext context, IDynamicContainer container);
}
}
+3 -3
View File
@@ -1,9 +1,9 @@
namespace QuestPDF.Infrastructure namespace QuestPDF.Infrastructure
{ {
internal class Position internal readonly struct Position
{ {
public float X { get; set; } public readonly float X;
public float Y { get; set; } public readonly float Y;
public static Position Zero => new Position(0, 0); public static Position Zero => new Position(0, 0);
+4 -25
View File
@@ -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 readonly float Width;
public float Height { get; } 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);
@@ -16,27 +16,6 @@
Height = height; Height = height;
} }
public override string ToString() => $"(W: {Width}, H: {Height})"; public override string ToString() => $"{Width:N2} {Height:N2}";
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();
}
}
} }
} }