From 050296e8c2ef5fd6bb0820d08f2e9f510d47b795 Mon Sep 17 00:00:00 2001 From: christopherbauer Date: Thu, 14 Jan 2016 19:07:23 -0500 Subject: [PATCH] Fix the partial struct issue in #298 Former-commit-id: 1115e78624113394b0f522c69ceedf616bd525ec Former-commit-id: 68d0059211d610e1c589899b9d6f0c15b97aa3b7 Former-commit-id: 0912a58e2c372467a6a89a76d70db81a68f45202 --- .../Colors/ColorSpacialTransforms.cs | 31 +++++++++++ .../Colors/ColorSpacialTransformTests.cs | 53 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 src/ImageProcessor/Colors/ColorSpacialTransforms.cs create mode 100644 tests/ImageProcessor.Tests/Colors/ColorSpacialTransformTests.cs 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