diff --git a/src/ImageSharp/Common/Extensions/ComparableExtensions.cs b/src/ImageSharp/Common/Extensions/ComparableExtensions.cs index f6a05eefe..6b0e34e79 100644 --- a/src/ImageSharp/Common/Extensions/ComparableExtensions.cs +++ b/src/ImageSharp/Common/Extensions/ComparableExtensions.cs @@ -24,12 +24,12 @@ namespace ImageSharp public static byte Clamp(this byte value, byte min, byte max) { // Order is important here as someone might set min to higher than max. - if (value > max) + if (value >= max) { return max; } - if (value < min) + if (value <= min) { return min; } @@ -48,12 +48,12 @@ namespace ImageSharp /// public static uint Clamp(this uint value, uint min, uint max) { - if (value > max) + if (value >= max) { return max; } - if (value < min) + if (value <= min) { return min; } @@ -72,12 +72,12 @@ namespace ImageSharp /// public static int Clamp(this int value, int min, int max) { - if (value > max) + if (value >= max) { return max; } - if (value < min) + if (value <= min) { return min; } @@ -96,12 +96,12 @@ namespace ImageSharp /// public static float Clamp(this float value, float min, float max) { - if (value > max) + if (value >= max) { return max; } - if (value < min) + if (value <= min) { return min; } @@ -120,12 +120,12 @@ namespace ImageSharp /// public static double Clamp(this double value, double min, double max) { - if (value > max) + if (value >= max) { return max; } - if (value < min) + if (value <= min) { return min; } diff --git a/tests/ImageSharp.Benchmarks/General/Clamp.cs b/tests/ImageSharp.Benchmarks/General/Clamp.cs index 4d4c7d855..abbcb4bf1 100644 --- a/tests/ImageSharp.Benchmarks/General/Clamp.cs +++ b/tests/ImageSharp.Benchmarks/General/Clamp.cs @@ -11,26 +11,54 @@ namespace ImageSharp.Benchmarks.General public class Clamp { + [Params(-1, 0, 255, 256)] + public int Value { get; set; } + [Benchmark(Baseline = true, Description = "Maths Clamp")] public byte ClampMaths() { - double value = 256; + int value = this.Value; return (byte)Math.Min(Math.Max(0, value), 255); } [Benchmark(Description = "No Maths Clamp")] public byte ClampNoMaths() { - double value = 256; - value = (value > 255) ? 255 : value; - value = (value < 0) ? 0 : value; - return (byte)value; + int value = this.Value; + value = value >= 255 ? 255 : value; + return (byte)(value <= 0 ? 0 : value); + } + + [Benchmark(Description = "No Maths No Equals Clamp")] + public byte ClampNoMathsNoEquals() + { + int value = this.Value; + value = value > 255 ? 255 : value; + return (byte)(value < 0 ? 0 : value); } [Benchmark(Description = "No Maths Clamp No Ternary")] public byte ClampNoMathsNoTernary() { - double value = 256; + int value = this.Value; + + if (value >= 255) + { + return 255; + } + + if (value <= 0) + { + return 0; + } + + return (byte)value; + } + + [Benchmark(Description = "No Maths No Equals Clamp No Ternary")] + public byte ClampNoMathsEqualsNoTernary() + { + int value = this.Value; if (value > 255) {