diff --git a/src/ImageSharp/PixelFormats/PixelBlenderMode.cs b/src/ImageSharp/PixelFormats/PixelBlenderMode.cs
index 7541be789..4b8f56d76 100644
--- a/src/ImageSharp/PixelFormats/PixelBlenderMode.cs
+++ b/src/ImageSharp/PixelFormats/PixelBlenderMode.cs
@@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.PixelFormats
///
/// Blends the 2 values by subtraction.
///
- Substract,
+ Subtract,
///
/// Multiplies the complements of the backdrop and source values, then complements the result.
diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.PixelBenders.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.PixelBenders.cs
index 154ec7373..2c225ba4c 100644
--- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.PixelBenders.cs
+++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.PixelBenders.cs
@@ -22,7 +22,7 @@ namespace SixLabors.ImageSharp.PixelFormats
{
case PixelBlenderMode.Multiply: return DefaultPixelBlenders.Multiply.Instance;
case PixelBlenderMode.Add: return DefaultPixelBlenders.Add.Instance;
- case PixelBlenderMode.Substract: return DefaultPixelBlenders.Substract.Instance;
+ case PixelBlenderMode.Subtract: return DefaultPixelBlenders.Subtract.Instance;
case PixelBlenderMode.Screen: return DefaultPixelBlenders.Screen.Instance;
case PixelBlenderMode.Darken: return DefaultPixelBlenders.Darken.Instance;
case PixelBlenderMode.Lighten: return DefaultPixelBlenders.Lighten.Instance;
diff --git a/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs b/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
index 3e7f3648f..0ff0b8557 100644
--- a/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
+++ b/tests/ImageSharp.Tests/Drawing/DrawImageTest.cs
@@ -28,7 +28,7 @@ namespace SixLabors.ImageSharp.Tests
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Normal)]
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Multiply)]
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Add)]
- [WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Substract)]
+ [WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Subtract)]
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Screen)]
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Darken)]
[WithFileCollection(nameof(TestFiles), PixelTypes, PixelBlenderMode.Lighten)]
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs
new file mode 100644
index 000000000..90b963f5c
--- /dev/null
+++ b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs
@@ -0,0 +1,52 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Processing;
+using SixLabors.ImageSharp.Processing.Drawing;
+
+using Xunit;
+
+namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders
+{
+ public class PorterDuffCompositorTests
+ {
+ // TODO: Add other modes to compare.
+ private static PixelBlenderMode[] CompositingOperators =
+ {
+ PixelBlenderMode.Src,
+ PixelBlenderMode.Atop,
+ PixelBlenderMode.Over,
+ PixelBlenderMode.In,
+ PixelBlenderMode.Out,
+ PixelBlenderMode.Dest,
+ PixelBlenderMode.DestAtop,
+ PixelBlenderMode.DestOver,
+ PixelBlenderMode.DestIn,
+ PixelBlenderMode.DestOut,
+ PixelBlenderMode.Clear,
+ PixelBlenderMode.Xor
+ };
+
+ [Fact]
+ public void PorterDuffOutputIsCorrect()
+ {
+ string path = TestEnvironment.CreateOutputDirectory("PorterDuff");
+ var srcFile = TestFile.Create(TestImages.Png.PDSrc);
+ var destFile = TestFile.Create(TestImages.Png.PDDest);
+
+ using (Image src = srcFile.CreateImage())
+ using (Image dest = destFile.CreateImage())
+ {
+ foreach (PixelBlenderMode m in CompositingOperators)
+ {
+ using (Image res = dest.Clone(x => x.Blend(src, new GraphicsOptions { BlenderMode = m })))
+ {
+ // TODO: Generate reference files once this works.
+ res.Save($"{path}/{m}.png");
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffFunctionsTests_TPixel.cs b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffFunctionsTests_TPixel.cs
index d77c42086..10a34ec31 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffFunctionsTests_TPixel.cs
+++ b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffFunctionsTests_TPixel.cs
@@ -160,7 +160,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders
public void SubstractFunction_Blender(TestPixel back, TestPixel source, float amount, TestPixel expected)
where TPixel : struct, IPixel
{
- TPixel actual = new DefaultPixelBlenders.Substract().Blend(back, source, amount);
+ TPixel actual = new DefaultPixelBlenders.Subtract().Blend(back, source, amount);
VectorAssert.Equal(expected, actual, 2);
}
@@ -170,7 +170,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders
where TPixel : struct, IPixel
{
Span dest = new Span(new TPixel[1]);
- new DefaultPixelBlenders.Substract().Blend(this.MemoryManager, dest, back.AsSpan(), source.AsSpan(), AsSpan(amount));
+ new DefaultPixelBlenders.Subtract().Blend(this.MemoryManager, dest, back.AsSpan(), source.AsSpan(), AsSpan(amount));
VectorAssert.Equal(expected, dest[0], 2);
}
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelOperationsTests.Blender.cs b/tests/ImageSharp.Tests/PixelFormats/PixelOperationsTests.Blender.cs
index 524747afe..d3956ecd5 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelOperationsTests.Blender.cs
+++ b/tests/ImageSharp.Tests/PixelFormats/PixelOperationsTests.Blender.cs
@@ -16,53 +16,53 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats
public static TheoryData