diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-02-14 16:57:49 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-02-14 17:56:55 +0100 |
commit | ea7b7422894ac4f40f7d1fe6e6bf53b70512dd2e (patch) | |
tree | bcf0c304fdc284aa9b3419d256aa5e5c7674767f /platform | |
parent | 1fa9a65166acb4077d2b0974ad579dc11d1a92cc (diff) | |
download | mupdf-ea7b7422894ac4f40f7d1fe6e6bf53b70512dd2e.tar.xz |
Fix patch drawing in AndroidDrawDevice.
It can be simplified now that we support custom strides in pixmaps.
Diffstat (limited to 'platform')
-rw-r--r-- | platform/java/mupdf_native.c | 68 | ||||
-rw-r--r-- | platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java | 19 |
2 files changed, 34 insertions, 53 deletions
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index e547482c..03f54995 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -1932,15 +1932,14 @@ struct NativeDeviceInfo /* Conceptually, we support drawing onto a 'plane' of pixels. * The plane is width/height in size. The page is positioned on this - * at pageX0,pageY0 -> pageX1,PageY1. We want to redraw the given patch - * of this. + * at xOffset,yOffset. We want to redraw the given patch of this. * * The samples pointer in pixmap is updated on every lock/unlock, to * cope with the object moving in memory. */ fz_pixmap *pixmap; - int pageX0; - int pageY0; + int xOffset; + int yOffset; int width; }; @@ -2488,67 +2487,48 @@ FUN(DisplayListDevice_newNative)(JNIEnv *env, jclass self, jobject jlist) #ifdef HAVE_ANDROID static jlong -newNativeAndroidDrawDevice(JNIEnv *env, jobject self, fz_context *ctx, jobject obj, jint width, jint height, NativeDeviceLockFn *lock, NativeDeviceUnlockFn *unlock, jint pageX0, jint pageY0, jint pageX1, jint pageY1, jint patchX0, jint patchY0, jint patchX1, jint patchY1) +newNativeAndroidDrawDevice(JNIEnv *env, jobject self, fz_context *ctx, jobject obj, jint width, jint height, NativeDeviceLockFn *lock, NativeDeviceUnlockFn *unlock, jint xOrigin, jint yOrigin, jint patchX0, jint patchY0, jint patchX1, jint patchY1) { fz_device *device = NULL; fz_pixmap *pixmap = NULL; unsigned char dummy; NativeDeviceInfo *ninfo = NULL; - fz_irect clip, pixbbox; + fz_irect bbox; if (!ctx) return 0; -// LOGI("DrawDeviceNative: bitmap=%d,%d page=%d,%d->%d,%d patch=%d,%d->%d,%d", width, height, pageX0, pageY0, pageX1, pageY1, patchX0, patchY0, patchX1, patchY1); - /* Sanitise patch w.r.t page. */ - if (patchX0 < pageX0) - patchX0 = pageX0; - if (patchY0 < pageY0) - patchY0 = pageY0; - if (patchX1 > pageX1) - patchX1 = pageX1; - if (patchY1 > pageY1) - patchY1 = pageY1; - - clip.x0 = patchX0; - clip.y0 = patchY0; - clip.x1 = patchX1; - clip.y1 = patchY1; - - /* Check for sanity. */ - //LOGI("clip = %d,%d->%d,%d", clip.x0, clip.y0, clip.x1, clip.y1); - if (clip.x0 < 0 || clip.y0 < 0 || clip.x1 > width || clip.y1 > height) - fz_throw(ctx, FZ_ERROR_GENERIC, "patch would draw out of bounds!"); - - clip.x0 -= pageX0; - clip.y0 -= pageY0; - clip.x1 -= pageX0; - clip.y1 -= pageY0; - - /* pixmaps cannot handle right-edge padding, so the bbox must be expanded to - * match the pixel's data */ - pixbbox = clip; - pixbbox.x1 = pixbbox.x0 + width; + /* Ensure patch fits inside bitmap. */ + if (patchX0 < 0) patchX0 = 0; + if (patchY0 < 0) patchY0 = 0; + if (patchX1 > width) patchX1 = width; + if (patchY1 > height) patchY1 = height; + + bbox.x0 = xOrigin + patchX0; + bbox.y0 = yOrigin + patchY0; + bbox.x1 = xOrigin + patchX1; + bbox.y1 = yOrigin + patchY1; fz_var(pixmap); fz_var(ninfo); fz_try(ctx) { - pixmap = fz_new_pixmap_with_bbox_and_data(ctx, fz_device_rgb(ctx), &pixbbox, 1, &dummy); + pixmap = fz_new_pixmap_with_bbox_and_data(ctx, fz_device_rgb(ctx), &bbox, 1, &dummy); + pixmap->stride = width * sizeof(int32_t); ninfo = fz_malloc(ctx, sizeof(*ninfo)); ninfo->pixmap = pixmap; ninfo->lock = lock; ninfo->unlock = unlock; - ninfo->pageX0 = patchX0; - ninfo->pageY0 = patchY0; + ninfo->xOffset = patchX0; + ninfo->yOffset = patchY0; ninfo->width = width; ninfo->object = obj; (*env)->SetLongField(env, self, fid_NativeDevice_nativeInfo, jlong_cast(ninfo)); (*env)->SetObjectField(env, self, fid_NativeDevice_nativeResource, obj); lockNativeDevice(env,self); - fz_clear_pixmap_rect_with_value(ctx, pixmap, 0xff, &clip); + fz_clear_pixmap_with_value(ctx, pixmap, 0xff); unlockNativeDevice(env,ninfo); - device = fz_new_draw_device_with_bbox(ctx, NULL, pixmap, &clip); + device = fz_new_draw_device(ctx, NULL, pixmap); } fz_catch(ctx) { @@ -2575,7 +2555,7 @@ static void androidDrawDevice_lock(JNIEnv *env, NativeDeviceInfo *info) } /* Now offset pixels to allow for the page offsets */ - pixels += sizeof(int32_t) * (info->pageX0 + info->width * info->pageY0); + pixels += sizeof(int32_t) * (info->xOffset + info->width * info->yOffset); info->pixmap->samples = pixels; } @@ -2590,7 +2570,7 @@ static void androidDrawDevice_unlock(JNIEnv *env, NativeDeviceInfo *info) } JNIEXPORT jlong JNICALL -FUN(android_AndroidDrawDevice_newNative)(JNIEnv *env, jclass self, jobject jbitmap, jint pageX0, jint pageY0, jint pageX1, jint pageY1, jint patchX0, jint patchY0, jint patchX1, jint patchY1) +FUN(android_AndroidDrawDevice_newNative)(JNIEnv *env, jclass self, jobject jbitmap, jint xOrigin, jint yOrigin, jint pX0, jint pY0, jint pX1, jint pY1) { fz_context *ctx = get_context(env); AndroidBitmapInfo info; @@ -2608,7 +2588,7 @@ FUN(android_AndroidDrawDevice_newNative)(JNIEnv *env, jclass self, jobject jbitm jni_throw(env, FZ_ERROR_GENERIC, "new DrawDevice failed as bitmap width != stride"); fz_try(ctx) - device = newNativeAndroidDrawDevice(env, self, ctx, jbitmap, info.width, info.height, androidDrawDevice_lock, androidDrawDevice_unlock, pageX0, pageY0, pageX1, pageY1, patchX0, patchY0, patchX1, patchY1); + device = newNativeAndroidDrawDevice(env, self, ctx, jbitmap, info.width, info.height, androidDrawDevice_lock, androidDrawDevice_unlock, xOrigin, yOrigin, pX0, pY0, pX1, pY1); fz_catch(ctx) { jni_rethrow(env, ctx); diff --git a/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java b/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java index b194a26c..e3afb637 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java +++ b/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java @@ -11,18 +11,19 @@ import com.artifex.mupdf.fitz.Matrix; public final class AndroidDrawDevice extends NativeDevice { - private native long newNative(Bitmap bitmap, int pageX0, int pageY0, int pageX1, int pageY1, int patchX0, int patchY0, int patchX1, int patchY1); + private native long newNative(Bitmap bitmap, int xOrigin, int yOrigin, int patchX0, int patchY0, int patchX1, int patchY1); - public AndroidDrawDevice(Bitmap bitmap, - int pageX0, int pageY0, int pageX1, int pageY1, - int patchX0, int patchY0, int patchX1, int patchY1) { + public AndroidDrawDevice (Bitmap bitmap, int xOrigin, int yOrigin, int patchX0, int patchY0, int patchX1, int patchY1) { super(0); - pointer = newNative(bitmap, pageX0, pageY0, pageX1, pageY1, patchX0, patchY0, patchX1, patchY1); + pointer = newNative(bitmap, xOrigin, yOrigin, patchX0, patchY0, patchX1, patchY1); } - public AndroidDrawDevice(Bitmap bitmap, RectI page, RectI patch) { - super(0); - pointer = newNative(bitmap, page.x0, page.y0, page.x1, page.y1, patch.x0, patch.y0, patch.x1, patch.y1); + public AndroidDrawDevice(Bitmap bitmap, int xOrigin, int yOrigin) { + this(bitmap, xOrigin, yOrigin, 0, 0, bitmap.getWidth(), bitmap.getHeight()); + } + + public AndroidDrawDevice(Bitmap bitmap) { + this(bitmap, 0, 0); } public static Bitmap drawPage(Page page, Matrix ctm) { @@ -31,7 +32,7 @@ public final class AndroidDrawDevice extends NativeDevice int w = ibox.x1 - ibox.x0; int h = ibox.y1 - ibox.y0; Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); - AndroidDrawDevice dev = new AndroidDrawDevice(bmp, ibox, ibox); + AndroidDrawDevice dev = new AndroidDrawDevice(bmp, ibox.x0, ibox.y0); page.run(dev, ctm, null); dev.close(); dev.destroy(); |