Example #1
0
 private void WritePixelRun(Span <byte> buffer, T4BitReader bitReader, uint bitsWritten)
 {
     if (bitReader.IsWhiteRun)
     {
         BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue);
     }
     else
     {
         BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.blackValue);
     }
 }
Example #2
0
        /// <inheritdoc/>
        protected override void Decompress(BufferedReadStream stream, int byteCount, int stripHeight, Span <byte> buffer)
        {
            if (this.faxCompressionOptions.HasFlag(FaxCompressionOptions.TwoDimensionalCoding))
            {
                TiffThrowHelper.ThrowNotSupported("TIFF CCITT 2D compression is not yet supported");
            }

            bool eolPadding = this.faxCompressionOptions.HasFlag(FaxCompressionOptions.EolPadding);

            using var bitReader = new T4BitReader(stream, this.FillOrder, byteCount, this.Allocator, eolPadding);

            buffer.Clear();
            uint bitsWritten  = 0;
            uint pixelWritten = 0;

            while (bitReader.HasMoreData)
            {
                bitReader.ReadNextRun();

                if (bitReader.RunLength > 0)
                {
                    this.WritePixelRun(buffer, bitReader, bitsWritten);

                    bitsWritten  += bitReader.RunLength;
                    pixelWritten += bitReader.RunLength;
                }

                if (bitReader.IsEndOfScanLine)
                {
                    // Write padding bytes, if necessary.
                    uint pad = 8 - (bitsWritten % 8);
                    if (pad != 8)
                    {
                        BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0);
                        bitsWritten += pad;
                    }

                    pixelWritten = 0;
                }
            }

            // Edge case for when we are at the last byte, but there are still some unwritten pixels left.
            if (pixelWritten > 0 && pixelWritten < this.width)
            {
                bitReader.ReadNextRun();
                this.WritePixelRun(buffer, bitReader, bitsWritten);
            }
        }