[poppler] Branch 'xpdf303merge' - cpp/poppler-page-renderer.cpp glib/poppler-document.cc glib/poppler-page.cc poppler/CairoFontEngine.cc poppler/CairoFontEngine.h poppler/CairoOutputDev.cc poppler/CairoOutputDev.h poppler/Catalog.cc poppler/Catalog.h poppler/Gfx.cc poppler/Gfx.h poppler/Page.cc poppler/Page.h poppler/PDFDoc.cc poppler/PreScanOutputDev.cc poppler/PreScanOutputDev.h poppler/PSOutputDev.cc poppler/PSOutputDev.h poppler/SplashOutputDev.cc poppler/SplashOutputDev.h qt4/src test/gtk-test.cc test/pdf-inspector.cc test/perf-test.cc utils/pdftocairo.cc utils/pdftohtml.cc utils/pdftoppm.cc utils/pdftops.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Thu Sep 1 06:44:42 PDT 2011


 cpp/poppler-page-renderer.cpp   |    2 +-
 glib/poppler-document.cc        |    2 +-
 glib/poppler-page.cc            |    2 --
 poppler/CairoFontEngine.cc      |   28 ++++++++++++----------------
 poppler/CairoFontEngine.h       |   13 ++++++-------
 poppler/CairoOutputDev.cc       |   12 +++++-------
 poppler/CairoOutputDev.h        |    6 +++---
 poppler/Catalog.cc              |    8 +++++---
 poppler/Catalog.h               |    4 +++-
 poppler/Gfx.cc                  |   15 +++++++++------
 poppler/Gfx.h                   |    6 ++++--
 poppler/PDFDoc.cc               |    6 +++---
 poppler/PSOutputDev.cc          |   29 +++++++++++++++--------------
 poppler/PSOutputDev.h           |    9 ++++-----
 poppler/Page.cc                 |    8 +++++---
 poppler/Page.h                  |    4 +++-
 poppler/PreScanOutputDev.cc     |    6 +++---
 poppler/PreScanOutputDev.h      |    4 ++--
 poppler/SplashOutputDev.cc      |   13 +++++++------
 poppler/SplashOutputDev.h       |    5 +++--
 qt4/src/poppler-private.h       |    2 +-
 qt4/src/poppler-ps-converter.cc |    2 --
 test/gtk-test.cc                |    2 +-
 test/pdf-inspector.cc           |    2 +-
 test/perf-test.cc               |    2 +-
 utils/pdftocairo.cc             |    2 +-
 utils/pdftohtml.cc              |    6 +++---
 utils/pdftoppm.cc               |    2 +-
 utils/pdftops.cc                |    4 ++--
 29 files changed, 105 insertions(+), 101 deletions(-)

New commits:
commit 7d794f6411499fb8f26778bf2b54cb9734d004af
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Sep 1 15:47:32 2011 +0200

    xpdf303: API rework, Gfx wants a PDFDoc instead of an XRef

diff --git a/cpp/poppler-page-renderer.cpp b/cpp/poppler-page-renderer.cpp
index 5e07954..1317192 100644
--- a/cpp/poppler-page-renderer.cpp
+++ b/cpp/poppler-page-renderer.cpp
@@ -175,7 +175,7 @@ image page_renderer::render_page(const page *p,
     SplashOutputDev splashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, text_AA);
     splashOutputDev.setVectorAntialias(d->hints & antialiasing ? gTrue : gFalse);
     splashOutputDev.setFreeTypeHinting(d->hints & text_hinting ? gTrue : gFalse, gFalse);
