summaryrefslogtreecommitdiff
path: root/platform/java/mupdf_native.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/java/mupdf_native.c')
-rw-r--r--platform/java/mupdf_native.c95
1 files changed, 63 insertions, 32 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