From 5de8fc7030c7500eecabc23045659e6d7258fc52 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 19 Apr 2017 16:08:36 +1000 Subject: [PATCH] Normalize Deree/Radian calculations --- .../CieLch/CieLabToCieLchConverter.cs | 10 +++---- src/ImageSharp/Common/Helpers/ImageMaths.cs | 13 -------- src/ImageSharp/Numerics/Point.cs | 6 ++-- .../Processors/ColorMatrix/HueProcessor.cs | 30 +++++++++---------- 4 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/CieLch/CieLabToCieLchConverter.cs b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/CieLch/CieLabToCieLchConverter.cs index 075aed500..8306d3cfd 100644 --- a/src/ImageSharp/Colors/Spaces/Conversion/Implementation/CieLch/CieLabToCieLchConverter.cs +++ b/src/ImageSharp/Colors/Spaces/Conversion/Implementation/CieLch/CieLabToCieLchConverter.cs @@ -23,11 +23,11 @@ namespace ImageSharp.Colors.Spaces.Conversion.Implementation.CieLch float hRadians = MathF.Atan2(b, a); float hDegrees = MathF.RadianToDegree(hRadians); - if (hDegrees > 360) - { - hDegrees -= 360; - } - else if (hDegrees < 0) + // Wrap the angle round at 360. + hDegrees = hDegrees % 360; + + // Make sure it's not negative. + while (hDegrees < 0) { hDegrees += 360; } diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMaths.cs index 224b267e4..d4e347b19 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs @@ -119,19 +119,6 @@ namespace ImageSharp return 1.0f; } - /// - /// Returns the given degrees converted to radians. - /// - /// The angle in degrees. - /// - /// The representing the degree as radians. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float DegreesToRadians(float degrees) - { - return degrees * (MathF.PI / 180); - } - /// /// Gets the bounding from the given points. /// diff --git a/src/ImageSharp/Numerics/Point.cs b/src/ImageSharp/Numerics/Point.cs index 3cd47659c..8d523895f 100644 --- a/src/ImageSharp/Numerics/Point.cs +++ b/src/ImageSharp/Numerics/Point.cs @@ -137,7 +137,7 @@ namespace ImageSharp /// The rotation public static Matrix3x2 CreateRotation(Point origin, float degrees) { - float radians = ImageMaths.DegreesToRadians(degrees); + float radians = MathF.DegreeToRadian(degrees); return Matrix3x2.CreateRotation(radians, new Vector2(origin.X, origin.Y)); } @@ -173,8 +173,8 @@ namespace ImageSharp /// The rotation public static Matrix3x2 CreateSkew(Point origin, float degreesX, float degreesY) { - float radiansX = ImageMaths.DegreesToRadians(degreesX); - float radiansY = ImageMaths.DegreesToRadians(degreesY); + float radiansX = MathF.DegreeToRadian(degreesX); + float radiansY = MathF.DegreeToRadian(degreesY); return Matrix3x2.CreateSkew(radiansX, radiansY, new Vector2(origin.X, origin.Y)); } diff --git a/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs b/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs index 0d06c5868..1979fd11d 100644 --- a/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ColorMatrix/HueProcessor.cs @@ -32,13 +32,13 @@ namespace ImageSharp.Processing.Processors this.Angle = angle; - float radians = ImageMaths.DegreesToRadians(angle); - double cosradians = Math.Cos(radians); - double sinradians = Math.Sin(radians); + float radians = MathF.DegreeToRadian(angle); + float cosradians = MathF.Cos(radians); + float sinradians = MathF.Sin(radians); - float lumR = .213f; - float lumG = .715f; - float lumB = .072f; + float lumR = .213F; + float lumG = .715F; + float lumB = .072F; float oneMinusLumR = 1 - lumR; float oneMinusLumG = 1 - lumG; @@ -49,15 +49,15 @@ namespace ImageSharp.Processing.Processors // Number are taken from https://msdn.microsoft.com/en-us/library/jj192162(v=vs.85).aspx Matrix4x4 matrix4X4 = new Matrix4x4() { - M11 = (float)(lumR + (cosradians * oneMinusLumR) - (sinradians * lumR)), - M12 = (float)(lumR - (cosradians * lumR) - (sinradians * 0.143)), - M13 = (float)(lumR - (cosradians * lumR) - (sinradians * oneMinusLumR)), - M21 = (float)(lumG - (cosradians * lumG) - (sinradians * lumG)), - M22 = (float)(lumG + (cosradians * oneMinusLumG) + (sinradians * 0.140)), - M23 = (float)(lumG - (cosradians * lumG) + (sinradians * lumG)), - M31 = (float)(lumB - (cosradians * lumB) + (sinradians * oneMinusLumB)), - M32 = (float)(lumB - (cosradians * lumB) - (sinradians * 0.283)), - M33 = (float)(lumB + (cosradians * oneMinusLumB) + (sinradians * lumB)), + M11 = lumR + (cosradians * oneMinusLumR) - (sinradians * lumR), + M12 = lumR - (cosradians * lumR) - (sinradians * 0.143F), + M13 = lumR - (cosradians * lumR) - (sinradians * oneMinusLumR), + M21 = lumG - (cosradians * lumG) - (sinradians * lumG), + M22 = lumG + (cosradians * oneMinusLumG) + (sinradians * 0.140F), + M23 = lumG - (cosradians * lumG) + (sinradians * lumG), + M31 = lumB - (cosradians * lumB) + (sinradians * oneMinusLumB), + M32 = lumB - (cosradians * lumB) - (sinradians * 0.283F), + M33 = lumB + (cosradians * oneMinusLumB) + (sinradians * lumB), M44 = 1 };