[poppler] [PATCH 4/5] use libjpeg for DCTStream
Jeff Muizelaar
jrmuizel at nit.ca
Fri Mar 4 11:35:15 PST 2005
This patch has auto* stuff that is really rough
2005-03-02 Jeff Muizelaar <jrmuizel at nit.ca>
* configure.ac: Add check for libjpeg.
* DCTStream.cc, DCTStream.h, Stream.cc, Stream.h, Makefile.am:
Conditionally use libjpeg instead of xpdf jpeg decoder.
diff -rupN 05-mask-getline/configure.ac 06-libjpeg/configure.ac
--- 05-mask-getline/configure.ac 2005-03-01 14:20:23.000000000 -0500
+++ 06-libjpeg/configure.ac 2005-03-02 17:01:35.000000000 -0500
@@ -82,6 +82,31 @@ if test "$xpdf_cv_func_fseek64" = yes -a
AC_DEFINE(HAVE_FSEEK64)
fi
+dnl Test for libjpeg
+LIBJPEG_LIBS=
+AC_CHECK_LIB(jpeg, jpeg_destroy_decompress,
+ jpeg_ok=yes,
+ jpeg_ok=no
+ AC_MSG_WARN(*** JPEG loader will not be built (JPEG library not found) ***))
+if test "$jpeg_ok" = yes; then
+ AC_MSG_CHECKING([for jpeglib.h])
+ AC_TRY_CPP(
+[#include <stdio.h>
+#undef PACKAGE
+#undef VERSION
+#undef HAVE_STDLIB_H
+#include <jpeglib.h>],
+ jpeg_ok=yes,
+ jpeg_ok=no)
+ AC_MSG_RESULT($jpeg_ok)
+ if test "$jpeg_ok" = yes; then
+ LIBJPEG_LIBS="-ljpeg"
+ fi
+else
+ AC_MSG_WARN(*** JPEG loader will not be built (JPEG header file not found) ***)
+fi
+AC_SUBST(LIBJPEG_LIBS)
+
dnl Check for freetype headers
FREETYPE_LIBS=
FREETYPE_CFLAGS=
@@ -118,6 +143,15 @@ if test x$enable_cairo_output = xyes; th
PKG_CHECK_MODULES(CAIRO, cairo >= 0.3)
fi
+AC_ARG_ENABLE(libjpeg,
+ AC_HELP_STRING([--disable-libjpeg],
+ [Don't build against libjpeg.]),,
+ enable_libjpeg="yes")
+AM_CONDITIONAL(BUILD_LIBJPEG, test x$enable_libjpeg = xyes)
+if test x$enable_libjpeg = xno; then
+ AC_DEFINE([DISABLE_LIBJPEG], [1], [Disable libjpeg support.])
+fi
+
AC_ARG_ENABLE(gtk-test,
AC_HELP_STRING([--disable-gtk-test],
[Don't compile GTK+ test program.]),,
diff -rupN 05-mask-getline/poppler/DCTStream.cc 06-libjpeg/poppler/DCTStream.cc
--- 05-mask-getline/poppler/DCTStream.cc 1969-12-31 19:00:00.000000000 -0500
+++ 06-libjpeg/poppler/DCTStream.cc 2005-03-02 17:26:49.000000000 -0500
@@ -0,0 +1,104 @@
+#include "DCTStream.h"
+
+#ifndef DISABLE_LIBJPEG
+static void str_init_source(j_decompress_ptr cinfo)
+{
+}
+
+static boolean str_fill_input_buffer(j_decompress_ptr cinfo)
+{
+ struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
+ src->buffer = src->str->getChar();
+ src->pub.next_input_byte = &src->buffer;
+ src->pub.bytes_in_buffer = 1;
+ return TRUE;
+}
+
+static void str_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+ struct str_src_mgr * src = (struct str_src_mgr *)cinfo->src;
+ if (num_bytes > 0) {
+ while (num_bytes > (long) src->pub.bytes_in_buffer) {
+ num_bytes -= (long) src->pub.bytes_in_buffer;
+ str_fill_input_buffer(cinfo);
+ }
+ src->pub.next_input_byte += (size_t) num_bytes;
+ src->pub.bytes_in_buffer -= (size_t) num_bytes;
+ }
+}
+
+static void str_term_source(j_decompress_ptr cinfo)
+{
+}
+
+DCTStream::DCTStream(Stream *strA):
+ FilterStream(strA) {
+
+ jpeg_create_decompress(&cinfo);
+ src.pub.init_source = str_init_source;
+ src.pub.fill_input_buffer = str_fill_input_buffer;
+ src.pub.skip_input_data = str_skip_input_data;
+ src.pub.resync_to_restart = jpeg_resync_to_restart;
+ src.pub.term_source = str_term_source;
+ src.pub.bytes_in_buffer = 0;
+ src.pub.next_input_byte = NULL;
+ src.str = str;
+ cinfo.src = (jpeg_source_mgr *)&src;
+ cinfo.err = jpeg_std_error(&jerr);
+ x = 0;
+}
+
+DCTStream::~DCTStream() {
+ jpeg_destroy_decompress(&cinfo);
+ delete str;
+}
+
+void DCTStream::reset() {
+ int row_stride;
+
+ str->reset();
+ jpeg_read_header(&cinfo, TRUE);
+ jpeg_start_decompress(&cinfo);
+
+ row_stride = cinfo.output_width * cinfo.output_components;
+ row_buffer = cinfo.mem->alloc_sarray((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
+}
+
+int DCTStream::getChar() {
+ int c;
+
+ if (x == 0) {
+ if (cinfo.output_scanline < cinfo.output_height)
+ jpeg_read_scanlines(&cinfo, row_buffer, 1);
+ else return EOF;
+ }
+ c = row_buffer[0][x];
+ x++;
+ if (x == cinfo.output_width * cinfo.output_components)
+ x = 0;
+ return c;
+}
+
+int DCTStream::lookChar() {
+ int c;
+ c = row_buffer[0][x];
+ return c;
+}
+
+GooString *DCTStream::getPSFilter(int psLevel, char *indent) {
+ GooString *s;
+
+ if (psLevel < 2) {
+ return NULL;
+ }
+ if (!(s = str->getPSFilter(psLevel, indent))) {
+ return NULL;
+ }
+ s->append(indent)->append("<< >> /DCTDecode filter\n");
+ return s;
+}
+
+GBool DCTStream::isBinary(GBool last) {
+ return str->isBinary(gTrue);
+}
+#endif
diff -rupN 05-mask-getline/poppler/DCTStream.h 06-libjpeg/poppler/DCTStream.h
--- 05-mask-getline/poppler/DCTStream.h 1969-12-31 19:00:00.000000000 -0500
+++ 06-libjpeg/poppler/DCTStream.h 2005-03-02 17:10:50.000000000 -0500
@@ -0,0 +1,71 @@
+//========================================================================
+//
+// DCTStream.h
+//
+// Copyright 1996-2003 Glyph & Cog, LLC
+//
+//========================================================================
+
+#ifndef DCTSTREAM_H
+#define DCTSTREAM_H
+#include <config.h>
+#ifndef DISABLE_LIBJPEG
+
+#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"
+
+#include <jpeglib.h>
+
+struct str_src_mgr {
+ struct jpeg_source_mgr pub;
+ JOCTET buffer;
+ Stream *str;
+};
+
+
+class DCTStream: public FilterStream {
+public:
+
+ DCTStream(Stream *strA);
+ virtual ~DCTStream();
+ virtual StreamKind getKind() { return strDCT; }
+ virtual void reset();
+ virtual int getChar();
+ virtual int lookChar();
+ virtual GooString *getPSFilter(int psLevel, char *indent);
+ virtual GBool isBinary(GBool last = gTrue);
+ Stream *getRawStream() { return str; }
+
+private:
+ int x;
+ struct jpeg_decompress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+ struct str_src_mgr src;
+ JSAMPARRAY row_buffer;
+};
+#endif //DISABLE_LIBJPEG
+#endif
diff -rupN 05-mask-getline/poppler/Makefile.am 06-libjpeg/poppler/Makefile.am
--- 05-mask-getline/poppler/Makefile.am 2005-03-01 14:50:48.000000000 -0500
+++ 06-libjpeg/poppler/Makefile.am 2005-03-02 15:58:36.000000000 -0500
@@ -34,6 +34,11 @@ cairo_libs = \
endif
+if BUILD_LIBJPEG
+libjpeg_libs = \
+ $(LIBJPEG_LIBS)
+
+endif
INCLUDES = \
-I$(top_srcdir) \
@@ -46,7 +51,8 @@ libpoppler_la_LIBADD = \
$(top_builddir)/goo/libgoo.la \
$(top_builddir)/fofi/libfofi.la \
$(splash_libs) \
- $(cairo_libs)
+ $(cairo_libs) \
+ $(libjpeg_libs)
poppler_includedir = $(includedir)/poppler
poppler_include_HEADERS = \
@@ -62,6 +68,7 @@ poppler_include_HEADERS = \
CMap.h \
Decrypt.h \
Dict.h \
+ DCTStream.h \
Error.h \
FontEncodingTables.h \
Function.cc \
@@ -109,6 +116,7 @@ libpoppler_la_SOURCES = \
Catalog.cc \
CharCodeToUnicode.cc \
CMap.cc \
+ DCTStream.cc \
Decrypt.cc \
Dict.cc \
Error.cc \
diff -rupN 05-mask-getline/poppler/Stream.cc 06-libjpeg/poppler/Stream.cc
--- 05-mask-getline/poppler/Stream.cc 2005-03-01 15:02:08.000000000 -0500
+++ 06-libjpeg/poppler/Stream.cc 2005-03-02 17:13:26.000000000 -0500
@@ -31,6 +31,7 @@
#include "Stream.h"
#include "JBIG2Stream.h"
#include "JPXStream.h"
+#include "DCTStream.h"
#include "Stream-CCITT.h"
#ifdef __DJGPP__
@@ -1785,7 +1786,7 @@ GooString *CCITTFaxStream::getPSFilter(i
GBool CCITTFaxStream::isBinary(GBool last) {
return str->isBinary(gTrue);
}
-
+#ifdef DISABLE_LIBJPEG
//------------------------------------------------------------------------
// DCTStream
//------------------------------------------------------------------------
@@ -3176,7 +3177,7 @@ GooString *DCTStream::getPSFilter(int ps
GBool DCTStream::isBinary(GBool last) {
return str->isBinary(gTrue);
}
-
+#endif
//------------------------------------------------------------------------
// FlateStream
//------------------------------------------------------------------------
diff -rupN 05-mask-getline/poppler/Stream.h 06-libjpeg/poppler/Stream.h
--- 05-mask-getline/poppler/Stream.h 2005-03-01 15:03:08.000000000 -0500
+++ 06-libjpeg/poppler/Stream.h 2005-03-02 17:27:39.000000000 -0500
@@ -531,7 +531,7 @@ private:
short lookBits(int n);
void eatBits(int n) { inputBits -= n; }
};
-
+#if DISABLE_LIBJPEG
//------------------------------------------------------------------------
// DCTStream
//------------------------------------------------------------------------
@@ -632,7 +632,7 @@ private:
int readMarker();
int read16();
};
-
+#endif
//------------------------------------------------------------------------
// FlateStream
//------------------------------------------------------------------------
More information about the poppler
mailing list