diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-10-17 17:13:32 +0200 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-10-28 16:18:38 +0200 |
commit | 8a07b7fb14f11204a0d840792ab9f4bd54b066e5 (patch) | |
tree | e617a898c17aeb353f35d7b362ca2de290cf2b82 /platform | |
parent | 4029b45e494634361a4205f8896ec429d11e990a (diff) | |
download | mupdf-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.c | 62 | ||||
-rw-r--r-- | platform/gl/gl-main.c | 17 | ||||
-rw-r--r-- | platform/ios/Classes/MuDocumentController.m | 13 | ||||
-rw-r--r-- | platform/ios/Classes/MuHitView.m | 11 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 22 | ||||
-rw-r--r-- | platform/x11/pdfapp.c | 8 |
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; } } |