From 9776138e973e22cfd4ae418782ab87d01335ad22 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Thu, 31 May 2012 16:11:44 +0300 Subject: Add a BGR to RGBA twiddling JNI function Change-Id: Iafa2c1805eea2f521479dc97d5668d82b1c91bef --- .../src/org/libreoffice/android/Bootstrap.java | 8 ++++ sal/android/lo-bootstrap.c | 44 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java index 25fded86dfc4..47366a22f46d 100644 --- a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java +++ b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java @@ -39,6 +39,7 @@ import fi.iki.tml.CommandLine; import java.io.File; import java.io.InputStream; +import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Scanner; @@ -108,6 +109,13 @@ public class Bootstrap extends NativeActivity // the Android logging mechanism, or stops the redirection. public static native boolean redirect_stdio(boolean state); + // The DIB returned by css.awt.XBitmap.getDIB is in BGR_888 form, at least + // for Writer documents. We need it in Android's Bitmap.Config.ARGB_888 + // format, which actually is RGBA_888, whee... At least in Android 4.0.3, + // at least on my device. No idea if it is always like that or not, the + // documentation sucks. + public static native void twiddle_BGR_to_RGBA(byte[] source, int offset, int width, int height, ByteBuffer destination); + // This setup() method is called 1) in apps that use *this* class as their activity from onCreate(), // and 2) should be called from other kinds of LO code using apps. public static void setup(Activity activity) diff --git a/sal/android/lo-bootstrap.c b/sal/android/lo-bootstrap.c index 9adadef636ce..fed7a4d5e271 100644 --- a/sal/android/lo-bootstrap.c +++ b/sal/android/lo-bootstrap.c @@ -1861,6 +1861,50 @@ Java_org_libreoffice_android_Bootstrap_redirect_1stdio(JNIEnv* env, return current; } +__attribute__ ((visibility("default"))) +void +Java_org_libreoffice_android_Bootstrap_twiddle_1BGR_1to_1RGBA(JNIEnv* env, + jobject clazz, + jbyteArray source, + jint offset, + jint width, + jint height, + jobject destination) +{ + jbyte *dst = (jbyte*) (*env)->GetDirectBufferAddress(env, destination); + void *a = (*env)->GetPrimitiveArrayCritical(env, source, NULL); + jbyte *src = ((jbyte *) a) + offset; + + jbyte *srcp; + jbyte *dstp = dst; + int step = ((((width * 3) - 1) / 4) + 1) * 4; + + int i, j; + + (void) clazz; + + if (height > 0) { + srcp = src + step * (height - 1); + step = -step; + } else { + srcp = src; + } + + LOGI("twiddle: src=%p, srcp=%p, dstp=%p, step=%d", src, srcp, dstp, step); + + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + *dstp++ = srcp[j*3+2]; + *dstp++ = srcp[j*3+1]; + *dstp++ = srcp[j*3+0]; + *dstp++ = 0xFF; + } + srcp += step; + } + + (*env)->ReleasePrimitiveArrayCritical(env, source, a, 0); +} + __attribute__ ((visibility("default"))) JavaVM * lo_get_javavm(void) -- cgit