From b240679c71db329f8977545a4835f8a452771b02 Mon Sep 17 00:00:00 2001 From: Maxim Shipko Date: Tue, 10 Jun 2025 17:51:12 +0400 Subject: [PATCH] Pin the refs for faster access --- .../Formats/Webp/Lossless/Vp8LBackwardRefs.cs | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ImageSharp/Formats/Webp/Lossless/Vp8LBackwardRefs.cs b/src/ImageSharp/Formats/Webp/Lossless/Vp8LBackwardRefs.cs index 634fac5e8..3b7dc99ff 100644 --- a/src/ImageSharp/Formats/Webp/Lossless/Vp8LBackwardRefs.cs +++ b/src/ImageSharp/Formats/Webp/Lossless/Vp8LBackwardRefs.cs @@ -8,21 +8,33 @@ namespace SixLabors.ImageSharp.Formats.Webp.Lossless; internal class Vp8LBackwardRefs : IDisposable { - private readonly IMemoryOwner refs; + private readonly IMemoryOwner owner; + private readonly MemoryHandle handle; private int count; public Vp8LBackwardRefs(MemoryAllocator memoryAllocator, int pixels) { - this.refs = memoryAllocator.Allocate(pixels); + this.owner = memoryAllocator.Allocate(pixels); + this.handle = this.owner.Memory.Pin(); this.count = 0; } - public void Add(PixOrCopy pixOrCopy) => this.refs.Memory.Span[this.count++] = pixOrCopy; + public void Add(PixOrCopy pixOrCopy) + { + unsafe + { + ((PixOrCopy*)this.handle.Pointer)[this.count++] = pixOrCopy; + } + } public void Clear() => this.count = 0; - public Span.Enumerator GetEnumerator() => this.refs.Slice(0, this.count).GetEnumerator(); + public Span.Enumerator GetEnumerator() => this.owner.Slice(0, this.count).GetEnumerator(); /// - public void Dispose() => this.refs.Dispose(); + public void Dispose() + { + this.handle.Dispose(); + this.owner.Dispose(); + } }