static fz_obj * resolvedest(pdf_xref *xref, fz_obj *dest) { if (fz_isname(dest) || fz_isstring(dest)) { dest = pdf_lookupdest(xref, dest); return resolvedest(xref, dest); } else if (fz_isarray(dest)) { return dest; /* cf. http://code.google.com/p/sumatrapdf/issues/detail?id=275 */ } else if (fz_isdict(dest)) { dest = fz_dictgets(dest, "D"); return resolvedest(xref, dest); } else if (fz_isindirect(dest)) return dest; return nil; }
static fz_obj * resolvedest(pdf_xref *xref, fz_obj *dest) { if (fz_isname(dest) || fz_isstring(dest)) { dest = pdf_lookupdest(xref, dest); return resolvedest(xref, dest); } else if (fz_isarray(dest)) { return fz_arrayget(dest, 0); } else if (fz_isdict(dest)) { dest = fz_dictgets(dest, "D"); return resolvedest(xref, dest); } else if (fz_isindirect(dest)) return dest; return nil; }
static fz_obj * resolvedest(pdf_xref *xref, fz_obj *dest) { if (fz_isname(dest)) { dest = fz_dictget(xref->dests, dest); if (dest) pdf_resolve(&dest, xref); /* XXX */ return resolvedest(xref, dest); } else if (fz_isstring(dest)) { dest = fz_dictget(xref->dests, dest); if (dest) pdf_resolve(&dest, xref); /* XXX */ return resolvedest(xref, dest); } else if (fz_isarray(dest)) { return fz_arrayget(dest, 0); } else if (fz_isdict(dest)) { dest = fz_dictgets(dest, "D"); return resolvedest(xref, dest); } else if (fz_isindirect(dest)) return dest; return nil; }
pdf_link * pdf_loadlink(pdf_xref *xref, fz_obj *dict) { fz_obj *dest; fz_obj *action; fz_obj *obj; fz_rect bbox; pdf_linkkind kind; pdf_logpage("load link {\n"); dest = nil; obj = fz_dictgets(dict, "Rect"); if (obj) { bbox = pdf_torect(obj); pdf_logpage("rect [%g %g %g %g]\n", bbox.x0, bbox.y0, bbox.x1, bbox.y1); } else bbox = fz_emptyrect; obj = fz_dictgets(dict, "Dest"); if (obj) { kind = PDF_LGOTO; dest = resolvedest(xref, obj); pdf_logpage("dest (%d %d R)\n", fz_tonum(dest), fz_togen(dest)); } action = fz_dictgets(dict, "A"); if (action) { obj = fz_dictgets(action, "S"); if (fz_isname(obj) && !strcmp(fz_toname(obj), "GoTo")) { kind = PDF_LGOTO; dest = resolvedest(xref, fz_dictgets(action, "D")); pdf_logpage("action goto (%d %d R)\n", fz_tonum(dest), fz_togen(dest)); } else if (fz_isname(obj) && !strcmp(fz_toname(obj), "URI")) { kind = PDF_LURI; dest = fz_dictgets(action, "URI"); pdf_logpage("action uri %s\n", fz_tostrbuf(dest)); } /* cf. http://code.google.com/p/sumatrapdf/issues/detail?id=726 */ else if (fz_isname(obj) && !strcmp(fz_toname(obj), "Launch")) { kind = PDF_LLAUNCH; dest = fz_dictgets(action, "F"); pdf_logpage("action launch (%d %d R)\n", fz_tonum(dest), fz_togen(dest)); } else { pdf_logpage("unhandled link action, ignoring link\n"); dest = nil; } } pdf_logpage("}\n"); if (dest) { return pdf_newlink(kind, bbox, dest); } return nil; }
fz_error pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict) { fz_error error; pdf_link *link; fz_obj *dest; fz_obj *action; fz_obj *obj; fz_rect bbox; pdf_linkkind kind; pdf_logpage("load link {\n"); link = nil; dest = nil; obj = fz_dictgets(dict, "Rect"); if (obj) { bbox = pdf_torect(obj); pdf_logpage("rect [%g %g %g %g]\n", bbox.x0, bbox.y0, bbox.x1, bbox.y1); } else bbox = fz_emptyrect; obj = fz_dictgets(dict, "Dest"); if (obj) { kind = PDF_LGOTO; dest = resolvedest(xref, obj); pdf_logpage("dest (%d %d R)\n", fz_tonum(dest), fz_togen(dest)); } action = fz_dictgets(dict, "A"); if (action) { obj = fz_dictgets(action, "S"); if (fz_isname(obj) && !strcmp(fz_toname(obj), "GoTo")) { kind = PDF_LGOTO; dest = resolvedest(xref, fz_dictgets(action, "D")); pdf_logpage("action goto (%d %d R)\n", fz_tonum(dest), fz_togen(dest)); } else if (fz_isname(obj) && !strcmp(fz_toname(obj), "URI")) { kind = PDF_LURI; dest = fz_dictgets(action, "URI"); pdf_logpage("action uri %s\n", fz_tostrbuf(dest)); } else { pdf_logpage("unhandled link action, ignoring link\n"); dest = nil; } } pdf_logpage("}\n"); if (dest) { error = pdf_newlink(&link, kind, bbox, dest); if (error) return fz_rethrow(error, "cannot create link"); *linkp = link; } return fz_okay; }
fz_error * pdf_loadlink(pdf_link **linkp, pdf_xref *xref, fz_obj *dict) { fz_error *error; pdf_link *link; fz_obj *dest; fz_obj *action; fz_obj *obj; fz_rect bbox; pdf_linkkind kind; pdf_logpage("load link {\n"); link = nil; dest = nil; obj = fz_dictgets(dict, "Rect"); if (obj) { bbox = pdf_torect(obj); pdf_logpage("rect [%g %g %g %g]\n", bbox.x0, bbox.y0, bbox.x1, bbox.y1); } else bbox = fz_emptyrect; obj = fz_dictgets(dict, "Dest"); if (obj) { error = pdf_resolve(&obj, xref); if (error) return error; dest = resolvedest(xref, obj); pdf_logpage("dest %d %d R\n", fz_tonum(dest), fz_togen(dest)); fz_dropobj(obj); } kind = PDF_LUNKNOWN; action = fz_dictgets(dict, "A"); if (action) { error = pdf_resolve(&action, xref); if (error) return error; obj = fz_dictgets(action, "S"); if (!strcmp(fz_toname(obj), "GoTo")) { kind = PDF_LGOTO; dest = resolvedest(xref, fz_dictgets(action, "D")); pdf_logpage("action goto %d %d R\n", fz_tonum(dest), fz_togen(dest)); } else if (!strcmp(fz_toname(obj), "URI")) { kind = PDF_LURI; dest = fz_dictgets(action, "URI"); pdf_logpage("action uri %s\n", fz_tostrbuf(dest)); } else pdf_logpage("action ... ?\n"); fz_dropobj(action); } pdf_logpage("}\n"); if (dest) { error = pdf_newlink(&link, bbox, dest, kind); if (error) return error; *linkp = link; } return nil; }