poppler/Annot.cc | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++--- poppler/Annot.h | 11 ++++++++ poppler/PDFDoc.cc | 15 +++++++--- poppler/XRef.cc | 15 ++++++++++ poppler/XRef.h | 2 + 5 files changed, 109 insertions(+), 8 deletions(-)
New commits: commit 06b6db92dd1ec32f9a55347073f8b533aa074ee1 Author: Fabio D'Urso <[email protected]> Date: Sun Mar 18 23:58:05 2012 +0100 Added XRef::removeIndirectObject diff --git a/poppler/PDFDoc.cc b/poppler/PDFDoc.cc index ecc5980..898bcbb 100644 --- a/poppler/PDFDoc.cc +++ b/poppler/PDFDoc.cc @@ -27,6 +27,7 @@ // Copyright (C) 2010 Srinivas Adicherla <[email protected]> // Copyright (C) 2010 Philip Lorenz <[email protected]> // Copyright (C) 2011, 2012 Thomas Freitag <[email protected]> +// Copyright (C) 2012 Fabio D'Urso <[email protected]> // // 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 @@ -841,14 +842,18 @@ void PDFDoc::saveIncrementalUpdate (OutStream* outStr) continue; if (xref->getEntry(i)->updated) { //we have an updated object - Object obj1; Ref ref; ref.num = i; ref.gen = xref->getEntry(i)->type == xrefEntryCompressed ? 0 : xref->getEntry(i)->gen; - xref->fetch(ref.num, ref.gen, &obj1); - Guint offset = writeObject(&obj1, &ref, outStr); - uxref->add(ref.num, ref.gen, offset, gTrue); - obj1.free(); + if (xref->getEntry(i)->type != xrefEntryFree) { + Object obj1; + xref->fetch(ref.num, ref.gen, &obj1); + Guint offset = writeObject(&obj1, &ref, outStr); + uxref->add(ref.num, ref.gen, offset, gTrue); + obj1.free(); + } else { + uxref->add(ref.num, ref.gen, 0, gFalse); + } } } if (uxref->getNumObjects() == 0) { //we have nothing to update diff --git a/poppler/XRef.cc b/poppler/XRef.cc index 699eb6b..60c2f9d 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -21,6 +21,7 @@ // Copyright (C) 2009, 2010 Ilya Gorenbein <[email protected]> // Copyright (C) 2010 Hib Eris <[email protected]> // Copyright (C) 2012 Thomas Freitag <[email protected]> +// Copyright (C) 2012 Fabio D'Urso <[email protected]> // // 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 @@ -1222,6 +1223,20 @@ Ref XRef::addIndirectObject (Object* o) { return r; } +void XRef::removeIndirectObject(Ref r) { + if (r.num < 0 || r.num >= size) { + error(errInternal, -1,"XRef::removeIndirectObject on unknown ref: {0:d}, {1:d}\n", r.num, r.gen); + return; + } + XRefEntry *e = getEntry(r.num); + if (e->type == xrefEntryFree) + return; + e->obj.free(); + e->type = xrefEntryFree; + e->gen++; + e->updated = true; +} + void XRef::writeToFile(OutStream* outStr, GBool writeAllEntries) { //create free entries linked-list if (getEntry(0)->gen != 65535) { diff --git a/poppler/XRef.h b/poppler/XRef.h index c7b20bd..ea2c1b4 100644 --- a/poppler/XRef.h +++ b/poppler/XRef.h @@ -20,6 +20,7 @@ // Copyright (C) 2010 Ilya Gorenbein <[email protected]> // Copyright (C) 2010 Hib Eris <[email protected]> // Copyright (C) 2012 Thomas Freitag <[email protected]> +// Copyright (C) 2012 Fabio D'Urso <[email protected]> // // 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 @@ -132,6 +133,7 @@ public: // Write access void setModifiedObject(Object* o, Ref r); Ref addIndirectObject (Object* o); + void removeIndirectObject(Ref r); void add(int num, int gen, Guint offs, GBool used); void writeToFile(OutStream* outStr, GBool writeAllEntries); commit a2e9b7c02ffa0e5edc4da18cc726993bc92fc684 Author: Fabio D'Urso <[email protected]> Date: Mon Mar 19 19:17:09 2012 +0100 Fix in AnnotMarkup's popup window handling AnnotPopup's ref was previously set to the *parent* annot, now it's correctly set to the *popup* annot's own. diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 9b1c710..405f5f6 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1573,7 +1573,7 @@ AnnotMarkup::~AnnotMarkup() { } void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) { - Object obj1; + Object obj1, obj2; if (dict->lookup("T", &obj1)->isString()) { label = obj1.getString()->copy(); @@ -1582,8 +1582,8 @@ void AnnotMarkup::initialize(PDFDoc *docA, Dict *dict, Object *obj) { } obj1.free(); - if (dict->lookup("Popup", &obj1)->isDict()) { - popup = new AnnotPopup(docA, obj1.getDict(), obj); + if (dict->lookup("Popup", &obj1)->isDict() && dict->lookupNF("Popup", &obj2)->isRef()) { + popup = new AnnotPopup(docA, obj1.getDict(), &obj2); } else { popup = NULL; } commit 05641304df67beae546a2fe18071f3be52707aa8 Author: Fabio D'Urso <[email protected]> Date: Mon Mar 19 20:56:45 2012 +0100 Basic Annot border editing support diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 208c43d..9b1c710 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -557,6 +557,16 @@ AnnotBorderArray::AnnotBorderArray(Array *array) { } } +void AnnotBorderArray::writeToObject(XRef *xref, Object *obj1) const { + Object obj2; + + obj1->initArray(xref); + obj1->arrayAdd(obj2.initReal( horizontalCorner )); + obj1->arrayAdd(obj2.initReal( verticalCorner )); + obj1->arrayAdd(obj2.initReal( width )); + // TODO: Dash array +} + //------------------------------------------------------------------------ // AnnotBorderBS //------------------------------------------------------------------------ @@ -1169,6 +1179,19 @@ void Annot::setFlags(Guint new_flags) { update ("F", &obj1); } +void Annot::setBorder(AnnotBorderArray *new_border) { + delete border; + + if (new_border) { + Object obj1; + new_border->writeToObject(xref, &obj1); + update ("Border", &obj1); + border = new_border; + } else { + border = NULL; + } +} + void Annot::setColor(AnnotColor *new_color) { delete color; diff --git a/poppler/Annot.h b/poppler/Annot.h index 611974c..8d40a8a 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -228,6 +228,8 @@ public: AnnotBorder(); virtual ~AnnotBorder(); + virtual void setWidth(double new_width) { width = new_width; } + virtual AnnotBorderType getType() const { return type; } virtual double getWidth() const { return width; } virtual int getDashLength() const { return dashLength; } @@ -254,6 +256,11 @@ public: AnnotBorderArray(); AnnotBorderArray(Array *array); + void writeToObject(XRef *xref, Object *dest) const; + + void setHorizontalCorner(double hc) { horizontalCorner = hc; } + void setVerticalCorner(double vc) { verticalCorner = vc; } + double getHorizontalCorner() const { return horizontalCorner; } double getVerticalCorner() const { return verticalCorner; } @@ -487,6 +494,8 @@ public: void setModified(GooString *new_date); void setFlags(Guint new_flags); + void setBorder(AnnotBorderArray *new_border); // Takes ownership + // The annotation takes the ownership of // new_color. void setColor(AnnotColor *new_color); commit 3e6275a05066c152b265cc27275d9e4107c089e9 Author: Fabio D'Urso <[email protected]> Date: Fri Mar 16 21:47:02 2012 +0100 Yet new setters to AnnotFreeText diff --git a/poppler/Annot.cc b/poppler/Annot.cc index f6eacbb..208c43d 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -2346,6 +2346,20 @@ void AnnotFreeText::initialize(PDFDoc *docA, Dict *dict) { obj1.free(); } +void AnnotFreeText::setAppearanceString(GooString *new_string) { + delete appearanceString; + + if (new_string) { + appearanceString = new GooString(new_string); + } else { + appearanceString = new GooString(); + } + + Object obj1; + obj1.initString(appearanceString->copy()); + update ("DA", &obj1); +} + void AnnotFreeText::setQuadding(AnnotFreeTextQuadding new_quadding) { Object obj1; quadding = new_quadding; @@ -2372,6 +2386,37 @@ void AnnotFreeText::setStyleString(GooString *new_string) { update ("DS", &obj1); } +void AnnotFreeText::setCalloutLine(AnnotCalloutLine *line) { + delete calloutLine; + + Object obj1; + if (line == NULL) { + obj1.initNull(); + calloutLine = NULL; + } else { + double x1 = line->getX1(), y1 = line->getY1(); + double x2 = line->getX2(), y2 = line->getY2(); + Object obj2; + obj1.initArray(xref); + obj1.arrayAdd( obj2.initReal(x1) ); + obj1.arrayAdd( obj2.initReal(y1) ); + obj1.arrayAdd( obj2.initReal(x2) ); + obj1.arrayAdd( obj2.initReal(y2) ); + + AnnotCalloutMultiLine *mline = dynamic_cast<AnnotCalloutMultiLine*>(line); + if (mline) { + double x3 = mline->getX3(), y3 = mline->getY3(); + obj1.arrayAdd( obj2.initReal(x3) ); + obj1.arrayAdd( obj2.initReal(y3) ); + calloutLine = new AnnotCalloutMultiLine(x1, y1, x2, y2, x3, y3); + } else { + calloutLine = new AnnotCalloutLine(x1, y1, x2, y2); + } + } + + update("CL", &obj1); +} + void AnnotFreeText::setIntent(AnnotFreeTextIntent new_intent) { Object obj1; diff --git a/poppler/Annot.h b/poppler/Annot.h index 5a2a7bc..611974c 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -807,8 +807,10 @@ public: AnnotFreeText(PDFDoc *docA, Dict *dict, Object *obj); ~AnnotFreeText(); + void setAppearanceString(GooString *new_string); void setQuadding(AnnotFreeTextQuadding new_quadding); void setStyleString(GooString *new_string); + void setCalloutLine(AnnotCalloutLine *line); void setIntent(AnnotFreeTextIntent new_intent); // getters _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
