summaryrefslogtreecommitdiff
path: root/android/jni/mupdf.c
diff options
context:
space:
mode:
Diffstat (limited to 'android/jni/mupdf.c')
-rw-r--r--android/jni/mupdf.c124
1 files changed, 118 insertions, 6 deletions
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c
index 537c90c3..d4105115 100644
--- a/android/jni/mupdf.c
+++ b/android/jni/mupdf.c
@@ -101,11 +101,11 @@ Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(JNIEnv *env, jobject thiz, int
float zoom;
fz_matrix ctm;
fz_bbox bbox;
- fz_device *dev = NULL;
- fz_var(dev);
+ if (page == pagenum && currentPage != NULL)
+ return;
- if (currentPage != NULL && page != currentPageNumber)
+ if (currentPage != NULL)
{
fz_free_page(doc, currentPage);
currentPage = NULL;
@@ -135,11 +135,18 @@ Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(JNIEnv *env, jobject thiz, int
}
fz_catch(ctx)
{
- currentPageNumber = page;
LOGE("cannot make displaylist from page %d", pagenum);
}
- fz_free_device(dev);
- dev = NULL;
+}
+
+JNIEXPORT void JNICALL
+Java_com_artifex_mupdf_MuPDFCore_markDirtyInternal(JNIEnv *env, jobject thiz, int page)
+{
+ if (currentPage != NULL && page == pagenum)
+ {
+ fz_free_page(doc, currentPage);
+ currentPage = NULL;
+ }
}
JNIEXPORT float JNICALL
@@ -157,6 +164,12 @@ Java_com_artifex_mupdf_MuPDFCore_getPageHeight(JNIEnv *env, jobject thiz)
}
JNIEXPORT jboolean JNICALL
+Java_com_artifex_mupdf_MuPDFCore_javascriptSupported(JNIEnv *env, jobject thiz)
+{
+ return fz_javascript_supported();
+}
+
+JNIEXPORT jboolean JNICALL
Java_com_artifex_mupdf_MuPDFCore_drawPage(JNIEnv *env, jobject thiz, jobject bitmap,
int pageW, int pageH, int patchX, int patchY, int patchW, int patchH)
{
@@ -614,6 +627,59 @@ Java_com_artifex_mupdf_MuPDFCore_getPageLinksInternal(JNIEnv * env, jobject thiz
return arr;
}
+JNIEXPORT jobjectArray JNICALL
+Java_com_artifex_mupdf_MuPDFCore_getWidgetAreasInternal(JNIEnv * env, jobject thiz, int pageNumber)
+{
+ jclass rectFClass;
+ jmethodID ctor;
+ jobjectArray arr;
+ jobject rectF;
+ fz_interactive *idoc;
+ fz_widget *widget;
+ fz_matrix ctm;
+ float zoom;
+ int count;
+
+ rectFClass = (*env)->FindClass(env, "android/graphics/RectF");
+ if (rectFClass == NULL) return NULL;
+ ctor = (*env)->GetMethodID(env, rectFClass, "<init>", "(FFFF)V");
+ if (ctor == NULL) return NULL;
+
+ Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(env, thiz, pageNumber);
+ if (currentPageNumber == -1 || currentPage == NULL)
+ return NULL;
+
+ idoc = fz_interact(doc);
+ if (idoc == NULL)
+ return NULL;
+
+ zoom = resolution / 72;
+ ctm = fz_scale(zoom, zoom);
+
+ count = 0;
+ for (widget = fz_first_widget(idoc, currentPage); widget; widget = fz_next_widget(idoc, widget))
+ count ++;
+
+ arr = (*env)->NewObjectArray(env, count, rectFClass, NULL);
+ if (arr == NULL) return NULL;
+
+ count = 0;
+ for (widget = fz_first_widget(idoc, currentPage); widget; widget = fz_next_widget(idoc, widget))
+ {
+ fz_rect rect = fz_transform_rect(ctm, *fz_widget_bbox(widget));
+
+ rectF = (*env)->NewObject(env, rectFClass, ctor,
+ (float)rect.x0, (float)rect.y0, (float)rect.x1, (float)rect.y1);
+ if (rectF == NULL) return NULL;
+ (*env)->SetObjectArrayElement(env, arr, count, rectF);
+ (*env)->DeleteLocalRef(env, rectF);
+
+ count ++;
+ }
+
+ return arr;
+}
+
JNIEXPORT int JNICALL
Java_com_artifex_mupdf_MuPDFCore_getPageLink(JNIEnv * env, jobject thiz, int pageNumber, float x, float y)
{
@@ -657,3 +723,49 @@ Java_com_artifex_mupdf_MuPDFCore_getPageLink(JNIEnv * env, jobject thiz, int pag
return link->dest.ld.gotor.page;
return -1;
}
+
+JNIEXPORT int JNICALL
+Java_com_artifex_mupdf_MuPDFCore_passClickEventInternal(JNIEnv * env, jobject thiz, int pageNumber, float x, float y)
+{
+ fz_matrix ctm;
+ fz_interactive *idoc = fz_interact(doc);
+ float zoom;
+ fz_point p;
+ fz_ui_event event;
+ int changed = 0;
+
+ if (idoc == NULL)
+ return 0;
+
+ Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(env, thiz, pageNumber);
+ if (currentPageNumber == -1 || currentPage == NULL)
+ return 0;
+
+ p.x = x;
+ p.y = y;
+
+ /* Ultimately we should probably return a pointer to a java structure
+ * with the link details in, but for now, page number will suffice.
+ */
+ zoom = resolution / 72;
+ ctm = fz_scale(zoom, zoom);
+ ctm = fz_invert_matrix(ctm);
+
+ p = fz_transform_point(ctm, p);
+
+ fz_try(ctx)
+ {
+ event.etype = FZ_EVENT_TYPE_POINTER;
+ event.event.pointer.pt = p;
+ event.event.pointer.ptype = FZ_POINTER_DOWN;
+ changed = fz_pass_event(idoc, currentPage, &event);
+ event.event.pointer.ptype = FZ_POINTER_UP;
+ changed |= fz_pass_event(idoc, currentPage, &event);
+ }
+ fz_catch(ctx)
+ {
+ LOGE("passClickEvent: %s", ctx->error->message);
+ }
+
+ return changed;
+}