Skip to content

Commit

Permalink
adding dpi to measure, arrange and draw calls
Browse files Browse the repository at this point in the history
[major][add]
The font size was not adjusting to the dpi correctly, due to a function call being assumed to act on this without any foundational basis (aka: i missed that SKPaint's font size is in pixels)
  • Loading branch information
X39 committed Nov 25, 2023
1 parent 0b0546d commit 2967102
Show file tree
Hide file tree
Showing 20 changed files with 140 additions and 90 deletions.
4 changes: 2 additions & 2 deletions source/X39.Solutions.PdfTemplate/Abstraction/CanvasImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@ public void DrawLine(Color color, float thickness, float startX, float startY, f
});
}

public void DrawText(TextStyle textStyle, string text, float x, float y)
public void DrawText(TextStyle textStyle, float dpi, string text, float x, float y)
{
_drawActions.Add((canvas) =>
{
var paint = _paintCache.Get(textStyle);
var paint = _paintCache.Get(textStyle, dpi);
canvas.DrawText(text, x, y, paint);
});
}
Expand Down
5 changes: 3 additions & 2 deletions source/X39.Solutions.PdfTemplate/Abstraction/ICanvas.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,12 @@ public interface ICanvas
/// <summary>
/// Draws text on the canvas at the specified coordinates.
/// </summary>
/// <param name="textStyle">The <see cref="TextStyle"/> to use when drawing the text.</param>
/// <param name="dpi"></param>
/// <param name="text">The text to draw.</param>
/// <param name="x">The x-coordinate of the origin of the text being drawn.</param>
/// <param name="y">The y-coordinate of the origin of the text being drawn.</param>
/// <param name="textStyle">The <see cref="TextStyle"/> to use when drawing the text.</param>
void DrawText(TextStyle textStyle, string text, float x, float y);
void DrawText(TextStyle textStyle, float dpi, string text, float x, float y);

/// <summary>
/// Draws a rectangle on the canvas at the coordinates specified
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public abstract class AlignableControl : Control
public EVerticalAlignment VerticalAlignment { get; set; } = EVerticalAlignment.Stretch;

