summaryrefslogtreecommitdiff
path: root/pdf/pdf_outline.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2011-04-04 18:18:16 +0200
committerTor Andersson <tor.andersson@artifex.com>2011-04-04 18:18:16 +0200
commitf81e5ab22ba18963e56aad43c1c7fa9826935f3d (patch)
treecf3b261e90df51014755a8d1395116f839f73c95 /pdf/pdf_outline.c
parentc8d226b5bfb5dab2db10ea5175966de7bac9640e (diff)
downloadmupdf-f81e5ab22ba18963e56aad43c1c7fa9826935f3d.tar.xz
pdf: Rename mupdf directory.
Diffstat (limited to 'pdf/pdf_outline.c')
-rw-r--r--pdf/pdf_outline.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/pdf/pdf_outline.c b/pdf/pdf_outline.c
new file mode 100644
index 00000000..b211060f
--- /dev/null
+++ b/pdf/pdf_outline.c
@@ -0,0 +1,118 @@
+#include "fitz.h"
+#include "mupdf.h"
+
+static pdf_outline *
+pdf_loadoutlineimp(pdf_xref *xref, fz_obj *dict)
+{
+ pdf_outline *node;
+ fz_obj *obj;
+
+ if (fz_isnull(dict))
+ return nil;
+
+ node = fz_malloc(sizeof(pdf_outline));
+ node->title = nil;
+ node->link = nil;
+ node->child = nil;
+ node->next = nil;
+ node->count = 0;
+
+ pdf_logpage("load outline {\n");
+
+ obj = fz_dictgets(dict, "Title");
+ if (obj)
+ {
+ node->title = pdf_toutf8(obj);
+ pdf_logpage("title %s\n", node->title);
+ }
+
+ obj = fz_dictgets(dict, "Count");
+ if (obj)
+ {
+ node->count = fz_toint(obj);
+ }
+
+ if (fz_dictgets(dict, "Dest") || fz_dictgets(dict, "A"))
+ {
+ node->link = pdf_loadlink(xref, dict);
+ }
+
+ obj = fz_dictgets(dict, "First");
+ if (obj)
+ {
+ node->child = pdf_loadoutlineimp(xref, obj);
+ }
+
+ pdf_logpage("}\n");
+
+ obj = fz_dictgets(dict, "Next");
+ if (obj)
+ {
+ node->next = pdf_loadoutlineimp(xref, obj);
+ }
+
+ return node;
+}
+
+pdf_outline *
+pdf_loadoutline(pdf_xref *xref)
+{
+ pdf_outline *node;
+ fz_obj *root, *obj, *first;
+
+ pdf_logpage("load outlines {\n");
+
+ node = nil;
+
+ root = fz_dictgets(xref->trailer, "Root");
+ obj = fz_dictgets(root, "Outlines");
+ if (obj)
+ {
+ first = fz_dictgets(obj, "First");
+ if (first)
+ node = pdf_loadoutlineimp(xref, first);
+ }
+
+ pdf_logpage("}\n");
+
+ return node;
+}
+
+void
+pdf_freeoutline(pdf_outline *outline)
+{
+ if (outline->child)
+ pdf_freeoutline(outline->child);
+ if (outline->next)
+ pdf_freeoutline(outline->next);
+ if (outline->link)
+ pdf_freelink(outline->link);
+ fz_free(outline->title);
+ fz_free(outline);
+}
+
+void
+pdf_debugoutline(pdf_outline *outline, int level)
+{
+ int i;
+ while (outline)
+ {
+ for (i = 0; i < level; i++)
+ putchar(' ');
+
+ if (outline->title)
+ printf("%s ", outline->title);
+ else
+ printf("<nil> ");
+
+ if (outline->link)
+ fz_debugobj(outline->link->dest);
+ else
+ printf("<nil>\n");
+
+ if (outline->child)
+ pdf_debugoutline(outline->child, level + 2);
+
+ outline = outline->next;
+ }
+}