summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc128
1 files changed, 128 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc b/Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc
new file mode 100644
index 00000000000..7990dadd821
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.24.4/poppler/FlateStream.cc
@@ -0,0 +1,128 @@
+//========================================================================
+//
+// FlateStream.cc
+//
+// Copyright (C) 2005, Jeff Muizelaar <jeff@infidigm.net>
+// Copyright (C) 2010, Albert Astals Cid <aacid@kde.org>
+//
+// This file is under the GPLv2 or later license
+//
+//========================================================================
+#include "FlateStream.h"
+FlateStream::FlateStream(Stream *strA, int predictor, int columns, int colors, int bits) :
+ FilterStream(strA)
+{
+ if (predictor != 1) {
+ pred = new StreamPredictor(this, predictor, columns, colors, bits);
+ } else {
+ pred = NULL;
+ }
+ out_pos = 0;
+ memset(&d_stream, 0, sizeof(d_stream));
+ inflateInit(&d_stream);
+}
+
+FlateStream::~FlateStream() {
+ inflateEnd(&d_stream);
+ delete pred;
+ delete str;
+}
+
+void FlateStream::reset() {
+ //FIXME: what are the semantics of reset?
+ //i.e. how much intialization has to happen in the constructor?
+
+ /* reinitialize zlib */
+ inflateEnd(&d_stream);
+ memset(&d_stream, 0, sizeof(d_stream));
+ inflateInit(&d_stream);
+
+ str->reset();
+ d_stream.avail_in = 0;
+ status = Z_OK;
+ out_pos = 0;
+ out_buf_len = 0;
+}
+
+int FlateStream::getRawChar() {
+ return doGetRawChar();
+}
+
+void FlateStream::getRawChars(int nChars, int *buffer) {
+ for (int i = 0; i < nChars; ++i)
+ buffer[i] = doGetRawChar();
+}
+
+int FlateStream::getChar() {
+ if (pred)
+ return pred->getChar();
+ else
+ return getRawChar();
+}
+
+int FlateStream::lookChar() {
+ if (pred)
+ return pred->lookChar();
+
+ if (fill_buffer())
+ return EOF;
+
+ return out_buf[out_pos];
+}
+
+int FlateStream::fill_buffer() {
+ /* only fill the buffer if it has all been used */
+ if (out_pos >= out_buf_len) {
+ /* check if the flatestream has been exhausted */
+ if (status == Z_STREAM_END) {
+ return -1;
+ }
+
+ /* set to the begining of out_buf */
+ d_stream.avail_out = sizeof(out_buf);
+ d_stream.next_out = out_buf;
+ out_pos = 0;
+
+ while (1) {
+ /* buffer is empty so we need to fill it */
+ if (d_stream.avail_in == 0) {
+ int c;
+ /* read from the source stream */
+ while (d_stream.avail_in < sizeof(in_buf) && (c = str->getChar()) != EOF) {
+ in_buf[d_stream.avail_in++] = c;
+ }
+ d_stream.next_in = in_buf;
+ }
+
+ /* keep decompressing until we can't anymore */
+ if (d_stream.avail_out == 0 || d_stream.avail_in == 0 || (status != Z_OK && status != Z_BUF_ERROR))
+ break;
+ status = inflate(&d_stream, Z_SYNC_FLUSH);
+ }
+
+ out_buf_len = sizeof(out_buf) - d_stream.avail_out;
+ if (status != Z_OK && status != Z_STREAM_END)
+ return -1;
+ if (!out_buf_len)
+ return -1;
+ }
+
+ return 0;
+}
+
+GooString *FlateStream::getPSFilter(int psLevel, const char *indent) {
+ GooString *s;
+
+ if (psLevel < 3 || pred) {
+ return NULL;
+ }
+ if (!(s = str->getPSFilter(psLevel, indent))) {
+ return NULL;
+ }
+ s->append(indent)->append("<< >> /FlateDecode filter\n");
+ return s;
+}
+
+GBool FlateStream::isBinary(GBool last) {
+ return str->isBinary(gTrue);
+}