diff --git a/ImageSharp.sln.DotSettings b/ImageSharp.sln.DotSettings
index 435aad73b..432f4524a 100644
--- a/ImageSharp.sln.DotSettings
+++ b/ImageSharp.sln.DotSettings
@@ -343,8 +343,11 @@
<Entry DisplayName="All other members" />
</TypePattern>
</Patterns>
- True
+ False
True
+ // Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
AC
DC
DCT
diff --git a/build.ps1 b/build.ps1
index 4c5a36cae..35b8344dc 100644
--- a/build.ps1
+++ b/build.ps1
@@ -8,7 +8,7 @@ $tagRegex = '^v?(\d+\.\d+\.\d+)(-([a-zA-Z]+)\.?(\d*))?$'
# we are running on the build server
$isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex
- if($isVersionTag){
+ if($isVersionTag) {
Write-Debug "Building commit tagged with a compatable version number"
@@ -26,7 +26,8 @@ $isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex
$version = "${version}${padded}"
}
- }else {
+ }
+ else {
Write-Debug "Untagged"
$lastTag = (git tag --list --sort=-taggerdate) | Out-String
diff --git a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs b/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
index 9f5611dc0..fddd283e0 100644
--- a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
+++ b/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using SixLabors.Memory;
using SixLabors.Primitives;
using SixLabors.Shapes;
@@ -45,7 +46,7 @@ namespace SixLabors.ImageSharp.Primitives
var start = new PointF(this.Bounds.Left - 1, y);
var end = new PointF(this.Bounds.Right + 1, y);
- using (IBuffer tempBuffer = configuration.MemoryAllocator.Allocate(buffer.Length))
+ using (IMemoryOwner tempBuffer = configuration.MemoryAllocator.Allocate(buffer.Length))
{
Span innerBuffer = tempBuffer.GetSpan();
int count = this.Shape.FindIntersections(start, end, innerBuffer);
diff --git a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs b/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
index 0ac4e4dd1..64f37eeab 100644
--- a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
+++ b/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
@@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
+
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Memory;
@@ -65,8 +67,8 @@ namespace SixLabors.ImageSharp.Processing
{
MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
- using (IBuffer amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IBuffer overlay = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
{
Span amountSpan = amountBuffer.GetSpan();
Span overlaySpan = overlay.GetSpan();
diff --git a/src/ImageSharp.Drawing/Processing/ImageBrush{TPixel}.cs b/src/ImageSharp.Drawing/Processing/ImageBrush{TPixel}.cs
index 7e24dbbe2..5ebad0f32 100644
--- a/src/ImageSharp.Drawing/Processing/ImageBrush{TPixel}.cs
+++ b/src/ImageSharp.Drawing/Processing/ImageBrush{TPixel}.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Memory;
@@ -118,8 +119,8 @@ namespace SixLabors.ImageSharp.Processing
internal override void Apply(Span scanline, int x, int y)
{
// Create a span for colors
- using (IBuffer amountBuffer = this.Target.MemoryAllocator.Allocate(scanline.Length))
- using (IBuffer overlay = this.Target.MemoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner amountBuffer = this.Target.MemoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner overlay = this.Target.MemoryAllocator.Allocate(scanline.Length))
{
Span amountSpan = amountBuffer.GetSpan();
Span overlaySpan = overlay.GetSpan();
diff --git a/src/ImageSharp.Drawing/Processing/PatternBrush{TPixel}.cs b/src/ImageSharp.Drawing/Processing/PatternBrush{TPixel}.cs
index 30d78bc83..ab48a185b 100644
--- a/src/ImageSharp.Drawing/Processing/PatternBrush{TPixel}.cs
+++ b/src/ImageSharp.Drawing/Processing/PatternBrush{TPixel}.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Numerics;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
@@ -153,8 +154,8 @@ namespace SixLabors.ImageSharp.Processing
int patternY = y % this.pattern.Rows;
MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
- using (IBuffer amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IBuffer overlay = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
{
Span amountSpan = amountBuffer.GetSpan();
Span overlaySpan = overlay.GetSpan();
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
index e4b2eadb4..4a59dfe3e 100644
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
+++ b/src/ImageSharp.Drawing/Processing/Processors/Drawing/DrawImageProcessor.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Threading.Tasks;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
@@ -134,7 +135,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing
MemoryAllocator memoryAllocator = this.Image.GetConfiguration().MemoryAllocator;
- using (IBuffer amount = memoryAllocator.Allocate(width))
+ using (IMemoryOwner amount = memoryAllocator.Allocate(width))
{
amount.GetSpan().Fill(this.Opacity);
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
index 595c94687..e40ba5316 100644
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
+++ b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
@@ -2,10 +2,10 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Threading.Tasks;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Processing;
using SixLabors.Memory;
using SixLabors.Primitives;
@@ -76,7 +76,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing
startY = 0;
}
- using (IBuffer amount = source.MemoryAllocator.Allocate(width))
+ using (IMemoryOwner amount = source.MemoryAllocator.Allocate(width))
using (BrushApplicator applicator = this.brush.CreateApplicator(
source,
sourceRectangle,
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
index 1cc954dd9..b9db3f067 100644
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
+++ b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
@@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
+
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Primitives;
using SixLabors.ImageSharp.Utils;
@@ -94,8 +96,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Drawing
using (BrushApplicator applicator = this.Brush.CreateApplicator(source, rect, this.Options))
{
int scanlineWidth = maxX - minX;
- using (IBuffer bBuffer = source.MemoryAllocator.Allocate(maxIntersections))
- using (IBuffer bScanline = source.MemoryAllocator.Allocate(scanlineWidth))
+ using (IMemoryOwner bBuffer = source.MemoryAllocator.Allocate(maxIntersections))
+ using (IMemoryOwner bScanline = source.MemoryAllocator.Allocate(scanlineWidth))
{
bool scanlineDirty = true;
float subpixelFraction = 1f / subpixelCount;
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
index 8909ca453..048c4440d 100644
--- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
+++ b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Collections.Generic;
using SixLabors.Fonts;
using SixLabors.ImageSharp.Advanced;
@@ -336,8 +337,8 @@ namespace SixLabors.ImageSharp.Processing.Processors.Text
// take the path inside the path builder, scan thing and generate a Buffer2d representing the glyph and cache it.
Buffer2D fullBuffer = this.MemoryAllocator.Allocate2D(size.Width + 1, size.Height + 1, AllocationOptions.Clean);
- using (IBuffer bufferBacking = this.MemoryAllocator.Allocate(path.MaxIntersections))
- using (IBuffer rowIntersectionBuffer = this.MemoryAllocator.Allocate(size.Width))
+ using (IMemoryOwner bufferBacking = this.MemoryAllocator.Allocate(path.MaxIntersections))
+ using (IMemoryOwner rowIntersectionBuffer = this.MemoryAllocator.Allocate(size.Width))
{
float subpixelFraction = 1f / subpixelCount;
float subpixelFractionPoint = subpixelFraction / subpixelCount;
diff --git a/src/ImageSharp.Drawing/Processing/RecolorBrush{TPixel}.cs b/src/ImageSharp.Drawing/Processing/RecolorBrush{TPixel}.cs
index 058b03d62..e1b11637d 100644
--- a/src/ImageSharp.Drawing/Processing/RecolorBrush{TPixel}.cs
+++ b/src/ImageSharp.Drawing/Processing/RecolorBrush{TPixel}.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Numerics;
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
@@ -138,8 +139,8 @@ namespace SixLabors.ImageSharp.Processing
{
MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
- using (IBuffer amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IBuffer overlay = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
{
Span amountSpan = amountBuffer.GetSpan();
Span overlaySpan = overlay.GetSpan();
diff --git a/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs b/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs
index 8a2d47c6c..3904f3d9b 100644
--- a/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs
+++ b/src/ImageSharp.Drawing/Processing/SolidBrush{TPixel}.cs
@@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
+
using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Memory;
@@ -65,7 +67,7 @@ namespace SixLabors.ImageSharp.Processing
///
/// Gets the colors.
///
- protected IBuffer Colors { get; }
+ protected IMemoryOwner Colors { get; }
///
/// Gets the color for a single pixel.
@@ -96,7 +98,7 @@ namespace SixLabors.ImageSharp.Processing
}
else
{
- using (IBuffer amountBuffer = memoryAllocator.Allocate(scanline.Length))
+ using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
{
Span amountSpan = amountBuffer.GetSpan();
diff --git a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
index 18b1d994b..1c73b5ed1 100644
--- a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
+++ b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
@@ -105,7 +105,7 @@ namespace SixLabors.ImageSharp.Advanced
internal static Memory GetPixelMemory(this ImageFrame source)
where TPixel : struct, IPixel
{
- return source.PixelBuffer.Buffer.Memory;
+ return source.PixelBuffer.MemorySource.Memory;
}
///
diff --git a/src/ImageSharp/Common/Helpers/ParallelFor.cs b/src/ImageSharp/Common/Helpers/ParallelFor.cs
index 7061475a7..02c6deda3 100644
--- a/src/ImageSharp/Common/Helpers/ParallelFor.cs
+++ b/src/ImageSharp/Common/Helpers/ParallelFor.cs
@@ -1,4 +1,5 @@
using System;
+using System.Buffers;
using System.Threading.Tasks;
using SixLabors.Memory;
@@ -32,23 +33,23 @@ namespace SixLabors.ImageSharp
int toExclusive,
Configuration configuration,
int bufferLength,
- Action> body)
+ Action> body)
where T : struct
{
MemoryAllocator memoryAllocator = configuration.MemoryAllocator;
ParallelOptions parallelOptions = configuration.ParallelOptions;
- IBuffer InitBuffer()
+ IMemoryOwner InitBuffer()
{
return memoryAllocator.Allocate(bufferLength);
}
- void CleanUpBuffer(IBuffer buffer)
+ void CleanUpBuffer(IMemoryOwner buffer)
{
buffer.Dispose();
}
- IBuffer BodyFunc(int i, ParallelLoopState state, IBuffer buffer)
+ IMemoryOwner BodyFunc(int i, ParallelLoopState state, IMemoryOwner buffer)
{
body(i, buffer);
return buffer;
diff --git a/src/ImageSharp/Formats/Gif/LzwDecoder.cs b/src/ImageSharp/Formats/Gif/LzwDecoder.cs
index 2884abfe8..7a2aef180 100644
--- a/src/ImageSharp/Formats/Gif/LzwDecoder.cs
+++ b/src/ImageSharp/Formats/Gif/LzwDecoder.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -32,17 +33,17 @@ namespace SixLabors.ImageSharp.Formats.Gif
///
/// The prefix buffer.
///
- private readonly IBuffer prefix;
+ private readonly IMemoryOwner prefix;
///
/// The suffix buffer.
///
- private readonly IBuffer suffix;
+ private readonly IMemoryOwner suffix;
///
/// The pixel stack buffer.
///
- private readonly IBuffer pixelStack;
+ private readonly IMemoryOwner pixelStack;
///
/// Initializes a new instance of the class
diff --git a/src/ImageSharp/Formats/Gif/LzwEncoder.cs b/src/ImageSharp/Formats/Gif/LzwEncoder.cs
index 5a588a671..002457db3 100644
--- a/src/ImageSharp/Formats/Gif/LzwEncoder.cs
+++ b/src/ImageSharp/Formats/Gif/LzwEncoder.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -66,12 +67,12 @@ namespace SixLabors.ImageSharp.Formats.Gif
///
/// The hash table.
///
- private readonly IBuffer hashTable;
+ private readonly IMemoryOwner hashTable;
///
/// The code table.
///
- private readonly IBuffer codeTable;
+ private readonly IMemoryOwner codeTable;
///
/// Define the storage for the packet accumulator.
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanTable.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanTable.cs
index c0f3b17cd..f159bda07 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanTable.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanTable.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using SixLabors.Memory;
@@ -48,7 +49,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
public HuffmanTable(MemoryAllocator memoryAllocator, ReadOnlySpan count, ReadOnlySpan values)
{
const int Length = 257;
- using (IBuffer huffcode = memoryAllocator.Allocate(Length))
+ using (IMemoryOwner huffcode = memoryAllocator.Allocate(Length))
{
ref short huffcodeRef = ref MemoryMarshal.GetReference(huffcode.GetSpan());
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs
index 2baefff9b..87f675491 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs
@@ -9,7 +9,7 @@ using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{
///
- /// Encapsulates the implementation of processing "raw" -s into Jpeg image channels.
+ /// Encapsulates the implementation of processing "raw" jpeg buffers into Jpeg image channels.
///
[StructLayout(LayoutKind.Sequential)]
internal struct JpegBlockPostProcessor
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs
index 99408cf57..1b513c612 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Linq;
using System.Numerics;
using SixLabors.ImageSharp.Advanced;
@@ -37,7 +38,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
///
/// Temporal buffer to store a row of colors.
///
- private readonly IBuffer rgbaBuffer;
+ private readonly IMemoryOwner rgbaBuffer;
///
/// The corresponding to the current determined by .
diff --git a/src/ImageSharp/Image.WrapMemory.cs b/src/ImageSharp/Image.WrapMemory.cs
index 3988120e6..77432c3ad 100644
--- a/src/ImageSharp/Image.WrapMemory.cs
+++ b/src/ImageSharp/Image.WrapMemory.cs
@@ -2,6 +2,8 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
+
using SixLabors.ImageSharp.MetaData;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.Memory;
@@ -13,8 +15,6 @@ namespace SixLabors.ImageSharp
///
public static partial class Image
{
- // TODO: This is a WIP API, should be public when finished.
-
///
/// Wraps an existing contigous memory area of 'width'x'height' pixels,
/// allowing to view/manipulate it as an ImageSharp instance.
@@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp
/// The height of the memory image
/// The
/// An instance
- internal static Image WrapMemory(
+ public static Image WrapMemory(
Configuration config,
Memory pixelMemory,
int width,
@@ -34,26 +34,117 @@ namespace SixLabors.ImageSharp
ImageMetaData metaData)
where TPixel : struct, IPixel
{
- var buffer = new ConsumedBuffer(pixelMemory);
- return new Image(config, buffer, width, height, metaData);
+ var memorySource = new MemorySource(pixelMemory);
+ return new Image(config, memorySource, width, height, metaData);
+ }
+
+ ///
+ /// Wraps an existing contigous memory area of 'width'x'height' pixels,
+ /// allowing to view/manipulate it as an ImageSharp instance.
+ ///
+ /// The pixel type
+ /// The
+ /// The pixel memory
+ /// The width of the memory image
+ /// The height of the memory image
+ /// An instance
+ public static Image WrapMemory(
+ Configuration config,
+ Memory pixelMemory,
+ int width,
+ int height)
+ where TPixel : struct, IPixel
+ {
+ return WrapMemory(config, pixelMemory, width, height, new ImageMetaData());
}
///
/// Wraps an existing contigous memory area of 'width'x'height' pixels,
/// allowing to view/manipulate it as an ImageSharp instance.
+ /// The memory is being observed, the caller remains responsible for managing it's lifecycle.
///
/// The pixel type
/// The pixel memory
/// The width of the memory image
/// The height of the memory image
/// An instance
- internal static Image WrapMemory(
+ public static Image WrapMemory(
Memory pixelMemory,
int width,
int height)
where TPixel : struct, IPixel
{
- return WrapMemory(Configuration.Default, pixelMemory, width, height, new ImageMetaData());
+ return WrapMemory(Configuration.Default, pixelMemory, width, height);
+ }
+
+ ///
+ /// Wraps an existing contigous memory area of 'width'x'height' pixels,
+ /// allowing to view/manipulate it as an ImageSharp instance.
+ /// The ownership of the is being transfered to the new instance,
+ /// meaning that the caller is not allowed to dispose .
+ /// It will be disposed together with the result image.
+ ///
+ /// The pixel type
+ /// The
+ /// The that is being transfered to the image
+ /// The width of the memory image
+ /// The height of the memory image
+ /// The
+ /// An instance
+ public static Image WrapMemory(
+ Configuration config,
+ IMemoryOwner pixelMemoryOwner,
+ int width,
+ int height,
+ ImageMetaData metaData)
+ where TPixel : struct, IPixel
+ {
+ var memorySource = new MemorySource(pixelMemoryOwner, false);
+ return new Image(config, memorySource, width, height, metaData);
+ }
+
+ ///
+ /// Wraps an existing contigous memory area of 'width'x'height' pixels,
+ /// allowing to view/manipulate it as an ImageSharp instance.
+ /// The ownership of the is being transfered to the new instance,
+ /// meaning that the caller is not allowed to dispose .
+ /// It will be disposed together with the result image.
+ ///
+ /// The pixel type
+ /// The
+ /// The that is being transfered to the image
+ /// The width of the memory image
+ /// The height of the memory image
+ /// An instance
+ public static Image WrapMemory(
+ Configuration config,
+ IMemoryOwner pixelMemoryOwner,
+ int width,
+ int height)
+ where TPixel : struct, IPixel
+ {
+ return WrapMemory(config, pixelMemoryOwner, width, height, new ImageMetaData());
+ }
+
+ ///
+ /// Wraps an existing contigous memory area of 'width'x'height' pixels,
+ /// allowing to view/manipulate it as an ImageSharp instance.
+ /// The ownership of the is being transfered to the new instance,
+ /// meaning that the caller is not allowed to dispose .
+ /// It will be disposed together with the result image.
+ ///
+ /// The pixel type
+ /// The that is being transfered to the image
+ /// The width of the memory image
+ /// The height of the memory image
+ /// An instance
+ public static Image WrapMemory(
+ IMemoryOwner pixelMemoryOwner,
+ int width,
+ int height)
+ where TPixel : struct, IPixel
+ {
+ return WrapMemory(Configuration.Default, pixelMemoryOwner, width, height);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/ImageFrameCollection.cs b/src/ImageSharp/ImageFrameCollection.cs
index 14a16b691..154ef5014 100644
--- a/src/ImageSharp/ImageFrameCollection.cs
+++ b/src/ImageSharp/ImageFrameCollection.cs
@@ -30,14 +30,14 @@ namespace SixLabors.ImageSharp
this.frames.Add(new ImageFrame(parent.GetConfiguration(), width, height, backgroundColor));
}
- internal ImageFrameCollection(Image parent, int width, int height, IBuffer consumedBuffer)
+ internal ImageFrameCollection(Image parent, int width, int height, MemorySource memorySource)
{
Guard.NotNull(parent, nameof(parent));
this.parent = parent;
// Frames are already cloned within the caller
- this.frames.Add(new ImageFrame(parent.GetConfiguration(), width, height, consumedBuffer));
+ this.frames.Add(new ImageFrame(parent.GetConfiguration(), width, height, memorySource));
}
internal ImageFrameCollection(Image parent, IEnumerable> frames)
diff --git a/src/ImageSharp/ImageFrame{TPixel}.cs b/src/ImageSharp/ImageFrame{TPixel}.cs
index aa650d380..6c04d5aea 100644
--- a/src/ImageSharp/ImageFrame{TPixel}.cs
+++ b/src/ImageSharp/ImageFrame{TPixel}.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
@@ -94,8 +95,8 @@ namespace SixLabors.ImageSharp
///
/// Initializes a new instance of the class wrapping an existing buffer.
///
- internal ImageFrame(Configuration configuration, int width, int height, IBuffer consumedBuffer)
- : this(configuration, width, height, consumedBuffer, new ImageFrameMetaData())
+ internal ImageFrame(Configuration configuration, int width, int height, MemorySource memorySource)
+ : this(configuration, width, height, memorySource, new ImageFrameMetaData())
{
}
@@ -106,7 +107,7 @@ namespace SixLabors.ImageSharp
Configuration configuration,
int width,
int height,
- IBuffer consumedBuffer,
+ MemorySource memorySource,
ImageFrameMetaData metaData)
{
Guard.NotNull(configuration, nameof(configuration));
@@ -116,7 +117,7 @@ namespace SixLabors.ImageSharp
this.configuration = configuration;
this.MemoryAllocator = configuration.MemoryAllocator;
- this.PixelBuffer = new Buffer2D(consumedBuffer, width, height);
+ this.PixelBuffer = new Buffer2D(memorySource, width, height);
this.MetaData = metaData;
}
@@ -272,7 +273,7 @@ namespace SixLabors.ImageSharp
this.Height,
this.configuration,
this.Width,
- (int y, IBuffer tempRowBuffer) =>
+ (int y, IMemoryOwner tempRowBuffer) =>
{
Span sourceRow = this.GetPixelRowSpan(y);
Span targetRow = target.GetPixelRowSpan(y);
diff --git a/src/ImageSharp/Image{TPixel}.cs b/src/ImageSharp/Image{TPixel}.cs
index ad754bc75..5a5928d6b 100644
--- a/src/ImageSharp/Image{TPixel}.cs
+++ b/src/ImageSharp/Image{TPixel}.cs
@@ -84,23 +84,14 @@ namespace SixLabors.ImageSharp
///
/// Initializes a new instance of the class
- /// consuming an external buffer instance.
+ /// wrapping an external
///
- internal Image(Configuration configuration, IBuffer consumedBuffer, int width, int height)
- : this(configuration, consumedBuffer, width, height, new ImageMetaData())
- {
- }
-
- ///
- /// Initializes a new instance of the class
- /// consuming an external buffer instance.
- ///
- internal Image(Configuration configuration, IBuffer consumedBuffer, int width, int height, ImageMetaData metadata)
+ internal Image(Configuration configuration, MemorySource memorySource, int width, int height, ImageMetaData metadata)
{
this.configuration = configuration;
this.PixelType = new PixelTypeInfo(Unsafe.SizeOf() * 8);
this.MetaData = metadata;
- this.frames = new ImageFrameCollection(this, width, height, consumedBuffer);
+ this.frames = new ImageFrameCollection(this, width, height, memorySource);
}
///
diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs
index d0f68c9c6..adc8843a3 100644
--- a/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs
+++ b/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs
@@ -14,7 +14,6 @@ namespace SixLabors.Memory
{
///
/// The buffer implementation of .
- /// In this implementation is owned.
///
private class Buffer : ManagedBufferBase
where T : struct
diff --git a/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs b/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs
index 08f28c5b3..32c1c6d1d 100644
--- a/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs
+++ b/src/ImageSharp/Memory/ArrayPoolMemoryAllocator.cs
@@ -89,7 +89,7 @@ namespace SixLabors.Memory
}
///
- internal override IBuffer Allocate(int length, AllocationOptions options)
+ internal override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None)
{
int itemSizeBytes = Unsafe.SizeOf();
int bufferSizeInBytes = length * itemSizeBytes;
diff --git a/src/ImageSharp/Memory/BasicArrayBuffer.cs b/src/ImageSharp/Memory/BasicArrayBuffer.cs
index 5e3893d08..f40df7604 100644
--- a/src/ImageSharp/Memory/BasicArrayBuffer.cs
+++ b/src/ImageSharp/Memory/BasicArrayBuffer.cs
@@ -7,7 +7,7 @@ using System.Runtime.CompilerServices;
namespace SixLabors.Memory
{
///
- /// Wraps an array as an instance. In this implementation is owned.
+ /// Wraps an array as an instance.
///
internal class BasicArrayBuffer : ManagedBufferBase
where T : struct
diff --git a/src/ImageSharp/Memory/Buffer2DExtensions.cs b/src/ImageSharp/Memory/Buffer2DExtensions.cs
index c27752570..be4f0ef15 100644
--- a/src/ImageSharp/Memory/Buffer2DExtensions.cs
+++ b/src/ImageSharp/Memory/Buffer2DExtensions.cs
@@ -18,7 +18,7 @@ namespace SixLabors.Memory
internal static Span GetSpan(this Buffer2D buffer)
where T : struct
{
- return buffer.Buffer.GetSpan();
+ return buffer.MemorySource.GetSpan();
}
///
@@ -61,7 +61,7 @@ namespace SixLabors.Memory
public static Memory GetRowMemory(this Buffer2D buffer, int y)
where T : struct
{
- return buffer.Buffer.Memory.Slice(y * buffer.Width, buffer.Width);
+ return buffer.MemorySource.Memory.Slice(y * buffer.Width, buffer.Width);
}
///
diff --git a/src/ImageSharp/Memory/Buffer2D{T}.cs b/src/ImageSharp/Memory/Buffer2D{T}.cs
index b76c06df8..844ca1ad1 100644
--- a/src/ImageSharp/Memory/Buffer2D{T}.cs
+++ b/src/ImageSharp/Memory/Buffer2D{T}.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.Runtime.CompilerServices;
using SixLabors.Primitives;
@@ -15,15 +16,17 @@ namespace SixLabors.Memory
internal sealed class Buffer2D : IDisposable
where T : struct
{
+ private MemorySource memorySource;
+
///
/// Initializes a new instance of the class.
///
- /// The buffer to wrap
+ /// The buffer to wrap
/// The number of elements in a row
/// The number of rows
- public Buffer2D(IBuffer wrappedBuffer, int width, int height)
+ public Buffer2D(MemorySource memorySource, int width, int height)
{
- this.Buffer = wrappedBuffer;
+ this.memorySource = memorySource;
this.Width = width;
this.Height = height;
}
@@ -39,13 +42,13 @@ namespace SixLabors.Memory
public int Height { get; private set; }
///
- /// Gets the backing
+ /// Gets the backing
///
- public IBuffer Buffer { get; private set; }
+ public MemorySource MemorySource => this.memorySource;
- public Memory Memory => this.Buffer.Memory;
+ public Memory Memory => this.MemorySource.Memory;
- public Span Span => this.Buffer.GetSpan();
+ public Span Span => this.Memory.Span;
///
/// Gets a reference to the element at the specified position.
@@ -60,7 +63,7 @@ namespace SixLabors.Memory
{
ImageSharp.DebugGuard.MustBeLessThan(x, this.Width, nameof(x));
DebugGuard.MustBeLessThan(y, this.Height, nameof(y));
- Span span = this.Buffer.GetSpan();
+ Span span = this.Span;
return ref span[(this.Width * y) + x];
}
}
@@ -70,7 +73,7 @@ namespace SixLabors.Memory
///
public void Dispose()
{
- this.Buffer?.Dispose();
+ this.MemorySource.Dispose();
}
///
@@ -79,36 +82,15 @@ namespace SixLabors.Memory
///
public static void SwapOrCopyContent(Buffer2D destination, Buffer2D source)
{
- if (source.Buffer.IsMemoryOwner && destination.Buffer.IsMemoryOwner)
- {
- SwapContents(destination, source);
- }
- else
- {
- if (destination.Size() != source.Size())
- {
- throw new InvalidOperationException("SwapOrCopyContents(): buffers should both owned or the same size!");
- }
-
- source.Span.CopyTo(destination.Span);
- }
+ MemorySource.SwapOrCopyContent(ref destination.memorySource, ref source.memorySource);
+ SwapDimensionData(destination, source);
}
- ///
- /// Swap the contents (, , ) of the two buffers.
- /// Useful to transfer the contents of a temporary to a persistent
- ///
- /// The first buffer
- /// The second buffer
- private static void SwapContents(Buffer2D a, Buffer2D b)
+ private static void SwapDimensionData(Buffer2D a, Buffer2D b)
{
Size aSize = a.Size();
Size bSize = b.Size();
- IBuffer temp = a.Buffer;
- a.Buffer = b.Buffer;
- b.Buffer = temp;
-
b.Width = aSize.Width;
b.Height = aSize.Height;
diff --git a/src/ImageSharp/Memory/BufferExtensions.cs b/src/ImageSharp/Memory/BufferExtensions.cs
index 8ebf866bc..800e0d975 100644
--- a/src/ImageSharp/Memory/BufferExtensions.cs
+++ b/src/ImageSharp/Memory/BufferExtensions.cs
@@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0.
using System;
+using System.Buffers;
using System.IO;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
@@ -11,8 +12,12 @@ namespace SixLabors.Memory
internal static class BufferExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static int Length(this IBuffer buffer)
- where T : struct => buffer.GetSpan().Length;
+ public static Span GetSpan(this IMemoryOwner buffer)
+ => buffer.Memory.Span;
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int Length(this IMemoryOwner buffer)
+ => buffer.GetSpan().Length;
///
/// Gets a to an offseted position inside the buffer.
@@ -21,8 +26,7 @@ namespace SixLabors.Memory
/// The start
/// The
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static Span Slice(this IBuffer buffer, int start)
- where T : struct
+ public static Span Slice(this IMemoryOwner buffer, int start)
{
return buffer.GetSpan().Slice(start);
}
@@ -35,8 +39,7 @@ namespace SixLabors.Memory
/// The length of the slice
/// The
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static Span Slice(this IBuffer buffer, int start, int length)
- where T : struct
+ public static Span Slice(this IMemoryOwner buffer, int start, int length)
{
return buffer.GetSpan().Slice(start, length);
}
@@ -46,13 +49,12 @@ namespace SixLabors.Memory
///
/// The buffer
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static void Clear(this IBuffer buffer)
- where T : struct
+ public static void Clear(this IMemoryOwner buffer)
{
buffer.GetSpan().Clear();
}
- public static ref T GetReference(this IBuffer buffer)
+ public static ref T GetReference(this IMemoryOwner buffer)
where T : struct =>
ref MemoryMarshal.GetReference(buffer.GetSpan());
diff --git a/src/ImageSharp/Memory/ConsumedBuffer.cs b/src/ImageSharp/Memory/ConsumedBuffer.cs
deleted file mode 100644
index 73468a381..000000000
--- a/src/ImageSharp/Memory/ConsumedBuffer.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.Memory
-{
- ///
- /// A buffer implementation that consumes an existing instance.
- /// The ownership of the memory remains external.
- ///
- /// The value type
- internal sealed class ConsumedBuffer : IBuffer
- where T : struct
- {
- public ConsumedBuffer(Memory memory)
- {
- this.Memory = memory;
- }
-
- public Memory Memory { get; }
-
- public bool IsMemoryOwner => false;
-
- public Span GetSpan()
- {
- return this.Memory.Span;
- }
-
- public void Dispose()
- {
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/Memory/IBuffer{T}.cs b/src/ImageSharp/Memory/IBuffer{T}.cs
deleted file mode 100644
index 847f2741d..000000000
--- a/src/ImageSharp/Memory/IBuffer{T}.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-namespace SixLabors.Memory
-{
- ///
- /// 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
- /// TODO: We need more SOC here! For owned buffers we should use .
- /// For the consumption case we should not use buffers at all. We need to refactor Buffer2D{T} for this.
- ///
- /// The value type
- internal interface IBuffer : IDisposable
- where T : struct
- {
- ///
- /// Gets the ownerd/consumed by this buffer.
- ///
- Memory Memory { get; }
-
- ///
- /// Gets a value indicating whether this instance is owning the .
- ///
- bool IsMemoryOwner { get; }
-
- ///
- /// 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();
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp/Memory/IManagedByteBuffer.cs b/src/ImageSharp/Memory/IManagedByteBuffer.cs
index a977eb68f..91c61424b 100644
--- a/src/ImageSharp/Memory/IManagedByteBuffer.cs
+++ b/src/ImageSharp/Memory/IManagedByteBuffer.cs
@@ -1,12 +1,14 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System.Buffers;
+
namespace SixLabors.Memory
{
///
/// Represents a byte buffer backed by a managed array. Useful for interop with classic .NET API-s.
///
- internal interface IManagedByteBuffer : IBuffer
+ internal interface IManagedByteBuffer : IMemoryOwner
{
///
/// Gets the managed array backing this buffer instance.
diff --git a/src/ImageSharp/Memory/ManagedBufferBase.cs b/src/ImageSharp/Memory/ManagedBufferBase.cs
index 8de2f5392..8aaf199ff 100644
--- a/src/ImageSharp/Memory/ManagedBufferBase.cs
+++ b/src/ImageSharp/Memory/ManagedBufferBase.cs
@@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
namespace SixLabors.Memory
{
///
- /// Provides a base class for implementations by implementing pinning logic for adaption.
+ /// Provides a base class for implementations by implementing pinning logic for adaption.
///
- internal abstract class ManagedBufferBase : MemoryManager, IBuffer
+ internal abstract class ManagedBufferBase : MemoryManager
where T : struct
{
private GCHandle pinHandle;
diff --git a/src/ImageSharp/Memory/MemoryAllocator.cs b/src/ImageSharp/Memory/MemoryAllocator.cs
index 4a65848fc..57b721e48 100644
--- a/src/ImageSharp/Memory/MemoryAllocator.cs
+++ b/src/ImageSharp/Memory/MemoryAllocator.cs
@@ -1,6 +1,8 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System.Buffers;
+
namespace SixLabors.Memory
{
///
@@ -9,13 +11,13 @@ namespace SixLabors.Memory
public abstract class MemoryAllocator
{
///
- /// Allocates an of size .
+ /// Allocates an , holding a of length .
///
/// Type of the data stored in the buffer
/// Size of the buffer to allocate
/// The allocation options.
/// A buffer of values of type .
- internal abstract IBuffer Allocate(int length, AllocationOptions options = AllocationOptions.None)
+ internal abstract IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None)
where T : struct;
///
diff --git a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs
index 2f296636d..d8c1f51f4 100644
--- a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs
+++ b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs
@@ -1,4 +1,6 @@
-using SixLabors.Primitives;
+using System.Buffers;
+
+using SixLabors.Primitives;
namespace SixLabors.Memory
{
@@ -7,15 +9,23 @@ namespace SixLabors.Memory
///
internal static class MemoryAllocatorExtensions
{
- public static Buffer2D Allocate2D(this MemoryAllocator memoryAllocator, int width, int height, AllocationOptions options = AllocationOptions.None)
+ public static Buffer2D Allocate2D