mirror of
https://github.com/qpdf/qpdf.git
synced 2024-06-25 23:02:38 +00:00
Significantly improve the code's use of off_t for file offsets, size_t for memory sizes, and integer types in cases where there has to be compatibility with external interfaces. Rework sections of the code that would have prevented qpdf from working on files larger than 2 (or maybe 4) GB in size.
53 lines
1.5 KiB
C++
53 lines
1.5 KiB
C++
#ifndef __PL_PNGFILTER_HH__
|
|
#define __PL_PNGFILTER_HH__
|
|
|
|
// This pipeline applies or reverses the application of a PNG filter
|
|
// as described in the PNG specification.
|
|
|
|
// NOTE: In its initial implementation, it only encodes and decodes
|
|
// filters "none" and "up". The primary motivation of this code is to
|
|
// encode and decode PDF 1.5+ XRef streams which are often encoded
|
|
// with Flate predictor 12, which corresponds to the PNG up filter.
|
|
// At present, the bytes_per_pixel parameter is ignored, and an
|
|
// exception is thrown if any row of the file has a filter of other
|
|
// than 0 or 2. Finishing the implementation would not be difficult.
|
|
// See chapter 6 of the PNG specification for a description of the
|
|
// filter algorithms.
|
|
|
|
#include <qpdf/Pipeline.hh>
|
|
|
|
class Pl_PNGFilter: public Pipeline
|
|
{
|
|
public:
|
|
// Encoding is not presently supported
|
|
enum action_e { a_encode, a_decode };
|
|
|
|
QPDF_DLL
|
|
Pl_PNGFilter(char const* identifier, Pipeline* next,
|
|
action_e action, unsigned int columns,
|
|
unsigned int bytes_per_pixel);
|
|
QPDF_DLL
|
|
virtual ~Pl_PNGFilter();
|
|
|
|
QPDF_DLL
|
|
virtual void write(unsigned char* data, size_t len);
|
|
QPDF_DLL
|
|
virtual void finish();
|
|
|
|
private:
|
|
void processRow();
|
|
void encodeRow();
|
|
void decodeRow();
|
|
|
|
action_e action;
|
|
unsigned int columns;
|
|
unsigned char* cur_row;
|
|
unsigned char* prev_row;
|
|
unsigned char* buf1;
|
|
unsigned char* buf2;
|
|
size_t pos;
|
|
size_t incoming;
|
|
};
|
|
|
|
#endif // __PL_PNGFILTER_HH__
|