/// <inheritdoc />
protected override void PreRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected override void PreRender(ICanvas canvas, float dpi, in Size parentSize, CultureInfo cultureInfo)
{
canvas.Translate(
new Point
Expand Down
19 changes: 16 additions & 3 deletions source/X39.Solutions.PdfTemplate/Controls/Base/Control.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ public Size RemainingSize

/// <inheritdoc />
public virtual Size Measure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -170,6 +171,7 @@ public virtual Size Measure(
var padding = Padding.ToRectangle(fullPageSize);
var margin = Margin.ToRectangle(fullPageSize);
var measureResult = DoMeasure(
dpi,
ToSize(fullPageSize, margin),
ToSize(framedPageSize, margin),
ToSize(remainingSize, margin, padding),
Expand Down Expand Up @@ -201,13 +203,15 @@ private static Size ToSize(Size fullPageSize, Rectangle margin, Rectangle paddin

/// <inheritdoc cref="Measure"/>
protected abstract Size DoMeasure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
CultureInfo cultureInfo);

/// <inheritdoc />
public virtual Size Arrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -218,6 +222,7 @@ public virtual Size Arrange(
var padding = Padding.ToRectangle(remainingSize);
var margin = Margin.ToRectangle(remainingSize);
var measureResult = DoArrange(
dpi,
ToSize(fullPageSize, margin),
ToSize(framedPageSize, margin),
ToSize(remainingSize, margin, padding),
Expand All @@ -242,6 +247,7 @@ public virtual Size Arrange(

/// <inheritdoc cref="Arrange"/>
protected abstract Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -250,6 +256,7 @@ protected abstract Size DoArrange(
/// <inheritdoc />
public virtual void Render(
ICanvas canvas,
float dpi,
in Size parentSize,
CultureInfo cultureInfo)
{
Expand All @@ -261,11 +268,11 @@ public virtual void Render(
var arrangedSize = new Size(
parentSize.Width - padding.Width - padding.Width - margin.Width - margin.Width,
parentSize.Height - padding.Height - padding.Height - margin.Height - margin.Height);
PreRender(canvas, arrangedSize, cultureInfo);
PreRender(canvas, dpi, arrangedSize, cultureInfo);
if (Clip)
canvas.Clip(Arrangement);
canvas.Translate(ArrangementInner);
DoRender(canvas, arrangedSize, cultureInfo);
DoRender(canvas, dpi, arrangedSize, cultureInfo);
}
finally
{
Expand All @@ -277,16 +284,22 @@ public virtual void Render(
/// Called before <see cref="DoRender"/> is called to allow for additional canvas state to be set.
/// </summary>
/// <param name="canvas">The canvas to render to.</param>
/// <param name="dpi"></param>
/// <param name="parentSize">The size of the parent control.</param>
/// <param name="cultureInfo">The culture info to use for rendering.</param>
protected virtual void PreRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected virtual void PreRender(
ICanvas canvas,
float dpi,
in Size parentSize,
CultureInfo cultureInfo)
{
/* empty */
}

/// <inheritdoc cref="Render"/>
protected abstract void DoRender(
ICanvas canvas,
float dpi,
in Size parentSize,
CultureInfo cultureInfo);
}
10 changes: 6 additions & 4 deletions source/X39.Solutions.PdfTemplate/Controls/BorderControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public class BorderControl : AlignableContentControl

/// <inheritdoc />
protected override Size DoMeasure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -43,7 +44,7 @@ protected override Size DoMeasure(
var size = Size.Zero;
foreach (var child in Children)
{
var measure = child.Measure(fullPageSize, remainingSize - thickness, remainingSize - thickness, cultureInfo);
var measure = child.Measure(dpi, fullPageSize, remainingSize - thickness, remainingSize - thickness, cultureInfo);
size = new Size(
Math.Max(size.Width, measure.Width),
size.Height + measure.Height);
Expand All @@ -58,6 +59,7 @@ protected override Size DoMeasure(

/// <inheritdoc />
protected override Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -67,7 +69,7 @@ protected override Size DoArrange(
var size = Size.Zero;
foreach (var child in Children)
{
var measure = child.Arrange(fullPageSize, remainingSize - thickness, remainingSize - thickness, cultureInfo);
var measure = child.Arrange(dpi, fullPageSize, remainingSize - thickness, remainingSize - thickness, cultureInfo);
size = new Size(
Math.Max(size.Width, measure.Width),
size.Height + measure.Height);
Expand All @@ -82,7 +84,7 @@ protected override Size DoArrange(
}

/// <inheritdoc />
protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected override void DoRender(ICanvas canvas, float dpi, in Size parentSize, CultureInfo cultureInfo)
{
using var state = canvas.CreateState();
canvas.Translate(-ArrangementInner);
Expand Down Expand Up @@ -128,7 +130,7 @@ protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo
canvas.Translate(thickness);
foreach (var (child, arrangedSize) in Children.Zip(_arrangedSizes))
{
child.Render(canvas, parentSize, cultureInfo);
child.Render(canvas, dpi, parentSize, cultureInfo);
canvas.Translate(0, arrangedSize.Height);
}
}
Expand Down
3 changes: 3 additions & 0 deletions source/X39.Solutions.PdfTemplate/Controls/LineControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public sealed class LineControl : AlignableControl

/// <inheritdoc />
protected override Size DoMeasure(
float pageSize,

Check warning on line 42 in source/X39.Solutions.PdfTemplate/Controls/LineControl.cs

View workflow job for this annotation

GitHub Actions / upload-to-npgk

In member Size LineControl.DoMeasure(float pageSize, in Size fullPageSize, in Size framedPageSize, in Size remainingSize, CultureInfo cultureInfo), change parameter name pageSize to dpi in order to match the identifier as it has been declared in Size Control.DoMeasure(float dpi, in Size fullPageSize, in Size framedPageSize, in Size remainingSize, CultureInfo cultureInfo) (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1725)

Check warning on line 42 in source/X39.Solutions.PdfTemplate/Controls/LineControl.cs

View workflow job for this annotation

GitHub Actions / upload-to-npgk

In member Size LineControl.DoMeasure(float pageSize, in Size fullPageSize, in Size framedPageSize, in Size remainingSize, CultureInfo cultureInfo), change parameter name pageSize to dpi in order to match the identifier as it has been declared in Size Control.DoMeasure(float dpi, in Size fullPageSize, in Size framedPageSize, in Size remainingSize, CultureInfo cultureInfo) (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1725)
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -58,6 +59,7 @@ protected override Size DoMeasure(

/// <inheritdoc />
protected override Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -79,6 +81,7 @@ protected override Size DoArrange(
/// <inheritdoc />
protected override void DoRender(
ICanvas canvas,
float dpi,
in Size parentSize,
CultureInfo cultureInfo)
{
Expand Down
10 changes: 6 additions & 4 deletions source/X39.Solutions.PdfTemplate/Controls/TableCellControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public sealed class TableCellControl : AlignableContentControl

/// <inheritdoc />
protected override Size DoMeasure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -31,7 +32,7 @@ protected override Size DoMeasure(
var height = 0F;
foreach (var control in Children)
{
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Measure(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
width = Math.Max(width, size.Width);
height += size.Height;
}
Expand All @@ -41,6 +42,7 @@ protected override Size DoMeasure(

/// <inheritdoc />
protected override Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -50,7 +52,7 @@ protected override Size DoArrange(
var height = 0F;
foreach (var control in Children)
{
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Arrange(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
width = Math.Max(width, size.Width);
height += size.Height;
_heights.Add(size.Height);
Expand All @@ -64,12 +66,12 @@ protected override Size DoArrange(
}

/// <inheritdoc />
protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected override void DoRender(ICanvas canvas, float dpi, in Size parentSize, CultureInfo cultureInfo)
{
canvas.PushState();
foreach (var (control, height) in Children.Zip(_heights))
{
control.Render(canvas, parentSize, cultureInfo);
control.Render(canvas, dpi, parentSize, cultureInfo);
canvas.Translate(0, height);
}

Expand Down
20 changes: 11 additions & 9 deletions source/X39.Solutions.PdfTemplate/Controls/TableControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public override bool Remove(IControl item)

/// <inheritdoc />
protected override Size DoMeasure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -54,15 +55,15 @@ protected override Size DoMeasure(
var totalHeight = 0F;
foreach (var control in Children.OfType<TableHeaderControl>())
{
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Measure(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
totalHeaderHeight += size.Height;
maxWidth = Math.Max(maxWidth, size.Width);
}

var currentHeight = remainingSize.Height;
foreach (var control in Children.OfType<TableRowControl>())
{
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Measure(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
maxWidth = Math.Max(maxWidth, size.Width);
if (currentHeight + size.Height >= remainingSize.Height)
{
Expand Down Expand Up @@ -187,6 +188,7 @@ private static IReadOnlyCollection<float> CalculateWidths(

/// <inheritdoc />
protected override Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -204,21 +206,21 @@ protected override Size DoArrange(
var newValue = (outWidths.ElementAt(i), columnLength);
CellWidths[key] = newValue;
}

var totalHeaderHeight = 0F;
var maxWidth = 0F;
var totalHeight = 0F;
foreach (var control in Children.OfType<TableHeaderControl>())
{
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Arrange(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
totalHeaderHeight += size.Height;
maxWidth = Math.Max(maxWidth, size.Width);
}

var currentHeight = remainingSize.Height;
foreach (var control in Children.OfType<TableRowControl>())
{
var size = control.Arrange(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Arrange(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
maxWidth = Math.Max(maxWidth, size.Width);
if (currentHeight + size.Height >= remainingSize.Height)
{
Expand All @@ -235,13 +237,13 @@ protected override Size DoArrange(
}

/// <inheritdoc />
protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected override void DoRender(ICanvas canvas, float dpi, in Size parentSize, CultureInfo cultureInfo)
{
var height = 0F;
var headers = Children.OfType<TableHeaderControl>().ToArray();
foreach (var headerControl in headers)
{
headerControl.Render(canvas, parentSize, cultureInfo);
headerControl.Render(canvas, dpi, parentSize, cultureInfo);
canvas.Translate(0, headerControl.Arrangement.Height);
height += headerControl.Arrangement.Height;
}
Expand All @@ -255,13 +257,13 @@ protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo
height = 0F;
foreach (var headerControl in headers)
{
headerControl.Render(canvas, parentSize, cultureInfo);
headerControl.Render(canvas, dpi, parentSize, cultureInfo);
canvas.Translate(0, headerControl.Arrangement.Height);
height += headerControl.Arrangement.Height;
}
}

control.Render(canvas, parentSize, cultureInfo);
control.Render(canvas, dpi, parentSize, cultureInfo);
canvas.Translate(0, control.Arrangement.Height);
height += control.Arrangement.Height;
}
Expand Down
10 changes: 6 additions & 4 deletions source/X39.Solutions.PdfTemplate/Controls/TableRowControlBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public abstract class TableRowControlBase : AlignableContentControl

/// <inheritdoc />
protected override Size DoMeasure(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -26,7 +27,7 @@ protected override Size DoMeasure(
var height = 0F;
foreach (var (control, index) in Children.Cast<TableCellControl>().Indexed())
{
var size = control.Measure(fullPageSize, remainingSize, remainingSize, cultureInfo);
var size = control.Measure(dpi, fullPageSize, remainingSize, remainingSize, cultureInfo);
width += size.Width;
height = Math.Max(height, size.Height);
if (Table.CellWidths.TryGetValue(index, out var tuple))
Expand All @@ -49,6 +50,7 @@ protected override Size DoMeasure(

/// <inheritdoc />
protected override Size DoArrange(
float dpi,
in Size fullPageSize,
in Size framedPageSize,
in Size remainingSize,
Expand All @@ -67,7 +69,7 @@ protected override Size DoArrange(
Width = cellWidth,
Height = MeasurementInner.Height,
};
var size = control.Arrange(fullPageSize, remainingCellSize, remainingCellSize, cultureInfo);
var size = control.Arrange(dpi, fullPageSize, remainingCellSize, remainingCellSize, cultureInfo);
width += cellWidth;
height = Math.Max(height, size.Height);
}
Expand All @@ -76,14 +78,14 @@ protected override Size DoArrange(
}

/// <inheritdoc />
protected override void DoRender(ICanvas canvas, in Size parentSize, CultureInfo cultureInfo)
protected override void DoRender(ICanvas canvas, float dpi, in Size parentSize, CultureInfo cultureInfo)
{
if (Table is null)
throw new InvalidOperationException("A TableRowControl must be added to a TableControl");
canvas.PushState();
foreach (var (control, index) in Children.OfType<TableCellControl>().Indexed())
{
control.Render(canvas, parentSize, cultureInfo);
control.Render(canvas, dpi, parentSize, cultureInfo);
var (width, _) = Table.CellWidths[index];
canvas.Translate(width, 0);
}
Expand Down
Loading

0 comments on commit 2967102

Please sign in to comment.