diff --git a/src/ImageSharp/Common/Extensions/ByteExtensions.cs b/src/ImageSharp/Common/Extensions/ByteExtensions.cs
index f6c720795..b5b868dea 100644
--- a/src/ImageSharp/Common/Extensions/ByteExtensions.cs
+++ b/src/ImageSharp/Common/Extensions/ByteExtensions.cs
@@ -12,39 +12,6 @@ namespace SixLabors.ImageSharp
///
internal static class ByteExtensions
{
- ///
- /// Optimized reversal algorithm.
- ///
- /// The byte array.
- public static void ReverseBytes(this byte[] source)
- {
- ReverseBytes(source, 0, source.Length);
- }
-
- ///
- /// Optimized reversal algorithm.
- ///
- /// The byte array.
- /// The index.
- /// The length.
- /// is null.
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void ReverseBytes(this byte[] source, int index, int length)
- {
- Guard.NotNull(source, nameof(source));
-
- int i = index;
- int j = index + length - 1;
- while (i < j)
- {
- byte temp = source[i];
- source[i] = source[j];
- source[j] = temp;
- i++;
- j--;
- }
- }
-
///
/// Returns a reference to the given position of the array unsafe casted to .
///
diff --git a/src/ImageSharp/Common/Helpers/Guard.cs b/src/ImageSharp/Common/Helpers/Guard.cs
index 0db5cb7c1..9f0a46f80 100644
--- a/src/ImageSharp/Common/Helpers/Guard.cs
+++ b/src/ImageSharp/Common/Helpers/Guard.cs
@@ -230,18 +230,36 @@ namespace SixLabors.ImageSharp
}
///
- /// Verifies, that the `target` span has the length of 'minSpan', or longer.
+ /// Verifies, that the `source` span has the length of 'minSpan', or longer.
///
/// The element type of the spans
- /// The target span.
+ /// The source span.
/// The minimum length.
/// The name of the parameter that is to be checked.
///
- /// is true
+ /// is true
+ ///
+ public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName)
+ {
+ if (source.Length < minLength)
+ {
+ throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName);
+ }
+ }
+
+ ///
+ /// Verifies, that the `source` span has the length of 'minSpan', or longer.
+ ///
+ /// The element type of the spans
+ /// The target span.
+ /// The minimum length.
+ /// The name of the parameter that is to be checked.
+ ///
+ /// is true
///
- public static void MustBeSizedAtLeast(Span target, int minLength, string parameterName)
+ public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName)
{
- if (target.Length < minLength)
+ if (source.Length < minLength)
{
throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName);
}
diff --git a/src/ImageSharp/Formats/Gif/GifConstants.cs b/src/ImageSharp/Formats/Gif/GifConstants.cs
index d448cf783..ffab45a56 100644
--- a/src/ImageSharp/Formats/Gif/GifConstants.cs
+++ b/src/ImageSharp/Formats/Gif/GifConstants.cs
@@ -21,6 +21,11 @@ namespace SixLabors.ImageSharp.Formats.Gif
///
public const string FileVersion = "89a";
+ ///
+ /// The ASCII encoded bytes used to identify the GIF file.
+ ///
+ internal static readonly byte[] MagicNumber = Encoding.UTF8.GetBytes(FileType + FileVersion);
+
///
/// The extension block introducer !.
///
@@ -41,6 +46,11 @@ namespace SixLabors.ImageSharp.Formats.Gif
///
public const string ApplicationIdentification = "NETSCAPE2.0";
+ ///
+ /// The ASCII encoded application identification bytes.
+ ///
+ internal static readonly byte[] ApplicationIdentificationBytes = Encoding.UTF8.GetBytes(ApplicationIdentification);
+
///
/// The application block size.
///
diff --git a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs
index 57bb3d09a..436db636d 100644
--- a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs
+++ b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs
@@ -157,7 +157,7 @@ namespace SixLabors.ImageSharp.Formats.Gif
/// The writer to write to the stream with.
private void WriteHeader(EndianBinaryWriter writer)
{
- writer.Write((GifConstants.FileType + GifConstants.FileVersion).ToCharArray());
+ writer.Write(GifConstants.MagicNumber);
}
///
@@ -213,7 +213,7 @@ namespace SixLabors.ImageSharp.Formats.Gif
writer.Write(this.buffer, 0, 3);
- writer.Write(GifConstants.ApplicationIdentification.ToCharArray()); // NETSCAPE2.0
+ writer.Write(GifConstants.ApplicationIdentificationBytes); // NETSCAPE2.0
writer.Write((byte)3); // Application block length
writer.Write((byte)1); // Data sub-block index (always 1)
diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
index dba4eaa15..ffa387505 100644
--- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs
+++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs
@@ -3,6 +3,7 @@
using System;
using System.Buffers;
+using System.Buffers.Binary;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -348,13 +349,12 @@ namespace SixLabors.ImageSharp.Formats.Png
///
/// Converts a byte array to a new array where each value in the original array is represented by the specified number of bits.
///
- /// The bytes to convert from. Cannot be null.
+ /// The bytes to convert from. Cannot be empty.
/// The number of bytes per scanline
/// The number of bits per value.
- /// The resulting array. Is never null.
- /// is null.
+ /// The resulting array.
/// is less than or equals than zero.
- private static Span ToArrayByBitsLength(Span source, int bytesPerScanline, int bits)
+ private static ReadOnlySpan ToArrayByBitsLength(ReadOnlySpan source, int bytesPerScanline, int bits)
{
Guard.MustBeGreaterThan(source.Length, 0, nameof(source));
Guard.MustBeGreaterThan(bits, 0, nameof(bits));
@@ -414,14 +414,11 @@ namespace SixLabors.ImageSharp.Formats.Png
///
/// The metadata to read to.
/// The data containing physical data.
- private void ReadPhysicalChunk(ImageMetaData metadata, byte[] data)
+ private void ReadPhysicalChunk(ImageMetaData metadata, ReadOnlySpan data)
{
- data.ReverseBytes(0, 4);
- data.ReverseBytes(4, 4);
-
// 39.3700787 = inches in a meter.
- metadata.HorizontalResolution = BitConverter.ToInt32(data, 0) / 39.3700787d;
- metadata.VerticalResolution = BitConverter.ToInt32(data, 4) / 39.3700787d;
+ metadata.HorizontalResolution = BinaryPrimitives.ReadInt32BigEndian(data.Slice(0, 4)) / 39.3700787d;
+ metadata.VerticalResolution = BinaryPrimitives.ReadInt32BigEndian(data.Slice(4, 4)) / 39.3700787d;
}
///
@@ -671,7 +668,7 @@ namespace SixLabors.ImageSharp.Formats.Png
}
Span rowSpan = image.GetPixelRowSpan(this.currentRow);
- this.ProcessInterlacedDefilteredScanline(this.scanline.Array, rowSpan, Adam7FirstColumn[this.pass], Adam7ColumnIncrement[this.pass]);
+ this.ProcessInterlacedDefilteredScanline(this.scanline.Span, rowSpan, Adam7FirstColumn[this.pass], Adam7ColumnIncrement[this.pass]);
this.SwapBuffers();
@@ -699,20 +696,20 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The pixel format.
/// The de-filtered scanline
/// The image
- private void ProcessDefilteredScanline(byte[] defilteredScanline, ImageFrame pixels)
+ private void ProcessDefilteredScanline(ReadOnlySpan defilteredScanline, ImageFrame pixels)
where TPixel : struct, IPixel
{
var color = default(TPixel);
Span rowSpan = pixels.GetPixelRowSpan(this.currentRow);
// Trim the first marker byte from the buffer
- var scanlineBuffer = new Span(defilteredScanline, 1, defilteredScanline.Length - 1);
+ ReadOnlySpan scanlineBuffer = defilteredScanline.Slice(1, defilteredScanline.Length - 1);
switch (this.pngColorType)
{
case PngColorType.Grayscale:
int factor = 255 / ((int)Math.Pow(2, this.header.BitDepth) - 1);
- Span newScanline1 = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
+ ReadOnlySpan newScanline1 = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
for (int x = 0; x < this.header.Width; x++)
{
@@ -796,10 +793,10 @@ namespace SixLabors.ImageSharp.Formats.Png
}
else
{
- Span rgb24Span = scanlineBuffer.NonPortableCast();
+ ReadOnlySpan rgb24Span = scanlineBuffer.NonPortableCast();
for (int x = 0; x < this.header.Width; x++)
{
- ref Rgb24 rgb24 = ref rgb24Span[x];
+ ref readonly Rgb24 rgb24 = ref rgb24Span[x];
var rgba32 = default(Rgba32);
rgba32.Rgb = rgb24;
rgba32.A = (byte)(rgb24.Equals(this.rgb24Trans) ? 0 : 255);
@@ -840,7 +837,7 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The target buffer
/// The target length
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- private void From16BitTo8Bit(Span source, Span target, int length)
+ private void From16BitTo8Bit(ReadOnlySpan source, Span target, int length)
{
for (int i = 0, j = 0; i < length; i++, j += 2)
{
@@ -881,10 +878,10 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The type of pixel we are expanding to
/// The scanline
/// Thecurrent output image row
- private void ProcessScanlineFromPalette(Span defilteredScanline, Span row)
+ private void ProcessScanlineFromPalette(ReadOnlySpan defilteredScanline, Span row)
where TPixel : struct, IPixel
{
- Span newScanline = ToArrayByBitsLength(defilteredScanline, this.bytesPerScanline, this.header.BitDepth);
+ ReadOnlySpan newScanline = ToArrayByBitsLength(defilteredScanline, this.bytesPerScanline, this.header.BitDepth);
byte[] pal = this.palette;
var color = default(TPixel);
@@ -931,19 +928,19 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The current image row.
/// The column start index. Always 0 for none interlaced images.
/// The column increment. Always 1 for none interlaced images.
- private void ProcessInterlacedDefilteredScanline(byte[] defilteredScanline, Span rowSpan, int pixelOffset = 0, int increment = 1)
+ private void ProcessInterlacedDefilteredScanline(ReadOnlySpan defilteredScanline, Span rowSpan, int pixelOffset = 0, int increment = 1)
where TPixel : struct, IPixel
{
var color = default(TPixel);
// Trim the first marker byte from the buffer
- var scanlineBuffer = new Span(defilteredScanline, 1, defilteredScanline.Length - 1);
+ ReadOnlySpan scanlineBuffer = defilteredScanline.Slice(1, defilteredScanline.Length - 1);
switch (this.pngColorType)
{
case PngColorType.Grayscale:
int factor = 255 / ((int)Math.Pow(2, this.header.BitDepth) - 1);
- Span newScanline1 = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
+ ReadOnlySpan newScanline1 = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
for (int x = pixelOffset, o = 0; x < this.header.Width; x += increment, o++)
{
@@ -976,7 +973,7 @@ namespace SixLabors.ImageSharp.Formats.Png
case PngColorType.Palette:
- Span newScanline = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
+ ReadOnlySpan newScanline = ToArrayByBitsLength(scanlineBuffer, this.bytesPerScanline, this.header.BitDepth);
var rgba = default(Rgba32);
if (this.paletteAlpha != null && this.paletteAlpha.Length > 0)
@@ -1159,22 +1156,19 @@ namespace SixLabors.ImageSharp.Formats.Png
///
/// Reads a header chunk from the data.
///
- /// The containing data.
- private void ReadHeaderChunk(byte[] data)
+ /// The containing data.
+ private void ReadHeaderChunk(ReadOnlySpan data)
{
- this.header = new PngHeader();
-
- data.ReverseBytes(0, 4);
- data.ReverseBytes(4, 4);
-
- this.header.Width = BitConverter.ToInt32(data, 0);
- this.header.Height = BitConverter.ToInt32(data, 4);
-
- this.header.BitDepth = data[8];
- this.header.ColorType = (PngColorType)data[9];
- this.header.CompressionMethod = data[10];
- this.header.FilterMethod = data[11];
- this.header.InterlaceMethod = (PngInterlaceMode)data[12];
+ this.header = new PngHeader
+ {
+ Width = BinaryPrimitives.ReadInt32BigEndian(data.Slice(0, 4)),
+ Height = BinaryPrimitives.ReadInt32BigEndian(data.Slice(4, 4)),
+ BitDepth = data[8],
+ ColorType = (PngColorType)data[9],
+ CompressionMethod = data[10],
+ FilterMethod = data[11],
+ InterlaceMethod = (PngInterlaceMode)data[12]
+ };
}
///
@@ -1256,18 +1250,17 @@ namespace SixLabors.ImageSharp.Formats.Png
private void ReadChunkCrc(PngChunk chunk)
{
int numBytes = this.currentStream.Read(this.crcBuffer, 0, 4);
+
if (numBytes >= 1 && numBytes <= 3)
{
throw new ImageFormatException("Image stream is not valid!");
}
- this.crcBuffer.ReverseBytes();
-
- chunk.Crc = BitConverter.ToUInt32(this.crcBuffer, 0);
+ chunk.Crc = BinaryPrimitives.ReadUInt32BigEndian(this.crcBuffer);
this.crc.Reset();
this.crc.Update(this.chunkTypeBuffer);
- this.crc.Update(chunk.Data.Array, 0, chunk.Length);
+ this.crc.Update(new ReadOnlySpan(chunk.Data.Array, 0, chunk.Length));
if (this.crc.Value != chunk.Crc && IsCriticalChunk(chunk))
{
@@ -1328,15 +1321,14 @@ namespace SixLabors.ImageSharp.Formats.Png
private void ReadChunkLength(PngChunk chunk)
{
int numBytes = this.currentStream.Read(this.chunkLengthBuffer, 0, 4);
+
if (numBytes < 4)
{
chunk.Length = -1;
return;
}
- this.chunkLengthBuffer.ReverseBytes();
-
- chunk.Length = BitConverter.ToInt32(this.chunkLengthBuffer, 0);
+ chunk.Length = BinaryPrimitives.ReadInt32BigEndian(this.chunkLengthBuffer);
}
///
diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs
index 273516499..0cded1d80 100644
--- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs
+++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs
@@ -2,8 +2,10 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers.Binary;
using System.IO;
using System.Linq;
+using System.Runtime.InteropServices;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.Formats.Png.Filters;
using SixLabors.ImageSharp.Formats.Png.Zlib;
@@ -35,6 +37,11 @@ namespace SixLabors.ImageSharp.Formats.Png
///
private readonly byte[] chunkDataBuffer = new byte[16];
+ ///
+ /// Reusable buffer for writing int data.
+ ///
+ private readonly byte[] intBuffer = new byte[4];
+
///
/// Reusable crc for validating chunks.
///
@@ -243,52 +250,12 @@ namespace SixLabors.ImageSharp.Formats.Png
this.paeth?.Dispose();
}
- ///
- /// Writes an integer to the byte array.
- ///
- /// The containing image data.
- /// The amount to offset by.
- /// The value to write.
- private static void WriteInteger(byte[] data, int offset, int value)
- {
- byte[] buffer = BitConverter.GetBytes(value);
-
- buffer.ReverseBytes();
- Buffer.BlockCopy(buffer, 0, data, offset, 4);
- }
-
- ///
- /// Writes an integer to the stream.
- ///
- /// The containing image data.
- /// The value to write.
- private static void WriteInteger(Stream stream, int value)
- {
- byte[] buffer = BitConverter.GetBytes(value);
-
- buffer.ReverseBytes();
- stream.Write(buffer, 0, 4);
- }
-
- ///
- /// Writes an unsigned integer to the stream.
- ///
- /// The containing image data.
- /// The value to write.
- private static void WriteInteger(Stream stream, uint value)
- {
- byte[] buffer = BitConverter.GetBytes(value);
-
- buffer.ReverseBytes();
- stream.Write(buffer, 0, 4);
- }
-
///
/// Collects a row of grayscale pixels.
///
/// The pixel format.
/// The image row span.
- private void CollectGrayscaleBytes(Span rowSpan)
+ private void CollectGrayscaleBytes(ReadOnlySpan rowSpan)
where TPixel : struct, IPixel
{
byte[] rawScanlineArray = this.rawScanline.Array;
@@ -323,7 +290,7 @@ namespace SixLabors.ImageSharp.Formats.Png
///
/// The pixel format.
/// The row span.
- private void CollecTPixelBytes(Span rowSpan)
+ private void CollecTPixelBytes(ReadOnlySpan rowSpan)
where TPixel : struct, IPixel
{
if (this.bytesPerPixel == 4)
@@ -344,7 +311,7 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The row span.
/// The row.
/// The
- private IManagedByteBuffer EncodePixelRow(Span rowSpan, int row)
+ private IManagedByteBuffer EncodePixelRow(ReadOnlySpan rowSpan, int row)
where TPixel : struct, IPixel
{
switch (this.pngColorType)
@@ -450,8 +417,8 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The .
private void WriteHeaderChunk(Stream stream, PngHeader header)
{
- WriteInteger(this.chunkDataBuffer, 0, header.Width);
- WriteInteger(this.chunkDataBuffer, 4, header.Height);
+ BinaryPrimitives.WriteInt32BigEndian(new Span(this.chunkDataBuffer, 0, 4), header.Width);
+ BinaryPrimitives.WriteInt32BigEndian(new Span(this.chunkDataBuffer, 4, 4), header.Height);
this.chunkDataBuffer[8] = header.BitDepth;
this.chunkDataBuffer[9] = (byte)header.ColorType;
@@ -535,8 +502,8 @@ namespace SixLabors.ImageSharp.Formats.Png
int dpmX = (int)Math.Round(image.MetaData.HorizontalResolution * 39.3700787D);
int dpmY = (int)Math.Round(image.MetaData.VerticalResolution * 39.3700787D);
- WriteInteger(this.chunkDataBuffer, 0, dpmX);
- WriteInteger(this.chunkDataBuffer, 4, dpmY);
+ BinaryPrimitives.WriteInt32BigEndian(new Span(this.chunkDataBuffer, 0, 4), dpmX);
+ BinaryPrimitives.WriteInt32BigEndian(new Span(this.chunkDataBuffer, 4, 4), dpmY);
this.chunkDataBuffer[8] = 1;
@@ -552,14 +519,10 @@ namespace SixLabors.ImageSharp.Formats.Png
{
if (this.writeGamma)
{
- int gammaValue = (int)(this.gamma * 100000F);
+ // 4-byte unsigned integer of gamma * 100,000.
+ uint gammaValue = (uint)(this.gamma * 100_000F);
- byte[] size = BitConverter.GetBytes(gammaValue);
-
- this.chunkDataBuffer[0] = size[3];
- this.chunkDataBuffer[1] = size[2];
- this.chunkDataBuffer[2] = size[1];
- this.chunkDataBuffer[3] = size[0];
+ BinaryPrimitives.WriteUInt32BigEndian(new Span(this.chunkDataBuffer, 0, 4), gammaValue);
this.WriteChunk(stream, PngChunkTypes.Gamma, this.chunkDataBuffer, 0, 4);
}
@@ -591,15 +554,14 @@ namespace SixLabors.ImageSharp.Formats.Png
byte[] buffer;
int bufferLength;
- MemoryStream memoryStream = null;
- try
+
+ using (var memoryStream = new MemoryStream())
{
- memoryStream = new MemoryStream();
using (var deflateStream = new ZlibDeflateStream(memoryStream, this.compressionLevel))
{
for (int y = 0; y < this.height; y++)
{
- IManagedByteBuffer r = this.EncodePixelRow(pixels.GetPixelRowSpan(y), y);
+ IManagedByteBuffer r = this.EncodePixelRow(pixels.GetPixelRowSpan(y).AsReadOnlySpan(), y);
deflateStream.Write(r.Array, 0, resultLength);
IManagedByteBuffer temp = this.rawScanline;
@@ -611,10 +573,6 @@ namespace SixLabors.ImageSharp.Formats.Png
buffer = memoryStream.ToArray();
bufferLength = buffer.Length;
}
- finally
- {
- memoryStream?.Dispose();
- }
// Store the chunks in repeated 64k blocks.
// This reduces the memory load for decoding the image for many decoders.
@@ -668,7 +626,9 @@ namespace SixLabors.ImageSharp.Formats.Png
/// The of the data to write.
private void WriteChunk(Stream stream, string type, byte[] data, int offset, int length)
{
- WriteInteger(stream, length);
+ BinaryPrimitives.WriteInt32BigEndian(this.intBuffer, length);
+
+ stream.Write(this.intBuffer, 0, 4); // write the length
this.chunkTypeBuffer[0] = (byte)type[0];
this.chunkTypeBuffer[1] = (byte)type[1];
@@ -677,20 +637,20 @@ namespace SixLabors.ImageSharp.Formats.Png
stream.Write(this.chunkTypeBuffer, 0, 4);
- if (data != null)
- {
- stream.Write(data, offset, length);
- }
-
this.crc.Reset();
+
this.crc.Update(this.chunkTypeBuffer);
if (data != null && length > 0)
{
- this.crc.Update(data, offset, length);
+ stream.Write(data, offset, length);
+
+ this.crc.Update(new ReadOnlySpan(data, offset, length));
}
- WriteInteger(stream, (uint)this.crc.Value);
+ BinaryPrimitives.WriteUInt32BigEndian(this.intBuffer, (uint)this.crc.Value);
+
+ stream.Write(this.intBuffer, 0, 4); // write the crc
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
index 1cce90c0b..9c4e9e4b9 100644
--- a/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/Adler32.cs
@@ -113,30 +113,15 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Update(byte[] buffer)
+ public void Update(ReadOnlySpan data)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
-
- this.Update(buffer, 0, buffer.Length);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Update(byte[] buffer, int offset, int count)
- {
- DebugGuard.NotNull(buffer, nameof(buffer));
- DebugGuard.MustBeGreaterThanOrEqualTo(offset, 0, nameof(offset));
- DebugGuard.MustBeGreaterThanOrEqualTo(count, 0, nameof(count));
- DebugGuard.MustBeLessThan(offset, buffer.Length, nameof(offset));
- DebugGuard.MustBeLessThanOrEqualTo(offset + count, buffer.Length, nameof(count));
-
// (By Per Bothner)
uint s1 = this.checksum & 0xFFFF;
uint s2 = this.checksum >> 16;
+ int count = data.Length;
+ int offset = 0;
+
while (count > 0)
{
// We can defer the modulo operation:
@@ -151,7 +136,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
count -= n;
while (--n >= 0)
{
- s1 = s1 + (uint)(buffer[offset++] & 0xff);
+ s1 = s1 + (uint)(data[offset++] & 0xff);
s2 = s2 + s1;
}
diff --git a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs b/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
index bd686f2b9..d1588c384 100644
--- a/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/Crc32.cs
@@ -137,30 +137,13 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Update(byte[] buffer)
+ public void Update(ReadOnlySpan data)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
-
- this.Update(buffer, 0, buffer.Length);
- }
-
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public void Update(byte[] buffer, int offset, int count)
- {
- DebugGuard.NotNull(buffer, nameof(buffer));
- DebugGuard.MustBeGreaterThanOrEqualTo(count, 0, nameof(count));
- DebugGuard.MustBeGreaterThanOrEqualTo(offset, 0, nameof(offset));
- DebugGuard.MustBeLessThanOrEqualTo(offset + count, buffer.Length, nameof(count));
-
this.crc ^= CrcSeed;
- while (--count >= 0)
+ for (int i = 0; i < data.Length; i++)
{
- this.crc = CrcTable[(this.crc ^ buffer[offset++]) & 0xFF] ^ (this.crc >> 8);
+ this.crc = CrcTable[(this.crc ^ data[i]) & 0xFF] ^ (this.crc >> 8);
}
this.crc ^= CrcSeed;
diff --git a/src/ImageSharp/Formats/Png/Zlib/IChecksum.cs b/src/ImageSharp/Formats/Png/Zlib/IChecksum.cs
index 9d84258ca..a2a57332b 100644
--- a/src/ImageSharp/Formats/Png/Zlib/IChecksum.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/IChecksum.cs
@@ -1,6 +1,8 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System;
+
namespace SixLabors.ImageSharp.Formats.Png.Zlib
{
///
@@ -34,25 +36,11 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
void Update(int value);
///
- /// Updates the data checksum with the bytes taken from the array.
+ /// Updates the data checksum with the bytes taken from the span.
///
- ///
+ ///
/// buffer an array of bytes
///
- void Update(byte[] buffer);
-
- ///
- /// Adds the byte array to the data checksum.
- ///
- ///
- /// The buffer which contains the data
- ///
- ///
- /// The offset in the buffer where the data starts
- ///
- ///
- /// the number of data bytes to add.
- ///
- void Update(byte[] buffer, int offset, int count);
+ void Update(ReadOnlySpan data);
}
}
diff --git a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs
index dd20886ff..51e6b4859 100644
--- a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs
+++ b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs
@@ -163,7 +163,7 @@ namespace SixLabors.ImageSharp.Formats.Png.Zlib
public override void Write(byte[] buffer, int offset, int count)
{
this.deflateStream.Write(buffer, offset, count);
- this.adler32.Update(buffer, offset, count);
+ this.adler32.Update(new ReadOnlySpan(buffer, offset, count));
}
///
diff --git a/src/ImageSharp/IO/BigEndianBitConverter.cs b/src/ImageSharp/IO/BigEndianBitConverter.cs
deleted file mode 100644
index 2fcfd966c..000000000
--- a/src/ImageSharp/IO/BigEndianBitConverter.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Implementation of EndianBitConverter which converts to/from big-endian byte arrays.
- ///
- internal sealed class BigEndianBitConverter : EndianBitConverter
- {
- ///
- public override Endianness Endianness
- {
- get { return Endianness.BigEndian; }
- }
-
- ///
- public override bool IsLittleEndian
- {
- get { return false; }
- }
-
- ///
- public override void CopyBytes(short value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 2);
-
- buffer[index] = (byte)(value >> 8);
- buffer[index + 1] = (byte)value;
- }
-
- ///
- public override void CopyBytes(int value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 4);
-
- buffer[index] = (byte)(value >> 24);
- buffer[index + 1] = (byte)(value >> 16);
- buffer[index + 2] = (byte)(value >> 8);
- buffer[index + 3] = (byte)value;
- }
-
- ///
- public override void CopyBytes(long value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 8);
-
- buffer[index] = (byte)(value >> 56);
- buffer[index + 1] = (byte)(value >> 48);
- buffer[index + 2] = (byte)(value >> 40);
- buffer[index + 3] = (byte)(value >> 32);
- buffer[index + 4] = (byte)(value >> 24);
- buffer[index + 5] = (byte)(value >> 16);
- buffer[index + 6] = (byte)(value >> 8);
- buffer[index + 7] = (byte)value;
- }
-
- ///
- public override short ToInt16(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 2);
-
- return (short)((value[startIndex] << 8) | value[startIndex + 1]);
- }
-
- ///
- public override int ToInt32(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 4);
-
- return (value[startIndex] << 24) | (value[startIndex + 1] << 16) | (value[startIndex + 2] << 8) | value[startIndex + 3];
- }
-
- ///
- public override long ToInt64(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 8);
-
- long p1 = (value[startIndex] << 24) | (value[startIndex + 1] << 16) | (value[startIndex + 2] << 8) | value[startIndex + 3];
- long p2 = (value[startIndex + 4] << 24) | (value[startIndex + 5] << 16) | (value[startIndex + 6] << 8) | value[startIndex + 7];
- return (p2 & 0xFFFFFFFF) | (p1 << 32);
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/IO/EndianBinaryReader.cs b/src/ImageSharp/IO/EndianBinaryReader.cs
index 0d660c68d..6454ff250 100644
--- a/src/ImageSharp/IO/EndianBinaryReader.cs
+++ b/src/ImageSharp/IO/EndianBinaryReader.cs
@@ -2,57 +2,32 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers.Binary;
using System.IO;
using System.Text;
namespace SixLabors.ImageSharp.IO
{
///
- /// Equivalent of , but with either endianness, depending on the it is constructed with.
+ /// Equivalent of , but with either endianness.
/// No data is buffered in the reader; the client may seek within the stream at will.
///
internal class EndianBinaryReader : IDisposable
{
- ///
- /// Decoder to use for string conversions.
- ///
- private readonly Decoder decoder;
-
///
/// Buffer used for temporary storage before conversion into primitives
///
private readonly byte[] storageBuffer = new byte[16];
- ///
- /// Buffer used for temporary storage when reading a single character
- ///
- private readonly char[] charBuffer = new char[1];
-
- ///
- /// Minimum number of bytes used to encode a character
- ///
- private readonly int minBytesPerChar;
-
///
/// Whether or not this reader has been disposed yet.
///
private bool disposed;
///
- /// Initializes a new instance of the class.
- /// Equivalent of , but with either endianness, depending on
- /// the EndianBitConverter it is constructed with.
+ /// The endianness used to read data
///
- ///
- /// Endianness to use when reading data
- ///
- ///
- /// Stream to read data from
- ///
- public EndianBinaryReader(Endianness endianness, Stream stream)
- : this(endianness, stream, Encoding.UTF8)
- {
- }
+ private readonly Endianness endianness;
///
/// Initializes a new instance of the class.
@@ -61,40 +36,20 @@ namespace SixLabors.ImageSharp.IO
///
/// Endianness to use when reading data
/// Stream to read data from
- /// Encoding to use when reading character data
- public EndianBinaryReader(Endianness endianness, Stream stream, Encoding encoding)
+ public EndianBinaryReader(Endianness endianness, Stream stream)
{
Guard.NotNull(stream, nameof(stream));
- Guard.NotNull(encoding, nameof(encoding));
Guard.IsTrue(stream.CanRead, nameof(stream), "Stream isn't readable");
this.BaseStream = stream;
- this.BitConverter = EndianBitConverter.GetConverter(endianness);
- this.Encoding = encoding;
- this.decoder = encoding.GetDecoder();
- this.minBytesPerChar = 1;
-
- if (encoding is UnicodeEncoding)
- {
- this.minBytesPerChar = 2;
- }
+ this.endianness = endianness;
}
- ///
- /// Gets the encoding used to read strings
- ///
- public Encoding Encoding { get; }
-
///
/// Gets the underlying stream of the EndianBinaryReader.
///
public Stream BaseStream { get; }
- ///
- /// Gets the bit converter used to read values from the stream.
- ///
- internal EndianBitConverter BitConverter { get; }
-
///
/// Closes the reader, including the underlying stream.
///
@@ -141,7 +96,8 @@ namespace SixLabors.ImageSharp.IO
public bool ReadBoolean()
{
this.ReadInternal(this.storageBuffer, 1);
- return this.BitConverter.ToBoolean(this.storageBuffer, 0);
+
+ return this.storageBuffer[0] != 0;
}
///
@@ -152,7 +108,10 @@ namespace SixLabors.ImageSharp.IO
public short ReadInt16()
{
this.ReadInternal(this.storageBuffer, 2);
- return this.BitConverter.ToInt16(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadInt16BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadInt16LittleEndian(this.storageBuffer);
}
///
@@ -163,7 +122,10 @@ namespace SixLabors.ImageSharp.IO
public int ReadInt32()
{
this.ReadInternal(this.storageBuffer, 4);
- return this.BitConverter.ToInt32(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadInt32BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadInt32LittleEndian(this.storageBuffer);
}
///
@@ -174,7 +136,10 @@ namespace SixLabors.ImageSharp.IO
public long ReadInt64()
{
this.ReadInternal(this.storageBuffer, 8);
- return this.BitConverter.ToInt64(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadInt64BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadInt64LittleEndian(this.storageBuffer);
}
///
@@ -185,7 +150,10 @@ namespace SixLabors.ImageSharp.IO
public ushort ReadUInt16()
{
this.ReadInternal(this.storageBuffer, 2);
- return this.BitConverter.ToUInt16(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadUInt16BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadUInt16LittleEndian(this.storageBuffer);
}
///
@@ -196,7 +164,10 @@ namespace SixLabors.ImageSharp.IO
public uint ReadUInt32()
{
this.ReadInternal(this.storageBuffer, 4);
- return this.BitConverter.ToUInt32(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadUInt32BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadUInt32LittleEndian(this.storageBuffer);
}
///
@@ -207,7 +178,10 @@ namespace SixLabors.ImageSharp.IO
public ulong ReadUInt64()
{
this.ReadInternal(this.storageBuffer, 8);
- return this.BitConverter.ToUInt64(this.storageBuffer, 0);
+
+ return (this.endianness == Endianness.BigEndian)
+ ? BinaryPrimitives.ReadUInt64BigEndian(this.storageBuffer)
+ : BinaryPrimitives.ReadUInt64LittleEndian(this.storageBuffer);
}
///
@@ -215,10 +189,11 @@ namespace SixLabors.ImageSharp.IO
/// for this reader. 4 bytes are read.
///
/// The floating point value read
- public float ReadSingle()
+ public unsafe float ReadSingle()
{
- this.ReadInternal(this.storageBuffer, 4);
- return this.BitConverter.ToSingle(this.storageBuffer, 0);
+ int intValue = this.ReadInt32();
+
+ return *((float*)&intValue);
}
///
@@ -226,107 +201,11 @@ namespace SixLabors.ImageSharp.IO
/// for this reader. 8 bytes are read.
///
/// The floating point value read
- public double ReadDouble()
+ public unsafe double ReadDouble()
{
- this.ReadInternal(this.storageBuffer, 8);
- return this.BitConverter.ToDouble(this.storageBuffer, 0);
- }
+ long value = this.ReadInt64();
- ///
- /// Reads a decimal value from the stream, using the bit converter
- /// for this reader. 16 bytes are read.
- ///
- /// The decimal value read
- public decimal ReadDecimal()
- {
- this.ReadInternal(this.storageBuffer, 16);
- return this.BitConverter.ToDecimal(this.storageBuffer, 0);
- }
-
- ///
- /// Reads a single character from the stream, using the character encoding for
- /// this reader. If no characters have been fully read by the time the stream ends,
- /// -1 is returned.
- ///
- /// The character read, or -1 for end of stream.
- public int Read()
- {
- int charsRead = this.Read(this.charBuffer, 0, 1);
- if (charsRead == 0)
- {
- return -1;
- }
- else
- {
- return this.charBuffer[0];
- }
- }
-
- ///
- /// Reads the specified number of characters into the given buffer, starting at
- /// the given index.
- ///
- /// The buffer to copy data into
- /// The first index to copy data into
- /// The number of characters to read
- /// The number of characters actually read. This will only be less than
- /// the requested number of characters if the end of the stream is reached.
- ///
- public int Read(char[] data, int index, int count)
- {
- this.CheckDisposed();
-
- Guard.NotNull(this.storageBuffer, nameof(this.storageBuffer));
- Guard.MustBeGreaterThanOrEqualTo(index, 0, nameof(index));
- Guard.MustBeGreaterThanOrEqualTo(count, 0, nameof(count));
- Guard.IsFalse(count + index > data.Length, nameof(data.Length), "Not enough space in buffer for specified number of characters starting at specified index.");
-
- int read = 0;
- bool firstTime = true;
-
- // Use the normal buffer if we're only reading a small amount, otherwise
- // use at most 4K at a time.
- byte[] byteBuffer = this.storageBuffer;
-
- if (byteBuffer.Length < count * this.minBytesPerChar)
- {
- byteBuffer = new byte[4096];
- }
-
- while (read < count)
- {
- int amountToRead;
-
- // First time through we know we haven't previously read any data
- if (firstTime)
- {
- amountToRead = count * this.minBytesPerChar;
- firstTime = false;
- }
- else
- {
- // After that we can only assume we need to fully read 'chars left -1' characters
- // and a single byte of the character we may be in the middle of
- amountToRead = ((count - read - 1) * this.minBytesPerChar) + 1;
- }
-
- if (amountToRead > byteBuffer.Length)
- {
- amountToRead = byteBuffer.Length;
- }
-
- int bytesRead = this.TryReadInternal(byteBuffer, amountToRead);
- if (bytesRead == 0)
- {
- return read;
- }
-
- int decoded = this.decoder.GetChars(byteBuffer, 0, bytesRead, data, index);
- read += decoded;
- index += decoded;
- }
-
- return read;
+ return *((double*)&value);
}
///
@@ -411,84 +290,6 @@ namespace SixLabors.ImageSharp.IO
return ret;
}
- ///
- /// Reads a 7-bit encoded integer from the stream. This is stored with the least significant
- /// information first, with 7 bits of information per byte of value, and the top
- /// bit as a continuation flag. This method is not affected by the endianness
- /// of the bit converter.
- ///
- /// The 7-bit encoded integer read from the stream.
- public int Read7BitEncodedInt()
- {
- this.CheckDisposed();
-
- int ret = 0;
- for (int shift = 0; shift < 35; shift += 7)
- {
- int b = this.BaseStream.ReadByte();
- if (b == -1)
- {
- throw new EndOfStreamException();
- }
-
- ret = ret | ((b & 0x7f) << shift);
- if ((b & 0x80) == 0)
- {
- return ret;
- }
- }
-
- // Still haven't seen a byte with the high bit unset? Dodgy data.
- throw new IOException("Invalid 7-bit encoded integer in stream.");
- }
-
- ///
- /// Reads a 7-bit encoded integer from the stream. This is stored with the most significant
- /// information first, with 7 bits of information per byte of value, and the top
- /// bit as a continuation flag. This method is not affected by the endianness
- /// of the bit converter.
- ///
- /// The 7-bit encoded integer read from the stream.
- public int ReadBigEndian7BitEncodedInt()
- {
- this.CheckDisposed();
-
- int ret = 0;
- for (int i = 0; i < 5; i++)
- {
- int b = this.BaseStream.ReadByte();
- if (b == -1)
- {
- throw new EndOfStreamException();
- }
-
- ret = (ret << 7) | (b & 0x7f);
- if ((b & 0x80) == 0)
- {
- return ret;
- }
- }
-
- // Still haven't seen a byte with the high bit unset? Dodgy data.
- throw new IOException("Invalid 7-bit encoded integer in stream.");
- }
-
- ///
- /// Reads a length-prefixed string from the stream, using the encoding for this reader.
- /// A 7-bit encoded integer is first read, which specifies the number of bytes
- /// to read from the stream. These bytes are then converted into a string with
- /// the encoding for this reader.
- ///
- /// The string read from the stream.
- public string ReadString()
- {
- int bytesToRead = this.Read7BitEncodedInt();
-
- byte[] data = new byte[bytesToRead];
- this.ReadInternal(data, bytesToRead);
- return this.Encoding.GetString(data, 0, data.Length);
- }
-
///
/// Disposes of the underlying stream.
///
diff --git a/src/ImageSharp/IO/EndianBinaryWriter.cs b/src/ImageSharp/IO/EndianBinaryWriter.cs
index dd87faf45..9c42f0b69 100644
--- a/src/ImageSharp/IO/EndianBinaryWriter.cs
+++ b/src/ImageSharp/IO/EndianBinaryWriter.cs
@@ -2,14 +2,13 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers.Binary;
using System.IO;
-using System.Text;
namespace SixLabors.ImageSharp.IO
{
///
- /// Equivalent of , but with either endianness, depending on
- /// the it is constructed with.
+ /// Equivalent of , but with either endianness
///
internal class EndianBinaryWriter : IDisposable
{
@@ -19,61 +18,35 @@ namespace SixLabors.ImageSharp.IO
private readonly byte[] buffer = new byte[16];
///
- /// Buffer used for Write(char)
+ /// The endianness used to write the data
///
- private readonly char[] charBuffer = new char[1];
+ private readonly Endianness endianness;
///
/// Whether or not this writer has been disposed yet.
///
private bool disposed;
- ///
- /// Initializes a new instance of the class
- /// with the given bit converter, writing to the given stream, using UTF-8 encoding.
- ///
- /// Endianness to use when writing data
- /// Stream to write data to
- public EndianBinaryWriter(Endianness endianness, Stream stream)
- : this(endianness, stream, Encoding.UTF8)
- {
- }
-
///
/// Initializes a new instance of the class
/// with the given bit converter, writing to the given stream, using the given encoding.
///
/// Endianness to use when writing data
/// Stream to write data to
- ///
- /// Encoding to use when writing character data
- ///
- public EndianBinaryWriter(Endianness endianness, Stream stream, Encoding encoding)
+ public EndianBinaryWriter(Endianness endianness, Stream stream)
{
Guard.NotNull(stream, nameof(stream));
- Guard.NotNull(stream, nameof(encoding));
Guard.IsTrue(stream.CanWrite, nameof(stream), "Stream isn't writable");
this.BaseStream = stream;
- this.BitConverter = EndianBitConverter.GetConverter(endianness);
- this.Encoding = encoding;
+ this.endianness = endianness;
}
- ///
- /// Gets the encoding used to write strings
- ///
- public Encoding Encoding { get; }
-
///
/// Gets the underlying stream of the EndianBinaryWriter.
///
public Stream BaseStream { get; }
- ///
- /// Gets the bit converter used to write values to the stream
- ///
- internal EndianBitConverter BitConverter { get; }
-
///
/// Closes the writer, including the underlying stream.
///
@@ -108,7 +81,8 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(bool value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ this.buffer[0] = value ? (byte)1 : (byte)0;
+
this.WriteInternal(this.buffer, 1);
}
@@ -119,7 +93,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(short value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteInt16BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteInt16LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 2);
}
@@ -130,7 +112,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(int value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteInt32BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteInt32LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 4);
}
@@ -141,7 +131,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(long value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteInt64BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteInt64LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 8);
}
@@ -152,7 +150,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(ushort value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteUInt16BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteUInt16LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 2);
}
@@ -163,7 +169,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(uint value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteUInt32BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteUInt32LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 4);
}
@@ -174,7 +188,15 @@ namespace SixLabors.ImageSharp.IO
/// The value to write
public void Write(ulong value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
+ if (this.endianness == Endianness.BigEndian)
+ {
+ BinaryPrimitives.WriteUInt64BigEndian(this.buffer, value);
+ }
+ else
+ {
+ BinaryPrimitives.WriteUInt64LittleEndian(this.buffer, value);
+ }
+
this.WriteInternal(this.buffer, 8);
}
@@ -183,10 +205,9 @@ namespace SixLabors.ImageSharp.IO
/// for this writer. 4 bytes are written.
///
/// The value to write
- public void Write(float value)
+ public unsafe void Write(float value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
- this.WriteInternal(this.buffer, 4);
+ this.Write(*((int*)&value));
}
///
@@ -194,21 +215,9 @@ namespace SixLabors.ImageSharp.IO
/// for this writer. 8 bytes are written.
///
/// The value to write
- public void Write(double value)
- {
- this.BitConverter.CopyBytes(value, this.buffer, 0);
- this.WriteInternal(this.buffer, 8);
- }
-
- ///
- /// Writes a decimal value to the stream, using the bit converter for this writer.
- /// 16 bytes are written.
- ///
- /// The value to write
- public void Write(decimal value)
+ public unsafe void Write(double value)
{
- this.BitConverter.CopyBytes(value, this.buffer, 0);
- this.WriteInternal(this.buffer, 16);
+ this.Write(*((long*)&value));
}
///
@@ -255,71 +264,6 @@ namespace SixLabors.ImageSharp.IO
this.BaseStream.Write(value, offset, count);
}
- ///
- /// Writes a single character to the stream, using the encoding for this writer.
- ///
- /// The value to write
- public void Write(char value)
- {
- this.charBuffer[0] = value;
- this.Write(this.charBuffer);
- }
-
- ///
- /// Writes an array of characters to the stream, using the encoding for this writer.
- ///
- /// An array containing the characters to write
- /// value is null
- public void Write(char[] value)
- {
- Guard.NotNull(value, nameof(value));
-
- this.CheckDisposed();
- byte[] data = this.Encoding.GetBytes(value, 0, value.Length);
- this.WriteInternal(data, data.Length);
- }
-
- ///
- /// Writes a length-prefixed string to the stream, using the encoding for this writer.
- ///
- /// The value to write. Must not be null.
- /// value is null
- public void Write(string value)
- {
- Guard.NotNull(value, nameof(value));
-
- this.CheckDisposed();
- byte[] data = this.Encoding.GetBytes(value);
- this.Write7BitEncodedInt(data.Length);
- this.WriteInternal(data, data.Length);
- }
-
- ///
- /// Writes a 7-bit encoded integer from the stream. This is stored with the least significant
- /// information first, with 7 bits of information per byte of value, and the top
- /// bit as a continuation flag.
- ///
- /// The 7-bit encoded integer to write to the stream
- public void Write7BitEncodedInt(int value)
- {
- this.CheckDisposed();
- if (value < 0)
- {
- throw new ArgumentOutOfRangeException(nameof(value), "Value must be greater than or equal to 0.");
- }
-
- int index = 0;
- while (value >= 128)
- {
- this.buffer[index++] = (byte)((value & 0x7f) | 0x80);
- value = value >> 7;
- index++;
- }
-
- this.buffer[index++] = (byte)value;
- this.BaseStream.Write(this.buffer, 0, index);
- }
-
///
/// Disposes of the underlying stream.
///
diff --git a/src/ImageSharp/IO/EndianBitConverter.Conversion.cs b/src/ImageSharp/IO/EndianBitConverter.Conversion.cs
deleted file mode 100644
index 844c81cc9..000000000
--- a/src/ImageSharp/IO/EndianBitConverter.Conversion.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Equivalent of , but with either endianness.
- ///
- internal abstract partial class EndianBitConverter
- {
- ///
- /// Converts the specified double-precision floating point number to a
- /// 64-bit signed integer. Note: the endianness of this converter does not
- /// affect the returned value.
- ///
- /// The number to convert.
- /// A 64-bit signed integer whose value is equivalent to value.
- public unsafe long DoubleToInt64Bits(double value)
- {
- return *((long*)&value);
- }
-
- ///
- /// Converts the specified 64-bit signed integer to a double-precision
- /// floating point number. Note: the endianness of this converter does not
- /// affect the returned value.
- ///
- /// The number to convert.
- /// A double-precision floating point number whose value is equivalent to value.
- public unsafe double Int64BitsToDouble(long value)
- {
- return *((double*)&value);
- }
-
- ///
- /// Converts the specified single-precision floating point number to a
- /// 32-bit signed integer. Note: the endianness of this converter does not
- /// affect the returned value.
- ///
- /// The number to convert.
- /// A 32-bit signed integer whose value is equivalent to value.
- public unsafe int SingleToInt32Bits(float value)
- {
- return *((int*)&value);
- }
-
- ///
- /// Converts the specified 32-bit signed integer to a single-precision floating point
- /// number. Note: the endianness of this converter does not
- /// affect the returned value.
- ///
- /// The number to convert.
- /// A single-precision floating point number whose value is equivalent to value.
- public unsafe float Int32BitsToSingle(int value)
- {
- return *((float*)&value);
- }
- }
-}
diff --git a/src/ImageSharp/IO/EndianBitConverter.CopyBytes.cs b/src/ImageSharp/IO/EndianBitConverter.CopyBytes.cs
deleted file mode 100644
index ea1d7aa5a..000000000
--- a/src/ImageSharp/IO/EndianBitConverter.CopyBytes.cs
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Equivalent of , but with either endianness.
- ///
- internal abstract partial class EndianBitConverter
- {
- ///
- /// Copies the specified 16-bit signed integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public abstract void CopyBytes(short value, byte[] buffer, int index);
-
- ///
- /// Copies the specified 32-bit signed integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public abstract void CopyBytes(int value, byte[] buffer, int index);
-
- ///
- /// Copies the specified 64-bit signed integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public abstract void CopyBytes(long value, byte[] buffer, int index);
-
- ///
- /// Copies the specified 16-bit unsigned integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public void CopyBytes(ushort value, byte[] buffer, int index)
- {
- this.CopyBytes(unchecked((short)value), buffer, index);
- }
-
- ///
- /// Copies the specified 32-bit unsigned integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public void CopyBytes(uint value, byte[] buffer, int index)
- {
- this.CopyBytes(unchecked((int)value), buffer, index);
- }
-
- ///
- /// Copies the specified 64-bit unsigned integer value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public void CopyBytes(ulong value, byte[] buffer, int index)
- {
- this.CopyBytes(unchecked((long)value), buffer, index);
- }
-
- ///
- /// Copies the specified Boolean value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// A Boolean value.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public void CopyBytes(bool value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 1);
- buffer[index] = value ? (byte)1 : (byte)0;
- }
-
- ///
- /// Copies the specified Unicode character value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// A character to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public void CopyBytes(char value, byte[] buffer, int index)
- {
- this.CopyBytes(unchecked((short)value), buffer, index);
- }
-
- ///
- /// Copies the specified double-precision floating point value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public unsafe void CopyBytes(double value, byte[] buffer, int index)
- {
- this.CopyBytes(*((long*)&value), buffer, index);
- }
-
- ///
- /// Copies the specified single-precision floating point value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// The number to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public unsafe void CopyBytes(float value, byte[] buffer, int index)
- {
- this.CopyBytes(*((int*)&value), buffer, index);
- }
-
- ///
- /// Copies the specified decimal value into the specified byte array,
- /// beginning at the specified index.
- ///
- /// A character to convert.
- /// The byte array to copy the bytes into
- /// The first index into the array to copy the bytes into
- public unsafe void CopyBytes(decimal value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 16);
-
- int* pvalue = (int*)&value;
- this.CopyBytes(pvalue[0], buffer, index);
- this.CopyBytes(pvalue[1], buffer, index + 4);
- this.CopyBytes(pvalue[2], buffer, index + 8);
- this.CopyBytes(pvalue[3], buffer, index + 12);
- }
- }
-}
diff --git a/src/ImageSharp/IO/EndianBitConverter.GetBytes.cs b/src/ImageSharp/IO/EndianBitConverter.GetBytes.cs
deleted file mode 100644
index 5686c829c..000000000
--- a/src/ImageSharp/IO/EndianBitConverter.GetBytes.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Equivalent of , but with either endianness.
- ///
- internal abstract partial class EndianBitConverter
- {
- ///
- /// Returns the specified 16-bit signed integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 2.
- public byte[] GetBytes(short value)
- {
- byte[] result = new byte[2];
- this.CopyBytes(value, result, 0);
- return result;
- }
-
- ///
- /// Returns the specified 32-bit signed integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 4.
- public byte[] GetBytes(int value)
- {
- byte[] result = new byte[4];
- this.CopyBytes(value, result, 0);
- return result;
- }
-
- ///
- /// Returns the specified 64-bit signed integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 8.
- public byte[] GetBytes(long value)
- {
- byte[] result = new byte[8];
- this.CopyBytes(value, result, 0);
- return result;
- }
-
- ///
- /// Returns the specified 16-bit unsigned integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 2.
- public byte[] GetBytes(ushort value)
- {
- return this.GetBytes(unchecked((short)value));
- }
-
- ///
- /// Returns the specified 32-bit unsigned integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 4.
- public byte[] GetBytes(uint value)
- {
- return this.GetBytes(unchecked((int)value));
- }
-
- ///
- /// Returns the specified 64-bit unsigned integer value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 8.
- public byte[] GetBytes(ulong value)
- {
- return this.GetBytes(unchecked((long)value));
- }
-
- ///
- /// Returns the specified Boolean value as an array of bytes.
- ///
- /// A Boolean value.
- /// An array of bytes with length 1.
- ///
- /// The .
- ///
- public byte[] GetBytes(bool value)
- {
- return new byte[1] { value ? (byte)1 : (byte)0 };
- }
-
- ///
- /// Returns the specified Unicode character value as an array of bytes.
- ///
- /// A character to convert.
- /// An array of bytes with length 2.
- ///
- /// The .
- ///
- public byte[] GetBytes(char value)
- {
- return this.GetBytes((short)value);
- }
-
- ///
- /// Returns the specified double-precision floating point value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 8.
- public unsafe byte[] GetBytes(double value)
- {
- return this.GetBytes(*((long*)&value));
- }
-
- ///
- /// Returns the specified single-precision floating point value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 4.
- public unsafe byte[] GetBytes(float value)
- {
- return this.GetBytes(*((int*)&value));
- }
-
- ///
- /// Returns the specified decimal value as an array of bytes.
- ///
- /// The number to convert.
- /// An array of bytes with length 16.
- public byte[] GetBytes(decimal value)
- {
- byte[] result = new byte[16];
- this.CopyBytes(value, result, 0);
- return result;
- }
- }
-}
diff --git a/src/ImageSharp/IO/EndianBitConverter.ToType.cs b/src/ImageSharp/IO/EndianBitConverter.ToType.cs
deleted file mode 100644
index 0c0e49911..000000000
--- a/src/ImageSharp/IO/EndianBitConverter.ToType.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Equivalent of , but with either endianness.
- ///
- internal abstract partial class EndianBitConverter
- {
- ///
- /// Returns a 16-bit signed integer converted from two bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 16-bit signed integer formed by two bytes beginning at startIndex.
- public abstract short ToInt16(byte[] value, int startIndex);
-
- ///
- /// Returns a 32-bit signed integer converted from four bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 32-bit signed integer formed by four bytes beginning at startIndex.
- public abstract int ToInt32(byte[] value, int startIndex);
-
- ///
- /// Returns a 64-bit signed integer converted from eight bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 64-bit signed integer formed by eight bytes beginning at startIndex.
- public abstract long ToInt64(byte[] value, int startIndex);
-
- ///
- /// Returns a 16-bit unsigned integer converted from two bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 16-bit unsigned integer formed by two bytes beginning at startIndex.
- public ushort ToUInt16(byte[] value, int startIndex)
- {
- return unchecked((ushort)this.ToInt16(value, startIndex));
- }
-
- ///
- /// Returns a 32-bit unsigned integer converted from four bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 32-bit unsigned integer formed by four bytes beginning at startIndex.
- public uint ToUInt32(byte[] value, int startIndex)
- {
- return unchecked((uint)this.ToInt32(value, startIndex));
- }
-
- ///
- /// Returns a 64-bit unsigned integer converted from eight bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A 64-bit unsigned integer formed by eight bytes beginning at startIndex.
- public ulong ToUInt64(byte[] value, int startIndex)
- {
- return unchecked((ulong)this.ToInt64(value, startIndex));
- }
-
- ///
- /// Returns a Boolean value converted from one byte at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// true if the byte at startIndex in value is nonzero; otherwise, false.
- public bool ToBoolean(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 1);
- return value[startIndex] != 0;
- }
-
- ///
- /// Returns a Unicode character converted from two bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A character formed by two bytes beginning at startIndex.
- public char ToChar(byte[] value, int startIndex)
- {
- return unchecked((char)this.ToInt16(value, startIndex));
- }
-
- ///
- /// Returns a double-precision floating point number converted from eight bytes
- /// at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A double precision floating point number formed by eight bytes beginning at startIndex.
- public unsafe double ToDouble(byte[] value, int startIndex)
- {
- long intValue = this.ToInt64(value, startIndex);
- return *((double*)&intValue);
- }
-
- ///
- /// Returns a single-precision floating point number converted from four bytes
- /// at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A single precision floating point number formed by four bytes beginning at startIndex.
- public unsafe float ToSingle(byte[] value, int startIndex)
- {
- int intValue = this.ToInt32(value, startIndex);
- return *((float*)&intValue);
- }
-
- ///
- /// Returns a decimal value converted from sixteen bytes
- /// at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// A decimal formed by sixteen bytes beginning at startIndex.
- public unsafe decimal ToDecimal(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 16);
-
- decimal result = 0m;
- int* presult = (int*)&result;
- presult[0] = this.ToInt32(value, startIndex);
- presult[1] = this.ToInt32(value, startIndex + 4);
- presult[2] = this.ToInt32(value, startIndex + 8);
- presult[3] = this.ToInt32(value, startIndex + 12);
- return result;
- }
- }
-}
diff --git a/src/ImageSharp/IO/EndianBitConverter.cs b/src/ImageSharp/IO/EndianBitConverter.cs
deleted file mode 100644
index b563a09cb..000000000
--- a/src/ImageSharp/IO/EndianBitConverter.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Equivalent of , but with either endianness.
- ///
- internal abstract partial class EndianBitConverter
- {
- ///
- /// The little-endian bit converter.
- ///
- public static readonly LittleEndianBitConverter LittleEndianConverter = new LittleEndianBitConverter();
-
- ///
- /// The big-endian bit converter.
- ///
- public static readonly BigEndianBitConverter BigEndianConverter = new BigEndianBitConverter();
-
- ///
- /// Gets the byte order ("endianness") in which data is converted using this class.
- ///
- public abstract Endianness Endianness { get; }
-
- ///
- /// Gets a value indicating whether the byte order ("endianness") in which data is converted is little endian.
- ///
- ///
- /// Different computer architectures store data using different byte orders. "Big-endian"
- /// means the most significant byte is on the left end of a word. "Little-endian" means the
- /// most significant byte is on the right end of a word.
- ///
- public abstract bool IsLittleEndian { get; }
-
- ///
- /// Gets the converter.
- ///
- /// The endianness.
- /// an
- /// Not a valid form of Endianness - endianness
- public static EndianBitConverter GetConverter(Endianness endianness)
- {
- switch (endianness)
- {
- case Endianness.LittleEndian:
- return LittleEndianConverter;
- case Endianness.BigEndian:
- return BigEndianConverter;
- default:
- throw new ArgumentException("Not a valid form of Endianness", nameof(endianness));
- }
- }
-
- ///
- /// Returns a String converted from the elements of a byte array.
- ///
- /// An array of bytes.
- /// All the elements of value are converted.
- ///
- /// A String of hexadecimal pairs separated by hyphens, where each pair
- /// represents the corresponding element in value; for example, "7F-2C-4A".
- ///
- public static string ToString(byte[] value)
- {
- return BitConverter.ToString(value);
- }
-
- ///
- /// Returns a String converted from the elements of a byte array starting at a specified array position.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// The elements from array position startIndex to the end of the array are converted.
- ///
- /// A String of hexadecimal pairs separated by hyphens, where each pair
- /// represents the corresponding element in value; for example, "7F-2C-4A".
- ///
- public static string ToString(byte[] value, int startIndex)
- {
- return BitConverter.ToString(value, startIndex);
- }
-
- ///
- /// Returns a String converted from a specified number of bytes at a specified position in a byte array.
- ///
- /// An array of bytes.
- /// The starting position within value.
- /// The number of bytes to convert.
- /// The length elements from array position startIndex are converted.
- ///
- /// A String of hexadecimal pairs separated by hyphens, where each pair
- /// represents the corresponding element in value; for example, "7F-2C-4A".
- ///
- public static string ToString(byte[] value, int startIndex, int length)
- {
- return BitConverter.ToString(value, startIndex, length);
- }
-
- ///
- /// Checks the given argument for validity.
- ///
- /// The byte array passed in
- /// The start index passed in
- /// The number of bytes required
- /// value is a null reference
- ///
- /// startIndex is less than zero or greater than the length of value minus bytesRequired.
- ///
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- protected static void CheckByteArgument(byte[] value, int startIndex, int bytesRequired)
- {
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
-
- if (startIndex < 0 || startIndex > value.Length - bytesRequired)
- {
- throw new ArgumentOutOfRangeException(nameof(startIndex));
- }
- }
- }
-}
diff --git a/src/ImageSharp/IO/LittleEndianBitConverter.cs b/src/ImageSharp/IO/LittleEndianBitConverter.cs
deleted file mode 100644
index a69831586..000000000
--- a/src/ImageSharp/IO/LittleEndianBitConverter.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.IO
-{
- ///
- /// Implementation of EndianBitConverter which converts to/from little-endian byte arrays.
- ///
- internal sealed class LittleEndianBitConverter : EndianBitConverter
- {
- ///
- public override Endianness Endianness
- {
- get { return Endianness.LittleEndian; }
- }
-
- ///
- public override bool IsLittleEndian
- {
- get { return true; }
- }
-
- ///
- public override void CopyBytes(short value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 2);
-
- buffer[index + 1] = (byte)(value >> 8);
- buffer[index] = (byte)value;
- }
-
- ///
- public override void CopyBytes(int value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 4);
-
- buffer[index + 3] = (byte)(value >> 24);
- buffer[index + 2] = (byte)(value >> 16);
- buffer[index + 1] = (byte)(value >> 8);
- buffer[index] = (byte)value;
- }
-
- ///
- public override void CopyBytes(long value, byte[] buffer, int index)
- {
- CheckByteArgument(buffer, index, 8);
-
- buffer[index + 7] = (byte)(value >> 56);
- buffer[index + 6] = (byte)(value >> 48);
- buffer[index + 5] = (byte)(value >> 40);
- buffer[index + 4] = (byte)(value >> 32);
- buffer[index + 3] = (byte)(value >> 24);
- buffer[index + 2] = (byte)(value >> 16);
- buffer[index + 1] = (byte)(value >> 8);
- buffer[index] = (byte)value;
- }
-
- ///
- public unsafe override short ToInt16(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 2);
- return (short)((value[startIndex + 1] << 8) | value[startIndex]);
- }
-
- ///
- public unsafe override int ToInt32(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 4);
- return (value[startIndex + 3] << 24) | (value[startIndex + 2] << 16) | (value[startIndex + 1] << 8) | value[startIndex];
- }
-
- ///
- public unsafe override long ToInt64(byte[] value, int startIndex)
- {
- CheckByteArgument(value, startIndex, 8);
- long p1 = (value[startIndex + 7] << 24) | (value[startIndex + 6] << 16) | (value[startIndex + 5] << 8) | value[startIndex + 4];
- long p2 = (value[startIndex + 3] << 24) | (value[startIndex + 2] << 16) | (value[startIndex + 1] << 8) | value[startIndex];
- return (p2 & 0xFFFFFFFF) | (p1 << 32);
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/Image.LoadPixelData.cs b/src/ImageSharp/Image.LoadPixelData.cs
index 5f1a1617f..f90f4c895 100644
--- a/src/ImageSharp/Image.LoadPixelData.cs
+++ b/src/ImageSharp/Image.LoadPixelData.cs
@@ -2,12 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Threading.Tasks;
using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Formats;
-using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
namespace SixLabors.ImageSharp
@@ -103,13 +98,7 @@ namespace SixLabors.ImageSharp
public static Image LoadPixelData(Configuration config, TPixel[] data, int width, int height)
where TPixel : struct, IPixel
{
- int count = width * height;
- Guard.MustBeGreaterThanOrEqualTo(data.Length, count, nameof(data));
-
- var image = new Image(config, width, height);
- SpanHelper.Copy(data, image.GetPixelSpan(), count);
-
- return image;
+ return LoadPixelData(config, new Span(data), width, height);
}
///
@@ -128,7 +117,8 @@ namespace SixLabors.ImageSharp
Guard.MustBeGreaterThanOrEqualTo(data.Length, count, nameof(data));
var image = new Image(config, width, height);
- SpanHelper.Copy(data, image.Frames.RootFrame.GetPixelSpan(), count);
+
+ data.Slice(0, count).CopyTo(image.Frames.RootFrame.GetPixelSpan());
return image;
}
diff --git a/src/ImageSharp/ImageFrame.LoadPixelData.cs b/src/ImageSharp/ImageFrame.LoadPixelData.cs
index b9341a1b2..9a733fb53 100644
--- a/src/ImageSharp/ImageFrame.LoadPixelData.cs
+++ b/src/ImageSharp/ImageFrame.LoadPixelData.cs
@@ -2,11 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
-using System.IO;
-using System.Runtime.CompilerServices;
-using System.Threading.Tasks;
using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
@@ -46,7 +42,8 @@ namespace SixLabors.ImageSharp
Guard.MustBeGreaterThanOrEqualTo(data.Length, count, nameof(data));
var image = new ImageFrame(memoryManager, width, height);
- SpanHelper.Copy(data, image.GetPixelSpan(), count);
+
+ data.Slice(0, count).CopyTo(image.GetPixelSpan());
return image;
}
diff --git a/src/ImageSharp/ImageFrame{TPixel}.cs b/src/ImageSharp/ImageFrame{TPixel}.cs
index 888aff905..338a18a40 100644
--- a/src/ImageSharp/ImageFrame{TPixel}.cs
+++ b/src/ImageSharp/ImageFrame{TPixel}.cs
@@ -181,7 +181,7 @@ namespace SixLabors.ImageSharp
throw new ArgumentException("ImageFrame.CopyTo(): target must be of the same size!", nameof(target));
}
- SpanHelper.Copy(this.GetPixelSpan(), target.Span);
+ this.GetPixelSpan().CopyTo(target.Span);
}
///
diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs
index 30ca210ac..a4810d037 100644
--- a/src/ImageSharp/Memory/BasicArrayBuffer.cs
+++ b/src/ImageSharp/Memory/BasicArrayBuffer.cs
@@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp.Memory
public int Length { get; }
- public Span Span => this.Array.AsSpan().Slice(0, this.Length);
+ public Span Span => new Span(this.Array, 0, this.Length);
///
/// Returns a reference to specified element of the buffer.
diff --git a/src/ImageSharp/Memory/SpanHelper.cs b/src/ImageSharp/Memory/SpanHelper.cs
index 0c327484a..4a6b7b7ce 100644
--- a/src/ImageSharp/Memory/SpanHelper.cs
+++ b/src/ImageSharp/Memory/SpanHelper.cs
@@ -2,9 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
-using System.Numerics;
using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
namespace SixLabors.ImageSharp.Memory
{
@@ -13,19 +11,6 @@ namespace SixLabors.ImageSharp.Memory
///
internal static class SpanHelper
{
- ///
- /// Fetches a from the beginning of the span.
- ///
- /// The value type
- /// The span to fetch the vector from
- /// A reference to the beginning of the span
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static ref Vector FetchVector(this Span span)
- where T : struct
- {
- return ref Unsafe.As>(ref MemoryMarshal.GetReference(span));
- }
-
///
/// Copy 'count' number of elements of the same type from 'source' to 'dest'
///
@@ -34,29 +19,10 @@ namespace SixLabors.ImageSharp.Memory
/// The destination .
/// The number of elements to copy
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static unsafe void Copy(Span source, Span destination, int count)
+ public static unsafe void Copy(ReadOnlySpan source, Span destination, int count)
where T : struct
{
- DebugGuard.MustBeLessThanOrEqualTo(count, source.Length, nameof(count));
- DebugGuard.MustBeLessThanOrEqualTo(count, destination.Length, nameof(count));
-
- ref byte srcRef = ref Unsafe.As(ref MemoryMarshal.GetReference(source));
- ref byte destRef = ref Unsafe.As(ref MemoryMarshal.GetReference(destination));
-
- int byteCount = Unsafe.SizeOf() * count;
-
- // TODO: Use unfixed Unsafe.CopyBlock(ref T, ref T, int) for small blocks, when it gets available!
- // This is now available. Check with Anton re intent. Do we replace both ifdefs?
- fixed (byte* pSrc = &srcRef)
- fixed (byte* pDest = &destRef)
- {
-#if NETSTANDARD1_1
- Unsafe.CopyBlock(pDest, pSrc, (uint)byteCount);
-#else
- int destLength = destination.Length * Unsafe.SizeOf();
- Buffer.MemoryCopy(pSrc, pDest, destLength, byteCount);
-#endif
- }
+ source.Slice(0, count).CopyTo(destination);
}
///
@@ -66,7 +32,7 @@ namespace SixLabors.ImageSharp.Memory
/// The to copy elements from.
/// The destination .
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void Copy(Span source, Span destination)
+ public static void Copy(ReadOnlySpan source, Span destination)
where T : struct
{
Copy(source, destination, Math.Min(source.Length, destination.Length));
diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.Primitives.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.Primitives.cs
index 14f7f9570..794d77ba1 100644
--- a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.Primitives.cs
+++ b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.Primitives.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers.Binary;
using System.Text;
namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
@@ -17,7 +18,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public ushort ReadUInt16()
{
- return this.converter.ToUInt16(this.data, this.AddIndex(2));
+ return BinaryPrimitives.ReadUInt16BigEndian(new Span(this.data, this.AddIndex(2), 2));
}
///
@@ -26,7 +27,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public short ReadInt16()
{
- return this.converter.ToInt16(this.data, this.AddIndex(2));
+ return BinaryPrimitives.ReadInt16BigEndian(new Span(this.data, this.AddIndex(2), 2));
}
///
@@ -35,7 +36,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public uint ReadUInt32()
{
- return this.converter.ToUInt32(this.data, this.AddIndex(4));
+ return BinaryPrimitives.ReadUInt32BigEndian(new Span(this.data, this.AddIndex(4), 4));
}
///
@@ -44,7 +45,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public int ReadInt32()
{
- return this.converter.ToInt32(this.data, this.AddIndex(4));
+ return BinaryPrimitives.ReadInt32BigEndian(new Span(this.data, this.AddIndex(4), 4));
}
///
@@ -53,7 +54,7 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public ulong ReadUInt64()
{
- return this.converter.ToUInt64(this.data, this.AddIndex(8));
+ return BinaryPrimitives.ReadUInt64BigEndian(new Span(this.data, this.AddIndex(8), 8));
}
///
@@ -62,25 +63,29 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
/// the value
public long ReadInt64()
{
- return this.converter.ToInt64(this.data, this.AddIndex(8));
+ return BinaryPrimitives.ReadInt64BigEndian(new Span(this.data, this.AddIndex(8), 8));
}
///
/// Reads a float
///
/// the value
- public float ReadSingle()
+ public unsafe float ReadSingle()
{
- return this.converter.ToSingle(this.data, this.AddIndex(4));
+ int intValue = this.ReadInt32();
+
+ return *((float*)&intValue);
}
///
/// Reads a double
///
/// the value
- public double ReadDouble()
+ public unsafe double ReadDouble()
{
- return this.converter.ToDouble(this.data, this.AddIndex(8));
+ long intValue = this.ReadInt64();
+
+ return *((double*)&intValue);
}
///
diff --git a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs
index 1fecd761a..c4a6a9039 100644
--- a/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs
+++ b/src/ImageSharp/MetaData/Profiles/ICC/DataReader/IccDataReader.cs
@@ -3,7 +3,6 @@
using System;
using System.Text;
-using SixLabors.ImageSharp.IO;
namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
{
@@ -20,11 +19,6 @@ namespace SixLabors.ImageSharp.MetaData.Profiles.Icc
///
private readonly byte[] data;
- ///
- /// The bit converter
- ///
- private readonly EndianBitConverter converter = new BigEndianBitConverter();
-
///
/// The current reading position
///
diff --git a/src/ImageSharp/PixelAccessor{TPixel}.cs b/src/ImageSharp/PixelAccessor{TPixel}.cs
index 63e4c015c..1e789f0a6 100644
--- a/src/ImageSharp/PixelAccessor{TPixel}.cs
+++ b/src/ImageSharp/PixelAccessor{TPixel}.cs
@@ -112,7 +112,7 @@ namespace SixLabors.ImageSharp
/// The target pixel buffer accessor.
internal void CopyTo(PixelAccessor target)
{
- SpanHelper.Copy(this.PixelBuffer.Span, target.PixelBuffer.Span);
+ this.PixelBuffer.Span.CopyTo(target.PixelBuffer.Span);
}
///
diff --git a/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.cs b/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.cs
index 9505ee6cf..c8fe5ab88 100644
--- a/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.cs
+++ b/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.cs
@@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The source of data.
/// The to the destination pixels.
/// The number of pixels to convert.
- internal virtual void PackFromRgba32(Span source, Span destPixels, int count)
+ internal virtual void PackFromRgba32(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -35,14 +35,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span.
+ /// A helper for that expects a byte span.
/// The layout of the data in 'sourceBytes' must be compatible with layout.
///
- /// The to the source bytes.
+ /// The to the source bytes.
/// The to the destination pixels.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void PackFromRgba32Bytes(Span sourceBytes, Span destPixels, int count)
+ internal void PackFromRgba32Bytes(ReadOnlySpan sourceBytes, Span destPixels, int count)
{
this.PackFromRgba32(sourceBytes.NonPortableCast(), destPixels, count);
}
@@ -54,7 +54,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The span of source pixels
/// The destination span of data.
/// The number of pixels to convert.
- internal virtual void ToRgba32(Span sourcePixels, Span dest, int count)
+ internal virtual void ToRgba32(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -70,14 +70,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span as destination.
+ /// A helper for that expects a byte span as destination.
/// The layout of the data in 'destBytes' must be compatible with layout.
///
/// The to the source colors.
/// The to the destination bytes.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void ToRgba32Bytes(Span sourceColors, Span destBytes, int count)
+ internal void ToRgba32Bytes(ReadOnlySpan sourceColors, Span destBytes, int count)
{
this.ToRgba32(sourceColors, destBytes.NonPortableCast(), count);
}
@@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The source of data.
/// The to the destination pixels.
/// The number of pixels to convert.
- internal virtual void PackFromBgra32(Span source, Span destPixels, int count)
+ internal virtual void PackFromBgra32(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -106,14 +106,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span.
+ /// A helper for that expects a byte span.
/// The layout of the data in 'sourceBytes' must be compatible with layout.
///
- /// The to the source bytes.
+ /// The to the source bytes.
/// The to the destination pixels.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void PackFromBgra32Bytes(Span sourceBytes, Span destPixels, int count)
+ internal void PackFromBgra32Bytes(ReadOnlySpan sourceBytes, Span destPixels, int count)
{
this.PackFromBgra32(sourceBytes.NonPortableCast(), destPixels, count);
}
@@ -125,7 +125,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The span of source pixels
/// The destination span of data.
/// The number of pixels to convert.
- internal virtual void ToBgra32(Span sourcePixels, Span dest, int count)
+ internal virtual void ToBgra32(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -141,14 +141,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span as destination.
+ /// A helper for that expects a byte span as destination.
/// The layout of the data in 'destBytes' must be compatible with layout.
///
/// The to the source colors.
/// The to the destination bytes.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void ToBgra32Bytes(Span sourceColors, Span destBytes, int count)
+ internal void ToBgra32Bytes(ReadOnlySpan sourceColors, Span destBytes, int count)
{
this.ToBgra32(sourceColors, destBytes.NonPortableCast(), count);
}
@@ -159,7 +159,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The source of data.
/// The to the destination pixels.
/// The number of pixels to convert.
- internal virtual void PackFromRgb24(Span source, Span destPixels, int count)
+ internal virtual void PackFromRgb24(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -177,14 +177,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span.
+ /// A helper for that expects a byte span.
/// The layout of the data in 'sourceBytes' must be compatible with layout.
///
- /// The to the source bytes.
+ /// The to the source bytes.
/// The to the destination pixels.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void PackFromRgb24Bytes(Span sourceBytes, Span destPixels, int count)
+ internal void PackFromRgb24Bytes(ReadOnlySpan sourceBytes, Span destPixels, int count)
{
this.PackFromRgb24(sourceBytes.NonPortableCast(), destPixels, count);
}
@@ -196,7 +196,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The span of source pixels
/// The destination span of data.
/// The number of pixels to convert.
- internal virtual void ToRgb24(Span sourcePixels, Span dest, int count)
+ internal virtual void ToRgb24(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -212,14 +212,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span as destination.
+ /// A helper for that expects a byte span as destination.
/// The layout of the data in 'destBytes' must be compatible with layout.
///
/// The to the source colors.
/// The to the destination bytes.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void ToRgb24Bytes(Span sourceColors, Span destBytes, int count)
+ internal void ToRgb24Bytes(ReadOnlySpan sourceColors, Span destBytes, int count)
{
this.ToRgb24(sourceColors, destBytes.NonPortableCast(), count);
}
@@ -230,7 +230,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The source of data.
/// The to the destination pixels.
/// The number of pixels to convert.
- internal virtual void PackFromBgr24(Span source, Span destPixels, int count)
+ internal virtual void PackFromBgr24(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -248,14 +248,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span.
+ /// A helper for that expects a byte span.
/// The layout of the data in 'sourceBytes' must be compatible with layout.
///
- /// The to the source bytes.
+ /// The to the source bytes.
/// The to the destination pixels.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void PackFromBgr24Bytes(Span sourceBytes, Span destPixels, int count)
+ internal void PackFromBgr24Bytes(ReadOnlySpan sourceBytes, Span destPixels, int count)
{
this.PackFromBgr24(sourceBytes.NonPortableCast(), destPixels, count);
}
@@ -267,7 +267,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// The span of source pixels
/// The destination span of data.
/// The number of pixels to convert.
- internal virtual void ToBgr24(Span sourcePixels, Span dest, int count)
+ internal virtual void ToBgr24(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -283,14 +283,14 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// A helper for that expects a byte span as destination.
+ /// A helper for that expects a byte span as destination.
/// The layout of the data in 'destBytes' must be compatible with layout.
///
/// The to the source colors.
/// The to the destination bytes.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void ToBgr24Bytes(Span sourceColors, Span destBytes, int count)
+ internal void ToBgr24Bytes(ReadOnlySpan sourceColors, Span destBytes, int count)
{
this.ToBgr24(sourceColors, destBytes.NonPortableCast(), count);
}
diff --git a/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.tt b/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.tt
index 365f5cb51..d0a05677f 100644
--- a/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.tt
+++ b/src/ImageSharp/PixelFormats/Generated/PixelOperations{TPixel}.Generated.tt
@@ -21,7 +21,7 @@
/// The span of source pixels
/// The destination span of data.
/// The number of pixels to convert.
- internal virtual void To<#=pixelType#>(Span sourcePixels, Span<<#=pixelType#>> dest, int count)
+ internal virtual void To<#=pixelType#>(ReadOnlySpan sourcePixels, Span<<#=pixelType#>> dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -37,14 +37,14 @@
}
///
- /// A helper for that expects a byte span as destination.
+ /// A helper for that expects a byte span as destination.
/// The layout of the data in 'destBytes' must be compatible with layout.
///
/// The to the source colors.
/// The to the destination bytes.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void To<#=pixelType#>Bytes(Span sourceColors, Span destBytes, int count)
+ internal void To<#=pixelType#>Bytes(ReadOnlySpan sourceColors, Span destBytes, int count)
{
this.To<#=pixelType#>(sourceColors, destBytes.NonPortableCast>(), count);
}
@@ -61,7 +61,7 @@
/// The source of data.
/// The to the destination pixels.
/// The number of pixels to convert.
- internal virtual void PackFrom<#=pixelType#>(Span<<#=pixelType#>> source, Span destPixels, int count)
+ internal virtual void PackFrom<#=pixelType#>(ReadOnlySpan<<#=pixelType#>> source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -79,14 +79,14 @@
}
///
- /// A helper for that expects a byte span.
+ /// A helper for that expects a byte span.
/// The layout of the data in 'sourceBytes' must be compatible with layout.
///
- /// The to the source bytes.
+ /// The to the source bytes.
/// The to the destination pixels.
/// The number of pixels to convert.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- internal void PackFrom<#=pixelType#>Bytes(Span sourceBytes, Span destPixels, int count)
+ internal void PackFrom<#=pixelType#>Bytes(ReadOnlySpan sourceBytes, Span destPixels, int count)
{
this.PackFrom<#=pixelType#>(sourceBytes.NonPortableCast>(), destPixels, count);
}
diff --git a/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.cs b/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.cs
index c5ee6661f..a8e68e36d 100644
--- a/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.cs
+++ b/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.cs
@@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.PixelFormats
{
///
- internal override void PackFromRgb24(Span source, Span destPixels, int count)
+ internal override void PackFromRgb24(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void ToRgb24(Span sourcePixels, Span dest, int count)
+ internal override void ToRgb24(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -49,7 +49,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void PackFromBgr24(Span source, Span destPixels, int count)
+ internal override void PackFromBgr24(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -65,7 +65,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void ToBgr24(Span sourcePixels, Span dest, int count)
+ internal override void ToBgr24(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
@@ -81,7 +81,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void PackFromBgra32(Span source, Span destPixels, int count)
+ internal override void PackFromBgra32(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -97,7 +97,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void ToBgra32(Span sourcePixels, Span dest, int count)
+ internal override void ToBgra32(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
diff --git a/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.tt b/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.tt
index 9dfec2cf9..4a88bbad7 100644
--- a/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.tt
+++ b/src/ImageSharp/PixelFormats/Generated/Rgba32.PixelOperations.Generated.tt
@@ -14,7 +14,7 @@
#>
///
- internal override void PackFrom<#=pixelType#>(Span<<#=pixelType#>> source, Span destPixels, int count)
+ internal override void PackFrom<#=pixelType#>(ReadOnlySpan<<#=pixelType#>> source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
@@ -36,7 +36,7 @@
#>
///
- internal override void To<#=pixelType#>(Span sourcePixels, Span<<#=pixelType#>> dest, int count)
+ internal override void To<#=pixelType#>(ReadOnlySpan sourcePixels, Span<<#=pixelType#>> dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
diff --git a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
index 6f7975240..6d25fe9f4 100644
--- a/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
+++ b/src/ImageSharp/PixelFormats/PixelOperations{TPixel}.cs
@@ -25,14 +25,14 @@ namespace SixLabors.ImageSharp.PixelFormats
/// Bulk version of
///
/// The to the source vectors.
- /// The to the destination colors.
+ /// The to the destination colors.
/// The number of pixels to convert.
- internal virtual void PackFromVector4(Span sourceVectors, Span destColors, int count)
+ internal virtual void PackFromVector4(ReadOnlySpan sourceVectors, Span destinationColors, int count)
{
- GuardSpans(sourceVectors, nameof(sourceVectors), destColors, nameof(destColors), count);
+ GuardSpans(sourceVectors, nameof(sourceVectors), destinationColors, nameof(destinationColors), count);
ref Vector4 sourceRef = ref MemoryMarshal.GetReference(sourceVectors);
- ref TPixel destRef = ref MemoryMarshal.GetReference(destColors);
+ ref TPixel destRef = ref MemoryMarshal.GetReference(destinationColors);
for (int i = 0; i < count; i++)
{
@@ -46,14 +46,14 @@ namespace SixLabors.ImageSharp.PixelFormats
/// Bulk version of .
///
/// The to the source colors.
- /// The to the destination vectors.
+ /// The to the destination vectors.
/// The number of pixels to convert.
- internal virtual void ToVector4(Span sourceColors, Span destVectors, int count)
+ internal virtual void ToVector4(ReadOnlySpan sourceColors, Span destinationVectors, int count)
{
- GuardSpans(sourceColors, nameof(sourceColors), destVectors, nameof(destVectors), count);
+ GuardSpans(sourceColors, nameof(sourceColors), destinationVectors, nameof(destinationVectors), count);
ref TPixel sourceRef = ref MemoryMarshal.GetReference(sourceColors);
- ref Vector4 destRef = ref MemoryMarshal.GetReference(destVectors);
+ ref Vector4 destRef = ref MemoryMarshal.GetReference(destinationVectors);
for (int i = 0; i < count; i++)
{
@@ -64,25 +64,25 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- /// Verifies that the given 'source' and 'dest' spans are at least of 'minLength' size.
+ /// Verifies that the given 'source' and 'destination' spans are at least of 'minLength' size.
/// Throwing an if the condition is not met.
///
/// The source element type
/// The destination element type
/// The source span
/// The source parameter name
- /// The destination span
- /// The destination parameter name
+ /// The destination span
+ /// The destination parameter name
/// The minimum length
protected internal static void GuardSpans(
- Span source,
+ ReadOnlySpan source,
string sourceParamName,
- Span dest,
- string destParamName,
+ Span destination,
+ string destinationParamName,
int minLength)
{
Guard.MustBeSizedAtLeast(source, minLength, sourceParamName);
- Guard.MustBeSizedAtLeast(dest, minLength, destParamName);
+ Guard.MustBeSizedAtLeast(destination, minLength, destinationParamName);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/PixelFormats/Rgba32.PixelOperations.cs b/src/ImageSharp/PixelFormats/Rgba32.PixelOperations.cs
index d87820f84..7d5d63241 100644
--- a/src/ImageSharp/PixelFormats/Rgba32.PixelOperations.cs
+++ b/src/ImageSharp/PixelFormats/Rgba32.PixelOperations.cs
@@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.PixelFormats
/// https://github.com/dotnet/corefx/issues/15957
///
///
- internal static void ToVector4SimdAligned(Span sourceColors, Span destVectors, int count)
+ internal static void ToVector4SimdAligned(ReadOnlySpan sourceColors, Span destVectors, int count)
{
if (!Vector.IsHardwareAccelerated)
{
@@ -87,7 +87,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void ToVector4(Span sourceColors, Span destVectors, int count)
+ internal override void ToVector4(ReadOnlySpan sourceColors, Span destVectors, int count)
{
Guard.MustBeSizedAtLeast(sourceColors, count, nameof(sourceColors));
Guard.MustBeSizedAtLeast(destVectors, count, nameof(destVectors));
@@ -115,7 +115,7 @@ namespace SixLabors.ImageSharp.PixelFormats
}
}
- internal override void PackFromVector4(Span sourceVectors, Span destColors, int count)
+ internal override void PackFromVector4(ReadOnlySpan sourceVectors, Span destColors, int count)
{
GuardSpans(sourceVectors, nameof(sourceVectors), destColors, nameof(destColors), count);
@@ -130,7 +130,7 @@ namespace SixLabors.ImageSharp.PixelFormats
if (alignedCount > 0)
{
- Span flatSrc = sourceVectors.Slice(0, alignedCount).NonPortableCast();
+ ReadOnlySpan flatSrc = sourceVectors.Slice(0, alignedCount).NonPortableCast();
Span flatDest = destColors.NonPortableCast();
SimdUtils.BulkConvertNormalizedFloatToByteClampOverflows(flatSrc, flatDest);
@@ -145,19 +145,19 @@ namespace SixLabors.ImageSharp.PixelFormats
}
///
- internal override void PackFromRgba32(Span source, Span destPixels, int count)
+ internal override void PackFromRgba32(ReadOnlySpan source, Span destPixels, int count)
{
GuardSpans(source, nameof(source), destPixels, nameof(destPixels), count);
- SpanHelper.Copy(source, destPixels, count);
+ source.Slice(0, count).CopyTo(destPixels);
}
///
- internal override void ToRgba32(Span sourcePixels, Span dest, int count)
+ internal override void ToRgba32(ReadOnlySpan sourcePixels, Span dest, int count)
{
GuardSpans(sourcePixels, nameof(sourcePixels), dest, nameof(dest), count);
- SpanHelper.Copy(sourcePixels, dest, count);
+ sourcePixels.Slice(0, count).CopyTo(dest);
}
///
diff --git a/src/ImageSharp/PixelFormats/RgbaVector.PixelOperations.cs b/src/ImageSharp/PixelFormats/RgbaVector.PixelOperations.cs
index 1886df29f..0817ef5ad 100644
--- a/src/ImageSharp/PixelFormats/RgbaVector.PixelOperations.cs
+++ b/src/ImageSharp/PixelFormats/RgbaVector.PixelOperations.cs
@@ -18,11 +18,11 @@ namespace SixLabors.ImageSharp.PixelFormats
internal class PixelOperations : PixelOperations
{
///
- internal override unsafe void ToVector4(Span sourceColors, Span destVectors, int count)
+ internal override unsafe void ToVector4(ReadOnlySpan sourceColors, Span destVectors, int count)
{
GuardSpans(sourceColors, nameof(sourceColors), destVectors, nameof(destVectors), count);
- SpanHelper.Copy(sourceColors.NonPortableCast(), destVectors, count);
+ sourceColors.NonPortableCast().Slice(0, count).CopyTo(destVectors);
}
}
}
diff --git a/src/ImageSharp/Processing/Transforms/Processors/CropProcessor.cs b/src/ImageSharp/Processing/Transforms/Processors/CropProcessor.cs
index 5462b34dc..bfbf349b5 100644
--- a/src/ImageSharp/Processing/Transforms/Processors/CropProcessor.cs
+++ b/src/ImageSharp/Processing/Transforms/Processors/CropProcessor.cs
@@ -67,7 +67,7 @@ namespace SixLabors.ImageSharp.Processing.Transforms.Processors
{
Span sourceRow = source.GetPixelRowSpan(y).Slice(minX);
Span targetRow = destination.GetPixelRowSpan(y - minY);
- SpanHelper.Copy(sourceRow, targetRow, maxX - minX);
+ sourceRow.Slice(0, maxX - minX).CopyTo(targetRow);
});
}
}
diff --git a/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs b/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs
index 147f66f8f..aa7d926a4 100644
--- a/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs
+++ b/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs
@@ -3,7 +3,7 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
-
+ using System.Runtime.InteropServices;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Memory;
@@ -90,13 +90,13 @@ namespace SixLabors.ImageSharp.Benchmarks.General.Vectorization
}
[Benchmark]
- public void FetchWithSpanUtility()
+ public void FetchWithUnsafeCastFromReference()
{
- Vector v = new Vector(this.testValue);
+ var v = new Vector(this.testValue);
- Span span = new Span(this.data);
+ var span = new Span(this.data);
- ref Vector start = ref span.FetchVector();
+ ref Vector start = ref Unsafe.As>(ref MemoryMarshal.GetReference(span));
int n = this.InputSize / Vector.Count;
diff --git a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.CopyBytesTests.cs b/tests/ImageSharp.Tests/IO/BigEndianBitConverter.CopyBytesTests.cs
deleted file mode 100644
index 254cfa2dc..000000000
--- a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.CopyBytesTests.cs
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class BigEndianBitConverterCopyBytesTests
- {
- [Fact]
- public void CopyToWithNullBufferThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(false, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((short)42, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ushort)42, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42u, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42L, null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ulong)42L, null, 0));
- }
-
- [Fact]
- public void CopyToWithIndexTooBigThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(false, new byte[1], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((short)42, new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ushort)42, new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42, new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42u, new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42L, new byte[8], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ulong)42L, new byte[8], 1));
- }
-
- [Fact]
- public void CopyToWithBufferTooSmallThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(false, new byte[0], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((short)42, new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ushort)42, new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42, new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42u, new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes(42L, new byte[7], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.CopyBytes((ulong)42L, new byte[7], 0));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesBoolean()
- {
- byte[] buffer = new byte[1];
-
- EndianBitConverter.BigEndianConverter.CopyBytes(false, buffer, 0);
- this.CheckBytes(new byte[] { 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(true, buffer, 0);
- this.CheckBytes(new byte[] { 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesShort()
- {
- byte[] buffer = new byte[2];
-
- EndianBitConverter.BigEndianConverter.CopyBytes((short)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((short)1, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((short)256, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((short)-1, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((short)257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesUShort()
- {
- byte[] buffer = new byte[2];
-
- EndianBitConverter.BigEndianConverter.CopyBytes((ushort)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((ushort)1, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((ushort)256, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(ushort.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((ushort)257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesInt()
- {
- byte[] buffer = new byte[4];
-
- EndianBitConverter.BigEndianConverter.CopyBytes(0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(65536, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(16777216, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(-1, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(257, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesUInt()
- {
- byte[] buffer = new byte[4];
-
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)1, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)65536, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)16777216, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(uint.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes((uint)257, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesLong()
- {
- byte[] buffer = new byte[8];
-
- EndianBitConverter.BigEndianConverter.CopyBytes(0L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(256L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(65536L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(16777216L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(4294967296L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776L * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776L * 256 * 256, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(-1L, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(257L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesULong()
- {
- byte[] buffer = new byte[8];
-
- EndianBitConverter.BigEndianConverter.CopyBytes(0UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(256UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(65536UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(16777216UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(4294967296UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776UL * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(1099511627776UL * 256 * 256, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(ulong.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, buffer);
- EndianBitConverter.BigEndianConverter.CopyBytes(257UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, buffer);
- }
-
- ///
- /// Tests the two byte arrays for equality.
- ///
- /// The expected bytes.
- /// The actual bytes.
- private void CheckBytes(byte[] expected, byte[] actual)
- {
- Assert.Equal(expected.Length, actual.Length);
- Assert.Equal(expected, actual);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.GetBytesTests.cs b/tests/ImageSharp.Tests/IO/BigEndianBitConverter.GetBytesTests.cs
deleted file mode 100644
index d8408523b..000000000
--- a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.GetBytesTests.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class BigEndianBitConverterGetBytesTests
- {
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesBoolean()
- {
- this.CheckBytes(new byte[] { 0 }, EndianBitConverter.BigEndianConverter.GetBytes(false));
- this.CheckBytes(new byte[] { 1 }, EndianBitConverter.BigEndianConverter.GetBytes(true));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesShort()
- {
- this.CheckBytes(new byte[] { 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((short)0));
- this.CheckBytes(new byte[] { 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((short)1));
- this.CheckBytes(new byte[] { 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((short)256));
- this.CheckBytes(new byte[] { 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes((short)-1));
- this.CheckBytes(new byte[] { 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((short)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesUShort()
- {
- this.CheckBytes(new byte[] { 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((ushort)0));
- this.CheckBytes(new byte[] { 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((ushort)1));
- this.CheckBytes(new byte[] { 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((ushort)256));
- this.CheckBytes(new byte[] { 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes(ushort.MaxValue));
- this.CheckBytes(new byte[] { 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((ushort)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesInt()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(0));
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(1));
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(256));
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(65536));
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(16777216));
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes(-1));
- this.CheckBytes(new byte[] { 0, 0, 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesUInt()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)0));
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)1));
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)256));
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)65536));
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)16777216));
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes(uint.MaxValue));
- this.CheckBytes(new byte[] { 0, 0, 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes((uint)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesLong()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(0L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(1L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(256L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(65536L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(16777216L));
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(4294967296L));
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776L));
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776L * 256));
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776L * 256 * 256));
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes(-1L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(257L));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesULong()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(0UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(1UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(256UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(65536UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(16777216UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(4294967296UL));
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776UL));
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776UL * 256));
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.BigEndianConverter.GetBytes(1099511627776UL * 256 * 256));
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, EndianBitConverter.BigEndianConverter.GetBytes(ulong.MaxValue));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, EndianBitConverter.BigEndianConverter.GetBytes(257UL));
- }
-
- ///
- /// Tests the two byte arrays for equality.
- ///
- /// The expected bytes.
- /// The actual bytes.
- private void CheckBytes(byte[] expected, byte[] actual)
- {
- Assert.Equal(expected.Length, actual.Length);
- Assert.Equal(expected, actual);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.ToTypeTests.cs b/tests/ImageSharp.Tests/IO/BigEndianBitConverter.ToTypeTests.cs
deleted file mode 100644
index 19ef24c79..000000000
--- a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.ToTypeTests.cs
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class BigEndianBitConverterTests
- {
- [Fact]
- public void CopyToWithNullBufferThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToBoolean(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt16(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt16(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt32(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt32(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt64(null, 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt64(null, 0));
- }
-
- [Fact]
- public void CopyToWithIndexTooBigThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToBoolean(new byte[1], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt16(new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt16(new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt32(new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt32(new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt64(new byte[8], 1));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt64(new byte[8], 1));
- }
-
- [Fact]
- public void CopyToWithBufferTooSmallThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToBoolean(new byte[0], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt16(new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt16(new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt32(new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt32(new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToInt64(new byte[7], 0));
- Assert.Throws(() => EndianBitConverter.BigEndianConverter.ToUInt64(new byte[7], 0));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToBoolean()
- {
- Assert.False(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 0 }, 0));
- Assert.True(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 1 }, 0));
- Assert.True(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 42 }, 0));
-
- Assert.False(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 1, 0 }, 1));
- Assert.True(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 0, 1 }, 1));
- Assert.True(EndianBitConverter.BigEndianConverter.ToBoolean(new byte[] { 0, 42 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToInt16()
- {
- Assert.Equal((short)0, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 0, 0 }, 0));
- Assert.Equal((short)1, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 0, 1 }, 0));
- Assert.Equal((short)256, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 1, 0 }, 0));
- Assert.Equal((short)-1, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 255, 255 }, 0));
- Assert.Equal((short)257, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 1, 1 }, 0));
-
- Assert.Equal((short)0, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 1, 0, 0 }, 1));
- Assert.Equal((short)1, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 1, 0, 1 }, 1));
- Assert.Equal((short)256, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 0, 1, 0 }, 1));
- Assert.Equal((short)-1, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 0, 255, 255 }, 1));
- Assert.Equal((short)257, EndianBitConverter.BigEndianConverter.ToInt16(new byte[] { 0, 1, 1 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToUInt16()
- {
- Assert.Equal((ushort)0, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 0, 0 }, 0));
- Assert.Equal((ushort)1, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 0, 1 }, 0));
- Assert.Equal((ushort)256, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 1, 0 }, 0));
- Assert.Equal(ushort.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 255, 255 }, 0));
- Assert.Equal((ushort)257, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 1, 1 }, 0));
-
- Assert.Equal((ushort)0, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 1, 0, 0 }, 1));
- Assert.Equal((ushort)1, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 1, 0, 1 }, 1));
- Assert.Equal((ushort)256, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 0, 1, 0 }, 1));
- Assert.Equal(ushort.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 0, 255, 255 }, 1));
- Assert.Equal((ushort)257, EndianBitConverter.BigEndianConverter.ToUInt16(new byte[] { 0, 1, 1 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToInt32()
- {
- Assert.Equal(0, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 0, 0, 0 }, 0));
- Assert.Equal(1, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 0, 0, 1 }, 0));
- Assert.Equal(256, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 0, 1, 0 }, 0));
- Assert.Equal(65536, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 1, 0, 0 }, 0));
- Assert.Equal(16777216, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0 }, 0));
- Assert.Equal(-1, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 255, 255, 255, 255 }, 0));
- Assert.Equal(257, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 0, 1, 1 }, 0));
-
- Assert.Equal(0, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0, 0 }, 1));
- Assert.Equal(1, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0, 1 }, 1));
- Assert.Equal(256, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 0, 1, 0 }, 1));
- Assert.Equal(65536, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 1, 0, 0 }, 1));
- Assert.Equal(16777216, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 1, 0, 0, 0 }, 1));
- Assert.Equal(-1, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 0, 255, 255, 255, 255 }, 1));
- Assert.Equal(257, EndianBitConverter.BigEndianConverter.ToInt32(new byte[] { 1, 0, 0, 1, 1 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToUInt32()
- {
- Assert.Equal((uint)0, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 0, 0, 0 }, 0));
- Assert.Equal((uint)1, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 0, 0, 1 }, 0));
- Assert.Equal((uint)256, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 0, 1, 0 }, 0));
- Assert.Equal((uint)65536, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 1, 0, 0 }, 0));
- Assert.Equal((uint)16777216, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0 }, 0));
- Assert.Equal(uint.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 255, 255, 255, 255 }, 0));
- Assert.Equal((uint)257, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 0, 1, 1 }, 0));
-
- Assert.Equal((uint)0, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0, 0 }, 1));
- Assert.Equal((uint)1, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0, 1 }, 1));
- Assert.Equal((uint)256, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 1, 0 }, 1));
- Assert.Equal((uint)65536, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 1, 0, 0 }, 1));
- Assert.Equal((uint)16777216, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 1, 0, 0, 0 }, 1));
- Assert.Equal(uint.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 0, 255, 255, 255, 255 }, 1));
- Assert.Equal((uint)257, EndianBitConverter.BigEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 1, 1 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToInt64()
- {
- Assert.Equal(0L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, 0));
- Assert.Equal(256L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, 0));
- Assert.Equal(65536L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, 0));
- Assert.Equal(16777216L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, 0));
- Assert.Equal(4294967296L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776L * 256, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776L * 256 * 256, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(-1L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, 0));
- Assert.Equal(257L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, 0));
- Assert.Equal(4294967295L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 255, 255, 255, 255 }, 0));
- Assert.Equal(-4294967296L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 255, 255, 255, 255, 0, 0, 0, 0 }, 0));
-
- Assert.Equal(0L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 1));
- Assert.Equal(256L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 0 }, 1));
- Assert.Equal(65536L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 1, 0, 0 }, 1));
- Assert.Equal(16777216L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 0 }, 1));
- Assert.Equal(4294967296L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776L * 256, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 1, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776L * 256 * 256, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(-1L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 0, 255, 255, 255, 255, 255, 255, 255, 255 }, 1));
- Assert.Equal(257L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 1 }, 1));
- Assert.Equal(4294967295L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 255, 255, 255, 255 }, 1));
- Assert.Equal(-4294967296L, EndianBitConverter.BigEndianConverter.ToInt64(new byte[] { 1, 255, 255, 255, 255, 0, 0, 0, 0 }, 1));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void ToUInt64()
- {
- Assert.Equal(0UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, 0));
- Assert.Equal(256UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, 0));
- Assert.Equal(65536UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, 0));
- Assert.Equal(16777216UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, 0));
- Assert.Equal(4294967296UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776UL * 256, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(1099511627776UL * 256 * 256, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, 0));
- Assert.Equal(ulong.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, 0));
- Assert.Equal(257UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 1 }, 0));
-
- Assert.Equal(0UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 1));
- Assert.Equal(256UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 0 }, 1));
- Assert.Equal(65536UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 1, 0, 0 }, 1));
- Assert.Equal(16777216UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 0 }, 1));
- Assert.Equal(4294967296UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776UL * 256, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 1, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(1099511627776UL * 256 * 256, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0, 0 }, 1));
- Assert.Equal(ulong.MaxValue, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 0, 255, 255, 255, 255, 255, 255, 255, 255 }, 1));
- Assert.Equal(257UL, EndianBitConverter.BigEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 1 }, 1));
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/EndianBinaryReaderTests.cs b/tests/ImageSharp.Tests/IO/EndianBinaryReaderTests.cs
deleted file mode 100644
index 87adead33..000000000
--- a/tests/ImageSharp.Tests/IO/EndianBinaryReaderTests.cs
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.IO;
-using System.Text;
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The endian binary reader tests.
- ///
- public class EndianBinaryReaderTests
- {
- ///
- /// The test string.
- ///
- private const string TestString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmopqrstuvwxyz";
-
- ///
- /// The test bytes.
- ///
- private static readonly byte[] TestBytes = Encoding.ASCII.GetBytes(TestString);
-
- ///
- /// Tests to ensure that the reader can read beyond internal buffer size.
- ///
- [Fact]
- public void ReadCharsBeyondInternalBufferSize()
- {
- MemoryStream stream = new MemoryStream(TestBytes);
- using (EndianBinaryReader subject = new EndianBinaryReader(Endianness.LittleEndian, stream))
- {
- char[] chars = new char[TestString.Length];
- subject.Read(chars, 0, chars.Length);
- Assert.Equal(TestString, new string(chars));
- }
- }
-
- ///
- /// Tests to ensure that the reader cannot read beyond the provided buffer size.
- ///
- [Fact]
- public void ReadCharsBeyondProvidedBufferSize()
- {
- Assert.Throws(
- () =>
- {
- MemoryStream stream = new MemoryStream(TestBytes);
- using (EndianBinaryReader subject = new EndianBinaryReader(Endianness.LittleEndian, stream))
- {
- char[] chars = new char[TestString.Length - 1];
-
- subject.Read(chars, 0, TestString.Length);
- }
- });
- }
- }
-}
diff --git a/tests/ImageSharp.Tests/IO/EndianBinaryReaderWriterTests.cs b/tests/ImageSharp.Tests/IO/EndianBinaryReaderWriterTests.cs
new file mode 100644
index 000000000..6e22b1689
--- /dev/null
+++ b/tests/ImageSharp.Tests/IO/EndianBinaryReaderWriterTests.cs
@@ -0,0 +1,97 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+using System.IO;
+using SixLabors.ImageSharp.IO;
+using Xunit;
+
+namespace SixLabors.ImageSharp.Tests.IO
+{
+ public class EndianBinaryReaderWriterTests
+ {
+ [Fact]
+ public void RoundtripSingles()
+ {
+ foreach ((Endianness endianness, byte[] bytes) in new[] {
+ (Endianness.BigEndian, new byte[] { 64, 73, 15, 219 }),
+ (Endianness.LittleEndian, new byte[] { 219, 15, 73, 64 })
+ })
+ {
+ var stream = new MemoryStream();
+
+ using (var writer = new EndianBinaryWriter(endianness, stream))
+ {
+ writer.Write((float)Math.PI);
+
+ Assert.Equal(bytes, stream.ToArray());
+ }
+ }
+ }
+
+ [Fact]
+ public void RoundtripDoubles()
+ {
+ foreach ((Endianness endianness, byte[] bytes) in new[] {
+ (Endianness.BigEndian, new byte[] { 64, 9, 33, 251, 84, 68, 45, 24 }),
+ (Endianness.LittleEndian, new byte[] { 24, 45, 68, 84, 251, 33, 9, 64 })
+ })
+ {
+ var stream = new MemoryStream();
+
+ using (var writer = new EndianBinaryWriter(endianness, stream))
+ {
+ writer.Write(Math.PI);
+
+ Assert.Equal(bytes, stream.ToArray());
+ }
+ }
+ }
+
+ ///
+ /// Ensures that the data written through a binary writer can be read back through the reader
+ ///
+ [Fact]
+ public void RoundtripValues()
+ {
+ foreach (Endianness endianness in new[] { Endianness.BigEndian, Endianness.LittleEndian })
+ {
+ var stream = new MemoryStream();
+
+ var writer = new EndianBinaryWriter(endianness, stream);
+
+ writer.Write(true); // Bool
+ writer.Write((byte)1); // Byte
+ writer.Write((short)1); // Int16
+ writer.Write(1); // Int32
+ writer.Write(1L); // Int64
+ writer.Write(1f); // Single
+ writer.Write(1d); // Double
+ writer.Write((sbyte)1); // SByte
+ writer.Write((ushort)1); // UInt16
+ writer.Write((uint)1); // UInt32
+ writer.Write(1UL); // ULong
+
+ Assert.Equal(43, stream.Length);
+
+ stream.Position = 0;
+
+ var reader = new EndianBinaryReader(endianness, stream);
+
+ Assert.True(reader.ReadBoolean()); // Bool
+ Assert.Equal((byte)1, reader.ReadByte()); // Byte
+ Assert.Equal((short)1, reader.ReadInt16()); // Int16
+ Assert.Equal(1, reader.ReadInt32()); // Int32
+ Assert.Equal(1L, reader.ReadInt64()); // Int64
+ Assert.Equal(1f, reader.ReadSingle()); // Single
+ Assert.Equal(1d, reader.ReadDouble()); // Double
+ Assert.Equal((sbyte)1, reader.ReadSByte()); // SByte
+ Assert.Equal((ushort)1, reader.ReadUInt16()); // UInt16
+ Assert.Equal((uint)1, reader.ReadUInt32()); // UInt32
+ Assert.Equal(1UL, reader.ReadUInt64()); // ULong
+
+ stream.Dispose();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.CopyBytesTests.cs b/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.CopyBytesTests.cs
deleted file mode 100644
index 97d9275ad..000000000
--- a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.CopyBytesTests.cs
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class LittleEndianBitConverterCopyBytesTests
- {
- [Fact]
- public void CopyToWithNullBufferThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(false, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((short)42, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)42, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42u, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42L, null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ulong)42L, null, 0));
- }
-
- [Fact]
- public void CopyToWithIndexTooBigThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(false, new byte[1], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((short)42, new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)42, new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42, new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42u, new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42L, new byte[8], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ulong)42L, new byte[8], 1));
- }
-
- [Fact]
- public void CopyToWithBufferTooSmallThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(false, new byte[0], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((short)42, new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)42, new byte[1], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42, new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42u, new byte[3], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes(42L, new byte[7], 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.CopyBytes((ulong)42L, new byte[7], 0));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesBoolean()
- {
- byte[] buffer = new byte[1];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes(false, buffer, 0);
- this.CheckBytes(new byte[] { 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(true, buffer, 0);
- this.CheckBytes(new byte[] { 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesShort()
- {
- byte[] buffer = new byte[2];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes((short)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((short)1, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((short)256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((short)-1, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((short)257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesUShort()
- {
- byte[] buffer = new byte[2];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)1, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(ushort.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((ushort)257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesInt()
- {
- byte[] buffer = new byte[4];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes(0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(65536, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(16777216, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(-1, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1, 0, 0 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesUInt()
- {
- byte[] buffer = new byte[4];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)0, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)1, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)65536, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)16777216, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(uint.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes((uint)257, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1, 0, 0 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesLong()
- {
- byte[] buffer = new byte[8];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes(0L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1L, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(256L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(65536L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(16777216L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(4294967296L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776L, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776L * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776L * 256 * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(-1L, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(257L, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void CopyBytesULong()
- {
- byte[] buffer = new byte[8];
-
- EndianBitConverter.LittleEndianConverter.CopyBytes(0UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1UL, buffer, 0);
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(256UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(65536UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(16777216UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(4294967296UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776UL, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776UL * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(1099511627776UL * 256 * 256, buffer, 0);
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(ulong.MaxValue, buffer, 0);
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, buffer);
- EndianBitConverter.LittleEndianConverter.CopyBytes(257UL, buffer, 0);
- this.CheckBytes(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, buffer);
- }
-
- ///
- /// Tests the two byte arrays for equality.
- ///
- /// The expected bytes.
- /// The actual bytes.
- private void CheckBytes(byte[] expected, byte[] actual)
- {
- Assert.Equal(expected.Length, actual.Length);
- Assert.Equal(expected, actual);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.GetBytesTests.cs b/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.GetBytesTests.cs
deleted file mode 100644
index eae8ca291..000000000
--- a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.GetBytesTests.cs
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class LittleEndianBitConverterGetBytesTests
- {
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesBoolean()
- {
- this.CheckBytes(new byte[] { 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(false));
- this.CheckBytes(new byte[] { 1 }, EndianBitConverter.LittleEndianConverter.GetBytes(true));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesShort()
- {
- this.CheckBytes(new byte[] { 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((short)0));
- this.CheckBytes(new byte[] { 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((short)1));
- this.CheckBytes(new byte[] { 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes((short)256));
- this.CheckBytes(new byte[] { 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes((short)-1));
- this.CheckBytes(new byte[] { 1, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes((short)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesUShort()
- {
- this.CheckBytes(new byte[] { 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((ushort)0));
- this.CheckBytes(new byte[] { 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((ushort)1));
- this.CheckBytes(new byte[] { 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes((ushort)256));
- this.CheckBytes(new byte[] { 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes(ushort.MaxValue));
- this.CheckBytes(new byte[] { 1, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes((ushort)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesInt()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(0));
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1));
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(256));
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(65536));
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes(16777216));
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes(-1));
- this.CheckBytes(new byte[] { 1, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesUInt()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)0));
- this.CheckBytes(new byte[] { 1, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)1));
- this.CheckBytes(new byte[] { 0, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)256));
- this.CheckBytes(new byte[] { 0, 0, 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)65536));
- this.CheckBytes(new byte[] { 0, 0, 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)16777216));
- this.CheckBytes(new byte[] { 255, 255, 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes(uint.MaxValue));
- this.CheckBytes(new byte[] { 1, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes((uint)257));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesLong()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(0L));
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1L));
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(256L));
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(65536L));
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(16777216L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(4294967296L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776L));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776L * 256));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776L * 256 * 256));
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes(-1L));
- this.CheckBytes(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(257L));
- }
-
- ///
- /// Tests that passing a returns the correct bytes.
- ///
- [Fact]
- public void GetBytesULong()
- {
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(0UL));
- this.CheckBytes(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1UL));
- this.CheckBytes(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(256UL));
- this.CheckBytes(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(65536UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(16777216UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(4294967296UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776UL));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776UL * 256));
- this.CheckBytes(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, EndianBitConverter.LittleEndianConverter.GetBytes(1099511627776UL * 256 * 256));
- this.CheckBytes(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, EndianBitConverter.LittleEndianConverter.GetBytes(ulong.MaxValue));
- this.CheckBytes(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, EndianBitConverter.LittleEndianConverter.GetBytes(257UL));
- }
-
- ///
- /// Tests the two byte arrays for equality.
- ///
- /// The expected bytes.
- /// The actual bytes.
- private void CheckBytes(byte[] expected, byte[] actual)
- {
- Assert.Equal(expected.Length, actual.Length);
- Assert.Equal(expected, actual);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.ToTypeTests.cs b/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.ToTypeTests.cs
deleted file mode 100644
index 0e09d1d07..000000000
--- a/tests/ImageSharp.Tests/IO/LittleEndianBitConverter.ToTypeTests.cs
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.ImageSharp.IO;
-using Xunit;
-
-namespace SixLabors.ImageSharp.Tests.IO
-{
- ///
- /// The tests.
- ///
- public class LittleEndianBitConverterToTypeTests
- {
- [Fact]
- public void CopyToWithNullBufferThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToBoolean(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt16(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt16(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt32(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt32(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt64(null, 0));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt64(null, 0));
- }
-
- [Fact]
- public void CopyToWithIndexTooBigThrowsException()
- {
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[1], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt16(new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[2], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt32(new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[4], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt64(new byte[8], 1));
- Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[8], 1));
- }
-
- [Fact]
- public void CopyToWithBufferTooSmallThrowsException()
- {
- Assert.Throws