diff --git a/src/ImageSharp46/Formats/Jpg/JpegDecoderCore.cs b/src/ImageSharp46/Formats/Jpg/JpegDecoderCore.cs
index f0551ed76..288136f4f 100644
--- a/src/ImageSharp46/Formats/Jpg/JpegDecoderCore.cs
+++ b/src/ImageSharp46/Formats/Jpg/JpegDecoderCore.cs
@@ -3,6 +3,7 @@
// Licensed under the Apache License, Version 2.0.
//
+using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace ImageSharp.Formats
@@ -84,7 +85,7 @@ namespace ImageSharp.Formats
///
/// Saved state between progressive-mode scans.
///
- private readonly BlockF[][] progCoeffs;
+ private readonly Block8x8[][] progCoeffs;
///
/// The huffman trees
@@ -96,7 +97,7 @@ namespace ImageSharp.Formats
///
/// Quantization tables, in zigzag order.
///
- private readonly BlockF[] quantizationTables;
+ private readonly Block8x8[] quantizationTables;
///
/// A temporary buffer for holding pixels
@@ -203,10 +204,10 @@ namespace ImageSharp.Formats
//this.huffmanTrees = new Huffman[MaxTc + 1, MaxTh + 1];
this.huffmanTrees = new Huffman[(MaxTc + 1) * (MaxTh + 1)];
- this.quantizationTables = BlockF.CreateArray(MaxTq + 1);
+ this.quantizationTables = new Block8x8[MaxTq + 1];
this.temp = new byte[2 * BlockF.BlockSize];
this.componentArray = new Component[MaxComponents];
- this.progCoeffs = new BlockF[MaxComponents][];
+ this.progCoeffs = new Block8x8[MaxComponents][];
this.bits = new Bits();
this.bytes = new Bytes();
@@ -216,21 +217,9 @@ namespace ImageSharp.Formats
{
for (int j = 0; j < MaxTh + 1; j++)
{
- //this.huffmanTrees[i, j].Init(LutSize, MaxNCodes, MaxCodeLength);
this.huffmanTrees[i * ThRowSize + j].Init(LutSize, MaxNCodes, MaxCodeLength);
}
}
-
- //for (int i = 0; i < this.quantizationTables.Length; i++)
- //{
- // //this.quantizationTables[i] = new Block();
- // this.quantizationTables[i].Init();
- //}
-
- //for (int i = 0; i < this.componentArray.Length; i++)
- //{
- // this.componentArray[i] = new Component();
- //}
}
@@ -1580,12 +1569,9 @@ namespace ImageSharp.Formats
int compIndex = scan[i].Index;
if (this.progCoeffs[compIndex] == null)
{
- this.progCoeffs[compIndex] = BlockF.CreateArray(mxx * myy * this.componentArray[compIndex].HorizontalFactor * this.componentArray[compIndex].VerticalFactor);
+ var size = mxx * myy * this.componentArray[compIndex].HorizontalFactor * this.componentArray[compIndex].VerticalFactor;
- for (int j = 0; j < this.progCoeffs[compIndex].Length; j++)
- {
- this.progCoeffs[compIndex][j].Init();
- }
+ this.progCoeffs[compIndex] = new Block8x8[size];
}
}
}
@@ -1657,26 +1643,32 @@ namespace ImageSharp.Formats
var qtIndex = this.componentArray[compIndex].Selector;
- if (this.isProgressive) // Load the previous partially decoded coefficients, if applicable.
- {
- blockIndex = ((@by * mxx) * hi) + bx;
- ProcessBlockImpl(ah,
- ref this.progCoeffs[compIndex][blockIndex],
- scan, i, zigStart, zigEnd, al, dc, compIndex, @by, mxx, hi, bx,
- ref this.quantizationTables[qtIndex]
- );
- }
- else
+ fixed (Block8x8* qtp = &this.quantizationTables[qtIndex])
{
- //var b = Block.Create();
- scanWorkerBlock.Clear();
+ if (this.isProgressive) // Load the previous partially decoded coefficients, if applicable.
+ {
+ blockIndex = ((@by * mxx) * hi) + bx;
- ProcessBlockImpl(ah, ref scanWorkerBlock, scan, i, zigStart, zigEnd, al, dc, compIndex, @by, mxx, hi,
- bx, ref this.quantizationTables[qtIndex]
- );
+ fixed (Block8x8* bp = &this.progCoeffs[compIndex][blockIndex])
+ {
+ ProcessBlockImpl(ah,
+ bp,
+ scan, i, zigStart, zigEnd, al, dc, compIndex, @by, mxx, hi, bx,
+ qtp
+ );
+ }
+ }
+ else
+ {
+ Block8x8 tempBlock = new Block8x8();
- //b.Dispose();
+ ProcessBlockImpl(ah, &tempBlock, scan, i, zigStart, zigEnd, al, dc, compIndex, @by, mxx, hi,
+ bx, qtp
+ );
+ }
}
+
+
}
// for j
@@ -1719,22 +1711,6 @@ namespace ImageSharp.Formats
}
-
- private void ProcessBlockImpl(int ah, ref BlockF b, Scan[] scan, int i, int zigStart, int zigEnd, int al,
- int[] dc, int compIndex, int @by, int mxx, int hi, int bx, ref BlockF qt)
- {
- Block8x8 b2 = new Block8x8();
- Block8x8 qt2 = new Block8x8();
- b2.LoadFrom(ref b);
- qt2.LoadFrom(ref qt);
-
- ProcessBlockImpl(ah, &b2, scan, i, zigStart, zigEnd, al, dc, compIndex, by, mxx, hi, bx, &qt2);
-
- b2.CopyTo(ref b);
- qt2.CopyTo(ref qt);
- }
-
-
private void ProcessBlockImpl(int ah, Block8x8* b, Scan[] scan, int i, int zigStart, int zigEnd, int al,
int[] dc, int compIndex, int @by, int mxx, int hi, int bx, Block8x8* qt)
{
@@ -1816,8 +1792,9 @@ namespace ImageSharp.Formats
// We haven't completely decoded this 8x8 block. Save the coefficients.
// TODO!!!
- throw new NotImplementedException();
+ //throw new NotImplementedException();
//this.progCoeffs[compIndex][((@by * mxx) * hi) + bx] = b.Clone();
+ this.progCoeffs[compIndex][((@by * mxx) * hi) + bx] = *b;
// At this point, we could execute the rest of the loop body to dequantize and
// perform the inverse DCT, to save early stages of a progressive image to the
@@ -2051,6 +2028,8 @@ namespace ImageSharp.Formats
break;
}
+ int blah = zig;
+
zig = this.RefineNonZeroes(b, zig, zigEnd, val0, delta);
if (zig > zigEnd)
{
@@ -2087,8 +2066,9 @@ namespace ImageSharp.Formats
for (; zig <= zigEnd; zig++)
{
int u = Unzig[zig];
- float bu = Block8x8.GetScalarAt(b, 0);
+ float bu = Block8x8.GetScalarAt(b, u);
+ // TODO: Are the equality comparsions OK with floating point values? Isn't an epsilon value necessary?
if (bu == 0)
{
if (nz == 0)
@@ -2306,15 +2286,6 @@ namespace ImageSharp.Formats
public void Dispose()
{
scanWorkerBlock.Dispose();
- BlockF.DisposeAll(this.quantizationTables);
-
- foreach (BlockF[] blocks in progCoeffs)
- {
- if (blocks != null)
- {
- BlockF.DisposeAll(blocks);
- }
- }
for (int i = 0; i < huffmanTrees.Length; i++)
{