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(() => EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[0], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt16(new byte[1], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[1], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt32(new byte[3], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[3], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToInt64(new byte[7], 0)); - Assert.Throws(() => EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[7], 0)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToBoolean() - { - Assert.False(EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[] { 0 }, 0)); - Assert.True(EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[] { 1 }, 0)); - - Assert.False(EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[] { 1, 0 }, 1)); - Assert.True(EndianBitConverter.LittleEndianConverter.ToBoolean(new byte[] { 0, 1 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToInt16() - { - Assert.Equal((short)0, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 0, 0 }, 0)); - Assert.Equal((short)1, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 1, 0 }, 0)); - Assert.Equal((short)256, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 0, 1 }, 0)); - Assert.Equal((short)-1, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 255, 255 }, 0)); - Assert.Equal((short)257, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 1, 1 }, 0)); - - Assert.Equal((short)0, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 1, 0, 0 }, 1)); - Assert.Equal((short)1, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 0, 1, 0 }, 1)); - Assert.Equal((short)256, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 1, 0, 1 }, 1)); - Assert.Equal((short)-1, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 0, 255, 255 }, 1)); - Assert.Equal((short)257, EndianBitConverter.LittleEndianConverter.ToInt16(new byte[] { 0, 1, 1 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToUInt16() - { - Assert.Equal((ushort)0, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 0, 0 }, 0)); - Assert.Equal((ushort)1, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 1, 0 }, 0)); - Assert.Equal((ushort)256, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 0, 1 }, 0)); - Assert.Equal(ushort.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 255, 255 }, 0)); - Assert.Equal((ushort)257, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 1, 1 }, 0)); - - Assert.Equal((ushort)0, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 1, 0, 0 }, 1)); - Assert.Equal((ushort)1, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 0, 1, 0 }, 1)); - Assert.Equal((ushort)256, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 1, 0, 1 }, 1)); - Assert.Equal(ushort.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 0, 255, 255 }, 1)); - Assert.Equal((ushort)257, EndianBitConverter.LittleEndianConverter.ToUInt16(new byte[] { 0, 1, 1 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToInt32() - { - Assert.Equal(0, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 0, 0, 0 }, 0)); - Assert.Equal(1, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0 }, 0)); - Assert.Equal(256, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 1, 0, 0 }, 0)); - Assert.Equal(65536, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 0, 1, 0 }, 0)); - Assert.Equal(16777216, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 0, 0, 1 }, 0)); - Assert.Equal(-1, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 255, 255, 255, 255 }, 0)); - Assert.Equal(257, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 1, 0, 0 }, 0)); - - Assert.Equal(0, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0, 0 }, 1)); - Assert.Equal(1, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 1, 0, 0, 0 }, 1)); - Assert.Equal(256, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 0, 1, 0, 0 }, 1)); - Assert.Equal(65536, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 0, 0, 1, 0 }, 1)); - Assert.Equal(16777216, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 1, 0, 0, 0, 1 }, 1)); - Assert.Equal(-1, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 255, 255, 255, 255 }, 1)); - Assert.Equal(257, EndianBitConverter.LittleEndianConverter.ToInt32(new byte[] { 0, 1, 1, 0, 0 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToUInt32() - { - Assert.Equal((uint)0, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 0, 0, 0 }, 0)); - Assert.Equal((uint)1, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0 }, 0)); - Assert.Equal((uint)256, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 1, 0, 0 }, 0)); - Assert.Equal((uint)65536, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 0, 1, 0 }, 0)); - Assert.Equal((uint)16777216, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 0, 0, 1 }, 0)); - Assert.Equal(uint.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 255, 255, 255, 255 }, 0)); - Assert.Equal((uint)257, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 1, 0, 0 }, 0)); - - Assert.Equal((uint)0, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0, 0 }, 1)); - Assert.Equal((uint)1, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 1, 0, 0, 0 }, 1)); - Assert.Equal((uint)256, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 0, 1, 0, 0 }, 1)); - Assert.Equal((uint)65536, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 1, 0 }, 1)); - Assert.Equal((uint)16777216, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 1, 0, 0, 0, 1 }, 1)); - Assert.Equal(uint.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 255, 255, 255, 255 }, 1)); - Assert.Equal((uint)257, EndianBitConverter.LittleEndianConverter.ToUInt32(new byte[] { 0, 1, 1, 0, 0 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToInt64() - { - Assert.Equal(0L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(1L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(256L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(65536L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(16777216L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, 0)); - Assert.Equal(4294967296L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, 0)); - Assert.Equal(1099511627776L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, 0)); - Assert.Equal(1099511627776L * 256, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, 0)); - Assert.Equal(1099511627776L * 256 * 256, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, 0)); - Assert.Equal(-1L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, 0)); - Assert.Equal(257L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(4294967295L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 255, 255, 255, 255, 0, 0, 0, 0 }, 0)); - Assert.Equal(-4294967296L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 255, 255, 255, 255 }, 0)); - - Assert.Equal(0L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(1L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(256L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 1, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(65536L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(16777216L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0, 0 }, 1)); - Assert.Equal(4294967296L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 0 }, 1)); - Assert.Equal(1099511627776L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 1, 0, 0 }, 1)); - Assert.Equal(1099511627776L * 256, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 0 }, 1)); - Assert.Equal(1099511627776L * 256 * 256, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 1)); - Assert.Equal(-1L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 255, 255, 255, 255, 255, 255, 255, 255 }, 1)); - Assert.Equal(257L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 1, 1, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(4294967295L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 255, 255, 255, 255, 0, 0, 0, 0 }, 1)); - Assert.Equal(-4294967296L, EndianBitConverter.LittleEndianConverter.ToInt64(new byte[] { 0, 0, 0, 0, 0, 255, 255, 255, 255 }, 1)); - } - - /// - /// Tests that passing a returns the correct bytes. - /// - [Fact] - public void ToUInt64() - { - Assert.Equal(0UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(1UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(256UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(65536UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 1, 0, 0, 0, 0, 0 }, 0)); - Assert.Equal(16777216UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 1, 0, 0, 0, 0 }, 0)); - Assert.Equal(4294967296UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 1, 0, 0, 0 }, 0)); - Assert.Equal(1099511627776UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 1, 0, 0 }, 0)); - Assert.Equal(1099511627776UL * 256, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 1, 0 }, 0)); - Assert.Equal(1099511627776UL * 256 * 256, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 0, 0, 0, 0, 0, 0, 1 }, 0)); - Assert.Equal(ulong.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 255, 255, 255, 255, 255, 255, 255, 255 }, 0)); - Assert.Equal(257UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 1, 0, 0, 0, 0, 0, 0 }, 0)); - - Assert.Equal(0UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(1UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 1, 0, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(256UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 1, 0, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(65536UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 1, 0, 0, 0, 0, 0 }, 1)); - Assert.Equal(16777216UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 1, 0, 0, 0, 0 }, 1)); - Assert.Equal(4294967296UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 1, 0, 0, 0 }, 1)); - Assert.Equal(1099511627776UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 1, 0, 0 }, 1)); - Assert.Equal(1099511627776UL * 256, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 1, 0 }, 1)); - Assert.Equal(1099511627776UL * 256 * 256, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 1 }, 1)); - Assert.Equal(ulong.MaxValue, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 255, 255, 255, 255, 255, 255, 255, 255 }, 1)); - Assert.Equal(257UL, EndianBitConverter.LittleEndianConverter.ToUInt64(new byte[] { 0, 1, 1, 0, 0, 0, 0, 0, 0 }, 1)); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Memory/SpanUtilityTests.cs b/tests/ImageSharp.Tests/Memory/SpanUtilityTests.cs index 23bc29743..a813e0c1d 100644 --- a/tests/ImageSharp.Tests/Memory/SpanUtilityTests.cs +++ b/tests/ImageSharp.Tests/Memory/SpanUtilityTests.cs @@ -26,21 +26,6 @@ namespace SixLabors.ImageSharp.Tests.Memory Assert.True(Unsafe.AreSame(ref a, ref bb), "References are not same!"); } } - - [Fact] - public void FetchVector() - { - float[] stuff = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; - - var span = new Span(stuff); - - ref Vector v = ref span.FetchVector(); - - Assert.Equal(0, v[0]); - Assert.Equal(1, v[1]); - Assert.Equal(2, v[2]); - Assert.Equal(3, v[3]); - } public class SpanHelper_Copy {