]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/Outline.cc
add prototype.
[evince.git] / pdf / xpdf / Outline.cc
index 23efed18aa2b9ba30d004bea7355fa2237220ff5..b7e064586a6e9b7d49db6fa7253c54fbd74aabfb 100644 (file)
 //------------------------------------------------------------------------
 
 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);
   }
 }