From 36cfeaf99bbf6f9431cb55ab9f04a67a491299c1 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Tue, 13 Feb 2018 14:37:42 +0100 Subject: Add JNI and JS bindings to layer device calls. --- platform/java/mupdf_native.c | 79 ++++++++++++++++++++++ platform/java/mupdf_native.h | 16 +++++ .../java/src/com/artifex/mupdf/fitz/Device.java | 2 + .../src/com/artifex/mupdf/fitz/NativeDevice.java | 3 + source/tools/murun.c | 56 +++++++++++++++ 5 files changed, 156 insertions(+) diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 4d519e8d..42f1a1a8 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -152,6 +152,7 @@ static jmethodID mid_Annotation_init; static jmethodID mid_ColorSpace_fromPointer; static jmethodID mid_ColorSpace_init; static jmethodID mid_Device_beginGroup; +static jmethodID mid_Device_beginLayer; static jmethodID mid_Device_beginMask; static jmethodID mid_Device_beginTile; static jmethodID mid_Device_clipImageMask; @@ -160,6 +161,7 @@ static jmethodID mid_Device_clipStrokePath; static jmethodID mid_Device_clipStrokeText; static jmethodID mid_Device_clipText; static jmethodID mid_Device_endGroup; +static jmethodID mid_Device_endLayer; static jmethodID mid_Device_endMask; static jmethodID mid_Device_endTile; static jmethodID mid_Device_fillImage; @@ -459,6 +461,8 @@ static int find_fids(JNIEnv *env) mid_Device_fillImageMask = get_method(&err, env, "fillImageMask", "(L"PKG"Image;L"PKG"Matrix;L"PKG"ColorSpace;[FF)V"); mid_Device_clipImageMask = get_method(&err, env, "clipImageMask", "(L"PKG"Image;L"PKG"Matrix;)V"); mid_Device_popClip = get_method(&err, env, "popClip", "()V"); + mid_Device_beginLayer = get_method(&err, env, "beginLayer", "(Ljava/lang/String;)V"); + mid_Device_endLayer = get_method(&err, env, "endLayer", "()V"); mid_Device_beginMask = get_method(&err, env, "beginMask", "(L"PKG"Rect;ZL"PKG"ColorSpace;[F)V"); mid_Device_endMask = get_method(&err, env, "endMask", "()V"); mid_Device_beginGroup = get_method(&err, env, "beginGroup", "(L"PKG"Rect;L"PKG"ColorSpace;ZZIF)V"); @@ -2340,6 +2344,31 @@ fz_java_device_pop_clip(fz_context *ctx, fz_device *dev) fz_throw_java(ctx, env); } +static void +fz_java_device_begin_layer(fz_context *ctx, fz_device *dev, const char *name) +{ + fz_java_device *jdev = (fz_java_device *)dev; + JNIEnv *env = jdev->env; + jstring jname; + + jname = (*env)->NewStringUTF(env, name); + + (*env)->CallVoidMethod(env, jdev->self, mid_Device_beginLayer, jname); + if ((*env)->ExceptionCheck(env)) + fz_throw_java(ctx, env); +} + +static void +fz_java_device_end_layer(fz_context *ctx, fz_device *dev) +{ + fz_java_device *jdev = (fz_java_device *)dev; + JNIEnv *env = jdev->env; + + (*env)->CallVoidMethod(env, jdev->self, mid_Device_endLayer); + if ((*env)->ExceptionCheck(env)) + fz_throw_java(ctx, env); +} + static void fz_java_device_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *rect, int luminosity, fz_colorspace *cs, const float *bc, const fz_color_params *cs_params) { @@ -2468,6 +2497,9 @@ static fz_device *fz_new_java_device(fz_context *ctx, JNIEnv *env, jobject self) dev->super.begin_tile = fz_java_device_begin_tile; dev->super.end_tile = fz_java_device_end_tile; + + dev->super.begin_layer = fz_java_device_begin_layer; + dev->super.end_layer = fz_java_device_end_layer; } fz_catch(ctx) { @@ -2922,6 +2954,53 @@ FUN(NativeDevice_popClip)(JNIEnv *env, jobject self) jni_rethrow(env, ctx); } +JNIEXPORT void JNICALL +FUN(NativeDevice_beginLayer)(JNIEnv *env, jobject self, jstring jname) +{ + fz_context *ctx = get_context(env); + fz_device *dev = from_Device(env, self); + NativeDeviceInfo *info; + const char *name; + + if (!ctx || !dev) return; + + if (jname) + { + name = (*env)->GetStringUTFChars(env, jname, NULL); + if (!name) return; + } + + info = lockNativeDevice(env, self); + fz_try(ctx) + fz_begin_layer(ctx, dev, name); + fz_always(ctx) + { + (*env)->ReleaseStringUTFChars(env, jname, name); + unlockNativeDevice(env, info); + } + fz_catch(ctx) + jni_rethrow(env, ctx); +} + +JNIEXPORT void JNICALL +FUN(NativeDevice_endLayer)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + fz_device *dev = from_Device(env, self); + NativeDeviceInfo *info; + + if (!ctx || !dev) return; + + info = lockNativeDevice(env, self); + fz_try(ctx) + fz_end_layer(ctx, dev); + fz_always(ctx) + unlockNativeDevice(env, info); + fz_catch(ctx) + jni_rethrow(env, ctx); +} + + JNIEXPORT void JNICALL FUN(NativeDevice_beginMask)(JNIEnv *env, jobject self, jobject jrect, jboolean luminosity, jobject jcs, jfloatArray jcolor, jint jcp) { diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index b9430d23..2ccaf01f 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -1325,6 +1325,22 @@ JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_NativeDevice_beginTile JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_NativeDevice_endTile (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_NativeDevice + * Method: beginLayer + * Signature: (Ljava/lang/String;)V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_NativeDevice_beginLayer + (JNIEnv *, jobject, jstring); + +/* + * Class: com_artifex_mupdf_fitz_NativeDevice + * Method: endLayer + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_NativeDevice_endLayer + (JNIEnv *, jobject); + #ifdef __cplusplus } #endif diff --git a/platform/java/src/com/artifex/mupdf/fitz/Device.java b/platform/java/src/com/artifex/mupdf/fitz/Device.java index 90c8ec15..032c4a05 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/Device.java +++ b/platform/java/src/com/artifex/mupdf/fitz/Device.java @@ -58,6 +58,8 @@ public class Device public void endGroup() {} public int beginTile(Rect area, Rect view, float xstep, float ystep, Matrix ctm, int id) { return 0; } public void endTile() {} + public void beginLayer(String name) {} + public void endLayer() {} /* Flags */ public static final int FLAG_MASK = 1; diff --git a/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java b/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java index a324fad9..820b7949 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java +++ b/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java @@ -49,4 +49,7 @@ public class NativeDevice extends Device public native final int beginTile(Rect area, Rect view, float xstep, float ystep, Matrix ctm, int id); public native final void endTile(); + + public native final void beginLayer(String name); + public native final void endLayer(); } diff --git a/source/tools/murun.c b/source/tools/murun.c index 93e04b3e..4f535670 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -1146,6 +1146,35 @@ js_dev_end_tile(fz_context *ctx, fz_device *dev) js_endtry(J); } +static void +js_dev_begin_layer(fz_context *ctx, fz_device *dev, const char *name) +{ + js_State *J = ((js_device*)dev)->J; + if (js_try(J)) + rethrow_as_fz(J); + if (js_hasproperty(J, -1, "beginLayer")) { + js_copy(J, -2); + js_pushstring(J, name); + js_call(J, 1); + js_pop(J, 1); + } + js_endtry(J); +} + +static void +js_dev_end_layer(fz_context *ctx, fz_device *dev) +{ + js_State *J = ((js_device*)dev)->J; + if (js_try(J)) + rethrow_as_fz(J); + if (js_hasproperty(J, -1, "endLayer")) { + js_copy(J, -2); + js_call(J, 0); + js_pop(J, 1); + } + js_endtry(J); +} + static fz_device *new_js_device(fz_context *ctx, js_State *J) { js_device *dev = fz_new_derived_device(ctx, js_device); @@ -1176,6 +1205,9 @@ static fz_device *new_js_device(fz_context *ctx, js_State *J) dev->super.begin_tile = js_dev_begin_tile; dev->super.end_tile = js_dev_end_tile; + dev->super.begin_layer = js_dev_begin_layer; + dev->super.end_layer = js_dev_end_layer; + dev->J = J; return (fz_device*)dev; } @@ -1455,6 +1487,27 @@ static void ffi_Device_endTile(js_State *J) rethrow(J); } +static void ffi_Device_beginLayer(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + fz_device *dev = js_touserdata(J, 0, "fz_device"); + const char *name = js_tostring(J, 1); + fz_try(ctx) + fz_begin_layer(ctx, dev, name); + fz_catch(ctx) + rethrow(J); +} + +static void ffi_Device_endLayer(js_State *J) +{ + fz_context *ctx = js_getcontext(J); + fz_device *dev = js_touserdata(J, 0, "fz_device"); + fz_try(ctx) + fz_end_layer(ctx, dev); + fz_catch(ctx) + rethrow(J); +} + /* mupdf module */ static void ffi_readFile(js_State *J) @@ -4469,6 +4522,9 @@ int murun_main(int argc, char **argv) jsB_propfun(J, "Device.endGroup", ffi_Device_endGroup, 0); jsB_propfun(J, "Device.beginTile", ffi_Device_beginTile, 6); jsB_propfun(J, "Device.endTile", ffi_Device_endTile, 0); + + jsB_propfun(J, "Device.beginLayer", ffi_Device_beginLayer, 1); + jsB_propfun(J, "Device.endLayer", ffi_Device_endLayer, 0); } js_setregistry(J, "fz_device"); -- cgit v1.2.3