From 9b1a7f1009d58f283c4f59d1047ea938d5c4c4cd Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 30 Jan 2020 13:39:55 +1100 Subject: [PATCH 1/5] Don't use ToArray() when we don't need to. --- Directory.Build.props | 28 ++++++++++++++-------------- src/ImageSharp/ImageExtensions.cs | 22 ++++++++++++++++++++-- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 604153f976..def231a7ae 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -31,27 +31,27 @@ - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE diff --git a/src/ImageSharp/ImageExtensions.cs b/src/ImageSharp/ImageExtensions.cs index 6cdc948d40..7f753c05a6 100644 --- a/src/ImageSharp/ImageExtensions.cs +++ b/src/ImageSharp/ImageExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; +using System.Buffers; using System.Collections.Generic; using System.IO; using System.Text; @@ -115,8 +116,25 @@ namespace SixLabors.ImageSharp using (var stream = new MemoryStream()) { source.Save(stream, format); - stream.Flush(); - return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(stream.ToArray())}"; + + // Always available. + stream.TryGetBuffer(out ArraySegment buffer); + +#if !SUPPORTS_BASE64SPAN + + byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Count); + try + { + buffer.AsSpan().CopyTo(sharedBuffer); + return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(sharedBuffer)}"; + } + finally + { + ArrayPool.Shared.Return(sharedBuffer); + } +#else + return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(buffer)}"; +#endif } } } From 24b818f2ff264d4d246eb62258ff1cf16cf0a2d8 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 25 Mar 2020 16:21:26 +0000 Subject: [PATCH 2/5] Update ImageExtensions.cs --- src/ImageSharp/ImageExtensions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ImageSharp/ImageExtensions.cs b/src/ImageSharp/ImageExtensions.cs index 24d2ad49bc..3cb4f433ec 100644 --- a/src/ImageSharp/ImageExtensions.cs +++ b/src/ImageSharp/ImageExtensions.cs @@ -2,7 +2,9 @@ // Licensed under the Apache License, Version 2.0. using System; +#if !SUPPORTS_BASE64SPAN using System.Buffers; +#endif using System.Collections.Generic; using System.IO; using System.Text; From 7e1ac921362b092e83719637e33cfe3bd0b2544c Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 25 Mar 2020 17:57:42 +0000 Subject: [PATCH 3/5] Simplify approach --- Directory.Build.props | 28 ++++++++++++++-------------- src/ImageSharp/ImageExtensions.cs | 27 +++++---------------------- 2 files changed, 19 insertions(+), 36 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 2f9863561c..de3583a0c8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -31,27 +31,27 @@ - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE - $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE;SUPPORTS_BASE64SPAN + $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE diff --git a/src/ImageSharp/ImageExtensions.cs b/src/ImageSharp/ImageExtensions.cs index 3cb4f433ec..d7ac0b174d 100644 --- a/src/ImageSharp/ImageExtensions.cs +++ b/src/ImageSharp/ImageExtensions.cs @@ -115,29 +115,12 @@ namespace SixLabors.ImageSharp public static string ToBase64String(this Image source, IImageFormat format) where TPixel : unmanaged, IPixel { - using (var stream = new MemoryStream()) - { - source.Save(stream, format); - - // Always available. - stream.TryGetBuffer(out ArraySegment buffer); + using var stream = new MemoryStream(); + source.Save(stream, format); -#if !SUPPORTS_BASE64SPAN - - byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Count); - try - { - buffer.AsSpan().CopyTo(sharedBuffer); - return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(sharedBuffer)}"; - } - finally - { - ArrayPool.Shared.Return(sharedBuffer); - } -#else - return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(buffer)}"; -#endif - } + // Always available. + stream.TryGetBuffer(out ArraySegment buffer); + return $"data:{format.DefaultMimeType};base64,{Convert.ToBase64String(buffer.Array, 0, (int)stream.Length)}"; } } } From ae4a979b91d2526e2ec0287f2d8d8daa1a5b93b3 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 25 Mar 2020 17:58:48 +0000 Subject: [PATCH 4/5] Update Directory.Build.props --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index de3583a0c8..12a4a5c2a3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -35,7 +35,7 @@ | SUPPORTS | MATHF | HASHCODE | EXTENDED_INTRINSICS | SPAN_STREAM | ENCODING_STRING | RUNTIME_INTRINSICS | CODECOVERAGE | +===================+=======+==========+=====================+=============+=================+====================+==============+ | netcoreapp3.1 | Y | Y | Y | Y | Y | Y | Y | - | netcoreapp2.1 | Y | Y | Y | Y | Y | N | Y | + | netcoreapp2.1 | Y | Y | Y | Y | Y | N | Y | | netcoreapp2.0 | Y | N | N | N | N | N | Y | | netstandard2.1 | Y | Y | N | Y | Y | N | Y | | netstandard2.0 | N | N | N | N | N | N | Y | From dc8094afa3531e54b67ba0da0276bd2c4da9bba4 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Wed, 25 Mar 2020 17:59:49 +0000 Subject: [PATCH 5/5] Update ImageExtensions.cs --- src/ImageSharp/ImageExtensions.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ImageSharp/ImageExtensions.cs b/src/ImageSharp/ImageExtensions.cs index d7ac0b174d..0bdbcc4ab3 100644 --- a/src/ImageSharp/ImageExtensions.cs +++ b/src/ImageSharp/ImageExtensions.cs @@ -2,9 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -#if !SUPPORTS_BASE64SPAN -using System.Buffers; -#endif using System.Collections.Generic; using System.IO; using System.Text;