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]);
}
}
}