diff options
author | Sebastian Rasmussen <sebras@gmail.com> | 2016-07-17 16:55:45 +0800 |
---|---|---|
committer | Sebastian Rasmussen <sebras@gmail.com> | 2016-07-17 22:33:52 +0800 |
commit | c15b5a6f0c149f24fa92d361a804035cc03357fd (patch) | |
tree | 769ed926fbdbde097f2471e4f992ac5cae3631de | |
parent | 9500e155c7d7b1b99cc1f171c1ef3040c8023132 (diff) | |
download | mupdf-c15b5a6f0c149f24fa92d361a804035cc03357fd.tar.xz |
JNI: Implement document Outline.
-rw-r--r-- | platform/java/mupdf_native.c | 95 | ||||
-rw-r--r-- | platform/java/mupdf_native.h | 12 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/Document.java | 2 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/Outline.java | 42 |
4 files changed, 100 insertions, 51 deletions
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 512b2a34..7e8fa66f 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -104,7 +104,6 @@ static jfieldID fid_Matrix_e; static jfieldID fid_Matrix_f; static jfieldID fid_NativeDevice_nativeInfo; static jfieldID fid_NativeDevice_nativeResource; -static jfieldID fid_Outline_pointer; static jfieldID fid_Page_nativeAnnots; static jfieldID fid_Page_nativeLinks; static jfieldID fid_Page_pointer; @@ -387,8 +386,7 @@ static int find_fids(JNIEnv *env) mid_Matrix_init = get_method(&err, env, "<init>", "(FFFFFF)V"); cls_Outline = get_class(&err, env, PKG"Outline"); - fid_Outline_pointer = get_field(&err, env, "pointer", "J"); - mid_Outline_init = get_method(&err, env, "<init>", "(J)V"); + mid_Outline_init = get_method(&err, env, "<init>", "(Ljava/lang/String;ILjava/lang/String;[L"PKG"Outline;)V"); cls_Page = get_class(&err, env, PKG"Page"); fid_Page_pointer = get_field(&err, env, "pointer", "J"); @@ -799,22 +797,68 @@ static inline jobject to_Image(fz_context *ctx, JNIEnv *env, fz_image *img) return jobj; } -/* take ownership and don't throw fitz exceptions */ -static inline jobject to_Outline_safe_own(fz_context *ctx, JNIEnv *env, fz_outline *outline) +/* don't throw fitz exceptions */ +static inline jobject to_Outline_safe(fz_context *ctx, JNIEnv *env, fz_outline *outline) { - jobject joutline; + jobject joutline = NULL; + jobject jarr = NULL; + jsize jindex = 0; + jsize count = 0; + fz_outline *counter = outline; if (ctx == NULL || outline == NULL) return NULL; - joutline = (*env)->NewObject(env, cls_Outline, mid_Outline_init, jlong_cast(outline)); - if (joutline == NULL) + while (counter != NULL) + { + count++; + counter = counter->next; + } + + jarr = (*env)->NewObjectArray(env, count, cls_Outline, NULL); + if (jarr == NULL) { - fz_drop_outline(ctx, outline); + jni_throw(env, FZ_ERROR_GENERIC, "loadOutline failed (1)"); return NULL; } - return joutline; + while (outline != NULL) + { + jstring jtitle = NULL; + jint jpage = 0; + jstring juri = NULL; + jobject jdown = NULL; + + if (outline->title) + jtitle = (*env)->NewStringUTF(env, outline->title); + + if (outline->dest.kind == FZ_LINK_GOTO) + jpage = outline->dest.ld.gotor.page; + else if (outline->dest.kind == FZ_LINK_URI) + juri = (*env)->NewStringUTF(env, outline->dest.ld.uri.uri); + + if (outline->down) + { + jdown = to_Outline_safe(ctx, env, outline->down); + if (jdown == NULL) + { + jni_throw(env, FZ_ERROR_GENERIC, "loadOutline failed (2)"); + return NULL; + } + } + + joutline = (*env)->NewObject(env, cls_Outline, mid_Outline_init, jtitle, jpage, juri, jdown); + if (joutline == NULL) + { + jni_throw(env, FZ_ERROR_GENERIC, "loadOutline failed (3)"); + return NULL; + } + + (*env)->SetObjectArrayElement(env, jarr, jindex++, joutline); + outline = outline->next; + } + + return jarr; } /* take ownership and don't throw fitz exceptions */ @@ -1133,13 +1177,6 @@ static inline fz_image *from_Image(JNIEnv *env, jobject jobj) return CAST(fz_image *, (*env)->GetLongField(env, jobj, fid_Image_pointer)); } -static inline fz_outline *from_Outline(JNIEnv *env, jobject jobj) -{ - if (jobj == NULL) - return NULL; - return CAST(fz_outline *, (*env)->GetLongField(env, jobj, fid_Outline_pointer)); -} - static inline fz_page *from_Page(JNIEnv *env, jobject jobj) { if (jobj == NULL) @@ -3488,20 +3525,6 @@ FUN(Image_toPixmap)(JNIEnv *env, jobject self) return to_Pixmap_safe_own(ctx, env, pixmap); } -/* Outline interface */ - -JNIEXPORT void JNICALL -FUN(Outline_finalize)(JNIEnv *env, jobject self) -{ - fz_context *ctx = get_context(env); - fz_outline *outline = from_Outline(env, self); - - if (ctx == NULL || outline == NULL) - return; - - fz_drop_outline(ctx, outline); -} - /* Annotation Interface */ JNIEXPORT void JNICALL @@ -3830,6 +3853,7 @@ FUN(Document_loadOutline)(JNIEnv *env, jobject self) fz_context *ctx = get_context(env); fz_document *doc = from_Document(env, self); fz_outline *outline = NULL; + jobject joutline = NULL; if (ctx == NULL || doc == NULL) return NULL; @@ -3841,7 +3865,14 @@ FUN(Document_loadOutline)(JNIEnv *env, jobject self) fz_catch(ctx) jni_rethrow(env, ctx); - return to_Outline_safe_own(ctx, env, outline); + joutline = to_Outline_safe(ctx, env, outline); + if (joutline == NULL) + { + jni_throw(env, FZ_ERROR_GENERIC, "loadOutline failed"); + } + fz_drop_outline(ctx, outline); + + return joutline; } JNIEXPORT jobject JNICALL diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index 5f99dd12..a876d1b1 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -636,9 +636,9 @@ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Document_loadPage /* * Class: com_artifex_mupdf_fitz_Document * Method: loadOutline - * Signature: ()Lcom/artifex/mupdf/fitz/Outline; + * Signature: ()[Lcom/artifex/mupdf/fitz/Outline; */ -JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Document_loadOutline +JNIEXPORT jobjectArray JNICALL Java_com_artifex_mupdf_fitz_Document_loadOutline (JNIEnv *, jobject); /* @@ -1273,14 +1273,6 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_NativeDevice_endTile #ifdef __cplusplus extern "C" { #endif -/* - * Class: com_artifex_mupdf_fitz_Outline - * Method: finalize - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Outline_finalize - (JNIEnv *, jobject); - #ifdef __cplusplus } #endif diff --git a/platform/java/src/com/artifex/mupdf/fitz/Document.java b/platform/java/src/com/artifex/mupdf/fitz/Document.java index 89e3013b..b3c42e35 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/Document.java +++ b/platform/java/src/com/artifex/mupdf/fitz/Document.java @@ -41,7 +41,7 @@ public class Document public native int countPages(); public native Page loadPage(int number); - public native Outline loadOutline(); + public native Outline[] loadOutline(); public native String getMetaData(String key); public native boolean isReflowable(); public native void layout(float width, float height, float em); diff --git a/platform/java/src/com/artifex/mupdf/fitz/Outline.java b/platform/java/src/com/artifex/mupdf/fitz/Outline.java index 98a11b79..01b6554a 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/Outline.java +++ b/platform/java/src/com/artifex/mupdf/fitz/Outline.java @@ -2,16 +2,42 @@ package com.artifex.mupdf.fitz; public class Outline { - private long pointer; + public String title; + public String uri; + public int page; + public Outline down[]; - protected native void finalize(); - - public void destroy() { - finalize(); - pointer = 0; + public Outline(String title, int page, String uri, Outline[] down) { + this.title = title; + this.page = page; + this.uri = uri; + this.down = down; } - private Outline(long p) { - pointer = p; + public String toString() + { + StringBuffer s = new StringBuffer(); + + s.append(page); + s.append(": "); + s.append(title); + s.append(' '); + s.append(uri); + s.append('\n'); + + if (down != null) + { + for (int i = 0; i < down.length; i++) + { + s.append('\t'); + s.append(down[i]); + s.append('\n'); + } + } + + s.deleteCharAt(s.length() - 1); + + return s.toString(); } + } |