summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorSebastian Rasmussen <sebras@gmail.com>2016-07-17 16:55:45 +0800
committerSebastian Rasmussen <sebras@gmail.com>2016-07-17 22:33:52 +0800
commitc15b5a6f0c149f24fa92d361a804035cc03357fd (patch)
tree769ed926fbdbde097f2471e4f992ac5cae3631de /platform
parent9500e155c7d7b1b99cc1f171c1ef3040c8023132 (diff)
downloadmupdf-c15b5a6f0c149f24fa92d361a804035cc03357fd.tar.xz
JNI: Implement document Outline.
Diffstat (limited to 'platform')
-rw-r--r--platform/java/mupdf_native.c95
-rw-r--r--platform/java/mupdf_native.h12
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Document.java2
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Outline.java42
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();
}
+
}