diff --git a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
index 1f77b93f72..3faa072dd3 100644
--- a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
+++ b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
@@ -35,6 +35,18 @@ namespace SixLabors.ImageSharp.Advanced
return source.PixelBuffer.Buffer.Memory;
}
+ ///
+ /// Gets the storing the whole pixel buffer in row major order.
+ ///
+ /// The Pixel format.
+ /// The source
+ /// The
+ public static Memory GetPixelMemory(this Image source)
+ where TPixel : struct, IPixel
+ {
+ return source.Frames.RootFrame.GetPixelMemory();
+ }
+
///
/// Returns a reference to the 0th element of the Pixel buffer,
/// allowing direct manipulation of pixel data through unsafe operations.
diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
index 1f52e4bfd8..afa5fdbb46 100644
--- a/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
+++ b/src/ImageSharp/Memory/ArrayPoolMemoryManager.Buffer{T}.cs
@@ -13,7 +13,8 @@ namespace SixLabors.ImageSharp.Memory
public partial class ArrayPoolMemoryManager
{
///
- /// The buffer implementation of
+ /// The buffer implementation of .
+ /// In this implementation is owned.
///
private class Buffer : ManagedBufferBase, IBuffer
where T : struct
diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs
index 2fc62b11ef..450399900b 100644
--- a/src/ImageSharp/Memory/BasicArrayBuffer.cs
+++ b/src/ImageSharp/Memory/BasicArrayBuffer.cs
@@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp.Memory
{
///
- /// Exposes an array through the interface.
+ /// Wraps an array as an instance. In this implementation is owned.
///
internal class BasicArrayBuffer : ManagedBufferBase, IBuffer
where T : struct
diff --git a/src/ImageSharp/Memory/IBuffer{T}.cs b/src/ImageSharp/Memory/IBuffer{T}.cs
index 838c785bfe..fdb70ad9c5 100644
--- a/src/ImageSharp/Memory/IBuffer{T}.cs
+++ b/src/ImageSharp/Memory/IBuffer{T}.cs
@@ -5,22 +5,24 @@ using System;
namespace SixLabors.ImageSharp.Memory
{
- ///
///
- /// Represents a contigous memory buffer of value-type items "promising" a
- /// A proper im
+ /// Represents a contigous memory buffer of value-type items.
+ /// Depending on it's implementation, an can (1) OWN or (2) CONSUME the instance it wraps.
+ /// For a deeper understanding of the owner/consumer model, read the following docs:
+ /// https://gist.github.com/GrabYourPitchforks/4c3e1935fd4d9fa2831dbfcab35dffc6
///
/// The value type
internal interface IBuffer : IDisposable
where T : struct
{
///
- /// Gets the ownerd by this buffer.
+ /// Gets the ownerd/consumed by this buffer.
///
Memory Memory { get; }
///
- /// Gets the span to the memory "promised" by this buffer.
+ /// Gets the span to the memory "promised" by this buffer when it's OWNED (1).
+ /// Gets `this.Memory.Span` when the buffer CONSUMED (2).
///
/// The
Span GetSpan();
diff --git a/tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs b/tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs
index 302b90e309..c148667424 100644
--- a/tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs
+++ b/tests/ImageSharp.Tests/Advanced/AdvancedImageExtensionsTests.cs
@@ -1,6 +1,7 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
@@ -8,8 +9,33 @@ using Xunit;
namespace SixLabors.ImageSharp.Tests.Advanced
{
+
+
public class AdvancedImageExtensionsTests
{
+ public class GetPixelMemory
+ {
+ [Theory]
+ [WithSolidFilledImages(1, 1, "Red", PixelTypes.Rgba32)]
+ [WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
+ public void WhenMemoryIsOwned(TestImageProvider provider)
+ where TPixel : struct, IPixel
+ {
+ using (Image image = provider.GetImage())
+ {
+ Memory memory = image.GetPixelMemory();
+ Assert.Equal(image.Width * image.Height, memory.Length);
+
+ var targetBuffer = new TPixel[image.Width * image.Height];
+ memory.Span.CopyTo(targetBuffer);
+
+ image.ComparePixelBufferTo(targetBuffer);
+ }
+ }
+ }
+
+
+
[Theory]
[WithTestPatternImages(131, 127, PixelTypes.Rgba32 | PixelTypes.Bgr24)]
public unsafe void DangerousGetPinnableReference_CopyToBuffer(TestImageProvider provider)