2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-06-25 23:02:38 +00:00
qpdf/libqpdf/qpdf/Pl_PNGFilter.hh
Jay Berkenbilt 5d4cad9c02 ABI change: fix use of off_t, size_t, and integer types
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.
2012-06-20 15:20:26 -04:00

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__