Skip to content

Commit 0110ef5

Browse files
Include square line cap in bounds; update WebGPU tests
1 parent 2e46ac7 commit 0110ef5

File tree

18 files changed

+90
-40
lines changed

18 files changed

+90
-40
lines changed

src/ImageSharp.Drawing/Processing/Backends/FlushScene.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,12 +948,18 @@ private static bool TryResolveRasterization(
948948
private static RectangleF GetStrokeBounds(RectangleF bounds, Pen pen)
949949
{
950950
float halfWidth = pen.StrokeWidth * 0.5F;
951-
float inflate = pen.StrokeOptions.LineJoin switch
951+
float joinInflate = pen.StrokeOptions.LineJoin switch
952952
{
953953
LineJoin.Miter or LineJoin.MiterRevert or LineJoin.MiterRound => (float)(halfWidth * Math.Max(pen.StrokeOptions.MiterLimit, 1D)),
954954
_ => halfWidth
955955
};
956956

957+
float capInflate = pen.StrokeOptions.LineCap == LineCap.Square
958+
? halfWidth * MathF.Sqrt(2F)
959+
: halfWidth;
960+
961+
float inflate = MathF.Max(joinInflate, capInflate);
962+
957963
bounds.Inflate(new SizeF(inflate, inflate));
958964
return bounds;
959965
}

tests/ImageSharp.Drawing.Tests/Processing/Backends/WebGPUDrawingBackendTests.cs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,8 @@ public void DrawPath_Stroke_LineJoin_MatchesDefaultOutput<TPixel>(TestImageProvi
934934
});
935935

936936
void DrawAction(DrawingCanvas<TPixel> canvas) => canvas.Draw(pen, path);
937+
IPath outline = path.GenerateOutline(pen.StrokeWidth, pen.StrokeOptions);
938+
void DrawReference(DrawingCanvas<TPixel> canvas) => canvas.Fill(pen.StrokeFill, outline);
937939

938940
using Image<TPixel> defaultImage = provider.GetImage();
939941
RenderWithDefaultBackend(defaultImage, drawingOptions, DrawAction);
@@ -948,14 +950,34 @@ public void DrawPath_Stroke_LineJoin_MatchesDefaultOutput<TPixel>(TestImageProvi
948950
DrawAction,
949951
nativeSurfaceInitialImage);
950952

951-
DebugSaveBackendPair(provider, $"DrawPath_Stroke_LineJoin_{lineJoin}", defaultImage, nativeSurfaceImage);
952953
AssertBackendPairSimilarity(defaultImage, nativeSurfaceImage, 0.01F);
954+
955+
using Image<TPixel> referenceImage = provider.GetImage();
956+
RenderWithDefaultBackend(referenceImage, drawingOptions, DrawReference);
957+
958+
using Image<TPixel> defaultComparisonImage = CreateJoinComparisonImage(referenceImage, defaultImage);
959+
using Image<TPixel> nativeSurfaceComparisonImage = CreateJoinComparisonImage(referenceImage, nativeSurfaceImage);
960+
961+
DebugSaveBackendPair(
962+
provider,
963+
$"DrawPath_Stroke_LineJoin_{lineJoin}",
964+
defaultComparisonImage,
965+
nativeSurfaceComparisonImage);
953966
AssertBackendPairReferenceOutputs(
954967
provider,
955968
$"DrawPath_Stroke_LineJoin_{lineJoin}",
956-
defaultImage,
957-
nativeSurfaceImage);
969+
defaultComparisonImage,
970+
nativeSurfaceComparisonImage);
958971
AssertGpuPathWhenRequired(nativeSurfaceBackend);
972+
973+
static Image<TPixel> CreateJoinComparisonImage(Image<TPixel> reference, Image<TPixel> rendered)
974+
{
975+
Image<TPixel> comparison = new(reference.Width, reference.Height * 2, Color.White.ToPixel<TPixel>());
976+
comparison.Mutate(ctx => ctx
977+
.DrawImage(reference, new Point(0, 0), 1F)
978+
.DrawImage(rendered, new Point(0, reference.Height), 1F));
979+
return comparison;
980+
}
959981
}
960982

