diff options
Diffstat (limited to 'source/pdf/pdf-annot.c')
-rw-r--r-- | source/pdf/pdf-annot.c | 42 |
1 files changed, 27 insertions, 15 deletions
diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index 335f6512..eb999581 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -1,15 +1,20 @@ #include "mupdf/pdf.h" static pdf_obj * -resolve_dest_rec(pdf_document *doc, pdf_obj *dest, int depth) +resolve_dest_rec(pdf_document *doc, pdf_obj *dest, fz_link_kind kind, int depth) { if (depth > 10) /* Arbitrary to avoid infinite recursion */ return NULL; if (pdf_is_name(dest) || pdf_is_string(dest)) { - dest = pdf_lookup_dest(doc, dest); - return resolve_dest_rec(doc, dest, depth+1); + if (kind == FZ_LINK_GOTO) + { + dest = pdf_lookup_dest(doc, dest); + dest = resolve_dest_rec(doc, dest, kind, depth+1); + } + + return dest; } else if (pdf_is_array(dest)) @@ -20,7 +25,7 @@ resolve_dest_rec(pdf_document *doc, pdf_obj *dest, int depth) else if (pdf_is_dict(dest)) { dest = pdf_dict_gets(dest, "D"); - return resolve_dest_rec(doc, dest, depth+1); + return resolve_dest_rec(doc, dest, kind, depth+1); } else if (pdf_is_indirect(dest)) @@ -30,13 +35,13 @@ resolve_dest_rec(pdf_document *doc, pdf_obj *dest, int depth) } static pdf_obj * -resolve_dest(pdf_document *doc, pdf_obj *dest) +resolve_dest(pdf_document *doc, pdf_obj *dest, fz_link_kind kind) { - return resolve_dest_rec(doc, dest, 0); + return resolve_dest_rec(doc, dest, kind, 0); } fz_link_dest -pdf_parse_link_dest(pdf_document *doc, pdf_obj *dest) +pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest) { fz_link_dest ld; pdf_obj *obj; @@ -49,17 +54,25 @@ pdf_parse_link_dest(pdf_document *doc, pdf_obj *dest) int t_from_2 = 0; int z_from_4 = 0; - ld.kind = FZ_LINK_GOTO; + ld.kind = kind; ld.ld.gotor.flags = 0; ld.ld.gotor.lt.x = 0; ld.ld.gotor.lt.y = 0; ld.ld.gotor.rb.x = 0; ld.ld.gotor.rb.y = 0; + ld.ld.gotor.page = -1; + ld.ld.gotor.dest = NULL; - dest = resolve_dest(doc, dest); - if (dest == NULL || !pdf_is_array(dest)) + dest = resolve_dest(doc, dest, kind); + + if (pdf_is_name(dest)) + { + ld.ld.gotor.dest = pdf_to_name(dest); + return ld; + } + else if (pdf_is_string(dest)) { - ld.kind = FZ_LINK_NONE; + ld.ld.gotor.dest = pdf_to_str_buf(dest); return ld; } @@ -244,7 +257,7 @@ pdf_parse_action(pdf_document *doc, pdf_obj *action) if (!strcmp(pdf_to_name(obj), "GoTo")) { dest = pdf_dict_gets(action, "D"); - ld = pdf_parse_link_dest(doc, dest); + ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, dest); } else if (!strcmp(pdf_to_name(obj), "URI")) { @@ -269,9 +282,8 @@ pdf_parse_action(pdf_document *doc, pdf_obj *action) else if (!strcmp(pdf_to_name(obj), "GoToR")) { dest = pdf_dict_gets(action, "D"); - ld = pdf_parse_link_dest(doc, dest); - ld.kind = FZ_LINK_GOTOR; file_spec = pdf_dict_gets(action, "F"); + ld = pdf_parse_link_dest(doc, FZ_LINK_GOTOR, dest); ld.ld.gotor.file_spec = pdf_parse_file_spec(doc, file_spec); ld.ld.gotor.new_window = pdf_to_int(pdf_dict_gets(action, "NewWindow")); } @@ -298,7 +310,7 @@ pdf_load_link(pdf_document *doc, pdf_obj *dict, const fz_matrix *page_ctm) obj = pdf_dict_gets(dict, "Dest"); if (obj) - ld = pdf_parse_link_dest(doc, obj); + ld = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj); else { action = pdf_dict_gets(dict, "A"); |