--- /dev/null
+diff -Nur poppler.0_5_0/ChangeLog poppler.HEAD/ChangeLog
+--- poppler.0_5_0/ChangeLog 2006-01-11 17:52:58.000000000 +0100
++++ poppler.HEAD/ChangeLog 2006-02-23 23:26:05.000000000 +0100
+@@ -1,3 +1,240 @@
++2006-02-23 Albert Astals Cid <aacid@kde.org>
++
++ * utils/Makefile.am: Do not build pdftoppm when SplashOutputDev is
++ disabled as that does not work
++
++2006-02-18 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/CairoOutputDev.cc:
++ * poppler/CairoOutputDev.h:
++ * poppler/GfxState.cc:
++ * poppler/GfxState.h: Add support for drawSoftMaskedImage to
++ CairoOutputDev. Ugly but works.
++
++2006-02-16 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/CairoOutputDev.cc: Work around cairo bug when scaling
++ 1x1 bitmaps. Fixes #3387. Also gives a performance improvement.
++
++2006-02-16 Albert Astals Cid <aacid@kde.org>
++
++ * qt4/src/Makefile.am:
++ * qt/Makefile.am:
++ * poppler/Makefile.am:
++ * glib/Makefile.am: Update soname as we are not really compatible
++ anymore with previous releases that had soname 0.0.0
++
++2006-02-13 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/ArthurOutputDev.cc: Make it compile after changing code so
++ we did not pass files to freetype but buffers
++
++2006-02-13 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/PSOutputDev.cc: Commit setupExternalCIDTrueTypeFont patch
++ kpdf got from Takashi Iwai (SuSe) a long time ago
++
++2006-02-06 Albert Astals Cid <aacid@kde.org>
++
++ * configure.ac:
++ * goo/FixedPoint.h:
++ * splash/Splash.cc:
++ * splash/SplashTypes.h: Various fixes from Frank Meerkötter to enable
++ fixedpoint arithmetic
++
++2006-02-06 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/Annot.cc: Fix small leaks
++ * poppler/JBIG2Stream.cc: Remove check improving as really did not
++ improve anything
++
++2006-02-05 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/Gfx.cc: Fix small leak
++ * poppler/GfxFont.cc: I needed that guard in kpdf to fix a crash and
++ it surely does not hurt
++ * poppler/JBIG2Stream.cc: Improve check (comes from kpdf)
++ * poppler/SplashOutputDev.cc: Unneeded var--
++
++2006-02-04 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/Gfx.cc:
++ * poppler/OutputDev.cc:
++ * poppler/OutputDev.h: Let output devices know about pdf grouping
++ operators.
++ Patch by Thorkild Stray.
++
++2006-02-04 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/GlobalParams.cc: Check all fonts returned by fontconfig.
++ Discard the ones that are not truetype or type1. Fixes #5758.
++ Patch by Ed Catmur.
++
++2006-02-04 Albert Astals Cid <aacid@kde.org>
++
++ * utils/Makefile.am:
++ * utils/pdftoppm.cc: Actually create pdftoppm patch by Stefan
++ Schweizer
++ * utils/pdf2xml.dtd: Added a DTD of the xml pdftohtml creates patch by
++ Stefan Schweizer
++ * poppler/SplashOutputDev.cc: Remove bug from "do not use an external
++ file to pass fonts to Freetype" patch, patch by Stefan Schweizer
++
++
++2006-02-02 Albert Astals Cid <aacid@kde.org>
++
++ * splash/SplashXPathScanner.cc: CVE-2006-0301 fix by Derek (xpdf man
++ itslef) got though Dirk Mueller of KDE security team
++
++2006-02-02 Albert Astals Cid <aacid@kde.org>
++
++ * fofi/FoFiTrueType.cc:
++ * fofi/FoFiTrueType.h:
++ * fofi/FoFiType1C.h:
++ * goo/gfile.cc:
++ * poppler/GfxFont.cc:
++ * poppler/GfxFont.h:
++ * poppler/GlobalParams.cc:
++ * poppler/GlobalParams.h:
++ * poppler/SplashOutputDev.cc:
++ * splash/SplashFTFontEngine.cc:
++ * splash/SplashFTFontEngine.h:
++ * splash/SplashFTFontFile.cc:
++ * splash/SplashFTFontFile.h:
++ * splash/SplashFontEngine.cc:
++ * splash/SplashFontEngine.h:
++ * splash/SplashFontFile.cc:
++ * splash/SplashFontFile.h:
++ * splash/SplashT1FontEngine.cc:
++ * splash/SplashT1FontFile.cc:
++ * splash/SplashT1FontFile.h: Merge patch to not use external file
++ when passing the font to Freetype, original patch by Takashi Iwai
++ adapted by me to kpdf rediffed by Stefan Schweizer against poppler
++ cvs
++
++2006-01-31 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/GlobalParams.cc (GlobalParams::getDisplayFont):
++ Allow ttc fonts to be used.
++
++2006-01-28 Jeff Muizelaar <jeff@infidigm.net>
++
++ * glib/poppler-attachment.h: fix compile by adding <time.h> include.
++ Acked-by: Jonathan Blanford <jrb@redhat.com>
++
++2006-01-26 Kristian Høgsberg <krh@redhat.com>
++
++ * poppler/CairoOutputDev.cc: Patch from Christian Krause; handle
++ 0-width lines (#5545).
++
++Tue Jan 24 01:19:40 2006 Jonathan Blandford <jrb@redhat.com>
++
++ * glib/Makefile.am:
++ * glib/poppler-attachment.cc:
++ * glib/poppler-attachment.h:
++ * glib/poppler-document.cc:
++ * glib/poppler-document.h:
++ * glib/poppler-page.cc:
++ * glib/poppler-private.h:
++ * glib/poppler.h:
++ * glib/test-poppler-glib.c:
++ * glib/reference/tmpl/poppler-enums.sgml:
++ * glib/reference/tmpl/poppler-unused.sgml: glib bindings for the
++ embedded file support. It doesn't support mtime and ctime yet,
++ but the rest works.
++
++2006-01-23 Kristian Høgsberg <krh@redhat.com>
++
++ * configure.ac:
++ * poppler/GlobalParams.cc:
++ * poppler/poppler-config.h.in:
++ * utils/pdftohtml.cc:
++ * utils/pdftops.cc: Respect command line paper size settings (#5641).
++ Drop the built-in paper sizes.
++
++2006-01-23 Kristian Høgsberg <krh@redhat.com>
++
++ * glib/test-poppler-glib.c (print_document_info, print_index):
++ Move variable declarations to top (#5692).
++
++ * utils/*.cc: Move config.h #include to top of #include's (#5693).
++
++ * splash/SplashFTFont.cc: Don't use deprecated freetype include
++ files.
++
++2006-01-21 Jeff Muizelaar <jeff@infidigm.net>
++
++ * TODO: Add my todo list.
++
++2006-01-18 Albert Astals Cid <aacid@kde.org>
++
++ * glib/poppler-action.cc:
++ * glib/poppler-document.cc:
++ * poppler/Annot.cc:
++ * poppler/Catalog.cc:
++ * poppler/Catalog.h:
++ * poppler/Dict.cc:
++ * poppler/Dict.h:
++ * poppler/FontInfo.cc:
++ * poppler/Function.cc:
++ * poppler/Gfx.cc:
++ * poppler/GfxFont.cc:
++ * poppler/GfxState.cc:
++ * poppler/Link.cc:
++ * poppler/Link.h:
++ * poppler/Makefile.am:
++ * poppler/Object.h:
++ * poppler/Outline.cc:
++ * poppler/PDFDoc.cc:
++ * poppler/PDFDoc.h:
++ * poppler/PSOutputDev.cc:
++ * poppler/Page.cc:
++ * poppler/PageLabelInfo.cc:
++ * poppler/Parser.cc:
++ * poppler/SecurityHandler.cc:
++ * poppler/Stream.cc:
++ * poppler/XRef.cc:
++ * qt/poppler-document.cc:
++ * qt/poppler-page-transition.cc:
++ * qt4/src/Makefile.am:
++ * qt4/src/poppler-document.cc:
++ * qt4/src/poppler-private.h:
++ * qt4/src/poppler-qt4.h:
++ * qt4/tests/Makefile.am:
++ * utils/HtmlOutputDev.cc:
++ * utils/pdffonts.cc:
++ * utils/pdfinfo.cc:
++ * utils/pdftohtml.cc:
++ * utils/pdftotext.cc: Brad patch for embedded document extraction,
++ only has Qt4 bindings for now, needs Qt3 and glib work
++
++2006-01-18 Albert Astals Cid <aacid@kde.org>
++
++ * qt/poppler-page-transition.h:
++ * qt4/src/Doxyfile: Add some more documentation to PageTransition,
++ patch by Stefan Kebekus
++
++2006-01-18 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/CharCodeToUnicode.cc: Fix check for length that was not
++ having into account that there could be \n or \r in tokens an that
++ those do not have to be took into account. Fixes
++ http://bugs.kde.org/show_bug.cgi?id=120310
++
++2006-01-17 Albert Astals Cid <aacid@kde.org>
++
++ * poppler/Lexer.cc:
++ * poppler/Lexer.h:
++ * poppler/Parser.cc:
++ * poppler/Parser.h:
++ * poppler/XRef.cc:
++ * poppler/XRef.h: When doing the parsing check with XREF we did not
++ grow too much. Fixes serialata10a.pdf
++
++2006-01-12 Jeff Muizelaar <jeff@infidigm.net>
++
++ * poppler/GlobalParams.cc: Make buildFcPattern() static.
++
+ 2006-01-11 Kristian Høgsberg <krh@redhat.com>
+
+ * poppler/JBIG2Stream.cc:
+diff -Nur poppler.0_5_0/configure.ac poppler.HEAD/configure.ac
+--- poppler.0_5_0/configure.ac 2006-01-06 11:05:58.000000000 +0100
++++ poppler.HEAD/configure.ac 2006-02-06 21:49:21.000000000 +0100
+@@ -17,7 +17,6 @@
+ AC_CHECK_FUNC(gettimeofday, AC_DEFINE(HAVE_GETTIMEOFDAY, 1, [Defines if gettimeofday is available on your system]))
+
+ dnl Enable these unconditionally.
+-AC_DEFINE([A4_PAPER], [1], [Default to A4 paper.])
+ AC_DEFINE([OPI_SUPPORT], [1], [Generate OPI comments in PS output.])
+ AC_DEFINE([MULTITHREADED], [1], [Enable multithreading support.])
+ AC_DEFINE([TEXTOUT_WORD_LIST], [1], [Enable word list support.])
+@@ -32,7 +31,7 @@
+
+ AC_ARG_ENABLE(fixedpoint,
+ [ --enable-fixedpoint use fixed point (instead of floating point) arithmetic],
+-AC_DEFINE(USE_FIXEDPOINT, [], [Use fixed point arithmetic]))
++AC_DEFINE(USE_FIXEDPOINT, [1], [Use fixed point arithmetic]))
+
+ dnl ##### Path to xpdfrc.
+ dnl This ugly kludge to get the sysconfdir path is needed because
+@@ -243,19 +242,13 @@
+ AM_CONDITIONAL(BUILD_POPPLER_QT4, test x$enable_poppler_qt4 = xyes)
+
+ if test x$enable_poppler_qt4 = xyes; then
+- POPPLER_FIND_QT4TEST(POPPLER_QTTEST)
++ POPPLER_FIND_QT4TEST(POPPLER_QTTEST,
++ [enable_poppler_qt4testlib="yes"],
++ [enable_poppler_qt4testlib="no"])
+ AC_SUBST(POPPLER_QTTEST_CXXFLAGS)
+ AC_SUBST(POPPLER_QTTEST_LIBS)
+-fi
+-
+-if test x$have_qt4testlib = xno ; then
+- AC_MSG_WARN([QtTestLib libraries not found])
+-fi
+-
+-if test x$have_qt4testlib = xyes; then
+- enable_poppler_qt4testlib="yes"
+ else
+- enable_poppler_qt4testlib="no"
++ enable_poppler_qt4testlib="no"
+ fi
+
+ AM_CONDITIONAL(BUILD_POPPLER_QT4TESTS, test x$enable_poppler_qt4testlib = xyes)
+diff -Nur poppler.0_5_0/fofi/FoFiTrueType.cc poppler.HEAD/fofi/FoFiTrueType.cc
+--- poppler.0_5_0/fofi/FoFiTrueType.cc 2005-09-14 23:20:36.000000000 +0200
++++ poppler.HEAD/fofi/FoFiTrueType.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -241,10 +241,10 @@
+ // FoFiTrueType
+ //------------------------------------------------------------------------
+
+-FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA) {
++FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA, int faceIndexA) {
+ FoFiTrueType *ff;
+
+- ff = new FoFiTrueType(fileA, lenA, gFalse);
++ ff = new FoFiTrueType(fileA, lenA, gFalse, faceIndexA);
+ if (!ff->parsedOk) {
+ delete ff;
+ return NULL;
+@@ -252,7 +252,7 @@
+ return ff;
+ }
+
+-FoFiTrueType *FoFiTrueType::load(char *fileName) {
++FoFiTrueType *FoFiTrueType::load(char *fileName, int faceIndexA) {
+ FoFiTrueType *ff;
+ char *fileA;
+ int lenA;
+@@ -260,7 +260,7 @@
+ if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
+ return NULL;
+ }
+- ff = new FoFiTrueType(fileA, lenA, gTrue);
++ ff = new FoFiTrueType(fileA, lenA, gTrue, faceIndexA);
+ if (!ff->parsedOk) {
+ delete ff;
+ return NULL;
+@@ -268,7 +268,7 @@
+ return ff;
+ }
+
+-FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA):
++FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA):
+ FoFiBase(fileA, lenA, freeFileDataA)
+ {
+ tables = NULL;
+@@ -277,6 +277,7 @@
+ nCmaps = 0;
+ nameToGID = NULL;
+ parsedOk = gFalse;
++ faceIndex = faceIndexA;
+
+ parse();
+ }
+@@ -1535,9 +1536,12 @@
+ return checksum;
+ }
+
++#define toTag(a,b,c,d) (((unsigned int)(a)<<24) | ((unsigned int)(b)<<16) | ((unsigned int)(c)<<8) | (d))
++
+ void FoFiTrueType::parse() {
+ Guint topTag;
+ int pos, i, j;
++ unsigned int head;
+
+ parsedOk = gTrue;
+
+@@ -1556,12 +1560,37 @@
+ }
+
+ // read the table directory
+- nTables = getU16BE(pos + 4, &parsedOk);
++ head = getU32BE(pos, &parsedOk);
++ if (! parsedOk)
++ return;
++ if (head == toTag('t','t','c','f')) {
++ /* TTC font */
++ unsigned int tableDir;
++ int dircount;
++
++ dircount = getU32BE(8, &parsedOk);
++ if (!parsedOk)
++ return;
++ if (! dircount) {
++ parsedOk = gFalse;
++ return;
++ }
++
++ if (faceIndex >= dircount)
++ faceIndex = 0;
++ pos = getU32BE(12 + faceIndex * 4, &parsedOk);
++ if (! parsedOk)
++ return;
++ }
++
++ pos += 4;
++ nTables = getU16BE(pos, &parsedOk);
+ if (!parsedOk) {
+ return;
+ }
++
++ pos += 8;
+ tables = (TrueTypeTable *)gmallocn(nTables, sizeof(TrueTypeTable));
+- pos += 12;
+ for (i = 0; i < nTables; ++i) {
+ tables[i].tag = getU32BE(pos, &parsedOk);
+ tables[i].checksum = getU32BE(pos + 4, &parsedOk);
+diff -Nur poppler.0_5_0/fofi/FoFiTrueType.h poppler.HEAD/fofi/FoFiTrueType.h
+--- poppler.0_5_0/fofi/FoFiTrueType.h 2005-09-14 23:20:36.000000000 +0200
++++ poppler.HEAD/fofi/FoFiTrueType.h 2006-02-02 23:50:01.000000000 +0100
+@@ -29,11 +29,12 @@
+ public:
+
+ // Create a FoFiTrueType object from a memory buffer.
+- static FoFiTrueType *make(char *fileA, int lenA);
++ static FoFiTrueType *make(char *fileA, int lenA, int faceIndexA=0);
+
+ // Create a FoFiTrueType object from a file on disk.
+- static FoFiTrueType *load(char *fileName);
++ static FoFiTrueType *load(char *fileName, int faceIndexA=0);
+
++ FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA=0);
+ virtual ~FoFiTrueType();
+
+ // Return the number of cmaps defined by this font.
+@@ -104,7 +105,6 @@
+
+ private:
+
+- FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA);
+ void cvtEncoding(char **encoding,
+ FoFiOutputFunc outputFunc,
+ void *outputStream);
+@@ -133,6 +133,7 @@
+ GooHash *nameToGID;
+
+ GBool parsedOk;
++ int faceIndex;
+ };
+
+ #endif
+diff -Nur poppler.0_5_0/fofi/FoFiType1C.h poppler.HEAD/fofi/FoFiType1C.h
+--- poppler.0_5_0/fofi/FoFiType1C.h 2005-09-14 23:20:36.000000000 +0200
++++ poppler.HEAD/fofi/FoFiType1C.h 2006-02-02 23:50:01.000000000 +0100
+@@ -138,6 +138,7 @@
+ // Create a FoFiType1C object from a file on disk.
+ static FoFiType1C *load(char *fileName);
+
++ FoFiType1C(char *fileA, int lenA, GBool freeFileDataA);
+ virtual ~FoFiType1C();
+
+ // Return the font name.
+@@ -173,7 +174,6 @@
+
+ private:
+
+- FoFiType1C(char *fileA, int lenA, GBool freeFileDataA);
+ void eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName,
+ int offset, int nBytes,
+ Type1CIndex *subrIdx,
+diff -Nur poppler.0_5_0/glib/Makefile.am poppler.HEAD/glib/Makefile.am
+--- poppler.0_5_0/glib/Makefile.am 2006-01-02 01:06:46.000000000 +0100
++++ poppler.HEAD/glib/Makefile.am 2006-02-16 20:28:54.000000000 +0100
+@@ -58,6 +58,7 @@
+ poppler-action.h \
+ poppler-document.h \
+ poppler-page.h \
++ poppler-attachment.h \
+ poppler.h
+
+ poppler_glib_includedir = $(includedir)/poppler/glib
+@@ -72,6 +73,7 @@
+ poppler-action.cc \
+ poppler-document.cc \
+ poppler-page.cc \
++ poppler-attachment.cc \
+ poppler.cc \
+ poppler-private.h
+
+@@ -81,6 +83,8 @@
+ $(FREETYPE_LIBS) \
+ $(cairo_libs)
+
++libpoppler_glib_la_LDFLAGS = -version-info 1:0:0
++
+ noinst_PROGRAMS = test-poppler-glib
+
+ test_poppler_glib_SOURCES = \
+diff -Nur poppler.0_5_0/glib/poppler-action.cc poppler.HEAD/glib/poppler-action.cc
+--- poppler.0_5_0/glib/poppler-action.cc 2005-12-31 03:10:33.000000000 +0100
++++ poppler.HEAD/glib/poppler-action.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -182,7 +182,7 @@
+ LinkGoTo *link)
+ {
+ LinkDest *link_dest;
+- GooString *named_dest;
++ UGooString *named_dest;
+
+ /* Return if it isn't OK */
+ if (! link->isOk ()) {
+diff -Nur poppler.0_5_0/glib/poppler-attachment.cc poppler.HEAD/glib/poppler-attachment.cc
+--- poppler.0_5_0/glib/poppler-attachment.cc 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/glib/poppler-attachment.cc 2006-01-24 07:21:39.000000000 +0100
+@@ -0,0 +1,223 @@
++/* poppler-attachment.cc: glib wrapper for poppler
++ * Copyright (C) 2006, Red Hat, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#include "config.h"
++#include <errno.h>
++#include <glib/gstdio.h>
++
++#include "poppler.h"
++#include "poppler-private.h"
++#include "poppler-attachment.h"
++
++/* FIXME: We need to add gettext support sometime */
++#define _(x) (x)
++
++typedef struct _PopplerAttachmentPrivate PopplerAttachmentPrivate;
++struct _PopplerAttachmentPrivate
++{
++ Object obj_stream;
++};
++
++#define POPPLER_ATTACHMENT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachmentPrivate))
++
++static void poppler_attachment_finalize (GObject *obj);
++
++G_DEFINE_TYPE (PopplerAttachment, poppler_attachment, G_TYPE_OBJECT);
++
++static void
++poppler_attachment_init (PopplerAttachment *attachment)
++{
++
++}
++
++static void
++poppler_attachment_class_init (PopplerAttachmentClass *klass)
++{
++ G_OBJECT_CLASS (klass)->finalize = poppler_attachment_finalize;
++ g_type_class_add_private (klass, sizeof (PopplerAttachmentPrivate));
++}
++
++static void
++poppler_attachment_finalize (GObject *obj)
++{
++ PopplerAttachment *attachment;
++
++ attachment = (PopplerAttachment *) obj;
++ POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream.free();
++}
++
++/* Public functions */
++
++PopplerAttachment *
++_poppler_attachment_new (PopplerDocument *document,
++ EmbFile *emb_file)
++{
++ PopplerAttachment *attachment;
++
++ g_assert (document != NULL);
++ g_assert (emb_file != NULL);
++
++ attachment = (PopplerAttachment *) g_object_new (POPPLER_TYPE_ATTACHMENT, NULL);
++
++ if (emb_file->name ())
++ attachment->name = g_strdup (emb_file->name ()->getCString ());
++ if (emb_file->description ())
++ attachment->description = g_strdup (emb_file->description ()->getCString ());
++
++ emb_file->streamObject().copy(&POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream);
++
++ return attachment;
++}
++
++static gboolean
++save_helper (const gchar *buf,
++ gsize count,
++ gpointer data,
++ GError **error)
++{
++ FILE *f = (FILE *) data;
++ gsize n;
++
++ n = fwrite (buf, 1, count, f);
++ if (n != count)
++ {
++ g_set_error (error,
++ G_FILE_ERROR,
++ g_file_error_from_errno (errno),
++ _("Error writing to image file: %s"),
++ g_strerror (errno));
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++/**
++ * poppler_attachment_save:
++ * @attachment: A #PopplerAttachment.
++ * @filename: name of file to save
++ * @error: return location for error, or %NULL.
++ *
++ * Saves @attachment to a file indicated by @filename. If @error is set, %FALSE
++ * will be returned. Possible errors include those in the #G_FILE_ERROR domain
++ * and whatever the save function generates.
++ *
++ * Return value: %TRUE, if the file successfully saved
++ **/
++gboolean
++poppler_attachment_save (PopplerAttachment *attachment,
++ const char *filename,
++ GError **error)
++{
++ gboolean result;
++ FILE *f;
++
++ g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE);
++
++ f = g_fopen (filename, "wb");
++
++ if (f == NULL)
++ {
++ gchar *display_name = g_filename_display_name (filename);
++ g_set_error (error,
++ G_FILE_ERROR,
++ g_file_error_from_errno (errno),
++ _("Failed to open '%s' for writing: %s"),
++ display_name,
++ g_strerror (errno));
++ g_free (display_name);
++ return FALSE;
++ }
++
++ result = poppler_attachment_save_to_callback (attachment, save_helper, f, error);
++
++ if (fclose (f) < 0)
++ {
++ gchar *display_name = g_filename_display_name (filename);
++ g_set_error (error,
++ G_FILE_ERROR,
++ g_file_error_from_errno (errno),
++ _("Failed to close '%s', all data may not have been saved: %s"),
++ display_name,
++ g_strerror (errno));
++ g_free (display_name);
++ return FALSE;
++ }
++
++ return TRUE;
++}
++
++#define BUF_SIZE 1024
++
++/**
++ * poppler_attachment_save_to_callback:
++ * @attachment: A #GdkPixbuf.
++ * @save_func: a function that is called to save each block of data that the save routine generates.
++ * @user_data: user data to pass to the save function.
++ * @error: return location for error, or %NULL.
++ *
++ * Saves @attachment by feeding the produced data to @save_func. Can be used
++ * when you want to store the attachment to something other than a file, such as
++ * an in-memory buffer or a socket. If @error is set, %FALSE will be
++ * returned. Possible errors include those in the #G_FILE_ERROR domain and
++ * whatever the save function generates.
++ *
++ * Return value: %TRUE, if the save successfully completed
++ **/
++gboolean
++poppler_attachment_save_to_callback (PopplerAttachment *attachment,
++ PopplerAttachmentSaveFunc save_func,
++ gpointer user_data,
++ GError **error)
++{
++ Stream *stream;
++ gchar buf[BUF_SIZE];
++ int i;
++ gboolean eof_reached = FALSE;
++
++ g_return_val_if_fail (POPPLER_IS_ATTACHMENT (attachment), FALSE);
++
++ stream = POPPLER_ATTACHMENT_GET_PRIVATE (attachment)->obj_stream.getStream();
++ stream->reset();
++
++ do
++ {
++ int data;
++
++ for (i = 0; i < BUF_SIZE; i++)
++ {
++ data = stream->getChar ();
++ if (data == EOF)
++ {
++ eof_reached = TRUE;
++ break;
++ }
++ buf[i] = data;
++ }
++
++ if (i > 0)
++ {
++ if (! (save_func) (buf, i, user_data, error))
++ return FALSE;
++ }
++ }
++ while (! eof_reached);
++
++
++ return TRUE;
++}
+diff -Nur poppler.0_5_0/glib/poppler-attachment.h poppler.HEAD/glib/poppler-attachment.h
+--- poppler.0_5_0/glib/poppler-attachment.h 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/glib/poppler-attachment.h 2006-01-29 06:16:31.000000000 +0100
+@@ -0,0 +1,68 @@
++/* poppler-attachment.h: glib interface to poppler
++ * Copyright (C) 2004, Red Hat, Inc.
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#ifndef __POPPLER_ATTACHMENT_H__
++#define __POPPLER_ATTACHMENT_H__
++
++#include <time.h>
++#include <glib-object.h>
++
++#include "poppler.h"
++
++G_BEGIN_DECLS
++
++
++#define POPPLER_TYPE_ATTACHMENT (poppler_attachment_get_type ())
++#define POPPLER_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ATTACHMENT, PopplerAttachment))
++#define POPPLER_IS_ATTACHMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ATTACHMENT))
++
++
++typedef gboolean (*PopplerAttachmentSaveFunc) (const gchar *buf,
++ gsize count,
++ gpointer data,
++ GError **error);
++
++typedef struct _PopplerAttachment
++{
++ GObject parent;
++
++ const char *name;
++ const char *description;
++ time_t mtime;
++ time_t ctime;
++} PopplerAttachment;
++
++typedef struct _PopplerAttachmentClass
++{
++ GObjectClass parent_class;
++} PopplerAttachmentClass;
++
++
++GType poppler_attachment_get_type (void) G_GNUC_CONST;
++gboolean poppler_attachment_save (PopplerAttachment *attachment,
++ const char *filename,
++ GError **error);
++gboolean poppler_attachment_save_to_callback (PopplerAttachment *attachment,
++ PopplerAttachmentSaveFunc save_func,
++ gpointer user_data,
++ GError **error);
++
++
++G_END_DECLS
++
++#endif /* __POPPLER_ATTACHMENT_H__ */
+diff -Nur poppler.0_5_0/glib/poppler-document.cc poppler.HEAD/glib/poppler-document.cc
+--- poppler.0_5_0/glib/poppler-document.cc 2005-12-31 03:10:33.000000000 +0100
++++ poppler.HEAD/glib/poppler-document.cc 2006-01-24 07:21:39.000000000 +0100
+@@ -28,9 +28,11 @@
+ #include <Stream.h>
+ #include <FontInfo.h>
+ #include <PDFDocEncoding.h>
++#include <UGooString.h>
+
+ #include "poppler.h"
+ #include "poppler-private.h"
++#include "poppler-attachment.h"
+ #include "poppler-enums.h"
+
+ enum {
+@@ -251,6 +253,68 @@
+ return poppler_document_get_page (document, index);
+ }
+
++/**
++ * poppler_document_has_attachments:
++ * @document: A #PopplerDocument
++ *
++ * Returns %TRUE of @document has any attachments.
++ *
++ * Return value: %TRUE, if @document has attachments.
++ **/
++gboolean
++poppler_document_has_attachments (PopplerDocument *document)
++{
++ Catalog *catalog;
++ int n_files = 0;
++
++ g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), FALSE);
++
++ catalog = document->doc->getCatalog ();
++ if (catalog && catalog->isOk ())
++ {
++ n_files = catalog->numEmbeddedFiles ();
++ }
++
++ return (n_files != 0);
++}
++
++/**
++ * poppler_document_get_attachments:
++ * @document: A #PopplerDocument
++ *
++ * Returns a #GList containing #PopplerAttachment<!-- -->s. These attachments
++ * are unowned, and must be unreffed, and the list must be freed with
++ * g_list_free().
++ *
++ * Return value: a list of available attachments.
++ **/
++GList *
++poppler_document_get_attachments (PopplerDocument *document)
++{
++ Catalog *catalog;
++ int n_files, i;
++ GList *retval = NULL;
++
++ g_return_val_if_fail (POPPLER_IS_DOCUMENT (document), NULL);
++
++ catalog = document->doc->getCatalog ();
++ if (catalog == NULL || ! catalog->isOk ())
++ return NULL;
++
++ n_files = catalog->numEmbeddedFiles ();
++ for (i = 0; i < n_files; i++)
++ {
++ PopplerAttachment *attachment;
++ EmbFile *emb_file;
++
++ emb_file = catalog->embeddedFile (i);
++ attachment = _poppler_attachment_new (document, emb_file);
++
++ retval = g_list_prepend (retval, attachment);
++ }
++ return g_list_reverse (retval);
++}
++
+ static gboolean
+ has_unicode_marker (GooString *string)
+ {
+diff -Nur poppler.0_5_0/glib/poppler-document.h poppler.HEAD/glib/poppler-document.h
+--- poppler.0_5_0/glib/poppler-document.h 2005-12-31 03:10:33.000000000 +0100
++++ poppler.HEAD/glib/poppler-document.h 2006-01-24 07:21:39.000000000 +0100
+@@ -100,6 +100,10 @@
+ int index);
+ PopplerPage *poppler_document_get_page_by_label (PopplerDocument *document,
+ const char *label);
++/* Attachments */
++gboolean poppler_document_has_attachments (PopplerDocument *document);
++GList *poppler_document_get_attachments (PopplerDocument *document);
++
+
+
+ /* Interface for getting the Index of a poppler_document */
+@@ -142,6 +146,8 @@
+ gboolean duplex);
+ void poppler_ps_file_free (PopplerPSFile *ps_file);
+
++
++
+ G_END_DECLS
+
+ #endif /* __POPPLER_DOCUMENT_H__ */
+diff -Nur poppler.0_5_0/glib/poppler.h poppler.HEAD/glib/poppler.h
+--- poppler.0_5_0/glib/poppler.h 2005-06-20 19:58:38.000000000 +0200
++++ poppler.HEAD/glib/poppler.h 2006-01-24 07:21:39.000000000 +0100
+@@ -69,5 +69,6 @@
+ #include "poppler-page.h"
+ #include "poppler-action.h"
+ #include "poppler-enums.h"
++#include "poppler-attachment.h"
+
+ #endif /* __POPPLER_GLIB_H__ */
+diff -Nur poppler.0_5_0/glib/poppler-page.cc poppler.HEAD/glib/poppler-page.cc
+--- poppler.0_5_0/glib/poppler-page.cc 2005-12-31 03:10:33.000000000 +0100
++++ poppler.HEAD/glib/poppler-page.cc 2006-01-24 07:21:39.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* poppler.h: glib wrapper for poppler
++/* poppler-page.cc: glib wrapper for poppler
+ * Copyright (C) 2005, Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+diff -Nur poppler.0_5_0/glib/poppler-private.h poppler.HEAD/glib/poppler-private.h
+--- poppler.0_5_0/glib/poppler-private.h 2005-08-22 20:20:12.000000000 +0200
++++ poppler.HEAD/glib/poppler-private.h 2006-01-24 07:21:39.000000000 +0100
+@@ -8,6 +8,9 @@
+ #include <Gfx.h>
+ #include <FontInfo.h>
+ #include <TextOutputDev.h>
++#include <Catalog.h>
++
++#include "poppler-attachment.h"
+
+ #if defined (HAVE_CAIRO)
+ #include <CairoOutputDev.h>
+@@ -62,5 +65,6 @@
+ LinkAction *link,
+ const gchar *title);
+
+-
++PopplerAttachment *_poppler_attachment_new (PopplerDocument *document,
++ EmbFile *file);
+ #endif
+diff -Nur poppler.0_5_0/glib/reference/tmpl/poppler-enums.sgml poppler.HEAD/glib/reference/tmpl/poppler-enums.sgml
+--- poppler.0_5_0/glib/reference/tmpl/poppler-enums.sgml 2006-01-06 11:05:58.000000000 +0100
++++ poppler.HEAD/glib/reference/tmpl/poppler-enums.sgml 2006-01-24 07:21:39.000000000 +0100
+@@ -17,3 +17,153 @@
+ <!-- ##### SECTION Stability_Level ##### -->
+
+
++<!-- ##### MACRO POPPLER_TYPE_ACTION_TYPE ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_action_type_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_DEST_TYPE ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_dest_type_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_PAGE_LAYOUT ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_page_layout_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_PAGE_MODE ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_page_mode_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_FONT_TYPE ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_font_type_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_VIEWER_PREFERENCES ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_viewer_preferences_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_PERMISSIONS ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_permissions_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_ERROR ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_error_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_ORIENTATION ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_orientation_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
++<!-- ##### MACRO POPPLER_TYPE_BACKEND ##### -->
++<para>
++
++</para>
++
++
++
++<!-- ##### FUNCTION poppler_backend_get_type ##### -->
++<para>
++
++</para>
++
++@Returns:
++
++
+diff -Nur poppler.0_5_0/glib/reference/tmpl/poppler-unused.sgml poppler.HEAD/glib/reference/tmpl/poppler-unused.sgml
+--- poppler.0_5_0/glib/reference/tmpl/poppler-unused.sgml 2006-01-06 11:05:58.000000000 +0100
++++ poppler.HEAD/glib/reference/tmpl/poppler-unused.sgml 2006-01-24 07:21:39.000000000 +0100
+@@ -1,130 +0,0 @@
+-<!-- ##### MACRO POPPLER_TYPE_ACTION_TYPE ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_BACKEND ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_DEST_TYPE ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_ERROR ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_FONT_TYPE ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_ORIENTATION ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_PAGE_LAYOUT ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_PAGE_MODE ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_PERMISSIONS ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### MACRO POPPLER_TYPE_VIEWER_PREFERENCES ##### -->
+-<para>
+-
+-</para>
+-
+-
+-<!-- ##### FUNCTION poppler_action_type_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_backend_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_dest_type_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_error_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_font_type_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_orientation_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_page_layout_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_page_mode_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_permissions_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+-<!-- ##### FUNCTION poppler_viewer_preferences_get_type ##### -->
+-<para>
+-
+-</para>
+-
+-@Returns:
+-
+diff -Nur poppler.0_5_0/glib/test-poppler-glib.c poppler.HEAD/glib/test-poppler-glib.c
+--- poppler.0_5_0/glib/test-poppler-glib.c 2005-12-31 03:10:33.000000000 +0100
++++ poppler.HEAD/glib/test-poppler-glib.c 2006-01-24 07:21:39.000000000 +0100
+@@ -13,11 +13,12 @@
+ do
+ {
+ PopplerAction *action;
++ PopplerIndexIter *child;
+
+ action = poppler_index_iter_get_action (iter);
+ g_print ("Action: %d\n", action->type);
+ poppler_action_free (action);
+- PopplerIndexIter *child = poppler_index_iter_get_child (iter);
++ child = poppler_index_iter_get_child (iter);
+ if (child)
+ print_index (child);
+ poppler_index_iter_free (child);
+@@ -35,6 +36,7 @@
+ PopplerViewerPreferences view_prefs;
+ PopplerFontInfo *font_info;
+ PopplerFontsIter *fonts_iter;
++ PopplerIndexIter *index_iter;
+ GEnumValue *enum_value;
+
+ g_object_get (document,
+@@ -85,7 +87,6 @@
+ }
+ poppler_font_info_free (font_info);
+
+- PopplerIndexIter *index_iter;
+ index_iter = poppler_index_iter_new (document);
+ if (index_iter)
+ {
+@@ -197,7 +198,31 @@
+
+ printf (" (%f,%f)-(%f,%f)\n", rect->x1, rect->y1, rect->x2, rect->y2);
+ }
+-
++
++ if (poppler_document_has_attachments (document))
++ {
++ int i = 0;
++
++ g_print ("Attachments found:\n\n");
++
++ list = poppler_document_get_attachments (document);
++ for (l = list; l; l = l->next)
++ {
++ PopplerAttachment *attachment;
++ char *name;
++
++ name = g_strdup_printf ("/tmp/attach%d", i);
++ attachment = l->data;
++ g_print ("\tname: %s\n", attachment->name);
++ g_print ("\tdescription: %s\n\n", attachment->description);
++ poppler_attachment_save (attachment, name, NULL);
++ i++;
++ }
++ g_list_foreach (list, g_object_unref, NULL);
++ g_list_free (list);
++ }
++ else
++ g_print ("no attachment\n");
+
+ g_object_unref (G_OBJECT (page));
+
+diff -Nur poppler.0_5_0/goo/FixedPoint.h poppler.HEAD/goo/FixedPoint.h
+--- poppler.0_5_0/goo/FixedPoint.h 2005-09-16 20:29:18.000000000 +0200
++++ poppler.HEAD/goo/FixedPoint.h 2006-02-06 21:49:21.000000000 +0100
+@@ -11,7 +11,7 @@
+ #ifndef FIXEDPOINT_H
+ #define FIXEDPOINT_H
+
+-#include <aconf.h>
++#include <config.h>
+
+ #if USE_FIXEDPOINT
+
+diff -Nur poppler.0_5_0/goo/gfile.cc poppler.HEAD/goo/gfile.cc
+--- poppler.0_5_0/goo/gfile.cc 2005-03-03 20:45:58.000000000 +0100
++++ poppler.HEAD/goo/gfile.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -489,6 +489,14 @@
+ }
+ (*name)->append("/XXXXXX")->append(ext);
+ fd = mkstemps((*name)->getCString(), strlen(ext));
++#elif defined(HAVE_MKSTEMP)
++ if ((s = getenv("TMPDIR"))) {
++ *name = new GooString(s);
++ } else {
++ *name = new GooString("/tmp");
++ }
++ (*name)->append("/XXXXXX")->append(ext);
++ fd = mkstemp((*name)->getCString());
+ #else
+ if (!(s = tmpnam(NULL))) {
+ return gFalse;
+diff -Nur poppler.0_5_0/m4/qt.m4 poppler.HEAD/m4/qt.m4
+--- poppler.0_5_0/m4/qt.m4 2006-01-06 11:05:58.000000000 +0100
++++ poppler.HEAD/m4/qt.m4 2006-01-10 22:57:28.000000000 +0100
+@@ -156,6 +156,11 @@
+ qt4_incdirs="/usr/local/qt/include /usr/include/qt4 /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/lib/qt/include"
+ qt4_libdirs="/usr/local/qt/lib /usr/lib/qt /usr/lib /usr/X11R6/lib/X11/qt /usr/X11R6/lib/qt /usr/lib/qt/lib"
+
++if test -n "$QTDIR" ; then
++ qt4_incdirs="$QTDIR/include $qt4_incdirs"
++ qt4_libdirs="$QTDIR/lib $qt4_libdirs"
++fi
++
+ dnl What to test
+ qt4test_test_include="QtTest/QtTest"
+ qt4test_test_la_library="libQtTest.la"
+diff -Nur poppler.0_5_0/poppler/Annot.cc poppler.HEAD/poppler/Annot.cc
+--- poppler.0_5_0/poppler/Annot.cc 2005-10-16 16:54:17.000000000 +0200
++++ poppler.HEAD/poppler/Annot.cc 2006-02-06 19:50:11.000000000 +0100
+@@ -18,6 +18,7 @@
+ #include "Catalog.h"
+ #include "Gfx.h"
+ #include "Lexer.h"
++#include "UGooString.h"
+ #include "Annot.h"
+
+ //------------------------------------------------------------------------
+@@ -210,15 +211,14 @@
+
+ // build the appearance stream dictionary
+ appearDict.initDict(xref);
+- appearDict.dictAdd(copyString("Length"),
+- obj1.initInt(appearBuf->getLength()));
+- appearDict.dictAdd(copyString("Subtype"), obj1.initName("Form"));
++ appearDict.dictAdd("Length", obj1.initInt(appearBuf->getLength()));
++ appearDict.dictAdd("Subtype", obj1.initName("Form"));
+ obj1.initArray(xref);
+ obj1.arrayAdd(obj2.initReal(0));
+ obj1.arrayAdd(obj2.initReal(0));
+ obj1.arrayAdd(obj2.initReal(xMax - xMin));
+ obj1.arrayAdd(obj2.initReal(yMax - yMin));
+- appearDict.dictAdd(copyString("BBox"), &obj1);
++ appearDict.dictAdd("BBox", &obj1);
+
+ // find the resource dictionary
+ dict->lookup("DR", &drObj);
+@@ -243,7 +243,7 @@
+ }
+ }
+ if (drObj.isDict()) {
+- appearDict.dictAdd(copyString("Resources"), drObj.copy(&obj1));
++ appearDict.dictAdd("Resources", drObj.copy(&obj1));
+ }
+ drObj.free();
+
+diff -Nur poppler.0_5_0/poppler/ArthurOutputDev.cc poppler.HEAD/poppler/ArthurOutputDev.cc
+--- poppler.0_5_0/poppler/ArthurOutputDev.cc 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/ArthurOutputDev.cc 2006-02-14 00:04:54.000000000 +0100
+@@ -245,11 +245,13 @@
+ GfxFontType fontType;
+ SplashOutFontFileID *id;
+ SplashFontFile *fontFile;
++ SplashFontSrc *fontsrc;
+ FoFiTrueType *ff;
+ Ref embRef;
+ Object refObj, strObj;
+- GooString *tmpFileName, *fileName, *substName;
+- FILE *tmpFile;
++ GooString *fileName, *substName;
++ char *tmpBuf;
++ int tmpBufLen;
+ Gushort *codeToGID;
+ DisplayFontParam *dfp;
+ double m11, m12, m21, m22, w1, w2;
+@@ -259,7 +261,8 @@
+
+ m_needFontUpdate = false;
+ m_font = NULL;
+- tmpFileName = NULL;
++ fileName = NULL;
++ tmpBuf = NULL;
+ substIdx = -1;
+
+ if (!(gfxFont = state->getFont())) {
+@@ -279,22 +282,9 @@
+
+ // if there is an embedded font, write it to disk
+ if (gfxFont->getEmbeddedFontID(&embRef)) {
+- if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
+- error(-1, "Couldn't create temporary font file");
++ tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);
++ if (! tmpBuf)
+ goto err2;
+- }
+- refObj.initRef(embRef.num, embRef.gen);
+- refObj.fetch(xref, &strObj);
+- refObj.free();
+- strObj.streamReset();
+- while ((c = strObj.streamGetChar()) != EOF) {
+- fputc(c, tmpFile);
+- }
+- strObj.streamClose();
+- strObj.free();
+- fclose(tmpFile);
+- fileName = tmpFileName;
+-
+ // if there is an external font file, use it
+ } else if (!(fileName = gfxFont->getExtFontFile())) {
+
+@@ -321,13 +311,18 @@
+ }
+ }
+
++ fontsrc = new SplashFontSrc;
++ if (fileName)
++ fontsrc->setFile(fileName, gFalse);
++ else
++ fontsrc->setBuf(tmpBuf, tmpBufLen, gFalse);
++
+ // load the font file
+ switch (fontType) {
+ case fontType1:
+ if (!(fontFile = m_fontEngine->loadType1Font(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
++ fontsrc,
+ ((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+@@ -338,8 +333,7 @@
+ case fontType1C:
+ if (!(fontFile = m_fontEngine->loadType1CFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
++ fontsrc,
+ ((Gfx8BitFont *)gfxFont)->getEncoding()))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+@@ -355,8 +349,7 @@
+ delete ff;
+ if (!(fontFile = m_fontEngine->loadTrueTypeFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
++ fontsrc,
+ codeToGID, 256))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+@@ -368,8 +361,7 @@
+ case fontCIDType0C:
+ if (!(fontFile = m_fontEngine->loadCIDFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName))) {
++ fontsrc))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+ : "(unnamed)");
+@@ -383,8 +375,7 @@
+ n * sizeof(Gushort));
+ if (!(fontFile = m_fontEngine->loadTrueTypeFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
++ fontsrc,
+ codeToGID, n))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+@@ -408,17 +399,11 @@
+ mat[2] = m21; mat[3] = -m22;
+ m_font = m_fontEngine->getFont(fontFile, mat);
+
+- if (tmpFileName) {
+- delete tmpFileName;
+- }
+ return;
+
+ err2:
+ delete id;
+ err1:
+- if (tmpFileName) {
+- delete tmpFileName;
+- }
+ return;
+ }
+
+diff -Nur poppler.0_5_0/poppler/CairoOutputDev.cc poppler.HEAD/poppler/CairoOutputDev.cc
+--- poppler.0_5_0/poppler/CairoOutputDev.cc 2006-01-10 18:55:59.000000000 +0100
++++ poppler.HEAD/poppler/CairoOutputDev.cc 2006-02-18 21:17:00.000000000 +0100
+@@ -194,7 +194,11 @@
+
+ void CairoOutputDev::updateLineWidth(GfxState *state) {
+ LOG(printf ("line width: %f\n", state->getTransformedLineWidth()));
+- cairo_set_line_width (cairo, state->getTransformedLineWidth());
++ if (state->getTransformedLineWidth() == 0.0) {
++ cairo_set_line_width (cairo, 72.0/300.0);
++ } else {
++ cairo_set_line_width (cairo, state->getTransformedLineWidth());
++ }
+ }
+
+ void CairoOutputDev::updateFillColor(GfxState *state) {
+@@ -477,6 +481,26 @@
+ int invert_bit;
+ int row_stride;
+
++ ctm = state->getCTM();
++ LOG (printf ("drawImageMask %dx%d, matrix: %f, %f, %f, %f, %f, %f\n",
++ width, height, ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]));
++ matrix.xx = ctm[0] / width;
++ matrix.xy = -ctm[2] / height;
++ matrix.yx = ctm[1] / width;
++ matrix.yy = -ctm[3] / height;
++ matrix.x0 = ctm[2] + ctm[4];
++ matrix.y0 = ctm[3] + ctm[5];
++
++ /* work around a cairo bug when scaling 1x1 surfaces */
++ if (width == 1 && height == 1) {
++ cairo_save (cairo);
++ cairo_set_matrix (cairo, &matrix);
++ cairo_rectangle (cairo, 0., 0., 1., 1.);
++ cairo_fill (cairo);
++ cairo_restore (cairo);
++ return;
++ }
++
+ row_stride = (width + 3) & ~3;
+ buffer = (unsigned char *) malloc (height * row_stride);
+ if (buffer == NULL) {
+@@ -510,6 +534,98 @@
+ if (pattern == NULL)
+ return;
+
++ cairo_matrix_invert (&matrix);
++ cairo_pattern_set_matrix (pattern, &matrix);
++
++ /* we should actually be using CAIRO_FILTER_NEAREST here. However,
++ * cairo doesn't yet do minifaction filtering causing scaled down
++ * images with CAIRO_FILTER_NEAREST to look really bad */
++ cairo_pattern_set_filter (pattern, CAIRO_FILTER_BEST);
++
++ /* FIXME: Doesn't the image mask support any colorspace? */
++ cairo_set_source (cairo, fill_pattern);
++ cairo_mask (cairo, pattern);
++
++ cairo_pattern_destroy (pattern);
++ cairo_surface_destroy (image);
++ free (buffer);
++ delete imgStr;
++}
++
++void CairoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
++ int width, int height,
++ GfxImageColorMap *colorMap,
++ Stream *maskStr,
++ int maskWidth, int maskHeight,
++ GfxImageColorMap *maskColorMap)
++{
++ ImageStream *maskImgStr;
++ maskImgStr = new ImageStream(maskStr, maskWidth,
++ maskColorMap->getNumPixelComps(),
++ maskColorMap->getBits());
++ maskImgStr->reset();
++
++ int row_stride = (maskWidth + 3) & ~3;
++ unsigned char *maskBuffer;
++ maskBuffer = (unsigned char *)gmalloc (row_stride * maskHeight);
++ unsigned char *maskDest;
++ cairo_surface_t *maskImage;
++ cairo_pattern_t *maskPattern;
++ Guchar *pix;
++ int x, y;
++ for (y = 0; y < maskHeight; y++) {
++ maskDest = (unsigned char *) (maskBuffer + y * row_stride);
++ pix = maskImgStr->getLine();
++ maskColorMap->getGrayLine (pix, maskDest, maskWidth);
++ }
++
++ maskImage = cairo_image_surface_create_for_data (maskBuffer, CAIRO_FORMAT_A8,
++ maskWidth, maskHeight, row_stride);
++
++ delete maskImgStr;
++ maskStr->close();
++
++ unsigned char *buffer;
++ unsigned int *dest;
++ cairo_surface_t *image;
++ cairo_pattern_t *pattern;
++ ImageStream *imgStr;
++ GfxRGB rgb;
++ int alpha, i;
++ double *ctm;
++ cairo_matrix_t matrix;
++ int is_identity_transform;
++
++ buffer = (unsigned char *)gmalloc (width * height * 4);
++
++ /* TODO: Do we want to cache these? */
++ imgStr = new ImageStream(str, width,
++ colorMap->getNumPixelComps(),
++ colorMap->getBits());
++ imgStr->reset();
++
++ /* ICCBased color space doesn't do any color correction
++ * so check its underlying color space as well */
++ is_identity_transform = colorMap->getColorSpace()->getMode() == csDeviceRGB ||
++ colorMap->getColorSpace()->getMode() == csICCBased &&
++ ((GfxICCBasedColorSpace*)colorMap->getColorSpace())->getAlt()->getMode() == csDeviceRGB;
++
++ for (y = 0; y < height; y++) {
++ dest = (unsigned int *) (buffer + y * 4 * width);
++ pix = imgStr->getLine();
++ colorMap->getRGBLine (pix, dest, width);
++ }
++
++ image = cairo_image_surface_create_for_data (buffer, CAIRO_FORMAT_RGB24,
++ width, height, width * 4);
++
++ if (image == NULL)
++ return;
++ pattern = cairo_pattern_create_for_surface (image);
++ maskPattern = cairo_pattern_create_for_surface (maskImage);
++ if (pattern == NULL)
++ return;
++
+ ctm = state->getCTM();
+ LOG (printf ("drawImageMask %dx%d, matrix: %f, %f, %f, %f, %f, %f\n",
+ width, height, ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]));
+@@ -519,20 +635,24 @@
+ matrix.yy = -ctm[3] / height;
+ matrix.x0 = ctm[2] + ctm[4];
+ matrix.y0 = ctm[3] + ctm[5];
++
+ cairo_matrix_invert (&matrix);
++
+ cairo_pattern_set_matrix (pattern, &matrix);
++ cairo_pattern_set_matrix (maskPattern, &matrix);
+
+- cairo_pattern_set_filter (pattern, CAIRO_FILTER_BEST);
+- /* FIXME: Doesn't the image mask support any colorspace? */
+- cairo_set_source (cairo, fill_pattern);
+- cairo_mask (cairo, pattern);
++ cairo_pattern_set_filter (pattern, CAIRO_FILTER_BILINEAR);
++ cairo_set_source (cairo, pattern);
++ cairo_mask (cairo, maskPattern);
+
++ cairo_pattern_destroy (maskPattern);
++ cairo_surface_destroy (maskImage);
+ cairo_pattern_destroy (pattern);
+ cairo_surface_destroy (image);
+ free (buffer);
++ free (maskBuffer);
+ delete imgStr;
+ }
+-
+ void CairoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height,
+ GfxImageColorMap *colorMap,
+diff -Nur poppler.0_5_0/poppler/CairoOutputDev.h poppler.HEAD/poppler/CairoOutputDev.h
+--- poppler.0_5_0/poppler/CairoOutputDev.h 2006-01-10 18:55:59.000000000 +0100
++++ poppler.HEAD/poppler/CairoOutputDev.h 2006-02-18 21:17:00.000000000 +0100
+@@ -117,6 +117,12 @@
+ virtual void drawImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height, GfxImageColorMap *colorMap,
+ int *maskColors, GBool inlineImg);
++ virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
++ int width, int height,
++ GfxImageColorMap *colorMap,
++ Stream *maskStr,
++ int maskWidth, int maskHeight,
++ GfxImageColorMap *maskColorMap);
+
+ //----- Type 3 font operators
+ virtual void type3D0(GfxState *state, double wx, double wy);
+diff -Nur poppler.0_5_0/poppler/Catalog.cc poppler.HEAD/poppler/Catalog.cc
+--- poppler.0_5_0/poppler/Catalog.cc 2005-09-15 14:52:36.000000000 +0200
++++ poppler.HEAD/poppler/Catalog.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -23,6 +23,7 @@
+ #include "Error.h"
+ #include "Link.h"
+ #include "PageLabelInfo.h"
++#include "UGooString.h"
+ #include "Catalog.h"
+
+ //------------------------------------------------------------------------
+@@ -83,11 +84,14 @@
+ // read named destination dictionary
+ catDict.dictLookup("Dests", &dests);
+
+- // read root of named destination tree
++ // read root of named destination tree - PDF1.6 table 3.28
+ if (catDict.dictLookup("Names", &obj)->isDict()) {
+ obj.dictLookup("Dests", &obj2);
+ destNameTree.init(xref, &obj2);
+ obj2.free();
++ obj.dictLookup("EmbeddedFiles", &obj2);
++ embeddedFileNameTree.init(xref, &obj2);
++ obj2.free();
+ }
+ obj.free();
+
+@@ -178,6 +182,7 @@
+ }
+ dests.free();
+ destNameTree.free();
++ embeddedFileNameTree.free();
+ if (baseURI) {
+ delete baseURI;
+ }
+@@ -291,7 +296,7 @@
+ return 0;
+ }
+
+-LinkDest *Catalog::findDest(GooString *name) {
++LinkDest *Catalog::findDest(UGooString *name) {
+ LinkDest *dest;
+ Object obj1, obj2;
+ GBool found;
+@@ -299,7 +304,7 @@
+ // try named destination dictionary then name tree
+ found = gFalse;
+ if (dests.isDict()) {
+- if (!dests.dictLookup(name->getCString(), &obj1)->isNull())
++ if (!dests.dictLookup(*name, &obj1)->isNull())
+ found = gTrue;
+ else
+ obj1.free();
+@@ -335,6 +340,97 @@
+ return dest;
+ }
+
++EmbFile *Catalog::embeddedFile(int i)
++{
++ Object efDict;
++ Object fileSpec;
++ Object fileDesc;
++ Object paramDict;
++ Object paramObj;
++ Object strObj;
++ Object obj, obj2;
++ obj = embeddedFileNameTree.getValue(i);
++ GooString *fileName = new GooString();
++ char *descString = embeddedFileNameTree.getName(i)->getCString();
++ GooString *desc = new GooString(descString);
++ delete[] descString;
++ GooString *createDate = new GooString();
++ GooString *modDate = new GooString();
++ Stream *efStream;
++ if (obj.isRef()) {
++ if (obj.fetch(xref, &efDict)->isDict()) {
++ // efDict matches Table 3.40 in the PDF1.6 spec
++ efDict.dictLookup("F", &fileSpec);
++ if (fileSpec.isString()) {
++ delete fileName;
++ fileName = new GooString(fileSpec.getString());
++ }
++ fileSpec.free();
++
++ // the logic here is that the description from the name
++ // dictionary is used if we don't have a more specific
++ // description - see the Note: on page 157 of the PDF1.6 spec
++ efDict.dictLookup("Desc", &fileDesc);
++ if (fileDesc.isString()) {
++ delete desc;
++ desc = new GooString(fileDesc.getString());
++ } else {
++ efDict.dictLookup("Description", &fileDesc);
++ if (fileDesc.isString()) {
++ delete desc;
++ desc = new GooString(fileDesc.getString());
++ }
++ }
++ fileDesc.free();
++
++ efDict.dictLookup("EF", &obj2);
++ if (obj2.isDict()) {
++ // This gives us the raw data stream bytes
++
++ obj2.dictLookup("F", &strObj);
++ if (strObj.isStream()) {
++ efStream = strObj.getStream();
++ }
++
++ // dataDict corresponds to Table 3.41 in the PDF1.6 spec.
++ Dict *dataDict = efStream->getDict();
++
++ // subtype is normally mimetype. You can extract it with code like this:
++ // Object subtypeName;
++ // dataDict->lookup( "Subtype", &subtypeName );
++ // It is optional, so this will sometimes return a null object
++ // if (subtypeName.isName()) {
++ // std::cout << "got subtype name: " << subtypeName.getName() << std::endl;
++ // }
++
++ // paramDict corresponds to Table 3.42 in the PDF1.6 spec
++ Object paramDict;
++ dataDict->lookup( "Params", ¶mDict );
++ if (paramDict.isDict()) {
++ paramDict.dictLookup("ModDate", ¶mObj);
++ if (paramObj.isString()) {
++ delete modDate;
++ modDate = new GooString(paramObj.getString());
++ }
++ paramObj.free();
++ paramDict.dictLookup("CreationDate", ¶mObj);
++ if (paramObj.isString()) {
++ delete createDate;
++ createDate = new GooString(paramObj.getString());
++ }
++ paramObj.free();
++ }
++ paramDict.free();
++ }
++ efDict.free();
++ obj2.free();
++ }
++ }
++ EmbFile *embeddedFile = new EmbFile(fileName, desc, createDate, modDate, strObj);
++ strObj.free();
++ return embeddedFile;
++}
++
+ NameTree::NameTree(void)
+ {
+ size = 0;
+@@ -343,12 +439,15 @@
+ }
+
+ NameTree::Entry::Entry(Array *array, int index) {
+- if (!array->getString(index, &name) || !array->getNF(index + 1, &value))
+- error(-1, "Invalid page tree");
++ GooString n;
++ if (!array->getString(index, &n) || !array->getNF(index + 1, &value))
++ error(-1, "Invalid page tree");
++ name = new UGooString(n);
+ }
+
+ NameTree::Entry::~Entry() {
+ value.free();
++ delete name;
+ }
+
+ void NameTree::addEntry(Entry *entry)
+@@ -402,13 +501,13 @@
+
+ int NameTree::Entry::cmp(const void *voidKey, const void *voidEntry)
+ {
+- GooString *key = (GooString *) voidKey;
++ UGooString *key = (UGooString *) voidKey;
+ Entry *entry = *(NameTree::Entry **) voidEntry;
+
+- return key->cmp(&entry->name);
++ return key->cmp(entry->name);
+ }
+
+-GBool NameTree::lookup(GooString *name, Object *obj)
++GBool NameTree::lookup(UGooString *name, Object *obj)
+ {
+ Entry **entry;
+
+@@ -424,6 +523,24 @@
+ }
+ }
+
++Object NameTree::getValue(int index)
++{
++ if (index < length) {
++ return entries[index]->value;
++ } else {
++ return Object();
++ }
++}
++
++UGooString *NameTree::getName(int index)
++{
++ if (index < length) {
++ return entries[index]->name;
++ } else {
++ return NULL;
++ }
++}
++
+ void NameTree::free()
+ {
+ int i;
+diff -Nur poppler.0_5_0/poppler/Catalog.h poppler.HEAD/poppler/Catalog.h
+--- poppler.0_5_0/poppler/Catalog.h 2005-09-15 14:52:36.000000000 +0200
++++ poppler.HEAD/poppler/Catalog.h 2006-01-18 23:32:13.000000000 +0100
+@@ -19,6 +19,7 @@
+ class PageAttrs;
+ struct Ref;
+ class LinkDest;
++class UGooString;
+ class PageLabelInfo;
+
+ //------------------------------------------------------------------------
+@@ -30,14 +31,18 @@
+ NameTree();
+ void init(XRef *xref, Object *tree);
+ void parse(Object *tree);
+- GBool lookup(GooString *name, Object *obj);
++ GBool lookup(UGooString *name, Object *obj);
+ void free();
++ int numEntries() { return length; };
++ // iterator accessor
++ Object getValue(int i);
++ UGooString *getName(int i);
+
+ private:
+ struct Entry {
+ Entry(Array *array, int index);
+ ~Entry();
+- GooString name;
++ UGooString *name;
+ Object value;
+ void free();
+ static int cmp(const void *key, const void *entry);
+@@ -48,7 +53,45 @@
+ XRef *xref;
+ Object *root;
+ Entry **entries;
+- int size, length;
++ int size, length; // size is the number of entries in
++ // the array of Entry*
++ // length is the number of real Entry
++};
++
++class EmbFile {
++public:
++ EmbFile(GooString *name, GooString *description,
++ GooString *createDate,
++ GooString *modDate, Object objStr) :
++ m_name(name),
++ m_description(description),
++ m_createDate(createDate),
++ m_modDate(modDate)
++ {
++ objStr.copy(&m_objStr);
++ }
++
++ ~EmbFile()
++ {
++ delete m_name;
++ delete m_description;
++ delete m_modDate;
++ delete m_createDate;
++ m_objStr.free();
++ }
++
++ GooString *name() { return m_name; }
++ GooString *description() { return m_description; }
++ GooString *modDate() { return m_modDate; }
++ GooString *createDate() { return m_createDate; }
++ Object &streamObject() { return m_objStr; }
++
++private:
++ GooString *m_name;
++ GooString *m_description;
++ GooString *m_createDate;
++ GooString *m_modDate;
++ Object m_objStr;
+ };
+
+ //------------------------------------------------------------------------
+@@ -92,7 +135,13 @@
+
+ // Find a named destination. Returns the link destination, or
+ // NULL if <name> is not a destination.
+- LinkDest *findDest(GooString *name);
++ LinkDest *findDest(UGooString *name);
++
++ // Get the number of embedded files
++ int numEmbeddedFiles() { return embeddedFileNameTree.numEntries(); }
++
++ // Get the i'th file embedded (at the Document level) in the document
++ EmbFile *embeddedFile(int i);
+
+ // Convert between page indices and page labels.
+ GBool labelToIndex(GooString *label, int *index);
+@@ -132,7 +181,8 @@
+ int numPages; // number of pages
+ int pagesSize; // size of pages array
+ Object dests; // named destination dictionary
+- NameTree destNameTree; // name tree
++ NameTree destNameTree; // named destination name-tree
++ NameTree embeddedFileNameTree; // embedded file name-tree
+ GooString *baseURI; // base URI for URI-type links
+ Object metadata; // metadata stream
+ Object structTreeRoot; // structure tree root dictionary
+diff -Nur poppler.0_5_0/poppler/CharCodeToUnicode.cc poppler.HEAD/poppler/CharCodeToUnicode.cc
+--- poppler.0_5_0/poppler/CharCodeToUnicode.cc 2005-09-16 20:38:58.000000000 +0200
++++ poppler.HEAD/poppler/CharCodeToUnicode.cc 2006-01-18 19:54:12.000000000 +0100
+@@ -243,8 +243,18 @@
+ }
+ if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+ tok2[0] == '<' && tok2[n2 - 1] == '>')) {
+- error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
+- continue;
++
++ // check there was no line jump inside the token and so the length is
++ // longer than it should be
++ int countAux = 0;
++ for (int k = 0; k < n1; k++)
++ if (tok1[k] != '\n' && tok1[k] != '\r') countAux++;
++
++ if (!(countAux == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
++ tok2[0] == '<' && tok2[n2 - 1] == '>')) {
++ error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
++ continue;
++ }
+ }
+ tok1[n1 - 1] = tok2[n2 - 1] = '\0';
+ if (sscanf(tok1 + 1, "%x", &code1) != 1) {
+@@ -268,8 +278,21 @@
+ }
+ if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
+ n2 == 2 + nDigits && tok2[0] == '<' && tok2[n2 - 1] == '>')) {
+- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
+- continue;
++ // check there was no line jump inside the token and so the length is
++ // longer than it should be
++ int countAux = 0;
++ for (int k = 0; k < n1; k++)
++ if (tok1[k] != '\n' && tok1[k] != '\r') countAux++;
++
++ int countAux2 = 0;
++ for (int k = 0; k < n1; k++)
++ if (tok2[k] != '\n' && tok2[k] != '\r') countAux++;
++
++ if (!(countAux == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
++ countAux2 == 2 + nDigits && tok2[0] == '<' && tok2[n2 - 1] == '>')) {
++ error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
++ continue;
++ }
+ }
+ tok1[n1 - 1] = tok2[n2 - 1] = '\0';
+ if (sscanf(tok1 + 1, "%x", &code1) != 1 ||
+diff -Nur poppler.0_5_0/poppler/Dict.cc poppler.HEAD/poppler/Dict.cc
+--- poppler.0_5_0/poppler/Dict.cc 2005-08-27 10:43:43.000000000 +0200
++++ poppler.HEAD/poppler/Dict.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -16,6 +16,7 @@
+ #include <string.h>
+ #include "goo/gmem.h"
+ #include "Object.h"
++#include "UGooString.h"
+ #include "XRef.h"
+ #include "Dict.h"
+
+@@ -34,13 +35,13 @@
+ int i;
+
+ for (i = 0; i < length; ++i) {
+- gfree(entries[i].key);
++ delete entries[i].key;
+ entries[i].val.free();
+ }
+ gfree(entries);
+ }
+
+-void Dict::add(char *key, Object *val) {
++void Dict::add(const UGooString &key, Object *val) {
+ if (length == size) {
+ if (length == 0) {
+ size = 8;
+@@ -49,16 +50,16 @@
+ }
+ entries = (DictEntry *)greallocn(entries, size, sizeof(DictEntry));
+ }
+- entries[length].key = key;
++ entries[length].key = new UGooString(key);
+ entries[length].val = *val;
+ ++length;
+ }
+
+-inline DictEntry *Dict::find(char *key) {
++inline DictEntry *Dict::find(const UGooString &key) {
+ int i;
+
+ for (i = 0; i < length; ++i) {
+- if (!strcmp(key, entries[i].key))
++ if (!key.cmp(entries[i].key))
+ return &entries[i];
+ }
+ return NULL;
+@@ -70,13 +71,13 @@
+ return (e = find("Type")) && e->val.isName(type);
+ }
+
+-Object *Dict::lookup(char *key, Object *obj) {
++Object *Dict::lookup(const UGooString &key, Object *obj) {
+ DictEntry *e;
+
+ return (e = find(key)) ? e->val.fetch(xref, obj) : obj->initNull();
+ }
+
+-Object *Dict::lookupNF(char *key, Object *obj) {
++Object *Dict::lookupNF(const UGooString &key, Object *obj) {
+ DictEntry *e;
+
+ return (e = find(key)) ? e->val.copy(obj) : obj->initNull();
+@@ -102,7 +103,7 @@
+ return success;
+ }
+
+-char *Dict::getKey(int i) {
++UGooString *Dict::getKey(int i) {
+ return entries[i].key;
+ }
+
+diff -Nur poppler.0_5_0/poppler/Dict.h poppler.HEAD/poppler/Dict.h
+--- poppler.0_5_0/poppler/Dict.h 2005-03-28 09:49:55.000000000 +0200
++++ poppler.HEAD/poppler/Dict.h 2006-01-18 23:32:13.000000000 +0100
+@@ -15,12 +15,13 @@
+
+ #include "Object.h"
+
++class UGooString;
+ //------------------------------------------------------------------------
+ // Dict
+ //------------------------------------------------------------------------
+
+ struct DictEntry {
+- char *key;
++ UGooString *key;
+ Object val;
+ };
+
+@@ -40,20 +41,20 @@
+ // Get number of entries.
+ int getLength() { return length; }
+
+- // Add an entry. NB: does not copy key.
+- void add(char *key, Object *val);
++ // Add an entry
++ void add(const UGooString &key, Object *val);
+
+ // Check if dictionary is of specified type.
+ GBool is(char *type);
+
+ // Look up an entry and return the value. Returns a null object
+ // if <key> is not in the dictionary.
+- Object *lookup(char *key, Object *obj);
+- Object *lookupNF(char *key, Object *obj);
++ Object *lookup(const UGooString &key, Object *obj);
++ Object *lookupNF(const UGooString &key, Object *obj);
+ GBool lookupInt(const char *key, const char *alt_key, int *value);
+
+ // Iterative accessors.
+- char *getKey(int i);
++ UGooString *getKey(int i);
+ Object *getVal(int i, Object *obj);
+ Object *getValNF(int i, Object *obj);
+
+@@ -70,7 +71,7 @@
+ int length; // number of entries in dictionary
+ int ref; // reference count
+
+- DictEntry *find(char *key);
++ DictEntry *find(const UGooString &key);
+ };
+
+ #endif
+diff -Nur poppler.0_5_0/poppler/FontInfo.cc poppler.HEAD/poppler/FontInfo.cc
+--- poppler.0_5_0/poppler/FontInfo.cc 2005-10-16 16:54:17.000000000 +0200
++++ poppler.HEAD/poppler/FontInfo.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -1,3 +1,4 @@
++#include "config.h"
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stddef.h>
+@@ -10,8 +11,8 @@
+ #include "GfxFont.h"
+ #include "Annot.h"
+ #include "PDFDoc.h"
+-#include "config.h"
+ #include "FontInfo.h"
++#include "UGooString.h"
+
+ FontInfoScanner::FontInfoScanner(PDFDoc *docA) {
+ doc = docA;
+diff -Nur poppler.0_5_0/poppler/Function.cc poppler.HEAD/poppler/Function.cc
+--- poppler.0_5_0/poppler/Function.cc 2005-10-16 16:58:14.000000000 +0200
++++ poppler.HEAD/poppler/Function.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -22,6 +22,7 @@
+ #include "Stream.h"
+ #include "Error.h"
+ #include "Function.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+ // Function
+diff -Nur poppler.0_5_0/poppler/Gfx.cc poppler.HEAD/poppler/Gfx.cc
+--- poppler.0_5_0/poppler/Gfx.cc 2005-12-08 19:17:42.000000000 +0100
++++ poppler.HEAD/poppler/Gfx.cc 2006-02-05 16:46:10.000000000 +0100
+@@ -35,6 +35,7 @@
+ #include "Error.h"
+ #include "Gfx.h"
+ #include "ProfileData.h"
++#include "UGooString.h"
+
+ // the MSVC math.h doesn't define this
+ #ifndef M_PI
+@@ -3525,6 +3526,7 @@
+ break;
+ }
+ dict.dictAdd(key, &obj);
++ gfree(key);
+ }
+ parser->getObj(&obj);
+ }
+@@ -3590,9 +3592,16 @@
+ printf("\n");
+ fflush(stdout);
+ }
++
++ if(numArgs == 2) {
++ out->beginMarkedContent(args[0].getName(),args[1].getDict());
++ } else {
++ out->beginMarkedContent(args[0].getName());
++ }
+ }
+
+ void Gfx::opEndMarkedContent(Object args[], int numArgs) {
++ out->endMarkedContent();
+ }
+
+ void Gfx::opMarkPoint(Object args[], int numArgs) {
+@@ -3603,6 +3612,13 @@
+ printf("\n");
+ fflush(stdout);
+ }
++
++ if(numArgs == 2) {
++ out->markPoint(args[0].getName(),args[1].getDict());
++ } else {
++ out->markPoint(args[0].getName());
++ }
++
+ }
+
+ //------------------------------------------------------------------------
+diff -Nur poppler.0_5_0/poppler/GfxFont.cc poppler.HEAD/poppler/GfxFont.cc
+--- poppler.0_5_0/poppler/GfxFont.cc 2005-10-16 17:11:32.000000000 +0200
++++ poppler.HEAD/poppler/GfxFont.cc 2006-02-05 16:46:10.000000000 +0100
+@@ -28,6 +28,7 @@
+ #include <fofi/FoFiType1.h>
+ #include <fofi/FoFiType1C.h>
+ #include <fofi/FoFiTrueType.h>
++#include "UGooString.h"
+ #include "GfxFont.h"
+
+ //------------------------------------------------------------------------
+@@ -360,7 +361,7 @@
+
+ void GfxFont::findExtFontFile() {
+ static char *type1Exts[] = { ".pfa", ".pfb", ".ps", "", NULL };
+- static char *ttExts[] = { ".ttf", NULL };
++ static char *ttExts[] = { ".ttf", ".ttc", NULL };
+
+ if (name) {
+ if (type == fontType1) {
+@@ -1521,6 +1522,54 @@
+ return cMap ? cMap->getCollection() : (GooString *)NULL;
+ }
+
++Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) {
++ Gushort *map;
++ int cmapPlatform, cmapEncoding;
++ int unicodeCmap, macRomanCmap, msSymbolCmap, cmap;
++ GBool useMacRoman, useUnicode;
++ char *charName;
++ Unicode u;
++ int code, i;
++ int mapsize;
++ int cidlen;
++
++ *mapsizep = 0;
++ if (!ctu) return NULL;
++
++ /* we use only unicode cmap */
++ cmap = -1;
++ for (i = 0; i < ff->getNumCmaps(); ++i) {
++ cmapPlatform = ff->getCmapPlatform(i);
++ cmapEncoding = ff->getCmapEncoding(i);
++ if ((cmapPlatform == 3 && cmapEncoding == 1) || cmapPlatform == 0)
++ cmap = i;
++ }
++ if (cmap < 0)
++ return NULL;
++
++ cidlen = 0;
++ mapsize = 64;
++ map = (Gushort *)gmalloc(mapsize * sizeof(Gushort));
++
++ while (cidlen < ctu->getLength()) {
++ int n;
++ if ((n = ctu->mapToUnicode((CharCode)cidlen, &u, 1)) == 0) {
++ cidlen++;
++ continue;
++ }
++ if (cidlen >= mapsize) {
++ while (cidlen >= mapsize)
++ mapsize *= 2;
++ map = (Gushort *)grealloc(map, mapsize * sizeof(Gushort));
++ }
++ map[cidlen] = ff->mapCodeToGID(cmap, u);
++ cidlen++;
++ }
++
++ *mapsizep = cidlen;
++ return map;
++}
++
+ //------------------------------------------------------------------------
+ // GfxFontDict
+ //------------------------------------------------------------------------
+@@ -1549,8 +1598,10 @@
+ r.gen = 999999;
+ }
+ }
+- fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i),
++ char *aux = fontDict->getKey(i)->getCString();
++ fonts[i] = GfxFont::makeFont(xref, aux,
+ r, obj2.getDict());
++ delete[] aux;
+ if (fonts[i] && !fonts[i]->isOk()) {
+ delete fonts[i];
+ fonts[i] = NULL;
+diff -Nur poppler.0_5_0/poppler/GfxFont.h poppler.HEAD/poppler/GfxFont.h
+--- poppler.0_5_0/poppler/GfxFont.h 2005-07-06 19:12:36.000000000 +0200
++++ poppler.HEAD/poppler/GfxFont.h 2006-02-02 23:50:01.000000000 +0100
+@@ -310,6 +310,8 @@
+ Gushort *getCIDToGID() { return cidToGID; }
+ int getCIDToGIDLen() { return cidToGIDLen; }
+
++ Gushort *getCodeToGIDMap(FoFiTrueType *ff, int *length);
++
+ private:
+
+ CMap *cMap; // char code --> CID
+diff -Nur poppler.0_5_0/poppler/GfxState.cc poppler.HEAD/poppler/GfxState.cc
+--- poppler.0_5_0/poppler/GfxState.cc 2005-12-09 21:49:59.000000000 +0100
++++ poppler.HEAD/poppler/GfxState.cc 2006-02-18 21:17:00.000000000 +0100
+@@ -21,6 +21,7 @@
+ #include "Array.h"
+ #include "Page.h"
+ #include "GfxState.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+
+@@ -204,6 +205,23 @@
+ }
+ }
+
++void GfxColorSpace::getGrayLine(Guchar *in, unsigned char *out, int length) {
++ int i, j, n;
++ GfxColor color;
++ GfxGray gray;
++
++ n = getNComps();
++ for (i = 0; i < length; i++) {
++
++ for (j = 0; j < n; j++)
++ color.c[j] = in[i * n + j] * 256;
++
++ getGray (&color, &gray);
++ out[i] = colToByte(gray);
++ }
++}
++
++
+ //------------------------------------------------------------------------
+ // GfxDeviceGrayColorSpace
+ //------------------------------------------------------------------------
+@@ -3433,6 +3451,39 @@
+ }
+ }
+
++void GfxImageColorMap::getGrayLine(Guchar *in, Guchar *out, int length) {
++ GfxColor color;
++ double *p;
++ int i, j;
++ Guchar *inp, *outp, *tmp_line;
++ GfxColorSpace *base;
++
++ switch (colorSpace->getMode()) {
++ case csIndexed:
++ case csSeparation:
++ tmp_line = (Guchar *) gmalloc (length * nComps2);
++ for (i = 0; i < length; i++) {
++ for (j = 0; j < nComps2; j++) {
++ tmp_line[i * nComps2 + j] = byte_lookup[in[i] * nComps2 + j];
++ }
++ }
++ colorSpace2->getGrayLine(tmp_line, out, length);
++ gfree (tmp_line);
++ break;
++
++ default:
++ inp = in;
++ for (j = 0; j < length; j++)
++ for (i = 0; i < nComps; i++) {
++ *inp = byte_lookup[*inp * nComps + i];
++ inp++;
++ }
++ colorSpace->getGrayLine(in, out, length);
++ break;
++ }
++
++}
++
+ void GfxImageColorMap::getRGBLine(Guchar *in, unsigned int *out, int length) {
+ GfxColor color;
+ double *p;
+diff -Nur poppler.0_5_0/poppler/GfxState.h poppler.HEAD/poppler/GfxState.h
+--- poppler.0_5_0/poppler/GfxState.h 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/GfxState.h 2006-02-18 21:17:00.000000000 +0100
+@@ -151,6 +151,7 @@
+ virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0;
+ virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0;
+ virtual void getRGBLine(Guchar *in, unsigned int *out, int length);
++ virtual void getGrayLine(Guchar *in, Guchar *out, int length);
+
+ // Return the number of color components.
+ virtual int getNComps() = 0;
+@@ -869,6 +870,7 @@
+ void getGray(Guchar *x, GfxGray *gray);
+ void getRGB(Guchar *x, GfxRGB *rgb);
+ void getRGBLine(Guchar *in, unsigned int *out, int length);
++ void getGrayLine(Guchar *in, Guchar *out, int length);
+ void getCMYK(Guchar *x, GfxCMYK *cmyk);
+ void getColor(Guchar *x, GfxColor *color);
+
+diff -Nur poppler.0_5_0/poppler/GlobalParams.cc poppler.HEAD/poppler/GlobalParams.cc
+--- poppler.0_5_0/poppler/GlobalParams.cc 2005-12-08 19:17:42.000000000 +0100
++++ poppler.HEAD/poppler/GlobalParams.cc 2006-02-04 21:48:25.000000000 +0100
+@@ -23,9 +23,6 @@
+ #ifdef WIN32
+ # include <shlobj.h>
+ #endif
+-#if HAVE_PAPER_H
+-#include <paper.h>
+-#endif
+ #include <fontconfig/fontconfig.h>
+ #include "goo/gmem.h"
+ #include "goo/GooString.h"
+@@ -324,24 +321,8 @@
+ cMapDirs = new GooHash(gTrue);
+ toUnicodeDirs = new GooList();
+ displayFonts = new GooHash();
+-#if HAVE_PAPER_H
+- char *paperName;
+- const struct paper *paperType;
+- paperinit();
+- if ((paperName = systempapername())) {
+- paperType = paperinfo(paperName);
+- psPaperWidth = (int)paperpswidth(paperType);
+- psPaperHeight = (int)paperpsheight(paperType);
+- } else {
+- error(-1, "No paper information available - using defaults");
+- psPaperWidth = defPaperWidth;
+- psPaperHeight = defPaperHeight;
+- }
+- paperdone();
+-#else
+- psPaperWidth = defPaperWidth;
+- psPaperHeight = defPaperHeight;
+-#endif
++ psPaperWidth = -1;
++ psPaperHeight = -1;
+ psImageableLLX = psImageableLLY = 0;
+ psImageableURX = psPaperWidth;
+ psImageableURY = psPaperHeight;
+@@ -1122,7 +1103,7 @@
+ }
+ }
+
+-FcPattern *buildFcPattern(GfxFont *font)
++static FcPattern *buildFcPattern(GfxFont *font)
+ {
+ int weight = FC_WEIGHT_NORMAL,
+ slant = FC_SLANT_ROMAN,
+@@ -1266,7 +1247,7 @@
+
+ DisplayFontParam *GlobalParams::getDisplayFont(GfxFont *font) {
+ DisplayFontParam *dfp;
+- FcPattern *p=0,*m=0;
++ FcPattern *p=0;
+
+ GooString *fontName = font->getName();
+ if (!fontName) return NULL;
+@@ -1278,38 +1259,44 @@
+ FcChar8* s;
+ char * ext;
+ FcResult res;
++ FcFontSet *set;
++ int i;
+ p = buildFcPattern(font);
+
+ if (!p)
+ goto fin;
+ FcConfigSubstitute(FCcfg, p, FcMatchPattern);
+ FcDefaultSubstitute(p);
+- m = FcFontMatch(FCcfg,p,&res);
+- if (!m)
+- goto fin;
+- res = FcPatternGetString(m, FC_FILE, 0, &s);
+- if (res != FcResultMatch || !s)
+- goto fin;
+- ext = strrchr((char*)s,'.');
+- if (!ext)
++ set = FcFontSort(FCcfg, p, FcFalse, NULL, &res);
++ if (!set)
+ goto fin;
+- if (!strncasecmp(ext,".ttf",4))
+- {
+- dfp = new DisplayFontParam(fontName->copy(), displayFontTT);
+- dfp->tt.fileName = new GooString((char*)s);
+- }
+- else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4))
++ for (i = 0; i < set->nfont; ++i)
+ {
+- dfp = new DisplayFontParam(fontName->copy(), displayFontT1);
+- dfp->t1.fileName = new GooString((char*)s);
++ res = FcPatternGetString(set->fonts[i], FC_FILE, 0, &s);
++ if (res != FcResultMatch || !s)
++ continue;
++ ext = strrchr((char*)s,'.');
++ if (!ext)
++ continue;
++ if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4))
++ {
++ dfp = new DisplayFontParam(fontName->copy(), displayFontTT);
++ dfp->tt.fileName = new GooString((char*)s);
++ FcPatternGetInteger(set->fonts[i], FC_INDEX, 0, &(dfp->tt.faceIndex));
++ }
++ else if (!strncasecmp(ext,".pfa",4) || !strncasecmp(ext,".pfb",4))
++ {
++ dfp = new DisplayFontParam(fontName->copy(), displayFontT1);
++ dfp->t1.fileName = new GooString((char*)s);
++ }
++ else
++ continue;
++ displayFonts->add(dfp->name,dfp);
++ break;
+ }
+- else
+- goto fin;
+- displayFonts->add(dfp->name,dfp);
++ FcFontSetDestroy(set);
+ }
+ fin:
+- if (m)
+- FcPatternDestroy(m);
+ if (p)
+ FcPatternDestroy(p);
+
+diff -Nur poppler.0_5_0/poppler/GlobalParams.h poppler.HEAD/poppler/GlobalParams.h
+--- poppler.0_5_0/poppler/GlobalParams.h 2005-09-20 16:00:43.000000000 +0200
++++ poppler.HEAD/poppler/GlobalParams.h 2006-02-02 23:50:01.000000000 +0100
+@@ -55,6 +55,7 @@
+
+ struct DisplayFontParamTT {
+ GooString *fileName;
++ int faceIndex;
+ };
+
+ class DisplayFontParam {
+diff -Nur poppler.0_5_0/poppler/Lexer.cc poppler.HEAD/poppler/Lexer.cc
+--- poppler.0_5_0/poppler/Lexer.cc 2005-08-31 17:28:46.000000000 +0200
++++ poppler.HEAD/poppler/Lexer.cc 2006-01-17 22:35:31.000000000 +0100
+@@ -18,6 +18,7 @@
+ #include <ctype.h>
+ #include "Lexer.h"
+ #include "Error.h"
++#include "XRef.h"
+
+ //------------------------------------------------------------------------
+
+@@ -46,9 +47,11 @@
+ // Lexer
+ //------------------------------------------------------------------------
+
+-Lexer::Lexer(XRef *xref, Stream *str) {
++Lexer::Lexer(XRef *xrefA, Stream *str) {
+ Object obj;
+
++ xref = xrefA;
++
+ curStr.initStream(str);
+ streams = new Array(xref);
+ streams->add(curStr.copy(&obj));
+@@ -57,9 +60,11 @@
+ curStr.streamReset();
+ }
+
+-Lexer::Lexer(XRef *xref, Object *obj) {
++Lexer::Lexer(XRef *xrefA, Object *obj) {
+ Object obj2;
+
++ xref = xrefA;
++
+ if (obj->isStream()) {
+ streams = new Array(xref);
+ freeArray = gTrue;
+@@ -108,7 +113,7 @@
+ return curStr.streamLookChar();
+ }
+
+-Object *Lexer::getObj(Object *obj) {
++Object *Lexer::getObj(Object *obj, int objNum) {
+ char *p;
+ int c, c2;
+ GBool comment, neg, done;
+@@ -291,6 +296,17 @@
+ s->append(tokBuf, tokBufSize);
+ p = tokBuf;
+ n = 0;
++
++ // we are growing see if the document is not malformed and we are growing too much
++ if (objNum != -1)
++ {
++ int newObjNum = xref->getNumEntry(getPos());
++ if (newObjNum != objNum)
++ {
++ error(getPos(), "Unterminated string");
++ done = gTrue;
++ }
++ }
+ }
+ *p++ = (char)c2;
+ ++n;
+diff -Nur poppler.0_5_0/poppler/Lexer.h poppler.HEAD/poppler/Lexer.h
+--- poppler.0_5_0/poppler/Lexer.h 2005-08-31 17:28:46.000000000 +0200
++++ poppler.HEAD/poppler/Lexer.h 2006-01-17 22:35:31.000000000 +0100
+@@ -29,17 +29,17 @@
+
+ // Construct a lexer for a single stream. Deletes the stream when
+ // lexer is deleted.
+- Lexer(XRef *xref, Stream *str);
++ Lexer(XRef *xrefA, Stream *str);
+
+ // Construct a lexer for a stream or array of streams (assumes obj
+ // is either a stream or array of streams).
+- Lexer(XRef *xref, Object *obj);
++ Lexer(XRef *xrefA, Object *obj);
+
+ // Destructor.
+ ~Lexer();
+
+ // Get the next object from the input stream.
+- Object *getObj(Object *obj);
++ Object *getObj(Object *obj, int objNum = -1);
+
+ // Skip to the beginning of the next line in the input stream.
+ void skipToNextLine();
+@@ -73,6 +73,8 @@
+ Object curStr; // current stream
+ GBool freeArray; // should lexer free the streams array?
+ char tokBuf[tokBufSize]; // temporary token buffer
++
++ XRef *xref;
+ };
+
+ #endif
+diff -Nur poppler.0_5_0/poppler/Link.cc poppler.HEAD/poppler/Link.cc
+--- poppler.0_5_0/poppler/Link.cc 2005-09-20 16:34:31.000000000 +0200
++++ poppler.HEAD/poppler/Link.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -21,6 +21,7 @@
+ #include "Array.h"
+ #include "Dict.h"
+ #include "Link.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+ // LinkAction
+@@ -421,9 +422,9 @@
+
+ // named destination
+ if (destObj->isName()) {
+- namedDest = new GooString(destObj->getName());
++ namedDest = new UGooString(destObj->getName());
+ } else if (destObj->isString()) {
+- namedDest = destObj->getString()->copy();
++ namedDest = new UGooString(*destObj->getString());
+
+ // destination dictionary
+ } else if (destObj->isArray()) {
+@@ -459,9 +460,9 @@
+
+ // named destination
+ if (destObj->isName()) {
+- namedDest = new GooString(destObj->getName());
++ namedDest = new UGooString(destObj->getName());
+ } else if (destObj->isString()) {
+- namedDest = destObj->getString()->copy();
++ namedDest = new UGooString(*destObj->getString());
+
+ // destination dictionary
+ } else if (destObj->isArray()) {
+diff -Nur poppler.0_5_0/poppler/Link.h poppler.HEAD/poppler/Link.h
+--- poppler.0_5_0/poppler/Link.h 2005-03-03 20:46:01.000000000 +0100
++++ poppler.HEAD/poppler/Link.h 2006-01-18 23:32:13.000000000 +0100
+@@ -16,6 +16,7 @@
+ #include "Object.h"
+
+ class GooString;
++class UGooString;
+ class Array;
+ class Dict;
+
+@@ -134,13 +135,13 @@
+ // Accessors.
+ virtual LinkActionKind getKind() { return actionGoTo; }
+ LinkDest *getDest() { return dest; }
+- GooString *getNamedDest() { return namedDest; }
++ UGooString *getNamedDest() { return namedDest; }
+
+ private:
+
+ LinkDest *dest; // regular destination (NULL for remote
+ // link with bad destination)
+- GooString *namedDest; // named destination (only one of dest and
++ UGooString *namedDest; // named destination (only one of dest and
+ // and namedDest may be non-NULL)
+ };
+
+@@ -165,14 +166,14 @@
+ virtual LinkActionKind getKind() { return actionGoToR; }
+ GooString *getFileName() { return fileName; }
+ LinkDest *getDest() { return dest; }
+- GooString *getNamedDest() { return namedDest; }
++ UGooString *getNamedDest() { return namedDest; }
+
+ private:
+
+ GooString *fileName; // file name
+ LinkDest *dest; // regular destination (NULL for remote
+ // link with bad destination)
+- GooString *namedDest; // named destination (only one of dest and
++ UGooString *namedDest; // named destination (only one of dest and
+ // and namedDest may be non-NULL)
+ };
+
+diff -Nur poppler.0_5_0/poppler/Makefile.am poppler.HEAD/poppler/Makefile.am
+--- poppler.0_5_0/poppler/Makefile.am 2006-01-06 11:05:58.000000000 +0100
++++ poppler.HEAD/poppler/Makefile.am 2006-02-16 20:28:54.000000000 +0100
+@@ -92,6 +92,8 @@
+ $(zlib_libs) \
+ $(FREETYPE_LIBS)
+
++libpoppler_la_LDFLAGS = -version-info 1:0:0
++
+ if ENABLE_XPDF_HEADERS
+
+ poppler_includedir = $(includedir)/poppler
+@@ -146,6 +148,7 @@
+ PSOutputDev.h \
+ TextOutputDev.h \
+ SecurityHandler.h \
++ UGooString.h \
+ UTF8.h \
+ XpdfPluginAPI.h \
+ poppler-config.h
+@@ -199,4 +202,5 @@
+ PageLabelInfo.h \
+ PageLabelInfo.cc \
+ SecurityHandler.cc \
++ UGooString.cc \
+ XpdfPluginAPI.cc
+diff -Nur poppler.0_5_0/poppler/Object.h poppler.HEAD/poppler/Object.h
+--- poppler.0_5_0/poppler/Object.h 2005-03-03 20:46:01.000000000 +0100
++++ poppler.HEAD/poppler/Object.h 2006-01-18 23:32:13.000000000 +0100
+@@ -23,6 +23,7 @@
+ class Array;
+ class Dict;
+ class Stream;
++class UGooString;
+
+ //------------------------------------------------------------------------
+ // Ref
+@@ -163,11 +164,11 @@
+
+ // Dict accessors.
+ int dictGetLength();
+- void dictAdd(char *key, Object *val);
++ void dictAdd(const UGooString &key, Object *val);
+ GBool dictIs(char *dictType);
+- Object *dictLookup(char *key, Object *obj);
+- Object *dictLookupNF(char *key, Object *obj);
+- char *dictGetKey(int i);
++ Object *dictLookup(const UGooString &key, Object *obj);
++ Object *dictLookupNF(const UGooString &key, Object *obj);
++ UGooString *dictGetKey(int i);
+ Object *dictGetVal(int i, Object *obj);
+ Object *dictGetValNF(int i, Object *obj);
+
+@@ -238,7 +239,7 @@
+ inline int Object::dictGetLength()
+ { return dict->getLength(); }
+
+-inline void Object::dictAdd(char *key, Object *val)
++inline void Object::dictAdd(const UGooString &key, Object *val)
+ { dict->add(key, val); }
+
+ inline GBool Object::dictIs(char *dictType)
+@@ -247,13 +248,13 @@
+ inline GBool Object::isDict(char *dictType)
+ { return type == objDict && dictIs(dictType); }
+
+-inline Object *Object::dictLookup(char *key, Object *obj)
++inline Object *Object::dictLookup(const UGooString &key, Object *obj)
+ { return dict->lookup(key, obj); }
+
+-inline Object *Object::dictLookupNF(char *key, Object *obj)
++inline Object *Object::dictLookupNF(const UGooString &key, Object *obj)
+ { return dict->lookupNF(key, obj); }
+
+-inline char *Object::dictGetKey(int i)
++inline UGooString *Object::dictGetKey(int i)
+ { return dict->getKey(i); }
+
+ inline Object *Object::dictGetVal(int i, Object *obj)
+diff -Nur poppler.0_5_0/poppler/Outline.cc poppler.HEAD/poppler/Outline.cc
+--- poppler.0_5_0/poppler/Outline.cc 2005-09-15 14:32:25.000000000 +0200
++++ poppler.HEAD/poppler/Outline.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -18,6 +18,7 @@
+ #include "Link.h"
+ #include "PDFDocEncoding.h"
+ #include "Outline.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+
+diff -Nur poppler.0_5_0/poppler/OutputDev.cc poppler.HEAD/poppler/OutputDev.cc
+--- poppler.0_5_0/poppler/OutputDev.cc 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/OutputDev.cc 2006-02-04 22:10:41.000000000 +0100
+@@ -121,6 +121,22 @@
+ drawImage(state, ref, str, width, height, colorMap, NULL, gFalse);
+ }
+
++void OutputDev::endMarkedContent() {
++}
++
++void OutputDev::beginMarkedContent(char *name) {
++}
++
++void OutputDev::beginMarkedContent(char *name, Dict *properties) {
++}
++
++void OutputDev::markPoint(char *name) {
++}
++
++void OutputDev::markPoint(char *name, Dict *properties) {
++}
++
++
+ #if OPI_SUPPORT
+ void OutputDev::opiBegin(GfxState *state, Dict *opiDict) {
+ }
+diff -Nur poppler.0_5_0/poppler/OutputDev.h poppler.HEAD/poppler/OutputDev.h
+--- poppler.0_5_0/poppler/OutputDev.h 2005-11-01 16:29:32.000000000 +0100
++++ poppler.HEAD/poppler/OutputDev.h 2006-02-04 22:10:41.000000000 +0100
+@@ -183,6 +183,16 @@
+ int maskWidth, int maskHeight,
+ GfxImageColorMap *maskColorMap);
+
++ //----- grouping operators
++
++ virtual void endMarkedContent();
++ virtual void beginMarkedContent(char *name);
++ virtual void beginMarkedContent(char *name, Dict *properties);
++ virtual void markPoint(char *name);
++ virtual void markPoint(char *name, Dict *properties);
++
++
++
+ #if OPI_SUPPORT
+ //----- OPI functions
+ virtual void opiBegin(GfxState *state, Dict *opiDict);
+diff -Nur poppler.0_5_0/poppler/Page.cc poppler.HEAD/poppler/Page.cc
+--- poppler.0_5_0/poppler/Page.cc 2006-01-08 23:51:17.000000000 +0100
++++ poppler.HEAD/poppler/Page.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -29,6 +29,7 @@
+ #endif
+ #include "Error.h"
+ #include "Page.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+ // PageAttrs
+diff -Nur poppler.0_5_0/poppler/PageLabelInfo.cc poppler.HEAD/poppler/PageLabelInfo.cc
+--- poppler.0_5_0/poppler/PageLabelInfo.cc 2005-07-29 00:56:17.000000000 +0200
++++ poppler.HEAD/poppler/PageLabelInfo.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -2,6 +2,7 @@
+ #include <stdlib.h>
+ #include <stdio.h>
+ #include <assert.h>
++#include "UGooString.h"
+
+ #include "PageLabelInfo.h"
+
+diff -Nur poppler.0_5_0/poppler/Parser.cc poppler.HEAD/poppler/Parser.cc
+--- poppler.0_5_0/poppler/Parser.cc 2005-09-20 17:27:31.000000000 +0200
++++ poppler.HEAD/poppler/Parser.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -20,6 +20,7 @@
+ #include "XRef.h"
+ #include "Error.h"
+ #include "Decrypt.h"
++#include "UGooString.h"
+
+ Parser::Parser(XRef *xrefA, Lexer *lexerA) {
+ xref = xrefA;
+@@ -68,7 +69,7 @@
+
+ // dictionary or stream
+ } else if (buf1.isCmd("<<")) {
+- shift();
++ shift(objNum);
+ obj->initDict(xref);
+ while (!buf1.isCmd(">>") && !buf1.isEOF()) {
+ if (!buf1.isName()) {
+@@ -82,6 +83,7 @@
+ break;
+ }
+ obj->dictAdd(key, getObj(&obj2, fileKey, keyLength, objNum, objGen));
++ gfree(key);
+ }
+ }
+ if (buf1.isEOF())
+@@ -192,7 +194,7 @@
+ return str;
+ }
+
+-void Parser::shift() {
++void Parser::shift(int objNum) {
+ if (inlineImg > 0) {
+ if (inlineImg < 2) {
+ ++inlineImg;
+@@ -210,5 +212,5 @@
+ if (inlineImg > 0) // don't buffer inline image data
+ buf2.initNull();
+ else
+- lexer->getObj(&buf2);
++ lexer->getObj(&buf2, objNum);
+ }
+diff -Nur poppler.0_5_0/poppler/Parser.h poppler.HEAD/poppler/Parser.h
+--- poppler.0_5_0/poppler/Parser.h 2005-09-16 20:29:18.000000000 +0200
++++ poppler.HEAD/poppler/Parser.h 2006-01-17 22:35:31.000000000 +0100
+@@ -47,7 +47,7 @@
+ int inlineImg; // set when inline image data is encountered
+
+ Stream *makeStream(Object *dict);
+- void shift();
++ void shift(int objNum = -1);
+ };
+
+ #endif
+diff -Nur poppler.0_5_0/poppler/PDFDoc.cc poppler.HEAD/poppler/PDFDoc.cc
+--- poppler.0_5_0/poppler/PDFDoc.cc 2005-12-07 09:42:21.000000000 +0100
++++ poppler.HEAD/poppler/PDFDoc.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -38,6 +38,7 @@
+ #include "Outline.h"
+ #endif
+ #include "PDFDoc.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+
+diff -Nur poppler.0_5_0/poppler/PDFDoc.h poppler.HEAD/poppler/PDFDoc.h
+--- poppler.0_5_0/poppler/PDFDoc.h 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/PDFDoc.h 2006-01-18 23:32:13.000000000 +0100
+@@ -123,7 +123,7 @@
+
+ // Find a named destination. Returns the link destination, or
+ // NULL if <name> is not a destination.
+- LinkDest *findDest(GooString *name)
++ LinkDest *findDest(UGooString *name)
+ { return catalog->findDest(name); }
+
+ #ifndef DISABLE_OUTLINE
+diff -Nur poppler.0_5_0/poppler/poppler-config.h.in poppler.HEAD/poppler/poppler-config.h.in
+--- poppler.0_5_0/poppler/poppler-config.h.in 2005-10-17 04:17:52.000000000 +0200
++++ poppler.HEAD/poppler/poppler-config.h.in 2006-01-23 19:52:48.000000000 +0100
+@@ -14,11 +14,6 @@
+ // around #undef look odd, but it's to silence warnings about
+ // redefining those symbols.
+
+-/* Use A4 paper size instead of Letter for PostScript output. */
+-#ifndef A4_PAPER
+-#undef A4_PAPER
+-#endif
+-
+ /* Enable multithreading support. */
+ #ifndef MULTITHREADING
+ #undef MULTITHREADED
+diff -Nur poppler.0_5_0/poppler/PSOutputDev.cc poppler.HEAD/poppler/PSOutputDev.cc
+--- poppler.0_5_0/poppler/PSOutputDev.cc 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/PSOutputDev.cc 2006-02-13 23:38:44.000000000 +0100
+@@ -35,6 +35,7 @@
+ #include "Stream.h"
+ #include "Annot.h"
+ #include "PSOutputDev.h"
++#include "UGooString.h"
+
+ #ifdef MACOS
+ // needed for setting type/creator of MacOS files
+@@ -1039,6 +1040,7 @@
+ fontFileNameSize = 64;
+ fontFileNameLen = 0;
+ fontFileNames = (GooString **)gmallocn(fontFileNameSize, sizeof(GooString *));
++ psFileNames = (GooString **)gmallocn(fontFileNameSize, sizeof(GooString *));
+ nextTrueTypeNum = 0;
+ font16EncLen = 0;
+ font16EncSize = 0;
+@@ -1123,6 +1125,13 @@
+ }
+ gfree(fontFileNames);
+ }
++ if (psFileNames) {
++ for (i = 0; i < fontFileNameLen; ++i) {
++ if (psFileNames[i])
++ delete psFileNames[i];
++ }
++ gfree(psFileNames);
++ }
+ if (font16Enc) {
+ for (i = 0; i < font16EncLen; ++i) {
+ delete font16Enc[i].enc;
+@@ -1490,6 +1499,7 @@
+ double w1, w2;
+ double *fm;
+ int i, j;
++ DisplayFontParam *dfp;
+
+ // check if font is already set up
+ for (i = 0; i < fontIDLen; ++i) {
+@@ -1547,8 +1557,7 @@
+ } else if (globalParams->getPSEmbedTrueType() &&
+ font->getType() == fontTrueType &&
+ font->getExtFontFile()) {
+- psName = filterPSName(font->getName());
+- setupExternalTrueTypeFont(font, psName);
++ psName = setupExternalTrueTypeFont(font);
+
+ // check for embedded CID PostScript font
+ } else if (globalParams->getPSEmbedCIDPostScript() &&
+@@ -1570,6 +1579,12 @@
+ psName = new GooString(type3Name);
+ setupType3Font(font, psName, parentResDict);
+
++ // check for external CID TrueType font file
++ } else if (globalParams->getPSEmbedCIDTrueType() &&
++ font->getType() == fontCIDType2 &&
++ font->getExtFontFile()) {
++ psName = setupExternalCIDTrueTypeFont(font, font->getExtFontFile());
++
+ // do 8-bit font substitution
+ } else if (!font->isCIDFont()) {
+ subst = gTrue;
+@@ -1651,6 +1666,14 @@
+ font16Enc[font16EncLen].enc->getCString());
+ }
+
++ // try the display font for embedding
++ } else if (globalParams->getPSEmbedCIDTrueType() &&
++ ((GfxCIDFont *)font)->getCollection() &&
++ (dfp = globalParams->
++ getDisplayFont(font)) &&
++ dfp->kind == displayFontTT) {
++ psName = setupExternalCIDTrueTypeFont(font, dfp->tt.fileName, dfp->tt.faceIndex);
++
+ // give up - can't do anything with this font
+ } else {
+ error(-1, "Couldn't find a font to substitute for '%s' ('%s' character collection)",
+@@ -1860,8 +1883,12 @@
+ fontFileNameSize += 64;
+ fontFileNames = (GooString **)greallocn(fontFileNames,
+ fontFileNameSize, sizeof(GooString *));
++ psFileNames = (GooString **)greallocn(psFileNames,
++ fontFileNameSize, sizeof(GooString *));
+ }
+- fontFileNames[fontFileNameLen++] = fileName->copy();
++ fontFileNames[fontFileNameLen] = fileName->copy();
++ psFileNames[fontFileNameLen] = psName->copy();
++ fontFileNameLen++;
+
+ // beginning comment
+ writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
+@@ -1974,25 +2001,24 @@
+ writePS("%%EndResource\n");
+ }
+
+-void PSOutputDev::setupExternalTrueTypeFont(GfxFont *font, GooString *psName) {
+- char unique[32];
++GooString *PSOutputDev::setupExternalTrueTypeFont(GfxFont *font) {
+ GooString *fileName;
+ char *fontBuf;
+ int fontLen;
+ FoFiTrueType *ffTT;
+ Gushort *codeToGID;
++ GooString *psName;
+ int i;
+
+ // check if font is already embedded
+ fileName = font->getExtFontFile();
+ for (i = 0; i < fontFileNameLen; ++i) {
+ if (!fontFileNames[i]->cmp(fileName)) {
+- sprintf(unique, "_%d", nextTrueTypeNum++);
+- psName->append(unique);
+- break;
++ return psFileNames[i]->copy();
+ }
+ }
+
++ psName = filterPSName(font->getName());
+ // add entry to fontFileNames list
+ if (i == fontFileNameLen) {
+ if (fontFileNameLen >= fontFileNameSize) {
+@@ -2000,9 +2026,14 @@
+ fontFileNames =
+ (GooString **)greallocn(fontFileNames,
+ fontFileNameSize, sizeof(GooString *));
++ psFileNames =
++ (GooString **)greallocn(psFileNames,
++ fontFileNameSize, sizeof(GooString *));
+ }
+ }
+- fontFileNames[fontFileNameLen++] = fileName->copy();
++ fontFileNames[fontFileNameLen] = fileName->copy();
++ psFileNames[fontFileNameLen] = psName->copy();
++ fontFileNameLen++;
+
+ // beginning comment
+ writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
+@@ -2025,6 +2056,82 @@
+
+ // ending comment
+ writePS("%%EndResource\n");
++ return psName;
++}
++
++GooString *PSOutputDev::setupExternalCIDTrueTypeFont(GfxFont *font, GooString *fileName, int faceIndex) {
++// char *fontBuf;
++// int fontLen;
++ FoFiTrueType *ffTT;
++ Gushort *codeToGID;
++ GooString *psName;
++ int i;
++ GooString *myFileName;
++
++ myFileName = fileName->copy();
++ if (faceIndex > 0) {
++ char tmp[32];
++ sprintf(tmp, ",%d", faceIndex);
++ myFileName->append(tmp);
++ }
++ // check if font is already embedded
++ for (i = 0; i < fontFileNameLen; ++i) {
++ if (!fontFileNames[i]->cmp(myFileName)) {
++ delete myFileName;
++ return psFileNames[i]->copy();
++ }
++ }
++
++ psName = filterPSName(font->getName());
++ // add entry to fontFileNames list
++ if (i == fontFileNameLen) {
++ if (fontFileNameLen >= fontFileNameSize) {
++ fontFileNameSize += 64;
++ fontFileNames =
++ (GooString **)grealloc(fontFileNames,
++ fontFileNameSize * sizeof(GooString *));
++ psFileNames =
++ (GooString **)grealloc(psFileNames,
++ fontFileNameSize * sizeof(GooString *));
++ }
++ }
++ fontFileNames[fontFileNameLen] = myFileName;
++ psFileNames[fontFileNameLen] = psName->copy();
++ fontFileNameLen++;
++
++ // beginning comment
++ writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
++ embFontList->append("%%+ font ");
++ embFontList->append(psName->getCString());
++ embFontList->append("\n");
++
++ // convert it to a CID type2 font
++ if ((ffTT = FoFiTrueType::load(fileName->getCString(), faceIndex))) {
++ int n = ((GfxCIDFont *)font)->getCIDToGIDLen();
++ if (n) {
++ codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort));
++ memcpy(codeToGID, ((GfxCIDFont *)font)->getCIDToGID(), n * sizeof(Gushort));
++ } else {
++ codeToGID = ((GfxCIDFont *)font)->getCodeToGIDMap(ffTT, &n);
++ }
++ if (globalParams->getPSLevel() >= psLevel3) {
++ // Level 3: use a CID font
++ ffTT->convertToCIDType2(psName->getCString(),
++ codeToGID, n, gTrue,
++ outputFunc, outputStream);
++ } else {
++ // otherwise: use a non-CID composite font
++ ffTT->convertToType0(psName->getCString(),
++ codeToGID, n, gTrue,
++ outputFunc, outputStream);
++ }
++ gfree(codeToGID);
++ delete ffTT;
++ }
++
++ // ending comment
++ writePS("%%EndResource\n");
++ return psName;
+ }
+
+ void PSOutputDev::setupEmbeddedCIDType0Font(GfxFont *font, Ref *id,
+@@ -2188,7 +2295,9 @@
+ t3Cacheable = gFalse;
+ for (i = 0; i < charProcs->getLength(); ++i) {
+ writePS("/");
+- writePSName(charProcs->getKey(i));
++ char *aux = charProcs->getKey(i)->getCString();
++ writePSName(aux);
++ delete[] aux;
+ writePS(" {\n");
+ gfx->display(charProcs->getVal(i, &charProc));
+ charProc.free();
+diff -Nur poppler.0_5_0/poppler/PSOutputDev.h poppler.HEAD/poppler/PSOutputDev.h
+--- poppler.0_5_0/poppler/PSOutputDev.h 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/PSOutputDev.h 2006-02-13 23:38:44.000000000 +0100
+@@ -237,10 +237,11 @@
+ void setupExternalType1Font(GooString *fileName, GooString *psName);
+ void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GooString *psName);
+ void setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, GooString *psName);
+- void setupExternalTrueTypeFont(GfxFont *font, GooString *psName);
++ GooString *setupExternalTrueTypeFont(GfxFont *font);
+ void setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, GooString *psName);
+ void setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, GooString *psName,
+ GBool needVerticalMetrics);
++ GooString *setupExternalCIDTrueTypeFont(GfxFont *font, GooString *fileName, int faceIndex = 0);
+ void setupType3Font(GfxFont *font, GooString *psName, Dict *parentResDict);
+ void setupImages(Dict *resDict);
+ void setupImage(Ref id, Stream *str);
+@@ -301,6 +302,7 @@
+ int fontFileIDLen; // number of entries in fontFileIDs array
+ int fontFileIDSize; // size of fontFileIDs array
+ GooString **fontFileNames; // list of names of all embedded external fonts
++ GooString **psFileNames; // list of names of all embedded external fonts
+ int fontFileNameLen; // number of entries in fontFileNames array
+ int fontFileNameSize; // size of fontFileNames array
+ int nextTrueTypeNum; // next unique number to append to a TrueType
+diff -Nur poppler.0_5_0/poppler/SecurityHandler.cc poppler.HEAD/poppler/SecurityHandler.cc
+--- poppler.0_5_0/poppler/SecurityHandler.cc 2005-09-16 20:29:18.000000000 +0200
++++ poppler.HEAD/poppler/SecurityHandler.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -26,6 +26,7 @@
+ # include "XpdfPluginAPI.h"
+ #endif
+ #include "SecurityHandler.h"
++#include "UGooString.h"
+
+ //------------------------------------------------------------------------
+ // SecurityHandler
+diff -Nur poppler.0_5_0/poppler/SplashOutputDev.cc poppler.HEAD/poppler/SplashOutputDev.cc
+--- poppler.0_5_0/poppler/SplashOutputDev.cc 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/poppler/SplashOutputDev.cc 2006-02-05 16:46:10.000000000 +0100
+@@ -941,11 +941,13 @@
+ GfxFontType fontType;
+ SplashOutFontFileID *id;
+ SplashFontFile *fontFile;
++ SplashFontSrc *fontsrc;
+ FoFiTrueType *ff;
+ Ref embRef;
+ Object refObj, strObj;
+- GooString *tmpFileName, *fileName, *substName;
+- FILE *tmpFile;
++ GooString *fileName, *substName;
++ char *tmpBuf;
++ int tmpBufLen;
+ Gushort *codeToGID;
+ DisplayFontParam *dfp;
+ CharCodeToUnicode *ctu;
+@@ -954,10 +956,12 @@
+ char *name;
+ Unicode uBuf[8];
+ int c, substIdx, n, code, cmap;
++ int faceIndex = 0;
+
+ needFontUpdate = gFalse;
+ font = NULL;
+- tmpFileName = NULL;
++ fileName = NULL;
++ tmpBuf = NULL;
+ substIdx = -1;
+ dfp = NULL;
+
+@@ -978,22 +982,9 @@
+
+ // if there is an embedded font, write it to disk
+ if (gfxFont->getEmbeddedFontID(&embRef)) {
+- if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
+- error(-1, "Couldn't create temporary font file");
++ tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);
++ if (! tmpBuf)
+ goto err2;
+- }
+- refObj.initRef(embRef.num, embRef.gen);
+- refObj.fetch(xref, &strObj);
+- refObj.free();
+- strObj.streamReset();
+- while ((c = strObj.streamGetChar()) != EOF) {
+- fputc(c, tmpFile);
+- }
+- strObj.streamClose();
+- strObj.free();
+- fclose(tmpFile);
+- fileName = tmpFileName;
+-
+ // if there is an external font file, use it
+ } else if (!(fileName = gfxFont->getExtFontFile())) {
+
+@@ -1016,18 +1007,23 @@
+ case displayFontTT:
+ fileName = dfp->tt.fileName;
+ fontType = gfxFont->isCIDFont() ? fontCIDType2 : fontTrueType;
++ faceIndex = dfp->tt.faceIndex;
+ break;
+ }
+ }
+
++ fontsrc = new SplashFontSrc;
++ if (fileName)
++ fontsrc->setFile(fileName, gFalse);
++ else
++ fontsrc->setBuf(tmpBuf, tmpBufLen, gFalse);
++
+ // load the font file
+ switch (fontType) {
+ case fontType1:
+- if (!(fontFile = fontEngine->loadType1Font(
+- id,
+- fileName->getCString(),
+- fileName == tmpFileName,
+- ((Gfx8BitFont *)gfxFont)->getEncoding()))) {
++ fontFile = fontEngine->loadType1Font(id, fontsrc,
++ ((Gfx8BitFont *)gfxFont)->getEncoding());
++ if (! fontFile) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+ : "(unnamed)");
+@@ -1035,11 +1031,9 @@
+ }
+ break;
+ case fontType1C:
+- if (!(fontFile = fontEngine->loadType1CFont(
+- id,
+- fileName->getCString(),
+- fileName == tmpFileName,
+- ((Gfx8BitFont *)gfxFont)->getEncoding()))) {
++ fontFile = fontEngine->loadType1CFont(id, fontsrc,
++ ((Gfx8BitFont *)gfxFont)->getEncoding());
++ if (! fontFile) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+ : "(unnamed)");
+@@ -1047,7 +1041,11 @@
+ }
+ break;
+ case fontTrueType:
+- if ((ff = FoFiTrueType::load(fileName->getCString()))) {
++ if (fileName)
++ ff = FoFiTrueType::load(fileName->getCString());
++ else
++ ff = new FoFiTrueType(tmpBuf, tmpBufLen, gFalse);
++ if (ff) {
+ codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
+ n = 256;
+ delete ff;
+@@ -1057,8 +1055,7 @@
+ }
+ if (!(fontFile = fontEngine->loadTrueTypeFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
++ fontsrc,
+ codeToGID, n))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+@@ -1068,10 +1065,8 @@
+ break;
+ case fontCIDType0:
+ case fontCIDType0C:
+- if (!(fontFile = fontEngine->loadCIDFont(
+- id,
+- fileName->getCString(),
+- fileName == tmpFileName))) {
++ fontFile = fontEngine->loadCIDFont(id, fontsrc);
++ if (! fontFile) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+ : "(unnamed)");
+@@ -1084,7 +1079,11 @@
+ if (dfp) {
+ // create a CID-to-GID mapping, via Unicode
+ if ((ctu = ((GfxCIDFont *)gfxFont)->getToUnicode())) {
+- if ((ff = FoFiTrueType::load(fileName->getCString()))) {
++ if (fileName)
++ ff = FoFiTrueType::load(fileName->getCString());
++ else
++ ff = new FoFiTrueType(tmpBuf, tmpBufLen, gFalse);
++ if (ff) {
+ // look for a Unicode cmap
+ for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) {
+ if ((ff->getCmapPlatform(cmap) == 3 &&
+@@ -1116,16 +1115,28 @@
+ } else {
+ if (((GfxCIDFont *)gfxFont)->getCIDToGID()) {
+ n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen();
+- codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort));
+- memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
+- n * sizeof(Gushort));
++ if (n) {
++ codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort));
++ memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(),
++ n * sizeof(Gushort));
++ } else {
++ if (fileName)
++ ff = FoFiTrueType::load(fileName->getCString());
++ else
++ ff = new FoFiTrueType(tmpBuf, tmpBufLen, gFalse);
++ if (! ff)
++ goto err2;
++ codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
++ delete ff;
++ }
+ }
+ }
+ if (!(fontFile = fontEngine->loadTrueTypeFont(
+ id,
+- fileName->getCString(),
+- fileName == tmpFileName,
+- codeToGID, n))) {
++ fontsrc,
++ codeToGID,
++ n,
++ faceIndex))) {
+ error(-1, "Couldn't create a font for '%s'",
+ gfxFont->getName() ? gfxFont->getName()->getCString()
+ : "(unnamed)");
+@@ -1153,17 +1164,11 @@
+ }
+ font = fontEngine->getFont(fontFile, mat);
+
+- if (tmpFileName) {
+- delete tmpFileName;
+- }
+ return;
+
+ err2:
+ delete id;
+ err1:
+- if (tmpFileName) {
+- delete tmpFileName;
+- }
+ return;
+ }
+
+diff -Nur poppler.0_5_0/poppler/Stream.cc poppler.HEAD/poppler/Stream.cc
+--- poppler.0_5_0/poppler/Stream.cc 2006-01-11 17:52:58.000000000 +0100
++++ poppler.HEAD/poppler/Stream.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -33,6 +33,7 @@
+ #include "JBIG2Stream.h"
+ #include "JPXStream.h"
+ #include "Stream-CCITT.h"
++#include "UGooString.h"
+
+ #ifdef ENABLE_LIBJPEG
+ #include "DCTStream.h"
+diff -Nur poppler.0_5_0/poppler/UGooString.cc poppler.HEAD/poppler/UGooString.cc
+--- poppler.0_5_0/poppler/UGooString.cc 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/poppler/UGooString.cc 2006-01-18 23:36:01.000000000 +0100
+@@ -0,0 +1,86 @@
++//========================================================================
++//
++// UGooString.cc
++//
++// Unicode string
++//
++// Copyright 2005 Albert Astals Cid <aacid@kde.org>
++//
++//========================================================================
++
++#include <string.h>
++
++#include "goo/gmem.h"
++#include "goo/GooString.h"
++#include "PDFDocEncoding.h"
++#include "UGooString.h"
++
++UGooString::UGooString(Unicode *u, int l)
++{
++ s = u;
++ length = l;
++}
++
++UGooString::UGooString(GooString &str)
++{
++ if ((str.getChar(0) & 0xff) == 0xfe && (str.getChar(1) & 0xff) == 0xff)
++ {
++ length = (str.getLength() - 2) / 2;
++ s = (Unicode *)gmallocn(length, sizeof(Unicode));
++ for (int j = 0; j < length; ++j) {
++ s[j] = ((str.getChar(2 + 2*j) & 0xff) << 8) | (str.getChar(3 + 2*j) & 0xff);
++ }
++ } else
++ initChar(str);
++}
++
++UGooString::UGooString(const UGooString &str)
++{
++ length = str.length;
++ s = (Unicode *)gmallocn(length, sizeof(Unicode));
++ memcpy(s, str.s, length * sizeof(Unicode));
++}
++
++UGooString::UGooString(const char *str)
++{
++ GooString aux(str);
++ initChar(aux);
++}
++
++void UGooString::initChar(GooString &str)
++{
++ length = str.getLength();
++ s = (Unicode *)gmallocn(length, sizeof(Unicode));
++ for (int j = 0; j < length; ++j) {
++ s[j] = pdfDocEncoding[str.getChar(j) & 0xff];
++ }
++}
++
++UGooString::~UGooString()
++{
++ gfree(s);
++}
++
++int UGooString::cmp(UGooString *str) const
++{
++ int n1, n2, i, x;
++ Unicode *p1, *p2;
++
++ n1 = length;
++ n2 = str->length;
++ for (i = 0, p1 = s, p2 = str->s; i < n1 && i < n2; ++i, ++p1, ++p2) {
++ x = *p1 - *p2;
++ if (x != 0) {
++ return x;
++ }
++ }
++ return n1 - n2;
++}
++
++char *UGooString::getCString() const
++{
++ char *res = new char[length + 1];
++ for (int i = 0; i < length; i++) res[i] = s[i];
++ res[length] = '\0';
++ return res;
++}
+diff -Nur poppler.0_5_0/poppler/UGooString.h poppler.HEAD/poppler/UGooString.h
+--- poppler.0_5_0/poppler/UGooString.h 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/poppler/UGooString.h 2006-01-18 23:36:01.000000000 +0100
+@@ -0,0 +1,55 @@
++//========================================================================
++//
++// UGooString.h
++//
++// Unicode string
++//
++// Copyright 2005 Albert Astals Cid <aacid@kde.org>
++//
++//========================================================================
++
++#ifndef UGooString_H
++#define UGooString_H
++
++#include "CharTypes.h"
++
++class GooString;
++
++class UGooString
++{
++public:
++ // Create an unicode string
++ UGooString(Unicode *u, int l);
++
++ // Create a unicode string from <str>.
++ UGooString(GooString &str);
++
++ // Copy the unicode string
++ UGooString(const UGooString &str);
++
++ // Create a unicode string from <str>.
++ UGooString(const char *str);
++
++ // Destructor.
++ ~UGooString();
++
++ // Get length.
++ int getLength() const { return length; }
++
++ // Compare two strings: -1:< 0:= +1:>
++ int cmp(UGooString *str) const;
++
++ // get the unicode
++ Unicode *unicode() const { return s; }
++
++ // get the const char*
++ char *getCString() const;
++
++private:
++ void initChar(GooString &str);
++
++ int length;
++ Unicode *s;
++};
++
++#endif
+diff -Nur poppler.0_5_0/poppler/XRef.cc poppler.HEAD/poppler/XRef.cc
+--- poppler.0_5_0/poppler/XRef.cc 2005-09-20 16:59:43.000000000 +0200
++++ poppler.HEAD/poppler/XRef.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include "Dict.h"
+ #include "Error.h"
+ #include "ErrorCodes.h"
++#include "UGooString.h"
+ #include "XRef.h"
+
+ //------------------------------------------------------------------------
+@@ -934,6 +935,23 @@
+ return gTrue;
+ }
+
++int XRef::getNumEntry(int offset) const
++{
++ int res = -1;
++ int resOffset = -1;
++ XRefEntry e;
++ for (int i = 0; i < size; ++i)
++ {
++ e = entries[i];
++ if (e.offset < offset && e.offset > resOffset)
++ {
++ res = i;
++ resOffset = e.offset;
++ }
++ }
++ return res;
++}
++
+ Guint XRef::strToUnsigned(char *s) {
+ Guint x;
+ char *p;
+diff -Nur poppler.0_5_0/poppler/XRef.h poppler.HEAD/poppler/XRef.h
+--- poppler.0_5_0/poppler/XRef.h 2005-09-20 16:00:43.000000000 +0200
++++ poppler.HEAD/poppler/XRef.h 2006-01-17 22:35:31.000000000 +0100
+@@ -94,6 +94,9 @@
+ // Returns false if unknown or file is not damaged.
+ GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
+
++ // Retuns the entry that belongs to the offset
++ int getNumEntry(int offset) const;
++
+ // Direct access.
+ int getSize() { return size; }
+ XRefEntry *getEntry(int i) { return &entries[i]; }
+diff -Nur poppler.0_5_0/qt/Makefile.am poppler.HEAD/qt/Makefile.am
+--- poppler.0_5_0/qt/Makefile.am 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt/Makefile.am 2006-02-16 20:28:54.000000000 +0100
+@@ -25,6 +25,8 @@
+ $(POPPLER_QT_LIBS) \
+ $(FREETYPE_LIBS)
+
++libpoppler_qt_la_LDFLAGS = -version-info 1:0:0
++
+ if BUILD_SPLASH_OUTPUT
+
+ noinst_PROGRAMS = test-poppler-qt
+diff -Nur poppler.0_5_0/qt/poppler-document.cc poppler.HEAD/qt/poppler-document.cc
+--- poppler.0_5_0/qt/poppler-document.cc 2005-12-03 23:20:54.000000000 +0100
++++ poppler.HEAD/qt/poppler-document.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -24,6 +24,7 @@
+ #include <Catalog.h>
+ #include <ErrorCodes.h>
+ #include <SplashOutputDev.h>
++#include <UGooString.h>
+ #include <splash/SplashBitmap.h>
+ #include "poppler-private.h"
+
+diff -Nur poppler.0_5_0/qt/poppler-page.cc poppler.HEAD/qt/poppler-page.cc
+--- poppler.0_5_0/qt/poppler-page.cc 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt/poppler-page.cc 2006-01-10 22:57:28.000000000 +0100
+@@ -28,6 +28,7 @@
+ #include <TextOutputDev.h>
+ #include <splash/SplashBitmap.h>
+ #include "poppler-private.h"
++#include "poppler-page-transition-private.h"
+
+ namespace Poppler {
+
+diff -Nur poppler.0_5_0/qt/poppler-page-transition.cc poppler.HEAD/qt/poppler-page-transition.cc
+--- poppler.0_5_0/qt/poppler-page-transition.cc 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt/poppler-page-transition.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -18,8 +18,9 @@
+
+ #include "Object.h"
+ #include "Error.h"
++#include "UGooString.h"
+ #include "poppler-page-transition.h"
+-#include "poppler-private.h"
++#include "poppler-page-transition-private.h"
+
+ namespace Poppler {
+
+diff -Nur poppler.0_5_0/qt/poppler-page-transition.h poppler.HEAD/qt/poppler-page-transition.h
+--- poppler.0_5_0/qt/poppler-page-transition.h 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt/poppler-page-transition.h 2006-01-18 22:22:12.000000000 +0100
+@@ -25,8 +25,25 @@
+ class PageTransitionParams;
+ class PageTransitionData;
+
++/**
++ \brief Describes how a PDF file viewer shall perform the transition
++ from one page to another
++
++ In PDF files there is a way to specify if the viewer shall use
++ certain effects to perform the transition from one page to
++ another. This feature can be used, e.g., in a PDF-based beamer
++ presentation.
++
++ This utility class represents the transition effect, and can be
++ used to extract the information from a PDF object.
++*/
++
++
+ class PageTransition {
+ public:
++
++ /** \brief transition effect that shall be used
++ */
+ enum Type {
+ Replace,
+ Split,
+@@ -42,11 +59,15 @@
+ Fade
+ };
+
++ /** \brief alignment of the transition effect that shall be used
++ */
+ enum Alignment {
+ Horizontal,
+ Vertical
+ };
+
++ /** \brief direction of the transition effect that shall be used
++ */
+ enum Direction {
+ Inward,
+ Outward
+@@ -54,17 +75,22 @@
+
+ /** \brief Construct a new PageTransition object from a page dictionary.
+
+- In case or error, this method will print an error message to stderr,
++ Users of the library will rarely need to construct a
++ PageTransition object themselves. Instead, the method
++ Poppler::Page::transition() can be used to find out if a certain
++ transition effect is specified.
++
++ @warning In case or error, this method will print an error message to stderr,
+ and construct a default object.
+
+- @param dictObj pointer to an object whose dictionary will be read
+- and parsed. The pointer dictObj must point to a valid object, whose
+- dictionaries are accessed by the constructor. The dictObj is only
+- accessed by this constructor, and may be deleted after the
+- constructor returns.
++ @param params an object whose dictionary will be read and
++ parsed. This must be a valid object, whose dictionaries are
++ accessed by the constructor. The object is only accessed by this
++ constructor, and may be deleted after the constructor returns.
+ */
+ PageTransition(const PageTransitionParams ¶ms);
+-
++
++ /** \brief copy constructor */
+ PageTransition(const PageTransition &pt);
+
+ /**
+diff -Nur poppler.0_5_0/qt/poppler-page-transition-private.h poppler.HEAD/qt/poppler-page-transition-private.h
+--- poppler.0_5_0/qt/poppler-page-transition-private.h 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/qt/poppler-page-transition-private.h 2006-01-17 21:33:08.000000000 +0100
+@@ -0,0 +1,28 @@
++/*
++ * Copyright (C) 2005, Albert Astals Cid
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++class Object;
++
++namespace Poppler {
++
++class PageTransitionParams {
++ public:
++ Object *dictObj;
++};
++
++}
+diff -Nur poppler.0_5_0/qt/poppler-private.h poppler.HEAD/qt/poppler-private.h
+--- poppler.0_5_0/qt/poppler-private.h 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt/poppler-private.h 2006-01-10 22:57:28.000000000 +0100
+@@ -53,9 +53,4 @@
+ SplashOutputDev *m_outputDev;
+ };
+
+-class PageTransitionParams {
+- public:
+- Object *dictObj;
+-};
+-
+ }
+diff -Nur poppler.0_5_0/qt4/src/Doxyfile poppler.HEAD/qt4/src/Doxyfile
+--- poppler.0_5_0/qt4/src/Doxyfile 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/qt4/src/Doxyfile 2006-01-18 22:22:12.000000000 +0100
+@@ -0,0 +1,1212 @@
++# Doxyfile 1.4.1
++
++# This file describes the settings to be used by the documentation system
++# doxygen (www.doxygen.org) for a project
++#
++# All text after a hash (#) is considered a comment and will be ignored
++# The format is:
++# TAG = value [value, ...]
++# For lists items can also be appended using:
++# TAG += value [value, ...]
++# Values that contain spaces should be placed between quotes (" ")
++
++#---------------------------------------------------------------------------
++# Project related configuration options
++#---------------------------------------------------------------------------
++
++# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
++# by quotes) that should identify the project.
++
++PROJECT_NAME =
++
++# The PROJECT_NUMBER tag can be used to enter a project or revision number.
++# This could be handy for archiving the generated documentation or
++# if some version control system is used.
++
++PROJECT_NUMBER =
++
++# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
++# base path where the generated documentation will be put.
++# If a relative path is entered, it will be relative to the location
++# where doxygen was started. If left blank the current directory will be used.
++
++OUTPUT_DIRECTORY =
++
++# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
++# 4096 sub-directories (in 2 levels) under the output directory of each output
++# format and will distribute the generated files over these directories.
++# Enabling this option can be useful when feeding doxygen a huge amount of
++# source files, where putting all generated files in the same directory would
++# otherwise cause performance problems for the file system.
++
++CREATE_SUBDIRS = NO
++
++# The OUTPUT_LANGUAGE tag is used to specify the language in which all
++# documentation generated by doxygen is written. Doxygen will use this
++# information to generate all constant output in the proper language.
++# The default language is English, other supported languages are:
++# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
++# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
++# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
++# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
++# Swedish, and Ukrainian.
++
++OUTPUT_LANGUAGE = English
++
++# This tag can be used to specify the encoding used in the generated output.
++# The encoding is not always determined by the language that is chosen,
++# but also whether or not the output is meant for Windows or non-Windows users.
++# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
++# forces the Windows encoding (this is the default for the Windows binary),
++# whereas setting the tag to NO uses a Unix-style encoding (the default for
++# all platforms other than Windows).
++
++USE_WINDOWS_ENCODING = NO
++
++# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
++# include brief member descriptions after the members that are listed in
++# the file and class documentation (similar to JavaDoc).
++# Set to NO to disable this.
++
++BRIEF_MEMBER_DESC = YES
++
++# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
++# the brief description of a member or function before the detailed description.
++# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
++# brief descriptions will be completely suppressed.
++
++REPEAT_BRIEF = YES
++
++# This tag implements a quasi-intelligent brief description abbreviator
++# that is used to form the text in various listings. Each string
++# in this list, if found as the leading text of the brief description, will be
++# stripped from the text and the result after processing the whole list, is
++# used as the annotated text. Otherwise, the brief description is used as-is.
++# If left blank, the following values are used ("$name" is automatically
++# replaced with the name of the entity): "The $name class" "The $name widget"
++# "The $name file" "is" "provides" "specifies" "contains"
++# "represents" "a" "an" "the"
++
++ABBREVIATE_BRIEF =
++
++# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
++# Doxygen will generate a detailed section even if there is only a brief
++# description.
++
++ALWAYS_DETAILED_SEC = NO
++
++# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
++# inherited members of a class in the documentation of that class as if those
++# members were ordinary class members. Constructors, destructors and assignment
++# operators of the base classes will not be shown.
++
++INLINE_INHERITED_MEMB = NO
++
++# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
++# path before files name in the file list and in the header files. If set
++# to NO the shortest path that makes the file name unique will be used.
++
++FULL_PATH_NAMES = YES
++
++# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
++# can be used to strip a user-defined part of the path. Stripping is
++# only done if one of the specified strings matches the left-hand part of
++# the path. The tag can be used to show relative paths in the file list.
++# If left blank the directory from which doxygen is run is used as the
++# path to strip.
++
++STRIP_FROM_PATH =
++
++# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
++# the path mentioned in the documentation of a class, which tells
++# the reader which header file to include in order to use a class.
++# If left blank only the name of the header file containing the class
++# definition is used. Otherwise one should specify the include paths that
++# are normally passed to the compiler using the -I flag.
++
++STRIP_FROM_INC_PATH =
++
++# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
++# (but less readable) file names. This can be useful is your file systems
++# doesn't support long names like on DOS, Mac, or CD-ROM.
++
++SHORT_NAMES = NO
++
++# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
++# will interpret the first line (until the first dot) of a JavaDoc-style
++# comment as the brief description. If set to NO, the JavaDoc
++# comments will behave just like the Qt-style comments (thus requiring an
++# explicit @brief command for a brief description.
++
++JAVADOC_AUTOBRIEF = YES
++
++# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
++# treat a multi-line C++ special comment block (i.e. a block of //! or ///
++# comments) as a brief description. This used to be the default behaviour.
++# The new default is to treat a multi-line C++ comment block as a detailed
++# description. Set this tag to YES if you prefer the old behaviour instead.
++
++MULTILINE_CPP_IS_BRIEF = NO
++
++# If the DETAILS_AT_TOP tag is set to YES then Doxygen
++# will output the detailed description near the top, like JavaDoc.
++# If set to NO, the detailed description appears after the member
++# documentation.
++
++DETAILS_AT_TOP = NO
++
++# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
++# member inherits the documentation from any documented member that it
++# re-implements.
++
++INHERIT_DOCS = YES
++
++# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
++# tag is set to YES, then doxygen will reuse the documentation of the first
++# member in the group (if any) for the other members of the group. By default
++# all members of a group must be documented explicitly.
++
++DISTRIBUTE_GROUP_DOC = NO
++
++# The TAB_SIZE tag can be used to set the number of spaces in a tab.
++# Doxygen uses this value to replace tabs by spaces in code fragments.
++
++TAB_SIZE = 8
++
++# This tag can be used to specify a number of aliases that acts
++# as commands in the documentation. An alias has the form "name=value".
++# For example adding "sideeffect=\par Side Effects:\n" will allow you to
++# put the command \sideeffect (or @sideeffect) in the documentation, which
++# will result in a user-defined paragraph with heading "Side Effects:".
++# You can put \n's in the value part of an alias to insert newlines.
++
++ALIASES =
++
++# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
++# sources only. Doxygen will then generate output that is more tailored for C.
++# For instance, some of the names that are used will be different. The list
++# of all members will be omitted, etc.
++
++OPTIMIZE_OUTPUT_FOR_C = NO
++
++# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
++# only. Doxygen will then generate output that is more tailored for Java.
++# For instance, namespaces will be presented as packages, qualified scopes
++# will look different, etc.
++
++OPTIMIZE_OUTPUT_JAVA = NO
++
++# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
++# the same type (for instance a group of public functions) to be put as a
++# subgroup of that type (e.g. under the Public Functions section). Set it to
++# NO to prevent subgrouping. Alternatively, this can be done per class using
++# the \nosubgrouping command.
++
++SUBGROUPING = YES
++
++#---------------------------------------------------------------------------
++# Build related configuration options
++#---------------------------------------------------------------------------
++
++# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
++# documentation are documented, even if no documentation was available.
++# Private class members and static file members will be hidden unless
++# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
++
++EXTRACT_ALL = NO
++
++# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
++# will be included in the documentation.
++
++EXTRACT_PRIVATE = NO
++
++# If the EXTRACT_STATIC tag is set to YES all static members of a file
++# will be included in the documentation.
++
++EXTRACT_STATIC = NO
++
++# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
++# defined locally in source files will be included in the documentation.
++# If set to NO only classes defined in header files are included.
++
++EXTRACT_LOCAL_CLASSES = YES
++
++# This flag is only useful for Objective-C code. When set to YES local
++# methods, which are defined in the implementation section but not in
++# the interface are included in the documentation.
++# If set to NO (the default) only methods in the interface are included.
++
++EXTRACT_LOCAL_METHODS = NO
++
++# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
++# undocumented members of documented classes, files or namespaces.
++# If set to NO (the default) these members will be included in the
++# various overviews, but no documentation section is generated.
++# This option has no effect if EXTRACT_ALL is enabled.
++
++HIDE_UNDOC_MEMBERS = NO
++
++# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
++# undocumented classes that are normally visible in the class hierarchy.
++# If set to NO (the default) these classes will be included in the various
++# overviews. This option has no effect if EXTRACT_ALL is enabled.
++
++HIDE_UNDOC_CLASSES = NO
++
++# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
++# friend (class|struct|union) declarations.
++# If set to NO (the default) these declarations will be included in the
++# documentation.
++
++HIDE_FRIEND_COMPOUNDS = NO
++
++# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
++# documentation blocks found inside the body of a function.
++# If set to NO (the default) these blocks will be appended to the
++# function's detailed documentation block.
++
++HIDE_IN_BODY_DOCS = NO
++
++# The INTERNAL_DOCS tag determines if documentation
++# that is typed after a \internal command is included. If the tag is set
++# to NO (the default) then the documentation will be excluded.
++# Set it to YES to include the internal documentation.
++
++INTERNAL_DOCS = NO
++
++# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
++# file names in lower-case letters. If set to YES upper-case letters are also
++# allowed. This is useful if you have classes or files whose names only differ
++# in case and if your file system supports case sensitive file names. Windows
++# and Mac users are advised to set this option to NO.
++
++CASE_SENSE_NAMES = YES
++
++# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
++# will show members with their full class and namespace scopes in the
++# documentation. If set to YES the scope will be hidden.
++
++HIDE_SCOPE_NAMES = NO
++
++# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
++# will put a list of the files that are included by a file in the documentation
++# of that file.
++
++SHOW_INCLUDE_FILES = YES
++
++# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
++# is inserted in the documentation for inline members.
++
++INLINE_INFO = YES
++
++# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
++# will sort the (detailed) documentation of file and class members
++# alphabetically by member name. If set to NO the members will appear in
++# declaration order.
++
++SORT_MEMBER_DOCS = YES
++
++# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
++# brief documentation of file, namespace and class members alphabetically
++# by member name. If set to NO (the default) the members will appear in
++# declaration order.
++
++SORT_BRIEF_DOCS = NO
++
++# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
++# sorted by fully-qualified names, including namespaces. If set to
++# NO (the default), the class list will be sorted only by class name,
++# not including the namespace part.
++# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
++# Note: This option applies only to the class list, not to the
++# alphabetical list.
++
++SORT_BY_SCOPE_NAME = NO
++
++# The GENERATE_TODOLIST tag can be used to enable (YES) or
++# disable (NO) the todo list. This list is created by putting \todo
++# commands in the documentation.
++
++GENERATE_TODOLIST = YES
++
++# The GENERATE_TESTLIST tag can be used to enable (YES) or
++# disable (NO) the test list. This list is created by putting \test
++# commands in the documentation.
++
++GENERATE_TESTLIST = YES
++
++# The GENERATE_BUGLIST tag can be used to enable (YES) or
++# disable (NO) the bug list. This list is created by putting \bug
++# commands in the documentation.
++
++GENERATE_BUGLIST = YES
++
++# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
++# disable (NO) the deprecated list. This list is created by putting
++# \deprecated commands in the documentation.
++
++GENERATE_DEPRECATEDLIST= YES
++
++# The ENABLED_SECTIONS tag can be used to enable conditional
++# documentation sections, marked by \if sectionname ... \endif.
++
++ENABLED_SECTIONS =
++
++# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
++# the initial value of a variable or define consists of for it to appear in
++# the documentation. If the initializer consists of more lines than specified
++# here it will be hidden. Use a value of 0 to hide initializers completely.
++# The appearance of the initializer of individual variables and defines in the
++# documentation can be controlled using \showinitializer or \hideinitializer
++# command in the documentation regardless of this setting.
++
++MAX_INITIALIZER_LINES = 30
++
++# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
++# at the bottom of the documentation of classes and structs. If set to YES the
++# list will mention the files that were used to generate the documentation.
++
++SHOW_USED_FILES = YES
++
++# If the sources in your project are distributed over multiple directories
++# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
++# in the documentation.
++
++SHOW_DIRECTORIES = YES
++
++# The FILE_VERSION_FILTER tag can be used to specify a program or script that
++# doxygen should invoke to get the current version for each file (typically from the
++# version control system). Doxygen will invoke the program by executing (via
++# popen()) the command <command> <input-file>, where <command> is the value of
++# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
++# provided by doxygen. Whatever the progam writes to standard output
++# is used as the file version. See the manual for examples.
++
++FILE_VERSION_FILTER =
++
++#---------------------------------------------------------------------------
++# configuration options related to warning and progress messages
++#---------------------------------------------------------------------------
++
++# The QUIET tag can be used to turn on/off the messages that are generated
++# by doxygen. Possible values are YES and NO. If left blank NO is used.
++
++QUIET = NO
++
++# The WARNINGS tag can be used to turn on/off the warning messages that are
++# generated by doxygen. Possible values are YES and NO. If left blank
++# NO is used.
++
++WARNINGS = YES
++
++# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
++# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
++# automatically be disabled.
++
++WARN_IF_UNDOCUMENTED = YES
++
++# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
++# potential errors in the documentation, such as not documenting some
++# parameters in a documented function, or documenting parameters that
++# don't exist or using markup commands wrongly.
++
++WARN_IF_DOC_ERROR = YES
++
++# This WARN_NO_PARAMDOC option can be abled to get warnings for
++# functions that are documented, but have no documentation for their parameters
++# or return value. If set to NO (the default) doxygen will only warn about
++# wrong or incomplete parameter documentation, but not about the absence of
++# documentation.
++
++WARN_NO_PARAMDOC = NO
++
++# The WARN_FORMAT tag determines the format of the warning messages that
++# doxygen can produce. The string should contain the $file, $line, and $text
++# tags, which will be replaced by the file and line number from which the
++# warning originated and the warning text. Optionally the format may contain
++# $version, which will be replaced by the version of the file (if it could
++# be obtained via FILE_VERSION_FILTER)
++
++WARN_FORMAT = "$file:$line: $text"
++
++# The WARN_LOGFILE tag can be used to specify a file to which warning
++# and error messages should be written. If left blank the output is written
++# to stderr.
++
++WARN_LOGFILE =
++
++#---------------------------------------------------------------------------
++# configuration options related to the input files
++#---------------------------------------------------------------------------
++
++# The INPUT tag can be used to specify the files and/or directories that contain
++# documented source files. You may enter file names like "myfile.cpp" or
++# directories like "/usr/src/myproject". Separate the files or directories
++# with spaces.
++
++INPUT = . ../../qt/poppler-page-transition.h
++
++# If the value of the INPUT tag contains directories, you can use the
++# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
++# and *.h) to filter out the source-files in the directories. If left
++# blank the following patterns are tested:
++# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
++# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
++
++FILE_PATTERNS =
++
++# The RECURSIVE tag can be used to turn specify whether or not subdirectories
++# should be searched for input files as well. Possible values are YES and NO.
++# If left blank NO is used.
++
++RECURSIVE = NO
++
++# The EXCLUDE tag can be used to specify files and/or directories that should
++# excluded from the INPUT source files. This way you can easily exclude a
++# subdirectory from a directory tree whose root is specified with the INPUT tag.
++
++EXCLUDE =
++
++# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
++# directories that are symbolic links (a Unix filesystem feature) are excluded
++# from the input.
++
++EXCLUDE_SYMLINKS = NO
++
++# If the value of the INPUT tag contains directories, you can use the
++# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
++# certain files from those directories.
++
++EXCLUDE_PATTERNS =
++
++# The EXAMPLE_PATH tag can be used to specify one or more files or
++# directories that contain example code fragments that are included (see
++# the \include command).
++
++EXAMPLE_PATH =
++
++# If the value of the EXAMPLE_PATH tag contains directories, you can use the
++# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
++# and *.h) to filter out the source-files in the directories. If left
++# blank all files are included.
++
++EXAMPLE_PATTERNS =
++
++# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
++# searched for input files to be used with the \include or \dontinclude
++# commands irrespective of the value of the RECURSIVE tag.
++# Possible values are YES and NO. If left blank NO is used.
++
++EXAMPLE_RECURSIVE = NO
++
++# The IMAGE_PATH tag can be used to specify one or more files or
++# directories that contain image that are included in the documentation (see
++# the \image command).
++
++IMAGE_PATH =
++
++# The INPUT_FILTER tag can be used to specify a program that doxygen should
++# invoke to filter for each input file. Doxygen will invoke the filter program
++# by executing (via popen()) the command <filter> <input-file>, where <filter>
++# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
++# input file. Doxygen will then use the output that the filter program writes
++# to standard output. If FILTER_PATTERNS is specified, this tag will be
++# ignored.
++
++INPUT_FILTER =
++
++# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
++# basis. Doxygen will compare the file name with each pattern and apply the
++# filter if there is a match. The filters are a list of the form:
++# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
++# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
++# is applied to all files.
++
++FILTER_PATTERNS =
++
++# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
++# INPUT_FILTER) will be used to filter the input files when producing source
++# files to browse (i.e. when SOURCE_BROWSER is set to YES).
++
++FILTER_SOURCE_FILES = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to source browsing
++#---------------------------------------------------------------------------
++
++# If the SOURCE_BROWSER tag is set to YES then a list of source files will
++# be generated. Documented entities will be cross-referenced with these sources.
++# Note: To get rid of all source code in the generated output, make sure also
++# VERBATIM_HEADERS is set to NO.
++
++SOURCE_BROWSER = NO
++
++# Setting the INLINE_SOURCES tag to YES will include the body
++# of functions and classes directly in the documentation.
++
++INLINE_SOURCES = NO
++
++# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
++# doxygen to hide any special comment blocks from generated source code
++# fragments. Normal C and C++ comments will always remain visible.
++
++STRIP_CODE_COMMENTS = YES
++
++# If the REFERENCED_BY_RELATION tag is set to YES (the default)
++# then for each documented function all documented
++# functions referencing it will be listed.
++
++REFERENCED_BY_RELATION = YES
++
++# If the REFERENCES_RELATION tag is set to YES (the default)
++# then for each documented function all documented entities
++# called/used by that function will be listed.
++
++REFERENCES_RELATION = YES
++
++# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
++# will generate a verbatim copy of the header file for each class for
++# which an include is specified. Set to NO to disable this.
++
++VERBATIM_HEADERS = YES
++
++#---------------------------------------------------------------------------
++# configuration options related to the alphabetical class index
++#---------------------------------------------------------------------------
++
++# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
++# of all compounds will be generated. Enable this if the project
++# contains a lot of classes, structs, unions or interfaces.
++
++ALPHABETICAL_INDEX = NO
++
++# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
++# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
++# in which this list will be split (can be a number in the range [1..20])
++
++COLS_IN_ALPHA_INDEX = 5
++
++# In case all classes in a project start with a common prefix, all
++# classes will be put under the same header in the alphabetical index.
++# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
++# should be ignored while generating the index headers.
++
++IGNORE_PREFIX =
++
++#---------------------------------------------------------------------------
++# configuration options related to the HTML output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
++# generate HTML output.
++
++GENERATE_HTML = YES
++
++# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `html' will be used as the default path.
++
++HTML_OUTPUT = APIDOCS-html
++
++# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
++# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
++# doxygen will generate files with .html extension.
++
++HTML_FILE_EXTENSION = .html
++
++# The HTML_HEADER tag can be used to specify a personal HTML header for
++# each generated HTML page. If it is left blank doxygen will generate a
++# standard header.
++
++HTML_HEADER =
++
++# The HTML_FOOTER tag can be used to specify a personal HTML footer for
++# each generated HTML page. If it is left blank doxygen will generate a
++# standard footer.
++
++HTML_FOOTER =
++
++# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
++# style sheet that is used by each HTML page. It can be used to
++# fine-tune the look of the HTML output. If the tag is left blank doxygen
++# will generate a default style sheet. Note that doxygen will try to copy
++# the style sheet file to the HTML output directory, so don't put your own
++# stylesheet in the HTML output directory as well, or it will be erased!
++
++HTML_STYLESHEET =
++
++# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
++# files or namespaces will be aligned in HTML using tables. If set to
++# NO a bullet list will be used.
++
++HTML_ALIGN_MEMBERS = YES
++
++# If the GENERATE_HTMLHELP tag is set to YES, additional index files
++# will be generated that can be used as input for tools like the
++# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
++# of the generated HTML documentation.
++
++GENERATE_HTMLHELP = NO
++
++# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
++# be used to specify the file name of the resulting .chm file. You
++# can add a path in front of the file if the result should not be
++# written to the html output directory.
++
++CHM_FILE =
++
++# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
++# be used to specify the location (absolute path including file name) of
++# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
++# the HTML help compiler on the generated index.hhp.
++
++HHC_LOCATION =
++
++# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
++# controls if a separate .chi index file is generated (YES) or that
++# it should be included in the master .chm file (NO).
++
++GENERATE_CHI = NO
++
++# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
++# controls whether a binary table of contents is generated (YES) or a
++# normal table of contents (NO) in the .chm file.
++
++BINARY_TOC = NO
++
++# The TOC_EXPAND flag can be set to YES to add extra items for group members
++# to the contents of the HTML help documentation and to the tree view.
++
++TOC_EXPAND = NO
++
++# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
++# top of each HTML page. The value NO (the default) enables the index and
++# the value YES disables it.
++
++DISABLE_INDEX = NO
++
++# This tag can be used to set the number of enum values (range [1..20])
++# that doxygen will group on one line in the generated HTML documentation.
++
++ENUM_VALUES_PER_LINE = 4
++
++# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
++# generated containing a tree-like index structure (just like the one that
++# is generated for HTML Help). For this to work a browser that supports
++# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
++# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
++# probably better off using the HTML help feature.
++
++GENERATE_TREEVIEW = NO
++
++# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
++# used to set the initial width (in pixels) of the frame in which the tree
++# is shown.
++
++TREEVIEW_WIDTH = 250
++
++#---------------------------------------------------------------------------
++# configuration options related to the LaTeX output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
++# generate Latex output.
++
++GENERATE_LATEX = YES
++
++# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `latex' will be used as the default path.
++
++LATEX_OUTPUT = APIDOCS-latex
++
++# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
++# invoked. If left blank `latex' will be used as the default command name.
++
++LATEX_CMD_NAME = latex
++
++# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
++# generate index for LaTeX. If left blank `makeindex' will be used as the
++# default command name.
++
++MAKEINDEX_CMD_NAME = makeindex
++
++# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
++# LaTeX documents. This may be useful for small projects and may help to
++# save some trees in general.
++
++COMPACT_LATEX = NO
++
++# The PAPER_TYPE tag can be used to set the paper type that is used
++# by the printer. Possible values are: a4, a4wide, letter, legal and
++# executive. If left blank a4wide will be used.
++
++PAPER_TYPE = a4wide
++
++# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
++# packages that should be included in the LaTeX output.
++
++EXTRA_PACKAGES =
++
++# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
++# the generated latex document. The header should contain everything until
++# the first chapter. If it is left blank doxygen will generate a
++# standard header. Notice: only use this tag if you know what you are doing!
++
++LATEX_HEADER =
++
++# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
++# is prepared for conversion to pdf (using ps2pdf). The pdf file will
++# contain links (just like the HTML output) instead of page references
++# This makes the output suitable for online browsing using a pdf viewer.
++
++PDF_HYPERLINKS = NO
++
++# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
++# plain latex in the generated Makefile. Set this option to YES to get a
++# higher quality PDF documentation.
++
++USE_PDFLATEX = NO
++
++# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
++# command to the generated LaTeX files. This will instruct LaTeX to keep
++# running if errors occur, instead of asking the user for help.
++# This option is also used when generating formulas in HTML.
++
++LATEX_BATCHMODE = NO
++
++# If LATEX_HIDE_INDICES is set to YES then doxygen will not
++# include the index chapters (such as File Index, Compound Index, etc.)
++# in the output.
++
++LATEX_HIDE_INDICES = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the RTF output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
++# The RTF output is optimized for Word 97 and may not look very pretty with
++# other RTF readers or editors.
++
++GENERATE_RTF = NO
++
++# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `rtf' will be used as the default path.
++
++RTF_OUTPUT = rtf
++
++# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
++# RTF documents. This may be useful for small projects and may help to
++# save some trees in general.
++
++COMPACT_RTF = NO
++
++# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
++# will contain hyperlink fields. The RTF file will
++# contain links (just like the HTML output) instead of page references.
++# This makes the output suitable for online browsing using WORD or other
++# programs which support those fields.
++# Note: wordpad (write) and others do not support links.
++
++RTF_HYPERLINKS = NO
++
++# Load stylesheet definitions from file. Syntax is similar to doxygen's
++# config file, i.e. a series of assignments. You only have to provide
++# replacements, missing definitions are set to their default value.
++
++RTF_STYLESHEET_FILE =
++
++# Set optional variables used in the generation of an rtf document.
++# Syntax is similar to doxygen's config file.
++
++RTF_EXTENSIONS_FILE =
++
++#---------------------------------------------------------------------------
++# configuration options related to the man page output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
++# generate man pages
++
++GENERATE_MAN = NO
++
++# The MAN_OUTPUT tag is used to specify where the man pages will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `man' will be used as the default path.
++
++MAN_OUTPUT = man
++
++# The MAN_EXTENSION tag determines the extension that is added to
++# the generated man pages (default is the subroutine's section .3)
++
++MAN_EXTENSION = .3
++
++# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
++# then it will generate one additional man file for each entity
++# documented in the real man page(s). These additional files
++# only source the real man page, but without them the man command
++# would be unable to find the correct page. The default is NO.
++
++MAN_LINKS = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the XML output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_XML tag is set to YES Doxygen will
++# generate an XML file that captures the structure of
++# the code including all documentation.
++
++GENERATE_XML = NO
++
++# The XML_OUTPUT tag is used to specify where the XML pages will be put.
++# If a relative path is entered the value of OUTPUT_DIRECTORY will be
++# put in front of it. If left blank `xml' will be used as the default path.
++
++XML_OUTPUT = xml
++
++# The XML_SCHEMA tag can be used to specify an XML schema,
++# which can be used by a validating XML parser to check the
++# syntax of the XML files.
++
++XML_SCHEMA =
++
++# The XML_DTD tag can be used to specify an XML DTD,
++# which can be used by a validating XML parser to check the
++# syntax of the XML files.
++
++XML_DTD =
++
++# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
++# dump the program listings (including syntax highlighting
++# and cross-referencing information) to the XML output. Note that
++# enabling this will significantly increase the size of the XML output.
++
++XML_PROGRAMLISTING = YES
++
++#---------------------------------------------------------------------------
++# configuration options for the AutoGen Definitions output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
++# generate an AutoGen Definitions (see autogen.sf.net) file
++# that captures the structure of the code including all
++# documentation. Note that this feature is still experimental
++# and incomplete at the moment.
++
++GENERATE_AUTOGEN_DEF = NO
++
++#---------------------------------------------------------------------------
++# configuration options related to the Perl module output
++#---------------------------------------------------------------------------
++
++# If the GENERATE_PERLMOD tag is set to YES Doxygen will
++# generate a Perl module file that captures the structure of
++# the code including all documentation. Note that this
++# feature is still experimental and incomplete at the
++# moment.
++
++GENERATE_PERLMOD = NO
++
++# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
++# the necessary Makefile rules, Perl scripts and LaTeX code to be able
++# to generate PDF and DVI output from the Perl module output.
++
++PERLMOD_LATEX = NO
++
++# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
++# nicely formatted so it can be parsed by a human reader. This is useful
++# if you want to understand what is going on. On the other hand, if this
++# tag is set to NO the size of the Perl module output will be much smaller
++# and Perl will parse it just the same.
++
++PERLMOD_PRETTY = YES
++
++# The names of the make variables in the generated doxyrules.make file
++# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
++# This is useful so different doxyrules.make files included by the same
++# Makefile don't overwrite each other's variables.
++
++PERLMOD_MAKEVAR_PREFIX =
++
++#---------------------------------------------------------------------------
++# Configuration options related to the preprocessor
++#---------------------------------------------------------------------------
++
++# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
++# evaluate all C-preprocessor directives found in the sources and include
++# files.
++
++ENABLE_PREPROCESSING = YES
++
++# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
++# names in the source code. If set to NO (the default) only conditional
++# compilation will be performed. Macro expansion can be done in a controlled
++# way by setting EXPAND_ONLY_PREDEF to YES.
++
++MACRO_EXPANSION = NO
++
++# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
++# then the macro expansion is limited to the macros specified with the
++# PREDEFINED and EXPAND_AS_PREDEFINED tags.
++
++EXPAND_ONLY_PREDEF = NO
++
++# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
++# in the INCLUDE_PATH (see below) will be search if a #include is found.
++
++SEARCH_INCLUDES = YES
++
++# The INCLUDE_PATH tag can be used to specify one or more directories that
++# contain include files that are not input files but should be processed by
++# the preprocessor.
++
++INCLUDE_PATH =
++
++# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
++# patterns (like *.h and *.hpp) to filter out the header-files in the
++# directories. If left blank, the patterns specified with FILE_PATTERNS will
++# be used.
++
++INCLUDE_FILE_PATTERNS =
++
++# The PREDEFINED tag can be used to specify one or more macro names that
++# are defined before the preprocessor is started (similar to the -D option of
++# gcc). The argument of the tag is a list of macros of the form: name
++# or name=definition (no spaces). If the definition and the = are
++# omitted =1 is assumed. To prevent a macro definition from being
++# undefined via #undef or recursively expanded use the := operator
++# instead of the = operator.
++
++PREDEFINED = UNSTABLE_POPPLER_QT4
++
++# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
++# this tag can be used to specify a list of macro names that should be expanded.
++# The macro definition that is found in the sources will be used.
++# Use the PREDEFINED tag if you want to use a different macro definition.
++
++EXPAND_AS_DEFINED =
++
++# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
++# doxygen's preprocessor will remove all function-like macros that are alone
++# on a line, have an all uppercase name, and do not end with a semicolon. Such
++# function macros are typically used for boiler-plate code, and will confuse
++# the parser if not removed.
++
++SKIP_FUNCTION_MACROS = YES
++
++#---------------------------------------------------------------------------
++# Configuration::additions related to external references
++#---------------------------------------------------------------------------
++
++# The TAGFILES option can be used to specify one or more tagfiles.
++# Optionally an initial location of the external documentation
++# can be added for each tagfile. The format of a tag file without
++# this location is as follows:
++# TAGFILES = file1 file2 ...
++# Adding location for the tag files is done as follows:
++# TAGFILES = file1=loc1 "file2 = loc2" ...
++# where "loc1" and "loc2" can be relative or absolute paths or
++# URLs. If a location is present for each tag, the installdox tool
++# does not have to be run to correct the links.
++# Note that each tag file must have a unique name
++# (where the name does NOT include the path)
++# If a tag file is not located in the directory in which doxygen
++# is run, you must also specify the path to the tagfile here.
++
++TAGFILES =
++
++# When a file name is specified after GENERATE_TAGFILE, doxygen will create
++# a tag file that is based on the input files it reads.
++
++GENERATE_TAGFILE =
++
++# If the ALLEXTERNALS tag is set to YES all external classes will be listed
++# in the class index. If set to NO only the inherited external classes
++# will be listed.
++
++ALLEXTERNALS = NO
++
++# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
++# in the modules index. If set to NO, only the current project's groups will
++# be listed.
++
++EXTERNAL_GROUPS = YES
++
++# The PERL_PATH should be the absolute path and name of the perl script
++# interpreter (i.e. the result of `which perl').
++
++PERL_PATH = /usr/bin/perl
++
++#---------------------------------------------------------------------------
++# Configuration options related to the dot tool
++#---------------------------------------------------------------------------
++
++# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
++# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
++# or super classes. Setting the tag to NO turns the diagrams off. Note that
++# this option is superseded by the HAVE_DOT option below. This is only a
++# fallback. It is recommended to install and use dot, since it yields more
++# powerful graphs.
++
++CLASS_DIAGRAMS = YES
++
++# If set to YES, the inheritance and collaboration graphs will hide
++# inheritance and usage relations if the target is undocumented
++# or is not a class.
++
++HIDE_UNDOC_RELATIONS = YES
++
++# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
++# available from the path. This tool is part of Graphviz, a graph visualization
++# toolkit from AT&T and Lucent Bell Labs. The other options in this section
++# have no effect if this option is set to NO (the default)
++
++HAVE_DOT = NO
++
++# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for each documented class showing the direct and
++# indirect inheritance relations. Setting this tag to YES will force the
++# the CLASS_DIAGRAMS tag to NO.
++
++CLASS_GRAPH = YES
++
++# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for each documented class showing the direct and
++# indirect implementation dependencies (inheritance, containment, and
++# class references variables) of the class with other documented classes.
++
++COLLABORATION_GRAPH = YES
++
++# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
++# will generate a graph for groups, showing the direct groups dependencies
++
++GROUP_GRAPHS = YES
++
++# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
++# collaboration diagrams in a style similar to the OMG's Unified Modeling
++# Language.
++
++UML_LOOK = NO
++
++# If set to YES, the inheritance and collaboration graphs will show the
++# relations between templates and their instances.
++
++TEMPLATE_RELATIONS = NO
++
++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
++# tags are set to YES then doxygen will generate a graph for each documented
++# file showing the direct and indirect include dependencies of the file with
++# other documented files.
++
++INCLUDE_GRAPH = YES
++
++# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
++# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
++# documented header file showing the documented files that directly or
++# indirectly include this file.
++
++INCLUDED_BY_GRAPH = YES
++
++# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
++# generate a call dependency graph for every global function or class method.
++# Note that enabling this option will significantly increase the time of a run.
++# So in most cases it will be better to enable call graphs for selected
++# functions only using the \callgraph command.
++
++CALL_GRAPH = NO
++
++# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
++# will graphical hierarchy of all classes instead of a textual one.
++
++GRAPHICAL_HIERARCHY = YES
++
++# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
++# then doxygen will show the dependencies a directory has on other directories
++# in a graphical way. The dependency relations are determined by the #include
++# relations between the files in the directories.
++
++DIRECTORY_GRAPH = YES
++
++# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
++# generated by dot. Possible values are png, jpg, or gif
++# If left blank png will be used.
++
++DOT_IMAGE_FORMAT = png
++
++# The tag DOT_PATH can be used to specify the path where the dot tool can be
++# found. If left blank, it is assumed the dot tool can be found in the path.
++
++DOT_PATH =
++
++# The DOTFILE_DIRS tag can be used to specify one or more directories that
++# contain dot files that are included in the documentation (see the
++# \dotfile command).
++
++DOTFILE_DIRS =
++
++# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
++# (in pixels) of the graphs generated by dot. If a graph becomes larger than
++# this value, doxygen will try to truncate the graph, so that it fits within
++# the specified constraint. Beware that most browsers cannot cope with very
++# large images.
++
++MAX_DOT_GRAPH_WIDTH = 1024
++
++# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
++# (in pixels) of the graphs generated by dot. If a graph becomes larger than
++# this value, doxygen will try to truncate the graph, so that it fits within
++# the specified constraint. Beware that most browsers cannot cope with very
++# large images.
++
++MAX_DOT_GRAPH_HEIGHT = 1024
++
++# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
++# graphs generated by dot. A depth value of 3 means that only nodes reachable
++# from the root by following a path via at most 3 edges will be shown. Nodes
++# that lay further from the root node will be omitted. Note that setting this
++# option to 1 or 2 may greatly reduce the computation time needed for large
++# code bases. Also note that a graph may be further truncated if the graph's
++# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
++# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
++# the graph is not depth-constrained.
++
++MAX_DOT_GRAPH_DEPTH = 0
++
++# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
++# background. This is disabled by default, which results in a white background.
++# Warning: Depending on the platform used, enabling this option may lead to
++# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
++# read).
++
++DOT_TRANSPARENT = NO
++
++# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
++# files in one run (i.e. multiple -o and -T options on the command line). This
++# makes dot run faster, but since only newer versions of dot (>1.8.10)
++# support this, this feature is disabled by default.
++
++DOT_MULTI_TARGETS = NO
++
++# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
++# generate a legend page explaining the meaning of the various boxes and
++# arrows in the dot generated graphs.
++
++GENERATE_LEGEND = YES
++
++# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
++# remove the intermediate dot files that are used to generate
++# the various graphs.
++
++DOT_CLEANUP = YES
++
++#---------------------------------------------------------------------------
++# Configuration::additions related to the search engine
++#---------------------------------------------------------------------------
++
++# The SEARCHENGINE tag specifies whether or not a search engine should be
++# used. If set to NO the values of all tags below this one will be ignored.
++
++SEARCHENGINE = NO
+diff -Nur poppler.0_5_0/qt4/src/Makefile.am poppler.HEAD/qt4/src/Makefile.am
+--- poppler.0_5_0/qt4/src/Makefile.am 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/qt4/src/Makefile.am 2006-02-16 20:28:54.000000000 +0100
+@@ -1,6 +1,7 @@
+ INCLUDES = \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/poppler \
++ -I$(top_srcdir)/qt \
+ $(POPPLER_QT4_CXXFLAGS)
+
+
+@@ -16,6 +17,7 @@
+ poppler-document.cc \
+ poppler-page.cc \
+ poppler-fontinfo.cc \
++ poppler-embeddedfile.cc \
+ poppler-textbox.cc \
+ ../../qt/poppler-page-transition.cc \
+ poppler-private.h
+@@ -24,3 +26,5 @@
+ $(top_builddir)/poppler/libpoppler.la \
+ $(POPPLER_QT4_LIBS)
+
++libpoppler_qt4_la_LDFLAGS = -version-info 1:0:0
++
+diff -Nur poppler.0_5_0/qt4/src/poppler-document.cc poppler.HEAD/qt4/src/poppler-document.cc
+--- poppler.0_5_0/qt4/src/poppler-document.cc 2006-01-01 23:35:48.000000000 +0100
++++ poppler.HEAD/qt4/src/poppler-document.cc 2006-01-18 23:32:13.000000000 +0100
+@@ -25,10 +25,13 @@
+ #include <GlobalParams.h>
+ #include <PDFDoc.h>
+ #include <Catalog.h>
++#include "UGooString.h"
+ #include <ErrorCodes.h>
+ #include <SplashOutputDev.h>
+ #include <splash/SplashBitmap.h>
+ #include "poppler-private.h"
++#include <Stream.h>
++#include <QtCore/QDebug>
+
+ namespace Poppler {
+
+@@ -50,6 +53,15 @@
+ else
+ pdoc->m_doc->locked = false;
+ pdoc->m_doc->m_fontInfoScanner = new FontInfoScanner(&(doc->doc));
++ int numEmb = doc->doc.getCatalog()->numEmbeddedFiles();
++ if (!(0 == numEmb)) {
++ // we have some embedded documents, build the list
++ for (int yalv = 0; yalv < numEmb; ++yalv) {
++ EmbFile *ef = doc->doc.getCatalog()->embeddedFile(yalv);
++ pdoc->m_doc->m_embeddedFiles.append(new EmbeddedFile(ef));
++ delete ef;
++ }
++ }
+ return pdoc;
+ }
+ else
+@@ -150,6 +162,11 @@
+ return ourList;
+ }
+
++ const QList<EmbeddedFile*> &Document::embeddedFiles() const
++ {
++ return m_doc->m_embeddedFiles;
++ }
++
+ bool Document::scanForFonts( int numPages, QList<FontInfo> *fontList ) const
+ {
+ GooList *items = m_doc->m_fontInfoScanner->scan( numPages );
+@@ -257,7 +274,7 @@
+ Dict *infoDict = info.getDict();
+ // somehow iterate over keys in infoDict
+ for( int i=0; i < infoDict->getLength(); ++i ) {
+- keys.append( QString::fromAscii(infoDict->getKey(i)) );
++ keys.append( QString::fromAscii(infoDict->getKey(i)->getCString()) );
+ }
+
+ info.free();
+@@ -279,8 +296,6 @@
+ }
+
+ Object obj;
+- char *s;
+- int year, mon, day, hour, min, sec;
+ Dict *infoDict = info.getDict();
+ QDateTime result;
+
+@@ -364,6 +379,11 @@
+ return page(index);
+ }
+
++ bool Document::hasEmbeddedFiles() const
++ {
++ return (!(0 == m_doc->doc.getCatalog()->numEmbeddedFiles()));
++ }
++
+ QDateTime convertDate( char *dateString )
+ {
+ int year;
+diff -Nur poppler.0_5_0/qt4/src/poppler-embeddedfile.cc poppler.HEAD/qt4/src/poppler-embeddedfile.cc
+--- poppler.0_5_0/qt4/src/poppler-embeddedfile.cc 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/qt4/src/poppler-embeddedfile.cc 2006-01-18 23:38:59.000000000 +0100
+@@ -0,0 +1,106 @@
++/* poppler-document.cc: qt interface to poppler
++ * Copyright (C) 2005, Albert Astals Cid <aacid@kde.org>
++ * Copyright (C) 2005, Brad Hards <bradh@frogmouth.net>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2, or (at your option)
++ * any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ */
++
++#define UNSTABLE_POPPLER_QT4
++
++#include <QtCore/QString>
++#include <QtCore/QDateTime>
++
++#include "Object.h"
++#include "Stream.h"
++#include "Catalog.h"
++
++#include "poppler-qt4.h"
++
++namespace Poppler
++{
++
++class EmbeddedFileData
++{
++public:
++ QString m_label;
++ QString m_description;
++ QDateTime m_modDate;
++ QDateTime m_createDate;
++ Object m_streamObject;
++};
++
++EmbeddedFile::EmbeddedFile(EmbFile *embfile)
++{
++ m_embeddedFile = new EmbeddedFileData();
++ m_embeddedFile->m_label = QString(embfile->name()->getCString());
++ m_embeddedFile->m_description = QString(embfile->description()->getCString());
++ m_embeddedFile->m_modDate = convertDate(embfile->modDate()->getCString());
++ m_embeddedFile->m_createDate = convertDate(embfile->createDate()->getCString());
++ embfile->streamObject().copy(&m_embeddedFile->m_streamObject);
++}
++
++EmbeddedFile::EmbeddedFile(const EmbeddedFile &ef)
++{
++ m_embeddedFile = new EmbeddedFileData();
++ m_embeddedFile->m_label = ef.m_embeddedFile->m_label;
++ m_embeddedFile->m_description = ef.m_embeddedFile->m_description;
++ m_embeddedFile->m_modDate = ef.m_embeddedFile->m_modDate;
++ m_embeddedFile->m_createDate = ef.m_embeddedFile->m_createDate;
++ ef.m_embeddedFile->m_streamObject.copy(&m_embeddedFile->m_streamObject);
++}
++
++EmbeddedFile::~EmbeddedFile()
++{
++ m_embeddedFile->m_streamObject.free();
++ delete m_embeddedFile;
++}
++
++QString EmbeddedFile::name() const
++{
++ return m_embeddedFile->m_label;
++}
++
++QString EmbeddedFile::description() const
++{
++ return m_embeddedFile->m_description;
++}
++
++QDateTime EmbeddedFile::modDate() const
++{
++ return m_embeddedFile->m_modDate;
++}
++
++QDateTime EmbeddedFile::createDate() const
++{
++ return m_embeddedFile->m_createDate;
++}
++
++QByteArray EmbeddedFile::data()
++{
++ Object obj;
++ Stream *stream = m_embeddedFile->m_streamObject.getStream();
++ stream->reset();
++ int dataLen = 0;
++ QByteArray fileArray;
++ int i;
++ while ( (i = stream->getChar()) != EOF) {
++ fileArray[dataLen] = (char)i;
++ ++dataLen;
++ }
++ fileArray.resize(dataLen);
++ return fileArray;
++};
++
++}
+diff -Nur poppler.0_5_0/qt4/src/poppler-page.cc poppler.HEAD/qt4/src/poppler-page.cc
+--- poppler.0_5_0/qt4/src/poppler-page.cc 2006-01-05 14:53:58.000000000 +0100
++++ poppler.HEAD/qt4/src/poppler-page.cc 2006-01-10 22:57:28.000000000 +0100
+@@ -26,12 +26,12 @@
+ #include <Catalog.h>
+ #include <ErrorCodes.h>
+ #include <ArthurOutputDev.h>
+-#include <Private.h>
+ #include <SplashOutputDev.h>
+ #include <TextOutputDev.h>
+ #include <splash/SplashBitmap.h>
+
+ #include "poppler-private.h"
++#include "poppler-page-transition-private.h"
+
+ namespace Poppler {
+
+diff -Nur poppler.0_5_0/qt4/src/poppler-private.h poppler.HEAD/qt4/src/poppler-private.h
+--- poppler.0_5_0/qt4/src/poppler-private.h 2006-01-01 23:35:48.000000000 +0100
++++ poppler.HEAD/qt4/src/poppler-private.h 2006-01-18 23:32:13.000000000 +0100
+@@ -34,6 +34,7 @@
+
+ ~DocumentData()
+ {
++ qDeleteAll(m_embeddedFiles);
+ delete m_splashOutputDev;
+ delete m_fontInfoScanner;
+ }
+@@ -56,6 +57,7 @@
+ bool locked;
+ FontInfoScanner *m_fontInfoScanner;
+ SplashOutputDev *m_splashOutputDev;
++ QList<EmbeddedFile*> m_embeddedFiles;
+ };
+
+ }
+diff -Nur poppler.0_5_0/qt4/src/poppler-qt4.h poppler.HEAD/qt4/src/poppler-qt4.h
+--- poppler.0_5_0/qt4/src/poppler-qt4.h 2006-01-05 14:53:58.000000000 +0100
++++ poppler.HEAD/qt4/src/poppler-qt4.h 2006-01-18 23:32:13.000000000 +0100
+@@ -26,7 +26,9 @@
+ #include <QtCore/QDateTime>
+ #include <QtGui/QPixmap>
+
+-#include <PageTransition.h>
++#include <poppler-page-transition.h>
++
++class EmbFile;
+
+ /**
+ The Poppler Qt bindings
+@@ -146,6 +148,58 @@
+
+
+ /**
++ Container class for an embedded file with a PDF document
++ */
++ class EmbeddedFileData;
++ class EmbeddedFile {
++ public:
++ /**
++ Create a new embedded file container
++ */
++ EmbeddedFile(EmbFile *embfile);
++
++ EmbeddedFile(const EmbeddedFile &ef);
++
++ ~EmbeddedFile();
++
++ /**
++ The name associated with the file
++ */
++ QString name() const;
++
++ /**
++ The description associated with the file, if any.
++
++ This will return an empty QString if there is no description element
++ */
++ QString description() const;
++
++ /**
++ The modification date for the embedded file, if known.
++ */
++ QDateTime modDate() const;
++
++ /**
++ The creation date for the embedded file, if known.
++ */
++ QDateTime createDate() const;
++
++ /**
++ The data as an array
++ */
++ QByteArray data();
++
++ /**
++ A QDataStream for the actual data?
++ */
++ //QDataStream dataStream() const;
++
++ private:
++ EmbeddedFileData *m_embeddedFile;
++ };
++
++
++ /**
+ Page within a PDF document
+ */
+ class Page {
+@@ -544,6 +598,20 @@
+ */
+ bool scanForFonts( int numPages, QList<FontInfo> *fontList ) const;
+
++
++ /**
++ The documents embedded within the PDF document.
++
++ \note there are two types of embedded document - this call
++ only accesses documents that are embedded at the document level.
++ */
++ const QList<EmbeddedFile*> &embeddedFiles() const;
++
++ /**
++ Whether there are any documents embedded in this PDF document.
++ */
++ bool hasEmbeddedFiles() const;
++
+ Document::~Document();
+
+ private:
+diff -Nur poppler.0_5_0/qt4/tests/check_attachments.cpp poppler.HEAD/qt4/tests/check_attachments.cpp
+--- poppler.0_5_0/qt4/tests/check_attachments.cpp 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/qt4/tests/check_attachments.cpp 2006-01-18 23:40:26.000000000 +0100
+@@ -0,0 +1,151 @@
++#include <QtTest/QtTest>
++
++#define UNSTABLE_POPPLER_QT4
++#include <poppler-qt4.h>
++
++#include <QtCore/QFile>
++
++class TestAttachments: public QObject
++{
++ Q_OBJECT
++private slots:
++ void checkNoAttachments();
++ void checkAttach1();
++ void checkAttach2();
++ void checkAttach3();
++ void checkAttach4();
++};
++
++void TestAttachments::checkNoAttachments()
++{
++ Poppler::Document *doc;
++ doc = Poppler::Document::load("../../../test/unittestcases/truetype.pdf");
++ QVERIFY( doc );
++
++ QCOMPARE( doc->hasEmbeddedFiles(), false );
++
++ delete doc;
++}
++
++void TestAttachments::checkAttach1()
++{
++
++ Poppler::Document *doc;
++ doc = Poppler::Document::load("../../../test/unittestcases/WithAttachments.pdf");
++ QVERIFY( doc );
++
++ QVERIFY( doc->hasEmbeddedFiles() );
++
++ QList<Poppler::EmbeddedFile*> fileList = doc->embeddedFiles();
++ QCOMPARE( fileList.size(), 2 );
++
++ Poppler::EmbeddedFile *embfile = fileList.at(0);
++ QCOMPARE( embfile->name(), QString( "kroller.png" ) );
++ QCOMPARE( embfile->description(), QString("/home/bradh/coding/svn-vers/KDE/kdeartwork/wallpapers/kroller.png") );
++ QCOMPARE( embfile->createDate(), QDateTime( QDate(), QTime() ) );
++ QCOMPARE( embfile->modDate(), QDateTime( QDate(), QTime() ) );
++
++ QFile file( "../../../test/unittestcases/kroller.png" );
++ QVERIFY( file.open( QIODevice::ReadOnly ) );
++ QByteArray krollerData = file.readAll();
++ QByteArray embdata = embfile->data();
++ QCOMPARE( krollerData, embdata );
++
++
++ Poppler::EmbeddedFile *embfile2 = fileList.at(1);
++ QCOMPARE( embfile2->name(), QString("gnome-64.gif") );
++ QCOMPARE( embfile2->description(), QString("/usr/share/gnome-about/gnome-64.gif") );
++ QCOMPARE( embfile2->modDate(), QDateTime( QDate(), QTime() ) );
++ QCOMPARE( embfile2->createDate(), QDateTime( QDate(), QTime() ) );
++
++ QFile file2( "../../../test/unittestcases/gnome-64.gif" );
++ QVERIFY( file2.open( QIODevice::ReadOnly ) );
++ QByteArray g64Data = file2.readAll();
++ QByteArray emb2data = embfile2->data();
++ QCOMPARE( g64Data, emb2data );
++
++ delete doc;
++}
++
++
++void TestAttachments::checkAttach2()
++{
++
++ Poppler::Document *doc;
++ doc = Poppler::Document::load("../../../test/unittestcases/A6EmbeddedFiles.pdf");
++ QVERIFY( doc );
++
++ QVERIFY( doc->hasEmbeddedFiles() );
++
++ QList<Poppler::EmbeddedFile*> fileList;
++ fileList = doc->embeddedFiles();
++ QCOMPARE( fileList.size(), 3 );
++
++ Poppler::EmbeddedFile *embfile1 = fileList.at(0);
++ QCOMPARE( embfile1->name(), QString("Acro7 thoughts") );
++ QCOMPARE( embfile1->description(), QString("Acro7 Thoughts") );
++ QCOMPARE( embfile1->createDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 13, 54, 54), Qt::UTC ) );
++ QCOMPARE( embfile1->modDate(), QDateTime( QDate( 2003, 8, 4 ), QTime( 14, 15, 27), Qt::UTC ) );
++
++ Poppler::EmbeddedFile *embfile2 = fileList.at(1);
++ QCOMPARE( embfile2->name(), QString("acro transitions 1.xls") );
++ QCOMPARE( embfile2->description(), QString("AcroTransitions") );
++ QCOMPARE( embfile2->createDate(), QDateTime( QDate( 2003, 7, 18 ), QTime( 21, 7, 16), Qt::UTC ) );
++ QCOMPARE( embfile2->modDate(), QDateTime( QDate( 2003, 7, 22 ), QTime( 13, 4, 40), Qt::UTC ) );
++
++ Poppler::EmbeddedFile *embfile3 = fileList.at(2);
++ QCOMPARE( embfile3->name(), QString("apago_pdfe_wide.gif") );
++ QCOMPARE( embfile3->description(), QString("PDFE Animation") );
++ QCOMPARE( embfile3->createDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 54, 29), Qt::UTC ) );
++ QCOMPARE( embfile3->modDate(), QDateTime( QDate( 2003, 1, 31 ), QTime( 15, 52, 58), Qt::UTC ) );
++
++ delete doc;
++}
++
++void TestAttachments::checkAttach3()
++{
++
++ Poppler::Document *doc;
++ doc = Poppler::Document::load("../../../test/unittestcases/shapes+attachments.pdf");
++ QVERIFY( doc );
++
++ QVERIFY( doc->hasEmbeddedFiles() );
++
++ QList<Poppler::EmbeddedFile*> fileList;
++ fileList = doc->embeddedFiles();
++ QCOMPARE( fileList.size(), 1 );
++
++ Poppler::EmbeddedFile *embfile = fileList.at(0);
++ QCOMPARE( embfile->name(), QString( "ADEX1.xpdf.pgp" ) );
++ QCOMPARE( embfile->description(), QString("encrypted version of document") );
++ QCOMPARE( embfile->createDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
++ QCOMPARE( embfile->modDate(), QDateTime( QDate( 2004, 3, 29 ), QTime( 19, 37, 16), Qt::UTC ) );
++ delete doc;
++
++}
++
++void TestAttachments::checkAttach4()
++{
++
++ Poppler::Document *doc;
++ doc = Poppler::Document::load("../../../test/unittestcases/imageretrieve+attachment.pdf");
++ QVERIFY( doc );
++
++ QVERIFY( doc->hasEmbeddedFiles() );
++
++ QList<Poppler::EmbeddedFile*> fileList;
++ fileList = doc->embeddedFiles();
++ QCOMPARE( fileList.size(), 1 );
++
++ Poppler::EmbeddedFile *embfile = fileList.at(0);
++ QCOMPARE( embfile->name(), QString( "export-altona.csv" ) );
++ QCOMPARE( embfile->description(), QString("Altona Export") );
++ QCOMPARE( embfile->createDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 35), Qt::UTC ) );
++ QCOMPARE( embfile->modDate(), QDateTime( QDate( 2005, 8, 30 ), QTime( 20, 49, 52), Qt::UTC ) );
++ delete doc;
++
++}
++
++QTEST_MAIN(TestAttachments)
++#include "check_attachments.moc"
++
+diff -Nur poppler.0_5_0/qt4/tests/Makefile.am poppler.HEAD/qt4/tests/Makefile.am
+--- poppler.0_5_0/qt4/tests/Makefile.am 2005-12-27 07:10:02.000000000 +0100
++++ poppler.HEAD/qt4/tests/Makefile.am 2006-01-18 23:32:13.000000000 +0100
+@@ -2,6 +2,7 @@
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/poppler \
+ -I$(top_srcdir)/qt4/src \
++ -I$(top_srcdir)/qt \
+ $(POPPLER_QT4_CXXFLAGS) \
+ $(POPPLER_QTTEST_CXXFLAGS)
+
+@@ -18,7 +19,7 @@
+ moc -i $< -o $@
+
+ noinst_PROGRAMS = test-poppler-qt4 stress-poppler-qt4 \
+- poppler-fonts test-password-qt4
++ poppler-fonts test-password-qt4 poppler-attachments
+
+
+ test_poppler_qt4_SOURCES = \
+@@ -38,6 +39,11 @@
+
+ poppler_fonts_LDADD = $(LDADDS)
+
++poppler_attachments_SOURCES = \
++ poppler-attachments.cpp
++
++poppler_attachments_LDADD = $(LDADDS)
++
+
+ stress_poppler_qt4_SOURCES = \
+ stress-poppler-qt4.cpp
+@@ -46,7 +52,8 @@
+
+ if BUILD_POPPLER_QT4TESTS
+ TESTS = \
+- check_dateConversion \
++ check_attachments \
++ check_dateConversion \
+ check_fonts \
+ check_metadata \
+ check_permissions \
+@@ -55,6 +62,10 @@
+
+ check_PROGRAMS = $(TESTS)
+
++check_attachments_SOURCES = check_attachments.cpp
++check_attachments.$(OBJEXT): check_attachments.moc
++check_attachments_LDADD = $(UT_LDADDS)
++
+ check_dateConversion_SOURCES = check_dateConversion.cpp
+ check_dateConversion.$(OBJEXT): check_dateConversion.moc
+ check_dateConversion_LDADD = $(UT_LDADDS)
+@@ -72,7 +83,7 @@
+ check_pagemode_LDADD = $(UT_LDADDS)
+
+ check_permissions_SOURCES = check_permissions.cpp
+-check_metadata.$(OBJEXT): check_permissions.moc
++check_permissions.$(OBJEXT): check_permissions.moc
+ check_permissions_LDADD = $(UT_LDADDS)
+
+ check_pagelayout_SOURCES = check_pagelayout.cpp
+diff -Nur poppler.0_5_0/qt4/tests/poppler-attachments.cpp poppler.HEAD/qt4/tests/poppler-attachments.cpp
+--- poppler.0_5_0/qt4/tests/poppler-attachments.cpp 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/qt4/tests/poppler-attachments.cpp 2006-01-18 23:40:26.000000000 +0100
+@@ -0,0 +1,37 @@
++#include <QtCore/QtCore>
++#include <iostream>
++
++#define UNSTABLE_POPPLER_QT4
++#include <poppler-qt4.h>
++
++int main( int argc, char **argv )
++{
++ QCoreApplication a( argc, argv ); // QApplication required!
++
++ if (!( argc == 2 ))
++ {
++ qWarning() << "usage: poppler-attachments filename";
++ exit(1);
++ }
++
++ Poppler::Document *doc = Poppler::Document::load(argv[1]);
++ if (!doc)
++ {
++ qWarning() << "doc not loaded";
++ exit(1);
++ }
++
++ if (doc->hasEmbeddedFiles()) {
++ std::cout << "Embedded files: " << std::endl;
++ foreach(Poppler::EmbeddedFile *file, doc->embeddedFiles()) {
++ std::cout << " " << qPrintable(file->name()) << std::endl;
++ std::cout << " desc:" << qPrintable(file->description()) << std::endl;
++ QByteArray data = file->data();
++ std::cout << " data: " << data.constData() << std::endl;
++ }
++
++ } else {
++ std::cout << "There are no embedded document at the top level" << std::endl;
++ }
++
++}
+diff -Nur poppler.0_5_0/splash/Splash.cc poppler.HEAD/splash/Splash.cc
+--- poppler.0_5_0/splash/Splash.cc 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/splash/Splash.cc 2006-02-06 21:49:21.000000000 +0100
+@@ -2020,10 +2020,10 @@
+ for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
+ alpha = *p++;
+ if (softMask) {
+- alpha = (int)(alpha * state->fillAlpha *
++ alpha = (int)(alpha * (float)state->fillAlpha *
+ softMask->data[y1 * softMask->rowSize + x1]);
+ } else {
+- alpha = (int)(alpha * state->fillAlpha);
++ alpha = (int)(alpha * (float)state->fillAlpha);
+ }
+ if (alpha > 0) {
+ if (noClip || state->clip->test(x1, y1)) {
+diff -Nur poppler.0_5_0/splash/SplashFontEngine.cc poppler.HEAD/splash/SplashFontEngine.cc
+--- poppler.0_5_0/splash/SplashFontEngine.cc 2005-09-16 19:42:56.000000000 +0200
++++ poppler.HEAD/splash/SplashFontEngine.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -105,19 +105,19 @@
+ }
+
+ SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile, char **enc) {
++ SplashFontSrc *src,
++ char **enc) {
+ SplashFontFile *fontFile;
+
+ fontFile = NULL;
+ #if HAVE_T1LIB_H
+ if (!fontFile && t1Engine) {
+- fontFile = t1Engine->loadType1Font(idA, fileName, deleteFile, enc);
++ fontFile = t1Engine->loadType1Font(idA, src, enc);
+ }
+ #endif
+ #if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+ if (!fontFile && ftEngine) {
+- fontFile = ftEngine->loadType1Font(idA, fileName, deleteFile, enc);
++ fontFile = ftEngine->loadType1Font(idA, src, enc);
+ }
+ #endif
+
+@@ -126,29 +126,26 @@
+ // semantics, this will remove the last link; otherwise it will
+ // return an error, leaving the file to be deleted later (if
+ // loadXYZFont failed, the file will always be deleted)
+- if (deleteFile) {
+- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
+- }
++ src->unref();
+ #endif
+
+ return fontFile;
+ }
+
+ SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ char **enc) {
+ SplashFontFile *fontFile;
+
+ fontFile = NULL;
+ #if HAVE_T1LIB_H
+ if (!fontFile && t1Engine) {
+- fontFile = t1Engine->loadType1CFont(idA, fileName, deleteFile, enc);
++ fontFile = t1Engine->loadType1CFont(idA, src, enc);
+ }
+ #endif
+ #if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+ if (!fontFile && ftEngine) {
+- fontFile = ftEngine->loadType1CFont(idA, fileName, deleteFile, enc);
++ fontFile = ftEngine->loadType1CFont(idA, src, enc);
+ }
+ #endif
+
+@@ -157,23 +154,20 @@
+ // semantics, this will remove the last link; otherwise it will
+ // return an error, leaving the file to be deleted later (if
+ // loadXYZFont failed, the file will always be deleted)
+- if (deleteFile) {
+- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
+- }
++ src->unref();
+ #endif
+
+ return fontFile;
+ }
+
+ SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile) {
++ SplashFontSrc *src) {
+ SplashFontFile *fontFile;
+
+ fontFile = NULL;
+ #if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+ if (!fontFile && ftEngine) {
+- fontFile = ftEngine->loadCIDFont(idA, fileName, deleteFile);
++ fontFile = ftEngine->loadCIDFont(idA, src);
+ }
+ #endif
+
+@@ -182,26 +176,24 @@
+ // semantics, this will remove the last link; otherwise it will
+ // return an error, leaving the file to be deleted later (if
+ // loadXYZFont failed, the file will always be deleted)
+- if (deleteFile) {
+- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
+- }
++ src->unref();
+ #endif
+
+ return fontFile;
+ }
+
+ SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ Gushort *codeToGID,
+- int codeToGIDLen) {
++ int codeToGIDLen,
++ int faceIndex) {
+ SplashFontFile *fontFile;
+
+ fontFile = NULL;
+ #if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+ if (!fontFile && ftEngine) {
+- fontFile = ftEngine->loadTrueTypeFont(idA, fileName, deleteFile,
+- codeToGID, codeToGIDLen);
++ fontFile = ftEngine->loadTrueTypeFont(idA, src,
++ codeToGID, codeToGIDLen, faceIndex);
+ }
+ #endif
+
+@@ -214,9 +206,7 @@
+ // semantics, this will remove the last link; otherwise it will
+ // return an error, leaving the file to be deleted later (if
+ // loadXYZFont failed, the file will always be deleted)
+- if (deleteFile) {
+- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
+- }
++ src->unref();
+ #endif
+
+ return fontFile;
+diff -Nur poppler.0_5_0/splash/SplashFontEngine.h poppler.HEAD/splash/SplashFontEngine.h
+--- poppler.0_5_0/splash/SplashFontEngine.h 2005-03-03 20:45:59.000000000 +0100
++++ poppler.HEAD/splash/SplashFontEngine.h 2006-02-02 23:50:01.000000000 +0100
+@@ -19,6 +19,7 @@
+ class SplashFontFile;
+ class SplashFontFileID;
+ class SplashFont;
++class SplashFontSrc;
+
+ //------------------------------------------------------------------------
+
+@@ -48,15 +49,12 @@
+ SplashFontFile *getFontFile(SplashFontFileID *id);
+
+ // Load fonts - these create new SplashFontFile objects.
+- SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile, char **enc);
+- SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile, char **enc);
+- SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile);
+- SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile,
+- Gushort *codeToGID, int codeToGIDLen);
++ SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, char **enc);
++ SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, char **enc);
++ SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src);
++ SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src,
++ Gushort *codeToGID, int codeToGIDLen,
++ int faceIndex=0);
+
+ // Get a font - this does a cache lookup first, and if not found,
+ // creates a new SplashFont object and adds it to the cache. The
+diff -Nur poppler.0_5_0/splash/SplashFontFile.cc poppler.HEAD/splash/SplashFontFile.cc
+--- poppler.0_5_0/splash/SplashFontFile.cc 2005-12-08 19:17:42.000000000 +0100
++++ poppler.HEAD/splash/SplashFontFile.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -12,6 +12,7 @@
+
+ #include <stdio.h>
+ #include <unistd.h>
++#include "goo/gmem.h"
+ #include "goo/GooString.h"
+ #include "SplashFontFile.h"
+ #include "SplashFontFileID.h"
+@@ -26,19 +27,15 @@
+ // SplashFontFile
+ //------------------------------------------------------------------------
+
+-SplashFontFile::SplashFontFile(SplashFontFileID *idA, char *fileNameA,
+- GBool deleteFileA) {
++SplashFontFile::SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA) {
+ id = idA;
+- fileName = new GooString(fileNameA);
+- deleteFile = deleteFileA;
++ src = srcA;
++ src->ref();
+ refCnt = 0;
+ }
+
+ SplashFontFile::~SplashFontFile() {
+- if (deleteFile) {
+- unlink(fileName->getCString());
+- }
+- delete fileName;
++ src->unref();
+ delete id;
+ }
+
+@@ -51,3 +48,60 @@
+ delete this;
+ }
+ }
++
++//
++
++SplashFontSrc::SplashFontSrc() {
++ isFile = gFalse;
++ deleteSrc = gFalse;
++ fileName = NULL;
++ buf = NULL;
++ refcnt = 1;
++}
++
++SplashFontSrc::~SplashFontSrc() {
++ if (deleteSrc) {
++ if (isFile) {
++ if (fileName)
++ unlink(fileName->getCString());
++ } else {
++ if (buf)
++ gfree(buf);
++ }
++ }
++
++ if (isFile && fileName)
++ delete fileName;
++}
++
++void SplashFontSrc::ref() {
++ refcnt++;
++}
++
++void SplashFontSrc::unref() {
++ if (! --refcnt)
++ delete this;
++}
++
++void SplashFontSrc::setFile(GooString *file, GBool del)
++{
++ isFile = gTrue;
++ fileName = file->copy();
++ deleteSrc = del;
++}
++
++void SplashFontSrc::setFile(const char *file, GBool del)
++{
++ isFile = gTrue;
++ fileName = new GooString(file);
++ deleteSrc = del;
++}
++
++void SplashFontSrc::setBuf(char *bufA, int bufLenA, GBool del)
++{
++ isFile = gFalse;
++ buf = bufA;
++ bufLen = bufLenA;
++ deleteSrc = del;
++}
++
+diff -Nur poppler.0_5_0/splash/SplashFontFile.h poppler.HEAD/splash/SplashFontFile.h
+--- poppler.0_5_0/splash/SplashFontFile.h 2005-03-03 20:45:59.000000000 +0100
++++ poppler.HEAD/splash/SplashFontFile.h 2006-02-02 23:50:01.000000000 +0100
+@@ -23,6 +23,25 @@
+ // SplashFontFile
+ //------------------------------------------------------------------------
+
++struct SplashFontSrc {
++ SplashFontSrc();
++ ~SplashFontSrc();
++
++ void setFile(GooString *file, GBool del);
++ void setFile(const char *file, GBool del);
++ void setBuf(char *bufA, int buflenA, GBool del);
++
++ void ref();
++ void unref();
++
++ GBool isFile;
++ GooString *fileName;
++ char *buf;
++ int bufLen;
++ GBool deleteSrc;
++ int refcnt;
++};
++
+ class SplashFontFile {
+ public:
+
+@@ -44,12 +63,10 @@
+
+ protected:
+
+- SplashFontFile(SplashFontFileID *idA, char *fileNameA,
+- GBool deleteFileA);
++ SplashFontFile(SplashFontFileID *idA, SplashFontSrc *srcA);
+
+ SplashFontFileID *id;
+- GooString *fileName;
+- GBool deleteFile;
++ SplashFontSrc *src;
+ int refCnt;
+
+ friend class SplashFontEngine;
+diff -Nur poppler.0_5_0/splash/SplashFTFont.cc poppler.HEAD/splash/SplashFTFont.cc
+--- poppler.0_5_0/splash/SplashFTFont.cc 2005-11-17 22:37:34.000000000 +0100
++++ poppler.HEAD/splash/SplashFTFont.cc 2006-01-23 15:45:30.000000000 +0100
+@@ -19,7 +19,8 @@
+
+ #include <ft2build.h>
+ #include FT_OUTLINE_H
+-#include FT_INTERNAL_OBJECTS_H // needed for FT_New_Size decl
++#include FT_SIZES_H
++#include FT_GLYPH_H
+ #include "goo/gmem.h"
+ #include "SplashMath.h"
+ #include "SplashGlyphBitmap.h"
+diff -Nur poppler.0_5_0/splash/SplashFTFontEngine.cc poppler.HEAD/splash/SplashFTFontEngine.cc
+--- poppler.0_5_0/splash/SplashFTFontEngine.cc 2005-12-08 19:17:42.000000000 +0100
++++ poppler.HEAD/splash/SplashFTFontEngine.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -64,22 +64,19 @@
+ }
+
+ SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ char **enc) {
+- return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
++ return SplashFTFontFile::loadType1Font(this, idA, src, enc);
+ }
+
+ SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ char **enc) {
+- return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
++ return SplashFTFontFile::loadType1Font(this, idA, src, enc);
+ }
+
+ SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile) {
++ SplashFontSrc *src) {
+ FoFiType1C *ff;
+ Gushort *cidToGIDMap;
+ int nCIDs;
+@@ -89,15 +86,21 @@
+ if (useCIDs) {
+ cidToGIDMap = NULL;
+ nCIDs = 0;
+- } else if ((ff = FoFiType1C::load(fileName))) {
++ } else {
++ if (src->isFile) {
++ ff = FoFiType1C::load(src->fileName->getCString());
++ } else {
++ ff = new FoFiType1C(src->buf, src->bufLen, gFalse);
++ }
++ if (ff) {
+ cidToGIDMap = ff->getCIDToGIDMap(&nCIDs);
+ delete ff;
+ } else {
+ cidToGIDMap = NULL;
+ nCIDs = 0;
+ }
+- ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile,
+- cidToGIDMap, nCIDs);
++ }
++ ret = SplashFTFontFile::loadCIDFont(this, idA, src, cidToGIDMap, nCIDs);
+ if (!ret) {
+ gfree(cidToGIDMap);
+ }
+@@ -105,16 +108,17 @@
+ }
+
+ SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ Gushort *codeToGID,
+- int codeToGIDLen) {
++ int codeToGIDLen,
++ int faceIndex) {
++#if 0
+ FoFiTrueType *ff;
+ GooString *tmpFileName;
+ FILE *tmpFile;
+ SplashFontFile *ret;
+
+- if (!(ff = FoFiTrueType::load(fileName))) {
++ if (!(ff = FoFiTrueType::load(fileName, faceIndex))) {
+ return NULL;
+ }
+ tmpFileName = NULL;
+@@ -127,7 +131,8 @@
+ fclose(tmpFile);
+ ret = SplashFTFontFile::loadTrueTypeFont(this, idA,
+ tmpFileName->getCString(),
+- gTrue, codeToGID, codeToGIDLen);
++ gTrue, codeToGID, codeToGIDLen,
++ faceIndex);
+ if (ret) {
+ if (deleteFile) {
+ unlink(fileName);
+@@ -137,6 +142,13 @@
+ }
+ delete tmpFileName;
+ return ret;
++#else
++ SplashFontFile *ret;
++ ret = SplashFTFontFile::loadTrueTypeFont(this, idA, src,
++ codeToGID, codeToGIDLen,
++ faceIndex);
++ return ret;
++#endif
+ }
+
+ #endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
+diff -Nur poppler.0_5_0/splash/SplashFTFontEngine.h poppler.HEAD/splash/SplashFTFontEngine.h
+--- poppler.0_5_0/splash/SplashFTFontEngine.h 2005-09-16 00:09:50.000000000 +0200
++++ poppler.HEAD/splash/SplashFTFontEngine.h 2006-02-02 23:50:01.000000000 +0100
+@@ -19,6 +19,7 @@
+
+ class SplashFontFile;
+ class SplashFontFileID;
++class SplashFontSrc;
+
+ //------------------------------------------------------------------------
+ // SplashFTFontEngine
+@@ -32,15 +33,12 @@
+ ~SplashFTFontEngine();
+
+ // Load fonts.
+- SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile, char **enc);
+- SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile, char **enc);
+- SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile);
+- SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName,
+- GBool deleteFile,
+- Gushort *codeToGID, int codeToGIDLen);
++ SplashFontFile *loadType1Font(SplashFontFileID *idA, SplashFontSrc *src, char **enc);
++ SplashFontFile *loadType1CFont(SplashFontFileID *idA, SplashFontSrc *src, char **enc);
++ SplashFontFile *loadCIDFont(SplashFontFileID *idA, SplashFontSrc *src);
++ SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, SplashFontSrc *src,
++ Gushort *codeToGID, int codeToGIDLen,
++ int faceIndex=0);
+
+ private:
+
+diff -Nur poppler.0_5_0/splash/SplashFTFontFile.cc poppler.HEAD/splash/SplashFTFontFile.cc
+--- poppler.0_5_0/splash/SplashFTFontFile.cc 2005-08-27 10:43:43.000000000 +0200
++++ poppler.HEAD/splash/SplashFTFontFile.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -13,6 +13,7 @@
+ #endif
+
+ #include "goo/gmem.h"
++#include "goo/GooString.h"
+ #include "SplashFTFontEngine.h"
+ #include "SplashFTFont.h"
+ #include "SplashFTFontFile.h"
+@@ -23,16 +24,19 @@
+
+ SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA,
+- GBool deleteFileA,
++ SplashFontSrc *src,
+ char **encA) {
+ FT_Face faceA;
+ Gushort *codeToGIDA;
+ char *name;
+ int i;
+
+- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
+- return NULL;
++ if (src->isFile) {
++ if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA))
++ return NULL;
++ } else {
++ if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA))
++ return NULL;
+ }
+ codeToGIDA = (Gushort *)gmallocn(256, sizeof(int));
+ for (i = 0; i < 256; ++i) {
+@@ -42,48 +46,55 @@
+ }
+ }
+
+- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
++ return new SplashFTFontFile(engineA, idA, src,
+ faceA, codeToGIDA, 256);
+ }
+
+ SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA,
+- GBool deleteFileA,
++ SplashFontSrc *src,
+ Gushort *codeToGIDA,
+ int codeToGIDLenA) {
+ FT_Face faceA;
+
+- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
+- return NULL;
++ if (src->isFile) {
++ if (FT_New_Face(engineA->lib, src->fileName->getCString(), 0, &faceA))
++ return NULL;
++ } else {
++ if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, 0, &faceA))
++ return NULL;
+ }
+
+- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
++ return new SplashFTFontFile(engineA, idA, src,
+ faceA, codeToGIDA, codeToGIDLenA);
+ }
+
+ SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA,
+- GBool deleteFileA,
++ SplashFontSrc *src,
+ Gushort *codeToGIDA,
+- int codeToGIDLenA) {
++ int codeToGIDLenA,
++ int faceIndexA) {
+ FT_Face faceA;
+
+- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
+- return NULL;
++ if (src->isFile) {
++ if (FT_New_Face(engineA->lib, src->fileName->getCString(), faceIndexA, &faceA))
++ return NULL;
++ } else {
++ if (FT_New_Memory_Face(engineA->lib, (const FT_Byte *)src->buf, src->bufLen, faceIndexA, &faceA))
++ return NULL;
+ }
+
+- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
++ return new SplashFTFontFile(engineA, idA, src,
+ faceA, codeToGIDA, codeToGIDLenA);
+ }
+
+ SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA, GBool deleteFileA,
++ SplashFontSrc *srcA,
+ FT_Face faceA,
+ Gushort *codeToGIDA, int codeToGIDLenA):
+- SplashFontFile(idA, fileNameA, deleteFileA)
++ SplashFontFile(idA, srcA)
+ {
+ engine = engineA;
+ face = faceA;
+diff -Nur poppler.0_5_0/splash/SplashFTFontFile.h poppler.HEAD/splash/SplashFTFontFile.h
+--- poppler.0_5_0/splash/SplashFTFontFile.h 2005-03-03 20:45:59.000000000 +0100
++++ poppler.HEAD/splash/SplashFTFontFile.h 2006-02-02 23:50:01.000000000 +0100
+@@ -28,18 +28,18 @@
+ public:
+
+ static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA,
+- SplashFontFileID *idA, char *fileNameA,
+- GBool deleteFileA, char **encA);
++ SplashFontFileID *idA,
++ SplashFontSrc *src, char **encA);
+ static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA,
+- SplashFontFileID *idA, char *fileNameA,
+- GBool deleteFileA,
+- Gushort *codeToCIDA, int codeToGIDLenA);
++ SplashFontFileID *idA,
++ SplashFontSrc *src,
++ Gushort *codeToCIDA, int codeToGIDLenA);
+ static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA,
+- GBool deleteFileA,
++ SplashFontSrc *src,
+ Gushort *codeToGIDA,
+- int codeToGIDLenA);
++ int codeToGIDLenA,
++ int faceIndexA=0);
+
+ virtual ~SplashFTFontFile();
+
+@@ -51,7 +51,7 @@
+
+ SplashFTFontFile(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA, GBool deleteFileA,
++ SplashFontSrc *srcA,
+ FT_Face faceA,
+ Gushort *codeToGIDA, int codeToGIDLenA);
+
+diff -Nur poppler.0_5_0/splash/SplashT1FontEngine.cc poppler.HEAD/splash/SplashT1FontEngine.cc
+--- poppler.0_5_0/splash/SplashT1FontEngine.cc 2005-03-03 20:46:00.000000000 +0100
++++ poppler.HEAD/splash/SplashT1FontEngine.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -82,22 +82,26 @@
+ }
+
+ SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ char **enc) {
+- return SplashT1FontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
++ return SplashT1FontFile::loadType1Font(this, idA, src, enc);
+ }
+
+ SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA,
+- char *fileName,
+- GBool deleteFile,
++ SplashFontSrc *src,
+ char **enc) {
+ FoFiType1C *ff;
+ GooString *tmpFileName;
+ FILE *tmpFile;
+ SplashFontFile *ret;
+
+- if (!(ff = FoFiType1C::load(fileName))) {
++ SplashFontSrc *newsrc;
++
++ if (src->isFile)
++ ff = FoFiType1C::load(src->fileName);
++ else
++ ff = new FoFiType1C(src->buf, src->bufLen, gFalse);
++ if (! ff)
+ return NULL;
+ }
+ tmpFileName = NULL;
+@@ -108,16 +112,11 @@
+ ff->convertToType1(NULL, gTrue, &fileWrite, tmpFile);
+ delete ff;
+ fclose(tmpFile);
+- ret = SplashT1FontFile::loadType1Font(this, idA, tmpFileName->getCString(),
+- gTrue, enc);
+- if (ret) {
+- if (deleteFile) {
+- unlink(fileName);
+- }
+- } else {
+- unlink(tmpFileName->getCString());
+- }
++ newsrc = new SplashFontSrc;
++ newsrc->setFile(tmpFileName, gTrue);
+ delete tmpFileName;
++ ret = SplashT1FontFile::loadType1Font(this, idA, newsrc, enc);
++ newsrc->unref();
+ return ret;
+ }
+
+diff -Nur poppler.0_5_0/splash/SplashT1FontFile.cc poppler.HEAD/splash/SplashT1FontFile.cc
+--- poppler.0_5_0/splash/SplashT1FontFile.cc 2005-08-27 10:43:43.000000000 +0200
++++ poppler.HEAD/splash/SplashT1FontFile.cc 2006-02-02 23:50:01.000000000 +0100
+@@ -25,8 +25,7 @@
+
+ SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA,
+- GBool deleteFileA,
++ SplashFontSrc *src,
+ char **encA) {
+ int t1libIDA;
+ char **encTmp;
+@@ -34,9 +33,27 @@
+ int encStrSize;
+ char *encPtr;
+ int i;
+-
++ GString *fileNameA;
++ SplashFontSrc *newsrc = NULL;
++ SplashFontFile *ff;
++
++ if (! src->isFile) {
++ GString *tmpFileName;
++ FILE *tmpFile;
++ if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL))
++ return NULL;
++ fwrite(src->buf, 1, src->bufLen, tmpFile);
++ fclose(tmpFile);
++ newsrc = new SplashFontSrc;
++ newsrc->setFile(tmpFileName, gTrue);
++ src = newsrc;
++ delete tmpFileName;
++ }
++ fileNameA = src->fileName;
+ // load the font file
+ if ((t1libIDA = T1_AddFont(fileNameA)) < 0) {
++ if (newsrc)
++ delete newsrc;
+ return NULL;
+ }
+ T1_LoadFont(t1libIDA);
+@@ -63,15 +80,18 @@
+ encTmp[256] = "custom";
+ T1_ReencodeFont(t1libIDA, encTmp);
+
+- return new SplashT1FontFile(engineA, idA, fileNameA, deleteFileA,
++ ff = new SplashT1FontFile(engineA, idA, src,
+ t1libIDA, encTmp, encStrTmp);
++ if (newsrc)
++ newsrc->unref();
++ return ff;
+ }
+
+ SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA, GBool deleteFileA,
++ SplashFontSrc *srcA,
+ int t1libIDA, char **encA, char *encStrA):
+- SplashFontFile(idA, fileNameA, deleteFileA)
++ SplashFontFile(idA, srcA)
+ {
+ engine = engineA;
+ t1libID = t1libIDA;
+diff -Nur poppler.0_5_0/splash/SplashT1FontFile.h poppler.HEAD/splash/SplashT1FontFile.h
+--- poppler.0_5_0/splash/SplashT1FontFile.h 2005-03-03 20:45:59.000000000 +0100
++++ poppler.HEAD/splash/SplashT1FontFile.h 2006-02-02 23:50:01.000000000 +0100
+@@ -26,7 +26,7 @@
+
+ static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA, GBool deleteFileA,
++ SplashFontSrc *src,
+ char **encA);
+
+ virtual ~SplashT1FontFile();
+@@ -39,7 +39,7 @@
+
+ SplashT1FontFile(SplashT1FontEngine *engineA,
+ SplashFontFileID *idA,
+- char *fileNameA, GBool deleteFileA,
++ SplashFontSrc *src,
+ int t1libIDA, char **encA, char *encStrA);
+
+ SplashT1FontEngine *engine;
+diff -Nur poppler.0_5_0/splash/SplashTypes.h poppler.HEAD/splash/SplashTypes.h
+--- poppler.0_5_0/splash/SplashTypes.h 2005-10-30 21:29:05.000000000 +0100
++++ poppler.HEAD/splash/SplashTypes.h 2006-02-06 21:49:21.000000000 +0100
+@@ -14,7 +14,7 @@
+ //------------------------------------------------------------------------
+
+ #if USE_FIXEDPOINT
+-#include "FixedPoint.h"
++#include "goo/FixedPoint.h"
+ typedef FixedPoint SplashCoord;
+ #else
+ typedef double SplashCoord;
+diff -Nur poppler.0_5_0/splash/SplashXPathScanner.cc poppler.HEAD/splash/SplashXPathScanner.cc
+--- poppler.0_5_0/splash/SplashXPathScanner.cc 2005-10-16 16:19:47.000000000 +0200
++++ poppler.HEAD/splash/SplashXPathScanner.cc 2006-02-03 00:06:20.000000000 +0100
+@@ -186,7 +186,7 @@
+ }
+
+ void SplashXPathScanner::computeIntersections(int y) {
+- SplashCoord ySegMin, ySegMax, xx0, xx1;
++ SplashCoord xSegMin, xSegMax, ySegMin, ySegMax, xx0, xx1;
+ SplashXPathSeg *seg;
+ int i, j;
+
+@@ -236,19 +236,27 @@
+ } else if (seg->flags & splashXPathVert) {
+ xx0 = xx1 = seg->x0;
+ } else {
+- if (ySegMin <= y) {
+- // intersection with top edge
+- xx0 = seg->x0 + ((SplashCoord)y - seg->y0) * seg->dxdy;
++ if (seg->x0 < seg->x1) {
++ xSegMin = seg->x0;
++ xSegMax = seg->x1;
+ } else {
+- // x coord of segment endpoint with min y coord
+- xx0 = (seg->flags & splashXPathFlip) ? seg->x1 : seg->x0;
++ xSegMin = seg->x1;
++ xSegMax = seg->x0;
+ }
+- if (ySegMax >= y + 1) {
+- // intersection with bottom edge
+- xx1 = seg->x0 + ((SplashCoord)y + 1 - seg->y0) * seg->dxdy;
+- } else {
+- // x coord of segment endpoint with max y coord
+- xx1 = (seg->flags & splashXPathFlip) ? seg->x0 : seg->x1;
++ // intersection with top edge
++ xx0 = seg->x0 + ((SplashCoord)y - seg->y0) * seg->dxdy;
++ // intersection with bottom edge
++ xx1 = seg->x0 + ((SplashCoord)y + 1 - seg->y0) * seg->dxdy;
++ // the segment may not actually extend to the top and/or bottom edges
++ if (xx0 < xSegMin) {
++ xx0 = xSegMin;
++ } else if (xx0 > xSegMax) {
++ xx0 = xSegMax;
++ }
++ if (xx1 < xSegMin) {
++ xx1 = xSegMin;
++ } else if (xx1 > xSegMax) {
++ xx1 = xSegMax;
+ }
+ }
+ if (xx0 < xx1) {
+diff -Nur poppler.0_5_0/TODO poppler.HEAD/TODO
+--- poppler.0_5_0/TODO 2005-04-05 04:49:18.000000000 +0200
++++ poppler.HEAD/TODO 2006-01-21 22:56:40.000000000 +0100
+@@ -42,3 +42,13 @@
+
+ [ This will go away again once we get the wrappers done. ]
+
++Jeff Muizelaar's TODO:
++ Short Term:
++ - factor out some of the color conversion code from CairoOutputDev and ArthurOutputDev.
++ - add CairoOutputDev::drawSoftMaskedImage. (done, but too messy)
++ - fix CairoOutputDev asking cairo to draw nonexistant glyphs.
++ - fix patterned text fills.
++ - merge kpdf's ttc support code.
++ Long Term:
++ - use cairo glyph cache for type3 fonts.
++ - try to use cairo pattern support.
+diff -Nur poppler.0_5_0/utils/HtmlOutputDev.cc poppler.HEAD/utils/HtmlOutputDev.cc
+--- poppler.0_5_0/utils/HtmlOutputDev.cc 2005-12-30 22:59:58.000000000 +0100
++++ poppler.HEAD/utils/HtmlOutputDev.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -14,6 +14,7 @@
+ #pragma implementation
+ #endif
+
++#include "config.h"
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stdarg.h>
+@@ -24,7 +25,6 @@
+ #include "goo/GooList.h"
+ #include "UnicodeMap.h"
+ #include "goo/gmem.h"
+-#include "config.h"
+ #include "Error.h"
+ #include "GfxState.h"
+ #ifdef ENABLE_LIBJPEG
+@@ -33,6 +33,7 @@
+ #include "GlobalParams.h"
+ #include "HtmlOutputDev.h"
+ #include "HtmlFonts.h"
++#include "UGooString.h"
+
+ int HtmlPage::pgNum=0;
+ int HtmlOutputDev::imgNum=1;
+diff -Nur poppler.0_5_0/utils/ImageOutputDev.cc poppler.HEAD/utils/ImageOutputDev.cc
+--- poppler.0_5_0/utils/ImageOutputDev.cc 2005-12-30 22:59:58.000000000 +0100
++++ poppler.HEAD/utils/ImageOutputDev.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -6,6 +6,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+
+ #ifdef USE_GCC_PRAGMAS
+@@ -17,7 +18,6 @@
+ #include <stddef.h>
+ #include <ctype.h>
+ #include "goo/gmem.h"
+-#include "config.h"
+ #include "Error.h"
+ #include "GfxState.h"
+ #include "Object.h"
+diff -Nur poppler.0_5_0/utils/Makefile.am poppler.HEAD/utils/Makefile.am
+--- poppler.0_5_0/utils/Makefile.am 2006-01-06 11:05:59.000000000 +0100
++++ poppler.HEAD/utils/Makefile.am 2006-02-23 23:26:05.000000000 +0100
+@@ -13,7 +13,10 @@
+ pdfinfo \
+ pdftops \
+ pdftotext \
+- pdftohtml
++ pdftohtml \
++ $(pdftoppm_binary)
++
++EXTRA_DIST = pdf2xml.dtd
+
+ dist_man1_MANS = \
+ pdffonts.1 \
+@@ -21,7 +24,9 @@
+ pdfinfo.1 \
+ pdftops.1 \
+ pdftotext.1 \
+- pdftohtml.1
++ pdftohtml.1 \
++ $(pdftoppm_manpage)
++
+
+ common = parseargs.c parseargs.h
+
+@@ -56,3 +61,15 @@
+ HtmlOutputDev.cc \
+ HtmlOutputDev.h \
+ $(common)
++
++if BUILD_SPLASH_OUTPUT
++
++pdftoppm_SOURCES = \
++ pdftoppm.cc \
++ $(common)
++
++pdftoppm_binary = pdftoppm
++
++pdftoppm_manpage =pdftoppm.1
++
++endif
+\ No hi ha cap caràcter de salt de línia al final del fitxer
+diff -Nur poppler.0_5_0/utils/pdf2xml.dtd poppler.HEAD/utils/pdf2xml.dtd
+--- poppler.0_5_0/utils/pdf2xml.dtd 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/utils/pdf2xml.dtd 2006-02-04 21:31:00.000000000 +0100
+@@ -0,0 +1,28 @@
++<?xml version="1.0"?>
++<!ELEMENT pdf2xml (page+)>
++<!ELEMENT page (fontspec*, text*)>
++<!ATTLIST page
++ number CDATA #REQUIRED
++ position CDATA #REQUIRED
++ top CDATA #REQUIRED
++ left CDATA #REQUIRED
++ height CDATA #REQUIRED
++ width CDATA #REQUIRED
++>
++<!ELEMENT fontspec EMPTY>
++<!ATTLIST fontspec
++ id CDATA #REQUIRED
++ size CDATA #REQUIRED
++ family CDATA #REQUIRED
++ color CDATA #REQUIRED
++>
++<!ELEMENT text (#PCDATA | b | i)*>
++<!ATTLIST text
++ top CDATA #REQUIRED
++ left CDATA #REQUIRED
++ width CDATA #REQUIRED
++ height CDATA #REQUIRED
++ font CDATA #REQUIRED
++>
++<!ELEMENT b (#PCDATA)>
++<!ELEMENT i (#PCDATA)>
+diff -Nur poppler.0_5_0/utils/pdffonts.cc poppler.HEAD/utils/pdffonts.cc
+--- poppler.0_5_0/utils/pdffonts.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdffonts.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -6,6 +6,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -22,7 +23,7 @@
+ #include "GfxFont.h"
+ #include "Annot.h"
+ #include "PDFDoc.h"
+-#include "config.h"
++#include "UGooString.h"
+
+ static char *fontTypeNames[] = {
+ "unknown",
+diff -Nur poppler.0_5_0/utils/pdfimages.cc poppler.HEAD/utils/pdfimages.cc
+--- poppler.0_5_0/utils/pdfimages.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdfimages.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -8,6 +8,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -27,7 +28,6 @@
+ #include "PDFDoc.h"
+ #include "ImageOutputDev.h"
+ #include "Error.h"
+-#include "config.h"
+
+ static int firstPage = 1;
+ static int lastPage = 0;
+diff -Nur poppler.0_5_0/utils/pdfinfo.cc poppler.HEAD/utils/pdfinfo.cc
+--- poppler.0_5_0/utils/pdfinfo.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdfinfo.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -6,6 +6,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -28,7 +29,7 @@
+ #include "CharTypes.h"
+ #include "UnicodeMap.h"
+ #include "Error.h"
+-#include "config.h"
++#include "UGooString.h"
+
+ static void printInfoString(Dict *infoDict, char *key, char *text,
+ UnicodeMap *uMap);
+diff -Nur poppler.0_5_0/utils/pdftohtml.cc poppler.HEAD/utils/pdftohtml.cc
+--- poppler.0_5_0/utils/pdftohtml.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdftohtml.cc 2006-01-23 19:52:48.000000000 +0100
+@@ -6,12 +6,13 @@
+ // Copyright 1999-2000 G. Ovtcharov
+ //========================================================================
+
++#include "config.h"
++#include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stddef.h>
+ #include <string.h>
+ #include <dirent.h>
+-#include <poppler-config.h>
+ #include <time.h>
+ #include "parseargs.h"
+ #include "goo/GooString.h"
+@@ -28,7 +29,7 @@
+ #include "PSOutputDev.h"
+ #include "GlobalParams.h"
+ #include "Error.h"
+-#include "config.h"
++#include "UGooString.h"
+ #include "goo/gfile.h"
+
+ #ifndef GHOSTSCRIPT
+@@ -315,12 +316,10 @@
+ psFileName = new GooString(htmlFileName->getCString());
+ psFileName->append(".ps");
+
+- globalParams->setPSPaperWidth(w);
+- globalParams->setPSPaperHeight(h);
+ // XXX
+ // globalParams->setPSNoText(gTrue);
+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
+- doc->getCatalog(), firstPage, lastPage, psModePS);
++ doc->getCatalog(), firstPage, lastPage, psModePS, w, h);
+ doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0,
+ gTrue, gFalse, gFalse);
+ delete psOut;
+diff -Nur poppler.0_5_0/utils/pdftoppm.1 poppler.HEAD/utils/pdftoppm.1
+--- poppler.0_5_0/utils/pdftoppm.1 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/utils/pdftoppm.1 2005-12-12 21:15:11.000000000 +0100
+@@ -0,0 +1,113 @@
++.\" Copyright 2004 Glyph & Cog, LLC
++.TH pdftoppm 1 "22 January 2004"
++.SH NAME
++pdftoppm \- Portable Document Format (PDF) to Portable Pixmap (PPM)
++converter (version 3.00)
++.SH SYNOPSIS
++.B pdftoppm
++[options]
++.I PDF-file PPM-root
++.SH DESCRIPTION
++.B Pdftoppm
++converts Portable Document Format (PDF) files to color image files in
++Portable Pixmap (PPM) format, grayscale image files in Portable
++Graymap (PGM) format, or monochrome image files in Portable Bitmap
++(PBM) format.
++.PP
++Pdftoppm reads the PDF file,
++.IR PDF-file ,
++and writes one PPM file for each page,
++.IR PPM-root - nnnnnn .ppm,
++where
++.I nnnnnn
++is the page number.
++.SH CONFIGURATION FILE
++Pdftoppm reads a configuration file at startup. It first tries to
++find the user's private config file, ~/.xpdfrc. If that doesn't
++exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the
++.BR xpdfrc (5)
++man page for details.
++.SH OPTIONS
++Many of the following options can be set with configuration file
++commands. These are listed in square brackets with the description of
++the corresponding command line option.
++.TP
++.BI \-f " number"
++Specifies the first page to convert.
++.TP
++.BI \-l " number"
++Specifies the last page to convert.
++.TP
++.BI \-r " number"
++Specifies the resolution, in DPI. The default is 150 DPI.
++.TP
++.B \-mono
++Generate a monochrome PBM file (instead of a color PPM file).
++.TP
++.B \-gray
++Generate a grayscale PGM file (instead of a color PPM file).
++.TP
++.BI \-t1lib " yes | no"
++Enable or disable t1lib (a Type 1 font rasterizer). This defaults to
++"yes".
++.RB "[config file: " enableT1lib ]
++.TP
++.BI \-freetype " yes | no"
++Enable or disable FreeType (a TrueType / Type 1 font rasterizer).
++This defaults to "yes".
++.RB "[config file: " enableFreeType ]
++.TP
++.BI \-aa " yes | no"
++Enable or disable font anti-aliasing. This defaults to "yes".
++.RB "[config file: " antialias ]
++.TP
++.BI \-opw " password"
++Specify the owner password for the PDF file. Providing this will
++bypass all security restrictions.
++.TP
++.BI \-upw " password"
++Specify the user password for the PDF file.
++.TP
++.B \-q
++Don't print any messages or errors.
++.RB "[config file: " errQuiet ]
++.TP
++.B \-v
++Print copyright and version information.
++.TP
++.B \-h
++Print usage information.
++.RB ( \-help
++and
++.B \-\-help
++are equivalent.)
++.SH EXIT CODES
++The Xpdf tools use the following exit codes:
++.TP
++0
++No error.
++.TP
++1
++Error opening a PDF file.
++.TP
++2
++Error opening an output file.
++.TP
++3
++Error related to PDF permissions.
++.TP
++99
++Other error.
++.SH AUTHOR
++The pdftoppm software and documentation are copyright 1996-2004 Glyph
++& Cog, LLC.
++.SH "SEE ALSO"
++.BR xpdf (1),
++.BR pdftops (1),
++.BR pdftotext (1),
++.BR pdfinfo (1),
++.BR pdffonts (1),
++.BR pdfimages (1),
++.BR xpdfrc (5)
++.br
++.B http://www.foolabs.com/xpdf/
+diff -Nur poppler.0_5_0/utils/pdftoppm.cc poppler.HEAD/utils/pdftoppm.cc
+--- poppler.0_5_0/utils/pdftoppm.cc 1970-01-01 01:00:00.000000000 +0100
++++ poppler.HEAD/utils/pdftoppm.cc 2006-02-04 21:07:08.000000000 +0100
+@@ -0,0 +1,190 @@
++//========================================================================
++//
++// pdftoppm.cc
++//
++// Copyright 2003 Glyph & Cog, LLC
++//
++//========================================================================
++
++#include "config.h"
++#include <poppler-config.h>
++#include <stdio.h>
++#include "parseargs.h"
++#include "goo/gmem.h"
++#include "goo/GooString.h"
++#include "GlobalParams.h"
++#include "Object.h"
++#include "PDFDoc.h"
++#include "splash/SplashBitmap.h"
++#include "splash/Splash.h"
++#include "SplashOutputDev.h"
++
++static int firstPage = 1;
++static int lastPage = 0;
++static int resolution = 150;
++static GBool mono = gFalse;
++static GBool gray = gFalse;
++static char enableT1libStr[16] = "";
++static char enableFreeTypeStr[16] = "";
++static char antialiasStr[16] = "";
++static char ownerPassword[33] = "";
++static char userPassword[33] = "";
++static GBool quiet = gFalse;
++static char cfgFileName[256] = "";
++static GBool printVersion = gFalse;
++static GBool printHelp = gFalse;
++
++static ArgDesc argDesc[] = {
++ {"-f", argInt, &firstPage, 0,
++ "first page to print"},
++ {"-l", argInt, &lastPage, 0,
++ "last page to print"},
++ {"-r", argInt, &resolution, 0,
++ "resolution, in DPI (default is 150)"},
++ {"-mono", argFlag, &mono, 0,
++ "generate a monochrome PBM file"},
++ {"-gray", argFlag, &gray, 0,
++ "generate a grayscale PGM file"},
++#if HAVE_T1LIB_H
++ {"-t1lib", argString, enableT1libStr, sizeof(enableT1libStr),
++ "enable t1lib font rasterizer: yes, no"},
++#endif
++#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H
++ {"-freetype", argString, enableFreeTypeStr, sizeof(enableFreeTypeStr),
++ "enable FreeType font rasterizer: yes, no"},
++#endif
++ {"-aa", argString, antialiasStr, sizeof(antialiasStr),
++ "enable font anti-aliasing: yes, no"},
++ {"-opw", argString, ownerPassword, sizeof(ownerPassword),
++ "owner password (for encrypted files)"},
++ {"-upw", argString, userPassword, sizeof(userPassword),
++ "user password (for encrypted files)"},
++ {"-q", argFlag, &quiet, 0,
++ "don't print any messages or errors"},
++ {"-cfg", argString, cfgFileName, sizeof(cfgFileName),
++ "configuration file to use in place of .xpdfrc"},
++ {"-v", argFlag, &printVersion, 0,
++ "print copyright and version info"},
++ {"-h", argFlag, &printHelp, 0,
++ "print usage information"},
++ {"-help", argFlag, &printHelp, 0,
++ "print usage information"},
++ {"--help", argFlag, &printHelp, 0,
++ "print usage information"},
++ {"-?", argFlag, &printHelp, 0,
++ "print usage information"},
++ {NULL}
++};
++
++int main(int argc, char *argv[]) {
++ PDFDoc *doc;
++ GooString *fileName;
++ char *ppmRoot;
++ char ppmFile[512];
++ GooString *ownerPW, *userPW;
++ SplashColor paperColor;
++ SplashOutputDev *splashOut;
++ GBool ok;
++ int exitCode;
++ int pg;
++
++ exitCode = 99;
++
++ // parse args
++ ok = parseArgs(argDesc, &argc, argv);
++ if (mono && gray) {
++ ok = gFalse;
++ }
++ if (!ok || argc != 3 || printVersion || printHelp) {
++ fprintf(stderr, "pdftoppm version %s\n", xpdfVersion);
++ fprintf(stderr, "%s\n", xpdfCopyright);
++ if (!printVersion) {
++ printUsage("pdftoppm", "<PDF-file> <PPM-root>", argDesc);
++ }
++ goto err0;
++ }
++ fileName = new GooString(argv[1]);
++ ppmRoot = argv[2];
++
++ // read config file
++ globalParams = new GlobalParams(cfgFileName);
++ if (enableT1libStr[0]) {
++ if (!globalParams->setEnableT1lib(enableT1libStr)) {
++ fprintf(stderr, "Bad '-t1lib' value on command line\n");
++ }
++ }
++ if (enableFreeTypeStr[0]) {
++ if (!globalParams->setEnableFreeType(enableFreeTypeStr)) {
++ fprintf(stderr, "Bad '-freetype' value on command line\n");
++ }
++ }
++ if (antialiasStr[0]) {
++ if (!globalParams->setAntialias(antialiasStr)) {
++ fprintf(stderr, "Bad '-aa' value on command line\n");
++ }
++ }
++ if (quiet) {
++ globalParams->setErrQuiet(quiet);
++ }
++
++ // open PDF file
++ if (ownerPassword[0]) {
++ ownerPW = new GooString(ownerPassword);
++ } else {
++ ownerPW = NULL;
++ }
++ if (userPassword[0]) {
++ userPW = new GooString(userPassword);
++ } else {
++ userPW = NULL;
++ }
++ doc = new PDFDoc(fileName, ownerPW, userPW);
++ if (userPW) {
++ delete userPW;
++ }
++ if (ownerPW) {
++ delete ownerPW;
++ }
++ if (!doc->isOk()) {
++ exitCode = 1;
++ goto err1;
++ }
++
++ // get page range
++ if (firstPage < 1)
++ firstPage = 1;
++ if (lastPage < 1 || lastPage > doc->getNumPages())
++ lastPage = doc->getNumPages();
++
++ // write PPM files
++ paperColor[0] = 255;
++ paperColor[1] = 255;
++ paperColor[2] = 255;
++ splashOut = new SplashOutputDev(mono ? splashModeMono1 :
++ gray ? splashModeMono8 :
++ splashModeRGB8, 4,
++ gFalse, paperColor);
++ splashOut->startDoc(doc->getXRef());
++ for (pg = firstPage; pg <= lastPage; ++pg) {
++ doc->displayPage(splashOut, pg, resolution, resolution, 0, gTrue, gFalse, gFalse);
++ sprintf(ppmFile, "%.*s-%06d.%s",
++ (int)sizeof(ppmFile) - 32, ppmRoot, pg,
++ mono ? "pbm" : gray ? "pgm" : "ppm");
++ splashOut->getBitmap()->writePNMFile(ppmFile);
++ }
++ delete splashOut;
++
++ exitCode = 0;
++
++ // clean up
++ err1:
++ delete doc;
++ delete globalParams;
++ err0:
++
++ // check for memory leaks
++ Object::memCheck(stderr);
++ gMemReport(stderr);
++
++ return exitCode;
++}
+diff -Nur poppler.0_5_0/utils/pdftops.cc poppler.HEAD/utils/pdftops.cc
+--- poppler.0_5_0/utils/pdftops.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdftops.cc 2006-01-23 19:52:48.000000000 +0100
+@@ -8,6 +8,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -27,7 +28,6 @@
+ #include "PDFDoc.h"
+ #include "PSOutputDev.h"
+ #include "Error.h"
+-#include "config.h"
+
+ static int firstPage = 1;
+ static int lastPage = 0;
+@@ -307,7 +307,9 @@
+
+ // write PostScript file
+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
+- doc->getCatalog(), firstPage, lastPage, mode);
++ doc->getCatalog(), firstPage, lastPage, mode,
++ globalParams->getPSPaperWidth(),
++ globalParams->getPSPaperHeight());
+ if (psOut->isOk()) {
+ doc->displayPages(psOut, firstPage, lastPage, 72, 72,
+ 0, globalParams->getPSCrop(), gFalse, gFalse);
+diff -Nur poppler.0_5_0/utils/pdftotext.cc poppler.HEAD/utils/pdftotext.cc
+--- poppler.0_5_0/utils/pdftotext.cc 2005-12-12 21:15:11.000000000 +0100
++++ poppler.HEAD/utils/pdftotext.cc 2006-01-23 16:40:54.000000000 +0100
+@@ -8,6 +8,7 @@
+ //
+ //========================================================================
+
++#include "config.h"
+ #include <poppler-config.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -29,7 +30,7 @@
+ #include "CharTypes.h"
+ #include "UnicodeMap.h"
+ #include "Error.h"
+-#include "config.h"
++#include "UGooString.h"
+
+ static void printInfoString(FILE *f, Dict *infoDict, char *key,
+ char *text1, char *text2, UnicodeMap *uMap);