diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs index 34eaf1500..c189e4e28 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/HuffmanScanDecoder.cs @@ -16,14 +16,36 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder /// internal class HuffmanScanDecoder { - private readonly JpegFrame frame; private readonly HuffmanTable[] dcHuffmanTables; private readonly HuffmanTable[] acHuffmanTables; private readonly BufferedReadStream stream; - private readonly JpegComponent[] components; + + // Frame related + private JpegFrame frame; + private JpegComponent[] components; + + public JpegFrame Frame + { + set + { + frame = value; + components = value.Components; + } + } // The restart interval. - private readonly int restartInterval; + private int restartInterval; + // How many mcu's are left to do. + private int todo; + + public int ResetInterval + { + set + { + restartInterval = value; + todo = value; + } + } // The number of interleaved components. public int componentsLength; @@ -40,9 +62,6 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder // The successive approximation low bit end. public int successiveLow; - // How many mcu's are left to do. - private int todo; - // The End-Of-Block countdown for ending the sequence prematurely when the remaining coefficients are zero. private int eobrun; @@ -69,21 +88,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder /// The token to monitor cancellation. public HuffmanScanDecoder( BufferedReadStream stream, - JpegFrame frame, HuffmanTable[] dcHuffmanTables, HuffmanTable[] acHuffmanTables, - int restartInterval, CancellationToken cancellationToken) { this.dctZigZag = ZigZag.CreateUnzigTable(); this.stream = stream; this.scanBuffer = new HuffmanScanBuffer(stream); - this.frame = frame; this.dcHuffmanTables = dcHuffmanTables; this.acHuffmanTables = acHuffmanTables; - this.components = frame.Components; - this.restartInterval = restartInterval; - this.todo = restartInterval; this.cancellationToken = cancellationToken; } diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index 9cae029fe..5d7e12618 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -1051,12 +1051,14 @@ namespace SixLabors.ImageSharp.Formats.Jpeg var sd = new HuffmanScanDecoder( stream, - this.Frame, this.dcHuffmanTables, this.acHuffmanTables, - this.resetInterval, cancellationToken) { + Frame = this.Frame, + + ResetInterval = this.resetInterval, + componentsLength = selectorsCount, spectralStart = spectralStart,