diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsAdobe.cs b/src/ImageSharp/Formats/Jpeg/Common/Decoder/AdobeMarker.cs similarity index 67% rename from src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsAdobe.cs rename to src/ImageSharp/Formats/Jpeg/Common/Decoder/AdobeMarker.cs index 9fba4ae9bc..84ceff7cc9 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsAdobe.cs +++ b/src/ImageSharp/Formats/Jpeg/Common/Decoder/AdobeMarker.cs @@ -4,12 +4,12 @@ using System; // ReSharper disable InconsistentNaming -namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components +namespace SixLabors.ImageSharp.Formats.Jpeg.Common.Decoder { /// /// Provides information about the Adobe marker segment /// - internal struct PdfJsAdobe : IEquatable + internal struct AdobeMarker : IEquatable { /// /// The DCT Encode Version @@ -36,7 +36,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components public byte ColorTransform; /// - public bool Equals(PdfJsAdobe other) + public bool Equals(AdobeMarker other) { return this.DCTEncodeVersion == other.DCTEncodeVersion && this.APP14Flags0 == other.APP14Flags0 @@ -52,21 +52,24 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components return false; } - return obj is PdfJsAdobe && this.Equals((PdfJsAdobe)obj); + return obj is AdobeMarker && this.Equals((AdobeMarker)obj); } /// public override int GetHashCode() { - unchecked - { - // TODO: Merge and use HashCodeHelpers - int hashCode = this.DCTEncodeVersion.GetHashCode(); - hashCode = (hashCode * 397) ^ this.APP14Flags0.GetHashCode(); - hashCode = (hashCode * 397) ^ this.APP14Flags1.GetHashCode(); - hashCode = (hashCode * 397) ^ this.ColorTransform.GetHashCode(); - return hashCode; - } + return GetHashCode(this); + } + + private static int GetHashCode(AdobeMarker marker) + { + return HashHelpers.Combine( + marker.DCTEncodeVersion.GetHashCode(), + HashHelpers.Combine( + marker.APP14Flags0.GetHashCode(), + HashHelpers.Combine( + marker.APP14Flags1.GetHashCode(), + marker.ColorTransform.GetHashCode()))); } } } \ No newline at end of file diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJFif.cs b/src/ImageSharp/Formats/Jpeg/Common/Decoder/JFifMarker.cs similarity index 69% rename from src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJFif.cs rename to src/ImageSharp/Formats/Jpeg/Common/Decoder/JFifMarker.cs index 52ba81bbcc..acaa0eb53f 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsJFif.cs +++ b/src/ImageSharp/Formats/Jpeg/Common/Decoder/JFifMarker.cs @@ -3,13 +3,13 @@ using System; -namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components +namespace SixLabors.ImageSharp.Formats.Jpeg.Common.Decoder { /// /// Provides information about the JFIF marker segment /// TODO: Thumbnail? /// - internal struct PdfJsJFif : IEquatable + internal struct JFifMarker : IEquatable { /// /// The major version @@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components public short YDensity; /// - public bool Equals(PdfJsJFif other) + public bool Equals(JFifMarker other) { return this.MajorVersion == other.MajorVersion && this.MinorVersion == other.MinorVersion @@ -57,21 +57,24 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components return false; } - return obj is PdfJsJFif && this.Equals((PdfJsJFif)obj); + return obj is JFifMarker && this.Equals((JFifMarker)obj); } /// public override int GetHashCode() { - unchecked - { - int hashCode = this.MajorVersion.GetHashCode(); - hashCode = (hashCode * 397) ^ this.MinorVersion.GetHashCode(); - hashCode = (hashCode * 397) ^ this.DensityUnits.GetHashCode(); - hashCode = (hashCode * 397) ^ this.XDensity.GetHashCode(); - hashCode = (hashCode * 397) ^ this.YDensity.GetHashCode(); - return hashCode; - } + return GetHashCode(this); + } + + private static int GetHashCode(JFifMarker marker) + { + return HashHelpers.Combine( + marker.MajorVersion.GetHashCode(), + HashHelpers.Combine( + marker.MinorVersion.GetHashCode(), + HashHelpers.Combine( + marker.DensityUnits.GetHashCode(), + HashHelpers.Combine(marker.XDensity, marker.YDensity)))); } } } \ No newline at end of file diff --git a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegConstants.cs b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegConstants.cs index d33fe52f67..8098cc339d 100644 --- a/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegConstants.cs +++ b/src/ImageSharp/Formats/Jpeg/GolangPort/OrigJpegConstants.cs @@ -165,6 +165,32 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.GolangPort public const byte APP15 = 0xef; } + /// + /// Contains JFIF specific markers + /// + public static class JFif + { + /// + /// Represents J in ASCII + /// + public const byte J = 0x4A; + + /// + /// Represents F in ASCII + /// + public const byte F = 0x46; + + /// + /// Represents I in ASCII + /// + public const byte I = 0x49; + + /// + /// Represents the null "0" marker + /// + public const byte Null = 0x0; + } + /// /// Describes Adobe specific markers /// diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs index 6c84597c99..8ed1e31034 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.Formats.Jpeg.Common.Decoder; using SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.MetaData; @@ -53,12 +54,12 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort /// /// Contains information about the JFIF marker /// - private PdfJsJFif jFif; + private JFifMarker jFif; /// /// Contains information about the Adobe marker /// - private PdfJsAdobe adobe; + private AdobeMarker adobe; /// /// Initializes static members of the class. @@ -345,7 +346,7 @@ namespace SixLabors.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(AdobeMarker)) || this.adobe.ColorTransform == PdfJsJpegConstants.Markers.Adobe.ColorTransformYCbCr) { this.FillYCbCrImage(image); } @@ -420,7 +421,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort if (isJfif) { - this.jFif = new PdfJsJFif + this.jFif = new JFifMarker { MajorVersion = this.temp[5], MinorVersion = this.temp[6], @@ -542,7 +543,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort if (isAdobe) { - this.adobe = new PdfJsAdobe + this.adobe = new AdobeMarker { DCTEncodeVersion = (short)((this.temp[5] << 8) | this.temp[6]), APP14Flags0 = (short)((this.temp[7] << 8) | this.temp[8]),