[poppler] [PATCH] reimplement FlateStream using zlib
Albert Astals Cid
tsdgeos at yahoo.es
Sun Apr 24 14:48:00 PDT 2005
Using your benchmark program and [the obviously wrong program to check
performance called] time, PDFReference1.6 renders 0.5 secons SLOWLIER using
zlib than using poppler native code.
Tomorrow i'll try to run callgrind on it to get more accurate figures.
Albert
A Diumenge 24 Abril 2005 21:25, Jeff Muizelaar va escriure:
> Turns out the first patch was completely broken. Here is a fixed one.
>
> -Jeff
>
>
> diff -X /home/jeff/rsrc/autoignore -urN cvs/configure.ac flate/configure.ac
> --- cvs/configure.ac 2005-04-22 20:09:05 -0400
> +++ flate/configure.ac 2005-04-24 14:23:04 -0400
> @@ -82,6 +82,34 @@
> AC_DEFINE(HAVE_FSEEK64)
> fi
>
> +dnl Test for zlib
> +AC_ARG_ENABLE(zlib,
> + AC_HELP_STRING([--disable-zlib],
> + [Don't build against zlib.]),
> + enable_zlib=$enableval,
> + enable_zlib="try")
> +if test x$enable_zlib = xyes; then
> + AC_CHECK_LIB([z], [inflate],,
> + AC_MSG_ERROR("*** zlib library not found ***"))
> + AC_CHECK_HEADERS([zlib.h],,
> + AC_MSG_ERROR("*** zlib headers not found ***"))
> +elif test x$enable_zlib = xtry; then
> + AC_CHECK_LIB([z], [inflate],
> + [enable_zlib="yes"],
> + [enable_zlib="no"])
> + AC_CHECK_HEADERS([zlib.h],,
> + [enable_zlib="no"])
> +fi
> +
> +if test x$enable_zlib = xyes; then
> + ZLIB_LIBS="-lz"
> + AC_SUBST(ZLIB_LIBS)
> + AC_DEFINE(ENABLE_ZLIB)
> +fi
> +
> +AM_CONDITIONAL(BUILD_ZLIB, test x$enable_zlib = xyes)
> +AH_TEMPLATE([ENABLE_ZLIB],
> + [Use zlib instead of builtin zlib decoder.])
>
> dnl Test for libjpeg
> AC_ARG_ENABLE(libjpeg,
> @@ -314,3 +342,4 @@
> echo " qt wrapper: $enable_poppler_qt"
> echo " glib wrapper: $enable_poppler_glib"
> echo " use libjpeg: $enable_libjpeg"
> +echo " use zlib: $enable_zlib"
> diff -X /home/jeff/rsrc/autoignore -urN cvs/poppler/FlateStream.cc
> flate/poppler/FlateStream.cc --- cvs/poppler/FlateStream.cc 1969-12-31
> 19:00:00 -0500
> +++ flate/poppler/FlateStream.cc 2005-04-24 15:15:33 -0400
> @@ -0,0 +1,114 @@
> +//========================================================================
> +//
> +// FlateStream.cc
> +//
> +// Copyright (C) 2005, Net Integration Technologies, Inc.
> +//
> +//========================================================================
> +#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;
> + eof = false;
> + memset(&d_stream, 0, sizeof(d_stream));
> + d_stream.avail_out = sizeof(out_buf);
> + d_stream.next_out = out_buf;
> +}
> +
> +FlateStream::~FlateStream() {
> + inflateEnd(&d_stream);
> + delete str;
> +}
> +
> +void FlateStream::reset() {
> + //FIXME: what are the semantics of reset?
> + //i.e. how much intialization has to happen in the constructor?
> + str->reset();
> + memset(&d_stream, 0, sizeof(d_stream));
> + inflateInit(&d_stream);
> + d_stream.avail_out = sizeof(out_buf);
> + d_stream.next_out = out_buf;
> + d_stream.avail_in = 0;
> + status = Z_OK;
> + out_pos = 0;
> + out_buf_len = 0;
> +}
> +
> +int FlateStream::getRawChar() {
> + int ret;
> +
> + if (eof)
> + return EOF;
> +
> + fill_buffer();
> + ret = out_buf[out_pos++];
> +
> + if (out_pos >= out_buf_len) {
> + if (status == Z_STREAM_END)
> + eof = true;
> + d_stream.avail_out = sizeof(out_buf);
> + d_stream.next_out = out_buf;
> + out_pos = 0;
> + }
> +
> + return ret;
> +}
> +
> +int FlateStream::getChar() {
> + if (pred)
> + return pred->getChar();
> + else
> + return getRawChar();
> +}
> +
> +int FlateStream::lookChar() {
> + if (pred)
> + return pred->lookChar();
> +
> + if (eof)
> + return EOF;
> +
> + if (out_pos == 0)
> + fill_buffer();
> +
> + return out_buf[out_pos];
> +}
> +
> +void FlateStream::fill_buffer() {
> + /* 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;
> + }
> + while (d_stream.avail_out && d_stream.avail_in && (status == Z_OK ||
> status == Z_BUF_ERROR)) { + status = inflate(&d_stream, Z_SYNC_FLUSH);
> + }
> + out_buf_len = sizeof(out_buf) - d_stream.avail_out;
> +}
> +
> +GooString *FlateStream::getPSFilter(int psLevel, 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);
> +}
> diff -X /home/jeff/rsrc/autoignore -urN cvs/poppler/FlateStream.h
> flate/poppler/FlateStream.h --- cvs/poppler/FlateStream.h 1969-12-31
> 19:00:00 -0500
> +++ flate/poppler/FlateStream.h 2005-04-24 15:15:45 -0400
> @@ -0,0 +1,69 @@
> +//========================================================================
> +//
> +// FlateStream.h
> +//
> +// Copyright (C) 2005, Net Integration Technologies, Inc.
> +//
> +//========================================================================
> +
> +#ifndef FLATESTREAM_H
> +#define FLATESTREAM_H
> +#include <config.h>
> +
> +#ifdef USE_GCC_PRAGMAS
> +#pragma interface
> +#endif
> +
> +
> +#ifdef USE_GCC_PRAGMAS
> +#pragma implementation
> +#endif
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stddef.h>
> +#ifndef WIN32
> +#include <unistd.h>
> +#endif
> +#include <string.h>
> +#include <ctype.h>
> +#include "goo/gmem.h"
> +#include "goo/gfile.h"
> +#include "poppler-config.h"
> +#include "Error.h"
> +#include "Object.h"
> +#ifndef NO_DECRYPTION
> +#include "Decrypt.h"
> +#endif
> +#include "Stream.h"
> +
> +extern "C" {
> +#include <zlib.h>
> +}
> +
> +class FlateStream: public FilterStream {
> +public:
> +
> + FlateStream(Stream *strA, int predictor, int columns, int colors, int
> bits); + virtual ~FlateStream();
> + virtual StreamKind getKind() { return strFlate; }
> + virtual void reset();
> + virtual int getChar();
> + virtual int lookChar();
> + virtual int getRawChar();
> + virtual GooString *getPSFilter(int psLevel, char *indent);
> + virtual GBool isBinary(GBool last = gTrue);
> +
> +private:
> + void fill_buffer(void);
> + z_stream d_stream;
> + StreamPredictor *pred;
> + int status;
> + bool eof;
> + unsigned char in_buf[4096];
> + unsigned char out_buf[4096];
> + int out_pos;
> + int out_buf_len;
> +};
> +
> +#endif
> diff -X /home/jeff/rsrc/autoignore -urN cvs/poppler/Makefile.am
> flate/poppler/Makefile.am --- cvs/poppler/Makefile.am 2005-04-12 11:37:39
> -0400
> +++ flate/poppler/Makefile.am 2005-04-24 14:05:21 -0400
> @@ -49,6 +49,17 @@
>
> endif
>
> +if BUILD_ZLIB
> +
> +zlib_sources = \
> + FlateStream.h \
> + FlateStream.cc
> +
> +zlib_libs = \
> + $(ZLIB_LIBS)
> +
> +endif
> +
> INCLUDES = \
> -I$(top_srcdir) \
> $(splash_includes) \
> @@ -62,7 +73,8 @@
> $(top_builddir)/fofi/libfofi.la \
> $(splash_libs) \
> $(cairo_libs) \
> - $(libjpeg_libs)
> + $(libjpeg_libs) \
> + $(zlib_libs)
>
> poppler_includedir = $(includedir)/poppler
> poppler_include_HEADERS = \
> @@ -119,6 +131,7 @@
> $(splash_sources) \
> $(cairo_sources) \
> $(libjpeg_sources) \
> + $(zlib_sources) \
> Annot.cc \
> Array.cc \
> BuiltinFont.cc \
> @@ -156,4 +169,4 @@
> PSOutputDev.cc \
> TextOutputDev.cc \
> PageLabelInfo.h \
> - PageLabelInfo.cc
> + PageLabelInfo.cc
> diff -X /home/jeff/rsrc/autoignore -urN cvs/poppler/Stream.cc
> flate/poppler/Stream.cc --- cvs/poppler/Stream.cc 2005-03-11 16:42:52 -0500
> +++ flate/poppler/Stream.cc 2005-04-24 15:23:32 -0400
> @@ -37,6 +37,10 @@
> #include "DCTStream.h"
> #endif
>
> +#ifdef ENABLE_ZLIB
> +#include "FlateStream.h"
> +#endif
> +
> #ifdef __DJGPP__
> static GBool setDJSYSFLAGS = gFalse;
> #endif
> @@ -3185,6 +3189,7 @@
>
> #endif
>
> +#ifndef ENABLE_ZLIB
> //------------------------------------------------------------------------
> // FlateStream
> //------------------------------------------------------------------------
> @@ -3715,6 +3720,7 @@
> codeSize -= bits;
> return c;
> }
> +#endif
>
> //------------------------------------------------------------------------
> // EOFStream
> diff -X /home/jeff/rsrc/autoignore -urN cvs/poppler/Stream.h
> flate/poppler/Stream.h --- cvs/poppler/Stream.h 2005-03-11 16:42:52 -0500
> +++ flate/poppler/Stream.h 2005-04-24 15:16:01 -0400
> @@ -635,6 +635,7 @@
> };
> #endif
>
> +#ifndef ENABLE_ZLIB
> //------------------------------------------------------------------------
> // FlateStream
> //------------------------------------------------------------------------
> @@ -709,6 +710,7 @@
> int getHuffmanCodeWord(FlateHuffmanTab *tab);
> int getCodeWord(int bits);
> };
> +#endif
>
> //------------------------------------------------------------------------
> // EOFStream
> _______________________________________________
> poppler mailing list
> poppler at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/poppler
More information about the poppler
mailing list