Browse Source

Improve lookup logic

af/merge-core
James Jackson-South 8 years ago
parent
commit
79cfbacd98
  1. 9
      src/ImageSharp/Common/Constants.cs
  2. 14
      src/ImageSharp/Processing/Quantization/FrameQuantizers/FrameQuantizerBase{TPixel}.cs

9
src/ImageSharp/Common/Constants.cs

@ -9,8 +9,13 @@ namespace SixLabors.ImageSharp
internal static class Constants internal static class Constants
{ {
/// <summary> /// <summary>
/// The epsilon for comparing floating point numbers. /// The epsilon value for comparing floating point numbers.
/// </summary> /// </summary>
public static readonly float Epsilon = 0.001f; public static readonly float Epsilon = 0.001F;
/// <summary>
/// The epsilon squared value for comparing floating point numbers.
/// </summary>
public static readonly float EpsilonSquared = Epsilon * Epsilon;
} }
} }

14
src/ImageSharp/Processing/Quantization/FrameQuantizers/FrameQuantizerBase{TPixel}.cs

@ -144,20 +144,24 @@ namespace SixLabors.ImageSharp.Processing.Quantization.FrameQuantizers
int colorIndex = 0; int colorIndex = 0;
float leastDistance = float.MaxValue; float leastDistance = float.MaxValue;
var vector = pixel.ToVector4(); var vector = pixel.ToVector4();
float epsilon = Constants.EpsilonSquared;
for (int index = 0; index < colorPalette.Length; index++) for (int index = 0; index < colorPalette.Length; index++)
{ {
ref TPixel candidate = ref colorPalette[index]; ref TPixel candidate = ref colorPalette[index];
float distance = Vector4.DistanceSquared(vector, candidate.ToVector4()); float distance = Vector4.DistanceSquared(vector, candidate.ToVector4());
if (distance < leastDistance) // Greater... Move on.
if (!(distance < leastDistance))
{ {
colorIndex = index; continue;
leastDistance = distance;
} }
// If it's an exact match, exit the loop colorIndex = index;
if (distance == 0) leastDistance = distance;
// And if it's an exact match, exit the loop
if (distance < epsilon)
{ {
break; break;
} }

Loading…
Cancel
Save