mirror of
				https://github.com/JakubMelka/PDF4QT.git
				synced 2025-06-05 21:59:17 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//    Copyright (C) 2019-2020 Jakub Melka
 | 
						|
//
 | 
						|
//    This file is part of Pdf4Qt.
 | 
						|
//
 | 
						|
//    Pdf4Qt is free software: you can redistribute it and/or modify
 | 
						|
//    it under the terms of the GNU Lesser General Public License as published by
 | 
						|
//    the Free Software Foundation, either version 3 of the License, or
 | 
						|
//    (at your option) any later version.
 | 
						|
//
 | 
						|
//    Pdf4Qt is distributed in the hope that it will be useful,
 | 
						|
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
//    GNU Lesser General Public License for more details.
 | 
						|
//
 | 
						|
//    You should have received a copy of the GNU Lesser General Public License
 | 
						|
//    along with Pdf4Qt.  If not, see <https://www.gnu.org/licenses/>.
 | 
						|
 | 
						|
#ifndef PDFCCITTFAXDECODER_H
 | 
						|
#define PDFCCITTFAXDECODER_H
 | 
						|
 | 
						|
#include "pdfutils.h"
 | 
						|
#include "pdfimage.h"
 | 
						|
 | 
						|
namespace pdf
 | 
						|
{
 | 
						|
 | 
						|
struct PDFCCITTCode;
 | 
						|
 | 
						|
struct PDFCCITTFaxDecoderParameters
 | 
						|
{
 | 
						|
    /// Type of encoding. Has this meaning:
 | 
						|
    ///    K < 0 - pure two dimensional encoding (Group 4)
 | 
						|
    ///    K = 0 - pure one dimensional encoding
 | 
						|
    ///    K > 0 - mixed encoding; one dimensional encoded line can be followed by at most K - 1 two dimensional encoded lines
 | 
						|
    PDFInteger K = 0;
 | 
						|
 | 
						|
    /// Pixel width of the image. Default value is 1728.
 | 
						|
    PDFInteger columns = 1728;
 | 
						|
 | 
						|
    /// Pixel height of the image. This value can be zero or be absent, in this case,
 | 
						|
    /// end of block pattern must be present and end the stream.
 | 
						|
    PDFInteger rows = 0;
 | 
						|
 | 
						|
    /// This parameter is ignored in this library. If positive, and \p hasEndOfLine is true,
 | 
						|
    /// and K is nonnegative, then if error occurs, end-of-line pattern is searched and
 | 
						|
    /// data are copied from previous line, or are set to white, if previous line is also damaged.
 | 
						|
    PDFInteger damagedRowsBeforeError = 0;
 | 
						|
 | 
						|
    /// Flag indicating, that end of line patterns are required in the encoded data.
 | 
						|
    /// Stream filter must always accept end of line patterns, but require them only,
 | 
						|
    /// if this flag is set to true.
 | 
						|
    bool hasEndOfLine = false;
 | 
						|
 | 
						|
    /// Flag indicating that lines are byte aligned, i.e. 0 bits are inserted before each line
 | 
						|
    /// to achieve byte alignment.
 | 
						|
    bool hasEncodedByteAlign = false;
 | 
						|
 | 
						|
    /// Flag indicating, that filter expects the data be terminated by end of block bit pattern.
 | 
						|
    /// In this case, \p rows parameter is ignored. Otherwise, rows parameter is used, or image
 | 
						|
    /// is terminated by end of data stream, whichever occurs first. The end of block is marked
 | 
						|
    /// as end-of-facsimile block (EOFB), or return to control (RTC), according the K parameter.
 | 
						|
    bool hasEndOfBlock = true;
 | 
						|
 | 
						|
    /// If this flag is true, then 1 means black pixel, 0 white pixel. Otherwise, if false,
 | 
						|
    /// then 0 means black pixel and 1 white pixel.
 | 
						|
    bool hasBlackIsOne = false;
 | 
						|
 | 
						|
    /// Decode
 | 
						|
    std::vector<PDFReal> decode;
 | 
						|
 | 
						|
    /// Masking type
 | 
						|
    PDFImageData::MaskingType maskingType = PDFImageData::MaskingType::None;
 | 
						|
};
 | 
						|
 | 
						|
enum CCITT_2D_Code_Mode;
 | 
						|
 | 
						|
class PDFCCITTFaxDecoder
 | 
						|
{
 | 
						|
public:
 | 
						|
    explicit PDFCCITTFaxDecoder(const QByteArray* stream, const PDFCCITTFaxDecoderParameters& parameters);
 | 
						|
 | 
						|
    PDFImageData decode();
 | 
						|
 | 
						|
    const PDFBitReader* getReader() const { return &m_reader; }
 | 
						|
 | 
						|
private:
 | 
						|
    /// Skip zero bits at the start
 | 
						|
    void skipFill();
 | 
						|
 | 
						|
    /// Skip end-of-line, if occured. Returns true, if EOL was skipped.
 | 
						|
    bool skipEOL();
 | 
						|
 | 
						|
    /// Skip fill bits and then try to skip EOL. If EOL is found, then
 | 
						|
    /// true is returned, otherwise false is returned.
 | 
						|
    bool skipFillAndEOL() { skipFill(); return skipEOL(); }
 | 
						|
 | 
						|
    /// Add pixels to the line.
 | 
						|
    /// \param line Line with changing element indices
 | 
						|
    /// \param a0_index Reference changing element index (index to the \p line array)
 | 
						|
    /// \param a1 Current changing element index (column index, not index to the \p line array)
 | 
						|
    /// \param isCurrentPixelBlack Are pixels black?
 | 
						|
    /// \param isA1LeftOfA0Allowed Allow a1 to be left of a0 (not a0_index, but line[a0_index], which is a0)
 | 
						|
    void addPixels(std::vector<int>& line, int& a0_index, int a1, bool isCurrentPixelBlack, bool isA1LeftOfA0Allowed);
 | 
						|
 | 
						|
    /// Get 2D mode from the stream
 | 
						|
    CCITT_2D_Code_Mode get2DMode();
 | 
						|
 | 
						|
    uint32_t getRunLength(bool white);
 | 
						|
 | 
						|
    uint32_t getWhiteCode();
 | 
						|
    uint32_t getBlackCode();
 | 
						|
 | 
						|
    uint32_t getCode(const PDFCCITTCode* codes, size_t codeCount);
 | 
						|
 | 
						|
    PDFBitReader m_reader;
 | 
						|
    PDFCCITTFaxDecoderParameters m_parameters;
 | 
						|
};
 | 
						|
 | 
						|
}   // namespace pdf
 | 
						|
 | 
						|
#endif // PDFCCITTFAXDECODER_H
 |