diff --git a/src/ImageSharp/ColorSpaces/Cmyk.cs b/src/ImageSharp/ColorSpaces/Cmyk.cs
index 711e9867f..1fa097d9e 100644
--- a/src/ImageSharp/ColorSpaces/Cmyk.cs
+++ b/src/ImageSharp/ColorSpaces/Cmyk.cs
@@ -58,8 +58,8 @@ namespace SixLabors.ImageSharp.ColorSpaces
{
vector = Vector4.Clamp(vector, Vector4.Zero, Vector4.One);
this.C = vector.X;
- this.Y = vector.Y;
- this.M = vector.Z;
+ this.M = vector.Y;
+ this.Y = vector.Z;
this.K = vector.W;
}
diff --git a/src/ImageSharp/ColorSpaces/Rgb.cs b/src/ImageSharp/ColorSpaces/Rgb.cs
index 7c8437d6e..8faf4f2b5 100644
--- a/src/ImageSharp/ColorSpaces/Rgb.cs
+++ b/src/ImageSharp/ColorSpaces/Rgb.cs
@@ -64,9 +64,10 @@ namespace SixLabors.ImageSharp.ColorSpaces
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public Rgb(float r, float g, float b, RgbWorkingSpace workingSpace)
{
- this.R = r;
- this.G = g;
- this.B = b;
+ // Clamp to 0-1 range.
+ this.R = r.Clamp(0, 1F);
+ this.G = g.Clamp(0, 1F);
+ this.B = b.Clamp(0, 1F);
this.WorkingSpace = workingSpace;
}
diff --git a/tests/ImageSharp.Tests/Colorspaces/ApproximateColorspaceComparer.cs b/tests/ImageSharp.Tests/Colorspaces/ApproximateColorspaceComparer.cs
new file mode 100644
index 000000000..28e2fdf82
--- /dev/null
+++ b/tests/ImageSharp.Tests/Colorspaces/ApproximateColorspaceComparer.cs
@@ -0,0 +1,46 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Collections.Generic;
+using SixLabors.ImageSharp.ColorSpaces;
+
+namespace SixLabors.ImageSharp.Tests.Colorspaces
+{
+ ///
+ /// Allows the approximate comparison of colorspace component values.
+ ///
+ internal class ApproximateColorSpaceComparer : IEqualityComparer
+ {
+ private readonly float Epsilon;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The comparison error difference epsilon to use.
+ public ApproximateColorSpaceComparer(float epsilon = 1F)
+ {
+ this.Epsilon = epsilon;
+ }
+
+ ///
+ public bool Equals(Rgb x, Rgb y)
+ {
+ return this.Equals(x.R, y.R)
+ && this.Equals(x.G, y.G)
+ && this.Equals(x.B, y.B);
+ }
+
+ ///
+ public int GetHashCode(Rgb obj)
+ {
+ return obj.GetHashCode();
+ }
+
+ private bool Equals(float x, float y)
+ {
+ float d = x - y;
+
+ return d >= -this.Epsilon && d <= this.Epsilon;
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs
index aed650b8e..94b3a8583 100644
--- a/tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs
+++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs
@@ -8,6 +8,7 @@ using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder;
using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters;
+using SixLabors.ImageSharp.Tests.Colorspaces;
using SixLabors.Memory;
using Xunit;
@@ -17,7 +18,9 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
{
public class JpegColorConverterTests
{
- private const float Precision = 0.1f / 255;
+ private const float Precision = 0.1F / 255;
+
+ private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(Precision);
public static readonly TheoryData CommonConversionData =
new TheoryData
@@ -59,7 +62,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
var actual = new Rgb(rgba.X, rgba.Y, rgba.Z);
var expected = ColorSpaceConverter.ToRgb(ycbcr);
- Assert.True(actual.AlmostEquals(expected, Precision), $"{actual} != {expected}");
+ Assert.Equal(expected, actual, ColorSpaceComparer);
Assert.Equal(1, rgba.W);
}
@@ -182,7 +185,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
var actual = new Rgb(rgba.X, rgba.Y, rgba.Z);
var expected = new Rgb(v.X, v.Y, v.Z);
- Assert.True(actual.AlmostEquals(expected, Precision));
+ Assert.Equal(expected, actual);
Assert.Equal(1, rgba.W);
}
}
@@ -204,7 +207,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
var actual = new Rgb(rgba.X, rgba.Y, rgba.Z);
var expected = new Rgb(y / 255F, y / 255F, y / 255F);
- Assert.True(actual.AlmostEquals(expected, Precision));
+ Assert.Equal(expected, actual, ColorSpaceComparer);
Assert.Equal(1, rgba.W);
}
}
@@ -228,7 +231,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
var actual = new Rgb(rgba.X, rgba.Y, rgba.Z);
var expected = new Rgb(r / 255F, g / 255F, b / 255F);
- Assert.True(actual.AlmostEquals(expected, Precision));
+ Assert.Equal(expected, actual, ColorSpaceComparer);
Assert.Equal(1, rgba.W);
}
}
@@ -266,7 +269,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg
var actual = new Rgb(rgba.X, rgba.Y, rgba.Z);
var expected = new Rgb(v.X, v.Y, v.Z);
- Assert.True(actual.AlmostEquals(expected, Precision));
+ Assert.Equal(expected, actual, ColorSpaceComparer);
Assert.Equal(1, rgba.W);
}
}