diff options
Diffstat (limited to 'source/fitz')
-rw-r--r-- | source/fitz/document.c | 9 | ||||
-rw-r--r-- | source/fitz/link.c | 58 | ||||
-rw-r--r-- | source/fitz/outline.c | 6 |
3 files changed, 32 insertions, 41 deletions
diff --git a/source/fitz/document.c b/source/fitz/document.c index 43fcb133..87ad3884 100644 --- a/source/fitz/document.c +++ b/source/fitz/document.c @@ -215,6 +215,15 @@ fz_load_outline(fz_context *ctx, fz_document *doc) return NULL; } +int +fz_resolve_link(fz_context *ctx, fz_document *doc, const char *uri) +{ + fz_ensure_layout(ctx, doc); + if (doc && doc->resolve_link) + return doc->resolve_link(ctx, doc, uri); + return -1; +} + void fz_layout_document(fz_context *ctx, fz_document *doc, float w, float h, float em) { diff --git a/source/fitz/link.c b/source/fitz/link.c index eaed1402..430c9bfe 100644 --- a/source/fitz/link.c +++ b/source/fitz/link.c @@ -1,51 +1,25 @@ #include "mupdf/fitz.h" -void -fz_drop_link_dest(fz_context *ctx, fz_link_dest *dest) -{ - if (!dest) - return; - - switch (dest->kind) - { - case FZ_LINK_NONE: - break; - case FZ_LINK_GOTO: - fz_free(ctx, dest->ld.gotor.dest); - break; - case FZ_LINK_URI: - fz_free(ctx, dest->ld.uri.uri); - break; - case FZ_LINK_LAUNCH: - fz_free(ctx, dest->ld.launch.file_spec); - break; - case FZ_LINK_NAMED: - fz_free(ctx, dest->ld.named.named); - break; - case FZ_LINK_GOTOR: - fz_free(ctx, dest->ld.gotor.file_spec); - break; - } -} - fz_link * -fz_new_link(fz_context *ctx, const fz_rect *bbox, fz_link_dest dest) +fz_new_link(fz_context *ctx, const fz_rect *bbox, void *doc, const char *uri) { fz_link *link; + link = fz_malloc_struct(ctx, fz_link); + link->refs = 1; + link->rect = *bbox; + link->next = NULL; + link->doc = doc; /* don't take reference */ + link->uri = NULL; + fz_try(ctx) - { - link = fz_malloc_struct(ctx, fz_link); - link->refs = 1; - } + link->uri = fz_strdup(ctx, uri); fz_catch(ctx) { - fz_drop_link_dest(ctx, &dest); + fz_drop_link(ctx, link); fz_rethrow(ctx); } - link->dest = dest; - link->rect = *bbox; - link->next = NULL; + return link; } @@ -61,8 +35,16 @@ fz_drop_link(fz_context *ctx, fz_link *link) while (fz_drop_imp(ctx, link, &link->refs)) { fz_link *next = link->next; - fz_drop_link_dest(ctx, &link->dest); + fz_free(ctx, link->uri); fz_free(ctx, link); link = next; } } + +int +fz_is_external_link(fz_context *ctx, const char *uri) +{ + while (*uri >= 'a' && *uri <= 'z') + ++uri; + return uri[0] == ':' && uri[1] == '/' && uri[2] == '/'; +} diff --git a/source/fitz/outline.c b/source/fitz/outline.c index 257c44c1..888212bc 100644 --- a/source/fitz/outline.c +++ b/source/fitz/outline.c @@ -22,7 +22,7 @@ fz_drop_outline(fz_context *ctx, fz_outline *outline) fz_outline *next = outline->next; fz_drop_outline(ctx, outline->down); fz_free(ctx, outline->title); - fz_drop_link_dest(ctx, &outline->dest); + fz_free(ctx, outline->uri); fz_free(ctx, outline); outline = next; } @@ -33,7 +33,7 @@ fz_debug_outline_xml_imp(fz_context *ctx, fz_output *out, fz_outline *outline, i { while (outline) { - fz_printf(ctx, out, "<outline title=%q page=\"%d\"", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0); + fz_printf(ctx, out, "<outline title=%q uri=\"%s\"", outline->title, outline->uri); if (outline->down) { fz_printf(ctx, out, ">\n"); @@ -62,7 +62,7 @@ fz_print_outline_imp(fz_context *ctx, fz_output *out, fz_outline *outline, int l { for (i = 0; i < level; i++) fz_printf(ctx, out, "\t"); - fz_printf(ctx, out, "%s\t%d\n", outline->title, outline->dest.kind == FZ_LINK_GOTO ? outline->dest.ld.gotor.page + 1 : 0); + fz_printf(ctx, out, "%s\t%s\n", outline->title, outline->uri); if (outline->down) fz_print_outline_imp(ctx, out, outline->down, level + 1); outline = outline->next; |