From bafc03500857692703b3f7650936b13623e85bb1 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 6 Jun 2016 15:13:27 +0200 Subject: Update JNI bindings for pixmap alpha changes. --- platform/java/com/artifex/mupdf/fitz/Image.java | 6 +- platform/java/com/artifex/mupdf/fitz/Pixmap.java | 24 +++++-- platform/java/mupdf_native.c | 92 +++++++----------------- platform/java/mupdf_native.h | 16 +++-- 4 files changed, 59 insertions(+), 79 deletions(-) diff --git a/platform/java/com/artifex/mupdf/fitz/Image.java b/platform/java/com/artifex/mupdf/fitz/Image.java index 3876bc1b..a9eb2ffa 100644 --- a/platform/java/com/artifex/mupdf/fitz/Image.java +++ b/platform/java/com/artifex/mupdf/fitz/Image.java @@ -37,9 +37,5 @@ public class Image public native boolean getInterpolate(); public native Image getMask(); - public native Pixmap toPixmap(int w, int h); - - public Pixmap toPixmap() { - return toPixmap(getWidth(), getHeight()); - } + public native Pixmap toPixmap(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Pixmap.java b/platform/java/com/artifex/mupdf/fitz/Pixmap.java index 61c833ff..61c5ddc6 100644 --- a/platform/java/com/artifex/mupdf/fitz/Pixmap.java +++ b/platform/java/com/artifex/mupdf/fitz/Pixmap.java @@ -11,22 +11,34 @@ public class Pixmap pointer = 0; } - private native long newNative(ColorSpace cs, int x, int y, int w, int h); + private native long newNative(ColorSpace cs, int x, int y, int w, int h, boolean alpha); private Pixmap(long p) { pointer = p; } + public Pixmap(ColorSpace colorspace, int x, int y, int w, int h, boolean alpha) { + pointer = newNative(colorspace, x, y, w, h, alpha); + } + public Pixmap(ColorSpace colorspace, int x, int y, int w, int h) { - pointer = newNative(colorspace, x, y, w, h); + this(colorspace, x, y, w, h, false); + } + + public Pixmap(ColorSpace colorspace, int w, int h, boolean alpha) { + this(colorspace, 0, 0, w, h, alpha); } public Pixmap(ColorSpace colorspace, int w, int h) { - this(colorspace, 0, 0, w, h); + this(colorspace, 0, 0, w, h, false); + } + + public Pixmap(ColorSpace colorspace, Rect rect, boolean alpha) { + this(colorspace, (int)rect.x0, (int)rect.y0, (int)(rect.x1 - rect.x0), (int)(rect.y1 - rect.y0), alpha); } public Pixmap(ColorSpace colorspace, Rect rect) { - this(colorspace, (int)rect.x0, (int)rect.y0, (int)(rect.x1 - rect.x0), (int)(rect.y1 - rect.y0)); + this(colorspace, rect, false); } public native void clear(); @@ -40,9 +52,10 @@ public class Pixmap public native int getHeight(); public native int getStride(); public native int getNumberOfComponents(); + public native boolean getAlpha(); public native ColorSpace getColorSpace(); public native byte[] getSamples(); - public native int[] getPixels(); /* only valid for RGB or BGR pixmaps */ + public native int[] getPixels(); /* only valid for RGBA or BGRA pixmaps */ public void clear(int value) { clearWithValue(value); @@ -54,6 +67,7 @@ public class Pixmap " x=" + getX() + " y=" + getY() + " n=" + getNumberOfComponents() + + " alpha=" + getAlpha() + " cs=" + getColorSpace() + ")"; } diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index e835a76d..67465db8 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -2107,7 +2107,7 @@ FUN(Image_newImageFromBitmap)(JNIEnv *env, jobject self, jobject jbitmap, jlong if (info.stride != info.width) fz_throw(ctx, FZ_ERROR_GENERIC, "new Image failed as bitmap width != stride"); - pixmap = fz_new_pixmap(ctx, fz_device_rgb(ctx), info.width, info.height); + pixmap = fz_new_pixmap(ctx, fz_device_rgb(ctx), info.width, info.height, 1); if (AndroidBitmap_lockPixels(env, jbitmap, &pixels) < 0) fz_throw(ctx, FZ_ERROR_GENERIC, "Bitmap lock failed in new Image"); memcpy(pixmap->samples, pixels, info.width * info.height * 4); @@ -2289,7 +2289,7 @@ FUN(Pixmap_finalize)(JNIEnv *env, jobject self) } JNIEXPORT jlong JNICALL -FUN(Pixmap_newNative)(JNIEnv *env, jobject self, jobject colorspace_, jint x, jint y, jint w, jint h) +FUN(Pixmap_newNative)(JNIEnv *env, jobject self, jobject colorspace_, jint x, jint y, jint w, jint h, jboolean alpha) { fz_context *ctx = get_context(env); fz_colorspace *colorspace = from_ColorSpace(env, colorspace_); @@ -2301,7 +2301,7 @@ FUN(Pixmap_newNative)(JNIEnv *env, jobject self, jobject colorspace_, jint x, ji fz_try(ctx) { - pixmap = fz_new_pixmap(ctx, colorspace, w, h); + pixmap = fz_new_pixmap(ctx, colorspace, w, h, alpha); pixmap->x = x; pixmap->y = y; } @@ -2346,18 +2346,9 @@ FUN(Pixmap_getX)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int x = 0; - if (ctx == NULL || pixmap == NULL) return 0; - - fz_try(ctx) - x = fz_pixmap_x(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return x; + return pixmap->x; } JNIEXPORT jint JNICALL @@ -2365,18 +2356,9 @@ FUN(Pixmap_getY)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int y = 0; - if (ctx == NULL || pixmap == NULL) return 0; - - fz_try(ctx) - y = fz_pixmap_y(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return y; + return pixmap->y; } JNIEXPORT jint JNICALL @@ -2384,18 +2366,9 @@ FUN(Pixmap_getWidth)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int w = 0; - if (ctx == NULL || pixmap == NULL) return 0; - - fz_try(ctx) - w = fz_pixmap_width(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return w; + return pixmap->w; } JNIEXPORT jint JNICALL @@ -2403,18 +2376,9 @@ FUN(Pixmap_getHeight)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int h = 0; - if (ctx == NULL || pixmap == NULL) return 0; - - fz_try(ctx) - h = fz_pixmap_height(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return h; + return pixmap->h; } JNIEXPORT jint JNICALL @@ -2422,18 +2386,19 @@ FUN(Pixmap_getNumberOfComponents)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int n = 0; - if (ctx == NULL || pixmap == NULL) return 0; + return pixmap->n; +} - fz_try(ctx) - n = fz_pixmap_components(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return n; +JNIEXPORT jboolean JNICALL +FUN(Pixmap_getAlpha)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + fz_pixmap *pixmap = from_Pixmap(env, self); + if (ctx == NULL || pixmap == NULL) + return 0; + return pixmap->alpha; } JNIEXPORT jint JNICALL @@ -2441,18 +2406,9 @@ FUN(Pixmap_getStride)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - - int stride = 0; - if (ctx == NULL || pixmap == NULL) return 0; - - fz_try(ctx) - stride = fz_pixmap_stride(ctx, pixmap); - fz_catch(ctx) - jni_rethrow(env, ctx); - - return stride; + return pixmap->stride; } JNIEXPORT jobject JNICALL @@ -2482,7 +2438,7 @@ FUN(Pixmap_getSamples)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_pixmap *pixmap = from_Pixmap(env, self); - int size = pixmap->w * pixmap->h * pixmap->n; + int size = pixmap->h * pixmap->stride; jbyteArray ary; if (ctx == NULL || pixmap == NULL) @@ -2514,6 +2470,12 @@ FUN(Pixmap_getPixels)(JNIEnv *env, jobject self) return NULL; } + if (size != pixmap->h * pixmap->stride) + { + jni_throw(env, FZ_ERROR_GENERIC, "invalid stride for getPixels"); + return NULL; + } + ary = (*env)->NewIntArray(env, size); if (!ary) return NULL; @@ -3200,14 +3162,14 @@ FUN(Image_getMask)(JNIEnv *env, jobject self) } JNIEXPORT jobject JNICALL -FUN(Image_toPixmap)(JNIEnv *env, jobject self, jint w, jint h) +FUN(Image_toPixmap)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); fz_image *img = from_Image(env, self); fz_pixmap *pixmap = NULL; fz_try(ctx) - pixmap = fz_get_pixmap_from_image(ctx, img, w, h); + pixmap = fz_get_pixmap_from_image(ctx, img, NULL, NULL, NULL, NULL); fz_catch(ctx) jni_rethrow(env, ctx); diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index 4b88903e..a15501d2 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -712,10 +712,10 @@ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Image_getMask /* * Class: com_artifex_mupdf_fitz_Image * Method: toPixmap - * Signature: (II)Lcom/artifex/mupdf/fitz/Pixmap; + * Signature: ()Lcom/artifex/mupdf/fitz/Pixmap; */ JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Image_toPixmap - (JNIEnv *, jobject, jint, jint); + (JNIEnv *, jobject); #ifdef __cplusplus } @@ -1240,10 +1240,10 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Pixmap_finalize /* * Class: com_artifex_mupdf_fitz_Pixmap * Method: newNative - * Signature: (Lcom/artifex/mupdf/fitz/ColorSpace;IIII)J + * Signature: (Lcom/artifex/mupdf/fitz/ColorSpace;IIIIZ)J */ JNIEXPORT jlong JNICALL Java_com_artifex_mupdf_fitz_Pixmap_newNative - (JNIEnv *, jobject, jobject, jint, jint, jint, jint); + (JNIEnv *, jobject, jobject, jint, jint, jint, jint, jboolean); /* * Class: com_artifex_mupdf_fitz_Pixmap @@ -1317,6 +1317,14 @@ JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Pixmap_getStride JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Pixmap_getNumberOfComponents (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_Pixmap + * Method: getAlpha + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_fitz_Pixmap_getAlpha + (JNIEnv *, jobject); + /* * Class: com_artifex_mupdf_fitz_Pixmap * Method: getColorSpace -- cgit v1.2.3