Browse Source

gfoidl IsOutOfRange

pull/1899/head
Dmitry Pentin 4 years ago
parent
commit
f3b8e5cd8d
  1. 9
      src/ImageSharp/Common/Helpers/Numerics.cs
  2. 4
      src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
  3. 20
      tests/ImageSharp.Tests/Common/NumericsTests.cs

9
src/ImageSharp/Common/Helpers/Numerics.cs

@ -963,5 +963,14 @@ namespace SixLabors.ImageSharp
public static uint RotateRightSoftwareFallback(uint value, int offset)
=> (value >> offset) | (value << (32 - offset));
#endif
/// <summary>
/// Tells whether input value is outside of the given range.
/// </summary>
/// <param name="value">Value.</param>
/// <param name="min">Mininum value, inclusive.</param>
/// <param name="max">Maximum value, inclusive.</param>
public static bool IsOutOfRange(int value, int min, int max)
=> (uint)(value - min) > (uint)(max - min);
}
}

4
src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs

@ -1031,13 +1031,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
int v = hv & 15;
// Validate: 1-4 range
if (h is < 1 or > 4)
if (Numerics.IsOutOfRange(h, 1, 4))
{
JpegThrowHelper.ThrowBadSampling(h);
}
// Validate: 1-4 range
if (v is < 1 or > 4)
if (Numerics.IsOutOfRange(v, 1, 4))
{
JpegThrowHelper.ThrowBadSampling(v);
}

20
tests/ImageSharp.Tests/Common/NumericsTests.cs

@ -97,5 +97,25 @@ namespace SixLabors.ImageSharp.Tests.Common
Assert.True(expected == actual, $"Expected: {expected}\nActual: {actual}\n{value} / {divisor} = {expected}");
}
}
private static bool IsOutOfRange_ReferenceImplementation(int value, int min, int max) => value < min || value > max;
[Theory]
[InlineData(1, 100)]
public void IsOutOfRange(int seed, int count)
{
var rng = new Random(seed);
for (int i = 0; i < count; i++)
{
int value = rng.Next();
int min = rng.Next();
int max = rng.Next(min, int.MaxValue);
bool expected = IsOutOfRange_ReferenceImplementation(value, min, max);
bool actual = Numerics.IsOutOfRange(value, min, max);
Assert.True(expected == actual, $"IsOutOfRange({value}, {min}, {max})");
}
}
}
}

Loading…
Cancel
Save