Skip to content

Commit b0f81fa

Browse files
Add Clear method to matrix builders.
1 parent fefab91 commit b0f81fa

5 files changed

Lines changed: 70 additions & 0 deletions

File tree

src/ImageSharp/Processing/AffineTransformBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,16 @@ public SizeF GetTransformedSize(Rectangle sourceRectangle)
349349
internal static SizeF GetTransformedSize(Rectangle sourceRectangle, Matrix3x2 matrix)
350350
=> TransformUtilities.GetRawTransformedSize(matrix, sourceRectangle.Size);
351351

352+
/// <summary>
353+
/// Clears all accumulated transform matrices, resetting the builder to its initial state.
354+
/// </summary>
355+
/// <returns>The <see cref="AffineTransformBuilder"/>.</returns>
356+
public AffineTransformBuilder Clear()
357+
{
358+
this.transformMatrixFactories.Clear();
359+
return this;
360+
}
361+
352362
private static void CheckDegenerate(Matrix3x2 matrix)
353363
{
354364
if (TransformUtilities.IsDegenerate(matrix))

src/ImageSharp/Processing/ProjectiveTransformBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,16 @@ public SizeF GetTransformedSize(Rectangle sourceRectangle)
397397
internal static SizeF GetTransformedSize(Rectangle sourceRectangle, Matrix4x4 matrix)
398398
=> TransformUtilities.GetRawTransformedSize(matrix, sourceRectangle.Size);
399399

400+
/// <summary>
401+
/// Clears all accumulated transform matrices, resetting the builder to its initial state.
402+
/// </summary>
403+
/// <returns>The <see cref="ProjectiveTransformBuilder"/>.</returns>
404+
public ProjectiveTransformBuilder Clear()
405+
{
406+
this.transformMatrixFactories.Clear();
407+
return this;
408+
}
409+
400410
private static void CheckDegenerate(Matrix4x4 matrix)
401411
{
402412
if (TransformUtilities.IsDegenerate(matrix))

tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ protected override void PrependSkewRadians(AffineTransformBuilder builder, float
5858
protected override void PrependTranslation(AffineTransformBuilder builder, PointF translate)
5959
=> builder.PrependTranslation(translate);
6060

61+
protected override void ClearBuilder(AffineTransformBuilder builder)
62+
=> builder.Clear();
63+
6164
protected override Vector2 Execute(
6265
AffineTransformBuilder builder,
6366
Rectangle rectangle,

tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ protected override void PrependTranslation(ProjectiveTransformBuilder builder, P
5555
protected override void PrependRotationRadians(ProjectiveTransformBuilder builder, float radians, Vector2 origin) =>
5656
builder.PrependRotationRadians(radians, origin);
5757

58+
protected override void ClearBuilder(ProjectiveTransformBuilder builder)
59+
=> builder.Clear();
60+
5861
protected override Vector2 Execute(
5962
ProjectiveTransformBuilder builder,
6063
Rectangle rectangle,

tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,48 @@ public void ThrowsForInvalidMatrix()
248248
});
249249
}
250250

251+
[Fact]
252+
public void Clear_ResetsBuilderToIdentity()
253+
{
254+
Size size = new(100, 100);
255+
Rectangle rectangle = new(Point.Empty, size);
256+
Vector2 source = new(10, 20);
257+
258+
TBuilder builder = this.CreateBuilder();
259+
260+
// Apply a transform that changes the point.
261+
this.AppendScale(builder, new SizeF(2, 3));
262+
this.AppendTranslation(builder, new PointF(50, 50));
263+
Vector2 transformed = this.Execute(builder, rectangle, source);
264+
Assert.NotEqual(source, transformed, Comparer);
265+
266+
// Clear and verify the builder produces identity behavior.
267+
this.ClearBuilder(builder);
268+
Vector2 afterClear = this.Execute(builder, rectangle, source);
269+
Assert.Equal(source, afterClear, Comparer);
270+
}
271+
272+
[Fact]
273+
public void Clear_AllowsReuse()
274+
{
275+
Size size = new(100, 100);
276+
Rectangle rectangle = new(Point.Empty, size);
277+
Vector2 source = new(10, 20);
278+
279+
TBuilder builder = this.CreateBuilder();
280+
281+
// First transform: scale by 2.
282+
this.AppendScale(builder, new SizeF(2, 2));
283+
Vector2 scaled = this.Execute(builder, rectangle, source);
284+
Assert.Equal(new Vector2(20, 40), scaled, Comparer);
285+
286+
// Clear and apply a different transform: translate.
287+
this.ClearBuilder(builder);
288+
this.AppendTranslation(builder, new PointF(5, 10));
289+
Vector2 translated = this.Execute(builder, rectangle, source);
290+
Assert.Equal(new Vector2(15, 30), translated, Comparer);
291+
}
292+
251293
protected abstract TBuilder CreateBuilder();
252294

253295
protected abstract void AppendRotationDegrees(TBuilder builder, float degrees);
@@ -282,5 +324,7 @@ public void ThrowsForInvalidMatrix()
282324

283325
protected abstract void PrependTranslation(TBuilder builder, PointF translate);
284326

327+
protected abstract void ClearBuilder(TBuilder builder);
328+
285329
protected abstract Vector2 Execute(TBuilder builder, Rectangle rectangle, Vector2 sourcePoint);
286330
}

0 commit comments

Comments
 (0)