SmartPDF - lightweight pdf viewer app for rosapps
[reactos.git] / rosapps / smartpdf / fitz / mupdf / pdf_outline.c
1 #include <fitz.h>
2 #include <mupdf.h>
3
4 static fz_error *
5 loadoutline(pdf_outline **nodep, pdf_xref *xref, fz_obj *dict)
6 {
7 fz_error *error;
8 pdf_outline *node;
9 fz_obj *obj;
10
11 node = fz_malloc(sizeof(pdf_outline));
12 node->title = "<unknown>";
13 node->link = nil;
14 node->child = nil;
15 node->next = nil;
16
17 pdf_logpage("load outline {\n");
18
19 obj = fz_dictgets(dict, "Title");
20 if (obj)
21 {
22 error = pdf_toutf8(&node->title, obj);
23 if (error)
24 return error;
25 pdf_logpage("title %s\n", node->title);
26 }
27
28 if (fz_dictgets(dict, "Dest") || fz_dictgets(dict, "A"))
29 {
30 error = pdf_loadlink(&node->link, xref, dict);
31 if (error)
32 return error;
33 }
34
35 obj = fz_dictgets(dict, "First");
36 if (obj)
37 {
38 error = pdf_resolve(&obj, xref);
39 if (error)
40 return error;
41 error = loadoutline(&node->child, xref, obj);
42 fz_dropobj(obj);
43 if (error)
44 return error;
45 }
46
47 pdf_logpage("}\n");
48
49 obj = fz_dictgets(dict, "Next");
50 if (obj)
51 {
52 error = pdf_resolve(&obj, xref);
53 if (error)
54 return error;
55 error = loadoutline(&node->next, xref, obj);
56 fz_dropobj(obj);
57 if (error)
58 return error;
59 }
60
61 *nodep = node;
62 return nil;
63 }
64
65 fz_error *
66 pdf_loadoutline(pdf_outline **nodep, pdf_xref *xref)
67 {
68 fz_error *error;
69 pdf_outline *node;
70 fz_obj *obj;
71 fz_obj *first;
72
73 pdf_logpage("load outlines {\n");
74
75 node = nil;
76
77 obj = fz_dictgets(xref->root, "Outlines");
78 if (obj)
79 {
80 error = pdf_resolve(&obj, xref);
81 if (error)
82 return error;
83
84 first = fz_dictgets(obj, "First");
85 if (first)
86 {
87 error = pdf_resolve(&first, xref);
88 fz_dropobj(obj);
89 if (error)
90 return error;
91 error = loadoutline(&node, xref, first);
92 fz_dropobj(first);
93 if (error)
94 return error;
95 }
96 else
97 fz_dropobj(obj);
98 }
99
100 pdf_logpage("}\n");
101
102 *nodep = node;
103 return nil;
104 }
105
106 void
107 pdf_dropoutline(pdf_outline *outline)
108 {
109 if (outline->child)
110 pdf_dropoutline(outline->child);
111 if (outline->next)
112 pdf_dropoutline(outline->next);
113 pdf_droplink(outline->link);
114 fz_free(outline->title);
115 fz_free(outline);
116 }
117
118 void
119 pdf_debugoutline(pdf_outline *outline, int level)
120 {
121 int i;
122 while (outline)
123 {
124 for (i = 0; i < level; i++)
125 putchar(' ');
126
127 printf("%s ", outline->title);
128
129 if (outline->link)
130 fz_debugobj(outline->link->dest);
131 else
132 printf("<nil>");
133
134 printf("\n");
135
136 if (outline->child)
137 pdf_debugoutline(outline->child, level + 2);
138
139 outline = outline->next;
140 }
141 }
142