X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=pdf%2Fxpdf%2FOutline.cc;h=b7e064586a6e9b7d49db6fa7253c54fbd74aabfb;hb=f36af012943a93a0c8e1f2d36c4f5b9e1ac1b8e5;hp=23efed18aa2b9ba30d004bea7355fa2237220ff5;hpb=69ad906d9eb8623a3d280532662a0255056e4669;p=evince.git diff --git a/pdf/xpdf/Outline.cc b/pdf/xpdf/Outline.cc index 23efed18..b7e06458 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); } }