diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs
index c033980336..2492a985a8 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs
@@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.Memory;
-using SixLabors.Memory;
using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
@@ -43,16 +42,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
///
/// Gets the storing the "raw" frequency-domain decoded + unzigged blocks.
- /// We need to apply IDCT and dequantiazition to transform them into color-space blocks.
+ /// We need to apply IDCT and dequantization to transform them into color-space blocks.
///
Buffer2D SpectralBlocks { get; }
-
- ///
- /// Gets a reference to the at the given row and column index from
- ///
- /// The column
- /// The row
- /// The
- ref Block8x8 GetBlockReference(int column, int row);
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs
index 65a584c4f2..ef03582d69 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs
@@ -128,21 +128,11 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
this.SubSamplingDivisors = c0.SamplingFactors.DivideBy(this.SamplingFactors);
}
- this.SpectralBlocks = this.memoryAllocator.Allocate2D(blocksPerColumnForMcu, blocksPerLineForMcu + 1, AllocationOptions.Clean);
- }
+ int totalNumberOfBlocks = blocksPerColumnForMcu * (blocksPerLineForMcu + 1);
+ int width = this.WidthInBlocks + 1;
+ int height = totalNumberOfBlocks / width;
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ref Block8x8 GetBlockReference(int column, int row)
- {
- int offset = ((this.WidthInBlocks + 1) * row) + column;
- return ref Unsafe.Add(ref MemoryMarshal.GetReference(this.SpectralBlocks.GetSpan()), offset);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ref short GetBlockDataReference(int column, int row)
- {
- ref Block8x8 blockRef = ref this.GetBlockReference(column, row);
- return ref Unsafe.As(ref blockRef);
+ this.SpectralBlocks = this.memoryAllocator.Allocate2D(width, height, AllocationOptions.Clean);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentExtensions.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentExtensions.cs
new file mode 100644
index 0000000000..d7fb52a790
--- /dev/null
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentExtensions.cs
@@ -0,0 +1,39 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System.Runtime.CompilerServices;
+
+using SixLabors.ImageSharp.Memory;
+
+namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
+{
+ ///
+ /// Extension methods for
+ ///
+ internal static class JpegComponentExtensions
+ {
+ ///
+ /// Gets a reference to the at the given row and column index from
+ ///
+ /// The
+ /// The column
+ /// The row
+ /// The
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static ref Block8x8 GetBlockReference(this IJpegComponent component, int column, int row)
+ {
+ return ref component.SpectralBlocks.GetRowSpan(row)[column];
+ }
+
+ ///
+ /// Gets a reference to the first item in a block
+ /// at the given row and column index from
+ ///
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public static ref short GetBlockDataReference(this IJpegComponent component, int column, int row)
+ {
+ ref Block8x8 blockRef = ref component.GetBlockReference(column, row);
+ return ref Unsafe.As(ref blockRef);
+ }
+ }
+}
\ No newline at end of file