summaryrefslogtreecommitdiff
path: root/poppler/XRef.cc
diff options
context:
space:
mode:
authorJulien Rebetez <julien@fhtagn.net>2008-01-19 12:50:49 +0100
committerAlbert Astals Cid <tsdgeos@bluebox.localdomain>2008-01-19 12:50:49 +0100
commitd80736587fdbc0e163077f27bfd21c5e3a7fa4c7 (patch)
tree5213fe868cecbcd3a2fd6d9a04ab8664da93754a /poppler/XRef.cc
parent8bd00dd0872191b8806e9411d9a1adc441f08a47 (diff)
Adds addIndirectObject method to XRef. This method allow the creation of new indirect objects.
Diffstat (limited to 'poppler/XRef.cc')
-rw-r--r--poppler/XRef.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/poppler/XRef.cc b/poppler/XRef.cc
index b84e198e..4f239ddc 100644
--- a/poppler/XRef.cc
+++ b/poppler/XRef.cc
@@ -1023,6 +1023,45 @@ void XRef::setModifiedObject (Object* o, Ref r) {
o->copy(&entries[r.num].obj);
}
+Ref XRef::addIndirectObject (Object* o) {
+ //Find the next free entry
+ // lastEntry is the last free entry we encountered,
+ // entry 0 is always free
+ int lastEntry = 0;
+ int newEntry = entries[0].offset;
+
+ do {
+ lastEntry = newEntry;
+ newEntry = entries[newEntry].offset;
+ //we are looking for a free entry that we can reuse
+ //(=> gen number != 65535)
+ } while ((newEntry != 0) && (entries[newEntry].gen == 65535));
+
+ //the linked list of free entry is empty => create a new one
+ if (newEntry == 0) {
+ newEntry = size;
+ size++;
+ entries = (XRefEntry *)greallocn(entries, size, sizeof(XRefEntry));
+ entries[newEntry].gen = 0;
+ entries[newEntry].num = newEntry;
+ } else { //reuse a free entry
+ //'remove' the entry we are using from the free entry linked list
+ entries[lastEntry].offset = entries[newEntry].offset;
+ entries[newEntry].num = newEntry;
+ //we don't touch gen number, because it should have been
+ //incremented when the object was deleted
+ }
+
+ entries[newEntry].type = xrefEntryUncompressed;
+ o->copy(&entries[newEntry].obj);
+
+ Ref r;
+ r.num = entries[newEntry].num;
+ r.gen = entries[newEntry].gen;
+ return r;
+}
+
+
//used to sort the entries
int compare (const void* a, const void* b)
{