poppler/FlateEncoder.cc | 148 ++++++++++++++++++++++++++++++++++++++++++++++++ poppler/FlateEncoder.h | 73 +++++++++++++++++++++++ 2 files changed, 221 insertions(+)
New commits: commit 1bf0ffdf1c68019515349262a14425c78c90ea18 Author: Adrian Johnson <[email protected]> Date: Thu Feb 25 22:52:32 2016 +1030 Add missing files that got dropped from the previous commit (989ceb6bd90) diff --git a/poppler/FlateEncoder.cc b/poppler/FlateEncoder.cc new file mode 100644 index 0000000..49a0fa3 --- /dev/null +++ b/poppler/FlateEncoder.cc @@ -0,0 +1,148 @@ +//======================================================================== +// +// FlateEncoder.cc +// +// Copyright (C) 2016, William Bader <[email protected]> +// +// This file is under the GPLv2 or later license +// +//======================================================================== + +#include <config.h> + +#ifdef USE_GCC_PRAGMAS +#pragma implementation +#endif + +#include "FlateEncoder.h" + +//------------------------------------------------------------------------ +// FlateEncoder +//------------------------------------------------------------------------ + +FlateEncoder::FlateEncoder(Stream *strA): + FilterStream(strA) +{ + int zlib_status; + + outBufPtr = outBufEnd = outBuf; + inBufEof = outBufEof = gFalse; + + zlib_stream.zalloc = Z_NULL; + zlib_stream.zfree = Z_NULL; + zlib_stream.opaque = Z_NULL; + + zlib_status = deflateInit(&zlib_stream, Z_DEFAULT_COMPRESSION); + + if (zlib_status != Z_OK) { + inBufEof = outBufEof = gTrue; + error(errInternal, -1, "Internal: deflateInit() failed in FlateEncoder::FlateEncoder()"); + } + + zlib_stream.next_out = outBufEnd; + zlib_stream.avail_out = 1; /* anything but 0 to trigger a read */ +} + +FlateEncoder::~FlateEncoder() { + deflateEnd(&zlib_stream); + if (str->isEncoder()) { + delete str; + } +} + +void FlateEncoder::reset() { + int zlib_status; + + str->reset(); + + outBufPtr = outBufEnd = outBuf; + inBufEof = outBufEof = gFalse; + + deflateEnd(&zlib_stream); + + zlib_status = deflateInit(&zlib_stream, Z_DEFAULT_COMPRESSION); + + if (zlib_status != Z_OK) { + inBufEof = outBufEof = gTrue; + error(errInternal, -1, "Internal: deflateInit() failed in FlateEncoder::reset()"); + } + + zlib_stream.next_out = outBufEnd; + zlib_stream.avail_out = 1; /* anything but 0 to trigger a read */ +} + +GBool FlateEncoder::fillBuf() { + int n; + unsigned int starting_avail_out; + int zlib_status; + + /* If the output is done, don't try to read more. */ + + if (outBufEof) { + return gFalse; + } + + /* The output buffer should be empty. */ + /* If it is not empty, push any processed data to the start. */ + + if (outBufPtr > outBuf && outBufPtr < outBufEnd) { + n = outBufEnd - outBufPtr; + memmove(outBuf, outBufPtr, n); + outBufEnd = &outBuf[n]; + } else { + outBufEnd = outBuf; + } + outBufPtr = outBuf; + + /* Keep feeding zlib until we get output. */ + /* zlib might consume a few input buffers */ + /* before it starts producing output. */ + + do { + + /* avail_out > 0 means that zlib has depleted its input */ + /* and needs a new chunk of input in order to generate */ + /* more output. */ + + if (zlib_stream.avail_out != 0) { + + /* Fill the input buffer */ + + n = (inBufEof? 0: str->doGetChars(inBufSize, inBuf)); + + if (n == 0) { + inBufEof = gTrue; + } + + zlib_stream.next_in = inBuf; + zlib_stream.avail_in = n; + } + + /* Ask zlib for output. */ + + zlib_stream.next_out = outBufEnd; + starting_avail_out = &outBuf[ outBufSize ] - outBufEnd; + zlib_stream.avail_out = starting_avail_out; + + zlib_status = deflate(&zlib_stream, (inBufEof? Z_FINISH: Z_NO_FLUSH)); + + if (zlib_status == Z_STREAM_ERROR || + zlib_stream.avail_out < 0 || + zlib_stream.avail_out > starting_avail_out) { + /* Unrecoverable error */ + inBufEof = outBufEof = gTrue; + error(errInternal, -1, "Internal: deflate() failed in FlateEncoder::fillBuf()"); + return gFalse; + } + + } while (zlib_stream.avail_out == outBufSize && !inBufEof); + + outBufEnd = &outBuf[ outBufSize ] - zlib_stream.avail_out; + + if (inBufEof && zlib_stream.avail_out != 0) { + outBufEof = gTrue; + } + + return outBufPtr < outBufEnd; +} + diff --git a/poppler/FlateEncoder.h b/poppler/FlateEncoder.h new file mode 100644 index 0000000..6dee292 --- /dev/null +++ b/poppler/FlateEncoder.h @@ -0,0 +1,73 @@ +//======================================================================== +// +// FlateEncoder.h +// +// Copyright (C) 2016, William Bader <[email protected]> +// +// This file is under the GPLv2 or later license +// +//======================================================================== + +#ifndef FLATEENCODE_H +#define FLATEENCODE_H + +#ifdef USE_GCC_PRAGMAS +#pragma interface +#endif + +#include "poppler-config.h" +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#include <string.h> +#include <ctype.h> +#include "goo/gmem.h" +#include "goo/gfile.h" +#include "Error.h" +#include "Object.h" +#include "Decrypt.h" + +#include "Stream.h" + +extern "C" { +#include <zlib.h> +} + +//------------------------------------------------------------------------ +// FlateEncoder +//------------------------------------------------------------------------ + +class FlateEncoder: public FilterStream { +public: + + FlateEncoder(Stream *strA); + virtual ~FlateEncoder(); + virtual StreamKind getKind() { return strWeird; } + virtual void reset(); + virtual int getChar() + { return (outBufPtr >= outBufEnd && !fillBuf()) ? EOF : (*outBufPtr++ & 0xff); } + virtual int lookChar() + { return (outBufPtr >= outBufEnd && !fillBuf()) ? EOF : (*outBufPtr & 0xff); } + virtual GooString *getPSFilter(int psLevel, const char *indent) { return NULL; } + virtual GBool isBinary(GBool last = gTrue) { return gTrue; } + virtual GBool isEncoder() { return gTrue; } + +private: + + static const int inBufSize = 16384; + static const int outBufSize = inBufSize; + Guchar inBuf[ inBufSize ]; + Guchar outBuf[ outBufSize ]; + Guchar *outBufPtr; + Guchar *outBufEnd; + GBool inBufEof; + GBool outBufEof; + z_stream zlib_stream; + + GBool fillBuf(); +}; + +#endif _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
