diff options
Diffstat (limited to 'pdf/xpdf/Outline.cc')
-rw-r--r-- | pdf/xpdf/Outline.cc | 19 |
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); } } |