diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsComponentBlocks.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsComponentBlocks.cs index a69f5a7664..6a879b4e50 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsComponentBlocks.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsComponentBlocks.cs @@ -10,7 +10,7 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort.Components /// /// Contains all the decoded component blocks /// - internal sealed class ComponentBlocks : IDisposable + internal sealed class PdfJsComponentBlocks : IDisposable { /// /// Gets or sets the component blocks diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJpegPixelArea.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJpegPixelArea.cs index e39564e9a0..09677b278d 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJpegPixelArea.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJpegPixelArea.cs @@ -63,7 +63,7 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort.Components /// The jpeg component blocks /// The pixel area width /// The pixel area height - public void LinearizeBlockData(ComponentBlocks components, int width, int height) + public void LinearizeBlockData(PdfJsComponentBlocks components, int width, int height) { this.Width = width; this.Height = height; diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoder.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoder.cs new file mode 100644 index 0000000000..25f739704c --- /dev/null +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoder.cs @@ -0,0 +1,21 @@ +namespace ImageSharp.Formats.Jpeg.PdfJsPort +{ + using System; + using System.IO; + + using ImageSharp.PixelFormats; + + internal sealed class PdfJsJpegDecoder : IImageDecoder, IJpegDecoderOptions + { + public bool IgnoreMetadata { get; set; } + + public Image Decode(Configuration configuration, Stream stream) + where TPixel : struct, IPixel + { + using (var decoder = new PdfJsJpegDecoderCore(configuration, this)) + { + return decoder.Decode(stream); + } + } + } +} \ No newline at end of file diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs index ef03818cc7..a6137c823d 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs @@ -6,8 +6,6 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort { using System; - using System.Collections.Generic; - using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; @@ -41,7 +39,7 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort private PdfJsFrame frame; - private ComponentBlocks components; + private PdfJsComponentBlocks components; private PdfJsJpegPixelArea pixelArea; @@ -269,19 +267,19 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.imageWidth = this.frame.SamplesPerLine; this.imageHeight = this.frame.Scanlines; - this.components = new ComponentBlocks { Components = new PdfJsComponent[this.frame.ComponentCount] }; + this.components = new PdfJsComponentBlocks { Components = new PdfJsComponent[this.frame.ComponentCount] }; for (int i = 0; i < this.components.Components.Length; i++) { ref var frameComponent = ref this.frame.Components[i]; var component = new PdfJsComponent - { - Scale = new System.Numerics.Vector2( - frameComponent.HorizontalFactor / (float)this.frame.MaxHorizontalFactor, - frameComponent.VerticalFactor / (float)this.frame.MaxVerticalFactor), - BlocksPerLine = frameComponent.BlocksPerLine, - BlocksPerColumn = frameComponent.BlocksPerColumn - }; + { + Scale = new System.Numerics.Vector2( + frameComponent.HorizontalFactor / (float)this.frame.MaxHorizontalFactor, + frameComponent.VerticalFactor / (float)this.frame.MaxVerticalFactor), + BlocksPerLine = frameComponent.BlocksPerLine, + BlocksPerColumn = frameComponent.BlocksPerColumn + }; this.BuildComponentData(ref component, ref frameComponent); this.components.Components[i] = component; @@ -300,7 +298,8 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort { if (this.numberOfComponents > 4) { - throw new ImageFormatException($"Unsupported color mode. Max components 4; found {this.numberOfComponents}"); + throw new ImageFormatException( + $"Unsupported color mode. Max components 4; found {this.numberOfComponents}"); } this.pixelArea = new PdfJsJpegPixelArea(image.Width, image.Height, this.numberOfComponents); @@ -314,7 +313,8 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort if (this.numberOfComponents == 3) { - if (this.adobe.Equals(default(PdfJsAdobe)) || this.adobe.ColorTransform == PdfJsJpegConstants.Markers.Adobe.ColorTransformYCbCr) + if (this.adobe.Equals(default(PdfJsAdobe)) + || this.adobe.ColorTransform == PdfJsJpegConstants.Markers.Adobe.ColorTransformYCbCr) { this.FillYCbCrImage(image); } @@ -381,22 +381,22 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(this.temp, 0, 13); remaining -= 13; - bool isJfif = this.temp[0] == PdfJsJpegConstants.Markers.JFif.J && - this.temp[1] == PdfJsJpegConstants.Markers.JFif.F && - this.temp[2] == PdfJsJpegConstants.Markers.JFif.I && - this.temp[3] == PdfJsJpegConstants.Markers.JFif.F && - this.temp[4] == PdfJsJpegConstants.Markers.JFif.Null; + bool isJfif = this.temp[0] == PdfJsJpegConstants.Markers.JFif.J + && this.temp[1] == PdfJsJpegConstants.Markers.JFif.F + && this.temp[2] == PdfJsJpegConstants.Markers.JFif.I + && this.temp[3] == PdfJsJpegConstants.Markers.JFif.F + && this.temp[4] == PdfJsJpegConstants.Markers.JFif.Null; if (isJfif) { this.jFif = new PdfJsJFif - { - MajorVersion = this.temp[5], - MinorVersion = this.temp[6], - DensityUnits = this.temp[7], - XDensity = (short)((this.temp[8] << 8) | this.temp[9]), - YDensity = (short)((this.temp[10] << 8) | this.temp[11]) - }; + { + MajorVersion = this.temp[5], + MinorVersion = this.temp[6], + DensityUnits = this.temp[7], + XDensity = (short)((this.temp[8] << 8) | this.temp[9]), + YDensity = (short)((this.temp[10] << 8) | this.temp[11]) + }; } // TODO: thumbnail @@ -423,12 +423,10 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort byte[] profile = new byte[remaining]; this.InputStream.Read(profile, 0, remaining); - if (profile[0] == PdfJsJpegConstants.Markers.Exif.E && - profile[1] == PdfJsJpegConstants.Markers.Exif.X && - profile[2] == PdfJsJpegConstants.Markers.Exif.I && - profile[3] == PdfJsJpegConstants.Markers.Exif.F && - profile[4] == PdfJsJpegConstants.Markers.Exif.Null && - profile[5] == PdfJsJpegConstants.Markers.Exif.Null) + if (profile[0] == PdfJsJpegConstants.Markers.Exif.E && profile[1] == PdfJsJpegConstants.Markers.Exif.X + && profile[2] == PdfJsJpegConstants.Markers.Exif.I && profile[3] == PdfJsJpegConstants.Markers.Exif.F + && profile[4] == PdfJsJpegConstants.Markers.Exif.Null + && profile[5] == PdfJsJpegConstants.Markers.Exif.Null) { this.isExif = true; metadata.ExifProfile = new ExifProfile(profile); @@ -454,18 +452,17 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(identifier, 0, Icclength); remaining -= Icclength; // We have read it by this point - if (identifier[0] == PdfJsJpegConstants.Markers.ICC.I && - identifier[1] == PdfJsJpegConstants.Markers.ICC.C && - identifier[2] == PdfJsJpegConstants.Markers.ICC.C && - identifier[3] == PdfJsJpegConstants.Markers.ICC.UnderScore && - identifier[4] == PdfJsJpegConstants.Markers.ICC.P && - identifier[5] == PdfJsJpegConstants.Markers.ICC.R && - identifier[6] == PdfJsJpegConstants.Markers.ICC.O && - identifier[7] == PdfJsJpegConstants.Markers.ICC.F && - identifier[8] == PdfJsJpegConstants.Markers.ICC.I && - identifier[9] == PdfJsJpegConstants.Markers.ICC.L && - identifier[10] == PdfJsJpegConstants.Markers.ICC.E && - identifier[11] == PdfJsJpegConstants.Markers.ICC.Null) + if (identifier[0] == PdfJsJpegConstants.Markers.ICC.I && identifier[1] == PdfJsJpegConstants.Markers.ICC.C + && identifier[2] == PdfJsJpegConstants.Markers.ICC.C + && identifier[3] == PdfJsJpegConstants.Markers.ICC.UnderScore + && identifier[4] == PdfJsJpegConstants.Markers.ICC.P + && identifier[5] == PdfJsJpegConstants.Markers.ICC.R + && identifier[6] == PdfJsJpegConstants.Markers.ICC.O + && identifier[7] == PdfJsJpegConstants.Markers.ICC.F + && identifier[8] == PdfJsJpegConstants.Markers.ICC.I + && identifier[9] == PdfJsJpegConstants.Markers.ICC.L + && identifier[10] == PdfJsJpegConstants.Markers.ICC.E + && identifier[11] == PdfJsJpegConstants.Markers.ICC.Null) { byte[] profile = new byte[remaining]; this.InputStream.Read(profile, 0, remaining); @@ -503,21 +500,21 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(this.temp, 0, 12); remaining -= 12; - bool isAdobe = this.temp[0] == PdfJsJpegConstants.Markers.Adobe.A && - this.temp[1] == PdfJsJpegConstants.Markers.Adobe.D && - this.temp[2] == PdfJsJpegConstants.Markers.Adobe.O && - this.temp[3] == PdfJsJpegConstants.Markers.Adobe.B && - this.temp[4] == PdfJsJpegConstants.Markers.Adobe.E; + bool isAdobe = this.temp[0] == PdfJsJpegConstants.Markers.Adobe.A + && this.temp[1] == PdfJsJpegConstants.Markers.Adobe.D + && this.temp[2] == PdfJsJpegConstants.Markers.Adobe.O + && this.temp[3] == PdfJsJpegConstants.Markers.Adobe.B + && this.temp[4] == PdfJsJpegConstants.Markers.Adobe.E; if (isAdobe) { this.adobe = new PdfJsAdobe - { - DCTEncodeVersion = (short)((this.temp[5] << 8) | this.temp[6]), - APP14Flags0 = (short)((this.temp[7] << 8) | this.temp[8]), - APP14Flags1 = (short)((this.temp[9] << 8) | this.temp[10]), - ColorTransform = this.temp[11] - }; + { + DCTEncodeVersion = (short)((this.temp[5] << 8) | this.temp[6]), + APP14Flags0 = (short)((this.temp[7] << 8) | this.temp[8]), + APP14Flags1 = (short)((this.temp[9] << 8) | this.temp[10]), + ColorTransform = this.temp[11] + }; } if (remaining > 0) @@ -555,7 +552,8 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(this.temp, 0, 64); remaining -= 64; - Span tableSpan = this.quantizationTables.Tables.GetRowSpan(quantizationTableSpec & 15); + Span tableSpan = + this.quantizationTables.Tables.GetRowSpan(quantizationTableSpec & 15); for (int j = 0; j < 64; j++) { tableSpan[PdfJsQuantizationTables.DctZigZag[j]] = this.temp[j]; @@ -575,10 +573,12 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(this.temp, 0, 128); remaining -= 128; - Span tableSpan = this.quantizationTables.Tables.GetRowSpan(quantizationTableSpec & 15); + Span tableSpan = + this.quantizationTables.Tables.GetRowSpan(quantizationTableSpec & 15); for (int j = 0; j < 64; j++) { - tableSpan[PdfJsQuantizationTables.DctZigZag[j]] = (short)((this.temp[2 * j] << 8) | this.temp[(2 * j) + 1]); + tableSpan[PdfJsQuantizationTables.DctZigZag[j]] = + (short)((this.temp[2 * j] << 8) | this.temp[(2 * j) + 1]); } } @@ -614,14 +614,14 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort this.InputStream.Read(this.temp, 0, remaining); this.frame = new PdfJsFrame - { - Extended = frameMarker.Marker == PdfJsJpegConstants.Markers.SOF1, - Progressive = frameMarker.Marker == PdfJsJpegConstants.Markers.SOF2, - Precision = this.temp[0], - Scanlines = (short)((this.temp[1] << 8) | this.temp[2]), - SamplesPerLine = (short)((this.temp[3] << 8) | this.temp[4]), - ComponentCount = this.temp[5] - }; + { + Extended = frameMarker.Marker == PdfJsJpegConstants.Markers.SOF1, + Progressive = frameMarker.Marker == PdfJsJpegConstants.Markers.SOF2, + Precision = this.temp[0], + Scanlines = (short)((this.temp[1] << 8) | this.temp[2]), + SamplesPerLine = (short)((this.temp[3] << 8) | this.temp[4]), + ComponentCount = this.temp[5] + }; int maxH = 0; int maxV = 0; @@ -762,18 +762,18 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort var scanDecoder = default(PdfJsScanDecoder); scanDecoder.DecodeScan( - this.frame, - this.InputStream, - this.dcHuffmanTables, - this.acHuffmanTables, - this.frame.Components, - componentIndex, - selectorsCount, - this.resetInterval, - spectralStart, - spectralEnd, - successiveApproximation >> 4, - successiveApproximation & 15); + this.frame, + this.InputStream, + this.dcHuffmanTables, + this.acHuffmanTables, + this.frame.Components, + componentIndex, + selectorsCount, + this.resetInterval, + spectralStart, + spectralEnd, + successiveApproximation >> 4, + successiveApproximation & 15); } /// @@ -788,7 +788,8 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort using (var computationBuffer = Buffer.CreateClean(64)) using (var multiplicationBuffer = Buffer.CreateClean(64)) { - Span quantizationTable = this.quantizationTables.Tables.GetRowSpan(frameComponent.QuantizationIdentifier); + Span quantizationTable = + this.quantizationTables.Tables.GetRowSpan(frameComponent.QuantizationIdentifier); Span computationBufferSpan = computationBuffer; // For AA&N IDCT method, multiplier are equal to quantization @@ -807,7 +808,11 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort for (int blockCol = 0; blockCol < blocksPerLine; blockCol++) { int offset = GetBlockBufferOffset(ref component, blockRow, blockCol); - PdfJsIDCT.QuantizeAndInverseFast(ref frameComponent, offset, ref computationBufferSpan, ref multiplierSpan); + PdfJsIDCT.QuantizeAndInverseFast( + ref frameComponent, + offset, + ref computationBufferSpan, + ref multiplierSpan); } } } @@ -838,8 +843,11 @@ namespace ImageSharp.Formats.Jpeg.PdfJsPort for (int i = 0; i < this.frame.ComponentCount; i++) { ref var component = ref this.frame.Components[i]; - int blocksPerLine = (int)MathF.Ceiling(MathF.Ceiling(this.frame.SamplesPerLine / 8F) * component.HorizontalFactor / this.frame.MaxHorizontalFactor); - int blocksPerColumn = (int)MathF.Ceiling(MathF.Ceiling(this.frame.Scanlines / 8F) * component.VerticalFactor / this.frame.MaxVerticalFactor); + int blocksPerLine = (int)MathF.Ceiling( + MathF.Ceiling(this.frame.SamplesPerLine / 8F) * component.HorizontalFactor + / this.frame.MaxHorizontalFactor); + int blocksPerColumn = (int)MathF.Ceiling( + MathF.Ceiling(this.frame.Scanlines / 8F) * component.VerticalFactor / this.frame.MaxVerticalFactor); int blocksPerLineForMcu = mcusPerLine * component.HorizontalFactor; int blocksPerColumnForMcu = mcusPerColumn * component.VerticalFactor; diff --git a/src/Shared/stylecop.json b/src/Shared/stylecop.json index df8f120a5b..b2c586e1f0 100644 --- a/src/Shared/stylecop.json +++ b/src/Shared/stylecop.json @@ -3,7 +3,13 @@ "settings": { "documentationRules": { "companyName": "James Jackson-South", - "copyrightText": "Copyright (c) James Jackson-South and contributors.\nLicensed under the Apache License, Version 2.0." + "copyrightText": "Copyright (c) James Jackson-South and contributors.\nLicensed under the Apache License, Version 2.0.", + + "documentInterfaces": false, + "documentInternalElements": false, + "documentExposedElements": false, + "documentPrivateElements": false, + "documentPrivateFields": false } } } \ No newline at end of file