]> git.pld-linux.org Git - packages/poppler0.61.git/commitdiff
- update 0.5.0 to head
authorsparky <sparky@pld-linux.org>
Fri, 24 Feb 2006 21:41:22 +0000 (21:41 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    poppler-cvs.patch -> 1.1

poppler-cvs.patch [new file with mode: 0644]

diff --git a/poppler-cvs.patch b/poppler-cvs.patch
new file mode 100644 (file)
index 0000000..90219e4
--- /dev/null
@@ -0,0 +1,7095 @@
+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", &paramDict );
++              if (paramDict.isDict()) {
++                  paramDict.dictLookup("ModDate", &paramObj);
++                  if (paramObj.isString()) {
++                      delete modDate;
++                      modDate = new GooString(paramObj.getString());
++                  }
++                  paramObj.free();
++                  paramDict.dictLookup("CreationDate", &paramObj);
++                  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 &params);
+-  
++
++  /** \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);
This page took 0.585425 seconds and 4 git commands to generate.