Skip to content

Commit 47f5e8e

Browse files
committed
dedupe EdgeData creation code
1 parent 6d1e7a1 commit 47f5e8e

1 file changed

Lines changed: 18 additions & 10 deletions

File tree

src/ImageSharp.Drawing/Shapes/Rasterization/ScanEdgeCollection.Build.cs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ internal static ScanEdgeCollection Create(TessellatedMultipolygon multipolygon,
5151

5252
RingWalker walker = new RingWalker(buffer.Memory.Span);
5353

54-
float subsamplingRatio = subsampling;
55-
5654
using IMemoryOwner<float> roundedYBuffer = allocator.Allocate<float>(multipolygon.Max(r => r.Vertices.Length));
5755
Span<float> roundedY = roundedYBuffer.Memory.Span;
5856

@@ -63,24 +61,24 @@ internal static ScanEdgeCollection Create(TessellatedMultipolygon multipolygon,
6361
continue;
6462
}
6563

66-
var vertices = ring.Vertices;
67-
RoundY(vertices, roundedY, subsamplingRatio);
64+
ReadOnlySpan<PointF> vertices = ring.Vertices;
65+
RoundY(vertices, roundedY, subsampling);
6866

69-
walker.PreviousEdge = new EdgeData(vertices[vertices.Length - 2].X, vertices[vertices.Length - 1].X, roundedY[vertices.Length - 2], roundedY[vertices.Length - 1]); // Last edge
70-
walker.CurrentEdge = new EdgeData(vertices[0].X, vertices[1].X, roundedY[0], roundedY[1]); // First edge
71-
walker.NextEdge = new EdgeData(vertices[1].X, vertices[2].X, roundedY[1], roundedY[2]); // Second edge
67+
walker.PreviousEdge = new EdgeData(vertices, roundedY, vertices.Length - 2); // Last edge
68+
walker.CurrentEdge = new EdgeData(vertices, roundedY, 0); // First edge
69+
walker.NextEdge = new EdgeData(vertices, roundedY, 1); // Second edge
7270
walker.Move(false);
7371

7472
for (int i = 1; i < vertices.Length - 2; i++)
7573
{
76-
walker.NextEdge = new EdgeData(vertices[i + 1].X, vertices[i + 2].X, roundedY[i + 1], roundedY[i + 2]);
74+
walker.NextEdge = new EdgeData(vertices, roundedY, i + 1);
7775
walker.Move(true);
7876
}
7977

80-
walker.NextEdge = new EdgeData(vertices[0].X, vertices[1].X, roundedY[0], roundedY[1]); // First edge
78+
walker.NextEdge = new EdgeData(vertices, roundedY, 0); // First edge
8179
walker.Move(true); // Emit edge before last edge
8280

83-
walker.NextEdge = new EdgeData(vertices[1].X, vertices[2].X, roundedY[1], roundedY[2]); // Second edge
81+
walker.NextEdge = new EdgeData(vertices, roundedY, 1); // Second edge
8482
walker.Move(true); // Emit last edge
8583
}
8684

@@ -131,6 +129,16 @@ private struct EdgeData
131129
private int emitStart;
132130
private int emitEnd;
133131

132+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
133+
public EdgeData(ReadOnlySpan<PointF> vertices, ReadOnlySpan<float> roundedY, int idx)
134+
: this(
135+
vertices[idx].X,
136+
vertices[idx + 1].X,
137+
roundedY[idx],
138+
roundedY[idx + 1])
139+
{
140+
}
141+
134142
public EdgeData(float startX, float endX, float startYRounded, float endYRounded)
135143
{
136144
this.start = new PointF(startX, startYRounded);

0 commit comments

Comments
 (0)