Compare commits

...

29 Commits

Author SHA1 Message Date
Marcin Ziąbek 77b8f04659 Synced to 2021.12-alpha0 2021-11-19 00:50:38 +01:00
Marcin Ziąbek 5235ada66f Merge branch 'main' into element-proxy
# Conflicts:
#	QuestPDF/Drawing/PdfCanvas.cs
#	QuestPDF/QuestPDF.csproj
2021-11-19 00:46:46 +01:00
Marcin Ziąbek 4ce66878f2 2021.12.0-alpha0 2021-11-19 00:24:32 +01:00
Marcin Ziąbek 79cc5f1507 Added support for XPS rendering 2021-11-19 00:22:45 +01:00
Marcin Ziąbek 7c7d461c4b Merge pull request #53 from donmurta/main
Add simple chart example
2021-11-14 23:09:27 +01:00
Marcin Ziąbek 63af713935 2021.11.4 - Fixed measuring the Inlined element 2021-11-14 23:03:22 +01:00
Don Murta 2419a25cbd Add simple chart example 2021-11-09 10:26:46 -07:00
Marcin Ziąbek 014ec15908 2021.11.3 2021-11-07 16:46:34 +01:00
Marcin Ziąbek 82e29d5fdd ImagePlaceholder.Solid = true; 2021-11-07 16:19:54 +01:00
Marcin Ziąbek c64754241d Updated base to 2021.11 2021-11-04 01:02:44 +01:00
Marcin Ziąbek 9de87061e4 Merge branch 'main' into element-proxy
# Conflicts:
#	QuestPDF.ReportSample/Layouts/PhotoTemplate.cs
#	QuestPDF.ReportSample/Layouts/SectionTemplate.cs
#	QuestPDF.ReportSample/Tests.cs
#	QuestPDF/Drawing/DocumentGenerator.cs
#	QuestPDF/Elements/Constrained.cs
#	QuestPDF/Infrastructure/Position.cs
#	QuestPDF/Infrastructure/Size.cs
2021-11-04 00:22:22 +01:00
Marcin Ziąbek 86cfd22316 2021.11.0-beta3 2021-11-03 21:39:20 +01:00
Marcin Ziąbek 520bfc840c Improved code benchmarking (removed an unnecessary cost of image placeholder generation) 2021-11-03 21:22:08 +01:00
Marcin Ziąbek 22cdad69b7 Text element improvement: null string behaves like an empty text, not throws an exception 2021-11-03 21:21:23 +01:00
Marcin Ziąbek d260fa7587 Added generating symbols 2021-10-29 01:30:28 +02:00
Marcin Ziąbek 011668fb4c Image: added support for common overloads 2021-10-29 01:24:56 +02:00
Marcin Ziąbek 5a886452cf Merge pull request #40 from QuestPDF/2021.11
2021.11
2021-10-23 03:07:56 +02:00
Marcin Ziąbek 0a6673dd4f Update QuestPDF.csproj 2021-10-21 15:46:31 +02:00
Marcin Ziąbek 525bf534e5 Update DocumentGenerator.cs 2021-10-19 00:37:07 +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
114 changed files with 1710 additions and 811 deletions
+62
View File
@@ -0,0 +1,62 @@
using NUnit.Framework;
using QuestPDF.Examples.Engine;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using Microcharts;
using SkiaSharp;
namespace QuestPDF.Examples
{
public class ChartExample
{
[Test]
public void MicrochartChart()
{
var entries = new[]
{
new ChartEntry(212)
{
Label = "UWP",
ValueLabel = "112",
Color = SKColor.Parse("#2c3e50")
},
new ChartEntry(248)
{
Label = "Android",
ValueLabel = "648",
Color = SKColor.Parse("#77d065")
},
new ChartEntry(128)
{
Label = "iOS",
ValueLabel = "428",
Color = SKColor.Parse("#b455b6")
},
new ChartEntry(514)
{
Label = "Forms",
ValueLabel = "214",
Color = SKColor.Parse("#3498db")
}
};
RenderingTest
.Create()
.PageSize(300, 300)
.ShowResults()
.Render(container =>
{
container.Extend().Canvas((canvas, size) =>
{
var bar = new BarChart
{
Entries = entries,
IsAnimated = false,
};
bar.Draw(canvas, (int)size.Width, (int)size.Height);
});
});
}
}
}
@@ -0,0 +1,57 @@
using NUnit.Framework;
using QuestPDF.Examples.Engine;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.Examples
{
public class ComplexLayoutBenchmark
{
[Test]
public void ComplexLayout()
{
RenderingTest
.Create()
.PageSize(PageSizes.A4)
.ProducePdf()
.ShowResults()
.Render(x => x.Image(new byte[] { 1, 2, 3 }));
//.Render(x => GenerateStructure(x, 16));
}
private void GenerateStructure(IContainer container, int level)
{
if (level <= 0)
{
container.Background(Placeholders.BackgroundColor()).Height(10);
return;
}
level--;
if (level % 3 == 0)
{
container
.Border(level / 10f)
.BorderColor(Colors.Black)
.Row(row =>
{
row.RelativeColumn().Element(x => GenerateStructure(x, level));
row.RelativeColumn().Element(x => GenerateStructure(x, level));
});
}
else
{
container
.Border(level / 10f)
.BorderColor(Colors.Black)
.Stack(stack =>
{
stack.Item().Element(x => GenerateStructure(x, level));
stack.Item().Element(x => GenerateStructure(x, level));
});
}
}
}
}
+32
View File
@@ -0,0 +1,32 @@
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)
.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);
});
});
}
}
}
+1 -1
View File
@@ -148,7 +148,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);
+8 -2
View File
@@ -18,6 +18,7 @@ namespace QuestPDF.Examples.Engine
{ {
private string FileNamePrefix = "test"; private string FileNamePrefix = "test";
private Size Size { get; set; } private Size Size { get; set; }
private int? MaxPagesThreshold { get; set; }
private bool ShowResult { get; set; } private bool ShowResult { get; set; }
private RenderingTestResult ResultType { get; set; } = RenderingTestResult.Images; private RenderingTestResult ResultType { get; set; } = RenderingTestResult.Images;
@@ -78,10 +79,15 @@ namespace QuestPDF.Examples.Engine
}); });
} }
public void MaxPages(int value)
{
MaxPagesThreshold = value;
}
public void RenderDocument(Action<IDocumentContainer> content) public void RenderDocument(Action<IDocumentContainer> content)
{ {
var maxPages = ResultType == RenderingTestResult.Pdf ? 1000 : 10; MaxPagesThreshold ??= ResultType == RenderingTestResult.Pdf ? 1000 : 10;
var document = new SimpleDocument(content, maxPages); var document = new SimpleDocument(content, MaxPagesThreshold.Value);
Render(document); Render(document);
} }
+47
View File
@@ -0,0 +1,47 @@
using System.IO;
using NUnit.Framework;
using QuestPDF.Examples.Engine;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
namespace QuestPDF.Examples
{
public class ImageExamples
{
[Test]
public void LoadingImage()
{
RenderingTest
.Create()
.PageSize(PageSizes.A5)
.ProducePdf()
.ShowResults()
.Render(page =>
{
page.Padding(25).Stack(stack =>
{
stack.Spacing(25);
stack.Item().Image("logo.png");
var binaryData = File.ReadAllBytes("logo.png");
stack.Item().Image(binaryData);
using var stream = new FileStream("logo.png", FileMode.Open);
stack.Item().Image(stream);
});
});
}
[Test]
public void Exception()
{
RenderingTest
.Create()
.PageSize(PageSizes.A5)
.ProducePdf()
.ShowResults()
.Render(page => page.Image("non_existent.png"));
}
}
}
+7 -6
View File
@@ -87,23 +87,24 @@ namespace QuestPDF.Examples
{ {
RenderingTest RenderingTest
.Create() .Create()
.PageSize(400, 250) .PageSize(800, 600)
.ProduceImages() .ProduceImages()
.ShowResults() .ShowResults()
.Render(container => .Render(container =>
{ {
container container
.Padding(20) .Padding(20)
.Box()
.Border(1) .Border(1)
.Background(Colors.Grey.Lighten3) .Background(Colors.Grey.Lighten4)
.Inlined(inlined => .Inlined(inlined =>
{ {
inlined.VerticalSpacing(50); inlined.VerticalSpacing(50);
inlined.HorizontalSpacing(20); inlined.HorizontalSpacing(25);
inlined.AlignSpaceAround(); inlined.AlignRight();
inlined.BaselineTop(); inlined.BaselineMiddle();
foreach (var _ in Enumerable.Range(0, 20)) foreach (var _ in Enumerable.Range(0, 100))
inlined.Item().Element(RandomBlock); inlined.Item().Element(RandomBlock);
}); });
}); });
@@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="microcharts" Version="0.9.5.9" />
<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.4.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
@@ -23,6 +24,9 @@
<None Update="LibreBarcode39-Regular.ttf"> <None Update="LibreBarcode39-Regular.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
<None Update="logo.png">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

+2 -11
View File
@@ -86,7 +86,6 @@ namespace QuestPDF.ReportSample
return new ReportSectionMap return new ReportSectionMap
{ {
Label = "Location", Label = "Location",
ImageSource = Placeholders.Image,
Location = Helpers.RandomLocation() Location = Helpers.RandomLocation()
}; };
} }
@@ -96,10 +95,7 @@ namespace QuestPDF.ReportSample
return new ReportSectionPhotos return new ReportSectionPhotos
{ {
Label = "Photos", Label = "Photos",
Photos = Enumerable PhotoCount = Helpers.Random.Next(1, 15)
.Range(0, Helpers.Random.Next(1, 15))
.Select(x => Placeholders.Image(400, 300))
.ToList()
}; };
} }
@@ -107,14 +103,9 @@ namespace QuestPDF.ReportSample
{ {
return new ReportPhoto() return new ReportPhoto()
{ {
PhotoData = Placeholders.Image(800, 600),
Comments = Placeholders.Sentence(), Comments = Placeholders.Sentence(),
Date = DateTime.Now - TimeSpan.FromDays(Helpers.Random.NextDouble() * 100), Date = DateTime.Now - TimeSpan.FromDays(Helpers.Random.NextDouble() * 100),
Location = Helpers.RandomLocation(), Location = Helpers.RandomLocation()
MapContextSource = x => Placeholders.Image(400, 300),
MapDetailsSource = x => Placeholders.Image(400, 300)
}; };
} }
} }
+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);
@@ -0,0 +1,20 @@
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.ReportSample.Layouts
{
public class ImagePlaceholder : IComponent
{
public static bool Solid { get; set; } = false;
public void Compose(IContainer container)
{
if (Solid)
container.Background(Placeholders.Color());
else
container.Image(Placeholders.Image);
}
}
}
@@ -1,32 +0,0 @@
using System;
using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
namespace QuestPDF.ReportSample.Layouts
{
public class ImageTemplate : IComponent
{
private Func<Size, byte[]> Source { get; }
private float AspectRatio { get; }
public ImageTemplate(byte[] source, float aspectRatio = 1.333333f) : this(_ => source, aspectRatio)
{
}
public ImageTemplate(Func<Size, byte[]> source, float aspectRatio = 1.333333f)
{
Source = source;
AspectRatio = aspectRatio;
}
public void Compose(IContainer container)
{
container
.AspectRatio(AspectRatio)
.Background(Colors.Grey.Lighten3)
.Image(Source(Size.Zero));
}
}
}
@@ -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).Component<ImagePlaceholder>();
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).Component<ImagePlaceholder>();
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image); stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
}); });
}); });
} }
@@ -1,3 +1,4 @@
using System.Linq;
using QuestPDF.Fluent; using QuestPDF.Fluent;
using QuestPDF.Helpers; using QuestPDF.Helpers;
using QuestPDF.Infrastructure; using QuestPDF.Infrastructure;
@@ -49,7 +50,7 @@ namespace QuestPDF.ReportSample.Layouts
void MapElement(IContainer container, ReportSectionMap model) void MapElement(IContainer container, ReportSectionMap model)
{ {
if (model.ImageSource == null || model.Location == null) if (model.Location == null)
{ {
container.Text("No location provided"); container.Text("No location provided");
return; return;
@@ -59,25 +60,28 @@ 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).Component<ImagePlaceholder>();
stack.Item().Text(model.Location.Format()); stack.Item().Text(model.Location.Format());
}); });
} }
void PhotosElement(IContainer container, ReportSectionPhotos model) void PhotosElement(IContainer container, ReportSectionPhotos model)
{ {
if (model.Photos.Count == 0) if (model.PhotoCount == 0)
{ {
container.Text("No photos"); container.Text("No photos", Typography.Normal);
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)); Enumerable
.Range(0, model.PhotoCount)
.ToList()
.ForEach(x => grid.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>());
}); });
} }
} }
@@ -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(90).ExternalLink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
}); });
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal(); stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
+1 -7
View File
@@ -44,22 +44,16 @@ namespace QuestPDF.ReportSample
public class ReportSectionMap : ReportSectionElement public class ReportSectionMap : ReportSectionElement
{ {
public Func<Size, byte[]> ImageSource { get; set; }
public Location Location { get; set; } public Location Location { get; set; }
} }
public class ReportSectionPhotos : ReportSectionElement public class ReportSectionPhotos : ReportSectionElement
{ {
public List<byte[]> Photos { get; set; } public int PhotoCount { get; set; }
} }
public class ReportPhoto public class ReportPhoto
{ {
public byte[] PhotoData { get; set; }
public Func<Size, byte[]> MapDetailsSource { get; set; }
public Func<Size, byte[]> MapContextSource { get; set; }
public Location Location { get; set; } public Location Location { get; set; }
public DateTime? Date { get; set; } public DateTime? Date { get; set; }
+74
View File
@@ -0,0 +1,74 @@
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: 256)]
[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()
{
ImagePlaceholder.Solid = true;
var configuration = ManualConfig
.Create(DefaultConfig.Instance)
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
BenchmarkRunner.Run<PerformanceTests>(configuration);
}
[IterationSetup]
public void GenerateReportData()
{
ImagePlaceholder.Solid = true;
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>
+29 -37
View File
@@ -3,62 +3,54 @@ 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
{ {
[Test] private StandardReport Report { get; set; }
public void GenerateAndShow()
[SetUp]
public void SetUp()
{ {
var reportModel = DataSource.GetReport(); var model = DataSource.GetReport();
var report = new StandardReport(reportModel); Report = new StandardReport(model);
}
[Test]
public void GenerateAndShowPdf()
{
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 GenerateAndShowXps()
{ {
// target document length should be around 100 pages var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.xps");
Report.GenerateXps(path);
Process.Start("explorer.exe", path);
}
// test size [Test]
const int testSize = 10; public void Profile()
const decimal performanceTarget = 1; // documents per second {
ImagePlaceholder.Solid = true;
// create report models var container = new DocumentContainer();
var reports = Enumerable Report.Compose(container);
.Range(0, testSize) var content = container.Compose();
.Select(x =>
{
var reportModel = DataSource.GetReport();
return new StandardReport(reportModel);
})
.ToList();
// generate documents var metadata = Report.GetMetadata();
var sw = new Stopwatch(); var pageContext = new PageContext();
sw.Start(); DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length); DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
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();
} }
+21 -21
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,7 +20,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]
@@ -33,8 +33,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]
@@ -47,8 +47,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]
@@ -60,7 +60,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]
@@ -73,8 +73,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]
@@ -87,8 +87,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());
} }
#endregion #endregion
@@ -104,7 +104,7 @@ namespace QuestPDF.UnitTests
MinWidth = 100 MinWidth = 100
}) })
.MeasureElement(new Size(50, 400)) .MeasureElement(new Size(50, 400))
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
[Test] [Test]
@@ -117,8 +117,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(200, 400)) .MeasureElement(new Size(200, 400))
.ExpectChildMeasure(new Size(200, 400), new FullRender(50, 400)) .ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(50, 400))
.CheckMeasureResult(new FullRender(100, 400)); .CheckMeasureResult(SpacePlan.FullRender(100, 400));
} }
[Test] [Test]
@@ -131,8 +131,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(200, 400)) .MeasureElement(new Size(200, 400))
.ExpectChildMeasure(new Size(200, 400), new FullRender(150, 400)) .ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(150, 400))
.CheckMeasureResult(new FullRender(150, 400)); .CheckMeasureResult(SpacePlan.FullRender(150, 400));
} }
[Test] [Test]
@@ -144,7 +144,7 @@ namespace QuestPDF.UnitTests
MaxWidth = 100 MaxWidth = 100
}) })
.MeasureElement(new Size(150, 400)) .MeasureElement(new Size(150, 400))
.CheckMeasureResult(new FullRender(0, 0)); .CheckMeasureResult(SpacePlan.FullRender(0, 0));
} }
[Test] [Test]
@@ -157,8 +157,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(200, 400)) .MeasureElement(new Size(200, 400))
.ExpectChildMeasure(new Size(100, 400), new PartialRender(75, 400)) .ExpectChildMeasure(new Size(100, 400), SpacePlan.PartialRender(75, 400))
.CheckMeasureResult(new PartialRender(75, 400)); .CheckMeasureResult(SpacePlan.PartialRender(75, 400));
} }
[Test] [Test]
@@ -171,8 +171,8 @@ namespace QuestPDF.UnitTests
Child = x.CreateChild() Child = x.CreateChild()
}) })
.MeasureElement(new Size(200, 400)) .MeasureElement(new Size(200, 400))
.ExpectChildMeasure(new Size(100, 400), new Wrap()) .ExpectChildMeasure(new Size(100, 400), SpacePlan.Wrap())
.CheckMeasureResult(new Wrap()); .CheckMeasureResult(SpacePlan.Wrap());
} }
#endregion #endregion
+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")]
+58 -13
View File
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using QuestPDF.Drawing.Exceptions; using QuestPDF.Drawing.Exceptions;
using QuestPDF.Drawing.SpacePlan; using QuestPDF.Drawing.Proxy;
using QuestPDF.Elements; using QuestPDF.Elements;
using QuestPDF.Elements.Text; using QuestPDF.Elements.Text;
using QuestPDF.Elements.Text.Items; using QuestPDF.Elements.Text.Items;
@@ -20,6 +20,13 @@ namespace QuestPDF.Drawing
RenderDocument(canvas, document); RenderDocument(canvas, document);
} }
internal static void GenerateXps(Stream stream, IDocument document)
{
var metadata = document.GetMetadata();
var canvas = new XpsCanvas(stream, metadata);
RenderDocument(canvas, document);
}
internal static ICollection<byte[]> GenerateImages(IDocument document) internal static ICollection<byte[]> GenerateImages(IDocument document)
{ {
var metadata = document.GetMetadata(); var metadata = document.GetMetadata();
@@ -39,11 +46,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));
@@ -56,9 +74,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();
@@ -83,7 +103,7 @@ namespace QuestPDF.Drawing
ThrowLayoutException(); ThrowLayoutException();
} }
if (spacePlan is FullRender) if (spacePlan.Type == SpacePlanType.FullRender)
break; break;
currentPage++; currentPage++;
@@ -93,15 +113,40 @@ namespace QuestPDF.Drawing
void ThrowLayoutException() void ThrowLayoutException()
{ {
throw new DocumentLayoutException( var message = $"Composed layout generates infinite document. This may happen in two cases. " +
$"Composed layout generates infinite document. This may happen in two cases. " + $"1) Your document and its layout configuration is correct but the content takes more than {documentMetadata.DocumentLayoutExceptionThreshold} pages. " +
$"1) Your document and its layout configuration is correct but the content takes more than {documentMetadata.DocumentLayoutExceptionThreshold} pages. " + $"In this case, please increase the value {nameof(DocumentMetadata)}.{nameof(DocumentMetadata.DocumentLayoutExceptionThreshold)} property configured in the {nameof(IDocument.GetMetadata)} method. " +
$"In this case, please increase the value {nameof(DocumentMetadata)}.{nameof(DocumentMetadata.DocumentLayoutExceptionThreshold)} property configured in the {nameof(IDocument.GetMetadata)} method. " + $"2) The layout configuration of your document is invalid. Some of the elements require more space than is provided." +
$"2) The layout configuration of your document is invalid. Some of the elements require more space than is provided." + $"Please analyze your documents structure to detect this element and fix its size constraints.";
$"Please analyze your documents structure to detect this element and fix its size constraints.");
throw new DocumentLayoutException(message)
{
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;
}
internal static void ApplyDefaultTextStyle(this Element content, TextStyle documentDefaultTextStyle) internal static void ApplyDefaultTextStyle(this Element content, TextStyle documentDefaultTextStyle)
{ {
documentDefaultTextStyle.ApplyGlobalStyle(TextStyle.LibraryDefault); documentDefaultTextStyle.ApplyGlobalStyle(TextStyle.LibraryDefault);
@@ -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;
+2 -32
View File
@@ -4,44 +4,14 @@ using SkiaSharp;
namespace QuestPDF.Drawing namespace QuestPDF.Drawing
{ {
internal class PdfCanvas : SkiaCanvasBase internal class PdfCanvas : SkiaDocumentCanvasBase
{ {
private SKDocument Document { get; }
public PdfCanvas(Stream stream, DocumentMetadata documentMetadata) public PdfCanvas(Stream stream, DocumentMetadata documentMetadata)
{ : base(SKDocument.CreatePdf(stream, MapMetadata(documentMetadata)))
Document = SKDocument.CreatePdf(stream, MapMetadata(documentMetadata));
}
~PdfCanvas()
{
Document.Dispose();
}
public override void BeginDocument()
{ {
} }
public override void EndDocument()
{
Canvas.Dispose();
Document.Close();
Document.Dispose();
}
public override void BeginPage(Size size)
{
Canvas = Document.BeginPage(size.Width, size.Height);
}
public override void EndPage()
{
Document.EndPage();
Canvas.Dispose();
}
private static SKDocumentPdfMetadata MapMetadata(DocumentMetadata metadata) private static SKDocumentPdfMetadata MapMetadata(DocumentMetadata metadata)
{ {
return new SKDocumentPdfMetadata return new SKDocumentPdfMetadata
+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
{
}
}
@@ -0,0 +1,45 @@
using System.IO;
using QuestPDF.Infrastructure;
using SkiaSharp;
namespace QuestPDF.Drawing
{
internal class SkiaDocumentCanvasBase : SkiaCanvasBase
{
private SKDocument Document { get; }
public SkiaDocumentCanvasBase(SKDocument document)
{
Document = document;
}
~SkiaDocumentCanvasBase()
{
Document.Dispose();
}
public override void BeginDocument()
{
}
public override void EndDocument()
{
Canvas.Dispose();
Document.Close();
Document.Dispose();
}
public override void BeginPage(Size size)
{
Canvas = Document.BeginPage(size.Width, size.Height);
}
public override void EndPage()
{
Document.EndPage();
Canvas.Dispose();
}
}
}
+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
{ {
+15
View File
@@ -0,0 +1,15 @@
using System.IO;
using QuestPDF.Infrastructure;
using SkiaSharp;
namespace QuestPDF.Drawing
{
internal class XpsCanvas : SkiaDocumentCanvasBase
{
public XpsCanvas(Stream stream, DocumentMetadata documentMetadata)
: base(SKDocument.CreateXps(stream, documentMetadata.RasterDpi))
{
}
}
}
+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)
+14 -15
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(
Min(MaxWidth, availableSpace.Width), Min(MaxWidth, availableSpace.Width),
Min(MaxHeight, availableSpace.Height)); Min(MaxHeight, availableSpace.Height));
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(
Max(MinWidth, size.Width), Max(MinWidth, measurement.Width),
Max(MinHeight, size.Height)); Max(MinHeight, measurement.Height));
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();
} }
@@ -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,
+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)
+24 -19
View File
@@ -1,21 +1,21 @@
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
{ {
internal class InlinedElement : Container internal class InlinedElement : Container
{ {
public ISpacePlan? MeasureCache { get; set; } public SpacePlan? MeasureCache { get; set; }
internal override ISpacePlan Measure(Size availableSpace) internal override SpacePlan Measure(Size availableSpace)
{ {
// TODO: once element caching proxy is introduces, this can be removed // TODO: once element caching proxy is introduces, this can be removed
MeasureCache ??= Child.Measure(Size.Max); MeasureCache ??= Child.Measure(Size.Max);
return MeasureCache; return MeasureCache.Value;
} }
} }
@@ -50,22 +50,23 @@ namespace QuestPDF.Elements
base.HandleVisitor(visit); base.HandleVisitor(visit);
} }
internal override ISpacePlan Measure(Size availableSpace) internal override SpacePlan Measure(Size availableSpace)
{ {
if (!ChildrenQueue.Any()) if (!ChildrenQueue.Any())
return new FullRender(Size.Zero); return SpacePlan.FullRender(Size.Zero);
var lines = Compose(availableSpace); var lines = Compose(availableSpace);
if (!lines.Any()) if (!lines.Any())
return new Wrap(); return SpacePlan.Wrap();
var lineSizes = lines var lineSizes = lines
.Select(line => .Select(line =>
{ {
var size = GetLineSize(line); var size = GetLineSize(line);
var heightWithSpacing = size.Height + (line.Count - 1) * HorizontalSpacing;
return new Size(size.Width, heightWithSpacing); var widthWithSpacing = size.Width + (line.Count - 1) * HorizontalSpacing;
return new Size(widthWithSpacing, size.Height);
}) })
.ToList(); .ToList();
@@ -76,9 +77,9 @@ namespace QuestPDF.Elements
var isPartiallyRendered = lines.Sum(x => x.Count) != ChildrenQueue.Count; var isPartiallyRendered = lines.Sum(x => x.Count) != ChildrenQueue.Count;
if (isPartiallyRendered) if (isPartiallyRendered)
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)
@@ -88,7 +89,11 @@ namespace QuestPDF.Elements
foreach (var line in lines) foreach (var line in lines)
{ {
var height = line.Select(x => x.Measure(Size.Max) as Size).Where(x => x != null).Max(x => x.Height); var height = line
.Select(x => x.Measure(Size.Max))
.Where(x => x.Type != SpacePlanType.Wrap)
.Max(x => x.Height);
DrawLine(line); DrawLine(line);
topOffset += height + VerticalSpacing; topOffset += height + VerticalSpacing;
@@ -108,7 +113,7 @@ namespace QuestPDF.Elements
foreach (var element in elements) foreach (var element in elements)
{ {
var size = element.Measure(Size.Max) as Size; var size = element.Measure(Size.Max);
var baselineOffset = BaselineOffset(size, lineSize.Height); var baselineOffset = BaselineOffset(size, lineSize.Height);
Canvas.Translate(new Position(0, baselineOffset)); Canvas.Translate(new Position(0, baselineOffset));
@@ -177,8 +182,8 @@ namespace QuestPDF.Elements
Size GetLineSize(ICollection<InlinedElement> elements) Size GetLineSize(ICollection<InlinedElement> elements)
{ {
var sizes = elements var sizes = elements
.Select(x => x.Measure(Size.Max) as Size) .Select(x => x.Measure(Size.Max))
.Where(x => x != null) .Where(x => x.Type != SpacePlanType.Wrap)
.ToList(); .ToList();
var width = sizes.Sum(x => x.Width); var width = sizes.Sum(x => x.Width);
@@ -203,8 +208,8 @@ namespace QuestPDF.Elements
break; break;
var height = line var height = line
.Select(x => x.Measure(availableSize) as Size) .Select(x => x.Measure(availableSize))
.Where(x => x != null) .Where(x => x.Type != SpacePlanType.Wrap)
.Max(x => x.Height); .Max(x => x.Height);
if (topOffset + height > availableSize.Height + Size.Epsilon) if (topOffset + height > availableSize.Height + Size.Epsilon)
@@ -227,9 +232,9 @@ namespace QuestPDF.Elements
break; break;
var element = queue.Peek(); var element = queue.Peek();
var size = element.Measure(Size.Max) as Size; var size = element.Measure(Size.Max);
if (size == null) if (size.Type == SpacePlanType.Wrap)
break; break;
if (leftOffset + size.Width > availableSize.Width + Size.Epsilon) if (leftOffset + size.Width > availableSize.Width + Size.Epsilon)
+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
@@ -42,15 +42,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);
}); });
(container as Element).ApplyDefaultTextStyle(DefaultTextStyle); (container as Element).ApplyDefaultTextStyle(DefaultTextStyle);
+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();
} }
+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
@@ -12,10 +12,10 @@ namespace QuestPDF.Elements
FirstPageWasSkipped = false; FirstPageWasSkipped = false;
} }
internal override ISpacePlan Measure(Size availableSpace) internal override SpacePlan Measure(Size availableSpace)
{ {
if (Child == null || !FirstPageWasSkipped) if (Child == null || !FirstPageWasSkipped)
return new FullRender(Size.Zero); return SpacePlan.FullRender(Size.Zero);
return Child.Measure(availableSpace); return Child.Measure(availableSpace);
} }
+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());
} }

Some files were not shown because too many files have changed in this diff Show More