Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/xpdf/Outline.cc
diff options
context:
space:
mode:
Diffstat (limited to 'pdf/xpdf/Outline.cc')
-rw-r--r--pdf/xpdf/Outline.cc19
1 files changed, 15 insertions, 4 deletions
diff --git a/pdf/xpdf/Outline.cc b/pdf/xpdf/Outline.cc
index 23efed1..b7e0645 100644
--- a/pdf/xpdf/Outline.cc
+++ b/pdf/xpdf/Outline.cc
@@ -22,15 +22,17 @@
//------------------------------------------------------------------------
Outline::Outline(Object *outlineObj, XRef *xref) {
- Object first;
+ Object first, last;
items = NULL;
if (!outlineObj->isDict()) {
return;
}
items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first),
+ outlineObj->dictLookupNF("Last", &last),
xref);
first.free();
+ last.free();
}
Outline::~Outline() {
@@ -68,6 +70,8 @@ OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) {
title[i] = pdfDocEncoding[s->getChar(i) & 0xff];
}
}
+ } else {
+ titleLen = 0;
}
obj1.free();
@@ -82,6 +86,7 @@ OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) {
obj1.free();
dict->lookupNF("First", &firstRef);
+ dict->lookupNF("Last", &lastRef);
dict->lookupNF("Next", &nextRef);
startsOpen = gFalse;
@@ -102,17 +107,19 @@ OutlineItem::~OutlineItem() {
delete action;
}
firstRef.free();
+ lastRef.free();
nextRef.free();
}
-GList *OutlineItem::readItemList(Object *itemRef, XRef *xrefA) {
+GList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
+ XRef *xrefA) {
GList *items;
OutlineItem *item;
Object obj;
Object *p;
items = new GList();
- p = itemRef;
+ p = firstItemRef;
while (p->isRef()) {
if (!p->fetch(xrefA, &obj)->isDict()) {
obj.free();
@@ -121,6 +128,10 @@ GList *OutlineItem::readItemList(Object *itemRef, XRef *xrefA) {
item = new OutlineItem(obj.getDict(), xrefA);
obj.free();
items->append(item);
+ if (p->getRef().num == lastItemRef->getRef().num &&
+ p->getRef().gen == lastItemRef->getRef().gen) {
+ break;
+ }
p = &item->nextRef;
}
return items;
@@ -128,7 +139,7 @@ GList *OutlineItem::readItemList(Object *itemRef, XRef *xrefA) {
void OutlineItem::open() {
if (!kids) {
- kids = readItemList(&firstRef, xref);
+ kids = readItemList(&firstRef, &lastRef, xref);
}
}