diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
index 5a53d3e78..4f05bc66e 100644
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
+++ b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
@@ -8,16 +8,40 @@
SixLabors.ImageSharp.Drawing
Image Draw Shape Path Font
SixLabors.ImageSharp
- netcoreapp2.1;netstandard1.3;netstandard2.0
-
-
-
- $(DefineConstants);SUPPORTS_MATHF
+ netcoreapp2.1;netstandard2.0;netstandard1.3
-
- $(DefineConstants);SUPPORTS_HASHCODE
+
+
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
+
+
+ $(DefineConstants);SUPPORTS_MATHF;
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
+
+
+ $(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS
diff --git a/src/ImageSharp/Common/Extensions/EncoderExtensions.cs b/src/ImageSharp/Common/Extensions/EncoderExtensions.cs
index 59c878485..87aaa93a9 100644
--- a/src/ImageSharp/Common/Extensions/EncoderExtensions.cs
+++ b/src/ImageSharp/Common/Extensions/EncoderExtensions.cs
@@ -1,7 +1,7 @@
-// Copyright (c) Six Labors and contributors.
+// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-#if !NETCOREAPP2_1
+#if !SUPPORTS_ENCODING_STRING
using System;
using System.Text;
@@ -32,4 +32,4 @@ namespace SixLabors.ImageSharp
}
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/ImageSharp/Common/Extensions/StreamExtensions.cs b/src/ImageSharp/Common/Extensions/StreamExtensions.cs
index 6af09b220..cee3e2414 100644
--- a/src/ImageSharp/Common/Extensions/StreamExtensions.cs
+++ b/src/ImageSharp/Common/Extensions/StreamExtensions.cs
@@ -4,7 +4,6 @@
using System;
using System.Buffers;
using System.IO;
-
using SixLabors.ImageSharp.Memory;
using SixLabors.Memory;
@@ -15,7 +14,6 @@ namespace SixLabors.ImageSharp
///
internal static class StreamExtensions
{
-#if NETCOREAPP2_1
///
/// Writes data from a stream into the provided buffer.
///
@@ -24,23 +22,18 @@ namespace SixLabors.ImageSharp
/// The offset within the buffer to begin writing.
/// The number of bytes to write to the stream.
public static void Write(this Stream stream, Span buffer, int offset, int count)
- {
- stream.Write(buffer.Slice(offset, count));
- }
+ => stream.Write(buffer.Slice(offset, count));
///
/// Reads data from a stream into the provided buffer.
///
/// The stream.
- /// The buffer..
+ /// The buffer.
/// The offset within the buffer where the bytes are read into.
/// The number of bytes, if available, to read.
/// The actual number of bytes read.
public static int Read(this Stream stream, Span buffer, int offset, int count)
- {
- return stream.Read(buffer.Slice(offset, count));
- }
-#endif
+ => stream.Read(buffer.Slice(offset, count));
///
/// Skips the number of bytes in the given stream.
@@ -75,17 +68,39 @@ namespace SixLabors.ImageSharp
}
public static void Read(this Stream stream, IManagedByteBuffer buffer)
- {
- stream.Read(buffer.Array, 0, buffer.Length());
- }
+ => stream.Read(buffer.Array, 0, buffer.Length());
public static void Write(this Stream stream, IManagedByteBuffer buffer)
+ => stream.Write(buffer.Array, 0, buffer.Length());
+
+#if !SUPPORTS_SPAN_STREAM
+ // This is a port of the CoreFX implementation and is MIT Licensed:
+ // https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L742
+ public static int Read(this Stream stream, Span buffer)
{
- stream.Write(buffer.Array, 0, buffer.Length());
+ // This uses ArrayPool.Shared, rather than taking a MemoryAllocator,
+ // in order to match the signature of the framework method that exists in
+ // .NET Core.
+ byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Length);
+ try
+ {
+ int numRead = stream.Read(sharedBuffer, 0, buffer.Length);
+ if ((uint)numRead > (uint)buffer.Length)
+ {
+ throw new IOException("Stream was too long.");
+ }
+
+ new Span(sharedBuffer, 0, numRead).CopyTo(buffer);
+ return numRead;
+ }
+ finally
+ {
+ ArrayPool.Shared.Return(sharedBuffer);
+ }
}
-#if NET472 || NETSTANDARD1_3 || NETSTANDARD2_0
- // This is a port of the CoreFX implementation and is MIT Licensed: https://github.com/dotnet/coreclr/blob/c4dca1072d15bdda64c754ad1ea474b1580fa554/src/System.Private.CoreLib/shared/System/IO/Stream.cs#L770
+ // This is a port of the CoreFX implementation and is MIT Licensed:
+ // https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L775
public static void Write(this Stream stream, ReadOnlySpan buffer)
{
// This uses ArrayPool.Shared, rather than taking a MemoryAllocator,
diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
index 596710294..eda5f1f78 100644
--- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
+++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
@@ -445,11 +445,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle4(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int count = 0;
while (count < buffer.Length)
@@ -556,11 +552,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle8(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int count = 0;
while (count < buffer.Length)
@@ -639,11 +631,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle24(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int uncompressedPixels = 0;
while (uncompressedPixels < buffer.Length)
@@ -1213,11 +1201,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
///
private void ReadInfoHeader()
{
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[BmpInfoHeader.MaxHeaderSize];
-#else
- var buffer = new byte[BmpInfoHeader.MaxHeaderSize];
-#endif
// Read the header size.
this.stream.Read(buffer, 0, BmpInfoHeader.HeaderSizeSize);
@@ -1339,11 +1323,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
///
private void ReadFileHeader()
{
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[BmpFileHeader.Size];
-#else
- var buffer = new byte[BmpFileHeader.Size];
-#endif
this.stream.Read(buffer, 0, BmpFileHeader.Size);
short fileTypeMarker = BinaryPrimitives.ReadInt16LittleEndian(buffer);
diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs
index f7576bacb..41be71d2b 100644
--- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs
+++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs
@@ -173,11 +173,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
reserved: 0,
offset: BmpFileHeader.Size + infoHeaderSize + colorPaletteSize);
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[infoHeaderSize];
-#else
- var buffer = new byte[infoHeaderSize];
-#endif
fileHeader.WriteTo(buffer);
stream.Write(buffer, 0, BmpFileHeader.Size);
diff --git a/src/ImageSharp/Formats/Gif/LzwDecoder.cs b/src/ImageSharp/Formats/Gif/LzwDecoder.cs
index af390e954..2ae8a834e 100644
--- a/src/ImageSharp/Formats/Gif/LzwDecoder.cs
+++ b/src/ImageSharp/Formats/Gif/LzwDecoder.cs
@@ -113,11 +113,7 @@ namespace SixLabors.ImageSharp.Formats.Gif
Unsafe.Add(ref suffixRef, code) = (byte)code;
}
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[255];
-#else
- var buffer = new byte[255];
-#endif
while (xyz < length)
{
@@ -227,11 +223,7 @@ namespace SixLabors.ImageSharp.Formats.Gif
/// The .
///
[MethodImpl(MethodImplOptions.AggressiveInlining)]
-#if NETCOREAPP2_1
private int ReadBlock(Span buffer)
-#else
- private int ReadBlock(byte[] buffer)
-#endif
{
int bufferSize = this.stream.ReadByte();
diff --git a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
index 1ff3bb599..d4f42a6c3 100644
--- a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
+++ b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs
@@ -565,11 +565,8 @@ namespace SixLabors.ImageSharp.Formats.Tga
{
this.currentStream = stream;
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[TgaFileHeader.Size];
-#else
- var buffer = new byte[TgaFileHeader.Size];
-#endif
+
this.currentStream.Read(buffer, 0, TgaFileHeader.Size);
this.fileHeader = TgaFileHeader.Parse(buffer);
this.metadata = new ImageMetadata();
diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
index 3f4fb8f93..9dcea142f 100644
--- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
+++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs
@@ -97,11 +97,7 @@ namespace SixLabors.ImageSharp.Formats.Tga
pixelDepth: (byte)this.bitsPerPixel.Value,
imageDescriptor: imageDescriptor);
-#if NETCOREAPP2_1
Span buffer = stackalloc byte[TgaFileHeader.Size];
-#else
- byte[] buffer = new byte[TgaFileHeader.Size];
-#endif
fileHeader.WriteTo(buffer);
stream.Write(buffer, 0, TgaFileHeader.Size);
diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj
index c59f88396..caa9141d7 100644
--- a/src/ImageSharp/ImageSharp.csproj
+++ b/src/ImageSharp/ImageSharp.csproj
@@ -10,7 +10,7 @@
$(packageversion)
0.0.1
- netcoreapp2.1;netstandard1.3;netstandard2.0;net472
+ netcoreapp2.1;netstandard2.0;netstandard1.3;net472
true
true
@@ -19,23 +19,38 @@
SixLabors.ImageSharp
-
-
- $(DefineConstants);SUPPORTS_MATHF
+
+
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
-
-
- $(DefineConstants);SUPPORTS_HASHCODE
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
-
-
+
+ $(DefineConstants);SUPPORTS_MATHF;
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING
+
+
$(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS
-
-
-
-