diff --git a/src/ImageSharp/Image.WrapMemory.cs b/src/ImageSharp/Image.WrapMemory.cs index 383f643969..b0efdb60db 100644 --- a/src/ImageSharp/Image.WrapMemory.cs +++ b/src/ImageSharp/Image.WrapMemory.cs @@ -17,7 +17,7 @@ public abstract partial class Image { /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -52,7 +52,7 @@ public static Image WrapMemory( { Guard.NotNull(configuration, nameof(configuration)); Guard.NotNull(metadata, nameof(metadata)); - Guard.IsTrue(pixelMemory.Length == width * height, nameof(pixelMemory), "The length of the input memory doesn't match the specified image size"); + Guard.IsTrue(pixelMemory.Length >= width * height, nameof(pixelMemory), "The length of the input memory is less than the specified image size"); var memorySource = MemoryGroup.Wrap(pixelMemory); return new Image(configuration, memorySource, width, height, metadata); @@ -60,7 +60,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -93,7 +93,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -122,7 +122,7 @@ public static Image WrapMemory( => WrapMemory(Configuration.Default, pixelMemory, width, height); /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels, + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels, /// allowing to view/manipulate it as an instance. /// The ownership of the is being transferred to the new instance, /// meaning that the caller is not allowed to dispose . @@ -147,14 +147,14 @@ public static Image WrapMemory( { Guard.NotNull(configuration, nameof(configuration)); Guard.NotNull(metadata, nameof(metadata)); - Guard.IsTrue(pixelMemoryOwner.Memory.Length == width * height, nameof(pixelMemoryOwner), "The length of the input memory doesn't match the specified image size"); + Guard.IsTrue(pixelMemoryOwner.Memory.Length >= width * height, nameof(pixelMemoryOwner), "The length of the input memory is less than the specified image size"); var memorySource = MemoryGroup.Wrap(pixelMemoryOwner); return new Image(configuration, memorySource, width, height, metadata); } /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels, + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels, /// allowing to view/manipulate it as an instance. /// The ownership of the is being transferred to the new instance, /// meaning that the caller is not allowed to dispose . @@ -176,7 +176,7 @@ public static Image WrapMemory( => WrapMemory(configuration, pixelMemoryOwner, width, height, new ImageMetadata()); /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels, + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels, /// allowing to view/manipulate it as an instance. /// The ownership of the is being transferred to the new instance, /// meaning that the caller is not allowed to dispose . @@ -196,7 +196,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -234,7 +234,7 @@ public static Image WrapMemory( var memoryManager = new ByteMemoryManager(byteMemory); - Guard.IsTrue(memoryManager.Memory.Length == width * height, nameof(byteMemory), "The length of the input memory doesn't match the specified image size"); + Guard.IsTrue(memoryManager.Memory.Length >= width * height, nameof(byteMemory), "The length of the input memory is less than the specified image size"); var memorySource = MemoryGroup.Wrap(memoryManager.Memory); return new Image(configuration, memorySource, width, height, metadata); @@ -242,7 +242,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -275,7 +275,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -305,7 +305,7 @@ public static Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -355,7 +355,7 @@ public static unsafe Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// @@ -393,7 +393,7 @@ public static unsafe Image WrapMemory( /// /// - /// Wraps an existing contiguous memory area of 'width' x 'height' pixels allowing viewing/manipulation as + /// Wraps an existing contiguous memory area of at least 'width' x 'height' pixels allowing viewing/manipulation as /// an instance. /// /// diff --git a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs index 02a8381808..16d0baff39 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs @@ -355,8 +355,6 @@ public unsafe void WrapSystemDrawingBitmap_FromPointer() [Theory] [InlineData(0, 5, 5)] [InlineData(20, 5, 5)] - [InlineData(26, 5, 5)] - [InlineData(2, 1, 1)] [InlineData(1023, 32, 32)] public void WrapMemory_MemoryOfT_InvalidSize(int size, int height, int width) { @@ -366,6 +364,20 @@ public void WrapMemory_MemoryOfT_InvalidSize(int size, int height, int width) Assert.Throws(() => Image.WrapMemory(memory, height, width)); } + [Theory] + [InlineData(25, 5, 5)] + [InlineData(26, 5, 5)] + [InlineData(2, 1, 1)] + [InlineData(1024, 32, 32)] + [InlineData(2048, 32, 32)] + public void WrapMemory_MemoryOfT_ValidSize(int size, int height, int width) + { + var array = new Rgba32[size]; + var memory = new Memory(array); + + Image.WrapMemory(memory, height, width); + } + private class TestMemoryOwner : IMemoryOwner { public Memory Memory { get; set; } @@ -378,8 +390,6 @@ public void Dispose() [Theory] [InlineData(0, 5, 5)] [InlineData(20, 5, 5)] - [InlineData(26, 5, 5)] - [InlineData(2, 1, 1)] [InlineData(1023, 32, 32)] public void WrapMemory_IMemoryOwnerOfT_InvalidSize(int size, int height, int width) { @@ -390,10 +400,22 @@ public void WrapMemory_IMemoryOwnerOfT_InvalidSize(int size, int height, int wid } [Theory] - [InlineData(0, 5, 5)] - [InlineData(20, 5, 5)] + [InlineData(25, 5, 5)] [InlineData(26, 5, 5)] [InlineData(2, 1, 1)] + [InlineData(1024, 32, 32)] + [InlineData(2048, 32, 32)] + public void WrapMemory_IMemoryOwnerOfT_ValidSize(int size, int height, int width) + { + var array = new Rgba32[size]; + var memory = new TestMemoryOwner { Memory = array }; + + Image.WrapMemory(memory, height, width); + } + + [Theory] + [InlineData(0, 5, 5)] + [InlineData(20, 5, 5)] [InlineData(1023, 32, 32)] public void WrapMemory_MemoryOfByte_InvalidSize(int size, int height, int width) { @@ -403,6 +425,20 @@ public void WrapMemory_MemoryOfByte_InvalidSize(int size, int height, int width) Assert.Throws(() => Image.WrapMemory(memory, height, width)); } + [Theory] + [InlineData(25, 5, 5)] + [InlineData(26, 5, 5)] + [InlineData(2, 1, 1)] + [InlineData(1024, 32, 32)] + [InlineData(2048, 32, 32)] + public void WrapMemory_MemoryOfByte_ValidSize(int size, int height, int width) + { + var array = new byte[size * Unsafe.SizeOf()]; + var memory = new Memory(array); + + Image.WrapMemory(memory, height, width); + } + [Theory] [InlineData(0, 5, 5)] [InlineData(20, 5, 5)]