Rev 4680 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4680 | right-hear | 1 | #include "fitz.h" |
2 | #include "mupdf.h" |
||
3 | |||
4 | static pdf_outline * |
||
5 | pdf_load_outline_imp(pdf_xref *xref, fz_obj *dict) |
||
6 | { |
||
7 | pdf_outline *node; |
||
8 | fz_obj *obj; |
||
9 | |||
10 | if (fz_is_null(dict)) |
||
11 | return NULL; |
||
12 | |||
13 | node = fz_malloc(sizeof(pdf_outline)); |
||
14 | node->title = NULL; |
||
15 | node->link = NULL; |
||
16 | node->child = NULL; |
||
17 | node->next = NULL; |
||
18 | node->count = 0; |
||
19 | |||
20 | obj = fz_dict_gets(dict, "Title"); |
||
21 | if (obj) |
||
22 | node->title = pdf_to_utf8(obj); |
||
23 | |||
24 | obj = fz_dict_gets(dict, "Count"); |
||
25 | if (obj) |
||
26 | node->count = fz_to_int(obj); |
||
27 | |||
28 | if (fz_dict_gets(dict, "Dest") || fz_dict_gets(dict, "A")) |
||
29 | node->link = pdf_load_link(xref, dict); |
||
30 | |||
31 | obj = fz_dict_gets(dict, "First"); |
||
32 | if (obj) |
||
33 | node->child = pdf_load_outline_imp(xref, obj); |
||
34 | |||
35 | obj = fz_dict_gets(dict, "Next"); |
||
36 | if (obj) |
||
37 | node->next = pdf_load_outline_imp(xref, obj); |
||
38 | |||
39 | return node; |
||
40 | } |
||
41 | |||
42 | pdf_outline * |
||
43 | pdf_load_outline(pdf_xref *xref) |
||
44 | { |
||
45 | fz_obj *root, *obj, *first; |
||
46 | |||
47 | root = fz_dict_gets(xref->trailer, "Root"); |
||
48 | obj = fz_dict_gets(root, "Outlines"); |
||
49 | first = fz_dict_gets(obj, "First"); |
||
50 | if (first) |
||
51 | return pdf_load_outline_imp(xref, first); |
||
52 | |||
53 | return NULL; |
||
54 | } |
||
55 | |||
56 | void |
||
57 | pdf_free_outline(pdf_outline *outline) |
||
58 | { |
||
59 | if (outline->child) |
||
60 | pdf_free_outline(outline->child); |
||
61 | if (outline->next) |
||
62 | pdf_free_outline(outline->next); |
||
63 | if (outline->link) |
||
64 | pdf_free_link(outline->link); |
||
65 | fz_free(outline->title); |
||
66 | fz_free(outline); |
||
67 | } |
||
68 | |||
69 | void |
||
70 | pdf_debug_outline(pdf_outline *outline, int level) |
||
71 | { |
||
72 | int i; |
||
73 | while (outline) |
||
74 | { |
||
75 | for (i = 0; i < level; i++) |
||
76 | putchar(' '); |
||
77 | |||
78 | if (outline->title) |
||
79 | printf("%s ", outline->title); |
||
80 | else |
||
81 | printf(" |
||
82 | |||
83 | if (outline->link) |
||
84 | fz_debug_obj(outline->link->dest); |
||
85 | else |
||
86 | printf(" |
||
87 | |||
88 | if (outline->child) |
||
89 | pdf_debug_outline(outline->child, level + 2); |
||
90 | |||
91 | outline = outline->next; |
||
92 | } |
||
93 | }> |