summaryrefslogtreecommitdiff
path: root/source/fitz
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz')
-rw-r--r--source/fitz/document.c9
-rw-r--r--source/fitz/link.c58
-rw-r--r--source/fitz/outline.c6
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;