diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs
index b26aae8d8..e7b0f1b9a 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs
@@ -11,11 +11,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
///
internal class JpegComponentPostProcessor : IDisposable
{
- ///
- /// Points to the current row in .
- ///
- private int currentComponentRowInBlocks;
-
///
/// The size of the area in corresponding to one 8x8 Jpeg block
///
@@ -70,9 +65,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
public void Dispose() => this.ColorBuffer.Dispose();
///
- /// Invoke for block rows, copy the result into .
+ /// Convert raw spectral DCT data to color data and copy it to the color buffer .
///
- public void CopyBlocksToColorBuffer(int step)
+ public void CopyBlocksToColorBuffer(int spectralStep)
{
Buffer2D spectralBuffer = this.Component.SpectralBlocks;
@@ -80,7 +75,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
int destAreaStride = this.ColorBuffer.Width;
- int yBlockStart = step * this.BlockRowsPerStep;
+ int yBlockStart = spectralStep * this.BlockRowsPerStep;
Size subSamplingDivisors = this.Component.SubSamplingDivisors;
@@ -89,26 +84,17 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
for (int y = 0; y < this.BlockRowsPerStep; y++)
{
- int yBlock = yBlockStart + y;
-
- if (yBlock >= spectralBuffer.Height)
- {
- break;
- }
-
int yBuffer = y * this.blockAreaSize.Height;
Span colorBufferRow = this.ColorBuffer.GetRowSpan(yBuffer);
- Span blockRow = spectralBuffer.GetRowSpan(yBlock);
+ Span blockRow = spectralBuffer.GetRowSpan(yBlockStart + y);
// see: https://github.com/SixLabors/ImageSharp/issues/824
int widthInBlocks = Math.Min(spectralBuffer.Width, this.SizeInBlocks.Width);
for (int xBlock = 0; xBlock < widthInBlocks; xBlock++)
{
- int xBuffer = xBlock * this.blockAreaSize.Width;
- ref float destAreaOrigin = ref colorBufferRow[xBuffer];
-
+ // Integer to float
workspaceBlock.LoadFrom(ref blockRow[xBlock]);
// Dequantize
@@ -123,8 +109,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
workspaceBlock.NormalizeColorsAndRoundInPlace(maximumValue);
// Write to color buffer acording to sampling factors
+ int xColorBufferStart = xBlock * this.blockAreaSize.Width;
workspaceBlock.ScaledCopyTo(
- ref destAreaOrigin,
+ ref colorBufferRow[xColorBufferStart],
destAreaStride,
subSamplingDivisors.Width,
subSamplingDivisors.Height);
@@ -140,11 +127,5 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
spectralBlocks.GetRowSpan(i).Clear();
}
}
-
- public void CopyBlocksToColorBuffer()
- {
- this.CopyBlocksToColorBuffer(this.currentComponentRowInBlocks);
- this.currentComponentRowInBlocks += this.BlockRowsPerStep;
- }
}
}