X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=pdf%2Fxpdf%2FOutline.cc;h=b7e064586a6e9b7d49db6fa7253c54fbd74aabfb;hb=5932479cc8c371a385616b5909df558a091b7111;hp=267c6a04af3ffcb1997bc0c67d81fe92b7d0f71f;hpb=9ac495d6543dbd65992791bb41d5f8fbf90e549c;p=evince.git diff --git a/pdf/xpdf/Outline.cc b/pdf/xpdf/Outline.cc index 267c6a04..b7e06458 100644 --- a/pdf/xpdf/Outline.cc +++ b/pdf/xpdf/Outline.cc @@ -2,7 +2,7 @@ // // Outline.cc // -// Copyright 2002 Glyph & Cog, LLC +// Copyright 2002-2003 Glyph & Cog, LLC // //======================================================================== @@ -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() { @@ -42,7 +44,7 @@ Outline::~Outline() { //------------------------------------------------------------------------ OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { - Object obj1; + Object obj1, obj2; GString *s; int i; @@ -68,20 +70,23 @@ OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) { title[i] = pdfDocEncoding[s->getChar(i) & 0xff]; } } + } else { + titleLen = 0; } obj1.free(); if (!dict->lookup("Dest", &obj1)->isNull()) { action = LinkAction::parseDest(&obj1); } else { - obj1.free(); - if (dict->lookup("A", &obj1)) { - action = LinkAction::parseAction(&obj1); - } + obj1.free(); + dict->lookup("A", &obj1); + if (!obj1.isNull()) + action = LinkAction::parseAction(&obj1); } 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); } }