Compare commits
33 Commits
2021.11
...
styled-box
| Author | SHA1 | Date | |
|---|---|---|---|
| d39819bf8d | |||
| 5f636beb9d | |||
| 10683776bb | |||
| f2c47c4fd3 | |||
| 77b8f04659 | |||
| 5235ada66f | |||
| 4ce66878f2 | |||
| 79cc5f1507 | |||
| 7c7d461c4b | |||
| 63af713935 | |||
| 2419a25cbd | |||
| 014ec15908 | |||
| 82e29d5fdd | |||
| c64754241d | |||
| 9de87061e4 | |||
| 86cfd22316 | |||
| 520bfc840c | |||
| 22cdad69b7 | |||
| d260fa7587 | |||
| 011668fb4c | |||
| 5a886452cf | |||
| 0a6673dd4f | |||
| 525bf534e5 | |||
| 68f050a154 | |||
| 88e58500a8 | |||
| 7980befb77 | |||
| f3b75b43ac | |||
| eca93b7e66 | |||
| 6a3bfd855e | |||
| 5e7f2a3adf | |||
| 2f1dd4b383 | |||
| adec37007b | |||
| 814d325376 |
@@ -0,0 +1,85 @@
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Examples.Engine;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
using Microcharts;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Examples
|
||||
{
|
||||
public class ChartExample
|
||||
{
|
||||
[Test]
|
||||
public void MicrochartChart()
|
||||
{
|
||||
var entries = new[]
|
||||
{
|
||||
new ChartEntry(212)
|
||||
{
|
||||
Label = "UWP",
|
||||
ValueLabel = "112",
|
||||
Color = SKColor.Parse("#2c3e50")
|
||||
},
|
||||
new ChartEntry(248)
|
||||
{
|
||||
Label = "Android",
|
||||
ValueLabel = "648",
|
||||
Color = SKColor.Parse("#77d065")
|
||||
},
|
||||
new ChartEntry(128)
|
||||
{
|
||||
Label = "iOS",
|
||||
ValueLabel = "428",
|
||||
Color = SKColor.Parse("#b455b6")
|
||||
},
|
||||
new ChartEntry(514)
|
||||
{
|
||||
Label = "Forms",
|
||||
ValueLabel = "214",
|
||||
Color = SKColor.Parse("#3498db")
|
||||
}
|
||||
};
|
||||
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(400, 600)
|
||||
.ProduceImages()
|
||||
.ShowResults()
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
.Background(Colors.White)
|
||||
.Padding(25)
|
||||
.Stack(stack =>
|
||||
{
|
||||
stack
|
||||
.Item()
|
||||
.PaddingBottom(10)
|
||||
.Text("Chart example", TextStyle.Default.Size(20).SemiBold().Color(Colors.Blue.Medium));
|
||||
|
||||
stack
|
||||
.Item()
|
||||
.Border(1)
|
||||
.ExtendHorizontal()
|
||||
.Height(300)
|
||||
.Canvas((canvas, size) =>
|
||||
{
|
||||
var chart = new BarChart
|
||||
{
|
||||
Entries = entries,
|
||||
|
||||
LabelOrientation = Orientation.Horizontal,
|
||||
ValueLabelOrientation = Orientation.Horizontal,
|
||||
|
||||
IsAnimated = false,
|
||||
};
|
||||
|
||||
chart.DrawContent(canvas, (int)size.Width, (int)size.Height);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Examples.Engine;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Examples
|
||||
{
|
||||
public class ComplexLayoutBenchmark
|
||||
{
|
||||
[Test]
|
||||
public void ComplexLayout()
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(PageSizes.A4)
|
||||
.ProducePdf()
|
||||
.ShowResults()
|
||||
.Render(x => GenerateStructure(x, 16));
|
||||
}
|
||||
|
||||
private void GenerateStructure(IContainer container, int level)
|
||||
{
|
||||
if (level <= 0)
|
||||
{
|
||||
container.Background(Placeholders.BackgroundColor()).Height(10);
|
||||
return;
|
||||
}
|
||||
|
||||
level--;
|
||||
|
||||
if (level % 3 == 0)
|
||||
{
|
||||
container
|
||||
.Border(level / 4f)
|
||||
.BorderColor(Colors.Black)
|
||||
.Row(row =>
|
||||
{
|
||||
row.RelativeColumn().Element(x => GenerateStructure(x, level));
|
||||
row.RelativeColumn().Element(x => GenerateStructure(x, level));
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
container
|
||||
.Border(level / 4f)
|
||||
.BorderColor(Colors.Black)
|
||||
.Stack(stack =>
|
||||
{
|
||||
stack.Item().Element(x => GenerateStructure(x, level));
|
||||
stack.Item().Element(x => GenerateStructure(x, level));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.Exceptions;
|
||||
using QuestPDF.Examples.Engine;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
|
||||
namespace QuestPDF.Examples
|
||||
{
|
||||
public class DebuggingTesting
|
||||
{
|
||||
[Test]
|
||||
public void Stack()
|
||||
{
|
||||
Assert.Throws<DocumentLayoutException>(() =>
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(500, 360)
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
.Padding(10)
|
||||
.Width(100)
|
||||
.Background(Colors.Grey.Lighten3)
|
||||
.DebugPointer("Example debug pointer")
|
||||
.Stack(x =>
|
||||
{
|
||||
x.Item().Text("Test");
|
||||
x.Item().Width(150);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Simple()
|
||||
{
|
||||
Assert.Throws<DocumentLayoutException>(() =>
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(500, 360)
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
.Padding(10)
|
||||
.Width(100)
|
||||
.Background(Colors.Grey.Lighten3)
|
||||
.Width(150)
|
||||
.Text("Test");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DebugPointer()
|
||||
{
|
||||
Assert.Throws<DocumentLayoutException>(() =>
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(500, 360)
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
.Background(Colors.Grey.Lighten3)
|
||||
.Padding(10)
|
||||
.Width(100)
|
||||
.DebugPointer("Example debug pointer")
|
||||
.Width(150)
|
||||
.Text("Example");
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -148,7 +148,7 @@ namespace QuestPDF.Examples
|
||||
{
|
||||
container
|
||||
.Padding(25)
|
||||
.Debug("Grid example", Colors.Blue.Medium)
|
||||
.DebugArea("Grid example", Colors.Blue.Medium)
|
||||
.Grid(grid =>
|
||||
{
|
||||
grid.Columns(3);
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace QuestPDF.Examples.Engine
|
||||
{
|
||||
private string FileNamePrefix = "test";
|
||||
private Size Size { get; set; }
|
||||
private int? MaxPagesThreshold { get; set; }
|
||||
private bool ShowResult { get; set; }
|
||||
private RenderingTestResult ResultType { get; set; } = RenderingTestResult.Images;
|
||||
|
||||
@@ -77,11 +78,16 @@ namespace QuestPDF.Examples.Engine
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
public void MaxPages(int value)
|
||||
{
|
||||
MaxPagesThreshold = value;
|
||||
}
|
||||
|
||||
public void RenderDocument(Action<IDocumentContainer> content)
|
||||
{
|
||||
var maxPages = ResultType == RenderingTestResult.Pdf ? 1000 : 10;
|
||||
var document = new SimpleDocument(content, maxPages);
|
||||
MaxPagesThreshold ??= ResultType == RenderingTestResult.Pdf ? 1000 : 10;
|
||||
var document = new SimpleDocument(content, MaxPagesThreshold.Value);
|
||||
|
||||
Render(document);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.Exceptions;
|
||||
using QuestPDF.Examples.Engine;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
|
||||
namespace QuestPDF.Examples
|
||||
{
|
||||
public class ImageExamples
|
||||
{
|
||||
[Test]
|
||||
public void LoadingImage()
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(PageSizes.A5)
|
||||
.ProducePdf()
|
||||
.ShowResults()
|
||||
.Render(page =>
|
||||
{
|
||||
page.Padding(25).Stack(stack =>
|
||||
{
|
||||
stack.Spacing(25);
|
||||
|
||||
stack.Item().Image("logo.png");
|
||||
|
||||
var binaryData = File.ReadAllBytes("logo.png");
|
||||
stack.Item().Image(binaryData);
|
||||
|
||||
using var stream = new FileStream("logo.png", FileMode.Open);
|
||||
stack.Item().Image(stream);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Exception()
|
||||
{
|
||||
Assert.Throws<DocumentComposeException>(() =>
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(PageSizes.A2)
|
||||
.ProducePdf()
|
||||
.ShowResults()
|
||||
.Render(page => page.Image("non_existent.png"));
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -87,23 +87,24 @@ namespace QuestPDF.Examples
|
||||
{
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(400, 250)
|
||||
.PageSize(800, 600)
|
||||
.ProduceImages()
|
||||
.ShowResults()
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
.Padding(20)
|
||||
.Box()
|
||||
.Border(1)
|
||||
.Background(Colors.Grey.Lighten3)
|
||||
.Background(Colors.Grey.Lighten4)
|
||||
.Inlined(inlined =>
|
||||
{
|
||||
inlined.VerticalSpacing(50);
|
||||
inlined.HorizontalSpacing(20);
|
||||
inlined.AlignSpaceAround();
|
||||
inlined.BaselineTop();
|
||||
inlined.HorizontalSpacing(25);
|
||||
inlined.AlignRight();
|
||||
inlined.BaselineMiddle();
|
||||
|
||||
foreach (var _ in Enumerable.Range(0, 20))
|
||||
foreach (var _ in Enumerable.Range(0, 100))
|
||||
inlined.Item().Element(RandomBlock);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -36,6 +36,8 @@ namespace QuestPDF.Examples
|
||||
RenderingTest
|
||||
.Create()
|
||||
.PageSize(350, 280)
|
||||
.ProducePdf()
|
||||
.ShowResults()
|
||||
.Render(container =>
|
||||
{
|
||||
container
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="microcharts" Version="0.9.5.9" />
|
||||
<PackageReference Include="nunit" Version="3.13.2" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.4.0" />
|
||||
@@ -23,6 +24,9 @@
|
||||
<None Update="LibreBarcode39-Regular.ttf">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="logo.png">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -86,7 +86,6 @@ namespace QuestPDF.ReportSample
|
||||
return new ReportSectionMap
|
||||
{
|
||||
Label = "Location",
|
||||
ImageSource = Placeholders.Image,
|
||||
Location = Helpers.RandomLocation()
|
||||
};
|
||||
}
|
||||
@@ -96,10 +95,7 @@ namespace QuestPDF.ReportSample
|
||||
return new ReportSectionPhotos
|
||||
{
|
||||
Label = "Photos",
|
||||
Photos = Enumerable
|
||||
.Range(0, Helpers.Random.Next(1, 15))
|
||||
.Select(x => Placeholders.Image(400, 300))
|
||||
.ToList()
|
||||
PhotoCount = Helpers.Random.Next(1, 15)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -107,14 +103,9 @@ namespace QuestPDF.ReportSample
|
||||
{
|
||||
return new ReportPhoto()
|
||||
{
|
||||
PhotoData = Placeholders.Image(800, 600),
|
||||
|
||||
Comments = Placeholders.Sentence(),
|
||||
Date = DateTime.Now - TimeSpan.FromDays(Helpers.Random.NextDouble() * 100),
|
||||
Location = Helpers.RandomLocation(),
|
||||
|
||||
MapContextSource = x => Placeholders.Image(400, 300),
|
||||
MapDetailsSource = x => Placeholders.Image(400, 300)
|
||||
Location = Helpers.RandomLocation()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ namespace QuestPDF.ReportSample
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.ReportSample.Layouts
|
||||
{
|
||||
public class ImagePlaceholder : IComponent
|
||||
{
|
||||
public static bool Solid { get; set; } = false;
|
||||
|
||||
public void Compose(IContainer container)
|
||||
{
|
||||
if (Solid)
|
||||
container.Background(Placeholders.Color());
|
||||
|
||||
else
|
||||
container.Image(Placeholders.Image);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,32 +0,0 @@
|
||||
using System;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.ReportSample.Layouts
|
||||
{
|
||||
public class ImageTemplate : IComponent
|
||||
{
|
||||
private Func<Size, byte[]> Source { get; }
|
||||
private float AspectRatio { get; }
|
||||
|
||||
public ImageTemplate(byte[] source, float aspectRatio = 1.333333f) : this(_ => source, aspectRatio)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ImageTemplate(Func<Size, byte[]> source, float aspectRatio = 1.333333f)
|
||||
{
|
||||
Source = source;
|
||||
AspectRatio = aspectRatio;
|
||||
}
|
||||
|
||||
public void Compose(IContainer container)
|
||||
{
|
||||
container
|
||||
.AspectRatio(AspectRatio)
|
||||
.Background(Colors.Grey.Lighten3)
|
||||
.Image(Source(Size.Zero));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,14 +30,14 @@ namespace QuestPDF.ReportSample.Layouts
|
||||
container
|
||||
.Row(row =>
|
||||
{
|
||||
row.RelativeColumn(2).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
||||
row.RelativeColumn(2).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||
|
||||
row.RelativeColumn().PaddingLeft(5).Stack(stack =>
|
||||
{
|
||||
stack.Spacing(7f);
|
||||
|
||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
||||
stack.Item().AspectRatio(4 / 3f).Image(Placeholders.Image);
|
||||
stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||
stack.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Linq;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
@@ -49,7 +50,7 @@ namespace QuestPDF.ReportSample.Layouts
|
||||
|
||||
void MapElement(IContainer container, ReportSectionMap model)
|
||||
{
|
||||
if (model.ImageSource == null || model.Location == null)
|
||||
if (model.Location == null)
|
||||
{
|
||||
container.Text("No location provided");
|
||||
return;
|
||||
@@ -59,25 +60,28 @@ namespace QuestPDF.ReportSample.Layouts
|
||||
{
|
||||
stack.Spacing(5);
|
||||
|
||||
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Image(Placeholders.Image);
|
||||
stack.Item().MaxWidth(250).AspectRatio(4 / 3f).Component<ImagePlaceholder>();
|
||||
stack.Item().Text(model.Location.Format());
|
||||
});
|
||||
}
|
||||
|
||||
void PhotosElement(IContainer container, ReportSectionPhotos model)
|
||||
{
|
||||
if (model.Photos.Count == 0)
|
||||
if (model.PhotoCount == 0)
|
||||
{
|
||||
container.Text("No photos");
|
||||
container.Text("No photos", Typography.Normal);
|
||||
return;
|
||||
}
|
||||
|
||||
container.Debug("Photos").Grid(grid =>
|
||||
container.DebugArea("Photos").Grid(grid =>
|
||||
{
|
||||
grid.Spacing(5);
|
||||
grid.Columns(3);
|
||||
|
||||
model.Photos.ForEach(x => grid.Item().AspectRatio(4 / 3f).Image(Placeholders.Image));
|
||||
Enumerable
|
||||
.Range(0, model.PhotoCount)
|
||||
.ToList()
|
||||
.ForEach(x => grid.Item().AspectRatio(4 / 3f).Component<ImagePlaceholder>());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace QuestPDF.ReportSample.Layouts
|
||||
row.Spacing(50);
|
||||
|
||||
row.RelativeColumn().PaddingTop(-10).Text(Model.Title, Typography.Title);
|
||||
row.ConstantColumn(150).ExternalLink("https://www.questpdf.com").Image(Model.LogoData);
|
||||
row.ConstantColumn(90).ExternalLink("https://www.questpdf.com").MaxHeight(30).Component<ImagePlaceholder>();
|
||||
});
|
||||
|
||||
stack.Item().ShowOnce().PaddingVertical(15).Border(1f).BorderColor(Colors.Grey.Lighten1).ExtendHorizontal();
|
||||
|
||||
@@ -44,22 +44,16 @@ namespace QuestPDF.ReportSample
|
||||
|
||||
public class ReportSectionMap : ReportSectionElement
|
||||
{
|
||||
public Func<Size, byte[]> ImageSource { get; set; }
|
||||
public Location Location { get; set; }
|
||||
}
|
||||
|
||||
public class ReportSectionPhotos : ReportSectionElement
|
||||
{
|
||||
public List<byte[]> Photos { get; set; }
|
||||
public int PhotoCount { get; set; }
|
||||
}
|
||||
|
||||
public class ReportPhoto
|
||||
{
|
||||
public byte[] PhotoData { get; set; }
|
||||
|
||||
public Func<Size, byte[]> MapDetailsSource { get; set; }
|
||||
public Func<Size, byte[]> MapContextSource { get; set; }
|
||||
|
||||
{
|
||||
public Location Location { get; set; }
|
||||
|
||||
public DateTime? Date { get; set; }
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using BenchmarkDotNet.Attributes;
|
||||
using BenchmarkDotNet.Configs;
|
||||
using BenchmarkDotNet.Engines;
|
||||
using BenchmarkDotNet.Running;
|
||||
using Microsoft.VisualStudio.TestPlatform.TestHost;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Drawing.Proxy;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.ReportSample.Layouts;
|
||||
|
||||
namespace QuestPDF.ReportSample
|
||||
{
|
||||
[SimpleJob(RunStrategy.Monitoring, launchCount: 0, warmupCount: 1, targetCount: 256)]
|
||||
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
|
||||
public class PerformanceTests
|
||||
{
|
||||
private PageContext PageContext { get; set; }
|
||||
private DocumentMetadata Metadata { get; set; }
|
||||
private Container Content { get; set; }
|
||||
|
||||
[Test]
|
||||
public void Run()
|
||||
{
|
||||
ImagePlaceholder.Solid = true;
|
||||
|
||||
var configuration = ManualConfig
|
||||
.Create(DefaultConfig.Instance)
|
||||
.WithOptions(ConfigOptions.DisableOptimizationsValidator);
|
||||
|
||||
BenchmarkRunner.Run<PerformanceTests>(configuration);
|
||||
}
|
||||
|
||||
[IterationSetup]
|
||||
public void GenerateReportData()
|
||||
{
|
||||
ImagePlaceholder.Solid = true;
|
||||
|
||||
var model = DataSource.GetReport();
|
||||
var report = new StandardReport(model);
|
||||
Metadata = report.GetMetadata();
|
||||
|
||||
var documentContainer = new DocumentContainer();
|
||||
report.Compose(documentContainer);
|
||||
Content = documentContainer.Compose();
|
||||
|
||||
PageContext = new PageContext();
|
||||
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
Content.HandleVisitor(x =>
|
||||
{
|
||||
if (x is ICacheable)
|
||||
x.CreateProxy(y => new CacheProxy(y));
|
||||
});
|
||||
|
||||
sw.Stop();
|
||||
Console.WriteLine($"Creating cache took: {sw.ElapsedMilliseconds}");
|
||||
}
|
||||
|
||||
[Benchmark]
|
||||
public void GenerationTest()
|
||||
{
|
||||
DocumentGenerator.RenderPass(PageContext, new FreeCanvas(), Content, Metadata, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,9 +8,10 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="BenchmarkDotNet" Version="0.13.1" />
|
||||
<PackageReference Include="nunit" Version="3.13.2" />
|
||||
<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" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -3,62 +3,54 @@ using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.ReportSample.Layouts;
|
||||
|
||||
namespace QuestPDF.ReportSample
|
||||
{
|
||||
public class ReportGeneration
|
||||
{
|
||||
[Test]
|
||||
public void GenerateAndShow()
|
||||
private StandardReport Report { get; set; }
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
var model = DataSource.GetReport();
|
||||
Report = new StandardReport(model);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void GenerateAndShowPdf()
|
||||
{
|
||||
var reportModel = DataSource.GetReport();
|
||||
var report = new StandardReport(reportModel);
|
||||
|
||||
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.pdf");
|
||||
report.GeneratePdf(path);
|
||||
|
||||
Report.GeneratePdf(path);
|
||||
Process.Start("explorer.exe", path);
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void PerformanceBenchmark()
|
||||
public void GenerateAndShowXps()
|
||||
{
|
||||
// target document length should be around 100 pages
|
||||
var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"test_result.xps");
|
||||
Report.GenerateXps(path);
|
||||
Process.Start("explorer.exe", path);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Profile()
|
||||
{
|
||||
ImagePlaceholder.Solid = true;
|
||||
|
||||
// test size
|
||||
const int testSize = 10;
|
||||
const decimal performanceTarget = 1; // documents per second
|
||||
|
||||
// create report models
|
||||
var reports = Enumerable
|
||||
.Range(0, testSize)
|
||||
.Select(x =>
|
||||
{
|
||||
var reportModel = DataSource.GetReport();
|
||||
return new StandardReport(reportModel);
|
||||
})
|
||||
.ToList();
|
||||
|
||||
// generate documents
|
||||
var sw = new Stopwatch();
|
||||
var container = new DocumentContainer();
|
||||
Report.Compose(container);
|
||||
var content = container.Compose();
|
||||
|
||||
sw.Start();
|
||||
var totalSize = reports.Select(x => x.GeneratePdf()).Sum(x => (long)x.Length);
|
||||
sw.Stop();
|
||||
var metadata = Report.GetMetadata();
|
||||
var pageContext = new PageContext();
|
||||
|
||||
// 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.");
|
||||
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||
DocumentGenerator.RenderPass(pageContext, new FreeCanvas(), content, metadata, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -23,7 +23,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.ExpectChildDraw(new Size(400, 200))
|
||||
.ExpectCanvasTranslate(new Position(-300, -150))
|
||||
@@ -42,7 +42,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.ExpectChildDraw(new Size(100, 50))
|
||||
.ExpectCanvasTranslate(new Position(0, -125))
|
||||
@@ -61,7 +61,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.ExpectChildDraw(new Size(100, 50))
|
||||
.ExpectCanvasTranslate(new Position(-150, -250))
|
||||
@@ -80,7 +80,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.ExpectChildDraw(new Size(100, 50))
|
||||
.ExpectCanvasTranslate(new Position(-300, 0))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -20,8 +20,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 201))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -35,8 +35,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 201))
|
||||
.ExpectChildMeasure(new Size(400, 200), new PartialRender(100, 50))
|
||||
.CheckMeasureResult(new PartialRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -50,8 +50,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 201))
|
||||
.ExpectChildMeasure(new Size(400, 200), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -65,8 +65,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 201))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -80,7 +80,7 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 199))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -94,8 +94,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(401, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -109,7 +109,7 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(399, 200))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -123,8 +123,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -138,8 +138,8 @@ namespace QuestPDF.UnitTests
|
||||
Ratio = 2f
|
||||
})
|
||||
.MeasureElement(new Size(500, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace QuestPDF.UnitTests
|
||||
Color = Colors.Red.Medium
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectCanvasDrawRectangle(new Position(0, 0), new Size(400, 300), Colors.Red.Medium)
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(0, 0), new Size(400, 300), Colors.Red.Medium)
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectCanvasDrawRectangle(new Position(0, 0), new Size(400, 300), Colors.Red.Medium)
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(0, 0), new Size(400, 300), Colors.Red.Medium)
|
||||
.ExpectChildDraw(new Size(400, 300))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using System.Drawing;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
using Size = QuestPDF.Infrastructure.Size;
|
||||
|
||||
namespace QuestPDF.UnitTests
|
||||
{
|
||||
@@ -27,12 +29,34 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new FullRender(new Size(100, 50)))
|
||||
.CheckMeasureResult( new FullRender(new Size(100, 50)));
|
||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.FullRender(new Size(100, 50)))
|
||||
.CheckMeasureResult( SpacePlan.FullRender(new Size(100, 50)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Draw_HorizontalRight_VerticalTop()
|
||||
public void Draw_SameWidths_Optimized()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new Border
|
||||
{
|
||||
Top = 10,
|
||||
Right = 10,
|
||||
Bottom = 10,
|
||||
Left = 10,
|
||||
|
||||
Color = Colors.Red.Medium,
|
||||
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectChildDraw(new Size(400, 300))
|
||||
.ExpectCanvasDrawStrokedRectangle(new Size(400, 300), Colors.Red.Medium, 10)
|
||||
.ExpectChildDraw(new Size(400, 300))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Draw_VariousWidths()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new Border
|
||||
@@ -48,10 +72,10 @@ namespace QuestPDF.UnitTests
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectChildDraw(new Size(400, 300))
|
||||
.ExpectCanvasDrawRectangle(new Position(-20, -5), new Size(430, 10), Colors.Red.Medium) // top
|
||||
.ExpectCanvasDrawRectangle(new Position(-20, -5), new Size(40, 320), Colors.Red.Medium) // left
|
||||
.ExpectCanvasDrawRectangle(new Position(-20, 285), new Size(430, 30), Colors.Red.Medium) // bottom
|
||||
.ExpectCanvasDrawRectangle(new Position(390, -5), new Size(20, 320), Colors.Red.Medium) // right
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(-20, -5), new Size(430, 10), Colors.Red.Medium) // top
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(-20, -5), new Size(40, 320), Colors.Red.Medium) // left
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(-20, 285), new Size(430, 30), Colors.Red.Medium) // bottom
|
||||
.ExpectCanvasDrawFilledRectangle(new Position(390, -5), new Size(20, 320), Colors.Red.Medium) // right
|
||||
.ExpectChildDraw(new Size(400, 300))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -21,7 +21,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: new Wrap())
|
||||
.ExpectChildMeasure(expectedInput: new Size(400, 300), returns: SpacePlan.Wrap())
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
@@ -48,7 +48,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.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))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -20,7 +20,7 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 100
|
||||
})
|
||||
.MeasureElement(new Size(400, 50))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 50))
|
||||
.CheckMeasureResult(new FullRender(400, 100));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 100));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -47,8 +47,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(400, 150))
|
||||
.CheckMeasureResult(new FullRender(400, 150));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(400, 150))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 150));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -60,7 +60,7 @@ namespace QuestPDF.UnitTests
|
||||
MaxHeight = 100
|
||||
})
|
||||
.MeasureElement(new Size(400, 150))
|
||||
.CheckMeasureResult(new FullRender(0, 0));
|
||||
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -73,8 +73,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 100), new PartialRender(400, 75))
|
||||
.CheckMeasureResult(new PartialRender(400, 75));
|
||||
.ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(400, 75))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(400, 75));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -87,8 +87,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 100), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -104,7 +104,7 @@ namespace QuestPDF.UnitTests
|
||||
MinWidth = 100
|
||||
})
|
||||
.MeasureElement(new Size(50, 400))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -117,8 +117,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(200, 400))
|
||||
.ExpectChildMeasure(new Size(200, 400), new FullRender(50, 400))
|
||||
.CheckMeasureResult(new FullRender(100, 400));
|
||||
.ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(50, 400))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(100, 400));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -131,8 +131,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(200, 400))
|
||||
.ExpectChildMeasure(new Size(200, 400), new FullRender(150, 400))
|
||||
.CheckMeasureResult(new FullRender(150, 400));
|
||||
.ExpectChildMeasure(new Size(200, 400), SpacePlan.FullRender(150, 400))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(150, 400));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -144,7 +144,7 @@ namespace QuestPDF.UnitTests
|
||||
MaxWidth = 100
|
||||
})
|
||||
.MeasureElement(new Size(150, 400))
|
||||
.CheckMeasureResult(new FullRender(0, 0));
|
||||
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -157,8 +157,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(200, 400))
|
||||
.ExpectChildMeasure(new Size(100, 400), new PartialRender(75, 400))
|
||||
.CheckMeasureResult(new PartialRender(75, 400));
|
||||
.ExpectChildMeasure(new Size(100, 400), SpacePlan.PartialRender(75, 400))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(75, 400));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -171,8 +171,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(200, 400))
|
||||
.ExpectChildMeasure(new Size(100, 400), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(100, 400), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -15,78 +15,78 @@ namespace QuestPDF.UnitTests
|
||||
public void Measure_ReturnsWrap_WhenDecorationReturnsWrap()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsWrap_WhenDecorationReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), new PartialRender(300, 200))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsWrap_WhenContentReturnsWrap()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenContentReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), new PartialRender(200, 150))
|
||||
.CheckMeasureResult(new PartialRender(400, 250));
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.PartialRender(200, 150))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(400, 250));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsFullRender_WhenContentReturnsFullRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), new FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), new FullRender(200, 150))
|
||||
.CheckMeasureResult(new FullRender(400, 250));
|
||||
.ExpectChildMeasure("decoration", new Size(400, 300), SpacePlan.FullRender(300, 100))
|
||||
.ExpectChildMeasure("content", new Size(400, 200), SpacePlan.FullRender(200, 150))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 250));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -97,14 +97,14 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_Prepend()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Prepend,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.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))
|
||||
.ExpectCanvasTranslate(0, 100)
|
||||
.ExpectChildDraw("content", new Size(400, 200))
|
||||
@@ -116,14 +116,14 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_Append()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleDecoration
|
||||
.For(x => new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
DecorationElement = x.CreateChild("decoration"),
|
||||
ContentElement = x.CreateChild("content")
|
||||
})
|
||||
.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))
|
||||
.ExpectCanvasTranslate(0, 200)
|
||||
.ExpectChildDraw("decoration", new Size(400, 100))
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -20,7 +20,7 @@ namespace QuestPDF.UnitTests
|
||||
Source = GenerateImage
|
||||
})
|
||||
.MeasureElement(new Size(300, 200))
|
||||
.CheckMeasureResult(new FullRender(300, 200));
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -51,7 +51,7 @@ namespace QuestPDF.UnitTests
|
||||
[Test]
|
||||
public void Draw_PassesCorrectSizeToSource()
|
||||
{
|
||||
Size passedSize = null;
|
||||
Size passedSize = default;
|
||||
|
||||
TestPlan
|
||||
.For(x => new DynamicImage
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -19,8 +19,8 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 200
|
||||
})
|
||||
.MeasureElement(new Size(400, 100))
|
||||
.ExpectChildMeasure(new Size(400, 100), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 100), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 200
|
||||
})
|
||||
.MeasureElement(new Size(400, 100))
|
||||
.ExpectChildMeasure(new Size(400, 100), new PartialRender(300, 50))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 100), SpacePlan.PartialRender(300, 50))
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -47,8 +47,8 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 200
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 250))
|
||||
.CheckMeasureResult(new PartialRender(300, 250));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 250))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(300, 250));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -61,8 +61,8 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 200
|
||||
})
|
||||
.MeasureElement(new Size(400, 100))
|
||||
.ExpectChildMeasure(new Size(400, 100), new FullRender(300, 50))
|
||||
.CheckMeasureResult(new FullRender(300, 50));
|
||||
.ExpectChildMeasure(new Size(400, 100), SpacePlan.FullRender(300, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 50));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -75,8 +75,8 @@ namespace QuestPDF.UnitTests
|
||||
MinHeight = 200
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(300, 250))
|
||||
.CheckMeasureResult(new FullRender(300, 250));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 250))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 250));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -18,8 +18,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
|
||||
ExtendVertical = true
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new PartialRender(300, 100))
|
||||
.CheckMeasureResult(new PartialRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.PartialRender(300, 100))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -48,8 +48,8 @@ namespace QuestPDF.UnitTests
|
||||
ExtendVertical = true
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(300, 100))
|
||||
.CheckMeasureResult(new FullRender(400, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(300, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -63,8 +63,8 @@ namespace QuestPDF.UnitTests
|
||||
ExtendVertical = false
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
|
||||
.CheckMeasureResult(new FullRender(400, 100));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(400, 100));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -78,8 +78,8 @@ namespace QuestPDF.UnitTests
|
||||
ExtendVertical = true
|
||||
})
|
||||
.MeasureElement(new Size(400, 200))
|
||||
.ExpectChildMeasure(new Size(400, 200), new FullRender(100, 100))
|
||||
.CheckMeasureResult(new FullRender(100, 200));
|
||||
.ExpectChildMeasure(new Size(400, 200), SpacePlan.FullRender(100, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(100, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Infrastructure;
|
||||
@@ -20,7 +20,7 @@ namespace QuestPDF.UnitTests
|
||||
InternalImage = GenerateImage(400, 300)
|
||||
})
|
||||
.MeasureElement(new Size(300, 200))
|
||||
.CheckMeasureResult(new FullRender(300, 200));
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -49,7 +49,7 @@ namespace QuestPDF.UnitTests
|
||||
return container;
|
||||
})
|
||||
.MeasureElement(new Size(300, 200))
|
||||
.CheckMeasureResult(new FullRender(300, 100));;
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 100));;
|
||||
}
|
||||
|
||||
SKImage GenerateImage(int width, int height)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -45,8 +45,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -55,8 +55,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(700, 500))
|
||||
.CheckMeasureResult(new PartialRender(700, 500));
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(700, 500))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(700, 500));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -65,8 +65,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new FullRender(500, 400))
|
||||
.CheckMeasureResult(new FullRender(500, 400));
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.FullRender(500, 400))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(500, 400));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -80,9 +80,9 @@ namespace QuestPDF.UnitTests
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new FullRender(100, 200))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new FullRender(300, 400))
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.FullRender(100, 200))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.FullRender(300, 400))
|
||||
|
||||
|
||||
.ExpectChildDraw(BackgroundLayer, new Size(800, 600))
|
||||
@@ -99,9 +99,9 @@ namespace QuestPDF.UnitTests
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new PartialRender(100, 200))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new Wrap())
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.PartialRender(100, 200))
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||
|
||||
.ExpectChildDraw(BackgroundLayer, new Size(800, 600))
|
||||
.ExpectChildDraw(MainLayer, new Size(800, 600))
|
||||
@@ -116,9 +116,9 @@ namespace QuestPDF.UnitTests
|
||||
.For(GetLayers)
|
||||
.MeasureElement(new Size(800, 600))
|
||||
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), new Wrap())
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), new PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), new PartialRender(300, 400))
|
||||
.ExpectChildMeasure(BackgroundLayer, new Size(800, 600), SpacePlan.Wrap())
|
||||
.ExpectChildMeasure(MainLayer, new Size(800, 600), SpacePlan.PartialRender(200, 300))
|
||||
.ExpectChildMeasure(ForegroundLayer, new Size(800, 600), SpacePlan.PartialRender(300, 400))
|
||||
|
||||
.ExpectChildDraw(MainLayer, new Size(800, 600))
|
||||
.ExpectChildDraw(ForegroundLayer, new Size(800, 600))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -28,8 +28,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetPadding)
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(340, 260), new FullRender(140, 60))
|
||||
.CheckMeasureResult(new FullRender(200, 100));
|
||||
.ExpectChildMeasure(new Size(340, 260), SpacePlan.FullRender(140, 60))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(200, 100));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -38,7 +38,7 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetPadding)
|
||||
.MeasureElement(new Size(50, 300))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -47,7 +47,7 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetPadding)
|
||||
.MeasureElement(new Size(20, 300))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -56,8 +56,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetPadding)
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(340, 260), new PartialRender(40, 160))
|
||||
.CheckMeasureResult(new PartialRender(100, 200));
|
||||
.ExpectChildMeasure(new Size(340, 260), SpacePlan.PartialRender(40, 160))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(100, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -66,8 +66,8 @@ namespace QuestPDF.UnitTests
|
||||
TestPlan
|
||||
.For(GetPadding)
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(340, 260), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(340, 260), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -16,13 +16,13 @@ namespace QuestPDF.UnitTests
|
||||
.For(x => new PageBreak())
|
||||
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.CheckMeasureResult(new PartialRender(Size.Zero))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(Size.Zero))
|
||||
|
||||
.DrawElement(new Size(400, 300))
|
||||
.CheckDrawResult()
|
||||
|
||||
.MeasureElement(new Size(500, 400))
|
||||
.CheckMeasureResult(new FullRender(Size.Zero));
|
||||
.CheckMeasureResult(SpacePlan.FullRender(0, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Infrastructure;
|
||||
@@ -16,74 +16,74 @@ namespace QuestPDF.UnitTests
|
||||
public void Measure_ReturnsWrap_WhenLeftChildReturnsWrap()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("left", new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsWrap_WhenRightChildReturnsWrap()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenLeftChildReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("left", new Size(400, 300), new PartialRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), new FullRender(100, 100))
|
||||
.CheckMeasureResult(new PartialRender(350, 150));
|
||||
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.PartialRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.FullRender(100, 100))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(350, 150));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenRightChildReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), new PartialRender(100, 100))
|
||||
.CheckMeasureResult(new PartialRender(350, 150));
|
||||
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||
.ExpectChildMeasure("right", new Size(150, 300), SpacePlan.PartialRender(100, 100))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(350, 150));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsFullRender_WhenBothChildrenReturnFullRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("left", new Size(400, 300), new FullRender(200, 150))
|
||||
.ExpectChildMeasure("right", new Size(200, 300), new FullRender(100, 100))
|
||||
.CheckMeasureResult(new FullRender(300, 150));
|
||||
.ExpectChildMeasure("left", new Size(400, 300), SpacePlan.FullRender(200, 150))
|
||||
.ExpectChildMeasure("right", new Size(200, 300), SpacePlan.FullRender(100, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 150));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -94,13 +94,13 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleRow
|
||||
.For(x => new BinaryRow
|
||||
{
|
||||
Left = x.CreateChild("left"),
|
||||
Right = x.CreateChild("right")
|
||||
})
|
||||
.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))
|
||||
.ExpectCanvasTranslate(250, 0)
|
||||
.ExpectChildDraw("right", new Size(150, 300))
|
||||
@@ -184,11 +184,11 @@ namespace QuestPDF.UnitTests
|
||||
});
|
||||
|
||||
// assert
|
||||
var expected = new SimpleRow
|
||||
var expected = new BinaryRow
|
||||
{
|
||||
Left = new SimpleRow
|
||||
Left = new BinaryRow
|
||||
{
|
||||
Left = new SimpleRow
|
||||
Left = new BinaryRow
|
||||
{
|
||||
Left = new Constrained
|
||||
{
|
||||
@@ -202,7 +202,7 @@ namespace QuestPDF.UnitTests
|
||||
MaxWidth = 25
|
||||
}
|
||||
},
|
||||
Right = new SimpleRow
|
||||
Right = new BinaryRow
|
||||
{
|
||||
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
|
||||
{
|
||||
@@ -233,7 +233,7 @@ namespace QuestPDF.UnitTests
|
||||
MaxWidth = 25
|
||||
}
|
||||
},
|
||||
Right = new SimpleRow
|
||||
Right = new BinaryRow
|
||||
{
|
||||
Left = new Constrained
|
||||
{
|
||||
@@ -241,7 +241,7 @@ namespace QuestPDF.UnitTests
|
||||
MaxWidth = 200,
|
||||
Child = childD
|
||||
},
|
||||
Right = new SimpleRow
|
||||
Right = new BinaryRow
|
||||
{
|
||||
Left = new Constrained
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -22,8 +22,8 @@ namespace QuestPDF.UnitTests
|
||||
ScaleY = 2
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(new Size(300, 400), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(300, 400), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -37,8 +37,8 @@ namespace QuestPDF.UnitTests
|
||||
ScaleY = 2
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(new Size(300, 400), new PartialRender(200, 350))
|
||||
.CheckMeasureResult(new PartialRender(600, 700));
|
||||
.ExpectChildMeasure(new Size(300, 400), SpacePlan.PartialRender(200, 350))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(600, 700));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -52,8 +52,8 @@ namespace QuestPDF.UnitTests
|
||||
ScaleY = 2
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(new Size(300, 400), new FullRender(250, 300))
|
||||
.CheckMeasureResult(new FullRender(750, 600));
|
||||
.ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(250, 300))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(750, 600));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -67,8 +67,8 @@ namespace QuestPDF.UnitTests
|
||||
ScaleY = 1
|
||||
})
|
||||
.MeasureElement(new Size(800, 600))
|
||||
.ExpectChildMeasure(new Size(400, 600), new FullRender(300, 500))
|
||||
.CheckMeasureResult(new FullRender(600, 500));
|
||||
.ExpectChildMeasure(new Size(400, 600), SpacePlan.FullRender(300, 500))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(600, 500));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -82,8 +82,8 @@ namespace QuestPDF.UnitTests
|
||||
ScaleY = -3
|
||||
})
|
||||
.MeasureElement(new Size(800, 600))
|
||||
.ExpectChildMeasure(new Size(800, 200), new FullRender(800, 100))
|
||||
.CheckMeasureResult(new FullRender(800, 300));
|
||||
.ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(800, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(800, 300));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -18,8 +18,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -31,8 +31,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 200))
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -44,8 +44,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(300, 200))
|
||||
.CheckMeasureResult(new FullRender(300, 200));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(300, 200))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -20,31 +20,31 @@ namespace QuestPDF.UnitTests
|
||||
|
||||
// Measure the element and return result
|
||||
.MeasureElement(new Size(300, 200))
|
||||
.ExpectChildMeasure("child", new Size(300, 200), new PartialRender(new Size(200, 200)))
|
||||
.CheckMeasureResult(new PartialRender(new Size(200, 200)))
|
||||
.ExpectChildMeasure("child", new Size(300, 200), SpacePlan.PartialRender(new Size(200, 200)))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(new Size(200, 200)))
|
||||
|
||||
// Draw element partially
|
||||
.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))
|
||||
.CheckDrawResult()
|
||||
|
||||
// Element was not fully drawn
|
||||
// It should be measured again for rendering on next page
|
||||
.MeasureElement(new Size(800, 200))
|
||||
.ExpectChildMeasure(new Size(800, 200), new FullRender(new Size(400, 200)))
|
||||
.CheckMeasureResult(new FullRender(new Size(400, 200)))
|
||||
.ExpectChildMeasure(new Size(800, 200), SpacePlan.FullRender(new Size(400, 200)))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(new Size(400, 200)))
|
||||
|
||||
// Draw element on next page
|
||||
// Element was fully drawn at this point
|
||||
.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))
|
||||
.CheckDrawResult()
|
||||
|
||||
// In the next attempt of measuring element, it should behave like empty parent.
|
||||
.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
|
||||
.DrawElement(new Size(600, 200))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -21,8 +21,8 @@ namespace QuestPDF.UnitTests
|
||||
TurnCount = 0
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -35,8 +35,8 @@ namespace QuestPDF.UnitTests
|
||||
TurnCount = 0
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(300, 200))
|
||||
.CheckMeasureResult(new PartialRender(300, 200));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -49,8 +49,8 @@ namespace QuestPDF.UnitTests
|
||||
TurnCount = 1
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(300, 400), new FullRender(200, 300))
|
||||
.CheckMeasureResult(new FullRender(300, 200));
|
||||
.ExpectChildMeasure(new Size(300, 400), SpacePlan.FullRender(200, 300))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -63,8 +63,8 @@ namespace QuestPDF.UnitTests
|
||||
TurnCount = 2
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(200, 100))
|
||||
.CheckMeasureResult(new FullRender(200, 100));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(200, 100));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -77,8 +77,8 @@ namespace QuestPDF.UnitTests
|
||||
TurnCount = 3 // or -1
|
||||
})
|
||||
.MeasureElement(new Size(500, 400))
|
||||
.ExpectChildMeasure(new Size(400, 500), new FullRender(300, 350))
|
||||
.CheckMeasureResult(new FullRender(350, 300));
|
||||
.ExpectChildMeasure(new Size(400, 500), SpacePlan.FullRender(300, 350))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(350, 300));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Infrastructure;
|
||||
@@ -17,80 +16,80 @@ namespace QuestPDF.UnitTests
|
||||
public void Measure_ReturnsWrap_WhenFirstChildWraps()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenFirstChildReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new PartialRender(300, 200))
|
||||
.CheckMeasureResult(new PartialRender(300, 200));
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.PartialRender(300, 200))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(300, 200));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenSecondChildWraps()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new Wrap())
|
||||
.CheckMeasureResult(new PartialRender(200, 100));
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(200, 100));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsPartialRender_WhenSecondChildReturnsPartialRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new PartialRender(300, 150))
|
||||
.CheckMeasureResult(new PartialRender(300, 250));
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(300, 150))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(300, 250));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_ReturnsFullRender_WhenSecondChildReturnsFullRender()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new FullRender(100, 50))
|
||||
.CheckMeasureResult(new FullRender(200, 150));
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.FullRender(200, 100))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(100, 50))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(200, 150));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void Measure_UsesEmpty_WhenFirstChildIsRendered()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second"),
|
||||
@@ -98,8 +97,8 @@ namespace QuestPDF.UnitTests
|
||||
IsFirstRendered = true
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("second", new Size(400, 300), new FullRender(200, 300))
|
||||
.CheckMeasureResult(new FullRender(200, 300));
|
||||
.ExpectChildMeasure("second", new Size(400, 300), SpacePlan.FullRender(200, 300))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(200, 300));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -110,13 +109,13 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_WhenFirstChildWraps()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.DrawElement(new Size(400, 300))
|
||||
.ExpectChildMeasure("first", new Size(400, 300), new Wrap())
|
||||
.ExpectChildMeasure("first", new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -124,13 +123,13 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_WhenFirstChildPartiallyRenders()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.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))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
@@ -139,15 +138,15 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildWraps()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.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))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new Wrap())
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.Wrap())
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -155,15 +154,15 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildPartiallyRenders()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.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))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new PartialRender(250, 150))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.PartialRender(250, 150))
|
||||
.ExpectCanvasTranslate(0, 100)
|
||||
.ExpectChildDraw("second", new Size(400, 150))
|
||||
.ExpectCanvasTranslate(0, -100)
|
||||
@@ -174,15 +173,15 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_WhenFirstChildFullyRenders_AndSecondChildFullyRenders()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second")
|
||||
})
|
||||
.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))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), new FullRender(250, 150))
|
||||
.ExpectChildMeasure("second", new Size(400, 200), SpacePlan.FullRender(250, 150))
|
||||
.ExpectCanvasTranslate(0, 100)
|
||||
.ExpectChildDraw("second", new Size(400, 150))
|
||||
.ExpectCanvasTranslate(0, -100)
|
||||
@@ -193,7 +192,7 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_UsesEmpty_WhenFirstChildIsRendered()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second"),
|
||||
@@ -201,11 +200,11 @@ namespace QuestPDF.UnitTests
|
||||
IsFirstRendered = true
|
||||
})
|
||||
.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)
|
||||
.ExpectChildDraw("second", new Size(400, 300))
|
||||
.ExpectCanvasTranslate(0, 0)
|
||||
.CheckState<SimpleStack>(x => x.IsFirstRendered)
|
||||
.CheckState<BinaryStack>(x => x.IsFirstRendered)
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -213,7 +212,7 @@ namespace QuestPDF.UnitTests
|
||||
public void Draw_TogglesFirstRenderedFlag_WhenSecondFullyRenders()
|
||||
{
|
||||
TestPlan
|
||||
.For(x => new SimpleStack
|
||||
.For(x => new BinaryStack
|
||||
{
|
||||
First = x.CreateChild("first"),
|
||||
Second = x.CreateChild("second"),
|
||||
@@ -221,12 +220,12 @@ namespace QuestPDF.UnitTests
|
||||
IsFirstRendered = true
|
||||
})
|
||||
.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)
|
||||
.ExpectChildDraw("second", new Size(400, 300))
|
||||
.ExpectCanvasTranslate(0, 0)
|
||||
.CheckDrawResult()
|
||||
.CheckState<SimpleStack>(x => !x.IsFirstRendered);
|
||||
.CheckState<BinaryStack>(x => !x.IsFirstRendered);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -264,9 +263,9 @@ namespace QuestPDF.UnitTests
|
||||
{
|
||||
Bottom = -spacing,
|
||||
|
||||
Child = new SimpleStack
|
||||
Child = new BinaryStack
|
||||
{
|
||||
First = new SimpleStack
|
||||
First = new BinaryStack
|
||||
{
|
||||
First = new Padding
|
||||
{
|
||||
@@ -279,14 +278,14 @@ namespace QuestPDF.UnitTests
|
||||
Child = childB
|
||||
}
|
||||
},
|
||||
Second = new SimpleStack
|
||||
Second = new BinaryStack
|
||||
{
|
||||
First = new Padding
|
||||
{
|
||||
Bottom = spacing,
|
||||
Child = childC
|
||||
},
|
||||
Second = new SimpleStack
|
||||
Second = new BinaryStack
|
||||
{
|
||||
First = new Padding
|
||||
{
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.UnitTests.TestEngine
|
||||
@@ -7,10 +7,10 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
internal class ElementMock : Element
|
||||
{
|
||||
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; }
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
|
||||
internal override SpacePlan Measure(Size availableSpace) => MeasureFunc(availableSpace);
|
||||
internal override void Draw(Size availableSpace) => DrawFunc(availableSpace);
|
||||
}
|
||||
}
|
||||
@@ -11,13 +11,15 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
public Action<float, float> ScaleFunc { get; set; }
|
||||
public Action<SKImage, Position, Size> DrawImageFunc { get; set; }
|
||||
public Action<string, Position, TextStyle> DrawTextFunc { get; set; }
|
||||
public Action<Position, Size, string> DrawRectFunc { get; set; }
|
||||
public Action<Position, Size, string> DrawFilledRectangleFunc { get; set; }
|
||||
public Action<Size, string, float> DrawStrokedRectangleFunc { get; set; }
|
||||
|
||||
public void Translate(Position vector) => TranslateFunc(vector);
|
||||
public void Rotate(float angle) => RotateFunc(angle);
|
||||
public void Scale(float scaleX, float scaleY) => ScaleFunc(scaleX, scaleY);
|
||||
|
||||
public void DrawRectangle(Position vector, Size size, string color) => DrawRectFunc(vector, size, color);
|
||||
public void DrawFilledRectangle(Position vector, Size size, string color) => DrawFilledRectangleFunc(vector, size, color);
|
||||
public void DrawStrokedRectangle(Size size, string color, float width) => DrawStrokedRectangleFunc(size, color, width);
|
||||
public void DrawText(string text, Position position, TextStyle style) => DrawTextFunc(text, position, style);
|
||||
public void DrawImage(SKImage image, Position position, Size size) => DrawImageFunc(image, position, size);
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
public void Rotate(float angle) => Operations.Add(new CanvasRotateOperation(angle));
|
||||
public void Scale(float scaleX, float scaleY) => Operations.Add(new CanvasScaleOperation(scaleX, scaleY));
|
||||
|
||||
public void DrawRectangle(Position vector, Size size, string color) => Operations.Add(new CanvasDrawRectangleOperation(vector, size, color));
|
||||
public void DrawFilledRectangle(Position vector, Size size, string color) => Operations.Add(new CanvasDrawFilledRectangleOperation(vector, size, color));
|
||||
public void DrawStrokedRectangle(Size size, string color, float width) => Operations.Add(new CanvasDrawStrokedRectangleOperation(size, color, width));
|
||||
public void DrawText(string text, Position position, TextStyle style) => Operations.Add(new CanvasDrawTextOperation(text, position, style));
|
||||
public void DrawImage(SKImage image, Position position, Size size) => Operations.Add(new CanvasDrawImageOperation(position, size));
|
||||
|
||||
|
||||
+2
-2
@@ -2,13 +2,13 @@
|
||||
|
||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||
{
|
||||
internal class CanvasDrawRectangleOperation : OperationBase
|
||||
internal class CanvasDrawFilledRectangleOperation : OperationBase
|
||||
{
|
||||
public Position Position { get; }
|
||||
public Size Size { get; }
|
||||
public string Color { get; }
|
||||
|
||||
public CanvasDrawRectangleOperation(Position position, Size size, string color)
|
||||
public CanvasDrawFilledRectangleOperation(Position position, Size size, string color)
|
||||
{
|
||||
Position = position;
|
||||
Size = size;
|
||||
@@ -0,0 +1,18 @@
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||
{
|
||||
internal class CanvasDrawStrokedRectangleOperation : OperationBase
|
||||
{
|
||||
public Size Size { get; }
|
||||
public string Color { get; }
|
||||
public float Width { get; set; }
|
||||
|
||||
public CanvasDrawStrokedRectangleOperation(Size size, string color, float width)
|
||||
{
|
||||
Size = size;
|
||||
Color = color;
|
||||
Width = width;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||
@@ -7,9 +7,9 @@ namespace QuestPDF.UnitTests.TestEngine.Operations
|
||||
{
|
||||
public string ChildId { 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;
|
||||
Input = input;
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.UnitTests.TestEngine
|
||||
@@ -23,8 +22,8 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
private static void Measure_PartialRender<TElement>() where TElement : Element, IContainer, new()
|
||||
@@ -35,8 +34,8 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new PartialRender(200, 100))
|
||||
.CheckMeasureResult(new PartialRender(200, 100));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.PartialRender(200, 100))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(200, 100));
|
||||
}
|
||||
|
||||
private static void Measure_FullRender<TElement>() where TElement : Element, IContainer, new()
|
||||
@@ -47,8 +46,8 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(400, 300))
|
||||
.ExpectChildMeasure(new Size(400, 300), new FullRender(250, 150))
|
||||
.CheckMeasureResult(new FullRender(250, 150));
|
||||
.ExpectChildMeasure(new Size(400, 300), SpacePlan.FullRender(250, 150))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(250, 150));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -4,7 +4,6 @@ using System.Text.Json;
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
@@ -71,17 +70,27 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
Assert.AreEqual(expected.ScaleX, scaleX, "Scale X");
|
||||
Assert.AreEqual(expected.ScaleY, scaleY, "Scale Y");
|
||||
},
|
||||
DrawRectFunc = (position, size, color) =>
|
||||
DrawFilledRectangleFunc = (position, size, color) =>
|
||||
{
|
||||
var expected = GetExpected<CanvasDrawRectangleOperation>();
|
||||
var expected = GetExpected<CanvasDrawFilledRectangleOperation>();
|
||||
|
||||
Assert.AreEqual(expected.Position.X, position.X, "Draw rectangle: X");
|
||||
Assert.AreEqual(expected.Position.Y, position.Y, "Draw rectangle: Y");
|
||||
Assert.AreEqual(expected.Position.X, position.X, "Draw filled rectangle: X");
|
||||
Assert.AreEqual(expected.Position.Y, position.Y, "Draw filled rectangle: Y");
|
||||
|
||||
Assert.AreEqual(expected.Size.Width, size.Width, "Draw rectangle: width");
|
||||
Assert.AreEqual(expected.Size.Height, size.Height, "Draw rectangle: height");
|
||||
Assert.AreEqual(expected.Size.Width, size.Width, "Draw filled rectangle: width");
|
||||
Assert.AreEqual(expected.Size.Height, size.Height, "Draw filled rectangle: height");
|
||||
|
||||
Assert.AreEqual(expected.Color, color, "Draw rectangle: color");
|
||||
Assert.AreEqual(expected.Color, color, "Draw filled rectangle: color");
|
||||
},
|
||||
DrawStrokedRectangleFunc = (size, color, width) =>
|
||||
{
|
||||
var expected = GetExpected<CanvasDrawStrokedRectangleOperation>();
|
||||
|
||||
Assert.AreEqual(expected.Size.Width, size.Width, "Draw stroked rectangle: width");
|
||||
Assert.AreEqual(expected.Size.Height, size.Height, "Draw stroked rectangle: height");
|
||||
|
||||
Assert.AreEqual(expected.Color, color, "Draw stroked rectangle: color");
|
||||
Assert.AreEqual(expected.Width, width, "Draw stroked rectangle: width");
|
||||
},
|
||||
DrawTextFunc = (text, position, style) =>
|
||||
{
|
||||
@@ -157,12 +166,12 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
return this;
|
||||
}
|
||||
|
||||
public TestPlan ExpectChildMeasure(Size expectedInput, ISpacePlan returns)
|
||||
public TestPlan ExpectChildMeasure(Size expectedInput, SpacePlan 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));
|
||||
}
|
||||
@@ -197,9 +206,14 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
return AddOperation(new CanvasRotateOperation(angle));
|
||||
}
|
||||
|
||||
public TestPlan ExpectCanvasDrawRectangle(Position position, Size size, string color)
|
||||
public TestPlan ExpectCanvasDrawFilledRectangle(Position position, Size size, string color)
|
||||
{
|
||||
return AddOperation(new CanvasDrawRectangleOperation(position, size, color));
|
||||
return AddOperation(new CanvasDrawFilledRectangleOperation(position, size, color));
|
||||
}
|
||||
|
||||
public TestPlan ExpectCanvasDrawStrokedRectangle(Size size, string color, float width)
|
||||
{
|
||||
return AddOperation(new CanvasDrawStrokedRectangleOperation(size, color, width));
|
||||
}
|
||||
|
||||
public TestPlan ExpectCanvasDrawText(string text, Position position, TextStyle style)
|
||||
@@ -212,22 +226,17 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
return AddOperation(new CanvasDrawImageOperation(position, size));
|
||||
}
|
||||
|
||||
public TestPlan CheckMeasureResult(ISpacePlan expected)
|
||||
public TestPlan CheckMeasureResult(SpacePlan expected)
|
||||
{
|
||||
Element.HandleVisitor(x => x?.Initialize(null, Canvas));
|
||||
|
||||
var actual = Element.Measure(OperationInput);
|
||||
|
||||
Assert.AreEqual(expected.GetType(), actual.GetType());
|
||||
|
||||
var expectedSize = expected as Size;
|
||||
var actualSize = actual as Size;
|
||||
|
||||
if (expectedSize != null)
|
||||
{
|
||||
Assert.AreEqual(expectedSize.Width, actualSize.Width, "Measure: width");
|
||||
Assert.AreEqual(expectedSize.Height, actualSize.Height, "Measure: height");
|
||||
}
|
||||
|
||||
Assert.AreEqual(expected.Width, actual.Width, "Measure: width");
|
||||
Assert.AreEqual(expected.Height, actual.Height, "Measure: height");
|
||||
Assert.AreEqual(expected.Type, actual.Type, "Measure: height");
|
||||
|
||||
return this;
|
||||
}
|
||||
@@ -278,10 +287,10 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
|
||||
var canvas = new FreeCanvas();
|
||||
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));
|
||||
var expectedMeasure = expected.Measure(availableSpace);
|
||||
var expectedMeasure = expected.Measure(availableSpace.Value);
|
||||
|
||||
valueMeasure.Should().BeEquivalentTo(expectedMeasure);
|
||||
}
|
||||
@@ -292,11 +301,11 @@ namespace QuestPDF.UnitTests.TestEngine
|
||||
|
||||
var valueCanvas = new OperationRecordingCanvas();
|
||||
value.HandleVisitor(x => x.Initialize(null, valueCanvas));
|
||||
value.Draw(availableSpace);
|
||||
value.Draw(availableSpace.Value);
|
||||
|
||||
var expectedCanvas = new OperationRecordingCanvas();
|
||||
expected.HandleVisitor(x => x.Initialize(null, expectedCanvas));
|
||||
expected.Draw(availableSpace);
|
||||
expected.Draw(availableSpace.Value);
|
||||
|
||||
valueCanvas.Operations.Should().BeEquivalentTo(expectedCanvas.Operations);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using NUnit.Framework;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.UnitTests.TestEngine;
|
||||
@@ -20,8 +20,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new Wrap())
|
||||
.CheckMeasureResult(new Wrap());
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
|
||||
.CheckMeasureResult(SpacePlan.Wrap());
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -33,8 +33,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new PartialRender(1200, 1600))
|
||||
.CheckMeasureResult(new PartialRender(Size.Zero));
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
|
||||
.CheckMeasureResult(SpacePlan.PartialRender(Size.Zero));
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -46,8 +46,8 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.MeasureElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new FullRender(1200, 1600))
|
||||
.CheckMeasureResult(new FullRender(Size.Zero));
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1200, 1600))
|
||||
.CheckMeasureResult(SpacePlan.FullRender(Size.Zero));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -63,7 +63,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new Wrap())
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.Wrap())
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new PartialRender(1200, 1600))
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.PartialRender(1200, 1600))
|
||||
.ExpectChildDraw(new Size(1200, 1600))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
@@ -90,7 +90,7 @@ namespace QuestPDF.UnitTests
|
||||
Child = x.CreateChild()
|
||||
})
|
||||
.DrawElement(new Size(900, 800))
|
||||
.ExpectChildMeasure(Size.Max, new FullRender(1600, 1000))
|
||||
.ExpectChildMeasure(Size.Max, SpacePlan.FullRender(1600, 1000))
|
||||
.ExpectChildDraw(new Size(1600, 1000))
|
||||
.CheckDrawResult();
|
||||
}
|
||||
|
||||
@@ -2,4 +2,5 @@
|
||||
|
||||
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
|
||||
[assembly: InternalsVisibleTo("QuestPDF.UnitTests")]
|
||||
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
||||
[assembly: InternalsVisibleTo("QuestPDF.Examples")]
|
||||
[assembly: InternalsVisibleTo("QuestPDF.ReportSample")]
|
||||
@@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using QuestPDF.Drawing.Exceptions;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing.Proxy;
|
||||
using QuestPDF.Elements;
|
||||
using QuestPDF.Elements.Text;
|
||||
using QuestPDF.Elements.Text.Items;
|
||||
@@ -20,6 +20,13 @@ namespace QuestPDF.Drawing
|
||||
RenderDocument(canvas, document);
|
||||
}
|
||||
|
||||
internal static void GenerateXps(Stream stream, IDocument document)
|
||||
{
|
||||
var metadata = document.GetMetadata();
|
||||
var canvas = new XpsCanvas(stream, metadata);
|
||||
RenderDocument(canvas, document);
|
||||
}
|
||||
|
||||
internal static ICollection<byte[]> GenerateImages(IDocument document)
|
||||
{
|
||||
var metadata = document.GetMetadata();
|
||||
@@ -39,11 +46,16 @@ namespace QuestPDF.Drawing
|
||||
var metadata = document.GetMetadata();
|
||||
var pageContext = new PageContext();
|
||||
|
||||
RenderPass(pageContext, new FreeCanvas(), content, metadata);
|
||||
RenderPass(pageContext, canvas, content, metadata);
|
||||
var debuggingState = metadata.ApplyDebugging ? ApplyDebugging(content) : null;
|
||||
|
||||
if (metadata.ApplyCaching)
|
||||
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
|
||||
{
|
||||
content.HandleVisitor(x => x?.Initialize(pageContext, canvas));
|
||||
@@ -56,9 +68,11 @@ namespace QuestPDF.Drawing
|
||||
while(true)
|
||||
{
|
||||
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();
|
||||
ThrowLayoutException();
|
||||
@@ -83,25 +97,50 @@ namespace QuestPDF.Drawing
|
||||
ThrowLayoutException();
|
||||
}
|
||||
|
||||
if (spacePlan is FullRender)
|
||||
if (spacePlan.Type == SpacePlanType.FullRender)
|
||||
break;
|
||||
|
||||
currentPage++;
|
||||
}
|
||||
|
||||
canvas.EndDocument();
|
||||
|
||||
|
||||
void ThrowLayoutException()
|
||||
{
|
||||
throw new DocumentLayoutException(
|
||||
$"Composed layout generates infinite document. This may happen in two cases. " +
|
||||
$"1) Your document and its layout configuration is correct but the content takes more than {documentMetadata.DocumentLayoutExceptionThreshold} pages. " +
|
||||
$"In this case, please increase the value {nameof(DocumentMetadata)}.{nameof(DocumentMetadata.DocumentLayoutExceptionThreshold)} property configured in the {nameof(IDocument.GetMetadata)} method. " +
|
||||
$"2) The layout configuration of your document is invalid. Some of the elements require more space than is provided." +
|
||||
$"Please analyze your documents structure to detect this element and fix its size constraints.");
|
||||
var message = $"Composed layout generates infinite document. This may happen in two cases. " +
|
||||
$"1) Your document and its layout configuration is correct but the content takes more than {documentMetadata.DocumentLayoutExceptionThreshold} pages. " +
|
||||
$"In this case, please increase the value {nameof(DocumentMetadata)}.{nameof(DocumentMetadata.DocumentLayoutExceptionThreshold)} property configured in the {nameof(IDocument.GetMetadata)} method. " +
|
||||
$"2) The layout configuration of your document is invalid. Some of the elements require more space than is provided." +
|
||||
$"Please analyze your documents structure to detect this element and fix its size constraints.";
|
||||
|
||||
throw new DocumentLayoutException(message)
|
||||
{
|
||||
ElementTrace = debuggingState?.BuildTrace() ?? "Debug trace is available only in the DEBUG mode."
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static void ApplyCaching(Container content)
|
||||
{
|
||||
content.HandleVisitor(x =>
|
||||
{
|
||||
if (x is ICacheable)
|
||||
x.CreateProxy(y => new CacheProxy(y));
|
||||
});
|
||||
}
|
||||
|
||||
private static DebuggingState ApplyDebugging(Container content)
|
||||
{
|
||||
var debuggingState = new DebuggingState();
|
||||
|
||||
content.HandleVisitor(x =>
|
||||
{
|
||||
x.CreateProxy(y => new DebuggingProxy(debuggingState, y));
|
||||
});
|
||||
|
||||
return debuggingState;
|
||||
}
|
||||
|
||||
internal static void ApplyDefaultTextStyle(this Element content, TextStyle documentDefaultTextStyle)
|
||||
{
|
||||
documentDefaultTextStyle.ApplyGlobalStyle(TextStyle.LibraryDefault);
|
||||
|
||||
@@ -23,7 +23,10 @@ namespace QuestPDF.Drawing
|
||||
/// (likely due to infinite layout), the exception is thrown.
|
||||
/// </summary>
|
||||
public int DocumentLayoutExceptionThreshold { get; set; } = 250;
|
||||
|
||||
|
||||
public bool ApplyCaching { get; set; } = !System.Diagnostics.Debugger.IsAttached;
|
||||
public bool ApplyDebugging { get; set; } = System.Diagnostics.Debugger.IsAttached;
|
||||
|
||||
public static DocumentMetadata Default => new DocumentMetadata();
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,8 @@ namespace QuestPDF.Drawing.Exceptions
|
||||
{
|
||||
public class DocumentLayoutException : Exception
|
||||
{
|
||||
public string ElementTrace { get; set; }
|
||||
|
||||
public DocumentLayoutException()
|
||||
{
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Concurrent;
|
||||
using System.IO;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Infrastructure;
|
||||
using SkiaSharp;
|
||||
|
||||
|
||||
@@ -36,7 +36,12 @@ namespace QuestPDF.Drawing
|
||||
|
||||
}
|
||||
|
||||
public void DrawRectangle(Position vector, Size size, string color)
|
||||
public void DrawFilledRectangle(Position vector, Size size, string color)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void DrawStrokedRectangle(Size size, string color, float width)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@@ -4,43 +4,13 @@ using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Drawing
|
||||
{
|
||||
internal class PdfCanvas : SkiaCanvasBase
|
||||
internal class PdfCanvas : SkiaDocumentCanvasBase
|
||||
{
|
||||
private SKDocument Document { get; }
|
||||
|
||||
public PdfCanvas(Stream stream, DocumentMetadata documentMetadata)
|
||||
{
|
||||
Document = SKDocument.CreatePdf(stream, MapMetadata(documentMetadata));
|
||||
}
|
||||
|
||||
~PdfCanvas()
|
||||
{
|
||||
Document.Dispose();
|
||||
}
|
||||
|
||||
public override void BeginDocument()
|
||||
public PdfCanvas(Stream stream, DocumentMetadata documentMetadata)
|
||||
: base(SKDocument.CreatePdf(stream, MapMetadata(documentMetadata)))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void EndDocument()
|
||||
{
|
||||
Canvas.Dispose();
|
||||
|
||||
Document.Close();
|
||||
Document.Dispose();
|
||||
}
|
||||
|
||||
public override void BeginPage(Size size)
|
||||
{
|
||||
Canvas = Document.BeginPage(size.Width, size.Height);
|
||||
}
|
||||
|
||||
public override void EndPage()
|
||||
{
|
||||
Document.EndPage();
|
||||
Canvas.Dispose();
|
||||
}
|
||||
|
||||
private static SKDocumentPdfMetadata MapMetadata(DocumentMetadata metadata)
|
||||
{
|
||||
|
||||
@@ -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.FullRender)
|
||||
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 string || !(x.Value is IEnumerable))
|
||||
.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,41 @@
|
||||
using System.Collections.Concurrent;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Drawing
|
||||
{
|
||||
internal class SkiaCache
|
||||
{
|
||||
private static ConcurrentDictionary<string, SKPaint> RectangleFillPaints = new ConcurrentDictionary<string, SKPaint>();
|
||||
private static ConcurrentDictionary<string, SKPaint> RectangleStrokePaints = new ConcurrentDictionary<string, SKPaint>();
|
||||
|
||||
public static SKPaint GetRectangleFillPaint(string color)
|
||||
{
|
||||
return RectangleFillPaints.GetOrAdd(color, _ => Convert());
|
||||
|
||||
SKPaint Convert()
|
||||
{
|
||||
return new SKPaint
|
||||
{
|
||||
Color = SKColor.Parse(color),
|
||||
Style = SKPaintStyle.Fill
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static SKPaint GetRectangleStrokePaint(string color, float width)
|
||||
{
|
||||
var key = $"{color}|{width}";
|
||||
return RectangleStrokePaints.GetOrAdd(key, _ => Convert());
|
||||
|
||||
SKPaint Convert()
|
||||
{
|
||||
return new SKPaint
|
||||
{
|
||||
Color = SKColor.Parse(color),
|
||||
Style = SKPaintStyle.Stroke,
|
||||
StrokeWidth = width
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -18,14 +18,20 @@ namespace QuestPDF.Drawing
|
||||
Canvas.Translate(vector.X, vector.Y);
|
||||
}
|
||||
|
||||
public void DrawRectangle(Position vector, Size size, string color)
|
||||
public void DrawFilledRectangle(Position vector, Size size, string color)
|
||||
{
|
||||
if (size.Width < Size.Epsilon || size.Height < Size.Epsilon)
|
||||
return;
|
||||
|
||||
var paint = color.ColorToPaint();
|
||||
var paint = SkiaCache.GetRectangleFillPaint(color);
|
||||
Canvas.DrawRect(vector.X, vector.Y, size.Width, size.Height, paint);
|
||||
}
|
||||
|
||||
public void DrawStrokedRectangle(Size size, string color, float width)
|
||||
{
|
||||
var paint = SkiaCache.GetRectangleStrokePaint(color, width);
|
||||
Canvas.DrawRect(0, 0, size.Width, size.Height, paint);
|
||||
}
|
||||
|
||||
public void DrawText(string text, Position vector, TextStyle style)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
using System.IO;
|
||||
using QuestPDF.Infrastructure;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Drawing
|
||||
{
|
||||
internal class SkiaDocumentCanvasBase : SkiaCanvasBase
|
||||
{
|
||||
private SKDocument Document { get; }
|
||||
|
||||
public SkiaDocumentCanvasBase(SKDocument document)
|
||||
{
|
||||
Document = document;
|
||||
}
|
||||
|
||||
~SkiaDocumentCanvasBase()
|
||||
{
|
||||
Document.Dispose();
|
||||
}
|
||||
|
||||
public override void BeginDocument()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void EndDocument()
|
||||
{
|
||||
Canvas.Dispose();
|
||||
|
||||
Document.Close();
|
||||
Document.Dispose();
|
||||
}
|
||||
|
||||
public override void BeginPage(Size size)
|
||||
{
|
||||
Canvas = Document.BeginPage(size.Width, size.Height);
|
||||
}
|
||||
|
||||
public override void EndPage()
|
||||
{
|
||||
Document.EndPage();
|
||||
Canvas.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
{
|
||||
@@ -0,0 +1,15 @@
|
||||
using System.IO;
|
||||
using QuestPDF.Infrastructure;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Drawing
|
||||
{
|
||||
internal class XpsCanvas : SkiaDocumentCanvasBase
|
||||
{
|
||||
public XpsCanvas(Stream stream, DocumentMetadata documentMetadata)
|
||||
: base(SKDocument.CreateXps(stream, documentMetadata.RasterDpi))
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
@@ -13,16 +14,16 @@ namespace QuestPDF.Elements
|
||||
if (Child == null)
|
||||
return;
|
||||
|
||||
var childSize = Child.Measure(availableSpace) as Size;
|
||||
var childSize = base.Measure(availableSpace);
|
||||
|
||||
if (childSize == null)
|
||||
if (childSize.Type == SpacePlanType.Wrap)
|
||||
return;
|
||||
|
||||
var top = GetTopOffset(availableSpace, childSize);
|
||||
var left = GetLeftOffset(availableSpace, childSize);
|
||||
|
||||
Canvas.Translate(new Position(left, top));
|
||||
Child.Draw(childSize);
|
||||
base.Draw(childSize);
|
||||
Canvas.Translate(new Position(-left, -top));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class AspectRatio : ContainerElement
|
||||
internal class AspectRatio : ContainerElement, ICacheable
|
||||
{
|
||||
public float Ratio { get; set; } = 1;
|
||||
public AspectRatioOption Option { get; set; } = AspectRatioOption.FitWidth;
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
if(Child == null)
|
||||
return new FullRender(Size.Zero);
|
||||
return SpacePlan.FullRender(0, 0);
|
||||
|
||||
var targetSize = GetTargetSize(availableSpace);
|
||||
|
||||
if (targetSize.Height > availableSpace.Height + Size.Epsilon)
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
if (targetSize.Width > availableSpace.Width + Size.Epsilon)
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var childSize = Child.Measure(targetSize);
|
||||
var childSize = base.Measure(targetSize);
|
||||
|
||||
if (childSize is Wrap)
|
||||
return new Wrap();
|
||||
if (childSize.Type == SpacePlanType.Wrap)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
if (childSize is PartialRender)
|
||||
return new PartialRender(targetSize);
|
||||
if (childSize.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(targetSize);
|
||||
|
||||
if (childSize is FullRender)
|
||||
return new FullRender(targetSize);
|
||||
if (childSize.Type == SpacePlanType.FullRender)
|
||||
return SpacePlan.FullRender(targetSize);
|
||||
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
@@ -42,7 +42,7 @@ namespace QuestPDF.Elements
|
||||
return;
|
||||
|
||||
var size = GetTargetSize(availableSpace);
|
||||
Child?.Draw(size);
|
||||
base.Draw(size);
|
||||
}
|
||||
|
||||
private Size GetTargetSize(Size availableSpace)
|
||||
|
||||
@@ -9,8 +9,8 @@ namespace QuestPDF.Elements
|
||||
|
||||
internal override void Draw(Size availableSpace)
|
||||
{
|
||||
Canvas.DrawRectangle(Position.Zero, availableSpace, Color);
|
||||
Child?.Draw(availableSpace);
|
||||
Canvas.DrawFilledRectangle(Position.Zero, availableSpace, Color);
|
||||
base.Draw(availableSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
+42
-17
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using QuestPDF.Helpers;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
@@ -14,27 +15,51 @@ namespace QuestPDF.Elements
|
||||
|
||||
internal override void Draw(Size availableSpace)
|
||||
{
|
||||
Child?.Draw(availableSpace);
|
||||
|
||||
Canvas.DrawRectangle(
|
||||
new Position(-Left/2, -Top/2),
|
||||
new Size(availableSpace.Width + Left/2 + Right/2, Top),
|
||||
base.Draw(availableSpace);
|
||||
|
||||
if (HasEqualWidthOnAllSides())
|
||||
{
|
||||
Canvas.DrawStrokedRectangle(availableSpace, Color, Top);
|
||||
}
|
||||
else
|
||||
{
|
||||
DrawCustomRectangle(availableSpace);
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawCustomRectangle(Size size)
|
||||
{
|
||||
Canvas.DrawFilledRectangle(
|
||||
new Position(-Left / 2, -Top / 2),
|
||||
new Size(size.Width + Left / 2 + Right / 2, Top),
|
||||
Color);
|
||||
|
||||
Canvas.DrawRectangle(
|
||||
new Position(-Left/2, -Top/2),
|
||||
new Size(Left, availableSpace.Height + Top/2 + Bottom/2),
|
||||
|
||||
Canvas.DrawFilledRectangle(
|
||||
new Position(-Left / 2, -Top / 2),
|
||||
new Size(Left, size.Height + Top / 2 + Bottom / 2),
|
||||
Color);
|
||||
|
||||
Canvas.DrawRectangle(
|
||||
new Position(-Left/2, availableSpace.Height-Bottom/2),
|
||||
new Size(availableSpace.Width + Left/2 + Right/2, Bottom),
|
||||
|
||||
Canvas.DrawFilledRectangle(
|
||||
new Position(-Left / 2, size.Height - Bottom / 2),
|
||||
new Size(size.Width + Left / 2 + Right / 2, Bottom),
|
||||
Color);
|
||||
|
||||
Canvas.DrawRectangle(
|
||||
new Position(availableSpace.Width-Right/2, -Top/2),
|
||||
new Size(Right, availableSpace.Height + Top/2 + Bottom/2),
|
||||
|
||||
Canvas.DrawFilledRectangle(
|
||||
new Position(size.Width - Right / 2, -Top / 2),
|
||||
new Size(Right, size.Height + Top / 2 + Bottom / 2),
|
||||
Color);
|
||||
}
|
||||
|
||||
private bool HasEqualWidthOnAllSides()
|
||||
{
|
||||
return IsClose(Top, Bottom) &&
|
||||
IsClose(Left, Right) &&
|
||||
IsClose(Top, Left);
|
||||
}
|
||||
|
||||
private static bool IsClose(float x, float y)
|
||||
{
|
||||
return Math.Abs(x - y) < Size.Epsilon;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
@@ -6,12 +7,12 @@ namespace QuestPDF.Elements
|
||||
{
|
||||
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;
|
||||
|
||||
Child?.Draw(targetSize);
|
||||
base.Draw(targetSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
using SkiaSharp;
|
||||
|
||||
@@ -6,13 +6,13 @@ namespace QuestPDF.Elements
|
||||
{
|
||||
public delegate void DrawOnCanvas(SKCanvas canvas, Size availableSpace);
|
||||
|
||||
internal class Canvas : Element
|
||||
internal class Canvas : Element, ICacheable
|
||||
{
|
||||
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)
|
||||
@@ -22,9 +22,9 @@ namespace QuestPDF.Elements
|
||||
if (Handler == null || skiaCanvas == null)
|
||||
return;
|
||||
|
||||
var currentMatrix = skiaCanvas.TotalMatrix;
|
||||
var originalMatrix = skiaCanvas.TotalMatrix;
|
||||
Handler.Invoke(skiaCanvas, availableSpace);
|
||||
skiaCanvas.SetMatrix(currentMatrix);
|
||||
skiaCanvas.SetMatrix(originalMatrix);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,45 +1,44 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class Constrained : ContainerElement
|
||||
internal class Constrained : ContainerElement, ICacheable
|
||||
{
|
||||
public float? MinWidth { get; set; }
|
||||
public float? MaxWidth { get; set; }
|
||||
|
||||
|
||||
public float? MinHeight { 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)
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
if (MinHeight > availableSpace.Height + Size.Epsilon)
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var available = new Size(
|
||||
Min(MaxWidth, availableSpace.Width),
|
||||
Min(MaxHeight, availableSpace.Height));
|
||||
|
||||
var measurement = Child?.Measure(available) ?? new FullRender(Size.Zero);
|
||||
var size = measurement as Size;
|
||||
var measurement = base.Measure(available);
|
||||
|
||||
if (measurement is Wrap)
|
||||
return new Wrap();
|
||||
if (measurement.Type == SpacePlanType.Wrap)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var actualSize = new Size(
|
||||
Max(MinWidth, size.Width),
|
||||
Max(MinHeight, size.Height));
|
||||
Max(MinWidth, measurement.Width),
|
||||
Max(MinHeight, measurement.Height));
|
||||
|
||||
if (size is FullRender)
|
||||
return new FullRender(actualSize);
|
||||
if (measurement.Type == SpacePlanType.FullRender)
|
||||
return SpacePlan.FullRender(actualSize);
|
||||
|
||||
if (size is PartialRender)
|
||||
return new PartialRender(actualSize);
|
||||
if (measurement.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(actualSize);
|
||||
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ using SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class Debug : IComponent
|
||||
internal class DebugArea : IComponent
|
||||
{
|
||||
public IElement? Child { get; set; }
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace QuestPDF.Elements
|
||||
.Box()
|
||||
.Background(Colors.White)
|
||||
.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 QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Fluent;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace QuestPDF.Elements
|
||||
Append
|
||||
}
|
||||
|
||||
internal class SimpleDecoration : Element
|
||||
internal class BinaryDecoration : Element, ICacheable
|
||||
{
|
||||
public Element DecorationElement { get; set; } = Empty.Instance;
|
||||
public Element ContentElement { get; set; } = Empty.Instance;
|
||||
@@ -25,34 +25,40 @@ namespace QuestPDF.Elements
|
||||
base.HandleVisitor(visit);
|
||||
}
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override void CreateProxy(Func<Element, Element> create)
|
||||
{
|
||||
var decorationMeasure = DecorationElement?.Measure(availableSpace);
|
||||
|
||||
if (decorationMeasure is Wrap || decorationMeasure is PartialRender)
|
||||
return new Wrap();
|
||||
DecorationElement = create(DecorationElement);
|
||||
ContentElement = create(ContentElement);
|
||||
}
|
||||
|
||||
var decorationSize = decorationMeasure as Size ?? Size.Zero;
|
||||
var contentMeasure = ContentElement?.Measure(new Size(availableSpace.Width, availableSpace.Height - decorationSize.Height)) ?? new FullRender(Size.Zero);
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
var decorationMeasure = DecorationElement.Measure(availableSpace);
|
||||
|
||||
if (contentMeasure is Wrap)
|
||||
return new Wrap();
|
||||
if (decorationMeasure.Type == SpacePlanType.Wrap || decorationMeasure.Type == SpacePlanType.PartialRender)
|
||||
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);
|
||||
|
||||
if (contentSize is PartialRender)
|
||||
return new PartialRender(resultSize);
|
||||
if (contentSize.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(resultSize);
|
||||
|
||||
if (contentSize is FullRender)
|
||||
return new FullRender(resultSize);
|
||||
if (contentSize.Type == SpacePlanType.FullRender)
|
||||
return SpacePlan.FullRender(resultSize);
|
||||
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
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 translateHeight = Type == DecorationType.Prepend ? decorationSize.Height : contentSize.Height;
|
||||
@@ -77,11 +83,11 @@ namespace QuestPDF.Elements
|
||||
|
||||
public void Compose(IContainer container)
|
||||
{
|
||||
container.Element(new SimpleDecoration
|
||||
container.Element(new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Prepend,
|
||||
DecorationElement = Header,
|
||||
ContentElement = new SimpleDecoration
|
||||
ContentElement = new BinaryDecoration
|
||||
{
|
||||
Type = DecorationType.Append,
|
||||
ContentElement = Content,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
using SkiaSharp;
|
||||
|
||||
@@ -9,9 +9,9 @@ namespace QuestPDF.Elements
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
@@ -7,9 +7,9 @@ namespace QuestPDF.Elements
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class EnsureSpace : ContainerElement
|
||||
internal class EnsureSpace : ContainerElement, ICacheable
|
||||
{
|
||||
public const float DefaultMinHeight = 150;
|
||||
public float MinHeight { get; set; } = DefaultMinHeight;
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
var measurement = base.Measure(availableSpace);
|
||||
|
||||
if (measurement is PartialRender && availableSpace.Height < MinHeight)
|
||||
return new Wrap();
|
||||
if (measurement.Type == SpacePlanType.PartialRender && availableSpace.Height < MinHeight)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
return measurement;
|
||||
}
|
||||
|
||||
+10
-10
@@ -1,28 +1,28 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class Extend : ContainerElement
|
||||
internal class Extend : ContainerElement, ICacheable
|
||||
{
|
||||
public bool ExtendVertical { 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;
|
||||
|
||||
var targetSize = GetTargetSize(availableSpace, childSize as Size);
|
||||
var targetSize = GetTargetSize(availableSpace, childSize);
|
||||
|
||||
if (childSize is PartialRender)
|
||||
return new PartialRender(targetSize);
|
||||
if (childSize.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(targetSize);
|
||||
|
||||
if (childSize is FullRender)
|
||||
return new FullRender(targetSize);
|
||||
if (childSize.Type == SpacePlanType.FullRender)
|
||||
return SpacePlan.FullRender(targetSize);
|
||||
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
@@ -8,13 +9,13 @@ namespace QuestPDF.Elements
|
||||
|
||||
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;
|
||||
|
||||
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 SkiaSharp;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class Image : Element
|
||||
internal class Image : Element, ICacheable
|
||||
{
|
||||
public SKImage? InternalImage { get; set; }
|
||||
|
||||
@@ -13,9 +13,9 @@ namespace QuestPDF.Elements
|
||||
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)
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class InlinedElement : Container
|
||||
{
|
||||
public ISpacePlan? MeasureCache { get; set; }
|
||||
public SpacePlan? MeasureCache { get; set; }
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
// TODO: once element caching proxy is introduces, this can be removed
|
||||
|
||||
MeasureCache ??= Child.Measure(Size.Max);
|
||||
return MeasureCache;
|
||||
return MeasureCache.Value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,22 +50,23 @@ namespace QuestPDF.Elements
|
||||
base.HandleVisitor(visit);
|
||||
}
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
if (!ChildrenQueue.Any())
|
||||
return new FullRender(Size.Zero);
|
||||
return SpacePlan.FullRender(Size.Zero);
|
||||
|
||||
var lines = Compose(availableSpace);
|
||||
|
||||
if (!lines.Any())
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var lineSizes = lines
|
||||
.Select(line =>
|
||||
{
|
||||
var size = GetLineSize(line);
|
||||
var heightWithSpacing = size.Height + (line.Count - 1) * HorizontalSpacing;
|
||||
return new Size(size.Width, heightWithSpacing);
|
||||
|
||||
var widthWithSpacing = size.Width + (line.Count - 1) * HorizontalSpacing;
|
||||
return new Size(widthWithSpacing, size.Height);
|
||||
})
|
||||
.ToList();
|
||||
|
||||
@@ -76,9 +77,9 @@ namespace QuestPDF.Elements
|
||||
var isPartiallyRendered = lines.Sum(x => x.Count) != ChildrenQueue.Count;
|
||||
|
||||
if (isPartiallyRendered)
|
||||
return new PartialRender(targetSize);
|
||||
return SpacePlan.PartialRender(targetSize);
|
||||
|
||||
return new FullRender(targetSize);
|
||||
return SpacePlan.FullRender(targetSize);
|
||||
}
|
||||
|
||||
internal override void Draw(Size availableSpace)
|
||||
@@ -88,7 +89,11 @@ namespace QuestPDF.Elements
|
||||
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var height = line.Select(x => x.Measure(Size.Max) as Size).Where(x => x != null).Max(x => x.Height);
|
||||
var height = line
|
||||
.Select(x => x.Measure(Size.Max))
|
||||
.Where(x => x.Type != SpacePlanType.Wrap)
|
||||
.Max(x => x.Height);
|
||||
|
||||
DrawLine(line);
|
||||
|
||||
topOffset += height + VerticalSpacing;
|
||||
@@ -108,7 +113,7 @@ namespace QuestPDF.Elements
|
||||
|
||||
foreach (var element in elements)
|
||||
{
|
||||
var size = element.Measure(Size.Max) as Size;
|
||||
var size = element.Measure(Size.Max);
|
||||
var baselineOffset = BaselineOffset(size, lineSize.Height);
|
||||
|
||||
Canvas.Translate(new Position(0, baselineOffset));
|
||||
@@ -177,8 +182,8 @@ namespace QuestPDF.Elements
|
||||
Size GetLineSize(ICollection<InlinedElement> elements)
|
||||
{
|
||||
var sizes = elements
|
||||
.Select(x => x.Measure(Size.Max) as Size)
|
||||
.Where(x => x != null)
|
||||
.Select(x => x.Measure(Size.Max))
|
||||
.Where(x => x.Type != SpacePlanType.Wrap)
|
||||
.ToList();
|
||||
|
||||
var width = sizes.Sum(x => x.Width);
|
||||
@@ -203,8 +208,8 @@ namespace QuestPDF.Elements
|
||||
break;
|
||||
|
||||
var height = line
|
||||
.Select(x => x.Measure(availableSize) as Size)
|
||||
.Where(x => x != null)
|
||||
.Select(x => x.Measure(availableSize))
|
||||
.Where(x => x.Type != SpacePlanType.Wrap)
|
||||
.Max(x => x.Height);
|
||||
|
||||
if (topOffset + height > availableSize.Height + Size.Epsilon)
|
||||
@@ -227,9 +232,9 @@ namespace QuestPDF.Elements
|
||||
break;
|
||||
|
||||
var element = queue.Peek();
|
||||
var size = element.Measure(Size.Max) as Size;
|
||||
var size = element.Measure(Size.Max);
|
||||
|
||||
if (size == null)
|
||||
if (size.Type == SpacePlanType.Wrap)
|
||||
break;
|
||||
|
||||
if (leftOffset + size.Width > availableSize.Width + Size.Epsilon)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using QuestPDF.Infrastructure;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
@@ -8,13 +9,13 @@ namespace QuestPDF.Elements
|
||||
|
||||
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;
|
||||
|
||||
Canvas.DrawLocationLink(LocationName, targetSize);
|
||||
Child?.Draw(availableSpace);
|
||||
base.Draw(availableSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ namespace QuestPDF.Elements
|
||||
IsRendered = true;
|
||||
}
|
||||
|
||||
Child?.Draw(availableSpace);
|
||||
base.Draw(availableSpace);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
@@ -11,7 +11,7 @@ namespace QuestPDF.Elements
|
||||
public bool IsPrimary { get; set; }
|
||||
}
|
||||
|
||||
internal class Layers : Element
|
||||
internal class Layers : Element, ICacheable
|
||||
{
|
||||
public List<Layer> Children { get; set; } = new List<Layer>();
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace QuestPDF.Elements
|
||||
base.HandleVisitor(visit);
|
||||
}
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
return Children
|
||||
.Single(x => x.IsPrimary)
|
||||
@@ -31,7 +31,7 @@ namespace QuestPDF.Elements
|
||||
internal override void Draw(Size availableSpace)
|
||||
{
|
||||
Children
|
||||
.Where(x => x.Measure(availableSpace) is Size)
|
||||
.Where(x => x.Measure(availableSpace).Type != SpacePlanType.Wrap)
|
||||
.ToList()
|
||||
.ForEach(x => x.Draw(availableSpace));
|
||||
}
|
||||
|
||||
@@ -1,40 +1,40 @@
|
||||
using System;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
{
|
||||
internal class Padding : ContainerElement
|
||||
internal class Padding : ContainerElement, ICacheable
|
||||
{
|
||||
public float Top { get; set; }
|
||||
public float Right { get; set; }
|
||||
public float Bottom { get; set; }
|
||||
public float Left { get; set; }
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
if (Child == null)
|
||||
return new FullRender(Size.Zero);
|
||||
return SpacePlan.FullRender(0, 0);
|
||||
|
||||
var internalSpace = InternalSpace(availableSpace);
|
||||
|
||||
if (internalSpace.Width < 0 || internalSpace.Height < 0)
|
||||
return new Wrap();
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var measure = Child.Measure(internalSpace) as Size;
|
||||
var measure = base.Measure(internalSpace);
|
||||
|
||||
if (measure == null)
|
||||
return new Wrap();
|
||||
if (measure.Type == SpacePlanType.Wrap)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var newSize = new Size(
|
||||
measure.Width + Left + Right,
|
||||
measure.Height + Top + Bottom);
|
||||
|
||||
if (measure is PartialRender)
|
||||
return new PartialRender(newSize);
|
||||
if (measure.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(newSize);
|
||||
|
||||
if (measure is FullRender)
|
||||
return new FullRender(newSize);
|
||||
if (measure.Type == SpacePlanType.FullRender)
|
||||
return SpacePlan.FullRender(newSize);
|
||||
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
@@ -47,7 +47,7 @@ namespace QuestPDF.Elements
|
||||
var internalSpace = InternalSpace(availableSpace);
|
||||
|
||||
Canvas.Translate(new Position(Left, Top));
|
||||
Child?.Draw(internalSpace);
|
||||
base.Draw(internalSpace);
|
||||
Canvas.Translate(new Position(-Left, -Top));
|
||||
}
|
||||
|
||||
@@ -57,5 +57,10 @@ namespace QuestPDF.Elements
|
||||
availableSpace.Width - Left - Right,
|
||||
availableSpace.Height - Top - Bottom);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"Padding: Top({Top}) Right({Right}) Bottom({Bottom}) Left({Left})";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -42,15 +42,22 @@ namespace QuestPDF.Elements
|
||||
|
||||
.Decoration(decoration =>
|
||||
{
|
||||
decoration.Header().Element(Header);
|
||||
decoration
|
||||
.Header()
|
||||
.DebugPointer("Page header")
|
||||
.Element(Header);
|
||||
|
||||
decoration
|
||||
.Content()
|
||||
.Element(x => IsClose(MinSize.Width, MaxSize.Width) ? x.ExtendHorizontal() : x)
|
||||
.Element(x => IsClose(MinSize.Height, MaxSize.Height) ? x.ExtendVertical() : x)
|
||||
.DebugPointer("Page content")
|
||||
.Element(Content);
|
||||
|
||||
decoration.Footer().Element(Footer);
|
||||
decoration
|
||||
.Footer()
|
||||
.DebugPointer("Page footer")
|
||||
.Element(Footer);
|
||||
});
|
||||
|
||||
(container as Element).ApplyDefaultTextStyle(DefaultTextStyle);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
namespace QuestPDF.Elements
|
||||
@@ -12,12 +12,12 @@ namespace QuestPDF.Elements
|
||||
IsRendered = false;
|
||||
}
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
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)
|
||||
|
||||
+21
-15
@@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using QuestPDF.Drawing.SpacePlan;
|
||||
using QuestPDF.Drawing;
|
||||
using QuestPDF.Infrastructure;
|
||||
|
||||
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 Right { get; set; }
|
||||
@@ -47,33 +47,39 @@ namespace QuestPDF.Elements
|
||||
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)
|
||||
return new Wrap();
|
||||
if (leftMeasurement.Type == SpacePlanType.Wrap)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height)) as Size;
|
||||
var rightMeasurement = Right.Measure(new Size(availableSpace.Width - leftMeasurement.Width, availableSpace.Height));
|
||||
|
||||
if (rightMeasurement == null)
|
||||
return new Wrap();
|
||||
if (rightMeasurement.Type == SpacePlanType.Wrap)
|
||||
return SpacePlan.Wrap();
|
||||
|
||||
var totalWidth = leftMeasurement.Width + rightMeasurement.Width;
|
||||
var totalHeight = Math.Max(leftMeasurement.Height, rightMeasurement.Height);
|
||||
|
||||
var targetSize = new Size(totalWidth, totalHeight);
|
||||
|
||||
if (leftMeasurement is PartialRender || rightMeasurement is PartialRender)
|
||||
return new PartialRender(targetSize);
|
||||
if (leftMeasurement.Type == SpacePlanType.PartialRender || rightMeasurement.Type == SpacePlanType.PartialRender)
|
||||
return SpacePlan.PartialRender(targetSize);
|
||||
|
||||
return new FullRender(targetSize);
|
||||
return SpacePlan.FullRender(targetSize);
|
||||
}
|
||||
|
||||
internal override void Draw(Size availableSpace)
|
||||
{
|
||||
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));
|
||||
|
||||
@@ -99,7 +105,7 @@ namespace QuestPDF.Elements
|
||||
base.HandleVisitor(visit);
|
||||
}
|
||||
|
||||
internal override ISpacePlan Measure(Size availableSpace)
|
||||
internal override SpacePlan Measure(Size availableSpace)
|
||||
{
|
||||
UpdateElementsWidth(availableSpace.Width);
|
||||
return RootElement.Measure(availableSpace);
|
||||
@@ -163,7 +169,7 @@ namespace QuestPDF.Elements
|
||||
|
||||
var half = elements.Length / 2;
|
||||
|
||||
return new SimpleRow
|
||||
return new BinaryRow
|
||||
{
|
||||
Left = BuildTree(elements.Slice(0, half)),
|
||||
Right = BuildTree(elements.Slice(half))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user