[poppler] 12 commits - poppler/Annot.cc poppler/Annot.h poppler/Array.cc poppler/Array.h poppler/FileSpec.h poppler/FontInfo.cc poppler/Form.cc poppler/Function.cc poppler/Gfx.cc poppler/Link.cc poppler/Link.h poppler/OptionalContent.cc poppler/OptionalContent.h poppler/Stream.h poppler/StructElement.cc poppler/StructElement.h

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Feb 28 18:21:20 UTC 2019


 poppler/Annot.cc           |   52 +++++++++++++++++++--------------------------
 poppler/Annot.h            |    6 ++---
 poppler/Array.cc           |   14 ++++++++++++
 poppler/Array.h            |    1 
 poppler/FileSpec.h         |    2 -
 poppler/FontInfo.cc        |    2 -
 poppler/Form.cc            |    6 ++---
 poppler/Function.cc        |    7 ++----
 poppler/Gfx.cc             |   11 ++++-----
 poppler/Link.cc            |   17 ++++++++------
 poppler/Link.h             |    8 +++---
 poppler/OptionalContent.cc |    2 -
 poppler/OptionalContent.h  |    2 -
 poppler/Stream.h           |    2 -
 poppler/StructElement.cc   |    5 ++--
 poppler/StructElement.h    |    4 +--
 16 files changed, 75 insertions(+), 66 deletions(-)

New commits:
commit 679339e0384a630052902cfbad1b278440857046
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:42:20 2019 +0100

    Function: use new Array::get function
    
    Makes code simple and saves getting twice if it's a ref

