diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs
index 688414b33..ea76df7a8 100644
--- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs
+++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs
@@ -22,6 +22,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
private JpegFrame frame;
private JpegComponent[] components;
+ // The number of interleaved components.
+ private int componentsCount;
+
///
/// The reset interval determined by RST markers.
///
@@ -86,9 +89,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
}
}
- // The number of interleaved components.
- public int ComponentsLength { get; set; }
-
// The spectral selection start.
public int SpectralStart { get; set; }
@@ -104,10 +104,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
///
/// Decodes the entropy coded data.
///
- public void ParseEntropyCodedData()
+ public void ParseEntropyCodedData(int componentCount)
{
this.cancellationToken.ThrowIfCancellationRequested();
+ this.componentsCount = componentCount;
+
this.scanBuffer = new HuffmanScanBuffer(this.stream);
bool fullScan = this.frame.Progressive || this.frame.MultiScan;
@@ -138,7 +140,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
private void ParseBaselineData()
{
- if (this.ComponentsLength == this.frame.ComponentCount)
+ if (this.componentsCount == this.frame.ComponentCount)
{
this.ParseBaselineDataInterleaved();
}
@@ -157,7 +159,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
ref HuffmanScanBuffer buffer = ref this.scanBuffer;
// Pre-derive the huffman table to avoid in-loop checks.
- for (int i = 0; i < this.ComponentsLength; i++)
+ for (int i = 0; i < this.componentsCount; i++)
{
int order = this.frame.ComponentOrder[i];
JpegComponent component = this.components[order];
@@ -177,7 +179,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{
// Scan an interleaved mcu... process components in order
int mcuCol = mcu % mcusPerLine;
- for (int k = 0; k < this.ComponentsLength; k++)
+ for (int k = 0; k < this.componentsCount; k++)
{
int order = this.frame.ComponentOrder[k];
JpegComponent component = this.components[order];
@@ -286,7 +288,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
}
// AC scans may have only one component.
- if (this.ComponentsLength != 1)
+ if (this.componentsCount != 1)
{
invalid = true;
}
@@ -318,7 +320,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
{
this.CheckProgressiveData();
- if (this.ComponentsLength == 1)
+ if (this.componentsCount == 1)
{
this.ParseProgressiveDataNonInterleaved();
}
@@ -337,7 +339,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
ref HuffmanScanBuffer buffer = ref this.scanBuffer;
// Pre-derive the huffman table to avoid in-loop checks.
- for (int k = 0; k < this.ComponentsLength; k++)
+ for (int k = 0; k < this.componentsCount; k++)
{
int order = this.frame.ComponentOrder[k];
JpegComponent component = this.components[order];
@@ -352,7 +354,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder
// Scan an interleaved mcu... process components in order
int mcuRow = mcu / mcusPerLine;
int mcuCol = mcu % mcusPerLine;
- for (int k = 0; k < this.ComponentsLength; k++)
+ for (int k = 0; k < this.componentsCount; k++)
{
int order = this.frame.ComponentOrder[k];
JpegComponent component = this.components[order];
diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
index e61909798..97a6d3999 100644
--- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
+++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs
@@ -1044,19 +1044,13 @@ namespace SixLabors.ImageSharp.Formats.Jpeg
int spectralEnd = this.temp[1];
int successiveApproximation = this.temp[2];
- // All the comments below are for separate refactoring PR
- // Main reason it's not fixed here is to make this commit less intrusive
-
- // This can be passed as ParseEntropyCodedData() parameter as it is used only there
- this.scanDecoder.ComponentsLength = selectorsCount;
-
// This is okay to inject here, might be good to wrap it in a separate struct but not really necessary
this.scanDecoder.SpectralStart = spectralStart;
this.scanDecoder.SpectralEnd = spectralEnd;
this.scanDecoder.SuccessiveHigh = successiveApproximation >> 4;
this.scanDecoder.SuccessiveLow = successiveApproximation & 15;
- this.scanDecoder.ParseEntropyCodedData();
+ this.scanDecoder.ParseEntropyCodedData(selectorsCount);
}
///