Compare commits
12 Commits
richtext
...
dynamic-old
| Author | SHA1 | Date | |
|---|---|---|---|
| fc33056434 | |||
| d3e8386418 | |||
| 68f050a154 | |||
| 88e58500a8 | |||
| 7980befb77 | |||
| f3b75b43ac | |||
| eca93b7e66 | |||
| 6a3bfd855e | |||
| 5e7f2a3adf | |||
| 2f1dd4b383 | |||
| adec37007b | |||
| 814d325376 |
@@ -0,0 +1,33 @@
|
|||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class DebuggingTesting
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void Stack()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(500, 360)
|
||||||
|
.FileName()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
container
|
||||||
|
.Background(Colors.White)
|
||||||
|
.Padding(15)
|
||||||
|
.Grid(grid =>
|
||||||
|
{
|
||||||
|
grid.Spacing(15);
|
||||||
|
|
||||||
|
grid.Item().Background(Colors.Grey.Medium).Text(Placeholders.LoremIpsum());
|
||||||
|
grid.Item().DebugPointer("Test").Background(Colors.Grey.Lighten1).Height(1000); // <-- problem
|
||||||
|
grid.Item().Background(Colors.Grey.Lighten2).Height(150);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,170 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Examples.Engine;
|
||||||
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Helpers;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Examples
|
||||||
|
{
|
||||||
|
public class OrderItem
|
||||||
|
{
|
||||||
|
public string ItemName { get; set; } = Placeholders.Label();
|
||||||
|
public int Price { get; set; } = Placeholders.Random.Next(1, 11) * 10;
|
||||||
|
public int Count { get; set; } = Placeholders.Random.Next(1, 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class OrdersTable : IDynamicComponent
|
||||||
|
{
|
||||||
|
private ICollection<OrderItem> Items { get; }
|
||||||
|
private ICollection<OrderItem> ItemsLeft { get; set; }
|
||||||
|
|
||||||
|
public OrdersTable(ICollection<OrderItem> items)
|
||||||
|
{
|
||||||
|
Items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Compose(DynamicContext context, IDynamicContainer container)
|
||||||
|
{
|
||||||
|
if (context.Operation == DynamicLayoutOperation.Reset)
|
||||||
|
{
|
||||||
|
ItemsLeft = new List<OrderItem>(Items);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var header = ComposeHeader(context);
|
||||||
|
var sampleFooter = ComposeFooter(context, Enumerable.Empty<OrderItem>());
|
||||||
|
var decorationHeight = header.Size.Height + sampleFooter.Size.Height;
|
||||||
|
|
||||||
|
var rows = GetItemsForPage(context, decorationHeight).ToList();
|
||||||
|
var footer = ComposeFooter(context, rows.Select(x => x.Item));
|
||||||
|
|
||||||
|
if (ItemsLeft.Count > rows.Count)
|
||||||
|
container.HasMoreContent();
|
||||||
|
|
||||||
|
if (context.Operation == DynamicLayoutOperation.Draw)
|
||||||
|
ItemsLeft = ItemsLeft.Skip(rows.Count).ToList();
|
||||||
|
|
||||||
|
container.Box().Decoration(decoration =>
|
||||||
|
{
|
||||||
|
decoration.Header().Element(header);
|
||||||
|
|
||||||
|
decoration.Content().Box().Stack(stack =>
|
||||||
|
{
|
||||||
|
foreach (var row in rows)
|
||||||
|
stack.Item().Element(row.Element);
|
||||||
|
});
|
||||||
|
|
||||||
|
decoration.Footer().Element(footer);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDynamicElement ComposeHeader(DynamicContext context)
|
||||||
|
{
|
||||||
|
return context.CreateElement(element =>
|
||||||
|
{
|
||||||
|
element
|
||||||
|
.BorderBottom(1)
|
||||||
|
.BorderColor(Colors.Grey.Darken2)
|
||||||
|
.Padding(5)
|
||||||
|
.Row(row =>
|
||||||
|
{
|
||||||
|
var textStyle = TextStyle.Default.SemiBold();
|
||||||
|
|
||||||
|
row.ConstantColumn(30).Text("#", textStyle);
|
||||||
|
row.RelativeColumn().Text("Item name", textStyle);
|
||||||
|
row.ConstantColumn(50).AlignRight().Text("Count", textStyle);
|
||||||
|
row.ConstantColumn(50).AlignRight().Text("Price", textStyle);
|
||||||
|
row.ConstantColumn(50).AlignRight().Text("Total", textStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDynamicElement ComposeFooter(DynamicContext context, IEnumerable<OrderItem> items)
|
||||||
|
{
|
||||||
|
var total = items.Sum(x => x.Count * x.Price);
|
||||||
|
|
||||||
|
return context.CreateElement(element =>
|
||||||
|
{
|
||||||
|
element
|
||||||
|
.Padding(5)
|
||||||
|
.AlignRight()
|
||||||
|
.Text($"Subtotal: {total}$", TextStyle.Default.Size(14).SemiBold());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<(OrderItem Item, IDynamicElement Element)> GetItemsForPage(DynamicContext context, float decorationHeight)
|
||||||
|
{
|
||||||
|
var totalHeight = decorationHeight;
|
||||||
|
var counter = Items.Count - ItemsLeft.Count + 1;
|
||||||
|
|
||||||
|
foreach (var orderItem in ItemsLeft)
|
||||||
|
{
|
||||||
|
var element = context.CreateElement(content =>
|
||||||
|
{
|
||||||
|
content
|
||||||
|
.BorderBottom(1)
|
||||||
|
.BorderColor(Colors.Grey.Lighten2)
|
||||||
|
.Padding(5)
|
||||||
|
.Row(row =>
|
||||||
|
{
|
||||||
|
row.ConstantColumn(30).Text(counter++);
|
||||||
|
row.RelativeColumn().Text(orderItem.ItemName);
|
||||||
|
row.ConstantColumn(50).AlignRight().Text(orderItem.Count);
|
||||||
|
row.ConstantColumn(50).AlignRight().Text($"{orderItem.Price}$");
|
||||||
|
row.ConstantColumn(50).AlignRight().Text($"{orderItem.Count*orderItem.Price}$");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
var elementHeight = element.Size.Height;
|
||||||
|
|
||||||
|
if (totalHeight + elementHeight > context.AvailableSize.Height)
|
||||||
|
break;
|
||||||
|
|
||||||
|
totalHeight += elementHeight;
|
||||||
|
yield return (orderItem, element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DynamicExamples
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public static void Dynamic()
|
||||||
|
{
|
||||||
|
RenderingTest
|
||||||
|
.Create()
|
||||||
|
.PageSize(PageSizes.A5)
|
||||||
|
.FileName()
|
||||||
|
.ShowResults()
|
||||||
|
.Render(container =>
|
||||||
|
{
|
||||||
|
var items = Enumerable.Range(0, 25).Select(x => new OrderItem()).ToList();
|
||||||
|
|
||||||
|
container
|
||||||
|
.Background(Colors.White)
|
||||||
|
.Padding(25)
|
||||||
|
.Decoration(decoration =>
|
||||||
|
{
|
||||||
|
decoration
|
||||||
|
.Header()
|
||||||
|
.PaddingBottom(5)
|
||||||
|
.Text(text =>
|
||||||
|
{
|
||||||
|
text.DefaultTextStyle(TextStyle.Default.SemiBold().Color(Colors.Blue.Darken2).Size(16));
|
||||||
|
text.Span("Page ");
|
||||||
|
text.CurrentPageNumber();
|
||||||
|
text.Span(" of ");
|
||||||
|
text.TotalPages();
|
||||||
|
});
|
||||||
|
|
||||||
|
decoration
|
||||||
|
.Content()
|
||||||
|
.Dynamic(new OrdersTable(items));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -154,7 +154,7 @@ namespace QuestPDF.Examples
|
|||||||
{
|
{
|
||||||
container
|
container
|
||||||
.Padding(25)
|
.Padding(25)
|
||||||
.Debug("Grid example", Colors.Blue.Medium)
|
.DebugArea("Grid example", Colors.Blue.Medium)
|
||||||
.Grid(grid =>
|
.Grid(grid =>
|
||||||
{
|
{
|
||||||
grid.Columns(3);
|
grid.Columns(3);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ namespace QuestPDF.ReportSample
|
|||||||
{
|
{
|
||||||
public static class Helpers
|
public static class Helpers
|
||||||
{
|
{
|
||||||
public static Random Random { get; } = new Random();
|
public static Random Random { get; } = new Random(1);
|
||||||
|
|
||||||
public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path);
|
public static string GetTestItem(string path) => Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", path);
|
||||||
|
|
||||||
|
|||||||
@@ -30,14 +30,14 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
container
|
container
|
||||||
.Row(row =>
|
.Row(row =>
|
||||||
{
|
{
|
||||||
row.RelativeColumn(2).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
row.RelativeColumn(2).AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
|
||||||
|
|
||||||
row.RelativeColumn().PaddingLeft(5).Stack(stack =>
|
row.RelativeColumn().PaddingLeft(5).Stack(stack =>
|
||||||
{
|
{
|
||||||
stack.Spacing(7f);
|
stack.Spacing(7f);
|
||||||
|
|
||||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
|
||||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,25 +59,25 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
{
|
{
|
||||||
stack.Spacing(5);
|
stack.Spacing(5);
|
||||||
|
|
||||||
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3);
|
||||||
stack.Item().Text(model.Location.Format(), Typography.Normal);
|
stack.Item().Text(model.Location.Format(), Typography.Normal);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PhotosElement(IContainer container, ReportSectionPhotos model)
|
void PhotosElement(IContainer container, ReportSectionPhotos model)
|
||||||
{
|
{
|
||||||
if (model.Photos.Count == 0)
|
if (model.Photos.Count == 0)
|
||||||
{
|
{
|
||||||
container.Text("No photos", Typography.Normal);
|
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));
|
model.Photos.ForEach(x => grid.Item().AspectRatio(4 / 3f).Background(Colors.Grey.Lighten3));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ namespace QuestPDF.ReportSample.Layouts
|
|||||||
row.Spacing(50);
|
row.Spacing(50);
|
||||||
|
|
||||||
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
|
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
|
||||||
row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
|
row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Background(Colors.Grey.Lighten3);
|
||||||
});
|
});
|
||||||
|
|
||||||
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
|
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using BenchmarkDotNet.Configs;
|
||||||
|
using BenchmarkDotNet.Engines;
|
||||||
|
using BenchmarkDotNet.Running;
|
||||||
|
using Microsoft.VisualStudio.TestPlatform.TestHost;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Drawing.Proxy;
|
||||||
|
using QuestPDF.Elements;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
using QuestPDF.ReportSample.Layouts;
|
||||||
|
|
||||||
|
namespace QuestPDF.ReportSample
|
||||||
|
{
|
||||||
|
[SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 1, targetCount: 100)]
|
||||||
|
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
|
||||||
|
public class PerformanceTests
|
||||||
|
{
|
||||||
|
private PageContext PageContext { get; set; }
|
||||||
|
private DocumentMetadata Metadata { get; set; }
|
||||||
|
private Container Content { get; set; }
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
var configuration = ManualConfig
|
||||||
|
.Create(DefaultConfig.Instance)
|
||||||
|
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
|
||||||
|
|
||||||
|
BenchmarkRunner.Run<PerformanceTests>(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
[IterationSetup]
|
||||||
|
public void GenerateReportData()
|
||||||
|
{
|
||||||
|
var model = DataSource.GetReport();
|
||||||
|
var report = new StandardReport(model);
|
||||||
|
Metadata = report.GetMetadata();
|
||||||
|
|
||||||
|
var documentContainer = new DocumentContainer();
|
||||||
|
report.Compose(documentContainer);
|
||||||
|
Content = documentContainer.Compose();
|
||||||
|
|
||||||
|
PageContext = new PageContext();
|
||||||
|
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||||
|
|
||||||
|
var sw = new Stopwatch();
|
||||||
|
sw.Start();
|
||||||
|
|
||||||
|
Content.HandleVisitor(x =>
|
||||||
|
{
|
||||||
|
if (x is ICacheable)
|
||||||
|
x.CreateProxy(y => new CacheProxy(y));
|
||||||
|
});
|
||||||
|
|
||||||
|
sw.Stop();
|
||||||
|
Console.WriteLine($"Creating cache took: {sw.ElapsedMilliseconds}");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void GenerationTest()
|
||||||
|
{
|
||||||
|
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,9 +8,10 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
|
||||||
<PackageReference Include="nunit" Version="3.13.2" />
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
|
||||||
<PackageReference Include="SkiaSharp" Version="2.80.3" />
|
<PackageReference Include="SkiaSharp" Version="2.80.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -3,62 +3,45 @@ using System.Diagnostics;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Fluent;
|
using QuestPDF.Fluent;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.ReportSample.Layouts;
|
using QuestPDF.ReportSample.Layouts;
|
||||||
|
|
||||||
namespace QuestPDF.ReportSample
|
namespace QuestPDF.ReportSample
|
||||||
{
|
{
|
||||||
public class ReportGeneration
|
public class ReportGeneration
|
||||||
{
|
{
|
||||||
|
private StandardReport Report { get; set; }
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
var model = DataSource.GetReport();
|
||||||
|
Report = new StandardReport(model);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void GenerateAndShow()
|
public void GenerateAndShow()
|
||||||
{
|
{
|
||||||
var reportModel = DataSource.GetReport();
|
|
||||||
var report = new StandardReport(reportModel);
|
|
||||||
|
|
||||||
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
|
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
|
||||||
report.GeneratePdf(path);
|
Report.GeneratePdf(path);
|
||||||
|
|
||||||
Process.Start("explorer.exe", path);
|
Process.Start("explorer.exe", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void PerformanceBenchmark()
|
public void Profile()
|
||||||
{
|
{
|
||||||
// target document length should be around 100 pages
|
var container = new DocumentContainer();
|
||||||
|
Report.Compose(container);
|
||||||
|
var content = container.Compose();
|
||||||
|
|
||||||
// test size
|
var metadata = Report.GetMetadata();
|
||||||
const int testSize = 10;
|
var pageContext = new PageContext();
|
||||||
const decimal performanceTarget = 1; // documents per second
|
|
||||||
|
|
||||||
// create report models
|
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||||
var reports = Enumerable
|
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||||
.Range(0, testSize)
|
|
||||||
.Select(x =>
|
|
||||||
{
|
|
||||||
var reportModel = DataSource.GetReport();
|
|
||||||
return new StandardReport(reportModel);
|
|
||||||
})
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
// generate documents
|
|
||||||
var sw = new Stopwatch();
|
|
||||||
|
|
||||||
sw.Start();
|
|
||||||
var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
|
|
||||||
sw.Stop();
|
|
||||||
|
|
||||||
// show summary
|
|
||||||
Console.WriteLine($"Total size: {totalSize:N0} bytes");
|
|
||||||
|
|
||||||
var performance = sw.ElapsedMilliseconds / (decimal)testSize;
|
|
||||||
var speed = 1000M / performance;
|
|
||||||
Console.WriteLine($"Test time: {sw.ElapsedMilliseconds} ms");
|
|
||||||
Console.WriteLine($"Time per document: {performance:N} ms");
|
|
||||||
Console.WriteLine($"Documents per second: {speed:N} d/s");
|
|
||||||
|
|
||||||
//if (speed < performanceTarget)
|
|
||||||
// throw new Exception("Rendering algorithm is too slow.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
using QuestPDF.UnitTests.TestEngine;
|
using QuestPDF.UnitTests.TestEngine;
|
||||||
@@ -18,7 +18,7 @@ namespace QuestPDF.UnitTests
|
|||||||
MinHeight = 100
|
MinHeight = 100
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 50))
|
.MeasureElement(new Size(400, 50))
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -31,8 +31,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 50))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
|
||||||
.CheckMeasureResult(new FullRender(400, 100));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 100));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -45,8 +45,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 150))
|
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
|
||||||
.CheckMeasureResult(new FullRender(400, 150));
|
.CheckMeasureResult(SpacePlan.FullRender(400, 150));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -58,7 +58,7 @@ namespace QuestPDF.UnitTests
|
|||||||
MaxHeight = 100
|
MaxHeight = 100
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 150))
|
.MeasureElement(new Size(400, 150))
|
||||||
.CheckMeasureResult(new FullRender(0, 0));
|
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -71,8 +71,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new PartialRender(400, 75))
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
|
||||||
.CheckMeasureResult(new PartialRender(400, 75));
|
.CheckMeasureResult(SpacePlan.PartialRender(400, 75));
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
@@ -85,8 +85,8 @@ namespace QuestPDF.UnitTests
|
|||||||
Child = x.CreateChild()
|
Child = x.CreateChild()
|
||||||
})
|
})
|
||||||
.MeasureElement(new Size(400, 200))
|
.MeasureElement(new Size(400, 200))
|
||||||
.ExpectChildMeasure(new Size(400, 100), new Wrap())
|
.ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
|
||||||
.CheckMeasureResult(new Wrap());
|
.CheckMeasureResult(SpacePlan.Wrap());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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,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;
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,22 +211,17 @@ 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));
|
||||||
|
|
||||||
var actual = Element.Measure(OperationInput);
|
var actual = Element.Measure(OperationInput);
|
||||||
|
|
||||||
Assert.AreEqual(expected.GetType(), actual.GetType());
|
Assert.AreEqual(expected.GetType(), actual.GetType());
|
||||||
|
|
||||||
var expectedSize = expected as Size;
|
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,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;
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,4 +2,5 @@
|
|||||||
|
|
||||||
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
||||||
[assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
|
[assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
|
||||||
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
||||||
|
[assembly: InternalsVisibleTo("QuestPDF.ReportSample")]
|
||||||
@@ -2,7 +2,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using QuestPDF.Drawing.Exceptions;
|
using QuestPDF.Drawing.Exceptions;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing.Proxy;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
@@ -36,11 +36,22 @@ namespace QuestPDF.Drawing
|
|||||||
var metadata = document.GetMetadata();
|
var metadata = document.GetMetadata();
|
||||||
var pageContext = new PageContext();
|
var pageContext = new PageContext();
|
||||||
|
|
||||||
RenderPass(pageContext, new FreeCanvas(), content, metadata);
|
DebuggingState debuggingState = null;
|
||||||
RenderPass(pageContext, canvas, content, metadata);
|
|
||||||
|
if (System.Diagnostics.Debugger.IsAttached)
|
||||||
|
{
|
||||||
|
debuggingState = ApplyDebugging(content);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ApplyCaching(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
RenderPass(pageContext, new FreeCanvas(), content, metadata, debuggingState);
|
||||||
|
RenderPass(pageContext, canvas, content, metadata, debuggingState);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void RenderPass<TCanvas>(PageContext pageContext, TCanvas canvas, Container content, DocumentMetadata documentMetadata)
|
internal static void RenderPass<TCanvas>(PageContext pageContext, TCanvas canvas, Container content, DocumentMetadata documentMetadata, DebuggingState? debuggingState)
|
||||||
where TCanvas : ICanvas, IRenderingCanvas
|
where TCanvas : ICanvas, IRenderingCanvas
|
||||||
{
|
{
|
||||||
content.HandleVisitor(x => x?.Initialize(pageContext, canvas));
|
content.HandleVisitor(x => x?.Initialize(pageContext, canvas));
|
||||||
@@ -53,9 +64,11 @@ namespace QuestPDF.Drawing
|
|||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
pageContext.SetPageNumber(currentPage);
|
pageContext.SetPageNumber(currentPage);
|
||||||
var spacePlan = content.Measure(Size.Max) as Size;
|
debuggingState?.Reset();
|
||||||
|
|
||||||
|
var spacePlan = content.Measure(Size.Max);
|
||||||
|
|
||||||
if (spacePlan == null)
|
if (spacePlan.Type == SpacePlanType.Wrap)
|
||||||
{
|
{
|
||||||
canvas.EndDocument();
|
canvas.EndDocument();
|
||||||
ThrowLayoutException();
|
ThrowLayoutException();
|
||||||
@@ -77,21 +90,45 @@ namespace QuestPDF.Drawing
|
|||||||
if (currentPage >= documentMetadata.DocumentLayoutExceptionThreshold)
|
if (currentPage >= documentMetadata.DocumentLayoutExceptionThreshold)
|
||||||
{
|
{
|
||||||
canvas.EndDocument();
|
canvas.EndDocument();
|
||||||
throw new DocumentLayoutException("Composed layout generates infinite document.");
|
ThrowLayoutException();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (spacePlan is FullRender)
|
if (spacePlan.Type == SpacePlanType.FullRender)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
currentPage++;
|
currentPage++;
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas.EndDocument();
|
canvas.EndDocument();
|
||||||
|
|
||||||
void ThrowLayoutException()
|
void ThrowLayoutException()
|
||||||
{
|
{
|
||||||
throw new DocumentLayoutException("Composed layout generates infinite document.");
|
throw new DocumentLayoutException("Composed layout generates infinite document.")
|
||||||
|
{
|
||||||
|
ElementTrace = debuggingState?.BuildTrace() ?? "Debug trace is available only in the DEBUG mode."
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void ApplyCaching(Container content)
|
||||||
|
{
|
||||||
|
content.HandleVisitor(x =>
|
||||||
|
{
|
||||||
|
if (x is ICacheable)
|
||||||
|
x.CreateProxy(y => new CacheProxy(y));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DebuggingState ApplyDebugging(Container content)
|
||||||
|
{
|
||||||
|
var debuggingState = new DebuggingState();
|
||||||
|
|
||||||
|
content.HandleVisitor(x =>
|
||||||
|
{
|
||||||
|
x.CreateProxy(y => new DebuggingProxy(debuggingState, y));
|
||||||
|
});
|
||||||
|
|
||||||
|
return debuggingState;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,8 @@ namespace QuestPDF.Drawing.Exceptions
|
|||||||
{
|
{
|
||||||
public class DocumentLayoutException : Exception
|
public class DocumentLayoutException : Exception
|
||||||
{
|
{
|
||||||
|
public string ElementTrace { get; set; }
|
||||||
|
|
||||||
public DocumentLayoutException()
|
public DocumentLayoutException()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -1,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;
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ namespace QuestPDF.Drawing
|
|||||||
|
|
||||||
public override void EndDocument()
|
public override void EndDocument()
|
||||||
{
|
{
|
||||||
Canvas.Dispose();
|
Canvas?.Dispose();
|
||||||
|
|
||||||
Document.Close();
|
Document?.Close();
|
||||||
Document.Dispose();
|
Document?.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void BeginPage(Size size)
|
public override void BeginPage(Size size)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() + "...";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Drawing.Proxy
|
||||||
|
{
|
||||||
|
internal class ElementProxy : ContainerElement
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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()}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace QuestPDF.Drawing.SpacePlan
|
|
||||||
{
|
|
||||||
internal class Wrap : ISpacePlan
|
|
||||||
{
|
|
||||||
public override string ToString() => "Wrap";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
{
|
{
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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})";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,45 +1,44 @@
|
|||||||
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; }
|
||||||
|
|
||||||
public float? MinHeight { get; set; }
|
public float? MinHeight { get; set; }
|
||||||
public float? MaxHeight { get; set; }
|
public float? MaxHeight { get; set; }
|
||||||
|
|
||||||
internal override ISpacePlan Measure(Size availableSpace)
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
{
|
{
|
||||||
if (MinWidth > availableSpace.Width + Size.Epsilon)
|
if (MinWidth > availableSpace.Width + Size.Epsilon)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
if (MinHeight > availableSpace.Height + Size.Epsilon)
|
if (MinHeight > availableSpace.Height + Size.Epsilon)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
var available = new Size(
|
var available = new Size(
|
||||||
MathHelpers.Min(MaxWidth, availableSpace.Width),
|
LimitMin(availableSpace.Width, MaxWidth),
|
||||||
MathHelpers.Min(MaxHeight, availableSpace.Height));
|
LimitMin(availableSpace.Height, MaxHeight));
|
||||||
|
|
||||||
var measurement = Child?.Measure(available) ?? new FullRender(Size.Zero);
|
var measurement = base.Measure(available);
|
||||||
var size = measurement as Size;
|
|
||||||
|
|
||||||
if (measurement is Wrap)
|
if (measurement.Type == SpacePlanType.Wrap)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
var actualSize = new Size(
|
var actualSize = new Size(
|
||||||
MathHelpers.Max(MinWidth, size.Width),
|
LimitMax(measurement.Width, MinWidth),
|
||||||
MathHelpers.Max(MinHeight, size.Height));
|
LimitMax(measurement.Height, MinHeight));
|
||||||
|
|
||||||
if (size is FullRender)
|
if (measurement.Type == SpacePlanType.FullRender)
|
||||||
return new FullRender(actualSize);
|
return SpacePlan.FullRender(actualSize);
|
||||||
|
|
||||||
if (size is PartialRender)
|
if (measurement.Type == SpacePlanType.PartialRender)
|
||||||
return new PartialRender(actualSize);
|
return SpacePlan.PartialRender(actualSize);
|
||||||
|
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
}
|
}
|
||||||
@@ -47,23 +46,20 @@ namespace QuestPDF.Elements
|
|||||||
internal override void Draw(Size availableSpace)
|
internal override void Draw(Size availableSpace)
|
||||||
{
|
{
|
||||||
var available = new Size(
|
var available = new Size(
|
||||||
MathHelpers.Min(MaxWidth, availableSpace.Width),
|
LimitMin(availableSpace.Width, MaxWidth),
|
||||||
MathHelpers.Min(MaxHeight, availableSpace.Height));
|
LimitMin(availableSpace.Height, MaxHeight));
|
||||||
|
|
||||||
Child?.Draw(available);
|
base.Draw(available);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private float LimitMin(float value, float? limit)
|
||||||
static class MathHelpers
|
|
||||||
{
|
|
||||||
public static float Min(params float?[] values)
|
|
||||||
{
|
{
|
||||||
return values.Where(x => x.HasValue).Min().Value;
|
return limit.HasValue ? Math.Min(value, limit.Value) : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static float Max(params float?[] values)
|
private float LimitMax(float value, float? limit)
|
||||||
{
|
{
|
||||||
return values.Where(x => x.HasValue).Max().Value;
|
return limit.HasValue ? Math.Max(value, limit.Value) : value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
|
namespace QuestPDF.Elements
|
||||||
|
{
|
||||||
|
internal class DebugPointer : Container
|
||||||
|
{
|
||||||
|
public string Target { get; set; }
|
||||||
|
public bool Highlight { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
}
|
||||||
return new Wrap();
|
|
||||||
|
|
||||||
var decorationSize = decorationMeasure as Size ?? Size.Zero;
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
var contentMeasure = ContentElement?.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height)) ?? new FullRender(Size.Zero);
|
{
|
||||||
|
var decorationMeasure = DecorationElement.Measure(availableSpace);
|
||||||
|
|
||||||
if (contentMeasure is Wrap)
|
if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
var contentSize = contentMeasure as Size ?? Size.Zero;
|
var decorationSize = decorationMeasure;
|
||||||
|
var contentMeasure = ContentElement.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height));
|
||||||
|
|
||||||
|
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,
|
||||||
|
|||||||
@@ -0,0 +1,120 @@
|
|||||||
|
using System;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
using QuestPDF.Drawing.Exceptions;
|
||||||
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
|
namespace QuestPDF.Elements
|
||||||
|
{
|
||||||
|
internal class DynamicHost : Element, IStateResettable
|
||||||
|
{
|
||||||
|
private IDynamicComponent Child { get; }
|
||||||
|
|
||||||
|
public DynamicHost(IDynamicComponent child)
|
||||||
|
{
|
||||||
|
Child = child;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResetState()
|
||||||
|
{
|
||||||
|
GetContent(Size.Zero, DynamicLayoutOperation.Reset);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
|
{
|
||||||
|
var content = GetContent(availableSpace, DynamicLayoutOperation.Measure);
|
||||||
|
var measurement = content.Measure(availableSpace);
|
||||||
|
|
||||||
|
if (measurement.Type != SpacePlanType.FullRender)
|
||||||
|
throw new DocumentLayoutException("Dynamic component generated content that does not fit on a single page.");
|
||||||
|
|
||||||
|
return content.HasMoreContent
|
||||||
|
? SpacePlan.PartialRender(measurement)
|
||||||
|
: SpacePlan.FullRender(measurement);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override void Draw(Size availableSpace)
|
||||||
|
{
|
||||||
|
GetContent(availableSpace, DynamicLayoutOperation.Draw).Draw(availableSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
DynamicContainer GetContent(Size availableSize, DynamicLayoutOperation operation)
|
||||||
|
{
|
||||||
|
var context = new DynamicContext
|
||||||
|
{
|
||||||
|
PageNumber = PageContext.GetLocationPage(Infrastructure.PageContext.CurrentPageSlot),
|
||||||
|
PageContext = PageContext,
|
||||||
|
Canvas = Canvas,
|
||||||
|
|
||||||
|
AvailableSize = availableSize,
|
||||||
|
Operation = operation
|
||||||
|
};
|
||||||
|
|
||||||
|
var container = new DynamicContainer();
|
||||||
|
Child.Compose(context, container);
|
||||||
|
|
||||||
|
container.HandleVisitor(x => x?.Initialize(PageContext, Canvas));
|
||||||
|
container.HandleVisitor(x => (x as IStateResettable)?.ResetState());
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum DynamicLayoutOperation
|
||||||
|
{
|
||||||
|
Reset,
|
||||||
|
Measure,
|
||||||
|
Draw
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DynamicContext
|
||||||
|
{
|
||||||
|
internal IPageContext PageContext { get; set; }
|
||||||
|
internal ICanvas Canvas { get; set; }
|
||||||
|
|
||||||
|
public int PageNumber { get; internal set; }
|
||||||
|
public Size AvailableSize { get; internal set; }
|
||||||
|
public DynamicLayoutOperation Operation { get; internal set; }
|
||||||
|
|
||||||
|
public IDynamicElement CreateElement(Action<IContainer> content)
|
||||||
|
{
|
||||||
|
var container = new DynamicElement();
|
||||||
|
content(container);
|
||||||
|
|
||||||
|
container.HandleVisitor(x => x?.Initialize(PageContext, Canvas));
|
||||||
|
container.HandleVisitor(x => (x as IStateResettable)?.ResetState());
|
||||||
|
|
||||||
|
container.Size = container.Measure(AvailableSize);
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IDynamicContainer : IContainer
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DynamicContainer : Container, IDynamicContainer
|
||||||
|
{
|
||||||
|
internal bool HasMoreContent { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DynamicContainerExtensions
|
||||||
|
{
|
||||||
|
public static IDynamicContainer HasMoreContent(this IDynamicContainer container)
|
||||||
|
{
|
||||||
|
(container as DynamicContainer).HasMoreContent = true;
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IDynamicElement : IElement
|
||||||
|
{
|
||||||
|
Size Size { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DynamicElement : ContainerElement, IDynamicElement
|
||||||
|
{
|
||||||
|
public Size Size { get; internal set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ namespace QuestPDF.Elements
|
|||||||
IsRendered = true;
|
IsRendered = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Child?.Draw(availableSpace);
|
base.Draw(availableSpace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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})";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -36,15 +36,22 @@ namespace QuestPDF.Elements
|
|||||||
|
|
||||||
.Decoration(decoration =>
|
.Decoration(decoration =>
|
||||||
{
|
{
|
||||||
decoration.Header().Element(Header);
|
decoration
|
||||||
|
.Header()
|
||||||
|
.DebugPointer("Page header")
|
||||||
|
.Element(Header);
|
||||||
|
|
||||||
decoration
|
decoration
|
||||||
.Content()
|
.Content()
|
||||||
.Element(x => IsClose(MinSize.Width, MaxSize.Width) ? x.ExtendHorizontal() : x)
|
.Element(x => IsClose(MinSize.Width, MaxSize.Width) ? x.ExtendHorizontal() : x)
|
||||||
.Element(x => IsClose(MinSize.Height, MaxSize.Height) ? x.ExtendVertical() : x)
|
.Element(x => IsClose(MinSize.Height, MaxSize.Height) ? x.ExtendVertical() : x)
|
||||||
|
.DebugPointer("Page content")
|
||||||
.Element(Content);
|
.Element(Content);
|
||||||
|
|
||||||
decoration.Footer().Element(Footer);
|
decoration
|
||||||
|
.Footer()
|
||||||
|
.DebugPointer("Page footer")
|
||||||
|
.Element(Footer);
|
||||||
});
|
});
|
||||||
|
|
||||||
bool IsClose(float x, float y)
|
bool IsClose(float x, float y)
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
|
{
|
||||||
|
var leftMeasurement = Left.Measure(new Size(availableSpace.Width, availableSpace.Height));
|
||||||
|
|
||||||
if (leftMeasurement == null)
|
if (leftMeasurement.Type == SpacePlanType.Wrap)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height)) as Size;
|
var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
|
||||||
|
|
||||||
if (rightMeasurement == null)
|
if (rightMeasurement.Type == SpacePlanType.Wrap)
|
||||||
return new 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
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,32 +1,32 @@
|
|||||||
using System;
|
using System;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Infrastructure;
|
using QuestPDF.Infrastructure;
|
||||||
|
|
||||||
namespace QuestPDF.Elements
|
namespace QuestPDF.Elements
|
||||||
{
|
{
|
||||||
internal class SimpleRotate : ContainerElement
|
internal class SimpleRotate : ContainerElement, ICacheable
|
||||||
{
|
{
|
||||||
public int TurnCount { get; set; }
|
public int TurnCount { get; set; }
|
||||||
public int NormalizedTurnCount => (TurnCount % 4 + 4) % 4;
|
public int NormalizedTurnCount => (TurnCount % 4 + 4) % 4;
|
||||||
|
|
||||||
internal override ISpacePlan Measure(Size availableSpace)
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
{
|
{
|
||||||
if (NormalizedTurnCount == 0 || NormalizedTurnCount == 2)
|
if (NormalizedTurnCount == 0 || NormalizedTurnCount == 2)
|
||||||
return base.Measure(availableSpace);
|
return base.Measure(availableSpace);
|
||||||
|
|
||||||
availableSpace = new Size(availableSpace.Height, availableSpace.Width);
|
availableSpace = new Size(availableSpace.Height, availableSpace.Width);
|
||||||
var childSpace = base.Measure(availableSpace) as Size;
|
var childSpace = base.Measure(availableSpace);
|
||||||
|
|
||||||
if (childSpace == null)
|
if (childSpace.Type == SpacePlanType.Wrap)
|
||||||
return new Wrap();
|
return SpacePlan.Wrap();
|
||||||
|
|
||||||
var targetSpace = new Size(childSpace.Height, childSpace.Width);
|
var targetSpace = new Size(childSpace.Height, childSpace.Width);
|
||||||
|
|
||||||
if (childSpace is FullRender)
|
if (childSpace.Type == SpacePlanType.FullRender)
|
||||||
return new FullRender(targetSpace);
|
return SpacePlan.FullRender(targetSpace);
|
||||||
|
|
||||||
if (childSpace is PartialRender)
|
if (childSpace.Type == SpacePlanType.PartialRender)
|
||||||
return new PartialRender(targetSpace);
|
return SpacePlan.PartialRender(targetSpace);
|
||||||
|
|
||||||
throw new ArgumentException();
|
throw new ArgumentException();
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-23
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
@@ -55,7 +55,10 @@ 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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,11 +6,11 @@ namespace QuestPDF.Fluent
|
|||||||
{
|
{
|
||||||
public static class DebugExtensions
|
public static class DebugExtensions
|
||||||
{
|
{
|
||||||
public static IContainer Debug(this IContainer parent, string text, string color)
|
public static IContainer DebugArea(this IContainer parent, string text, string color)
|
||||||
{
|
{
|
||||||
var container = new Container();
|
var container = new Container();
|
||||||
|
|
||||||
parent.Component(new Debug
|
parent.Component(new DebugArea
|
||||||
{
|
{
|
||||||
Child = container,
|
Child = container,
|
||||||
Text = text,
|
Text = text,
|
||||||
@@ -20,14 +20,32 @@ namespace QuestPDF.Fluent
|
|||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IContainer Debug(this IContainer parent, string text)
|
public static IContainer DebugArea(this IContainer parent, string text)
|
||||||
{
|
{
|
||||||
return parent.Debug(text, Colors.Red.Medium);
|
return parent.DebugArea(text, Colors.Red.Medium);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IContainer Debug(this IContainer parent)
|
public static IContainer DebugArea(this IContainer parent)
|
||||||
{
|
{
|
||||||
return parent.Debug(string.Empty, Colors.Red.Medium);
|
return parent.DebugArea(string.Empty, Colors.Red.Medium);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a virtual element that is visible on the elements trace when the layout overflow exception is thrown.
|
||||||
|
/// This can be used to easily identify elements inside the elements trace tree and faster find issue root cause.
|
||||||
|
/// </summary>
|
||||||
|
public static IContainer DebugPointer(this IContainer parent, string elementTraceText)
|
||||||
|
{
|
||||||
|
return parent.DebugPointer(elementTraceText, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static IContainer DebugPointer(this IContainer parent, string elementTraceText, bool highlight)
|
||||||
|
{
|
||||||
|
return parent.Element(new DebugPointer
|
||||||
|
{
|
||||||
|
Target = elementTraceText,
|
||||||
|
Highlight = highlight
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,6 +41,16 @@ namespace QuestPDF.Fluent
|
|||||||
return handler(parent.Container()).Container();
|
return handler(parent.Container()).Container();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void Dynamic<TDynamic>(this IContainer element) where TDynamic : IDynamicComponent, new()
|
||||||
|
{
|
||||||
|
element.Dynamic(new TDynamic());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Dynamic(this IContainer element, IDynamicComponent dynamicElement)
|
||||||
|
{
|
||||||
|
element.Element(new DynamicHost(dynamicElement));
|
||||||
|
}
|
||||||
|
|
||||||
public static IContainer AspectRatio(this IContainer element, float ratio, AspectRatioOption option = AspectRatioOption.FitWidth)
|
public static IContainer AspectRatio(this IContainer element, float ratio, AspectRatioOption option = AspectRatioOption.FitWidth)
|
||||||
{
|
{
|
||||||
return element.Element(new AspectRatio
|
return element.Element(new AspectRatio
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace QuestPDF.Helpers
|
namespace QuestPDF.Helpers
|
||||||
{
|
{
|
||||||
@@ -35,5 +36,10 @@ namespace QuestPDF.Helpers
|
|||||||
var property = selector.ToPropertyInfo() ?? throw new Exception("Expected property with getter and setter.");
|
var property = selector.ToPropertyInfo() ?? throw new Exception("Expected property with getter and setter.");
|
||||||
property?.SetValue(target, value);
|
property?.SetValue(target, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static string PrettifyName(this string text)
|
||||||
|
{
|
||||||
|
return Regex.Replace(text, @"([a-z])([A-Z])", "$1 $2");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,15 +3,21 @@ using QuestPDF.Infrastructure;
|
|||||||
|
|
||||||
namespace QuestPDF.Helpers
|
namespace QuestPDF.Helpers
|
||||||
{
|
{
|
||||||
public class PageSize : Size
|
public class PageSize
|
||||||
{
|
{
|
||||||
public PageSize(float width, float height) : base(width, height)
|
public readonly float Width;
|
||||||
|
public readonly float Height;
|
||||||
|
|
||||||
|
public PageSize(float width, float height)
|
||||||
{
|
{
|
||||||
|
Width = width;
|
||||||
|
Height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static implicit operator Size(PageSize pageSize) => new Size(pageSize.Width, pageSize.Height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PageSizes
|
public struct PageSizes
|
||||||
{
|
{
|
||||||
public const int PointsPerInch = 72;
|
public const int PointsPerInch = 72;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ namespace QuestPDF.Helpers
|
|||||||
{
|
{
|
||||||
public static class Placeholders
|
public static class Placeholders
|
||||||
{
|
{
|
||||||
private static Random Random = new Random();
|
public static readonly Random Random = new Random();
|
||||||
|
|
||||||
#region Word Cache
|
#region Word Cache
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using QuestPDF.Drawing;
|
||||||
using QuestPDF.Elements;
|
using QuestPDF.Elements;
|
||||||
|
|
||||||
namespace QuestPDF.Infrastructure
|
namespace QuestPDF.Infrastructure
|
||||||
@@ -16,13 +16,18 @@ namespace QuestPDF.Infrastructure
|
|||||||
|
|
||||||
internal override void HandleVisitor(Action<Element?> visit)
|
internal override void HandleVisitor(Action<Element?> visit)
|
||||||
{
|
{
|
||||||
base.HandleVisitor(visit);
|
|
||||||
Child?.HandleVisitor(visit);
|
Child?.HandleVisitor(visit);
|
||||||
|
base.HandleVisitor(visit);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal override ISpacePlan Measure(Size availableSpace)
|
internal override void CreateProxy(Func<Element?, Element?> create)
|
||||||
{
|
{
|
||||||
return Child?.Measure(availableSpace) ?? new FullRender(Size.Zero);
|
Child = create(Child);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override SpacePlan Measure(Size availableSpace)
|
||||||
|
{
|
||||||
|
return Child?.Measure(availableSpace) ?? SpacePlan.FullRender(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal override void Draw(Size availableSpace)
|
internal override void Draw(Size availableSpace)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using QuestPDF.Drawing.SpacePlan;
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using QuestPDF.Drawing;
|
||||||
|
|
||||||
namespace QuestPDF.Infrastructure
|
namespace QuestPDF.Infrastructure
|
||||||
{
|
{
|
||||||
@@ -18,8 +20,13 @@ namespace QuestPDF.Infrastructure
|
|||||||
PageContext = pageContext;
|
PageContext = pageContext;
|
||||||
Canvas = canvas;
|
Canvas = canvas;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal virtual void CreateProxy(Func<Element?, Element?> create)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
internal abstract ISpacePlan Measure(Size availableSpace);
|
internal abstract SpacePlan Measure(Size availableSpace);
|
||||||
internal abstract void Draw(Size availableSpace);
|
internal abstract void Draw(Size availableSpace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace QuestPDF.Infrastructure
|
||||||
|
{
|
||||||
|
public interface ICacheable
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using QuestPDF.Elements;
|
||||||
|
|
||||||
|
namespace QuestPDF.Infrastructure
|
||||||
|
{
|
||||||
|
public interface IDynamicComponent
|
||||||
|
{
|
||||||
|
void Compose(DynamicContext context, IDynamicContainer container);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
namespace QuestPDF.Infrastructure
|
namespace QuestPDF.Infrastructure
|
||||||
{
|
{
|
||||||
internal class Position
|
internal readonly struct Position
|
||||||
{
|
{
|
||||||
public float X { get; set; }
|
public readonly float X;
|
||||||
public float Y { get; set; }
|
public readonly float Y;
|
||||||
|
|
||||||
public static Position Zero => new Position(0, 0);
|
public static Position Zero => new Position(0, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
namespace QuestPDF.Infrastructure
|
namespace QuestPDF.Infrastructure
|
||||||
{
|
{
|
||||||
public class Size
|
public readonly struct Size
|
||||||
{
|
{
|
||||||
public const float Epsilon = 0.001f;
|
public const float Epsilon = 0.001f;
|
||||||
|
|
||||||
public float Width { get; }
|
public readonly float Width;
|
||||||
public float Height { get; }
|
public readonly float Height;
|
||||||
|
|
||||||
public static Size Zero => new Size(0, 0);
|
public static Size Zero => new Size(0, 0);
|
||||||
public static Size Max => new Size(14_400, 14_400);
|
public static Size Max => new Size(14_400, 14_400);
|
||||||
@@ -16,27 +16,6 @@
|
|||||||
Height = height;
|
Height = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() => $"(W: {Width}, H: {Height})";
|
public override string ToString() => $"{Width:N2} {Height:N2}";
|
||||||
|
|
||||||
protected bool Equals(Size other)
|
|
||||||
{
|
|
||||||
return Width.Equals(other.Width) && Height.Equals(other.Height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override bool Equals(object? obj)
|
|
||||||
{
|
|
||||||
if (ReferenceEquals(null, obj)) return false;
|
|
||||||
if (ReferenceEquals(this, obj)) return true;
|
|
||||||
if (obj.GetType() != this.GetType()) return false;
|
|
||||||
return Equals((Size) obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override int GetHashCode()
|
|
||||||
{
|
|
||||||
unchecked
|
|
||||||
{
|
|
||||||
return (Width.GetHashCode() * 397) ^ Height.GetHashCode();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user