[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