[poppler] 8 commits - NEWS poppler/XRef.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Tue Oct 16 15:29:13 PDT 2012


 NEWS            |   15 +++++++++++++++
 poppler/XRef.cc |    1 +
 2 files changed, 16 insertions(+)

New commits:
commit 0b3ff2dc4e1ba37dd66f5913b10a9d69e31c40ce
Merge: fb5cb0f... 528b64b...
Author: Albert Astals Cid <aacid at kde.org>
Date:   Wed Oct 17 00:28:40 2012 +0200

    Merge remote-tracking branch 'origin/poppler-0.20'
    
    Conflicts:
    	CMakeLists.txt
    	NEWS
    	configure.ac
    	cpp/Doxyfile
    	poppler/Annot.cc
    	poppler/Form.h
    	qt4/src/Doxyfile

diff --cc NEWS
index 69ba3c4,f29ea93..c0381a5
--- a/NEWS
+++ b/NEWS
@@@ -1,42 -1,18 +1,57 @@@
 +Release 0.21.0
 +        core:
 +         * Support the modification of files with Encrypt
 +         * Annotation improvements
 +         * Form improvements
 +         * Splash: Implement DeviceN support
 +         * Splash: Avoid bogus memory error for tilingPattern
 +         * TextOutputDev: Allow multiple fonts in a TextWord
 +         * Kill the concept of base dir
 +         * PSOutputDev: Always write HiResBoundingBox (Bug #53159)
 +         * Convert UTF-16 to UCS-4 when reading toUnicode cmap
 +         * GooString formatting: add support for uppercase hexadecimal
 +         * Use error() instead of fprintf(stderr, ...) in Annot::layoutText
 +         * poppler-config.h: remove WITH_FONTCONFIGURATION_* macros
 +
 +        glib:
 +         * Annotation improvements
 +         * Add poppler_page_remove_annot()
 +         * Add poppler_document_new_from_stream
 +         * Add poppler_document_new_from_gfile
 +         * Add poppler_page_find_text_with_options (Bug #2951)
 +         * Demo improvements
 +         * Port tests and demo to GTK+3
 +
 +        qt4:
 +         * Add accessor methods for movie poster information
 +         * Make 'additional actions' available in Annotation API (Bug #53589)
 +         * Add whole-page search method to Poppler::Page
 +         * Small changes in tests
 +
 +        utils:
 +         * pdftohtml: Make the output more xhtml compliant
 +         * pdftohtml: Add -fontfullname. (Bug #49872)
 +         * pdftohtml: Do not invoke gs anymore
 +
 +        build system:
 +         * Add the possibility of using lcms1 even if lcms2 is installed
 +         * Remove extra fontconfig CFLAGS and LIBS
 +
+ Release 0.20.5
+         core:
+          * Fix crashes in malformed documents
+          * Fix parsing of very big numbers
+          * Splash: Do not render invalid font outlines (Bug #55573)
+          * Check for NaN in TextPage::addChar
+ 
+         build system:
+          * Fix build using mingw64 with winpthread
+          * autotools: Fix compilation when lcms is on non standard locations (Bug #55326)
+          * Support automake-1.12 (Bug #55541)
+ 
+         glib:
+          * Chain up finalize to the parent class (Bug #55521)
+ 
  Release 0.20.4
          core:
           * Improvements regarding embedded file handling. (KDE Bug #306008)
commit 528b64bb077ed37c0d8fc7ae2ef3dc2c0dbb26ca
Author: Fabio D'Urso <fabiodurso at hotmail.it>
Date:   Tue Sep 4 23:10:17 2012 +0200

    Free entries in the xref form a linked list: terminate it properly when writing the XRef
    
    The last entry must point back to object 0. Previously it was left
    unitialized and resulted in "-000000001 00000 f" being written in the
    XRef table.

diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index a076bb0..b516a0f 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -1269,6 +1269,7 @@ void XRef::writeXRef(XRef::XRefWriter *writer, GBool writeAllEntries) {
       lastFreeEntry = i;
     }
   }
+  getEntry(lastFreeEntry)->offset = 0;
 
   if (writeAllEntries) {
     writer->startSection(0, size);
commit 35c07fe40d7b18e19f6ef0f5615f9f5ac8195cf7
Author: Fabio D'Urso <fabiodurso at hotmail.it>
Date:   Tue Oct 9 15:24:02 2012 +0200

    AnnotWidget: Avoid repeatedly deleting and creating xref entries for appearance streams
    
    Previously updating the appearance stream always involved deleting the old
    stream's xref entry and creating a new one.
    Since xref entry deletion causes the generation number to be incremented, this
    behavior caused the generation number to quickly rise during user input.
    
    This patch stops it by reusing the same entry as the old appearance stream in
    case of repeated modifications.

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index dfbc6a3..675ec84 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -3774,6 +3774,8 @@ void AnnotWidget::initialize(PDFDoc *docA, Dict *dict) {
     parent = NULL;
   }
   obj1.free();
+
+  updatedAppearanceStream.num = updatedAppearanceStream.gen = -1;
 }
 
 // Grand unified handler for preparing text strings to be drawn into form
@@ -4867,8 +4869,11 @@ void AnnotWidget::generateFieldAppearance() {
 
 void AnnotWidget::updateAppearanceStream()
 {
-  // Destroy the old appearance if any
-  invalidateAppearance();
+  // If this the first time updateAppearanceStream() is called on this widget,
+  // destroy the AP dictionary because we are going to create a new one.
+  if (updatedAppearanceStream.num == -1) {
+    invalidateAppearance(); // Delete AP dictionary and all referenced streams
+  }
 
   // There's no need to create a new appearance stream if NeedAppearances is
   // set, because it will be ignored next time anyway.
@@ -4879,19 +4884,30 @@ void AnnotWidget::updateAppearanceStream()
   generateFieldAppearance();
 
   // Fetch the appearance stream we've just created
-  Object obj1, obj2;
-  Ref apRef;
+  Object obj1;
   appearance.fetch(xref, &obj1);
-  apRef = xref->addIndirectObject(&obj1);
-  obj1.free();
 
-  // Write the AP dictionary
-  obj1.initDict(xref);
-  obj1.dictAdd(copyString("N"), obj2.initRef(apRef.num, apRef.gen));
-  update("AP", &obj1);
+  // If this the first time updateAppearanceStream() is called on this widget,
+  // create a new AP dictionary containing the new appearance stream.
+  // Otherwise, just update the stream we had created previously.
+  if (updatedAppearanceStream.num == -1) {
+    // Write the appearance stream
+    updatedAppearanceStream = xref->addIndirectObject(&obj1);
+    obj1.free();
 
-  // Update our internal pointers to the appearance dictionary
-  appearStreams = new AnnotAppearance(doc, &obj1);
+    // Write the AP dictionary
+    Object obj2;
+    obj1.initDict(xref);
+    obj1.dictAdd(copyString("N"), obj2.initRef(updatedAppearanceStream.num, updatedAppearanceStream.gen));
+    update("AP", &obj1);
+
+    // Update our internal pointers to the appearance dictionary
+    appearStreams = new AnnotAppearance(doc, &obj1);
+  } else {
+    // Replace the existing appearance stream
+    xref->setModifiedObject(&obj1, updatedAppearanceStream);
+    obj1.free();
+  }
 }
 
 void AnnotWidget::draw(Gfx *gfx, GBool printing) {
diff --git a/poppler/Annot.h b/poppler/Annot.h
index c208bc7..7cbc143 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -1298,6 +1298,7 @@ private:
   // AnnotBorderBS border;                // BS
   Dict *parent;                           // Parent
   GBool addDingbatsResource;
+  Ref updatedAppearanceStream; // {-1,-1} if updateAppearanceStream has never been called
 };
 
 //------------------------------------------------------------------------
commit 2127a977bbe9985aa58561116508ad4f08430a2c
Author: Fabio D'Urso <fabiodurso at hotmail.it>
Date:   Tue Oct 9 12:49:26 2012 +0200

    Generate and write the appearance stream in AnnotWidget::updateWidgetApperance()
    
    Note: At the moment the old appearance is deleted and a *new* xref entry is
    created every time AnnotWidget::updateWidgetApperance() is called.

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index dda85e9..dfbc6a3 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -4865,13 +4865,33 @@ void AnnotWidget::generateFieldAppearance() {
   appearStream->setNeedFree(gTrue);
 }
 
-// NOTE: This is a temporary implementation!
-// TODO: Generate new appearance stream *here* and write it
 void AnnotWidget::updateAppearanceStream()
 {
-  // Remove the old appearance so that AnnotWidget::draw will rebuild it next time
-  appearance.free();
-  appearance.initNull();
+  // Destroy the old appearance if any
+  invalidateAppearance();
+
+  // There's no need to create a new appearance stream if NeedAppearances is
+  // set, because it will be ignored next time anyway.
+  if (form && form->getNeedAppearances())
+    return;
+
+  // Create the new appearance
+  generateFieldAppearance();
+
+  // Fetch the appearance stream we've just created
+  Object obj1, obj2;
+  Ref apRef;
+  appearance.fetch(xref, &obj1);
+  apRef = xref->addIndirectObject(&obj1);
+  obj1.free();
+
+  // Write the AP dictionary
+  obj1.initDict(xref);
+  obj1.dictAdd(copyString("N"), obj2.initRef(apRef.num, apRef.gen));
+  update("AP", &obj1);
+
+  // Update our internal pointers to the appearance dictionary
+  appearStreams = new AnnotAppearance(doc, &obj1);
 }
 
 void AnnotWidget::draw(Gfx *gfx, GBool printing) {
commit 0446e2cc1073f4579a90284d28bc5872e46e0536
Author: Fabio D'Urso <fabiodurso at hotmail.it>
Date:   Tue Oct 9 10:47:40 2012 +0200

    Killed FormField::isModified() in favor of a new AnnotWidget callback
    
    Instead of having to ask FormField from AnnotWidget::draw if the
    widget's appearance needs to be rebuilt, now AnnotWidget gets notified
    of changes via the new AnnotWidget::updateAppearanceStream() callback.

diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index aa8b9a8..dda85e9 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -4865,6 +4865,14 @@ void AnnotWidget::generateFieldAppearance() {
   appearStream->setNeedFree(gTrue);
 }
 
+// NOTE: This is a temporary implementation!
+// TODO: Generate new appearance stream *here* and write it
+void AnnotWidget::updateAppearanceStream()
+{
+  // Remove the old appearance so that AnnotWidget::draw will rebuild it next time
+  appearance.free();
+  appearance.initNull();
+}
 
 void AnnotWidget::draw(Gfx *gfx, GBool printing) {
   Object obj;
@@ -4876,13 +4884,9 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) {
 
   // Only construct the appearance stream when
   // - annot doesn't have an AP or
-  // - it's a field containing text (text and choices) and
-  // - NeedAppearances is true or
-  // - widget has been modified or
+  // - NeedAppearances is true
   if (field) {
-    if (appearance.isNull() || (form && form->getNeedAppearances()) ||
-        ((field->getType() == formText || field->getType() == formChoice) &&
-         field->isModified()))
+    if (appearance.isNull() || (form && form->getNeedAppearances()))
       generateFieldAppearance();
   }
 
diff --git a/poppler/Annot.h b/poppler/Annot.h
index 04a1301..c208bc7 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -1269,6 +1269,7 @@ public:
   void drawFormFieldText(GfxResources *resources, GooString *da);
   void drawFormFieldChoice(GfxResources *resources, GooString *da);
   void generateFieldAppearance ();
+  void updateAppearanceStream ();
 
   AnnotWidgetHighlightMode getMode() { return mode; }
   AnnotAppearanceCharacs *getAppearCharacs() { return appearCharacs; }
diff --git a/poppler/Form.cc b/poppler/Form.cc
index 8a242c4..a2be980 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -14,6 +14,7 @@
 // Copyright 2009 Matthias Drochner <M.Drochner at fz-juelich.de>
 // Copyright 2009 KDAB via Guillermo Amaral <gamaral at amaral.com.mx>
 // Copyright 2010, 2012 Mark Riedesel <mark at klowner.com>
+// Copyright 2012 Fabio D'Urso <fabiodurso at hotmail.it>
 // 
 //========================================================================
 
@@ -124,10 +125,6 @@ bool FormWidget::isReadOnly() const
   return field->isReadOnly();
 }
 
-GBool FormWidget::isModified() const {
-  return field->isModified();
-}
-
 int FormWidget::encodeID (unsigned pageNum, unsigned fieldNum)
 {
   return (pageNum << 4*sizeof(unsigned)) + fieldNum;
@@ -215,6 +212,11 @@ void FormWidgetButton::setAppearanceState(const char *state) {
   widget->setAppearanceState(state);
 }
 
+void FormWidgetButton::updateWidgetAppearance()
+{
+  // The appearance stream must NOT be regenerated for this widget type
+}
+
 void FormWidgetButton::setState (GBool astate)
 {
   //pushButtons don't have state
@@ -257,7 +259,13 @@ GooString* FormWidgetText::getContentCopy ()
 {
   return parent->getContentCopy();
 }
-  
+
+void FormWidgetText::updateWidgetAppearance()
+{
+  if (widget)
+    widget->updateAppearanceStream();
+}
+
 bool FormWidgetText::isMultiline () const 
 { 
   return parent->isMultiline(); 
@@ -366,6 +374,12 @@ GooString* FormWidgetChoice::getEditChoice ()
   return parent->getEditChoice();
 }
 
+void FormWidgetChoice::updateWidgetAppearance()
+{
+  if (widget)
+    widget->updateAppearanceStream();
+}
+
 bool FormWidgetChoice::isSelected (int i)
 {
   if (!_checkRange(i)) return false;
@@ -433,6 +447,11 @@ FormWidgetSignature::FormWidgetSignature(PDFDoc *docA, Object *aobj, unsigned nu
   parent = static_cast<FormFieldSignature*>(field);
 }
 
+void FormWidgetSignature::updateWidgetAppearance()
+{
+  // Unimplemented
+}
+
 
 //========================================================================
 // FormField
@@ -456,7 +475,6 @@ FormField::FormField(PDFDoc *docA, Object *aobj, const Ref& aref, FormField *par
   fullyQualifiedName = NULL;
   quadding = quaddingLeftJustified;
   hasQuadding = gFalse;
-  modified = gFalse;
 
   ref = aref;
 
@@ -633,10 +651,6 @@ void FormField::createWidgetAnnotations() {
   }
 }
 
-GBool FormField::isModified() const {
-  return modified ? gTrue : parent ? parent->isModified() : gFalse;
-}
-
 void FormField::_createWidget (Object *obj, Ref aref)
 {
   terminal = true;
@@ -768,6 +782,18 @@ GooString* FormField::getFullyQualifiedName() {
   return fullyQualifiedName;
 }
 
+void FormField::updateChildrenAppearance()
+{
+  // Recursively update each child's appearance
+  if (terminal) {
+    for (int i = 0; i < numChildren; i++)
+      widgets[i]->updateWidgetAppearance();
+  } else {
+    for (int i = 0; i < numChildren; i++)
+      children[i]->updateChildrenAppearance();
+  }
+}
+
 //------------------------------------------------------------------------
 // FormFieldButton
 //------------------------------------------------------------------------
@@ -861,7 +887,6 @@ GBool FormFieldButton::setState(char *state)
   if (terminal && parent && parent->getType() == formButton && appearanceState.isNull()) {
     // It's button in a set, set state on parent
     if (static_cast<FormFieldButton*>(parent)->setState(state)) {
-      modified = gTrue;
       return gTrue;
     }
     return gFalse;
@@ -907,7 +932,6 @@ GBool FormFieldButton::setState(char *state)
   }
 
   updateState(state);
-  modified = gTrue;
 
   return gTrue;
 }
@@ -1019,7 +1043,7 @@ void FormFieldText::setContentCopy (GooString* new_content)
   obj1.initString(content ? content->copy() : new GooString(""));
   obj.getDict()->set("V", &obj1);
   xref->setModifiedObject(&obj, ref);
-  modified = gTrue;
+  updateChildrenAppearance();
 }
 
 FormFieldText::~FormFieldText()
@@ -1194,7 +1218,7 @@ void FormFieldChoice::updateSelection() {
 
   obj.getDict()->set("V", &obj1);
   xref->setModifiedObject(&obj, ref);
-  modified = gTrue;
+  updateChildrenAppearance();
 }
 
 void FormFieldChoice::unselectAll ()
diff --git a/poppler/Form.h b/poppler/Form.h
index fa3c718..4146728 100644
--- a/poppler/Form.h
+++ b/poppler/Form.h
@@ -9,6 +9,7 @@
 // Copyright 2007-2010 Albert Astals Cid <aacid at kde.org>
 // Copyright 2010 Mark Riedesel <mark at klowner.com>
 // Copyright 2011 Pino Toscano <pino at kde.org>
+// Copyright 2012 Fabio D'Urso <fabiodurso at hotmail.it>
 //
 //========================================================================
 
@@ -109,6 +110,8 @@ public:
   void createWidgetAnnotation();
   AnnotWidget *getWidgetAnnotation() const { return widget; }
 
+  virtual void updateWidgetAppearance() = 0;
+
 #ifdef DEBUG_FORMS
   void print(int indent = 0);
 #endif
@@ -154,6 +157,7 @@ public:
 
   char* getOnStr();
   void setAppearanceState(const char *state);
+  void updateWidgetAppearance();
 
   void setNumSiblingsID (int i);
   void setSiblingsID (int i, unsigned id) { siblingsID[i] = id; }
@@ -185,6 +189,8 @@ public:
   //except a UTF16BE string
   void setContent(GooString* new_content);
 
+  void updateWidgetAppearance();
+
   bool isMultiline () const; 
   bool isPassword () const; 
   bool isFileSelect () const; 
@@ -224,6 +230,7 @@ public:
 
   GooString* getEditChoice ();
 
+  void updateWidgetAppearance();
   bool isSelected (int i);
 
   bool isCombo () const; 
@@ -244,6 +251,7 @@ protected:
 class FormWidgetSignature: public FormWidget {
 public:
   FormWidgetSignature(PDFDoc *docA, Object *dict, unsigned num, Ref ref, FormField *p);
+  void updateWidgetAppearance();
 protected:
   FormFieldSignature *parent;
 };
@@ -269,8 +277,6 @@ public:
   void setReadOnly (bool b) { readOnly = b; }
   bool isReadOnly () const { return readOnly; }
 
-  GBool isModified () const;
-
   GooString* getDefaultAppearance() const { return defaultAppearance; }
   GBool hasTextQuadding() const { return hasQuadding; }
   VariableTextQuadding getTextQuadding() const { return quadding; }
@@ -297,6 +303,7 @@ public:
  protected:
   void _createWidget (Object *obj, Ref aref);
   void createChildren(std::set<int> *usedParents);
+  void updateChildrenAppearance();
 
   FormFieldType type;           // field type
   Ref ref;
@@ -309,7 +316,6 @@ public:
   int numChildren;
   FormWidget **widgets;
   bool readOnly;
-  GBool modified;
 
   GooString *partialName; // T field
   GooString *alternateUiName; // TU field
commit 65a2555607e03c94d77ae9ebdb34ab6d4f8844b6
Author: Fabio D'Urso <fabiodurso at hotmail.it>
Date:   Fri Oct 12 23:54:57 2012 +0200

    FormFieldChoice ctor: Fixed wrong index variable
    
    It caused a crash if multiple items are initially selected.

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 7d32ae0..8a242c4 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -1125,7 +1125,7 @@ FormFieldChoice::FormFieldChoice(PDFDoc *docA, Object *aobj, const Ref& ref, For
       for (int j = 0; j < obj1.arrayGetLength(); j++) {
         Object obj2;
 
-        obj1.arrayGet(i, &obj2);
+        obj1.arrayGet(j, &obj2);
         if (choices[i].optionName->cmp(obj2.getString()) == 0) {
           choices[i].selected = true;
           obj2.free();
commit ce18c9b3d5251305eb76d294fdf4b4de9382b3a4
Author: Albert Astals Cid <aacid at kde.org>
Date:   Wed Oct 10 19:54:57 2012 +0200

    0.20.5

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1a5d03d..7386cfd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,7 +16,7 @@ test_big_endian(WORDS_BIGENDIAN)
 
 set(POPPLER_MAJOR_VERSION "0")
 set(POPPLER_MINOR_VERSION "20")
-set(POPPLER_MICRO_VERSION "4")
+set(POPPLER_MICRO_VERSION "5")
 set(POPPLER_VERSION "${POPPLER_MAJOR_VERSION}.${POPPLER_MINOR_VERSION}.${POPPLER_MICRO_VERSION}")
 
 # command line switches
diff --git a/NEWS b/NEWS
index 2e874b9..f29ea93 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,18 @@
+Release 0.20.5
+        core:
+         * Fix crashes in malformed documents
+         * Fix parsing of very big numbers
+         * Splash: Do not render invalid font outlines (Bug #55573)
+         * Check for NaN in TextPage::addChar
+
+        build system:
+         * Fix build using mingw64 with winpthread
+         * autotools: Fix compilation when lcms is on non standard locations (Bug #55326)
+         * Support automake-1.12 (Bug #55541)
+
+        glib:
+         * Chain up finalize to the parent class (Bug #55521)
+
 Release 0.20.4
         core:
          * Improvements regarding embedded file handling. (KDE Bug #306008)
diff --git a/configure.ac b/configure.ac
index 6ada41c..7b6fb31 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
 m4_define([poppler_version_major],[0])
 m4_define([poppler_version_minor],[20])
-m4_define([poppler_version_micro],[4])
+m4_define([poppler_version_micro],[5])
 m4_define([poppler_version],[poppler_version_major.poppler_version_minor.poppler_version_micro])
 
 AC_PREREQ(2.59)
diff --git a/cpp/Doxyfile b/cpp/Doxyfile
index 38b51a9..c63ae5a 100644
--- a/cpp/Doxyfile
+++ b/cpp/Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME           = "Poppler CPP"
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 0.20.4
+PROJECT_NUMBER         = 0.20.5
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
diff --git a/qt4/src/Doxyfile b/qt4/src/Doxyfile
index 774b145..c356ebd 100644
--- a/qt4/src/Doxyfile
+++ b/qt4/src/Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME           = "Poppler Qt4 "
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 0.20.4
+PROJECT_NUMBER         = 0.20.5
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
commit 6d6bd660dbb652f2f3e87c81c55a87d1fc11ec70
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Sat Oct 6 10:26:55 2012 +0200

    glib: chain up finalize to the parent class
    
    This was missing in some of the classes.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=55521

diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc
index 24badd9..74d7635 100644
--- a/glib/poppler-document.cc
+++ b/glib/poppler-document.cc
@@ -356,6 +356,8 @@ poppler_document_finalize (GObject *object)
   poppler_document_layers_free (document);
   delete document->output_dev;
   delete document->doc;
+
+  G_OBJECT_CLASS (poppler_document_parent_class)->finalize (object);
 }
 
 /**
@@ -1957,6 +1959,8 @@ poppler_font_info_finalize (GObject *object)
 
         delete font_info->scanner;
         g_object_unref (font_info->document);
+
+        G_OBJECT_CLASS (poppler_font_info_parent_class)->finalize (object);
 }
 
 /**
@@ -2458,6 +2462,8 @@ poppler_ps_file_finalize (GObject *object)
         delete ps_file->out;
         g_object_unref (ps_file->document);
         g_free (ps_file->filename);
+
+        G_OBJECT_CLASS (poppler_ps_file_parent_class)->finalize (object);
 }
 
 /**
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index 156e2d7..2e0e44e 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -79,6 +79,8 @@ poppler_page_finalize (GObject *object)
   if (page->text != NULL) 
     page->text->decRefCnt();
   /* page->page is owned by the document */
+
+  G_OBJECT_CLASS (poppler_page_parent_class)->finalize (object);
 }
 
 /**


More information about the poppler mailing list