Browse Source

Implemented fallback code for runtimes where BitOperations class is not supported.

pull/1632/head
Dmitry Pentin 5 years ago
parent
commit
d2510036a6
  1. 2
      shared-infrastructure
  2. 35
      src/ImageSharp/Common/Helpers/Numerics.cs
  3. 2
      src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs

2
shared-infrastructure

@ -1 +1 @@
Subproject commit 48e73f455f15eafefbe3175efc7433e5f277e506 Subproject commit 25f56531057293e9f1fa8e070b2f780a0c3d7e0c

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

@ -23,6 +23,25 @@ namespace SixLabors.ImageSharp
private const int ShuffleAlphaControl = 0b_11_11_11_11; private const int ShuffleAlphaControl = 0b_11_11_11_11;
#endif #endif
#if !SUPPORTS_BITOPERATIONS
private static ReadOnlySpan<byte> BitCountLut => new byte[]
{
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8,
};
#endif
/// <summary> /// <summary>
/// Determine the Greatest CommonDivisor (GCD) of two numbers. /// Determine the Greatest CommonDivisor (GCD) of two numbers.
/// </summary> /// </summary>
@ -832,10 +851,24 @@ namespace SixLabors.ImageSharp
/// <param name="number">Unsigned integer to store</param> /// <param name="number">Unsigned integer to store</param>
/// <returns>Minimum number of bits needed to store given value</returns> /// <returns>Minimum number of bits needed to store given value</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int MinimumBitsToStore(uint number) public static int MinimumBitsToStore16(uint number)
{ {
#if SUPPORTS_BITOPERATIONS
const int bitInUnsignedInteger = sizeof(uint) * 8; const int bitInUnsignedInteger = sizeof(uint) * 8;
return bitInUnsignedInteger - BitOperations.LeadingZeroCount(number); return bitInUnsignedInteger - BitOperations.LeadingZeroCount(number);
#else
int bt;
if (number < 0x100)
{
bt = BitCountLut[(int)number];
}
else
{
bt = 8 + BitCountLut[(int)(number >> 8)];
}
return bt;
#endif
} }
} }
} }

2
src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs

@ -371,7 +371,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder
b = value - 1; b = value - 1;
} }
uint bt = (uint)Numerics.MinimumBitsToStore((uint)a); uint bt = (uint)Numerics.MinimumBitsToStore16((uint)a);
this.EmitHuff(index, (int)((uint)(runLength << 4) | bt)); this.EmitHuff(index, (int)((uint)(runLength << 4) | bt));
if (bt > 0) if (bt > 0)

Loading…
Cancel
Save