From 338c91215a09792e214733dc9079ae2920d47d3c Mon Sep 17 00:00:00 2001 From: popow Date: Thu, 26 Apr 2018 21:45:56 +0200 Subject: [PATCH] fix for unnecessary memory allocation, if only the metadata of the image will be read --- .../Components/Decoder/OrigComponent.cs | 2 +- .../Jpeg/GolangPort/OrigJpegDecoderCore.cs | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs index e2f21bd1c3..e2b72db057 100644 --- a/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/GolangPort/Components/Decoder/OrigComponent.cs @@ -246,7 +246,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Components.Decoder public void Dispose() { - this.SpectralBlocks.Dispose(); + this.SpectralBlocks?.Dispose(); } } } diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs index a4fbb17be3..9202108720 100644 --- a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegDecoderCore.cs @@ -41,7 +41,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort /// /// Encapsulates stream reading and processing data and operations for . - /// It's a value type for imporved data locality, and reduced number of CALLVIRT-s + /// It's a value type for improved data locality, and reduced number of CALLVIRT-s /// public InputProcessor InputProcessor; #pragma warning restore SA401 @@ -168,7 +168,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort public int MCUCountY => this.ImageSizeInMCU.Height; /// - /// Gets the the total number of MCU-s (Minimum Coded Units) in the image. + /// Gets the total number of MCU-s (Minimum Coded Units) in the image. /// public int TotalMCUCount => this.MCUCountX * this.MCUCountY; @@ -331,7 +331,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort case OrigJpegConstants.Markers.SOF1: case OrigJpegConstants.Markers.SOF2: this.IsProgressive = marker == OrigJpegConstants.Markers.SOF2; - this.ProcessStartOfFrameMarker(remaining); + this.ProcessStartOfFrameMarker(remaining, metadataOnly); if (metadataOnly && this.isJFif) { return; @@ -634,7 +634,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort /// Processes the Start of Frame marker. Specified in section B.2.2. /// /// The remaining bytes in the segment block. - private void ProcessStartOfFrameMarker(int remaining) + /// Whether to decode metadata only. + private void ProcessStartOfFrameMarker(int remaining, bool metadataOnly) { if (this.ComponentCount != 0) { @@ -689,12 +690,15 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort this.ImageSizeInMCU = this.ImageSizeInPixels.DivideRoundUp(8 * h0, 8 * v0); - foreach (OrigComponent component in this.Components) + this.ColorSpace = this.DeduceJpegColorSpace(); + + if (!metadataOnly) { - component.InitializeDerivedData(this.configuration.MemoryManager, this); + foreach (OrigComponent component in this.Components) + { + component.InitializeDerivedData(this.configuration.MemoryManager, this); + } } - - this.ColorSpace = this.DeduceJpegColorSpace(); } ///