diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs index d2f8653f6..30ca210ac 100644 --- a/src/ImageSharp/Memory/BasicArrayBuffer.cs +++ b/src/ImageSharp/Memory/BasicArrayBuffer.cs @@ -9,16 +9,23 @@ namespace SixLabors.ImageSharp.Memory internal class BasicArrayBuffer : IBuffer where T : struct { - public BasicArrayBuffer(T[] array) + public BasicArrayBuffer(T[] array, int length) { + DebugGuard.MustBeLessThanOrEqualTo(length, array.Length, nameof(length)); this.Array = array; + this.Length = length; + } + + public BasicArrayBuffer(T[] array) + : this(array, array.Length) + { } public T[] Array { get; } - public Span Span => this.Array; + public int Length { get; } - public int Length => this.Array.Length; + public Span Span => this.Array.AsSpan().Slice(0, this.Length); /// /// Returns a reference to specified element of the buffer. diff --git a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs index 6afce94fd..a765a77b1 100644 --- a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs +++ b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs @@ -26,12 +26,38 @@ namespace SixLabors.ImageSharp.Tests.Memory } } + private MemoryManager MemoryManager { get; } = new MockMemoryManager(); + + private class MockMemoryManager : MemoryManager + { + internal override IBuffer Allocate(int length, bool clear) + { + T[] array = new T[length + 42]; + + if (!clear) + { + Span data = array.AsSpan().NonPortableCast(); + for (int i = 0; i < data.Length; i++) + { + data[i] = 42; + } + } + + return new BasicArrayBuffer(array, length); + } + + internal override IManagedByteBuffer AllocateManagedByteBuffer(int length, bool clear) + { + throw new NotImplementedException(); + } + } + [Theory] [InlineData(7, 42)] [InlineData(1025, 17)] public void Construct(int width, int height) { - using (Buffer2D buffer = Configuration.Default.MemoryManager.Allocate2D(width, height)) + using (Buffer2D buffer = this.MemoryManager.Allocate2D(width, height)) { Assert.Equal(width, buffer.Width); Assert.Equal(height, buffer.Height); @@ -42,16 +68,12 @@ namespace SixLabors.ImageSharp.Tests.Memory [Fact] public void CreateClean() { - for (int i = 0; i < 100; i++) + using (Buffer2D buffer = this.MemoryManager.Allocate2D(42, 42, true)) { - using (Buffer2D buffer = Configuration.Default.MemoryManager.Allocate2D(42, 42, true)) + Span span = buffer.Span; + for (int j = 0; j < span.Length; j++) { - Span span = buffer.Span; - for (int j = 0; j < span.Length; j++) - { - Assert.Equal(0, span[j]); - span[j] = 666; - } + Assert.Equal(0, span[j]); } } } @@ -62,7 +84,7 @@ namespace SixLabors.ImageSharp.Tests.Memory [InlineData(17, 42, 41)] public void GetRowSpanY(int width, int height, int y) { - using (Buffer2D buffer = Configuration.Default.MemoryManager.Allocate2D(width, height)) + using (Buffer2D buffer = this.MemoryManager.Allocate2D(width, height)) { Span span = buffer.GetRowSpan(y); @@ -78,7 +100,7 @@ namespace SixLabors.ImageSharp.Tests.Memory [InlineData(17, 42, 0, 41)] public void GetRowSpanXY(int width, int height, int x, int y) { - using (Buffer2D buffer = Configuration.Default.MemoryManager.Allocate2D(width, height)) + using (Buffer2D buffer = this.MemoryManager.Allocate2D(width, height)) { Span span = buffer.GetRowSpan(x, y); @@ -94,13 +116,13 @@ namespace SixLabors.ImageSharp.Tests.Memory [InlineData(99, 88, 98, 87)] public void Indexer(int width, int height, int x, int y) { - using (Buffer2D buffer = Configuration.Default.MemoryManager.Allocate2D(width, height)) + using (Buffer2D buffer = this.MemoryManager.Allocate2D(width, height)) { - Span array = buffer.Buffer.Span; + Span span = buffer.Buffer.Span; ref TestStructs.Foo actual = ref buffer[x, y]; - ref TestStructs.Foo expected = ref array[y * width + x]; + ref TestStructs.Foo expected = ref span[y * width + x]; Assert.True(Unsafe.AreSame(ref expected, ref actual)); }