diff --git a/poppler/Function.cc b/poppler/Function.cc
index e0af1d15..873c2c0a 100644
--- a/poppler/Function.cc
+++ b/poppler/Function.cc
@@ -690,12 +690,11 @@ StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict, std::set<int>
   }
   for (i = 0; i < k; ++i) {
     std::set<int> usedParentsAux = *usedParents;
-    Object obj2 = obj1.arrayGetNF(i).copy();
-    if (obj2.isRef()) {
-      const Ref ref = obj2.getRef();
+    Ref ref;
+    Object obj2 = obj1.getArray()->get(i, &ref);
+    if (ref.num != 0) {
       if (usedParentsAux.find(ref.num) == usedParentsAux.end()) {
         usedParentsAux.insert(ref.num);
-        obj2 = obj1.arrayGet(i);
       } else {
         return;
       }
commit ef6d9e341c98aaf727a27bd858eda7c52b4bed21
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:40:44 2019 +0100

    Array: introduce get variant that returns also the Ref it is one
    
    Similar to the new one in Dict

diff --git a/poppler/Array.cc b/poppler/Array.cc
index 83098a23..cc7dd0c1 100644
--- a/poppler/Array.cc
+++ b/poppler/Array.cc
@@ -77,6 +77,20 @@ Object Array::get(int i, int recursion) const {
   return elems[i].fetch(xref, recursion);
 }
 
+Object Array::get(int i, Ref *returnRef, int recursion) const
+{
+  if (i < 0 || std::size_t(i) >= elems.size()) {
+    *returnRef = { 0, 0 };
+    return Object(objNull);
+  }
+  if (elems[i].getType() == objRef) {
+    *returnRef = elems[i].getRef();
+  } else {
+    *returnRef = { 0, 0 };
+  }
+  return elems[i].fetch(xref, recursion);
+}
+
 const Object &Array::getNF(int i) const {
   if (i < 0 || std::size_t(i) >= elems.size()) {
     static Object nullObj(objNull);
diff --git a/poppler/Array.h b/poppler/Array.h
index b64503a5..1d03cbc9 100644
--- a/poppler/Array.h
+++ b/poppler/Array.h
@@ -68,6 +68,7 @@ public:
 
   // Accessors.
   Object get(int i, int recursion = 0) const;
+  Object get(int i, Ref *returnRef, int recursion = 0) const;
   const Object &getNF(int i) const;
   bool getString(int i, GooString *string) const;
 
commit 11d6103d45521d0cfec2a5e49a8214bf85843c7f
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:26:47 2019 +0100

    Annot: Use the new Dict::lookup function
    
    Simplifies the code

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index bcd72805..412f1e1d 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -2823,14 +2823,8 @@ void AnnotFreeText::generateFreeTextAppearance()
       error(errSyntaxWarning, -1, "Font subdictionary is not a dictionary");
     } else {
       // Get the font dictionary for the actual requested font
-      Object fontDictionary = fontResources.getDict()->lookupNF(da.getFontName().getName()).copy();
-
-      // Resolve reference, if necessary
-      Ref fontReference = {-1, -1};
-      if (fontDictionary.isRef()) {
-        fontReference = fontDictionary.getRef();
-        fontDictionary = fontDictionary.fetch(xref);
-      }
+      Ref fontReference;
+      Object fontDictionary = fontResources.getDict()->lookup(da.getFontName().getName(), &fontReference);
 
       if (fontDictionary.isDict()) {
         font = GfxFont::makeFont(xref, da.getFontName().getName(), fontReference, fontDictionary.getDict());
commit 56dc35f28a3f878e57ad7eb2b0ca63f325882f12
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:05:43 2019 +0100

    Annot: Remove unneeded copy() calls

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 0ebde310..bcd72805 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -1224,9 +1224,9 @@ void Annot::initialize(PDFDoc *docA, Dict *dict) {
   }
 
   // Note: This value is overwritten by Annots ctor
-  obj1 = dict->lookupNF("P").copy();
-  if (obj1.isRef()) {
-    Ref ref = obj1.getRef();
+  const Object &pObj = dict->lookupNF("P");
+  if (pObj.isRef()) {
+    Ref ref = pObj.getRef();
 
     page = doc->getCatalog()->findPage (ref.num, ref.gen);
   } else {
@@ -1928,9 +1928,9 @@ void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict) {
     date.reset(obj1.getString()->copy());
   }
 
-  obj1 = dict->lookupNF("IRT").copy();
-  if (obj1.isRef()) {
-    inReplyTo = obj1.getRef();
+  const Object &irtObj = dict->lookupNF("IRT");
+  if (irtObj.isRef()) {
+    inReplyTo = irtObj.getRef();
   } else {
     inReplyTo.num = 0;
     inReplyTo.gen = 0;
commit ff77c618d2d71ff7b9e473b5735b027ec9ba55bd
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:02:42 2019 +0100

    Link: Remove unneeded copy() calls

diff --git a/poppler/Link.cc b/poppler/Link.cc
index 428e8b6f..4ee8b78a 100644
--- a/poppler/Link.cc
+++ b/poppler/Link.cc
@@ -637,12 +637,12 @@ LinkMovie::LinkMovie(const Object *obj) {
   annotRef.num = -1;
   annotTitle = nullptr;
 
-  Object tmp = obj->dictLookupNF("Annotation").copy();
-  if (tmp.isRef()) {
-    annotRef = tmp.getRef();
+  const Object &annotationObj = obj->dictLookupNF("Annotation");
+  if (annotationObj.isRef()) {
+    annotRef = annotationObj.getRef();
   }
 
-  tmp = obj->dictLookup("T");
+  Object tmp = obj->dictLookup("T");
   if (tmp.isString()) {
     annotTitle = tmp.getString()->copy();
   }
@@ -729,6 +729,8 @@ LinkRendition::LinkRendition(const Object *obj) {
   js = nullptr;
   int operationCode = -1;
 
+  screenRef.num = -1;
+
   if (obj->isDict()) {
     Object tmp = obj->dictLookup("JS");
     if (!tmp.isNull()) {
@@ -758,10 +760,11 @@ LinkRendition::LinkRendition(const Object *obj) {
 	  renditionObj.setToNull();
 	}
 
-	screenRef = obj->dictLookupNF("AN").copy();
-	if (!screenRef.isRef() && operation >= 0 && operation <= 4) {
+	const Object &anObj = obj->dictLookupNF("AN");
+	if (anObj.isRef()) {
+	  screenRef = anObj.getRef();
+	} else if (operation >= 0 && operation <= 4) {
 	  error(errSyntaxWarning, -1, "Invalid Rendition Action: no AN field with op = {0:d}", operationCode);
-	  screenRef.setToNull();
 	}
       }
 
diff --git a/poppler/Link.h b/poppler/Link.h
index d0e3cc39..5fea9a60 100644
--- a/poppler/Link.h
+++ b/poppler/Link.h
@@ -17,7 +17,7 @@
 // Copyright (C) 2008 Hugo Mercier <hmercier31 at gmail.com>
 // Copyright (C) 2010, 2011 Carlos Garcia Campos <carlosgc at gnome.org>
 // Copyright (C) 2012 Tobias Koening <tobias.koenig at kdab.com>
-// Copyright (C) 2018 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2018, 2019 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <info at kdab.com>. Work sponsored by the LiMux project of the city of Munich
 // Copyright (C) 2018 Intevation GmbH <intevation at intevation.de>
 //
@@ -360,8 +360,8 @@ public:
   bool hasRenditionObject() const { return renditionObj.isDict(); }
   const Object* getRenditionObject() const { return &renditionObj; }
 
-  bool hasScreenAnnot() const { return screenRef.isRef(); }
-  Ref getScreenAnnot() const { return screenRef.getRef(); }
+  bool hasScreenAnnot() const { return screenRef.num != -1; }
+  Ref getScreenAnnot() const { return screenRef; }
 
   RenditionOperation getOperation() const { return operation; }
 
@@ -371,7 +371,7 @@ public:
 
 private:
 
-  Object screenRef;
+  Ref screenRef;
   Object renditionObj;
   RenditionOperation operation;
 
commit d57ceff195f5d02504d7adf7396defc915272b67
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:52:58 2019 +0100

    Gfx: Save unneeded copy() calls

diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
index 4da19c14..9244b044 100644
--- a/poppler/Gfx.cc
+++ b/poppler/Gfx.cc
@@ -4214,7 +4214,6 @@ void Gfx::doImage(Object *ref, Stream *str, bool inlineImg) {
   bool maskInvert;
   bool maskInterpolate;
   Stream *maskStr;
-  Object obj1;
   int i, n;
 
   // get info from the stream
@@ -4227,14 +4226,14 @@ void Gfx::doImage(Object *ref, Stream *str, bool inlineImg) {
 
   // check for optional content key
   if (ref) {
-    obj1 = dict->lookupNF("OC").copy();
-    if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
+    const Object &objOC = dict->lookupNF("OC");
+    if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&objOC)) {
       return;
     }
   }
 
   // get size
-  obj1 = dict->lookup("Width");
+  Object obj1 = dict->lookup("Width");
   if (obj1.isNull()) {
     obj1 = dict->lookup("W");
   }
@@ -4691,8 +4690,8 @@ void Gfx::doForm(Object *str) {
 
   // check for optional content key
   ocSaved = ocState;
-  obj1 = dict->lookupNF("OC").copy();
-  if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&obj1)) {
+  const Object &objOC = dict->lookupNF("OC");
+  if (catalog->getOptContentConfig() && !catalog->getOptContentConfig()->optContentIsVisible(&objOC)) {
     if (out->needCharCount()) {
       ocState = false;
     } else {
commit 008431647c573d342f07f2e05123bdce938802a3
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:52:33 2019 +0100

    StructElement: save unneeded copy() calls

diff --git a/poppler/StructElement.cc b/poppler/StructElement.cc
index 41491161..e1142772 100644
--- a/poppler/StructElement.cc
+++ b/poppler/StructElement.cc
@@ -1045,11 +1045,12 @@ void StructElement::parse(Dict *element)
   }
 
   // Parent object reference (required).
-  s->parentRef = element->lookupNF("P").copy();
-  if (!s->parentRef.isRef()) {
+  const Object &objP = element->lookupNF("P");
+  if (!objP.isRef()) {
     error(errSyntaxError, -1, "P object is wrong type ({0:s})", obj.getTypeName());
     return;
   }
+  s->parentRef = objP.getRef();
 
   // Check whether the S-type is valid for the top level
   // element and create a node of the appropriate type.
diff --git a/poppler/StructElement.h b/poppler/StructElement.h
index b654366d..9030fb3d 100644
--- a/poppler/StructElement.h
+++ b/poppler/StructElement.h
@@ -159,7 +159,7 @@ public:
 
   int getMCID() const { return c->mcid; }
   Ref getObjectRef() const { return c->ref; }
-  Ref getParentRef() { return isContent() ? parent->getParentRef() : s->parentRef.getRef(); }
+  Ref getParentRef() { return isContent() ? parent->getParentRef() : s->parentRef; }
   bool hasPageRef() const;
   bool getPageRef(Ref& ref) const;
   StructTreeRoot *getStructTreeRoot() { return treeRoot; }
@@ -253,7 +253,7 @@ private:
   typedef std::vector<StructElement*> ElemPtrArray;
 
   struct StructData {
-    Object       parentRef;
+    Ref         parentRef;
     GooString   *altText;
     GooString   *actualText;
     GooString   *id;
commit 38422a432c4f49e31467e5eae447e244eade3218
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:51:57 2019 +0100

    OptionalContent: constify

diff --git a/poppler/OptionalContent.cc b/poppler/OptionalContent.cc
index 23acd019..846a2ae6 100644
--- a/poppler/OptionalContent.cc
+++ b/poppler/OptionalContent.cc
@@ -137,7 +137,7 @@ OCDisplayNode *OCGs::getDisplayRoot()
   return display.get();
 }
 
-bool OCGs::optContentIsVisible( Object *dictRef )
+bool OCGs::optContentIsVisible( const Object *dictRef )
 {
   Dict *dict;
   bool result = true;
diff --git a/poppler/OptionalContent.h b/poppler/OptionalContent.h
index e4144e64..309d1e65 100644
--- a/poppler/OptionalContent.h
+++ b/poppler/OptionalContent.h
@@ -53,7 +53,7 @@ public:
   Array* getRBGroupsArray() 
     { return (rbgroups.isArray() && rbgroups.arrayGetLength()) ? rbgroups.getArray() : nullptr; }
 
-  bool optContentIsVisible( Object *dictRef );
+  bool optContentIsVisible( const Object *dictRef );
 
 private:
   bool ok;
commit d2ccd7f9cd26a877492bc5dd02094defa9be0592
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:51:25 2019 +0100

    Form: Save unneeded copy() calls

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 905e5c3e..6d167c6a 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -648,9 +648,9 @@ FormField::FormField(PDFDoc *docA, Object &&aobj, const Ref aref, FormField *par
       const Ref ref = childRef.getRef();
       if (usedParents->find(ref.num) == usedParents->end()) {
         // Field child: it could be a form field or a widget or composed dict
-        Object obj2 = childObj.dictLookupNF("Parent").copy();
+        const Object &objParent = childObj.dictLookupNF("Parent");
 	Object obj3 = childObj.dictLookup("Parent");
-        if (obj2.isRef() || obj3.isDict()) {
+        if (objParent.isRef() || obj3.isDict()) {
           // Child is a form field or composed dict
           // We create the field, if it's composed
           // it will create the widget as a child
@@ -666,7 +666,7 @@ FormField::FormField(PDFDoc *docA, Object &&aobj, const Ref aref, FormField *par
           children = (FormField**)greallocn(children, numChildren, sizeof(FormField*));
           children[numChildren - 1] = Form::createFieldFromDict(std::move(childObj), doc, ref, this, &usedParentsAux);
         } else {
-	  obj2 = childObj.dictLookup("Subtype");
+	  Object obj2 = childObj.dictLookup("Subtype");
 	  if (obj2.isName("Widget")) {
 	    // Child is a widget annotation
 	    if (!terminal && numChildren > 0) {
commit c4c8b5be381c925328ecace0753ce4d0c1305bf8
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:50:36 2019 +0100

    FontInfo: Save unneeded copy() call

diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc
index 161e5978..a6dd5a74 100644
--- a/poppler/FontInfo.cc
+++ b/poppler/FontInfo.cc
@@ -131,7 +131,7 @@ void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, GooList *fontsList)
     Object objDict = resDict->lookup(resTypes[resType]);
     if (objDict.isDict()) {
       for (int i = 0; i < objDict.dictGetLength(); ++i) {
-        const Object &resObj = objDict.dictGetValNF(i).copy();
+        const Object &resObj = objDict.dictGetValNF(i);
         if (resObj.isRef()) {
           // check for an already-seen object
           const Ref r = resObj.getRef();
commit a1b7baeab913931b06e53d2d271481f711eeab81
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 16:50:19 2019 +0100

    Annot: save some unneeded copy() calls

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 80e3a99b..0ebde310 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -929,7 +929,7 @@ int AnnotAppearance::getNumStates() {
 }
 
 // Test if stateObj (a Ref or a Dict) points to the specified stream
-bool AnnotAppearance::referencesStream(Object *stateObj, Ref refToStream) {
+bool AnnotAppearance::referencesStream(const Object *stateObj, Ref refToStream) {
   if (stateObj->isRef()) {
     Ref r = stateObj->getRef();
     if (r.num == refToStream.num && r.gen == refToStream.gen) {
@@ -952,22 +952,21 @@ bool AnnotAppearance::referencesStream(Object *stateObj, Ref refToStream) {
 
 // Test if this AnnotAppearance references the specified stream
 bool AnnotAppearance::referencesStream(Ref refToStream) {
-  Object obj1;
   bool found;
 
   // Scan each state's ref/subdictionary
-  obj1 = appearDict.dictLookupNF("N").copy();
-  found = referencesStream(&obj1, refToStream);
+  const Object &objN = appearDict.dictLookupNF("N");
+  found = referencesStream(&objN, refToStream);
   if (found)
     return true;
 
-  obj1 = appearDict.dictLookupNF("R").copy();
-  found = referencesStream(&obj1, refToStream);
+  const Object &objR = appearDict.dictLookupNF("R");
+  found = referencesStream(&objR, refToStream);
   if (found)
     return true;
 
-  obj1 = appearDict.dictLookupNF("D").copy();
-  found = referencesStream(&obj1, refToStream);
+  const Object &objD = appearDict.dictLookupNF("D");
+  found = referencesStream(&objD, refToStream);
   return found;
 }
 
@@ -995,7 +994,7 @@ void AnnotAppearance::removeStream(Ref refToStream) {
 }
 
 // Removes stream if obj is a Ref, or removes pointed streams if obj is a Dict
-void AnnotAppearance::removeStateStreams(Object *obj1) {
+void AnnotAppearance::removeStateStreams(const Object *obj1) {
   if (obj1->isRef()) {
     removeStream(obj1->getRef());
   } else if (obj1->isDict()) {
@@ -1010,13 +1009,12 @@ void AnnotAppearance::removeStateStreams(Object *obj1) {
 }
 
 void AnnotAppearance::removeAllStreams() {
-  Object obj1;
-  obj1 = appearDict.dictLookupNF("N").copy();
-  removeStateStreams(&obj1);
-  obj1 = appearDict.dictLookupNF("R").copy();
-  removeStateStreams(&obj1);
-  obj1 = appearDict.dictLookupNF("D").copy();
-  removeStateStreams(&obj1);
+  const Object &objN = appearDict.dictLookupNF("N");
+  removeStateStreams(&objN);
+  const Object &objR = appearDict.dictLookupNF("R");
+  removeStateStreams(&objR);
+  const Object &objD = appearDict.dictLookupNF("D");
+  removeStateStreams(&objD);
 }
 
 //------------------------------------------------------------------------
diff --git a/poppler/Annot.h b/poppler/Annot.h
index 4fbdcda4..09169865 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -21,7 +21,7 @@
 // Copyright (C) 2008 Hugo Mercier <hmercier31 at gmail.com>
 // Copyright (C) 2008 Pino Toscano <pino at kde.org>
 // Copyright (C) 2008 Tomas Are Haavet <tomasare at gmail.com>
-// Copyright (C) 2009-2011, 2013, 2016-2018 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2009-2011, 2013, 2016-2019 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2012, 2013 Fabio D'Urso <fabiodurso at hotmail.it>
 // Copyright (C) 2012, 2015 Tobias Koenig <tokoe at kdab.com>
 // Copyright (C) 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
@@ -446,9 +446,9 @@ public:
   bool referencesStream(Ref targetStreamRef);
 
 private:
-  static bool referencesStream(Object *stateObj, Ref targetStreamRef);
+  static bool referencesStream(const Object *stateObj, Ref targetStreamRef);
   void removeStream(Ref refToStream);
-  void removeStateStreams(Object *state);
+  void removeStateStreams(const Object *state);
 
 protected:
   PDFDoc *doc;
commit c33a0e82f8df11f7a5a0f7d0e0020c485b9142f0
Author: Albert Astals Cid <aacid at kde.org>
Date:   Thu Feb 28 17:33:40 2019 +0100

    Update (C) of previous commit

diff --git a/poppler/FileSpec.h b/poppler/FileSpec.h
index f205ac32..8d22e02c 100644
--- a/poppler/FileSpec.h
+++ b/poppler/FileSpec.h
@@ -6,7 +6,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2008 Carlos Garcia Campos <carlosgc at gnome.org>
-// Copyright (C) 2017, 2018 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2017-2019 Albert Astals Cid <aacid at kde.org>
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
diff --git a/poppler/Stream.h b/poppler/Stream.h
index 851d2fe3..32987c48 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -15,7 +15,7 @@
 //
 // Copyright (C) 2005 Jeff Muizelaar <jeff at infidigm.net>
 // Copyright (C) 2008 Julien Rebetez <julien at fhtagn.net>
-// Copyright (C) 2008, 2010, 2011, 2016-2018 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2008, 2010, 2011, 2016-2019 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2009 Carlos Garcia Campos <carlosgc at gnome.org>
 // Copyright (C) 2009 Stefan Thomas <thomas at eload24.com>
 // Copyright (C) 2010 Hib Eris <hib at hiberis.nl>


More information about the poppler mailing list