android/Bootstrap/Makefile.shared | 6 android/qa/desktop/native-code.cxx | 3 android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java | 31 +++ desktop/source/app/app.cxx | 2 desktop/source/app/sofficemain.cxx | 7 vcl/android/androidinst.cxx | 96 ++++++++-- vcl/inc/android/androidinst.hxx | 2 vcl/source/app/svmain.cxx | 7 8 files changed, 138 insertions(+), 16 deletions(-)
New commits: commit 5076ece1c759278d409057be22912bee4f4d46a1 Author: Michael Meeks <[email protected]> Date: Mon Dec 17 12:02:55 2012 +0000 get blue foo onto the screen ... diff --git a/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java b/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java index 9b5f103..f0956b4 100644 --- a/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java +++ b/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java @@ -58,6 +58,7 @@ package org.libreoffice.android.examples; import android.app.Activity; import android.app.AlertDialog; +import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -125,7 +126,7 @@ public class LODesktop private static native void spawnMain(); /* implementend by vcl */ - private static native void renderVCL(Bitmap bitmap); + public static native void renderVCL(Bitmap bitmap); /** * This class contains the state that is initialized once and never changes @@ -258,26 +259,6 @@ public class LODesktop } } - class BitmapView extends View { - LODesktop mDesktop; - private Bitmap mBitmap; - private long mStartTime; - - public BitmapView(LODesktop desktop) - { - mDesktop = desktop; - mBitmap = Bitmap.createBitmap(1000, 600, Bitmap.Config.ARGB_8888); - } - - @Override protected void onDraw(Canvas canvas) { - renderVCL(mBitmap); - canvas.drawBitmap(mBitmap, 0, 0, null); - - // force a redraw / re-call of ourselves, with a different time-based pattern. - invalidate(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { @@ -310,8 +291,32 @@ public class LODesktop finish(); } - setContentView(new BitmapView(this)); + Log.i(TAG, "onCreate - set content view\n"); + setContentView(new BitmapView(this, this)); } } + class BitmapView extends android.view.View + { + LODesktop mDesktop; + Bitmap mBitmap; + + public BitmapView(Context context, LODesktop desktop) + { + super(context); + mDesktop = desktop; + mBitmap = Bitmap.createBitmap(1000, 600, Bitmap.Config.ARGB_8888); + } + + @Override protected void onDraw(Canvas canvas) { + canvas.drawColor(0xFF1ABCDD); + + mDesktop.renderVCL(mBitmap); + canvas.drawBitmap(mBitmap, 0, 0, null); + + // re-call ourselves a bit later ... + invalidate(); + } + } + // vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx index 144c51f..44be265 100644 --- a/vcl/android/androidinst.cxx +++ b/vcl/android/androidinst.cxx @@ -263,30 +263,33 @@ void AndroidSalInstance::BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer, void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow, ANativeWindow_Buffer *pBuffer) { - if (!pWindow) - return; - ANativeWindow_Buffer aOutBuffer; memset ((void *)&aOutBuffer, 0, sizeof (aOutBuffer)); + fprintf (stderr, "RedrawWindows\n"); + int32_t nRet = 0; if (pBuffer != NULL) aOutBuffer = *pBuffer; else { + if (!pWindow) + return; + // ARect aRect; fprintf (stderr, "pre lock #3\n"); nRet = ANativeWindow_lock(pWindow, &aOutBuffer, NULL); } - fprintf (stderr, "locked window %d returned " // rect: %d,%d->%d,%d " + fprintf (stderr, "Frame count: %d locked window %d returned " // rect: %d,%d->%d,%d " "buffer: %dx%d stride %d, format %d, bits %p\n", + (int)getFrames().size(), nRet, // aRect.left, aRect.top, aRect.right, aRect.bottom, aOutBuffer.width, aOutBuffer.height, aOutBuffer.stride, aOutBuffer.format, aOutBuffer.bits); if (aOutBuffer.bits != NULL) { -#if 0 // pre-'clean' the buffer with cruft: +#if 1 // pre-'clean' the buffer with cruft: // hard-code / guess at a format ... int32_t *p = (int32_t *)aOutBuffer.bits; for (int32_t y = 0; y < aOutBuffer.height; y++) @@ -336,7 +339,7 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow, ANativeWindow_Buf else fprintf (stderr, "no buffer for locked window\n"); - if (pBuffer != NULL) + if (pBuffer && pWindow) ANativeWindow_unlockAndPost(pWindow); fprintf (stderr, "done render!\n"); @@ -895,10 +898,12 @@ Java_org_libreoffice_android_examples_LODesktop_renderVCL(JNIEnv *env, return; } +#if 0 if (info.format != ANDROID_BITMAP_FORMAT_RGB_565) { fprintf(stderr, "Bitmap format is not RGB_565 !"); return; } +#endif if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { fprintf(stderr, "AndroidBitmap_lockPixels() failed ! error=%d", ret); @@ -933,7 +938,7 @@ typedef struct ANativeWindow_Buffer { dummyOut.stride = info.stride; dummyOut.format = info.format; dummyOut.bits = pixels; - AndroidSalInstance::getInstance()->RedrawWindows (lo_get_app()->window, &dummyOut); + AndroidSalInstance::getInstance()->RedrawWindows (NULL, &dummyOut); AndroidBitmap_unlockPixels(env, bitmap); } commit 5ddd72f7422483fd07b3e8741072e87821849e73 Author: Michael Meeks <[email protected]> Date: Mon Dec 17 11:15:07 2012 +0000 first attempt at constantly rendering the vcl window stack ... diff --git a/android/Bootstrap/Makefile.shared b/android/Bootstrap/Makefile.shared index 31029a1..6a02b11 100644 --- a/android/Bootstrap/Makefile.shared +++ b/android/Bootstrap/Makefile.shared @@ -88,11 +88,13 @@ WHOLELIBS = \ $(OBJLOCAL)/liblo-native-code.so : $(wildcard $(OUTDIR)/lib/lib*.a) native-code.cxx mkdir -p $(OBJLOCAL) - $(CXX) -Wl,-Map,liblo-native-code.map -Wl,--gc-sections -Wl,--version-script=../../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -o $(OBJLOCAL)/liblo-native-code.so -I$(OUTDIR)/inc native-code.cxx -L$(OUTDIR)/lib $(WHOLELIBS) $(LIBS) -lgnustl_static -landroid -llog -lz + $(CXX) -Wl,-Map,liblo-native-code.map -Wl,--gc-sections -Wl,--version-script=../../Bootstrap/version.map -Wl,--no-keep-files-mapped -Wl,--no-undefined -DANDROID -DDISABLE_DYNLOADING -shared -o $(OBJLOCAL)/liblo-native-code.so -I$(OUTDIR)/inc native-code.cxx -L$(OUTDIR)/lib $(WHOLELIBS) $(LIBS) -lgnustl_static -landroid -ljnigraphics -llog -lz $(SODEST)/liblo-native-code.so : $(OBJLOCAL)/liblo-native-code.so mkdir -p $(SODEST) - $(STRIP) -o $(SODEST)/liblo-native-code.so $(OBJLOCAL)/liblo-native-code.so + cp -a $(OBJLOCAL)/liblo-native-code.so $(SODEST)/liblo-native-code.so + +# shrinkme $(STRIP) -o $(SODEST)/liblo-native-code.so $(OBJLOCAL)/liblo-native-code.so link-so: $(SODEST)/liblo-native-code.so diff --git a/android/qa/desktop/native-code.cxx b/android/qa/desktop/native-code.cxx index 06caf06..e9298e0 100644 --- a/android/qa/desktop/native-code.cxx +++ b/android/qa/desktop/native-code.cxx @@ -104,6 +104,9 @@ lo_get_libmap(void) extern void Java_org_libreoffice_android_examples_LODesktop_spawnMain(); volatile void *p = (void *) Java_org_libreoffice_android_examples_LODesktop_spawnMain; + extern void Java_org_libreoffice_android_examples_LODesktop_renderVCL(); + volatile void *q = (void *) Java_org_libreoffice_android_examples_LODesktop_renderVCL; + return map; } diff --git a/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java b/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java index e1564b0..9b5f103 100644 --- a/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java +++ b/android/qa/desktop/src/org/libreoffice/android/examples/LODesktop.java @@ -124,6 +124,9 @@ public class LODesktop /* implementend by desktop */ private static native void spawnMain(); + /* implementend by vcl */ + private static native void renderVCL(Bitmap bitmap); + /** * This class contains the state that is initialized once and never changes * (not specific to a document or a view). @@ -255,6 +258,26 @@ public class LODesktop } } + class BitmapView extends View { + LODesktop mDesktop; + private Bitmap mBitmap; + private long mStartTime; + + public BitmapView(LODesktop desktop) + { + mDesktop = desktop; + mBitmap = Bitmap.createBitmap(1000, 600, Bitmap.Config.ARGB_8888); + } + + @Override protected void onDraw(Canvas canvas) { + renderVCL(mBitmap); + canvas.drawBitmap(mBitmap, 0, 0, null); + + // force a redraw / re-call of ourselves, with a different time-based pattern. + invalidate(); + } + } + @Override public void onCreate(Bundle savedInstanceState) { @@ -280,11 +303,14 @@ public class LODesktop initBootstrapContext(); spawnMain(); + } catch (Exception e) { e.printStackTrace(System.err); finish(); } + + setContentView(new BitmapView(this)); } } diff --git a/desktop/source/app/app.cxx b/desktop/source/app/app.cxx index 26d79ec..a70030e 100644 --- a/desktop/source/app/app.cxx +++ b/desktop/source/app/app.cxx @@ -551,6 +551,8 @@ Desktop::~Desktop() void Desktop::Init() { + fprintf (stderr, "Desktop::Init()\n"); + RTL_LOGFILE_CONTEXT( aLog, "desktop (cd100003) ::Desktop::Init" ); SetBootstrapStatus(BS_OK); diff --git a/desktop/source/app/sofficemain.cxx b/desktop/source/app/sofficemain.cxx index 00f956b..69697c9 100644 --- a/desktop/source/app/sofficemain.cxx +++ b/desktop/source/app/sofficemain.cxx @@ -77,6 +77,7 @@ extern "C" int DESKTOP_DLLPUBLIC soffice_main() return EXIT_SUCCESS; } #endif + fprintf (stderr, "enter svmain()\n"); return SVMain(); #if defined ANDROID } catch (const ::com::sun::star::uno::Exception &e) { @@ -94,7 +95,11 @@ public: MainThread() : salhelper::Thread("vcl-mainloop") { launch(); } virtual void execute() { - soffice_main(); + int nRet; + do { + nRet = soffice_main(); + fprintf( stderr, "nRet %d\n", nRet ); + } while (nRet == 81 || nRet == 79); // pretend to re-start. } }; diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx index 7f57a04..144c51f 100644 --- a/vcl/android/androidinst.cxx +++ b/vcl/android/androidinst.cxx @@ -32,6 +32,7 @@ #include <jni.h> #include <android/log.h> #include <android/looper.h> +#include <android/bitmap.h> #include <osl/detail/android-bootstrap.h> #include <osl/detail/android_native_app_glue.h> #include <rtl/strbuf.hxx> @@ -260,7 +261,7 @@ void AndroidSalInstance::BlitFrameToWindow(ANativeWindow_Buffer *pOutBuffer, BlitFrameRegionToWindow(pOutBuffer, aDev, aWhole, 0, 0); } -void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) +void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow, ANativeWindow_Buffer *pBuffer) { if (!pWindow) return; @@ -268,9 +269,15 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) ANativeWindow_Buffer aOutBuffer; memset ((void *)&aOutBuffer, 0, sizeof (aOutBuffer)); -// ARect aRect; - fprintf (stderr, "pre lock #3\n"); - int32_t nRet = ANativeWindow_lock(pWindow, &aOutBuffer, NULL); + int32_t nRet = 0; + if (pBuffer != NULL) + aOutBuffer = *pBuffer; + else + { + // ARect aRect; + fprintf (stderr, "pre lock #3\n"); + nRet = ANativeWindow_lock(pWindow, &aOutBuffer, NULL); + } fprintf (stderr, "locked window %d returned " // rect: %d,%d->%d,%d " "buffer: %dx%d stride %d, format %d, bits %p\n", nRet, // aRect.left, aRect.top, aRect.right, aRect.bottom, @@ -328,7 +335,9 @@ void AndroidSalInstance::RedrawWindows(ANativeWindow *pWindow) } else fprintf (stderr, "no buffer for locked window\n"); - ANativeWindow_unlockAndPost(pWindow); + + if (pBuffer != NULL) + ANativeWindow_unlockAndPost(pWindow); fprintf (stderr, "done render!\n"); maRedrawRegion.SetEmpty(); @@ -826,13 +835,14 @@ SalInstance *CreateSalInstance() fprintf (stderr, "Android: CreateSalInstance!\n"); AndroidSalInstance* pInstance = new AndroidSalInstance( new SalYieldMutex() ); new AndroidSalData( pInstance ); - pInstance->AcquireYieldMutex(1); +// FIXME: we init VCL in a different thread from where we run the mainloop [!] ... +// pInstance->AcquireYieldMutex(1); return pInstance; } void DestroySalInstance( SalInstance *pInst ) { - pInst->ReleaseYieldMutex(); +// pInst->ReleaseYieldMutex(); delete pInst; } @@ -870,5 +880,62 @@ int AndroidSalSystem::ShowNativeDialog( const rtl::OUString& rTitle, return 0; } +// Render everything +extern "C" SAL_JNI_EXPORT void JNICALL +Java_org_libreoffice_android_examples_LODesktop_renderVCL(JNIEnv *env, + jobject /* dummy */, + jobject bitmap) +{ + AndroidBitmapInfo info; + void* pixels; + int ret; + + if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) { + fprintf(stderr, "AndroidBitmap_getInfo() failed ! error=%d", ret); + return; + } + + if (info.format != ANDROID_BITMAP_FORMAT_RGB_565) { + fprintf(stderr, "Bitmap format is not RGB_565 !"); + return; + } + + if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { + fprintf(stderr, "AndroidBitmap_lockPixels() failed ! error=%d", ret); + } + +/* +typedef struct ANativeWindow_Buffer { + // The number of pixels that are show horizontally. + int32_t width; + + // The number of pixels that are shown vertically. + int32_t height; + + // The number of *pixels* that a line in the buffer takes in + // memory. This may be >= width. + int32_t stride; + + // The format of the buffer. One of WINDOW_FORMAT_* + int32_t format; + + // The actual bits. + void* bits; + + // Do not touch. + uint32_t reserved[6]; +} ANativeWindow_Buffer; +*/ + + ANativeWindow_Buffer dummyOut; // look like a window for now ... + dummyOut.width = info.width; + dummyOut.height = info.height; + dummyOut.stride = info.stride; + dummyOut.format = info.format; + dummyOut.bits = pixels; + AndroidSalInstance::getInstance()->RedrawWindows (lo_get_app()->window, &dummyOut); + + AndroidBitmap_unlockPixels(env, bitmap); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/inc/android/androidinst.hxx b/vcl/inc/android/androidinst.hxx index addec80..74acc80 100644 --- a/vcl/inc/android/androidinst.hxx +++ b/vcl/inc/android/androidinst.hxx @@ -62,7 +62,7 @@ public: // incoming android event handlers: void onAppCmd (struct android_app* app, int32_t cmd); int32_t onInputEvent (struct android_app* app, AInputEvent* event); - void RedrawWindows(ANativeWindow *pWindow); + void RedrawWindows(ANativeWindow *pWindow, ANativeWindow_Buffer *pBuffer = NULL); SalFrame *getFocusFrame() const; void damaged(AndroidSalFrame *frame, const Rectangle &rRect); diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index f2135b2..57367fb 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -153,12 +153,19 @@ int ImplSVMain() int nReturn = EXIT_FAILURE; +#if 1 // android + sal_Bool bInit = true; // already inited by Bootstrap. +#else sal_Bool bInit = InitVCL(); +#endif + + fprintf (stderr, "init vcl %d\n", bInit); if( bInit ) { // call application main pSVData->maAppData.mbInAppMain = sal_True; + fprintf(stderr, "call app main from vcl!\n"); nReturn = pSVData->mpApp->Main(); pSVData->maAppData.mbInAppMain = sal_False; } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
