diff --git a/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs index ae15a8b614..8c16cde682 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs @@ -16,16 +16,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression /// Initializes a new instance of the class. /// /// The memory allocator. - public T4TiffCompression(MemoryAllocator allocator) - : base(allocator) + /// The photometric interpretation. + public T4TiffCompression(MemoryAllocator allocator, TiffPhotometricInterpretation photometricInterpretation) + : base(allocator, photometricInterpretation) { } /// public override void Decompress(Stream stream, int byteCount, Span buffer) { - // TODO: handle case when white is not zero. - bool isWhiteZero = true; + bool isWhiteZero = this.PhotometricInterpretation == TiffPhotometricInterpretation.WhiteIsZero; int whiteValue = isWhiteZero ? 0 : 1; int blackValue = isWhiteZero ? 1 : 0; diff --git a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs index 33330beba4..1a2b814fec 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs @@ -14,10 +14,20 @@ namespace SixLabors.ImageSharp.Formats.Tiff { private readonly MemoryAllocator allocator; + private TiffPhotometricInterpretation photometricInterpretation; + public TiffBaseCompression(MemoryAllocator allocator) => this.allocator = allocator; + public TiffBaseCompression(MemoryAllocator allocator, TiffPhotometricInterpretation photometricInterpretation) + { + this.allocator = allocator; + this.photometricInterpretation = photometricInterpretation; + } + protected MemoryAllocator Allocator => this.allocator; + protected TiffPhotometricInterpretation PhotometricInterpretation => this.photometricInterpretation; + /// /// Decompresses image data into the supplied buffer. /// diff --git a/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs b/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs index cedbbe35b0..e15cc451f2 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff { internal static class TiffCompressionFactory { - public static TiffBaseCompression Create(TiffCompressionType compressionType, MemoryAllocator allocator) + public static TiffBaseCompression Create(TiffCompressionType compressionType, MemoryAllocator allocator, TiffPhotometricInterpretation photometricInterpretation) { switch (compressionType) { @@ -21,7 +21,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff case TiffCompressionType.Lzw: return new LzwTiffCompression(allocator); case TiffCompressionType.T4: - return new T4TiffCompression(allocator); + return new T4TiffCompression(allocator, photometricInterpretation); default: throw TiffThrowHelper.NotSupportedCompression(nameof(compressionType)); } diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs index 7eced53bd1..5c253d4c8f 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs @@ -276,7 +276,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff stripBuffers[stripIndex] = this.memoryAllocator.AllocateManagedByteBuffer(uncompressedStripSize); } - TiffBaseCompression decompressor = TiffCompressionFactory.Create(this.CompressionType, this.memoryAllocator); + TiffBaseCompression decompressor = TiffCompressionFactory.Create(this.CompressionType, this.memoryAllocator, this.PhotometricInterpretation); RgbPlanarTiffColor colorDecoder = TiffColorDecoderFactory.CreatePlanar(this.ColorType, this.BitsPerSample, this.ColorMap); @@ -313,7 +313,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff Buffer2D pixels = frame.PixelBuffer; - TiffBaseCompression decompressor = TiffCompressionFactory.Create(this.CompressionType, this.memoryAllocator); + TiffBaseCompression decompressor = TiffCompressionFactory.Create(this.CompressionType, this.memoryAllocator, this.PhotometricInterpretation); TiffBaseColorDecoder colorDecoder = TiffColorDecoderFactory.Create(this.ColorType, this.BitsPerSample, this.ColorMap);