summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--android/Bootstrap/src/org/libreoffice/android/Bootstrap.java10
-rw-r--r--android/experimental/DocumentLoader/Makefile1
-rw-r--r--android/experimental/DocumentLoader/src/org/libreoffice/android/examples/DocumentLoader.java111
-rw-r--r--sal/android/lo-bootstrap.c40
4 files changed, 76 insertions, 86 deletions
diff --git a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
index 1f0c14ef5f98..15b0f35f3416 100644
--- a/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
+++ b/android/Bootstrap/src/org/libreoffice/android/Bootstrap.java
@@ -116,7 +116,13 @@ public class Bootstrap extends NativeActivity
// documentation sucks.
public static native void twiddle_BGR_to_RGBA(byte[] source, int offset, int width, int height, ByteBuffer destination);
- public static native void force_full_alpha(byte[] source, int offset, int size);
+ public static native void force_full_alpha_array(byte[] array, int offset, int length);
+
+ public static native void force_full_alpha_bb(ByteBuffer buffer, int offset, int length);
+
+ public static native long new_byte_buffer_wrapper(ByteBuffer bbuffer);
+
+ public static native void delete_byte_buffer_wrapper(long bbw);
// 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.
@@ -282,6 +288,8 @@ public class Bootstrap extends NativeActivity
// time by the package manager.
static {
System.loadLibrary("lo-bootstrap");
+ System.loadLibrary("gnustl_shared");
+ System.loadLibrary("libotouchlo");
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/android/experimental/DocumentLoader/Makefile b/android/experimental/DocumentLoader/Makefile
index 8129948b2e76..94233369b0e2 100644
--- a/android/experimental/DocumentLoader/Makefile
+++ b/android/experimental/DocumentLoader/Makefile
@@ -80,6 +80,7 @@ copy-stuff:
juhx \
jvmaccessgcc3 \
jvmfwk \
+ libotouchlo \
lo-bootstrap \
localebe1.uno \
localedata_en \
diff --git a/android/experimental/DocumentLoader/src/org/libreoffice/android/examples/DocumentLoader.java b/android/experimental/DocumentLoader/src/org/libreoffice/android/examples/DocumentLoader.java
index 91af73145788..8e9e499b3667 100644
--- a/android/experimental/DocumentLoader/src/org/libreoffice/android/examples/DocumentLoader.java
+++ b/android/experimental/DocumentLoader/src/org/libreoffice/android/examples/DocumentLoader.java
@@ -39,7 +39,7 @@ import com.polites.android.GestureImageView;
import com.sun.star.awt.XBitmap;
import com.sun.star.awt.XControl;
import com.sun.star.awt.XDevice;
-import com.sun.star.awt.XToolkit;
+import com.sun.star.awt.XToolkit2;
import com.sun.star.beans.PropertyValue;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.frame.XController;
@@ -170,6 +170,26 @@ public class DocumentLoader
}
}
+ static void dumpBytes(String name, ByteBuffer bytes, int offset)
+ {
+ if (bytes == null) {
+ Log.i(TAG, name + " is null");
+ return;
+ }
+ Log.i(TAG, name + ":");
+
+ if (offset != 0)
+ Log.i(TAG, " (offset " + offset + ")");
+
+ for (int i = offset; i < Math.min(bytes.limit(), offset+160); i += 16) {
+ String s = "";
+ for (int j = i; j < Math.min(bytes.limit(), i+16); j++)
+ s = s + String.format(" %02x", bytes.get(j));
+
+ Log.i(TAG, s);
+ }
+ }
+
@Override
public void onCreate(Bundle savedInstanceState)
{
@@ -256,10 +276,12 @@ public class DocumentLoader
dumpUNOObject("toolkit", toolkit);
- XToolkit xToolkit = (XToolkit)
- UnoRuntime.queryInterface(XToolkit.class, toolkit);
+ XToolkit2 xToolkit = (XToolkit2)
+ UnoRuntime.queryInterface(XToolkit2.class, toolkit);
- XDevice device = xToolkit.createScreenCompatibleDevice(1024, 1024);
+ ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*4);
+ long wrapped_bb = Bootstrap.new_byte_buffer_wrapper(bb);
+ XDevice device = xToolkit.createScreenCompatibleDeviceUsingBuffer(1024, 1024, wrapped_bb);
dumpUNOObject("device", device);
@@ -282,86 +304,17 @@ public class DocumentLoader
renderBabe.render(0, oDoc, renderProps);
- XBitmap bitmap = device.createBitmap(0, 0, 1024, 1024);
-
- byte[] image = bitmap.getDIB();
-
- dumpBytes("image", image, 0);
-
- if (image[0] != 'B' || image[1] != 'M') {
- Log.wtf(TAG, "getDIB() didn't return a BMP file");
- return;
- }
-
- ByteBuffer imagebb = ByteBuffer.wrap(image);
- imagebb.order(ByteOrder.LITTLE_ENDIAN);
-
- if (imagebb.getInt(0x0e) != 40) {
- Log.wtf(TAG, "getDIB() didn't return a DIB with BITMAPINFOHEADER");
- return;
- }
-
- if (imagebb.getShort(0x1c) != 32) {
- Log.wtf(TAG, "getDIB() didn't return a 32 bpp DIB");
- return;
- }
-
- if (imagebb.getInt(0x1e) != 3) {
- Log.wtf(TAG, "getDIB() didn't return a BI_BITFIELDS DIB");
- return;
- }
-
- if (imagebb.getInt(0x36) != 0x000000ff |
- imagebb.getInt(0x3a) != 0x0000ff00 ||
- imagebb.getInt(0x3e) != 0x00ff0000) {
- Log.wtf(TAG, "getDIB() didn't return DIB in RGBX format");
- return;
- }
-
- int offset = imagebb.getInt(0x0a);
- int width = imagebb.getInt(0x12);
- int height = imagebb.getInt(0x16);
-
- Log.i(TAG, String.format("offset: %d (%x), width: %d, height: %d", offset, offset, width, height));
-
- Bootstrap.force_full_alpha(image, offset, width * height * 4);
-
+ Log.i(TAG, "Rendered:");
+ dumpBytes("bb", bb, 0);
+ Bootstrap.force_full_alpha_bb(bb, 0, 1024 * 1024 * 4);
Log.i(TAG, "after force_full_alpha:");
- dumpBytes("image", image, 0);
-
- for (int i = offset; i < offset + width * height * 4; i++) {
- if (image[i] != -1) {
- int o = offset + (((i-offset) - 4) / 4) * 4;
- dumpBytes("First non-ones bytes", image, o);
- o += 160;
- dumpBytes("...", image, o);
- o += 160;
- dumpBytes("...", image, o);
- o += 160;
- dumpBytes("...", image, o);
- break;
- }
- }
+ dumpBytes("bb", bb, 0);
ImageView imageView = new GestureImageView(this);
imageView.setScaleY(-1);
- Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
- imagebb.position(offset);
-
- // Thanks to Android bug 32588, the above is not enough to get the
- // below copyPixelsFromBuffer() to start copying at offset, it
- // will (as of Android 4.0.3) copy from position zero anyway. So
- // instead have to shift (compact) the bloody buffer.
- imagebb.compact();
-
- // I don't understand what the compact() documentation says about
- // the new position; so explicitly put it at zero, in case
- // runnning on an Android where copyPixelsFromBuffer() *does* take
- // the position into account.
- imagebb.position(0);
-
- bm.copyPixelsFromBuffer(imagebb);
+ Bitmap bm = Bitmap.createBitmap(1024, 1024, Bitmap.Config.ARGB_8888);
+ bm.copyPixelsFromBuffer(bb);
imageView.setImageBitmap(bm);
diff --git a/sal/android/lo-bootstrap.c b/sal/android/lo-bootstrap.c
index b6e29baf13e3..677ff1c8ba7a 100644
--- a/sal/android/lo-bootstrap.c
+++ b/sal/android/lo-bootstrap.c
@@ -1907,11 +1907,11 @@ Java_org_libreoffice_android_Bootstrap_twiddle_1BGR_1to_1RGBA(JNIEnv* env,
__attribute__ ((visibility("default")))
void
-Java_org_libreoffice_android_Bootstrap_force_1full_1alpha(JNIEnv* env,
- jobject clazz,
- jbyteArray array,
- jint offset,
- jint size)
+Java_org_libreoffice_android_Bootstrap_force_1full_1alpha_1array(JNIEnv* env,
+ jobject clazz,
+ jbyteArray array,
+ jint offset,
+ jint length)
{
void *a = (*env)->GetPrimitiveArrayCritical(env, array, NULL);
jbyte *p = ((jbyte *) a) + offset;
@@ -1920,7 +1920,7 @@ Java_org_libreoffice_android_Bootstrap_force_1full_1alpha(JNIEnv* env,
(void) clazz;
- for (i = 0; i < size; i += 4) {
+ for (i = 0; i < length; i += 4) {
p[3] = 0xFF;
p += 4;
}
@@ -1929,6 +1929,34 @@ Java_org_libreoffice_android_Bootstrap_force_1full_1alpha(JNIEnv* env,
}
__attribute__ ((visibility("default")))
+void
+Java_org_libreoffice_android_Bootstrap_force_1full_1alpha_1bb(JNIEnv* env,
+ jobject clazz,
+ jobject buffer,
+ jint offset,
+ jint length)
+{
+ jbyte *p = (*env)->GetDirectBufferAddress(env, buffer) + offset;
+
+ int i;
+
+ (void) clazz;
+
+ for (i = 0; i < length; i += 4) {
+ p[3] = 0xFF;
+ p += 4;
+ }
+}
+
+__attribute__ ((visibility("default")))
+jlong
+Java_org_libreoffice_android_Bootstrap_address_1of_1direct_1byte_1buffer(JNIEnv *env,
+ jobject bbuffer)
+{
+ return (jlong) (intptr_t) (*env)->GetDirectBufferAddress(env, bbuffer);
+}
+
+__attribute__ ((visibility("default")))
JavaVM *
lo_get_javavm(void)
{