namespace HPPH.Test.PixelHelper; [TestClass] public class ConvertTests { private static IEnumerable GetTestImages() => Directory.EnumerateFiles(@"..\..\..\..\sample_data", "*.png", SearchOption.AllDirectories); [TestMethod] public void Convert3ByteSameBppRGBToBGR() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorBGR test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } [TestMethod] public void Convert4ByteSameBppRGBAToARGB() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGBA[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGBA[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGBA reference = referenceData[i]; ColorARGB test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } [TestMethod] public void Convert4ByteSameBppRGBAToBGRA() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGBA[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGBA[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGBA reference = referenceData[i]; ColorBGRA test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } [TestMethod] public void ConvertNarrow4ByteRGBAToRGB() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGBA[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGBA[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGBA reference = referenceData[i]; ColorRGB test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(255, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } [TestMethod] public void ConvertNarrow4ByteRGBAToBGR() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGBA[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGBA[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGBA reference = referenceData[i]; ColorBGR test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(255, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } [TestMethod] public void ConvertWiden3ByteRGBToRGBA() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorRGBA test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) { ColorABGR refColor = TestDataHelper.GetColorFromLocation(x, y); ColorRGBA color = converted[x, y]; Assert.AreEqual(255, color.A, $"Wrong A at x: {x}, y: {y}"); Assert.AreEqual(refColor.R, color.R, $"Wrong R at x: {x}, y: {y}"); Assert.AreEqual(refColor.G, color.G, $"Wrong G at x: {x}, y: {y}"); Assert.AreEqual(refColor.B, color.B, $"Wrong B at x: {x}, y: {y}"); } } [TestMethod] public void ConvertWiden3ByteRGBToARGB() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorARGB test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) { ColorABGR refColor = TestDataHelper.GetColorFromLocation(x, y); ColorARGB color = converted[x, y]; Assert.AreEqual(255, color.A, $"Wrong A at x: {x}, y: {y}"); Assert.AreEqual(refColor.R, color.R, $"Wrong R at x: {x}, y: {y}"); Assert.AreEqual(refColor.G, color.G, $"Wrong G at x: {x}, y: {y}"); Assert.AreEqual(refColor.B, color.B, $"Wrong B at x: {x}, y: {y}"); } } [TestMethod] public void ConvertWiden3ByteRGBToBGRA() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorBGRA test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) { ColorABGR refColor = TestDataHelper.GetColorFromLocation(x, y); ColorBGRA color = converted[x, y]; Assert.AreEqual(255, color.A, $"Wrong A at x: {x}, y: {y}"); Assert.AreEqual(refColor.R, color.R, $"Wrong R at x: {x}, y: {y}"); Assert.AreEqual(refColor.G, color.G, $"Wrong G at x: {x}, y: {y}"); Assert.AreEqual(refColor.B, color.B, $"Wrong B at x: {x}, y: {y}"); } } [TestMethod] public void ConvertWiden3ByteRGBToABGR() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = sourceData.Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorABGR test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) { ColorABGR refColor = TestDataHelper.GetColorFromLocation(x, y); ColorABGR color = converted[x, y]; Assert.AreEqual(255, color.A, $"Wrong A at x: {x}, y: {y}"); Assert.AreEqual(refColor.R, color.R, $"Wrong R at x: {x}, y: {y}"); Assert.AreEqual(refColor.G, color.G, $"Wrong G at x: {x}, y: {y}"); Assert.AreEqual(refColor.B, color.B, $"Wrong B at x: {x}, y: {y}"); } } [TestMethod] public void Convert3ByteSameBppRGBToBGRReadOnlySpan() { foreach (string image in GetTestImages()) { for (int skip = 0; skip < 4; skip++) { ColorRGB[] data = ImageHelper.GetColorsFromImage(image).SkipLast(skip).ToArray(); ReadOnlySpan referenceData = data; Span sourceData = new ColorRGB[referenceData.Length]; referenceData.CopyTo(sourceData); Span result = ((ReadOnlySpan)sourceData).Convert(); Assert.AreEqual(referenceData.Length, result.Length); for (int i = 0; i < referenceData.Length; i++) { ColorRGB reference = referenceData[i]; ColorBGR test = result[i]; Assert.AreEqual(reference.R, test.R, $"R differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.G, test.G, $"G differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.B, test.B, $"B differs at index {i}. Image: {image}, skip: {skip}"); Assert.AreEqual(reference.A, test.A, $"A differs at index {i}. Image: {image}, skip: {skip}"); } } } IImage converted = TestDataHelper.CreateTestImage(1920, 1080).ConvertTo(); for (int y = 0; y < converted.Height; y++) for (int x = 0; x < converted.Width; x++) Assert.AreEqual(TestDataHelper.GetColorFromLocation(x, y), converted[x, y], $"Wrong color at x: {x}, y: {y}"); } }