diff --git a/README.md b/README.md
index 7e47e6b06f..f9d0315f2f 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,21 @@
-
-
- ImageSharp
-
-
-
-
-
-
-
+
+
+
+SixLabors.ImageSharp
+
+
+
+[](https://raw.githubusercontent.com/SixLabors/ImageSharp/master/LICENSE)
+[](https://gitter.im/ImageSharp/General?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[](https://twitter.com/intent/tweet?hashtags=imagesharp,dotnet,oss&text=ImageSharp.+A+new+cross-platform+2D+graphics+API+in+C%23&url=https%3a%2f%2fgithub.com%2fSixLabors%2fImageSharp&via=sixlabors)
+[](#backers)
+[](#sponsors)
+
+
+
### **ImageSharp** is a new, fully featured, fully managed, cross-platform, 2D graphics API.
Designed to democratize image processing, ImageSharp brings you an incredibly powerful yet beautifully simple API.
@@ -21,7 +26,7 @@ Built against .Net Standard 1.1 ImageSharp can be used in device, cloud, and emb
### Installation
-Install stable releases via Nuget;evelopment releases are available via MyGet.
+Install stable releases via Nuget; development releases are available via MyGet.
| Package Name | Release (NuGet) | Nightly (MyGet) |
|--------------------------------|-----------------|-----------------|
@@ -51,7 +56,8 @@ The **ImageSharp** library is made up of multiple packages:
### Questions?
-Do you have questions? We are happy to help! Please [join our gitter channel](https://gitter.im/ImageSharp/General), or ask them on [stackoverflow](https://stackoverflow.com) using the `ImageSharp` tag.
+- Do you have questions? We are happy to help! Please [join our gitter channel](https://gitter.im/ImageSharp/General), or ask them on [stackoverflow](https://stackoverflow.com) using the `ImageSharp` tag. **Do not** open issues for questions!
+- Please read our [Contribution Guide](https://github.com/SixLabors/ImageSharp/blob/master/.github/CONTRIBUTING.md) before opening issues or pull requests!
### API
@@ -122,7 +128,7 @@ git clone https://github.com/SixLabors/ImageSharp
### How can you help?
-Please... Spread the word, contribute algorithms, submit performance improvements, unit tests, no input is too little.
+Please... Spread the word, contribute algorithms, submit performance improvements, unit tests, no input is too little. Make sure to read our [Contribution Guide](https://github.com/SixLabors/ImageSharp/blob/master/.github/CONTRIBUTING.md) before opening a PR.
### The ImageSharp Team
diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
index 2c4a286d63..4144487e43 100644
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
+++ b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
@@ -11,7 +11,7 @@
SixLabors.ImageSharp.Drawing
SixLabors.ImageSharp.Drawing
Image Draw Shape Path Font
- https://raw.githubusercontent.com/SixLabors/ImageSharp/master/build/icons/imagesharp-logo-128.png
+ https://raw.githubusercontent.com/SixLabors/Branding/master/icons/imagesharp/sixlabors.imagesharp.128.png
https://github.com/SixLabors/ImageSharp
http://www.apache.org/licenses/LICENSE-2.0
git
@@ -36,9 +36,9 @@
-
-
-
+
+
+
All
diff --git a/src/ImageSharp.Drawing/Processing/Drawing/DrawImageExtensions.cs b/src/ImageSharp.Drawing/Processing/Drawing/DrawImageExtensions.cs
index e2951ee2cb..83e1b90f5f 100644
--- a/src/ImageSharp.Drawing/Processing/Drawing/DrawImageExtensions.cs
+++ b/src/ImageSharp.Drawing/Processing/Drawing/DrawImageExtensions.cs
@@ -20,7 +20,7 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The image to blend with the currently processing image.
/// The opacity of the image to blend. Must be between 0 and 1.
/// The .
- public static IImageProcessingContext Blend(this IImageProcessingContext source, Image image, float opacity)
+ public static IImageProcessingContext DrawImage(this IImageProcessingContext source, Image image, float opacity)
where TPixel : struct, IPixel
=> source.ApplyProcessor(new DrawImageProcessor(image, opacity));
@@ -33,7 +33,7 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The blending mode.
/// The opacity of the image to blend. Must be between 0 and 1.
/// The .
- public static IImageProcessingContext Blend(this IImageProcessingContext source, Image image, PixelBlenderMode blender, float opacity)
+ public static IImageProcessingContext DrawImage(this IImageProcessingContext source, Image image, PixelBlenderMode blender, float opacity)
where TPixel : struct, IPixel
=> source.ApplyProcessor(new DrawImageProcessor(image, opacity, blender));
@@ -45,11 +45,9 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The options, including the blending type and blending amount.
/// The image to blend with the currently processing image.
/// The .
- public static IImageProcessingContext Blend(this IImageProcessingContext source, GraphicsOptions options, Image image)
+ public static IImageProcessingContext DrawImage(this IImageProcessingContext source, GraphicsOptions options, Image image)
where TPixel : struct, IPixel
- {
- return source.ApplyProcessor(new DrawImageProcessor(image, options));
- }
+ => source.ApplyProcessor(new DrawImageProcessor(image, options));
///
/// Draws the given image together with the current one by blending their pixels.
diff --git a/src/ImageSharp.Drawing/Processing/Drawing/DrawRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Drawing/DrawRectangleExtensions.cs
index 03be4de47d..1f4a38a277 100644
--- a/src/ImageSharp.Drawing/Processing/Drawing/DrawRectangleExtensions.cs
+++ b/src/ImageSharp.Drawing/Processing/Drawing/DrawRectangleExtensions.cs
@@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The .
public static IImageProcessingContext Draw(this IImageProcessingContext source, GraphicsOptions options, IPen pen, RectangleF shape)
where TPixel : struct, IPixel
- => source.Draw(options, pen, new RectangularePolygon(shape.X, shape.Y, shape.Width, shape.Height));
+ => source.Draw(options, pen, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
///
/// Draws the outline of the rectangle with the provided pen.
diff --git a/src/ImageSharp.Drawing/Processing/Drawing/FillRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Drawing/FillRectangleExtensions.cs
index 234b94df52..ae0afc5d5a 100644
--- a/src/ImageSharp.Drawing/Processing/Drawing/FillRectangleExtensions.cs
+++ b/src/ImageSharp.Drawing/Processing/Drawing/FillRectangleExtensions.cs
@@ -24,7 +24,7 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The .
public static IImageProcessingContext Fill(this IImageProcessingContext source, GraphicsOptions options, IBrush brush, RectangleF shape)
where TPixel : struct, IPixel
- => source.Fill(options, brush, new RectangularePolygon(shape.X, shape.Y, shape.Width, shape.Height));
+ => source.Fill(options, brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
///
/// Flood fills the image in the shape of the provided rectangle with the specified brush.
@@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Processing.Drawing
/// The .
public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush, RectangleF shape)
where TPixel : struct, IPixel
- => source.Fill(brush, new RectangularePolygon(shape.X, shape.Y, shape.Width, shape.Height));
+ => source.Fill(brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
///
/// Flood fills the image in the shape of the provided rectangle with the specified brush.
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs
index 3bea562ecb..d8d152a966 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/GammaCompanding.cs
@@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
///
///
- public class GammaCompanding : ICompanding
+ internal class GammaCompanding : ICompanding
{
///
/// Initializes a new instance of the class.
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs
index 9099d6bedc..cb002dd9a7 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/LCompanding.cs
@@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
///
///
- public class LCompanding : ICompanding
+ internal class LCompanding : ICompanding
{
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LmsAdaptationMatrix.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/LmsAdaptationMatrix.cs
index a11b31da6b..e7385054b9 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/LmsAdaptationMatrix.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/LmsAdaptationMatrix.cs
@@ -17,7 +17,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
/// DISCo, Department of Informatics, Systems and Communication, University of Milan-Bicocca, viale Sarca 336, 20126 Milan, Italy
/// https://web.stanford.edu/~sujason/ColorBalancing/Papers/Two%20New%20von%20Kries%20Based%20Chromatic%20Adaptation.pdf
///
- public static class LmsAdaptationMatrix
+ internal static class LmsAdaptationMatrix
{
///
/// Von Kries chromatic adaptation transform matrix (Hunt-Pointer-Estevez adjusted for D65)
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs
index 86f07643c3..ffa006bc0e 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec2020Companding.cs
@@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// For 10-bits, companding is identical to
///
- public class Rec2020Companding : ICompanding
+ internal class Rec2020Companding : ICompanding
{
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs
index a75eedc0b9..9589b9b683 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/Rec709Companding.cs
@@ -12,7 +12,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
/// http://en.wikipedia.org/wiki/Rec._709
///
- public class Rec709Companding : ICompanding
+ internal class Rec709Companding : ICompanding
{
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs b/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs
index e3568deb05..65e87a599c 100644
--- a/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs
+++ b/src/ImageSharp/ColorSpaces/Conversion/Implementation/SRgbCompanding.cs
@@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation
///
///
///
- public class SRgbCompanding : ICompanding
+ internal class SRgbCompanding : ICompanding
{
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/src/ImageSharp/Common/Extensions/ByteExtensions.cs b/src/ImageSharp/Common/Extensions/ByteExtensions.cs
index f6c7207950..b5b868deaa 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 ab543234c9..93b98ae315 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 d448cf7838..ffab45a567 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 57bb3d09a7..436db636d8 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 dba4eaa15c..ffa3875057 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 2735164996..0cded1d80c 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 1cce90c0b7..9c4e9e4b99 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 bd686f2b9f..d1588c384f 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 9d84258cae..a2a57332b1 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 dd20886ff7..51e6b4859e 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 2fcfd966c3..0000000000
--- 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 0d660c68d5..6454ff2506 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 dd87faf455..9c42f0b694 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 844c81cc9e..0000000000
--- 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 ea1d7aa5ac..0000000000
--- 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 5686c829c4..0000000000
--- 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 0c0e49911b..0000000000
--- 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 b563a09cb8..0000000000
--- 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 a69831586a..0000000000
--- 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 5f1a1617f2..f90f4c8953 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 b9341a1b24..9a733fb536 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 888aff905e..338a18a403 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/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj
index 4433836793..db1de7b6c2 100644
--- a/src/ImageSharp/ImageSharp.csproj
+++ b/src/ImageSharp/ImageSharp.csproj
@@ -11,7 +11,7 @@
SixLabors.ImageSharp
SixLabors.ImageSharp
Image Resize Crop Gif Jpg Jpeg Bitmap Png Core
- https://raw.githubusercontent.com/SixLabors/ImageSharp/master/build/icons/imagesharp-logo-128.png
+ https://raw.githubusercontent.com/SixLabors/Branding/master/icons/imagesharp/sixlabors.imagesharp.128.png
https://github.com/SixLabors/ImageSharp
http://www.apache.org/licenses/LICENSE-2.0
git
@@ -35,7 +35,7 @@
-
+
All
diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs
index 30ca210ac4..a4810d0379 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 0c327484a0..4a6b7b7ce6 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 14f7f95703..794d77ba19 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 1fecd761a6..c4a6a9039a 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 63e4c015c1..1e789f0a68 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 9505ee6cf7..c8fe5ab88e 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 365f5cb514..d0a05677f9 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 c5ee6661f7..a8e68e36db 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 9dfec2cf90..4a88bbad7a 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 6f79752406..6d25fe9f4f 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 d87820f847..7d5d632411 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 1886df29f1..0817ef5ad3 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 5462b34dca..bfbf349b52 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/Image/CopyPixels.cs b/tests/ImageSharp.Benchmarks/Codecs/CopyPixels.cs
similarity index 98%
rename from tests/ImageSharp.Benchmarks/Image/CopyPixels.cs
rename to tests/ImageSharp.Benchmarks/Codecs/CopyPixels.cs
index 7f16be8521..ed849d76f4 100644
--- a/tests/ImageSharp.Benchmarks/Image/CopyPixels.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/CopyPixels.cs
@@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Threading.Tasks;
diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs
new file mode 100644
index 0000000000..30799aabf9
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs
@@ -0,0 +1,57 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Drawing;
+using System.IO;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using CoreSize = SixLabors.Primitives.Size;
+using SDImage = System.Drawing.Image;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class DecodeBmp : BenchmarkBase
+ {
+ private byte[] bmpBytes;
+
+ private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
+
+ [GlobalSetup]
+ public void ReadImages()
+ {
+ if (this.bmpBytes == null)
+ {
+ this.bmpBytes = File.ReadAllBytes(this.TestImageFullPath);
+ }
+ }
+
+ [Params(TestImages.Bmp.Car)]
+ public string TestImage { get; set; }
+
+ [Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
+ public Size BmpSystemDrawing()
+ {
+ using (var memoryStream = new MemoryStream(this.bmpBytes))
+ {
+ using (var image = SDImage.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageSharp Bmp")]
+ public CoreSize BmpCore()
+ {
+ using (var memoryStream = new MemoryStream(this.bmpBytes))
+ {
+ using (var image = Image.Load(memoryStream))
+ {
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+ }
+ }
+}
diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs
new file mode 100644
index 0000000000..ff378c75c3
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs
@@ -0,0 +1,75 @@
+//
+// Copyright (c) James Jackson-South and contributors.
+// Licensed under the Apache License, Version 2.0.
+//
+
+using System.IO;
+using System.Runtime.CompilerServices;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using CoreSize = SixLabors.Primitives.Size;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class DecodeFilteredPng : BenchmarkBase
+ {
+ private byte[] filter0;
+ private byte[] filter1;
+ private byte[] filter2;
+ private byte[] filter3;
+ private byte[] filter4;
+
+ [GlobalSetup]
+ public void ReadImages()
+ {
+ this.filter0 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter0));
+ this.filter1 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter1));
+ this.filter2 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter2));
+ this.filter3 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter3));
+ this.filter4 = File.ReadAllBytes(TestImageFullPath(TestImages.Png.Filter4));
+ }
+
+ [Benchmark(Baseline = true, Description = "None-filtered PNG file")]
+ public CoreSize PngFilter0()
+ {
+ return LoadPng(this.filter0);
+ }
+
+ [Benchmark(Description = "Sub-filtered PNG file")]
+ public CoreSize PngFilter1()
+ {
+ return LoadPng(this.filter1);
+ }
+
+ [Benchmark(Description = "Up-filtered PNG file")]
+ public CoreSize PngFilter2()
+ {
+ return LoadPng(this.filter2);
+ }
+
+ [Benchmark(Description = "Average-filtered PNG file")]
+ public CoreSize PngFilter3()
+ {
+ return LoadPng(this.filter3);
+ }
+
+ [Benchmark(Description = "Paeth-filtered PNG file")]
+ public CoreSize PngFilter4()
+ {
+ return LoadPng(this.filter4);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static CoreSize LoadPng(byte[] bytes)
+ {
+ using (var image = Image.Load(bytes))
+ {
+ return image.Size();
+ }
+ }
+
+ private static string TestImageFullPath(string path) => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, path);
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs
new file mode 100644
index 0000000000..be7e853000
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs
@@ -0,0 +1,57 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Drawing;
+using System.IO;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using CoreSize = SixLabors.Primitives.Size;
+using SDImage = System.Drawing.Image;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class DecodeGif : BenchmarkBase
+ {
+ private byte[] gifBytes;
+
+ private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
+
+ [GlobalSetup]
+ public void ReadImages()
+ {
+ if (this.gifBytes == null)
+ {
+ this.gifBytes = File.ReadAllBytes(this.TestImageFullPath);
+ }
+ }
+
+ [Params(TestImages.Gif.Rings)]
+ public string TestImage { get; set; }
+
+ [Benchmark(Baseline = true, Description = "System.Drawing Gif")]
+ public Size GifSystemDrawing()
+ {
+ using (var memoryStream = new MemoryStream(this.gifBytes))
+ {
+ using (var image = SDImage.FromStream(memoryStream))
+ {
+ return image.Size;
+ }
+ }
+ }
+
+ [Benchmark(Description = "ImageSharp Gif")]
+ public CoreSize GifCore()
+ {
+ using (var memoryStream = new MemoryStream(this.gifBytes))
+ {
+ using (var image = Image.Load(memoryStream))
+ {
+ return new CoreSize(image.Width, image.Height);
+ }
+ }
+ }
+ }
+}
diff --git a/tests/ImageSharp.Benchmarks/Image/DecodePng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs
similarity index 58%
rename from tests/ImageSharp.Benchmarks/Image/DecodePng.cs
rename to tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs
index f07e80a756..39f09b6b6f 100644
--- a/tests/ImageSharp.Benchmarks/Image/DecodePng.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs
@@ -1,31 +1,23 @@
-//
-// Copyright (c) James Jackson-South and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-//
+using System.Drawing;
+using System.IO;
+using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using CoreSize = SixLabors.Primitives.Size;
+using SDImage = System.Drawing.Image;
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
- using System.Drawing;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp.Tests;
-
- using CoreImage = ImageSharp.Image;
-
- using CoreSize = SixLabors.Primitives.Size;
[Config(typeof(Config.ShortClr))]
public class DecodePng : BenchmarkBase
{
private byte[] pngBytes;
- private string TestImageFullPath => Path.Combine(
- TestEnvironment.InputImagesDirectoryFullPath,
- this.TestImage);
+ private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[Params(TestImages.Png.Splash)]
public string TestImage { get; set; }
@@ -44,7 +36,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream(this.pngBytes))
{
- using (var image = Image.FromStream(memoryStream))
+ using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
@@ -56,9 +48,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream(this.pngBytes))
{
- using (var image = CoreImage.Load(memoryStream))
+ using (var image = Image.Load(memoryStream))
{
- return new CoreSize(image.Width, image.Height);
+ return image.Size();
}
}
}
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeBmp.cs
similarity index 56%
rename from tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs
rename to tests/ImageSharp.Benchmarks/Codecs/EncodeBmp.cs
index 68c84ab85f..2a6e215569 100644
--- a/tests/ImageSharp.Benchmarks/Image/EncodeBmp.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeBmp.cs
@@ -1,25 +1,20 @@
-//
-// Copyright (c) James Jackson-South and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-//
+using System.Drawing.Imaging;
+using System.IO;
+using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using SDImage = System.Drawing.Image;
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using CoreImage = ImageSharp.Image;
-
+ [Config(typeof(Config.ShortClr))]
public class EncodeBmp : BenchmarkBase
{
- // System.Drawing needs this.
private Stream bmpStream;
- private Image bmpDrawing;
+ private SDImage bmpDrawing;
private Image bmpCore;
[GlobalSetup]
@@ -27,10 +22,10 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
if (this.bmpStream == null)
{
- this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
- this.bmpCore = CoreImage.Load(this.bmpStream);
+ this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
+ this.bmpCore = Image.Load(this.bmpStream);
this.bmpStream.Position = 0;
- this.bmpDrawing = Image.FromStream(this.bmpStream);
+ this.bmpDrawing = SDImage.FromStream(this.bmpStream);
}
}
@@ -45,7 +40,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
[Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
public void BmpSystemDrawing()
{
- using (MemoryStream memoryStream = new MemoryStream())
+ using (var memoryStream = new MemoryStream())
{
this.bmpDrawing.Save(memoryStream, ImageFormat.Bmp);
}
@@ -54,10 +49,10 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
[Benchmark(Description = "ImageSharp Bmp")]
public void BmpCore()
{
- using (MemoryStream memoryStream = new MemoryStream())
+ using (var memoryStream = new MemoryStream())
{
this.bmpCore.SaveAsBmp(memoryStream);
}
}
}
-}
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs
new file mode 100644
index 0000000000..379f8aa8bf
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeBmpMultiple.cs
@@ -0,0 +1,28 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Collections.Generic;
+using System.Drawing.Imaging;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.Formats.Bmp;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class EncodeBmpMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
+ {
+ protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
+
+ [Benchmark(Description = "EncodeBmpMultiple - ImageSharp")]
+ public void EncodeBmpImageSharp()
+ {
+ this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new BmpEncoder()); return null; });
+ }
+
+ [Benchmark(Baseline = true, Description = "EncodeBmpMultiple - System.Drawing")]
+ public void EncodeBmpSystemDrawing()
+ {
+ this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Bmp); return null; });
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Codecs/EncodeGif.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeGif.cs
new file mode 100644
index 0000000000..4f5bcdf0a8
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeGif.cs
@@ -0,0 +1,63 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Drawing.Imaging;
+using System.IO;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.Formats.Gif;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Processing.Quantization;
+using SixLabors.ImageSharp.Tests;
+using SDImage = System.Drawing.Image;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class EncodeGif : BenchmarkBase
+ {
+ // System.Drawing needs this.
+ private Stream bmpStream;
+ private SDImage bmpDrawing;
+ private Image bmpCore;
+
+ [GlobalSetup]
+ public void ReadImages()
+ {
+ if (this.bmpStream == null)
+ {
+ this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
+ this.bmpCore = Image.Load(this.bmpStream);
+ this.bmpStream.Position = 0;
+ this.bmpDrawing = SDImage.FromStream(this.bmpStream);
+ }
+ }
+
+ [GlobalCleanup]
+ public void Cleanup()
+ {
+ this.bmpStream.Dispose();
+ this.bmpCore.Dispose();
+ this.bmpDrawing.Dispose();
+ }
+
+ [Benchmark(Baseline = true, Description = "System.Drawing Gif")]
+ public void GifSystemDrawing()
+ {
+ using (var memoryStream = new MemoryStream())
+ {
+ this.bmpDrawing.Save(memoryStream, ImageFormat.Gif);
+ }
+ }
+
+ [Benchmark(Description = "ImageSharp Gif")]
+ public void GifCore()
+ {
+ // Try to get as close to System.Drawing's output as possible
+ var options = new GifEncoder { Quantizer = new PaletteQuantizer(false) };
+ using (var memoryStream = new MemoryStream())
+ {
+ this.bmpCore.SaveAsGif(memoryStream, options);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs
new file mode 100644
index 0000000000..cf94a1ec38
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeGifMultiple.cs
@@ -0,0 +1,37 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Collections.Generic;
+using System.Drawing.Imaging;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.Formats.Gif;
+using SixLabors.ImageSharp.Processing.Quantization;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class EncodeGifMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
+ {
+ [Params(InputImageCategory.AllImages)]
+ public override InputImageCategory InputCategory { get; set; }
+
+ protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Gif/" };
+
+ [Benchmark(Description = "EncodeGifMultiple - ImageSharp")]
+ public void EncodeGifImageSharp()
+ {
+ this.ForEachImageSharpImage((img, ms) =>
+ {
+ // Try to get as close to System.Drawing's output as possible
+ var options = new GifEncoder { Quantizer = new PaletteQuantizer(false) };
+ img.Save(ms, options); return null;
+ });
+ }
+
+ [Benchmark(Baseline = true, Description = "EncodeGifMultiple - System.Drawing")]
+ public void EncodeGifSystemDrawing()
+ {
+ this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Gif); return null; });
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodeIndexedPng.cs
similarity index 77%
rename from tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs
rename to tests/ImageSharp.Benchmarks/Codecs/EncodeIndexedPng.cs
index bed826c10a..db415d3c25 100644
--- a/tests/ImageSharp.Benchmarks/Image/EncodeIndexedPng.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodeIndexedPng.cs
@@ -1,39 +1,32 @@
-//
-// Copyright (c) James Jackson-South and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-//
using System.IO;
using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Quantization;
+using SixLabors.ImageSharp.Tests;
using CoreImage = SixLabors.ImageSharp.Image;
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
///
/// Benchmarks saving png files using different quantizers. System.Drawing cannot save indexed png files so we cannot compare.
///
+ [Config(typeof(Config.ShortClr))]
public class EncodeIndexedPng : BenchmarkBase
{
// System.Drawing needs this.
private Stream bmpStream;
private Image bmpCore;
- [Params(false)]
- public bool LargeImage { get; set; }
-
[GlobalSetup]
public void ReadImages()
{
if (this.bmpStream == null)
{
- string path = this.LargeImage
- ? "../ImageSharp.Tests/TestImages/Formats/Jpg/baseline/jpeg420exif.jpg"
- : "../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp";
-
- this.bmpStream = File.OpenRead(path);
+ this.bmpStream = File.OpenRead(Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, TestImages.Bmp.Car));
this.bmpCore = CoreImage.Load(this.bmpStream);
this.bmpStream.Position = 0;
}
@@ -51,9 +44,8 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
- var encoder = new PngEncoder { Quantizer = new OctreeQuantizer() };
-
- this.bmpCore.SaveAsPng(memoryStream, encoder);
+ var options = new PngEncoder { Quantizer = KnownQuantizers.Octree };
+ this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@@ -63,7 +55,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new OctreeQuantizer(false) };
-
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@@ -73,8 +64,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
- var options = new PngEncoder { Quantizer = new PaletteQuantizer() };
-
+ var options = new PngEncoder { Quantizer = KnownQuantizers.Palette };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@@ -85,7 +75,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new PaletteQuantizer(false) };
-
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@@ -95,8 +84,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
{
using (var memoryStream = new MemoryStream())
{
- var options = new PngEncoder { Quantizer = new WuQuantizer() };
-
+ var options = new PngEncoder { Quantizer = KnownQuantizers.Wu };
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
@@ -107,7 +95,6 @@ namespace SixLabors.ImageSharp.Benchmarks.Image
using (var memoryStream = new MemoryStream())
{
var options = new PngEncoder { Quantizer = new WuQuantizer(false) };
-
this.bmpCore.SaveAsPng(memoryStream, options);
}
}
diff --git a/tests/ImageSharp.Benchmarks/Codecs/EncodePng.cs b/tests/ImageSharp.Benchmarks/Codecs/EncodePng.cs
new file mode 100644
index 0000000000..157dadd2c1
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/EncodePng.cs
@@ -0,0 +1,63 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Drawing.Imaging;
+using System.IO;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using SDImage = System.Drawing.Image;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ [Config(typeof(Config.ShortClr))]
+ public class EncodePng : BenchmarkBase
+ {
+ // System.Drawing needs this.
+ private Stream bmpStream;
+ private SDImage bmpDrawing;
+ private Image bmpCore;
+
+ [Params(false)]
+ public bool LargeImage { get; set; }
+
+ [GlobalSetup]
+ public void ReadImages()
+ {
+ if (this.bmpStream == null)
+ {
+ string path = Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.LargeImage ? TestImages.Jpeg.Baseline.Jpeg420Exif : TestImages.Bmp.Car);
+ this.bmpStream = File.OpenRead(path);
+ this.bmpCore = Image.Load(this.bmpStream);
+ this.bmpStream.Position = 0;
+ this.bmpDrawing = SDImage.FromStream(this.bmpStream);
+ }
+ }
+
+ [GlobalCleanup]
+ public void Cleanup()
+ {
+ this.bmpStream.Dispose();
+ this.bmpCore.Dispose();
+ this.bmpDrawing.Dispose();
+ }
+
+ [Benchmark(Baseline = true, Description = "System.Drawing Png")]
+ public void PngSystemDrawing()
+ {
+ using (var memoryStream = new MemoryStream())
+ {
+ this.bmpDrawing.Save(memoryStream, ImageFormat.Png);
+ }
+ }
+
+ [Benchmark(Description = "ImageSharp Png")]
+ public void PngCore()
+ {
+ using (var memoryStream = new MemoryStream())
+ {
+ this.bmpCore.SaveAsPng(memoryStream);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Codecs/GetSetPixel.cs b/tests/ImageSharp.Benchmarks/Codecs/GetSetPixel.cs
new file mode 100644
index 0000000000..a51ce8ebc6
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/GetSetPixel.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Drawing;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.PixelFormats;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
+{
+ public class GetSetPixel : BenchmarkBase
+ {
+ [Benchmark(Baseline = true, Description = "System.Drawing GetSet pixel")]
+ public Color ResizeSystemDrawing()
+ {
+ using (var source = new Bitmap(400, 400))
+ {
+ source.SetPixel(200, 200, Color.White);
+ return source.GetPixel(200, 200);
+ }
+ }
+
+ [Benchmark(Description = "ImageSharp GetSet pixel")]
+ public Rgba32 ResizeCore()
+ {
+ using (var image = new Image(400, 400))
+ {
+ image[200, 200] = Rgba32.White;
+ return image[200, 200];
+ }
+ }
+ }
+}
diff --git a/tests/ImageSharp.Benchmarks/Image/ImageBenchmarkTests.cs b/tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs
similarity index 97%
rename from tests/ImageSharp.Benchmarks/Image/ImageBenchmarkTests.cs
rename to tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs
index 8b25ba6fed..ee77a2b6b4 100644
--- a/tests/ImageSharp.Benchmarks/Image/ImageBenchmarkTests.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/ImageBenchmarkTests.cs
@@ -12,7 +12,7 @@
#if TEST
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Collections.Generic;
diff --git a/tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpeg.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg.cs
similarity index 53%
rename from tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpeg.cs
rename to tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg.cs
index f090e828d4..47325476cf 100644
--- a/tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpeg.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg.cs
@@ -1,33 +1,24 @@
-//
-// Copyright (c) James Jackson-South and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-//
+using System.Drawing;
+using System.IO;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.Formats.Jpeg.GolangPort;
+using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort;
using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.ImageSharp.Tests;
+using CoreSize = SixLabors.Primitives.Size;
+using SDImage = System.Drawing.Image;
-namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
+namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
- using System.Drawing;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp.Formats.Jpeg.GolangPort;
- using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort;
- using SixLabors.ImageSharp.Tests;
-
- using CoreImage = SixLabors.ImageSharp.Image;
-
- using CoreSize = SixLabors.Primitives.Size;
-
[Config(typeof(Config.ShortClr))]
public class DecodeJpeg : BenchmarkBase
{
private byte[] jpegBytes;
- private string TestImageFullPath => Path.Combine(
- TestEnvironment.InputImagesDirectoryFullPath,
- this.TestImage);
+ private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage);
[Params(TestImages.Jpeg.Baseline.Jpeg420Exif, TestImages.Jpeg.Baseline.Calliphora)]
public string TestImage { get; set; }
@@ -44,9 +35,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Baseline = true, Description = "Decode Jpeg - System.Drawing")]
public Size JpegSystemDrawing()
{
- using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
+ using (var memoryStream = new MemoryStream(this.jpegBytes))
{
- using (Image image = Image.FromStream(memoryStream))
+ using (var image = SDImage.FromStream(memoryStream))
{
return image.Size;
}
@@ -56,9 +47,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "Decode Jpeg - ImageSharp")]
public CoreSize JpegImageSharpOrig()
{
- using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
+ using (var memoryStream = new MemoryStream(this.jpegBytes))
{
- using (Image image = CoreImage.Load(memoryStream, new OrigJpegDecoder()))
+ using (var image = Image.Load(memoryStream, new OrigJpegDecoder()))
{
return new CoreSize(image.Width, image.Height);
}
@@ -68,9 +59,9 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "Decode Jpeg - ImageSharp PdfJs")]
public CoreSize JpegImageSharpPdfJs()
{
- using (MemoryStream memoryStream = new MemoryStream(this.jpegBytes))
+ using (var memoryStream = new MemoryStream(this.jpegBytes))
{
- using (Image image = CoreImage.Load(memoryStream, new PdfJsJpegDecoder()))
+ using (var image = Image.Load(memoryStream, new PdfJsJpegDecoder()))
{
return new CoreSize(image.Width, image.Height);
}
diff --git a/tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpegMultiple.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegMultiple.cs
similarity index 58%
rename from tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpegMultiple.cs
rename to tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegMultiple.cs
index cf0f0a54cf..7660769da3 100644
--- a/tests/ImageSharp.Benchmarks/Image/Jpeg/DecodeJpegMultiple.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegMultiple.cs
@@ -1,18 +1,13 @@
-//
-// Copyright (c) James Jackson-South and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-//
+using System.Collections.Generic;
+using BenchmarkDotNet.Attributes;
using SixLabors.ImageSharp.PixelFormats;
+using SDImage = System.Drawing.Image;
-namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
+namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
- using System.Collections.Generic;
-
- using BenchmarkDotNet.Attributes;
-
- using CoreImage = SixLabors.ImageSharp.Image;
-
[Config(typeof(Config.ShortClr))]
public class DecodeJpegMultiple : MultiImageBenchmarkBase
{
@@ -27,17 +22,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
[Benchmark(Description = "DecodeJpegMultiple - ImageSharp")]
public void DecodeJpegImageSharpNwq()
{
- this.ForEachStream(
- ms => CoreImage.Load(ms)
- );
+ this.ForEachStream(ms => Image.Load(ms));
}
-
+
[Benchmark(Baseline = true, Description = "DecodeJpegMultiple - System.Drawing")]
public void DecodeJpegSystemDrawing()
{
- this.ForEachStream(
- System.Drawing.Image.FromStream
- );
+ this.ForEachStream(SDImage.FromStream);
}
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpeg.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs
similarity index 97%
rename from tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpeg.cs
rename to tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs
index 8a43c39329..53f0630b9c 100644
--- a/tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpeg.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpeg.cs
@@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
-namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
+namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System.Drawing;
using System.Drawing.Imaging;
diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs
new file mode 100644
index 0000000000..afa2ad325a
--- /dev/null
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/EncodeJpegMultiple.cs
@@ -0,0 +1,30 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Collections.Generic;
+using System.Drawing.Imaging;
+using BenchmarkDotNet.Attributes;
+using SixLabors.ImageSharp.Formats.Jpeg;
+
+namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
+{
+ [Config(typeof(Config.ShortClr))] // It's long enough to iterate through multiple files
+ public class EncodeJpegMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
+ {
+ protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
+
+ protected override IEnumerable SearchPatterns => new[] { "*.bmp", "*.jpg" };
+
+ [Benchmark(Description = "EncodeJpegMultiple - ImageSharp")]
+ public void EncodeJpegImageSharp()
+ {
+ this.ForEachImageSharpImage((img, ms) => { img.Save(ms, new JpegEncoder()); return null; });
+ }
+
+ [Benchmark(Baseline = true, Description = "EncodeJpegMultiple - System.Drawing")]
+ public void EncodeJpegSystemDrawing()
+ {
+ this.ForEachSystemDrawingImage((img, ms) => { img.Save(ms, ImageFormat.Jpeg); return null; });
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/Jpeg/YCbCrColorConversion.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs
similarity index 97%
rename from tests/ImageSharp.Benchmarks/Image/Jpeg/YCbCrColorConversion.cs
rename to tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs
index c47aff9cf4..5f902ff64d 100644
--- a/tests/ImageSharp.Benchmarks/Image/Jpeg/YCbCrColorConversion.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/YCbCrColorConversion.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
+namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg
{
using System;
using System.Numerics;
diff --git a/tests/ImageSharp.Benchmarks/Image/MultiImageBenchmarkBase.cs b/tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs
similarity index 99%
rename from tests/ImageSharp.Benchmarks/Image/MultiImageBenchmarkBase.cs
rename to tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs
index 9bf6d73b6d..f046f3033b 100644
--- a/tests/ImageSharp.Benchmarks/Image/MultiImageBenchmarkBase.cs
+++ b/tests/ImageSharp.Benchmarks/Codecs/MultiImageBenchmarkBase.cs
@@ -5,7 +5,7 @@
using SixLabors.ImageSharp.PixelFormats;
-namespace SixLabors.ImageSharp.Benchmarks.Image
+namespace SixLabors.ImageSharp.Benchmarks.Codecs
{
using System;
using System.Collections.Generic;
diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs
index 7bac44a982..af754ba344 100644
--- a/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromVector4.cs
@@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System.Numerics;
using System.Runtime.CompilerServices;
diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs
index 882d77dd12..64327d378f 100644
--- a/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/PackFromXyzw.cs
@@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;
diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs
index 6537141501..e44847274e 100644
--- a/tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/ToVector4.cs
@@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;
using System.Numerics;
diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs
index b2def64ace..030d7ad766 100644
--- a/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyz.cs
@@ -1,5 +1,5 @@
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using System;
using System.Numerics;
diff --git a/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs b/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs
index dd9a628c25..4f58d15036 100644
--- a/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs
+++ b/tests/ImageSharp.Benchmarks/Color/Bulk/ToXyzw.cs
@@ -4,7 +4,7 @@ using System.Linq;
using System.Threading.Tasks;
// ReSharper disable InconsistentNaming
-namespace SixLabors.ImageSharp.Benchmarks.Color.Bulk
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces.Bulk
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs
index c5792f5476..cc3472e222 100644
--- a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs
+++ b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToCieLabConvert.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Color
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs
index 7528f75f80..d109995184 100644
--- a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs
+++ b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToHunterLabConvert.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Color
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs
index a4da780908..da7b9c3dd3 100644
--- a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs
+++ b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToLmsConvert.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Color
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs
index dab0e7a515..2a5754ab0e 100644
--- a/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs
+++ b/tests/ImageSharp.Benchmarks/Color/ColorspaceCieXyzToRgbConvert.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Color
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs b/tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs
index f4e0fd65f6..eba6b5d9be 100644
--- a/tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs
+++ b/tests/ImageSharp.Benchmarks/Color/RgbWorkingSpaceAdapt.cs
@@ -1,4 +1,4 @@
-namespace SixLabors.ImageSharp.Benchmarks.Color
+namespace SixLabors.ImageSharp.Benchmarks.ColorSpaces
{
using BenchmarkDotNet.Attributes;
diff --git a/tests/ImageSharp.Benchmarks/Config.cs b/tests/ImageSharp.Benchmarks/Config.cs
index 17ce3a07d4..b467579425 100644
--- a/tests/ImageSharp.Benchmarks/Config.cs
+++ b/tests/ImageSharp.Benchmarks/Config.cs
@@ -22,9 +22,8 @@ namespace SixLabors.ImageSharp.Benchmarks
public ShortClr()
{
this.Add(
- Job.Clr.WithLaunchCount(1)
- .WithWarmupCount(3)
- .WithTargetCount(3)
+ Job.Clr.WithLaunchCount(1).WithWarmupCount(3).WithTargetCount(3),
+ Job.Core.WithLaunchCount(1).WithWarmupCount(3).WithTargetCount(3)
);
}
}
diff --git a/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs b/tests/ImageSharp.Benchmarks/General/Vectorization/VectorFetching.cs
index 147f66f8f7..aa7d926a4d 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.Benchmarks/Image/DecodeBmp.cs b/tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs
deleted file mode 100644
index ea13efb55e..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/DecodeBmp.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Drawing;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using CoreImage = ImageSharp.Image;
-
- using CoreSize = SixLabors.Primitives.Size;
-
- public class DecodeBmp : BenchmarkBase
- {
- private byte[] bmpBytes;
-
- [GlobalSetup]
- public void ReadImages()
- {
- if (this.bmpBytes == null)
- {
- this.bmpBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
- }
- }
-
- [Benchmark(Baseline = true, Description = "System.Drawing Bmp")]
- public Size BmpSystemDrawing()
- {
- using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes))
- {
- using (Image image = Image.FromStream(memoryStream))
- {
- return image.Size;
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Bmp")]
- public CoreSize BmpCore()
- {
- using (MemoryStream memoryStream = new MemoryStream(this.bmpBytes))
- {
- using (Image image = CoreImage.Load(memoryStream))
- {
- return new CoreSize(image.Width, image.Height);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Image/DecodeFilteredPng.cs b/tests/ImageSharp.Benchmarks/Image/DecodeFilteredPng.cs
deleted file mode 100644
index b08adf4df6..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/DecodeFilteredPng.cs
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp;
- using SixLabors.Primitives;
- using CoreImage = ImageSharp.Image;
-
- public class DecodeFilteredPng : BenchmarkBase
- {
- private MemoryStream filter0;
- private MemoryStream filter1;
- private MemoryStream filter2;
- private MemoryStream filter3;
- private MemoryStream filter4;
-
- [GlobalSetup]
- public void ReadImages()
- {
- this.filter0 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter0.png"));
- this.filter1 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter1.png"));
- this.filter2 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter2.png"));
- this.filter3 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter3.png"));
- this.filter4 = new MemoryStream(File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Png/filter4.png"));
- }
-
- private SixLabors.Primitives.Size LoadPng(MemoryStream stream)
- {
- using (Image image = CoreImage.Load(stream))
- {
- return new SixLabors.Primitives.Size(image.Width, image.Height);
- }
- }
-
- [Benchmark(Baseline = true, Description = "None-filtered PNG file")]
- public Size PngFilter0()
- {
- return LoadPng(filter0);
- }
-
- [Benchmark(Description = "Sub-filtered PNG file")]
- public Size PngFilter1()
- {
- return LoadPng(filter1);
- }
-
- [Benchmark(Description = "Up-filtered PNG file")]
- public Size PngFilter2()
- {
- return LoadPng(filter2);
- }
-
- [Benchmark(Description = "Average-filtered PNG file")]
- public Size PngFilter3()
- {
- return LoadPng(filter3);
- }
-
- [Benchmark(Description = "Paeth-filtered PNG file")]
- public Size PngFilter4()
- {
- return LoadPng(filter4);
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs b/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs
deleted file mode 100644
index cc3401b580..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/DecodeGif.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Drawing;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using CoreImage = ImageSharp.Image;
-
- using CoreSize = SixLabors.Primitives.Size;
-
- public class DecodeGif : BenchmarkBase
- {
- private byte[] gifBytes;
-
- [GlobalSetup]
- public void ReadImages()
- {
- if (this.gifBytes == null)
- {
- this.gifBytes = File.ReadAllBytes("../ImageSharp.Tests/TestImages/Formats/Gif/rings.gif");
- }
- }
-
- [Benchmark(Baseline = true, Description = "System.Drawing Gif")]
- public Size GifSystemDrawing()
- {
- using (MemoryStream memoryStream = new MemoryStream(this.gifBytes))
- {
- using (Image image = Image.FromStream(memoryStream))
- {
- return image.Size;
- }
- }
- }
-
- [Benchmark(Description = "ImageSharp Gif")]
- public CoreSize GifCore()
- {
- using (MemoryStream memoryStream = new MemoryStream(this.gifBytes))
- {
- using (Image image = CoreImage.Load(memoryStream))
- {
- return new CoreSize(image.Width, image.Height);
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeBmpMultiple.cs b/tests/ImageSharp.Benchmarks/Image/EncodeBmpMultiple.cs
deleted file mode 100644
index c509d3555b..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/EncodeBmpMultiple.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Collections.Generic;
- using System.Drawing.Imaging;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp.Formats;
- using SixLabors.ImageSharp.Formats.Bmp;
-
- [Config(typeof(Config.ShortClr))]
- public class EncodeBmpMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
- {
- protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
-
- [Benchmark(Description = "EncodeBmpMultiple - ImageSharp")]
- public void EncodeBmpImageSharp()
- {
- this.ForEachImageSharpImage(
- (img, ms) =>
- {
- img.Save(ms, new BmpEncoder());
- return null;
- });
- }
-
- [Benchmark(Baseline = true, Description = "EncodeBmpMultiple - System.Drawing")]
- public void EncodeBmpSystemDrawing()
- {
- this.ForEachSystemDrawingImage(
- (img, ms) =>
- {
- img.Save(ms, ImageFormat.Bmp);
- return null;
- });
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs b/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs
deleted file mode 100644
index e42881945a..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/EncodeGif.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
-
- using CoreImage = ImageSharp.Image;
-
- public class EncodeGif : BenchmarkBase
- {
- // System.Drawing needs this.
- private Stream bmpStream;
- private Image bmpDrawing;
- private Image bmpCore;
-
- [GlobalSetup]
- public void ReadImages()
- {
- if (this.bmpStream == null)
- {
- this.bmpStream = File.OpenRead("../ImageSharp.Tests/TestImages/Formats/Bmp/Car.bmp");
- this.bmpCore = CoreImage.Load(this.bmpStream);
- this.bmpStream.Position = 0;
- this.bmpDrawing = Image.FromStream(this.bmpStream);
- }
- }
-
- [GlobalCleanup]
- public void Cleanup()
- {
- this.bmpStream.Dispose();
- this.bmpCore.Dispose();
- this.bmpDrawing.Dispose();
- }
-
- [Benchmark(Baseline = true, Description = "System.Drawing Gif")]
- public void GifSystemDrawing()
- {
- using (MemoryStream memoryStream = new MemoryStream())
- {
- this.bmpDrawing.Save(memoryStream, ImageFormat.Gif);
- }
- }
-
- [Benchmark(Description = "ImageSharp Gif")]
- public void GifCore()
- {
- using (MemoryStream memoryStream = new MemoryStream())
- {
- this.bmpCore.SaveAsGif(memoryStream);
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodeGifMultiple.cs b/tests/ImageSharp.Benchmarks/Image/EncodeGifMultiple.cs
deleted file mode 100644
index 571299812c..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/EncodeGifMultiple.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Collections.Generic;
- using System.Drawing.Imaging;
-
- using BenchmarkDotNet.Attributes;
- using BenchmarkDotNet.Jobs;
-
- using SixLabors.ImageSharp.Formats;
- using SixLabors.ImageSharp.Formats.Gif;
-
- [Config(typeof(SingleRunConfig))]
- public class EncodeGifMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
- {
- public class SingleRunConfig : Config
- {
- public SingleRunConfig()
- {
- this.Add(
- Job.Default.WithLaunchCount(1)
- .WithWarmupCount(1)
- .WithTargetCount(1)
- );
- }
- }
-
- [Params(InputImageCategory.AllImages)]
- public override InputImageCategory InputCategory { get; set; }
-
- protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Gif/" };
-
- [Benchmark(Description = "EncodeGifMultiple - ImageSharp")]
- public void EncodeGifImageSharp()
- {
- this.ForEachImageSharpImage(
- (img, ms) =>
- {
- img.Save(ms, new GifEncoder());
- return null;
- });
- }
-
- [Benchmark(Baseline = true, Description = "EncodeGifMultiple - System.Drawing")]
- public void EncodeGifSystemDrawing()
- {
- this.ForEachSystemDrawingImage(
- (img, ms) =>
- {
- img.Save(ms, ImageFormat.Gif);
- return null;
- });
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Benchmarks/Image/EncodePng.cs b/tests/ImageSharp.Benchmarks/Image/EncodePng.cs
deleted file mode 100644
index 4fc84ba618..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/EncodePng.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Drawing;
- using System.Drawing.Imaging;
- using System.IO;
-
- using BenchmarkDotNet.Attributes;
- using SixLabors.ImageSharp.Formats.Png;
- using SixLabors.ImageSharp.Processing.Quantization;
- using SixLabors.ImageSharp.Tests;
-
- using CoreImage = ImageSharp.Image;
-
- public class EncodePng : BenchmarkBase
- {
- // System.Drawing needs this.
- private Stream bmpStream;
- private Image bmpDrawing;
- private Image bmpCore;
-
- [Params(false)]
- public bool LargeImage { get; set; }
-
- [Params(false)]
- public bool UseOctreeQuantizer { get; set; }
-
- [GlobalSetup]
- public void ReadImages()
- {
- if (this.bmpStream == null)
- {
- string path = Path.Combine(
- TestEnvironment.InputImagesDirectoryFullPath,
- this.LargeImage ? TestImages.Jpeg.Baseline.Jpeg420Exif : TestImages.Bmp.Car);
-
-
- this.bmpStream = File.OpenRead(path);
- this.bmpCore = CoreImage.Load(this.bmpStream);
- this.bmpStream.Position = 0;
- this.bmpDrawing = Image.FromStream(this.bmpStream);
- }
- }
-
- [GlobalCleanup]
- public void Cleanup()
- {
- this.bmpStream.Dispose();
- this.bmpCore.Dispose();
- this.bmpDrawing.Dispose();
- }
-
- [Benchmark(Baseline = true, Description = "System.Drawing Png")]
- public void PngSystemDrawing()
- {
- using (var memoryStream = new MemoryStream())
- {
- this.bmpDrawing.Save(memoryStream, ImageFormat.Png);
- }
- }
-
- [Benchmark(Description = "ImageSharp Png")]
- public void PngCore()
- {
- using (var memoryStream = new MemoryStream())
- {
- IQuantizer quantizer = this.UseOctreeQuantizer
- ?
- (IQuantizer)new OctreeQuantizer()
- : new PaletteQuantizer();
-
- var options = new PngEncoder { Quantizer = quantizer };
- this.bmpCore.SaveAsPng(memoryStream, options);
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Image/GetSetPixel.cs b/tests/ImageSharp.Benchmarks/Image/GetSetPixel.cs
deleted file mode 100644
index f9469e5fea..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/GetSetPixel.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-namespace SixLabors.ImageSharp.Benchmarks.Image
-{
- using System.Drawing;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp.PixelFormats;
-
- using SystemColor = System.Drawing.Color;
-
- public class GetSetPixel : BenchmarkBase
- {
- [Benchmark(Baseline = true, Description = "System.Drawing GetSet pixel")]
- public SystemColor ResizeSystemDrawing()
- {
- using (Bitmap source = new Bitmap(400, 400))
- {
- source.SetPixel(200, 200, SystemColor.White);
- return source.GetPixel(200, 200);
- }
- }
-
- [Benchmark(Description = "ImageSharp GetSet pixel")]
- public Rgba32 ResizeCore()
- {
- using (Image image = new Image(400, 400))
- {
- using (PixelAccessor imagePixels = image.Lock())
- {
- imagePixels[200, 200] = Rgba32.White;
- return imagePixels[200, 200];
- }
- }
- }
- }
-}
diff --git a/tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpegMultiple.cs b/tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpegMultiple.cs
deleted file mode 100644
index 4d28f5a198..0000000000
--- a/tests/ImageSharp.Benchmarks/Image/Jpeg/EncodeJpegMultiple.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-//
-// Copyright (c) James Jackson-South and contributors.
-// Licensed under the Apache License, Version 2.0.
-//
-
-namespace SixLabors.ImageSharp.Benchmarks.Image.Jpeg
-{
- using System.Collections.Generic;
- using System.Drawing.Imaging;
-
- using BenchmarkDotNet.Attributes;
-
- using SixLabors.ImageSharp.Formats.Jpeg;
-
- [Config(typeof(Config.ShortClr))] // It's long enough to iterate through multiple files
- public class EncodeJpegMultiple : MultiImageBenchmarkBase.WithImagesPreloaded
- {
- protected override IEnumerable InputImageSubfoldersOrFiles => new[] { "Bmp/", "Jpg/baseline" };
-
- protected override IEnumerable SearchPatterns => new[] { "*.bmp", "*.jpg" };
-
- [Benchmark(Description = "EncodeJpegMultiple - ImageSharp")]
- public void EncodeJpegImageSharp()
- {
- this.ForEachImageSharpImage(
- (img, ms) =>
- {
- img.Save(ms, new JpegEncoder());
- return null;
- });
- }
-
- [Benchmark(Baseline = true, Description = "EncodeJpegMultiple - System.Drawing")]
- public void EncodeJpegSystemDrawing()
- {
- this.ForEachSystemDrawingImage(
- (img, ms) =>
- {
- img.Save(ms, ImageFormat.Jpeg);
- return null;
- });
- }
- }
-}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/Drawing/Paths/FillRectangle.cs b/tests/ImageSharp.Tests/Drawing/Paths/FillRectangle.cs
index 03a59cc8d2..4c232b4525 100644
--- a/tests/ImageSharp.Tests/Drawing/Paths/FillRectangle.cs
+++ b/tests/ImageSharp.Tests/Drawing/Paths/FillRectangle.cs
@@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Tests.Drawing.Paths
Assert.Equal(GraphicsOptions.Default, processor.Options);
ShapeRegion region = Assert.IsType(processor.Region);
- Shapes.RectangularePolygon rect = Assert.IsType(region.Shape);
+ Shapes.RectangularPolygon rect = Assert.IsType(region.Shape);
Assert.Equal(rect.Location.X, this.rectangle.X);
Assert.Equal(rect.Location.Y, this.rectangle.Y);
Assert.Equal(rect.Size.Width, this.rectangle.Width);
@@ -44,7 +44,7 @@ namespace SixLabors.ImageSharp.Tests.Drawing.Paths
Assert.Equal(this.noneDefault, processor.Options);
ShapeRegion region = Assert.IsType(processor.Region);
- Shapes.RectangularePolygon rect = Assert.IsType(region.Shape);
+ Shapes.RectangularPolygon rect = Assert.IsType(region.Shape);
Assert.Equal(rect.Location.X, this.rectangle.X);
Assert.Equal(rect.Location.Y, this.rectangle.Y);
Assert.Equal(rect.Size.Width, this.rectangle.Width);
@@ -62,7 +62,7 @@ namespace SixLabors.ImageSharp.Tests.Drawing.Paths
Assert.Equal(GraphicsOptions.Default, processor.Options);
ShapeRegion region = Assert.IsType(processor.Region);
- Shapes.RectangularePolygon rect = Assert.IsType(region.Shape);
+ Shapes.RectangularPolygon rect = Assert.IsType(region.Shape);
Assert.Equal(rect.Location.X, this.rectangle.X);
Assert.Equal(rect.Location.Y, this.rectangle.Y);
Assert.Equal(rect.Size.Width, this.rectangle.Width);
@@ -81,7 +81,7 @@ namespace SixLabors.ImageSharp.Tests.Drawing.Paths
Assert.Equal(this.noneDefault, processor.Options);
ShapeRegion region = Assert.IsType(processor.Region);
- Shapes.RectangularePolygon rect = Assert.IsType(region.Shape);
+ Shapes.RectangularPolygon rect = Assert.IsType(region.Shape);
Assert.Equal(rect.Location.X, this.rectangle.X);
Assert.Equal(rect.Location.Y, this.rectangle.Y);
Assert.Equal(rect.Size.Width, this.rectangle.Width);
diff --git a/tests/ImageSharp.Tests/Drawing/SolidPolygonTests.cs b/tests/ImageSharp.Tests/Drawing/SolidPolygonTests.cs
index bf1f6d45a5..57ce93dea3 100644
--- a/tests/ImageSharp.Tests/Drawing/SolidPolygonTests.cs
+++ b/tests/ImageSharp.Tests/Drawing/SolidPolygonTests.cs
@@ -151,7 +151,7 @@ namespace SixLabors.ImageSharp.Tests.Drawing
{
image.Mutate(x => x
.BackgroundColor(Rgba32.Blue)
- .Fill(Rgba32.HotPink, new SixLabors.Shapes.RectangularePolygon(10, 10, 190, 140)));
+ .Fill(Rgba32.HotPink, new SixLabors.Shapes.RectangularPolygon(10, 10, 190, 140)));
image.Save($"{path}/Rectangle.png");
using (PixelAccessor sourcePixels = image.Lock())
diff --git a/tests/ImageSharp.Tests/IO/BigEndianBitConverter.CopyBytesTests.cs b/tests/ImageSharp.Tests/IO/BigEndianBitConverter.CopyBytesTests.cs
deleted file mode 100644
index 254cfa2dc4..0000000000
--- 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 d8408523ba..0000000000
--- 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 19ef24c79c..0000000000
--- 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 87adead338..0000000000
--- 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 0000000000..6e22b16891
--- /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 97d9275ad1..0000000000
--- 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 eae8ca2919..0000000000
--- 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 0e09d1d071..0000000000
--- 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 23bc297436..a813e0c1dd 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
{
diff --git a/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs
index 11e6000feb..36473fa56f 100644
--- a/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs
+++ b/tests/ImageSharp.Tests/PixelFormats/PixelBlenders/PorterDuffCompositorTests.cs
@@ -37,7 +37,7 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders
using (Image src = srcFile.CreateImage())
using (Image dest = provider.GetImage())
{
- using (Image res = dest.Clone(x => x.Blend(new GraphicsOptions { BlenderMode = mode }, src)))
+ using (Image res = dest.Clone(x => x.DrawImage(new GraphicsOptions { BlenderMode = mode }, src)))
{
res.DebugSave(provider, mode.ToString());
res.CompareToReferenceOutput(provider, mode.ToString());