-    splashOutputDev.startDoc(pdfdoc->getXRef());
+    splashOutputDev.startDoc(pdfdoc);
     pdfdoc->displayPageSlice(&splashOutputDev, pp->index + 1,
                              xres, yres, int(rotate) * 90,
                              gFalse, gTrue, gFalse,
diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 745bc9b..346b646 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -127,7 +127,7 @@ _poppler_document_new_from_pdfdoc (PDFDoc  *newDoc,
   document->doc = newDoc;
 
   document->output_dev = new CairoOutputDev ();
-  document->output_dev->startDoc(document->doc->getXRef (), document->doc->getCatalog ());
+  document->output_dev->startDoc(document->doc);
 
   return document;
 }
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index 9850d44..d8722fb 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -1063,8 +1063,6 @@ poppler_page_render_to_ps (PopplerPage   *page,
   if (!ps_file->out)
     ps_file->out = new PSOutputDev (ps_file->filename,
                                     ps_file->document->doc,
-                                    ps_file->document->doc->getXRef(),
-                                    ps_file->document->doc->getCatalog(),
                                     NULL,
                                     ps_file->first_page, ps_file->last_page,
                                     psModePS, (int)ps_file->paper_width,
diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
index 90407fa..889b073 100644
--- a/poppler/CairoFontEngine.cc
+++ b/poppler/CairoFontEngine.cc
@@ -565,8 +565,7 @@ static const cairo_user_data_key_t type3_font_key = {0};
 
 typedef struct _type3_font_info {
   GfxFont *font;
-  XRef *xref;
-  Catalog *catalog;
+  PDFDoc *doc;
   CairoFontEngine *fontEngine;
   GBool printing;
 } type3_font_info_t;
@@ -631,8 +630,8 @@ _render_type3_glyph (cairo_scaled_font_t  *scaled_font,
   box.y1 = mat[1];
   box.x2 = mat[2];
   box.y2 = mat[3];
-  gfx = new Gfx(info->xref, output_dev, resDict, info->catalog, &box, NULL);
-  output_dev->startDoc(info->xref, info->catalog, info->fontEngine);
+  gfx = new Gfx(info->doc, output_dev, resDict, &box, NULL);
+  output_dev->startDoc(info->doc, info->fontEngine);
   output_dev->startPage (1, gfx->getState());
   output_dev->setInType3Char(gTrue);
   gfx->display(charProcs->getVal(glyph, &charProc));
@@ -660,8 +659,8 @@ _render_type3_glyph (cairo_scaled_font_t  *scaled_font,
 }
 
 
-CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, XRef *xref,
-				       Catalog *catalog, CairoFontEngine *fontEngine,
+CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, PDFDoc *doc,
+				       CairoFontEngine *fontEngine,
 				       GBool printing) {
   Object refObj, strObj;
   type3_font_info_t *info;
@@ -681,8 +680,7 @@ CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, XRef *xref,
   cairo_user_font_face_set_render_glyph_func (font_face, _render_type3_glyph);
   gfxFont->incRefCnt();
   info->font = gfxFont;
-  info->xref = xref;
-  info->catalog = catalog;
+  info->doc = doc;
   info->fontEngine = fontEngine;
   info->printing = printing;
 
@@ -702,12 +700,11 @@ CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, XRef *xref,
     }
   }
 
-  return new CairoType3Font(ref, xref, catalog, font_face, codeToGID, codeToGIDLen, printing);
+  return new CairoType3Font(ref, doc, font_face, codeToGID, codeToGIDLen, printing);
 }
 
 CairoType3Font::CairoType3Font(Ref ref,
-			       XRef *xref,
-			       Catalog *catalog,
+			       PDFDoc *doc,
 			       cairo_font_face_t *cairo_font_face,
 			       int *codeToGID,
 			       Guint codeToGIDLen,
@@ -717,8 +714,7 @@ CairoType3Font::CairoType3Font(Ref ref,
 							   codeToGIDLen,
 							   gFalse,
 							   printing),
-						 xref(xref),
-						 catalog(catalog) { }
+						 doc(doc) { }
 
 CairoType3Font::~CairoType3Font() { }
 
@@ -757,7 +753,7 @@ CairoFontEngine::~CairoFontEngine() {
 }
 
 CairoFont *
-CairoFontEngine::getFont(GfxFont *gfxFont, XRef *xref, Catalog *catalog, GBool printing) {
+CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing) {
   int i, j;
   Ref ref;
   CairoFont *font;
@@ -778,9 +774,9 @@ CairoFontEngine::getFont(GfxFont *gfxFont, XRef *xref, Catalog *catalog, GBool p
   
   fontType = gfxFont->getType();
   if (fontType == fontType3)
-    font = CairoType3Font::create (gfxFont, xref, catalog, this, printing);
+    font = CairoType3Font::create (gfxFont, doc, this, printing);
   else
-    font = CairoFreeTypeFont::create (gfxFont, xref, lib, useCIDs);
+    font = CairoFreeTypeFont::create (gfxFont, doc->getXRef(), lib, useCIDs);
 
   //XXX: if font is null should we still insert it into the cache?
   if (fontCache[cairoFontCacheSize - 1]) {
diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h
index 74e9aad..6335348 100644
--- a/poppler/CairoFontEngine.h
+++ b/poppler/CairoFontEngine.h
@@ -36,7 +36,7 @@
 #include <cairo-ft.h>
 
 #include "GfxFont.h"
-#include "Catalog.h"
+#include "PDFDoc.h"
 
 class CairoFontEngine;
 
@@ -83,20 +83,19 @@ private:
 
 class CairoType3Font : public CairoFont {
 public:
-  static CairoType3Font *create(GfxFont *gfxFont, XRef *xref,
-				Catalog *catalog, CairoFontEngine *fontEngine,
+  static CairoType3Font *create(GfxFont *gfxFont, PDFDoc *doc,
+				CairoFontEngine *fontEngine,
 				GBool printing);
   virtual ~CairoType3Font();
 
   virtual GBool matches(Ref &other, GBool printing);
 
 private:
-  CairoType3Font(Ref ref, XRef *xref, Catalog *catalog,
+  CairoType3Font(Ref ref, PDFDoc *doc,
 		 cairo_font_face_t *cairo_font_face,
 		 int *codeToGID, Guint codeToGIDLen,
 		 GBool printing);
-  XRef *xref;
-  Catalog *catalog;
+  PDFDoc *doc;
 };
 
 //------------------------------------------------------------------------
@@ -114,7 +113,7 @@ public:
   CairoFontEngine(FT_Library libA);
   ~CairoFontEngine();
 
-  CairoFont *getFont(GfxFont *gfxFont, XRef *xref, Catalog *catalog, GBool printing);
+  CairoFont *getFont(GfxFont *gfxFont, PDFDoc *doc, GBool printing);
 
 private:
   CairoFont *fontCache[cairoFontCacheSize];
diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
index 00a0a5b..ba29f0b 100644
--- a/poppler/CairoOutputDev.cc
+++ b/poppler/CairoOutputDev.cc
@@ -115,8 +115,7 @@ FT_Library CairoOutputDev::ft_lib;
 GBool CairoOutputDev::ft_lib_initialized = gFalse;
 
 CairoOutputDev::CairoOutputDev() {
-  xref = NULL;
-  catalog = NULL;
+  doc = NULL;
 
   if (!ft_lib_initialized) {
     FT_Init_FreeType(&ft_lib);
@@ -219,10 +218,9 @@ void CairoOutputDev::setTextPage(TextPage *text)
   }
 }
 
-void CairoOutputDev::startDoc(XRef *xrefA, Catalog *catalogA,
+void CairoOutputDev::startDoc(PDFDoc *docA,
 			      CairoFontEngine *parentFontEngine) {
-  xref = xrefA;
-  catalog = catalogA;
+  doc = docA;
   if (parentFontEngine) {
     fontEngine = parentFontEngine;
   } else {
@@ -595,7 +593,7 @@ void CairoOutputDev::updateFont(GfxState *state) {
   if (text)
     text->updateFont(state);
   
-  currentFont = fontEngine->getFont (state->getFont(), xref, catalog, printing);
+  currentFont = fontEngine->getFont (state->getFont(), doc, printing);
 
   if (!currentFont)
     return;
@@ -794,7 +792,7 @@ GBool CairoOutputDev::tilingPatternFill(GfxState *state, Catalog *cat, Object *s
   box.x2 = bbox[2]; box.y2 = bbox[3];
   strokePathTmp = strokePathClip;
   strokePathClip = NULL;
-  gfx = new Gfx(xref, this, resDict, catalog, &box, NULL);
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
   gfx->display(str);
   delete gfx;
   strokePathClip = strokePathTmp;
diff --git a/poppler/CairoOutputDev.h b/poppler/CairoOutputDev.h
index effa9dd..722ce97 100644
--- a/poppler/CairoOutputDev.h
+++ b/poppler/CairoOutputDev.h
@@ -40,6 +40,7 @@
 #include "TextOutputDev.h"
 #include "GfxState.h"
 
+class PDFDoc;
 class GfxState;
 class GfxPath;
 class Gfx8BitFont;
@@ -259,7 +260,7 @@ public:
   //----- special access
   
   // Called to indicate that a new PDF document has been loaded.
-  void startDoc(XRef *xrefA, Catalog *catalogA, CairoFontEngine *fontEngine = NULL);
+  void startDoc(PDFDoc *docA, CairoFontEngine *fontEngine = NULL);
  
   GBool isReverseVideo() { return gFalse; }
   
@@ -305,8 +306,7 @@ protected:
     double miter;
   } *strokePathClip;
 
-  XRef *xref;			// xref table for current document
-  Catalog *catalog;
+  PDFDoc *doc;			// the current document
 
   static FT_Library ft_lib;
   static GBool ft_lib_initialized;
diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc
index c6c77eb..fd418b0 100644
--- a/poppler/Catalog.cc
+++ b/poppler/Catalog.cc
@@ -40,6 +40,7 @@
 #include <stdlib.h>
 #include "goo/gmem.h"
 #include "Object.h"
+#include "PDFDoc.h"
 #include "XRef.h"
 #include "Array.h"
 #include "Dict.h"
@@ -57,13 +58,14 @@
 // Catalog
 //------------------------------------------------------------------------
 
-Catalog::Catalog(XRef *xrefA) {
+Catalog::Catalog(PDFDoc *docA) {
   Object catDict, pagesDict, pagesDictRef;
   Object obj, obj2;
   Object optContentProps;
 
   ok = gTrue;
-  xref = xrefA;
+  doc = docA;
+  xref = doc->getXRef();
   pages = NULL;
   pageRefs = NULL;
   numPages = -1;
@@ -355,7 +357,7 @@ GBool Catalog::cachePageTree(int page)
     kids.free();
     if (kid.isDict("Page") || (kid.isDict() && !kid.getDict()->hasKey("Kids"))) {
       PageAttrs *attrs = new PageAttrs(attrsList->back(), kid.getDict());
-      Page *p = new Page(xref, lastCachedPage+1, kid.getDict(),
+      Page *p = new Page(doc, lastCachedPage+1, kid.getDict(),
                      kidRef.getRef(), attrs, form);
       if (!p->isOk()) {
         error(errSyntaxError, -1, "Failed to create page (page {0:d})", lastCachedPage+1);
diff --git a/poppler/Catalog.h b/poppler/Catalog.h
index 41be3b6..cdb1f13 100644
--- a/poppler/Catalog.h
+++ b/poppler/Catalog.h
@@ -37,6 +37,7 @@
 
 #include <vector>
 
+class PDFDoc;
 class XRef;
 class Object;
 class Page;
@@ -93,7 +94,7 @@ class Catalog {
 public:
 
   // Constructor.
-  Catalog(XRef *xrefA);
+  Catalog(PDFDoc *docA);
 
   // Destructor.
   ~Catalog();
@@ -185,6 +186,7 @@ private:
   // Get page label info.
   PageLabelInfo *getPageLabelInfo();
 
+  PDFDoc *doc;
   XRef *xref;			// the xref table for this PDF file
   Page **pages;			// array of pages
   Ref *pageRefs;		// object ID for each page
diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
index 23fe930..11c86c9 100644
--- a/poppler/Gfx.cc
+++ b/poppler/Gfx.cc
@@ -56,6 +56,7 @@
 #include "GlobalParams.h"
 #include "CharTypes.h"
 #include "Object.h"
+#include "PDFDoc.h"
 #include "Array.h"
 #include "Dict.h"
 #include "Stream.h"
@@ -525,7 +526,7 @@ GBool GfxResources::lookupGStateNF(char *name, Object *obj) {
 // Gfx
 //------------------------------------------------------------------------
 
-Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, Catalog *catalogA,
+Gfx::Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict,
 	 double hDPI, double vDPI, PDFRectangle *box,
 	 PDFRectangle *cropBox, int rotate,
 	 GBool (*abortCheckCbkA)(void *data),
@@ -536,8 +537,9 @@ Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, Catalog *cata
 {
   int i;
 
-  xref = xrefA;
-  catalog = catalogA;
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
   subPage = gFalse;
   printCommands = globalParams->getPrintCommands();
   profileCommands = globalParams->getProfileCommands();
@@ -581,7 +583,7 @@ Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, Catalog *cata
   }
 }
 
-Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, Catalog *catalogA,
+Gfx::Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict,
 	 PDFRectangle *box, PDFRectangle *cropBox,
 	 GBool (*abortCheckCbkA)(void *data),
 	 void *abortCheckCbkDataA)
@@ -591,8 +593,9 @@ Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, Catalog *catalogA,
 {
   int i;
 
-  xref = xrefA;
-  catalog = catalogA;
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
   subPage = gTrue;
   printCommands = globalParams->getPrintCommands();
   profileCommands = globalParams->getProfileCommands();
diff --git a/poppler/Gfx.h b/poppler/Gfx.h
index 9cca8bd..2db341b 100644
--- a/poppler/Gfx.h
+++ b/poppler/Gfx.h
@@ -44,6 +44,7 @@
 #include <vector>
 
 class GooString;
+class PDFDoc;
 class XRef;
 class Array;
 class Stream;
@@ -143,14 +144,14 @@ class Gfx {
 public:
 
   // Constructor for regular output.
-  Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict, Catalog *catalog,
+  Gfx(PDFDoc *docA, OutputDev *outA, int pageNum, Dict *resDict,
       double hDPI, double vDPI, PDFRectangle *box,
       PDFRectangle *cropBox, int rotate,
       GBool (*abortCheckCbkA)(void *data) = NULL,
       void *abortCheckCbkDataA = NULL);
 
   // Constructor for a sub-page object.
-  Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict, Catalog *catalog,
+  Gfx(PDFDoc *docA, OutputDev *outA, Dict *resDict,
       PDFRectangle *box, PDFRectangle *cropBox,
       GBool (*abortCheckCbkA)(void *data) = NULL,
       void *abortCheckCbkDataA = NULL);
@@ -189,6 +190,7 @@ public:
 
 private:
 
+  PDFDoc *doc;
   XRef *xref;			// the xref table for this PDF file
   Catalog *catalog;		// the Catalog for this PDF file  
   OutputDev *out;		// output device
diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc
index 3139ab2..62039ef 100644
--- a/poppler/PDFDoc.cc
+++ b/poppler/PDFDoc.cc
@@ -256,7 +256,7 @@ GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) {
   }
 
   // read catalog
-  catalog = new Catalog(xref);
+  catalog = new Catalog(this);
   if (catalog && !catalog->isOk()) {
     if (!wasReconstructed)
     {
@@ -264,7 +264,7 @@ GBool PDFDoc::setup(GooString *ownerPassword, GooString *userPassword) {
       delete catalog;
       delete xref;
       xref = new XRef(str, 0, 0, NULL, true);
-      catalog = new Catalog(xref);
+      catalog = new Catalog(this);
     }
 
     if (catalog && !catalog->isOk()) {
@@ -1490,7 +1490,7 @@ Page *PDFDoc::parsePage(int page)
   }
   pageDict = obj.getDict();
 
-  p = new Page(xref, page, pageDict, pageRef,
+  p = new Page(this, page, pageDict, pageRef,
                new PageAttrs(NULL, pageDict), catalog->getForm());
   obj.free();
 
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index d8ec295..e64f278 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -994,7 +994,7 @@ static void outputToFile(void *stream, const char *data, int len) {
   fwrite(data, 1, len, (FILE *)stream);
 }
 
-PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, XRef *xrefA, Catalog *catalog,
+PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc,
 			 char *psTitle,
 			 int firstPage, int lastPage, PSOutMode modeA,
 			 int paperWidthA, int paperHeightA, GBool duplexA,
@@ -1055,7 +1055,7 @@ PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, XRef *xrefA, Catalog
   }
 
   init(outputToFile, f, fileTypeA, psTitle,
-       doc, xrefA, catalog, firstPage, lastPage, modeA,
+       doc, firstPage, lastPage, modeA,
        imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA,
        paperWidthA, paperHeightA, duplexA);
 }
@@ -1063,7 +1063,6 @@ PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, XRef *xrefA, Catalog
 PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
 			 char *psTitle,
 			 PDFDoc *doc,
-			 XRef *xrefA, Catalog *catalog,
 			 int firstPage, int lastPage, PSOutMode modeA,
 			 int paperWidthA, int paperHeightA, GBool duplexA,
 			 int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
@@ -1091,17 +1090,18 @@ PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
   forceRasterize = forceRasterizeA;
 
   init(outputFuncA, outputStreamA, psGeneric, psTitle,
-       doc, xrefA, catalog, firstPage, lastPage, modeA,
+       doc, firstPage, lastPage, modeA,
        imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA,
        paperWidthA, paperHeightA, duplexA);
 }
 
 void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA,
-		       PSFileType fileTypeA, char *pstitle, PDFDoc *doc, XRef *xrefA, Catalog *catalog,
+		       PSFileType fileTypeA, char *pstitle, PDFDoc *docA,
 		       int firstPage, int lastPage, PSOutMode modeA,
 		       int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
 		       GBool manualCtrlA, int paperWidthA, int paperHeightA,
 		       GBool duplexA) {
+  Catalog *catalog;
   PDFRectangle *box;
 
   // initialize
@@ -1110,8 +1110,9 @@ void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA,
   outputFunc = outputFuncA;
   outputStream = outputStreamA;
   fileType = fileTypeA;
-  m_catalog = catalog;
-  xref = xrefA;
+  doc = docA;
+  xref = doc->getXRef();
+  catalog = doc->getCatalog();
   level = globalParams->getPSLevel();
   mode = modeA;
   paperWidth = paperWidthA;
@@ -2621,7 +2622,7 @@ void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName,
     box.y1 = m[1];
     box.x2 = m[2];
     box.y2 = m[3];
-    gfx = new Gfx(xref, this, resDict, m_catalog, &box, NULL);
+    gfx = new Gfx(doc, this, resDict, &box, NULL);
     inType3Char = gTrue;
     for (i = 0; i < charProcs->getLength(); ++i) {
       t3Cacheable = gFalse;
@@ -2965,7 +2966,7 @@ void PSOutputDev::setupForm(Ref id, Object *strObj) {
   box.y1 = bbox[1];
   box.x2 = bbox[2];
   box.y2 = bbox[3];
-  gfx = new Gfx(xref, this, resDict, m_catalog, &box, &box);
+  gfx = new Gfx(doc, this, resDict, &box, &box);
   gfx->display(strObj);
   delete gfx;
 
@@ -3004,7 +3005,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
   int compCyan;
 
   if (!forceRasterize) {
-    scan = new PreScanOutputDev(xref);
+    scan = new PreScanOutputDev(doc);
     page->displaySlice(scan, 72, 72, rotateA, useMediaBox, crop,
                      sliceX, sliceY, sliceW, sliceH,
                      printing, catalog, abortCheckCbk, abortCheckCbkData);
@@ -3037,7 +3038,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/,
     splashOut = new SplashOutputDev(splashModeRGB8, 1, gFalse,
 				    paperColor, gTrue, gFalse);
   }
-  splashOut->startDoc(xref);
+  splashOut->startDoc(doc);
   splashDPI = globalParams->getSplashResolution();
   if (splashDPI < 1.0) {
     splashDPI = defaultSplashDPI;
@@ -3414,7 +3415,7 @@ void PSOutputDev::startPage(int pageNum, GfxState *state) {
 
   if (mode == psModePS || mode == psModePSOrigPageSizes) {
     GooString pageLabel;
-    const GBool gotLabel = m_catalog->indexToLabel(pageNum -1, &pageLabel);
+    const GBool gotLabel = doc->getCatalog()->indexToLabel(pageNum -1, &pageLabel);
     if (gotLabel) {
       // See bug13338 for why we try to avoid parentheses...
       GBool needParens;
@@ -4043,7 +4044,7 @@ GBool PSOutputDev::tilingPatternFillL1(GfxState *state, Catalog *cat, Object *st
   box.y1 = bbox[1];
   box.x2 = bbox[2];
   box.y2 = bbox[3];
-  gfx = new Gfx(xref, this, resDict, m_catalog, &box, NULL);
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
   writePS("/x {\n");
   if (paintType == 2) {
     writePSFmt("{0:.6g} 0 {1:.6g} {2:.6g} {3:.6g} {4:.6g} setcachedevice\n",
@@ -4098,7 +4099,7 @@ GBool PSOutputDev::tilingPatternFillL2(GfxState *state, Catalog *cat, Object *st
   box.y1 = bbox[1];
   box.x2 = bbox[2];
   box.y2 = bbox[3];
-  gfx = new Gfx(xref, this, resDict, m_catalog, &box, NULL);
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
   inType3Char = gTrue;
   gfx->display(str);
   inType3Char = gFalse;
diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h
index 3de590d..83aeb84 100644
--- a/poppler/PSOutputDev.h
+++ b/poppler/PSOutputDev.h
@@ -78,7 +78,7 @@ class PSOutputDev: public OutputDev {
 public:
 
   // Open a PostScript output file, and write the prolog.
-  PSOutputDev(const char *fileName, PDFDoc *doc, XRef *xrefA, Catalog *catalog,
+  PSOutputDev(const char *fileName, PDFDoc *docA,
 	      char *psTitle,
 	      int firstPage, int lastPage, PSOutMode modeA,
 	      int paperWidthA = -1, int paperHeightA = -1,
@@ -91,8 +91,7 @@ public:
   // Open a PSOutputDev that will write to a generic stream.
   PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
 	      char *psTitle,
-	      PDFDoc *doc,
-	      XRef *xrefA, Catalog *catalog,
+	      PDFDoc *docA,
 	      int firstPage, int lastPage, PSOutMode modeA,
 	      int paperWidthA = -1, int paperHeightA = -1,
 	      GBool duplexA = gTrue,
@@ -288,7 +287,7 @@ public:
 private:
 
   void init(PSOutputFunc outputFuncA, void *outputStreamA,
-	    PSFileType fileTypeA, char *pstitle, PDFDoc *doc, XRef *xrefA, Catalog *catalog,
+	    PSFileType fileTypeA, char *pstitle, PDFDoc *doc,
 	    int firstPage, int lastPage, PSOutMode modeA,
 	    int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
 	    GBool manualCtrlA, int paperWidthA, int paperHeightA,
@@ -394,8 +393,8 @@ private:
   void (*overlayCbk)(PSOutputDev *psOut, void *data);
   void *overlayCbkData;
 
+  PDFDoc *doc;
   XRef *xref;			// the xref table for this PDF file
-  Catalog *m_catalog;           // the catalog for this PDF file
 
   Ref *fontIDs;			// list of object IDs of all used fonts
   int fontIDLen;		// number of entries in fontIDs array
diff --git a/poppler/Page.cc b/poppler/Page.cc
index 95469f6..486ab45 100644
--- a/poppler/Page.cc
+++ b/poppler/Page.cc
@@ -42,6 +42,7 @@
 #include "Object.h"
 #include "Array.h"
 #include "Dict.h"
+#include "PDFDoc.h"
 #include "XRef.h"
 #include "Link.h"
 #include "OutputDev.h"
@@ -255,11 +256,12 @@ GBool PageAttrs::readBox(Dict *dict, const char *key, PDFRectangle *box) {
 // Page
 //------------------------------------------------------------------------
 
-Page::Page(XRef *xrefA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
+Page::Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) {
   Object tmp;
 	
   ok = gTrue;
-  xref = xrefA;
+  doc = docA;
+  xref = doc->getXRef();
   num = numA;
   duration = -1;
   annots = NULL;
@@ -446,7 +448,7 @@ Gfx *Page::createGfx(OutputDev *out, double hDPI, double vDPI,
     printf("***** Rotate = %d\n", attrs->getRotate());
   }
 
-  gfx = new Gfx(xref, out, num, attrs->getResourceDict(), catalog,
+  gfx = new Gfx(doc, out, num, attrs->getResourceDict(),
 		hDPI, vDPI, &box, crop ? cropBox : (PDFRectangle *)NULL,
 		rotate, abortCheckCbk, abortCheckCbkData);
 
diff --git a/poppler/Page.h b/poppler/Page.h
index ced11c0..40e4fdd 100644
--- a/poppler/Page.h
+++ b/poppler/Page.h
@@ -35,6 +35,7 @@
 #include "Object.h"
 
 class Dict;
+class PDFDoc;
 class XRef;
 class OutputDev;
 class Links;
@@ -127,7 +128,7 @@ class Page {
 public:
 
   // Constructor.
-  Page(XRef *xrefA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form);
+  Page(PDFDoc *docA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form);
 
   // Destructor.
   ~Page();
@@ -237,6 +238,7 @@ public:
 
 private:
 
+  PDFDoc *doc;
   XRef *xref;			// the xref table for this PDF file
   Object pageObj;               // page dictionary
   Ref pageRef;                  // page reference
diff --git a/poppler/PreScanOutputDev.cc b/poppler/PreScanOutputDev.cc
index f8df6a1..b82828d 100644
--- a/poppler/PreScanOutputDev.cc
+++ b/poppler/PreScanOutputDev.cc
@@ -43,9 +43,9 @@
 // PreScanOutputDev
 //------------------------------------------------------------------------
 
-PreScanOutputDev::PreScanOutputDev(XRef *xrefA) {
+PreScanOutputDev::PreScanOutputDev(PDFDoc *docA) {
   level = globalParams->getPSLevel();
-  xref = xrefA;
+  doc = docA;
   clearStats();
 }
 
@@ -90,7 +90,7 @@ GBool PreScanOutputDev::tilingPatternFill(GfxState *state, Catalog *catalog, Obj
   Gfx *gfx;
   box.x1 = bbox[0]; box.y1 = bbox[1];
   box.x2 = bbox[2]; box.y2 = bbox[3];
-  gfx = new Gfx(xref, this, resDict, catalog, &box, NULL);
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
   gfx->display(str);
   delete gfx;
   return gTrue;
diff --git a/poppler/PreScanOutputDev.h b/poppler/PreScanOutputDev.h
index 464fbbf..d94afaa 100644
--- a/poppler/PreScanOutputDev.h
+++ b/poppler/PreScanOutputDev.h
@@ -45,7 +45,7 @@ class PreScanOutputDev: public OutputDev {
 public:
 
   // Constructor.
-  PreScanOutputDev(XRef *xrefA);
+  PreScanOutputDev(PDFDoc *docA);
 
   // Destructor.
   virtual ~PreScanOutputDev();
@@ -159,7 +159,7 @@ private:
   void check(GfxColorSpace *colorSpace, GfxColor *color,
 	     double opacity, GfxBlendMode blendMode);
 
-  XRef *xref;
+  PDFDoc *doc;
   GBool mono;
   GBool gray;
   GBool transparency;
diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc
index 2263753..9fc0656 100644
--- a/poppler/SplashOutputDev.cc
+++ b/poppler/SplashOutputDev.cc
@@ -51,6 +51,7 @@
 #include "Gfx.h"
 #include "GfxFont.h"
 #include "Page.h"
+#include "PDFDoc.h"
 #include "Link.h"
 #include "CharCodeToUnicode.h"
 #include "FontEncodingTables.h"
@@ -1340,7 +1341,7 @@ SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA,
   }
   keepAlphaChannel = paperColorA == NULL;
 
-  xref = NULL;
+  doc = NULL;
 
   bitmap = new SplashBitmap(1, 1, bitmapRowPad, colorMode,
 			    colorMode != splashModeMono1, bitmapTopDown);
@@ -1427,10 +1428,10 @@ SplashOutputDev::~SplashOutputDev() {
   }
 }
 
-void SplashOutputDev::startDoc(XRef *xrefA) {
+void SplashOutputDev::startDoc(PDFDoc *docA) {
   int i;
 
-  xref = xrefA;
+  doc = docA;
   if (fontEngine) {
     delete fontEngine;
   }
@@ -1771,7 +1772,7 @@ void SplashOutputDev::doUpdateFont(GfxState *state) {
 
     // if there is an embedded font, write it to disk
     if (gfxFont->getEmbeddedFontID(&embRef)) {
-      tmpBuf = gfxFont->readEmbFontFile(xref, &tmpBufLen);
+      tmpBuf = gfxFont->readEmbFontFile(doc->getXRef(), &tmpBufLen);
       if (! tmpBuf)
 	goto err2;
 
@@ -3150,7 +3151,7 @@ void SplashOutputDev::drawMaskedImage(GfxState *state, Object *ref,
   if (maskWidth > width || maskHeight > height) {
     decodeLow.initInt(maskInvert ? 0 : 1);
     decodeHigh.initInt(maskInvert ? 1 : 0);
-    maskDecode.initArray(xref);
+    maskDecode.initArray(doc->getXRef());
     maskDecode.arrayAdd(&decodeLow);
     maskDecode.arrayAdd(&decodeHigh);
     maskColorMap = new GfxImageColorMap(1, &maskDecode,
@@ -3901,7 +3902,7 @@ GBool SplashOutputDev::tilingPatternFill(GfxState *state, Catalog *catalog, Obje
 
   box.x1 = bbox[0]; box.y1 = bbox[1];
   box.x2 = bbox[2]; box.y2 = bbox[3];
-  gfx = new Gfx(xref, this, resDict, catalog, &box, NULL);
+  gfx = new Gfx(doc, this, resDict, &box, NULL);
   // set pattern transformation matrix
   gfx->getState()->setCTM(m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]);
   updateCTM(gfx->getState(), m1.m[0], m1.m[1], m1.m[2], m1.m[3], m1.m[4], m1.m[5]);
diff --git a/poppler/SplashOutputDev.h b/poppler/SplashOutputDev.h
index f19c542..49f2b12 100644
--- a/poppler/SplashOutputDev.h
+++ b/poppler/SplashOutputDev.h
@@ -40,6 +40,7 @@
 #include "OutputDev.h"
 #include "GfxState.h"
 
+class PDFDoc;
 class Gfx8BitFont;
 class SplashBitmap;
 class Splash;
@@ -345,7 +346,7 @@ public:
   //----- special access
 
   // Called to indicate that a new PDF document has been loaded.
-  void startDoc(XRef *xrefA);
+  void startDoc(PDFDoc *docA);
  
   void setPaperColor(SplashColorPtr paperColorA);
 
@@ -417,7 +418,7 @@ private:
   SplashColor paperColor;	// paper color
   SplashScreenParams screenParams;
 
-  XRef *xref;			// xref table for current document
+  PDFDoc *doc;			// the current document
 
   SplashBitmap *bitmap;
   Splash *splash;
diff --git a/qt4/src/poppler-private.h b/qt4/src/poppler-private.h
index 6d2b315..e7499d5 100644
--- a/qt4/src/poppler-private.h
+++ b/qt4/src/poppler-private.h
@@ -118,7 +118,7 @@ namespace Poppler {
 			SplashOutputDev * splashOutputDev = new SplashOutputDev(splashModeXBGR8, 4, gFalse, bgColor, gTrue, AA);
 			splashOutputDev->setVectorAntialias(m_hints & Document::Antialiasing ? gTrue : gFalse);
 			splashOutputDev->setFreeTypeHinting(m_hints & Document::TextHinting ? gTrue : gFalse, m_hints & Document::TextSlightHinting ? gTrue : gFalse);
-			splashOutputDev->startDoc(doc->getXRef());
+			splashOutputDev->startDoc(doc);
 			m_outputDev = splashOutputDev;
 #endif
 			break;
diff --git a/qt4/src/poppler-ps-converter.cc b/qt4/src/poppler-ps-converter.cc
index a1b26d2..5cec478 100644
--- a/qt4/src/poppler-ps-converter.cc
+++ b/qt4/src/poppler-ps-converter.cc
@@ -207,8 +207,6 @@ bool PSConverter::convert()
 	PSOutputDev *psOut = new PSOutputDev(outputToQIODevice, dev,
 	                                     pstitlechar,
 	                                     d->document->doc,
-	                                     d->document->doc->getXRef(),
-	                                     d->document->doc->getCatalog(),
 	                                     1,
 	                                     d->document->doc->getNumPages(),
 	                                     psModePS,
diff --git a/test/gtk-test.cc b/test/gtk-test.cc
index 1e9e1ee..dd339fb 100644
--- a/test/gtk-test.cc
+++ b/test/gtk-test.cc
@@ -329,7 +329,7 @@ view_new (PopplerDocument *doc)
 
     view->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
                                         redraw_callback, (void*) view, sc);
-    view->out->startDoc(view->doc->doc->getXRef());
+    view->out->startDoc(view->doc->doc);
   }
 
   g_signal_connect (view->drawing_area,
diff --git a/test/pdf-inspector.cc b/test/pdf-inspector.cc
index d4a564d..5598db6 100644
--- a/test/pdf-inspector.cc
+++ b/test/pdf-inspector.cc
@@ -310,7 +310,7 @@ PdfInspector::load(const char *file_name)
       gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 0, doc->getNumPages()-1);
       gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0);
 
-      output->startDoc (doc->getXRef(), doc->getCatalog());
+      output->startDoc (doc);
     }
   else
     {      
diff --git a/test/perf-test.cc b/test/perf-test.cc
index 45961d3..b6fb8f8 100644
--- a/test/perf-test.cc
+++ b/test/perf-test.cc
@@ -431,7 +431,7 @@ SplashOutputDev * PdfEnginePoppler::outputDevice() {
         GBool bitmapTopDown = gTrue;
         _outputDev = new SplashOutputDev(gSplashColorMode, 4, gFalse, gBgColor, bitmapTopDown);
         if (_outputDev)
-            _outputDev->startDoc(_pdfDoc->getXRef());
+            _outputDev->startDoc(_pdfDoc);
     }
     return _outputDev;
 }
diff --git a/utils/pdftocairo.cc b/utils/pdftocairo.cc
index b425c1e..ad56b6c 100644
--- a/utils/pdftocairo.cc
+++ b/utils/pdftocairo.cc
@@ -903,7 +903,7 @@ int main(int argc, char *argv[]) {
   }
 
   cairoOut = new CairoOutputDev();
-  cairoOut->startDoc(doc->getXRef(), doc->getCatalog());
+  cairoOut->startDoc(doc);
   if (sz != 0)
     crop_w = crop_h = sz;
   pg_num_len = numberOfCharacters(doc->getNumPages());
diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc
index 4d0d590..1e7350a 100644
--- a/utils/pdftohtml.cc
+++ b/utils/pdftohtml.cc
@@ -420,7 +420,7 @@ int main(int argc, char *argv[]) {
           splashFormatPng : splashFormatJpeg;
 
       splashOut = new SplashOutputDevNoText(splashModeRGB8, 4, gFalse, color);
-      splashOut->startDoc(doc->getXRef());
+      splashOut->startDoc(doc);
 
       for (int pg = firstPage; pg <= lastPage; ++pg) {
         doc->displayPage(splashOut, pg,
@@ -448,8 +448,8 @@ int main(int argc, char *argv[]) {
       psFileName = new GooString(htmlFileName->getCString());
       psFileName->append(".ps");
 
-      psOut = new PSOutputDev(psFileName->getCString(), doc, doc->getXRef(),
-          doc->getCatalog(), NULL, firstPage, lastPage, psModePS, w, h);
+      psOut = new PSOutputDev(psFileName->getCString(), doc,
+          NULL, firstPage, lastPage, psModePS, w, h);
       psOut->setDisplayText(gFalse);
       doc->displayPages(psOut, firstPage, lastPage, 72, 72, 0,
           gTrue, gFalse, gFalse);
diff --git a/utils/pdftoppm.cc b/utils/pdftoppm.cc
index 5c4c4a7..d48c3ee 100644
--- a/utils/pdftoppm.cc
+++ b/utils/pdftoppm.cc
@@ -372,7 +372,7 @@ int main(int argc, char *argv[]) {
 #endif
 				             splashModeRGB8, 4,
 				  gFalse, paperColor);
-  splashOut->startDoc(doc->getXRef());
+  splashOut->startDoc(doc);
   if (sz != 0) w = h = sz;
   pg_num_len = numberOfCharacters(doc->getNumPages());
   for (pg = firstPage; pg <= lastPage; ++pg) {
diff --git a/utils/pdftops.cc b/utils/pdftops.cc
index 195d179..7f5f511 100644
--- a/utils/pdftops.cc
+++ b/utils/pdftops.cc
@@ -375,8 +375,8 @@ int main(int argc, char *argv[]) {
   }
 
   // write PostScript file
-  psOut = new PSOutputDev(psFileName->getCString(), doc, doc->getXRef(),
-			  doc->getCatalog(), NULL, firstPage, lastPage, mode,
+  psOut = new PSOutputDev(psFileName->getCString(), doc,
+			  NULL, firstPage, lastPage, mode,
 			  paperWidth,
 			  paperHeight,
 			  duplex);


More information about the poppler mailing list