diff --git a/src/ImageProcessorCore/PackedVector/Bgra32.cs b/src/ImageProcessorCore/PackedVector/Bgra32.cs index 626031d0e..eed4d5c02 100644 --- a/src/ImageProcessorCore/PackedVector/Bgra32.cs +++ b/src/ImageProcessorCore/PackedVector/Bgra32.cs @@ -2,7 +2,6 @@ // Copyright (c) James Jackson-South and contributors. // Licensed under the Apache License, Version 2.0. // - namespace ImageProcessorCore { using System; @@ -128,73 +127,73 @@ namespace ImageProcessorCore /// public void Add(Bgra32 value) { - this.B = (byte)Clamp(this.B + value.B); - this.G = (byte)Clamp(this.G + value.G); - this.R = (byte)Clamp(this.R + value.R); - this.A = (byte)Clamp(this.A + value.A); + this.B = Clamp(this.B + value.B); + this.G = Clamp(this.G + value.G); + this.R = Clamp(this.R + value.R); + this.A = Clamp(this.A + value.A); } /// public void Subtract(Bgra32 value) { - this.B = (byte)Clamp(this.B - value.B); - this.G = (byte)Clamp(this.G - value.G); - this.R = (byte)Clamp(this.R - value.R); - this.A = (byte)Clamp(this.A - value.A); + this.B = Clamp(this.B - value.B); + this.G = Clamp(this.G - value.G); + this.R = Clamp(this.R - value.R); + this.A = Clamp(this.A - value.A); } /// public void Multiply(Bgra32 value) { - this.B = (byte)Clamp(this.B * value.B); - this.G = (byte)Clamp(this.G * value.G); - this.R = (byte)Clamp(this.R * value.R); - this.A = (byte)Clamp(this.A * value.A); + this.B = Clamp(this.B * value.B); + this.G = Clamp(this.G * value.G); + this.R = Clamp(this.R * value.R); + this.A = Clamp(this.A * value.A); } /// public void Multiply(float value) { - this.B = (byte)Clamp(this.B * value); - this.G = (byte)Clamp(this.G * value); - this.R = (byte)Clamp(this.R * value); - this.A = (byte)Clamp(this.A * value); + this.B = Clamp(this.B * value); + this.G = Clamp(this.G * value); + this.R = Clamp(this.R * value); + this.A = Clamp(this.A * value); } /// public void Multiply(double value) { - this.B = (byte)Clamp(this.B * value); - this.G = (byte)Clamp(this.G * value); - this.R = (byte)Clamp(this.R * value); - this.A = (byte)Clamp(this.A * value); + this.B = Clamp(this.B * value); + this.G = Clamp(this.G * value); + this.R = Clamp(this.R * value); + this.A = Clamp(this.A * value); } /// public void Divide(Bgra32 value) { - this.B = (byte)Clamp((float)this.B / value.B); - this.G = (byte)Clamp((float)this.G / value.G); - this.R = (byte)Clamp((float)this.R / value.R); - this.A = (byte)Clamp((float)this.A / value.A); + this.B = Clamp((float)this.B / value.B); + this.G = Clamp((float)this.G / value.G); + this.R = Clamp((float)this.R / value.R); + this.A = Clamp((float)this.A / value.A); } /// public void Divide(float value) { - this.B = (byte)Clamp(this.B / value); - this.G = (byte)Clamp(this.G / value); - this.R = (byte)Clamp(this.R / value); - this.A = (byte)Clamp(this.A / value); + this.B = Clamp(this.B / value); + this.G = Clamp(this.G / value); + this.R = Clamp(this.R / value); + this.A = Clamp(this.A / value); } /// public void Divide(double value) { - this.B = (byte)Clamp(this.B / value); - this.G = (byte)Clamp(this.G / value); - this.R = (byte)Clamp(this.R / value); - this.A = (byte)Clamp(this.A / value); + this.B = Clamp(this.B / value); + this.G = Clamp(this.G / value); + this.R = Clamp(this.R / value); + this.A = Clamp(this.A / value); } /// @@ -269,11 +268,11 @@ namespace ImageProcessorCore /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static float Clamp(float value) + private static byte Clamp(float value) { value = (value > 255) ? 255 : value; value = (value < 0) ? 0 : value; - return value; + return (byte)value; } /// @@ -284,11 +283,11 @@ namespace ImageProcessorCore /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static double Clamp(double value) + private static byte Clamp(double value) { value = (value > 255) ? 255 : value; value = (value < 0) ? 0 : value; - return value; + return (byte)value; } /// @@ -300,6 +299,7 @@ namespace ImageProcessorCore /// /// A 32-bit signed integer that is the hash code for this instance. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] private int GetHashCode(Bgra32 packed) { return packed.packedValue.GetHashCode(); diff --git a/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs b/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs new file mode 100644 index 000000000..93b6cd94e --- /dev/null +++ b/tests/ImageProcessorCore.Benchmarks/Color/Clamp.cs @@ -0,0 +1,26 @@ +using System; + +namespace ImageProcessorCore.Benchmarks.Color +{ + using BenchmarkDotNet.Attributes; + + public class Clamp + { + [Benchmark(Baseline = true, Description = "Maths Clamp")] + public byte ClampMaths() + { + double value = 256; + 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; + } + + } +}