summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-10-17 17:13:32 +0200
committerTor Andersson <tor.andersson@artifex.com>2016-10-28 16:18:38 +0200
commit8a07b7fb14f11204a0d840792ab9f4bd54b066e5 (patch)
treee617a898c17aeb353f35d7b362ca2de290cf2b82 /platform
parent4029b45e494634361a4205f8896ec429d11e990a (diff)
downloadmupdf-8a07b7fb14f11204a0d840792ab9f4bd54b066e5.tar.xz
Clean up link destination handling.
All link destinations should be URIs, and a document specific function can be called to resolve them to actual page numbers. Outlines have cached page numbers as well as string URIs.
Diffstat (limited to 'platform')
-rw-r--r--platform/android/viewer/jni/mupdf.c62
-rw-r--r--platform/gl/gl-main.c17
-rw-r--r--platform/ios/Classes/MuDocumentController.m13
-rw-r--r--platform/ios/Classes/MuHitView.m11
-rw-r--r--platform/java/mupdf_native.c22
-rw-r--r--platform/x11/pdfapp.c8
6 files changed, 53 insertions, 80 deletions
diff --git a/platform/android/viewer/jni/mupdf.c b/platform/android/viewer/jni/mupdf.c
index 383228e1..ba992a43 100644
--- a/platform/android/viewer/jni/mupdf.c
+++ b/platform/android/viewer/jni/mupdf.c
@@ -1116,9 +1116,7 @@ countOutlineItems(fz_outline *outline)
while (outline)
{
- if (outline->dest.kind == FZ_LINK_GOTO
- && outline->dest.ld.gotor.page >= 0
- && outline->title)
+ if (outline->page >= 0 && outline->title)
count++;
count += countOutlineItems(outline->down);
@@ -1133,21 +1131,18 @@ fillInOutlineItems(JNIEnv * env, jclass olClass, jmethodID ctor, jobjectArray ar
{
while (outline)
{
- if (outline->dest.kind == FZ_LINK_GOTO)
+ int page = outline->page;
+ if (page >= 0 && outline->title)
{
- int page = outline->dest.ld.gotor.page;
- if (page >= 0 && outline->title)
- {
- jobject ol;
- jstring title = (*env)->NewStringUTF(env, outline->title);
- if (title == NULL) return -1;
- ol = (*env)->NewObject(env, olClass, ctor, level, title, page);
- if (ol == NULL) return -1;
- (*env)->SetObjectArrayElement(env, arr, pos, ol);
- (*env)->DeleteLocalRef(env, ol);
- (*env)->DeleteLocalRef(env, title);
- pos++;
- }
+ jobject ol;
+ jstring title = (*env)->NewStringUTF(env, outline->title);
+ if (title == NULL) return -1;
+ ol = (*env)->NewObject(env, olClass, ctor, level, title, page);
+ if (ol == NULL) return -1;
+ (*env)->SetObjectArrayElement(env, arr, pos, ol);
+ (*env)->DeleteLocalRef(env, ol);
+ (*env)->DeleteLocalRef(env, title);
+ pos++;
}
pos = fillInOutlineItems(env, olClass, ctor, arr, pos, outline->down, level+1);
if (pos < 0) return -1;
@@ -1857,13 +1852,8 @@ JNI_FN(MuPDFCore_getPageLinksInternal)(JNIEnv * env, jobject thiz, int pageNumbe
count = 0;
for (link = list; link; link = link->next)
{
- switch (link->dest.kind)
- {
- case FZ_LINK_GOTO:
- case FZ_LINK_GOTOR:
- case FZ_LINK_URI:
+ if (link->uri)
count++ ;
- }
}
arr = (*env)->NewObjectArray(env, count, linkInfoClass, NULL);
@@ -1879,36 +1869,18 @@ JNI_FN(MuPDFCore_getPageLinksInternal)(JNIEnv * env, jobject thiz, int pageNumbe
fz_rect rect = link->rect;
fz_transform_rect(&rect, &ctm);
- switch (link->dest.kind)
- {
- case FZ_LINK_GOTO:
+ if (!fz_is_external_link(ctx, link->uri))
{
linkInfo = (*env)->NewObject(env, linkInfoInternalClass, ctorInternal,
(float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1,
- link->dest.ld.gotor.page);
- break;
- }
-
- case FZ_LINK_GOTOR:
- {
- jstring juri = (*env)->NewStringUTF(env, link->dest.ld.gotor.file_spec);
- linkInfo = (*env)->NewObject(env, linkInfoRemoteClass, ctorRemote,
- (float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1,
- juri, link->dest.ld.gotor.page, link->dest.ld.gotor.new_window ? JNI_TRUE : JNI_FALSE);
- break;
+ fz_resolve_link(ctx, link->doc, link->uri));
}
-
- case FZ_LINK_URI:
+ else
{
- jstring juri = (*env)->NewStringUTF(env, link->dest.ld.uri.uri);
+ jstring juri = (*env)->NewStringUTF(env, link->uri);
linkInfo = (*env)->NewObject(env, linkInfoExternalClass, ctorExternal,
(float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1,
juri);
- break;
- }
-
- default:
- continue;
}
if (linkInfo == NULL)
diff --git a/platform/gl/gl-main.c b/platform/gl/gl-main.c
index 34d061be..9084827c 100644
--- a/platform/gl/gl-main.c
+++ b/platform/gl/gl-main.c
@@ -464,10 +464,9 @@ static int do_outline_imp(fz_outline *node, int end, int x0, int x1, int x, int
while (node)
{
- if (node->dest.kind == FZ_LINK_GOTO)
+ p = node->page;
+ if (p >= 0)
{
- p = node->dest.ld.gotor.page;
-
if (ui.x >= x0 && ui.x < x1 && ui.y >= y + h && ui.y < y + h + ui.lineheight)
{
ui.hot = node;
@@ -480,9 +479,9 @@ static int do_outline_imp(fz_outline *node, int end, int x0, int x1, int x, int
}
n = end;
- if (node->next && node->next->dest.kind == FZ_LINK_GOTO)
+ if (node->next && node->next->page >= 0)
{
- n = node->next->dest.ld.gotor.page;
+ n = node->next->page;
}
if (currentpage == p || (currentpage > p && currentpage < n))
{
@@ -587,10 +586,10 @@ static void do_links(fz_link *link, int xofs, int yofs)
{
if (ui.hot == link)
{
- if (link->dest.kind == FZ_LINK_GOTO)
- jump_to_page(link->dest.ld.gotor.page);
- else if (link->dest.kind == FZ_LINK_URI)
- open_browser(link->dest.ld.uri.uri);
+ if (fz_is_external_link(ctx, link->uri))
+ open_browser(link->uri);
+ else
+ jump_to_page(fz_resolve_link(ctx, doc, link->uri));
}
ui_needs_update = 1;
}
diff --git a/platform/ios/Classes/MuDocumentController.m b/platform/ios/Classes/MuDocumentController.m
index 02efe1ee..1e9f954c 100644
--- a/platform/ios/Classes/MuDocumentController.m
+++ b/platform/ios/Classes/MuDocumentController.m
@@ -28,15 +28,12 @@ static void flattenOutline(NSMutableArray *titles, NSMutableArray *pages, fz_out
indent[level * 4] = 0;
while (outline)
{
- if (outline->dest.kind == FZ_LINK_GOTO)
+ int page = outline->page;
+ if (page >= 0 && outline->title)
{
- int page = outline->dest.ld.gotor.page;
- if (page >= 0 && outline->title)
- {
- NSString *title = @(outline->title);
- [titles addObject: [NSString stringWithFormat: @"%s%@", indent, title]];
- [pages addObject: @(page)];
- }
+ NSString *title = @(outline->title);
+ [titles addObject: [NSString stringWithFormat: @"%s%@", indent, title]];
+ [pages addObject: @(page)];
}
flattenOutline(titles, pages, outline->down, level + 1);
outline = outline->next;
diff --git a/platform/ios/Classes/MuHitView.m b/platform/ios/Classes/MuHitView.m
index e94ac94a..b0a1ac4a 100644
--- a/platform/ios/Classes/MuHitView.m
+++ b/platform/ios/Classes/MuHitView.m
@@ -44,14 +44,19 @@
pageSize = CGSizeMake(100,100);
while (link && hitCount < nelem(hitRects)) {
- if (link->dest.kind == FZ_LINK_GOTO || link->dest.kind == FZ_LINK_URI) {
+ if (link->uri) {
fz_rect bbox = link->rect;
hitRects[hitCount].origin.x = bbox.x0;
hitRects[hitCount].origin.y = bbox.y0;
hitRects[hitCount].size.width = bbox.x1 - bbox.x0;
hitRects[hitCount].size.height = bbox.y1 - bbox.y0;
- linkPage[hitCount] = link->dest.kind == FZ_LINK_GOTO ? link->dest.ld.gotor.page : -1;
- linkUrl[hitCount] = link->dest.kind == FZ_LINK_URI ? strdup(link->dest.ld.uri.uri) : nil;
+ if (fz_is_external_link(ctx, link->uri)) {
+ linkPage[hitCount] = -1;
+ linkUrl[hitCount] = strdup(link->uri);
+ } else {
+ linkPage[hitCount] = fz_resolve_link(ctx, doc, link->uri);
+ linkUrl[hitCount] = nil;
+ }
hitCount++;
}
link = link->next;
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c
index e2191c0d..6cf6716a 100644
--- a/platform/java/mupdf_native.c
+++ b/platform/java/mupdf_native.c
@@ -993,7 +993,7 @@ string_to_String(fz_context *ctx, JNIEnv *env, const char *str)
return stringlen_to_String(ctx, env, str, strlen(str));
}
-static inline jobject to_Outline_safe(fz_context *ctx, JNIEnv *env, fz_outline *outline)
+static inline jobject to_Outline_safe(fz_context *ctx, JNIEnv *env, fz_document *doc, fz_outline *outline)
{
jobject joutline = NULL;
jobject jarr = NULL;
@@ -1025,17 +1025,17 @@ static inline jobject to_Outline_safe(fz_context *ctx, JNIEnv *env, fz_outline *
if (!jtitle) return NULL;
}
- if (outline->dest.kind == FZ_LINK_GOTO)
- jpage = outline->dest.ld.gotor.page;
- else if (outline->dest.kind == FZ_LINK_URI)
+ if (fz_is_external_link(ctx, outline->uri))
{
- juri = string_to_String(ctx, env, outline->dest.ld.uri.uri);
+ juri = string_to_String(ctx, env, outline->uri);
if (!juri) return NULL;
}
+ else
+ jpage = fz_resolve_link(ctx, doc, outline->uri);
if (outline->down)
{
- jdown = to_Outline_safe(ctx, env, outline->down);
+ jdown = to_Outline_safe(ctx, env, doc, outline->down);
if (!jdown) return NULL;
}
@@ -4265,7 +4265,7 @@ FUN(Document_loadOutline)(JNIEnv *env, jobject self)
if (outline)
{
- joutline = to_Outline_safe(ctx, env, outline);
+ joutline = to_Outline_safe(ctx, env, doc, outline);
if (!joutline)
jni_throw(env, FZ_ERROR_GENERIC, "loadOutline failed");
fz_drop_outline(ctx, outline);
@@ -4558,13 +4558,13 @@ FUN(Page_getLinks)(JNIEnv *env, jobject self)
jbounds = to_Rect_safe(ctx, env, &link->rect);
if (!jbounds) return NULL;
- if (link->dest.kind == FZ_LINK_GOTO)
- page = link->dest.ld.gotor.page;
- else if (link->dest.kind == FZ_LINK_URI)
+ if (fz_is_external_link(ctx, link->uri))
{
- juri = string_to_String(ctx, env, link->dest.ld.uri.uri);
+ juri = string_to_String(ctx, env, link->uri);
if (!juri) return NULL;
}
+ else
+ page = fz_resolve_link(ctx, link->doc, link->uri);
jlink = (*env)->NewObject(env, cls_Link, mid_Link_init, jbounds, page, juri);
(*env)->DeleteLocalRef(env, jbounds);
diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c
index 512feb2e..19983ee9 100644
--- a/platform/x11/pdfapp.c
+++ b/platform/x11/pdfapp.c
@@ -1737,10 +1737,10 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta
wincursor(app, HAND);
if (btn == 1 && state == 1 && !processed)
{
- if (link->dest.kind == FZ_LINK_URI)
- pdfapp_gotouri(app, link->dest.ld.uri.uri);
- else if (link->dest.kind == FZ_LINK_GOTO)
- pdfapp_gotopage(app, link->dest.ld.gotor.page + 1);
+ if (fz_is_external_link(ctx, link->uri))
+ pdfapp_gotouri(app, link->uri);
+ else
+ pdfapp_gotopage(app, fz_resolve_link(ctx, app->doc, link->uri) + 1);
return;
}
}