diff options
-rw-r--r-- | include/mupdf/fitz/link.h | 10 | ||||
-rw-r--r-- | include/mupdf/pdf/annot.h | 2 | ||||
-rw-r--r-- | source/pdf/pdf-annot.c | 42 | ||||
-rw-r--r-- | source/pdf/pdf-outline.c | 2 |
4 files changed, 38 insertions, 18 deletions
diff --git a/include/mupdf/fitz/link.h b/include/mupdf/fitz/link.h index 65a77fd2..7a400851 100644 --- a/include/mupdf/fitz/link.h +++ b/include/mupdf/fitz/link.h @@ -47,7 +47,14 @@ enum { For FZ_LINK_GOTO or FZ_LINK_GOTOR: gotor.page: The target page number to move to (0 being the - first page in the document). + first page in the document). In the FZ_LINK_GOTOR case, the + page number either refers to to the file specified by + gotor.file_spec, or the page number is -1 suggesting that + the destination is given by gotor.dest. + + gotor.dest: If set, the target destination name to be + resolved in the file specified by gotor.file_spec. Always + NULL in the FZ_LINK_GOTO case. gotor.flags: A bitfield consisting of fz_link_flag_* describing the validity and meaning of the different parts @@ -97,6 +104,7 @@ struct fz_link_dest_s struct { int page; + char *dest; int flags; fz_point lt; fz_point rb; diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h index d6950970..bf912ef9 100644 --- a/include/mupdf/pdf/annot.h +++ b/include/mupdf/pdf/annot.h @@ -56,7 +56,7 @@ struct pdf_annot_s int widget_type; }; -fz_link_dest pdf_parse_link_dest(pdf_document *doc, pdf_obj *dest); +fz_link_dest pdf_parse_link_dest(pdf_document *doc, fz_link_kind kind, pdf_obj *dest); fz_link_dest pdf_parse_action(pdf_document *doc, pdf_obj *action); pdf_obj *pdf_lookup_dest(pdf_document *doc, pdf_obj *needle); pdf_obj *pdf_lookup_name(pdf_document *doc, char *which, pdf_obj *needle); 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"); diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c index 2d545b63..1e01b692 100644 --- a/source/pdf/pdf-outline.c +++ b/source/pdf/pdf-outline.c @@ -32,7 +32,7 @@ pdf_load_outline_imp(pdf_document *doc, pdf_obj *dict) node->title = pdf_to_utf8(doc, obj); if ((obj = pdf_dict_gets(dict, "Dest"))) - node->dest = pdf_parse_link_dest(doc, obj); + node->dest = pdf_parse_link_dest(doc, FZ_LINK_GOTO, obj); else if ((obj = pdf_dict_gets(dict, "A"))) node->dest = pdf_parse_action(doc, obj); |