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;
+ }
+
+ }
+}