diff --git a/src/ImageProcessor/Colors/ColorSpacialTransforms.cs b/src/ImageProcessor/Colors/ColorSpacialTransforms.cs new file mode 100644 index 000000000..6a49708bf --- /dev/null +++ b/src/ImageProcessor/Colors/ColorSpacialTransforms.cs @@ -0,0 +1,31 @@ +// +// Copyright (c) James Jackson-South and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace ImageProcessor +{ + using System.Numerics; + + public partial struct Color + { + public static Color Multiply(Color source, Color destination) + { + if (destination == Color.Black) + { + return Color.Black; + } + if (destination == Color.White) + { + return source; + } + return + new Color( + new Vector4( + source.backingVector.X * destination.backingVector.X, + source.backingVector.Y * destination.backingVector.Y, + source.backingVector.Z * destination.backingVector.Z, + source.backingVector.W * destination.backingVector.W)); + } + } +} diff --git a/tests/ImageProcessor.Tests/Colors/ColorSpacialTransformTests.cs b/tests/ImageProcessor.Tests/Colors/ColorSpacialTransformTests.cs new file mode 100644 index 000000000..faf8173f1 --- /dev/null +++ b/tests/ImageProcessor.Tests/Colors/ColorSpacialTransformTests.cs @@ -0,0 +1,53 @@ +namespace ImageProcessor.Tests +{ + using Xunit; + + public class ColorSpacialTransformTests + { + public class MultiplyTests + { + [Fact] + public void MultiplyBlendConvertsRedBackdropAndGreenOverlayToBlack() + { + var backdrop = Color.Red; + var overlay = Color.Green; + + var result = Color.Multiply(backdrop, overlay); + + Assert.Equal(Color.Black, result); + } + [Fact] + public void MultiplyBlendConvertsBlueBackdropAndWhiteOverlayToBlue() + { + var backdrop = Color.Blue; + var overlay = Color.White; + + var result = Color.Multiply(backdrop, overlay); + + Assert.Equal(Color.Blue, result); + } + [Fact] + public void MultiplyBlendConvertsBlueBackdropAndBlackOverlayToBlack() + { + var backdrop = Color.Blue; + var overlay = Color.Black; + + var result = Color.Multiply(backdrop, overlay); + + Assert.Equal(Color.Black, result); + } + [Fact] + public void MultiplyBlendConvertsBlueBackdropAndGrayOverlayToBlueBlack() + { + var backdrop = Color.Blue; + var overlay = Color.Gray; + + var result = Color.Multiply(backdrop, overlay); + + var expected = new Color(0, 0, 0.5f, 1); + + Assert.True(expected.AlmostEquals(result,.01f)); + } + } + } +} \ No newline at end of file