diff --git a/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs index ae5ee2d9f6..076785526c 100644 --- a/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs +++ b/src/ImageSharp.Drawing/Processors/FillRegionProcessor.cs @@ -183,7 +183,7 @@ namespace SixLabors.ImageSharp.Drawing.Processors } } - applicator.Apply(scanline, minX, y); + applicator.Apply(scanline.Span, minX, y); } } } diff --git a/src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegBlockPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegBlockPostProcessor.cs index 574967b6bf..5e8e8fa2cc 100644 --- a/src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegBlockPostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Common/Decoder/JpegBlockPostProcessor.cs @@ -8,7 +8,7 @@ using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Common.Decoder { /// - /// Encapsulates the implementation of processing "raw" -s into Jpeg image channels. + /// Encapsulates the implementation of processing "raw" -s into Jpeg image channels. /// [StructLayout(LayoutKind.Sequential)] internal struct JpegBlockPostProcessor diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs index b8694c538e..3c43ba2444 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs @@ -30,13 +30,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components this.valOffset = memoryManager.AllocateFake(18); this.maxcode = memoryManager.AllocateFake(18); - using (BasicArrayBuffer huffsize = memoryManager.AllocateFake(257)) - using (BasicArrayBuffer huffcode = memoryManager.AllocateFake(257)) + using (IBuffer huffsize = memoryManager.Allocate(257)) + using (IBuffer huffcode = memoryManager.Allocate(257)) { - GenerateSizeTable(lengths, huffsize); - GenerateCodeTable(huffsize, huffcode); - GenerateDecoderTables(lengths, huffcode, this.valOffset, this.maxcode); - GenerateLookaheadTables(lengths, values, this.lookahead); + GenerateSizeTable(lengths, huffsize.Span); + GenerateCodeTable(huffsize.Span, huffcode.Span); + GenerateDecoderTables(lengths, huffcode.Span, this.valOffset.Span, this.maxcode.Span); + GenerateLookaheadTables(lengths, values, this.lookahead.Span); } this.huffval = memoryManager.AllocateManagedByteBuffer(values.Length, true); diff --git a/src/ImageSharp/Image/PixelAccessor{TPixel}.cs b/src/ImageSharp/Image/PixelAccessor{TPixel}.cs index 80c0ce4e66..3a894fb9ad 100644 --- a/src/ImageSharp/Image/PixelAccessor{TPixel}.cs +++ b/src/ImageSharp/Image/PixelAccessor{TPixel}.cs @@ -19,7 +19,7 @@ namespace SixLabors.ImageSharp { #pragma warning disable SA1401 // Fields must be private /// - /// The containing the pixel data. + /// The containing the pixel data. /// internal Buffer2D PixelBuffer; private bool ownedBuffer; diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs new file mode 100644 index 0000000000..5b03520106 --- /dev/null +++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs @@ -0,0 +1,50 @@ +using System; + +namespace SixLabors.ImageSharp.Memory +{ + /// + /// Contains and + /// + public partial class ArrayPoolMemoryManager + { + private class Buffer : IBuffer + where T : struct + { + private readonly ArrayPoolMemoryManager memoryManager; + + private readonly int length; + + public Buffer(byte[] data, int length, ArrayPoolMemoryManager memoryManager) + { + this.memoryManager = memoryManager; + this.Data = data; + this.length = length; + } + + protected byte[] Data { get; private set; } + + public Span Span => this.Data.AsSpan().NonPortableCast().Slice(0, this.length); + + public void Dispose() + { + if (this.Data == null) + { + return; + } + + this.memoryManager.pool.Return(this.Data); + this.Data = null; + } + } + + private class ManagedByteBuffer : Buffer, IManagedByteBuffer + { + public ManagedByteBuffer(byte[] data, int length, ArrayPoolMemoryManager memoryManager) + : base(data, length, memoryManager) + { + } + + public byte[] Array => this.Data; + } + } +} \ No newline at end of file diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs index de26b0ba5e..41ef847847 100644 --- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs +++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Buffers; +using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -8,7 +7,7 @@ namespace SixLabors.ImageSharp.Memory /// /// Implements by allocating memory from . /// - public class ArrayPoolMemoryManager : MemoryManager + public partial class ArrayPoolMemoryManager : MemoryManager { /// /// Defines the default maximum size of pooled arrays. @@ -44,7 +43,7 @@ namespace SixLabors.ImageSharp.Memory int bufferSizeInBytes = length * itemSizeBytes; byte[] byteBuffer = this.pool.Rent(bufferSizeInBytes); - var buffer = new Buffer(Unsafe.As(byteBuffer), length, this); + var buffer = new Buffer(byteBuffer, length, this); if (clear) { buffer.Clear(); @@ -64,19 +63,5 @@ namespace SixLabors.ImageSharp.Memory return buffer; } - - /// - internal override void Release(Buffer buffer) - { - T[] array = (buffer as IGetArray)?.GetArray(); - if (array == null) - { - return; - } - - // TODO: OMG Do not do this! - byte[] byteBuffer = Unsafe.As(array); - this.pool.Return(byteBuffer); - } } } \ No newline at end of file diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs index d9eb5a19a1..17bf4c8439 100644 --- a/src/ImageSharp/Memory/BasicArrayBuffer.cs +++ b/src/ImageSharp/Memory/BasicArrayBuffer.cs @@ -36,27 +36,7 @@ namespace SixLabors.ImageSharp.Memory return ref span[index]; } } - - /// - /// Converts to an . - /// - /// The to convert. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator ReadOnlySpan(BasicArrayBuffer buffer) - { - return new ReadOnlySpan(buffer.Array, 0, buffer.Length); - } - - /// - /// Converts to an . - /// - /// The to convert. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Span(BasicArrayBuffer buffer) - { - return new Span(buffer.Array, 0, buffer.Length); - } - + public void Dispose() { } diff --git a/src/ImageSharp/Memory/BasicByteBuffer.cs b/src/ImageSharp/Memory/BasicByteBuffer.cs new file mode 100644 index 0000000000..96b69ad3bf --- /dev/null +++ b/src/ImageSharp/Memory/BasicByteBuffer.cs @@ -0,0 +1,10 @@ +namespace SixLabors.ImageSharp.Memory +{ + internal class BasicByteBuffer : BasicArrayBuffer, IManagedByteBuffer + { + internal BasicByteBuffer(byte[] array) + : base(array) + { + } + } +} \ No newline at end of file diff --git a/src/ImageSharp/Memory/Buffer{T}.cs b/src/ImageSharp/Memory/Buffer{T}.cs index b1449f9b61..547e6f209d 100644 --- a/src/ImageSharp/Memory/Buffer{T}.cs +++ b/src/ImageSharp/Memory/Buffer{T}.cs @@ -58,9 +58,7 @@ namespace SixLabors.ImageSharp.Memory { return; } - - this.memoryManager?.Release(this); - + this.memoryManager = null; this.array = null; this.Length = 0; diff --git a/src/ImageSharp/Memory/ManagedByteBuffer.cs b/src/ImageSharp/Memory/ManagedByteBuffer.cs deleted file mode 100644 index 94d08e2aa7..0000000000 --- a/src/ImageSharp/Memory/ManagedByteBuffer.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SixLabors.ImageSharp.Memory -{ - internal class ManagedByteBuffer : Buffer, IManagedByteBuffer - { - internal ManagedByteBuffer(byte[] array, int length, MemoryManager memoryManager) - : base(array, length, memoryManager) - { - } - - public byte[] Array => this.array; - } -} \ No newline at end of file diff --git a/src/ImageSharp/Memory/MemoryManager.cs b/src/ImageSharp/Memory/MemoryManager.cs index fe6bb7823f..7445c66b7e 100644 --- a/src/ImageSharp/Memory/MemoryManager.cs +++ b/src/ImageSharp/Memory/MemoryManager.cs @@ -12,7 +12,7 @@ namespace SixLabors.ImageSharp.Memory public abstract class MemoryManager { /// - /// Allocates a of size , optionally + /// Allocates an of size , optionally /// clearing the buffer before it gets returned. /// /// Type of the data stored in the buffer @@ -24,15 +24,6 @@ namespace SixLabors.ImageSharp.Memory internal abstract IManagedByteBuffer AllocateManagedByteBuffer(int length, bool clear); - /// - /// Releases the memory allocated for . After this, the buffer - /// is no longer usable. - /// - /// Type of the data stored in the buffer - /// The buffer to release - internal abstract void Release(Buffer buffer) - where T : struct; - /// /// Temporal workaround. A method providing a "Buffer" based on a generic array without the 'Unsafe.As()' hackery. /// Should be replaced with 'Allocate()' as soon as SixLabors.Shapes has Span-based API-s! diff --git a/src/ImageSharp/Memory/MemoryManagerExtensions.cs b/src/ImageSharp/Memory/MemoryManagerExtensions.cs index 21c8f71248..b7fcaf4b36 100644 --- a/src/ImageSharp/Memory/MemoryManagerExtensions.cs +++ b/src/ImageSharp/Memory/MemoryManagerExtensions.cs @@ -6,7 +6,7 @@ internal static class MemoryManagerExtensions { /// - /// Allocates a of size . + /// Allocates a of size . /// Note: Depending on the implementation, the buffer may not cleared before /// returning, so it may contain data from an earlier use. /// diff --git a/src/ImageSharp/Memory/SimpleManagedMemoryManager.cs b/src/ImageSharp/Memory/SimpleManagedMemoryManager.cs index 804a468fd6..701c71ad43 100644 --- a/src/ImageSharp/Memory/SimpleManagedMemoryManager.cs +++ b/src/ImageSharp/Memory/SimpleManagedMemoryManager.cs @@ -8,17 +8,12 @@ /// internal override IBuffer Allocate(int length, bool clear) { - return new Buffer(new T[length], length, this); + return new BasicArrayBuffer(new T[length]); } internal override IManagedByteBuffer AllocateManagedByteBuffer(int length, bool clear) { - return new ManagedByteBuffer(new byte[length], length, this); - } - - /// - internal override void Release(Buffer buffer) - { + return new BasicByteBuffer(new byte[length]); } } }