961983
[WebGPUTheory]
@@ -982,6 +1004,8 @@ public void DrawPath_Stroke_LineCap_MatchesDefaultOutput<TPixel>(TestImageProvid
9821004
});
9831005

9841006
void DrawAction(DrawingCanvas<TPixel> canvas) => canvas.Draw(pen, path);
1007+
IPath outline = path.GenerateOutline(pen.StrokeWidth, pen.StrokeOptions);
1008+
void DrawReference(DrawingCanvas<TPixel> canvas) => canvas.Fill(pen.StrokeFill, outline);
9851009

9861010
using Image<TPixel> defaultImage = provider.GetImage();
9871011
RenderWithDefaultBackend(defaultImage, drawingOptions, DrawAction);
@@ -996,14 +1020,34 @@ public void DrawPath_Stroke_LineCap_MatchesDefaultOutput<TPixel>(TestImageProvid
9961020
DrawAction,
9971021
nativeSurfaceInitialImage);
9981022

999-
DebugSaveBackendPair(provider, $"DrawPath_Stroke_LineCap_{lineCap}", defaultImage, nativeSurfaceImage);
10001023
AssertBackendPairSimilarity(defaultImage, nativeSurfaceImage, 0.0103F);
1024+
1025+
using Image<TPixel> referenceImage = provider.GetImage();
1026+
RenderWithDefaultBackend(referenceImage, drawingOptions, DrawReference);
1027+
1028+
using Image<TPixel> defaultComparisonImage = CreateLineCapComparisonImage(referenceImage, defaultImage);
1029+
using Image<TPixel> nativeSurfaceComparisonImage = CreateLineCapComparisonImage(referenceImage, nativeSurfaceImage);
1030+
1031+
DebugSaveBackendPair(
1032+
provider,
1033+
$"DrawPath_Stroke_LineCap_{lineCap}",
1034+
defaultComparisonImage,
1035+
nativeSurfaceComparisonImage);
10011036
AssertBackendPairReferenceOutputs(
10021037
provider,
10031038
$"DrawPath_Stroke_LineCap_{lineCap}",
1004-
defaultImage,
1005-
nativeSurfaceImage);
1039+
defaultComparisonImage,
1040+
nativeSurfaceComparisonImage);
10061041
AssertGpuPathWhenRequired(nativeSurfaceBackend);
1042+
1043+
static Image<TPixel> CreateLineCapComparisonImage(Image<TPixel> reference, Image<TPixel> rendered)
1044+
{
1045+
Image<TPixel> comparison = new(reference.Width, reference.Height * 2, Color.White.ToPixel<TPixel>());
1046+
comparison.Mutate(ctx => ctx
1047+
.DrawImage(reference, new Point(0, 0), 1F)
1048+
.DrawImage(rendered, new Point(0, reference.Height), 1F));
1049+
return comparison;
1050+
}
10071051
}
10081052

10091053
[WebGPUTheory]
@@ -1240,7 +1284,7 @@ static void AssertBackend(WebGPUDrawingBackend backend)
12401284

12411285
DebugSaveBackendPair(provider, "SaveLayer_ClipReduce", defaultImage, nativeSurfaceImage);
12421286
AssertBackendPairSimilarity(defaultImage, nativeSurfaceImage, 1F);
1243-
AssertBackendPairReferenceOutputs(provider, "SaveLayer_ClipReduce", defaultImage, nativeSurfaceImage);
1287+
AssertBackendPairReferenceOutputs(provider, "SaveLayer_ClipReduce", defaultImage, nativeSurfaceImage, 0.0006F);
12441288
AssertGpuPathWhenRequired(nativeSurfaceBackend);
12451289
}
12461290

Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)