From 2d8d318ed70e19feb111cef73607cbb5bd811fa8 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Mon, 2 Aug 2010 00:19:11 +0200 Subject: [PATCH] Take over cleaned up lcd-android.c --- firmware/target/hosted/android/lcd-android.c | 56 +++++++++++++++++++++------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/firmware/target/hosted/android/lcd-android.c b/firmware/target/hosted/android/lcd-android.c index 32176962d..ef4004ef2 100644 --- a/firmware/target/hosted/android/lcd-android.c +++ b/firmware/target/hosted/android/lcd-android.c @@ -25,40 +25,68 @@ #include "system.h" #include "lcd.h" -static jclass Framebuffer_class; -static jobject Framebuffer_instance; extern JNIEnv *env_ptr; -extern jclass RockboxActivity_class; +extern jclass RockboxActivity_class; extern jobject RockboxActivity_instance; -jmethodID java_lcd_update; +static jobject Framebuffer_instance; +static jmethodID java_lcd_update; void lcd_init_device(void) { - LOG("%s(): Hello", __func__); - jfieldID id = (*env_ptr)->GetFieldID(env_ptr, RockboxActivity_class, "fb", "Lorg/rockbox/RockboxFramebuffer;"); - Framebuffer_instance = (*env_ptr)->GetObjectField(env_ptr, RockboxActivity_instance, id); - Framebuffer_class = (*env_ptr)->GetObjectClass(env_ptr, Framebuffer_instance); - - jmethodID java_init_lcd = (*env_ptr)->GetMethodID(env_ptr, Framebuffer_class, "java_lcd_init", "(IILjava/nio/ByteBuffer;)V"); - java_lcd_update = (*env_ptr)->GetMethodID(env_ptr, Framebuffer_class, "java_lcd_update", "()V"); - - jobject buf = (*env_ptr)->NewDirectByteBuffer(env_ptr, lcd_framebuffer, sizeof(lcd_framebuffer)); + /* get the RockboxFramebuffer instance allocated by the activity */ + jfieldID id = (*env_ptr)->GetFieldID(env_ptr, + RockboxActivity_class, + "fb", + "Lorg/rockbox/RockboxFramebuffer;"); + + Framebuffer_instance = (*env_ptr)->GetObjectField(env_ptr, + RockboxActivity_instance, + id); + + jclass Framebuffer_class = (*env_ptr)->GetObjectClass(env_ptr, + Framebuffer_instance); + + /* get the java init function and call it. it'll set up a bitmap + * based on LCD_WIDTH, LCD_HEIGHT and the ByteBuffer which directly maps + * our framebuffer */ + + jmethodID java_init_lcd = (*env_ptr)->GetMethodID(env_ptr, + Framebuffer_class, + "java_lcd_init", + "(IILjava/nio/ByteBuffer;)V"); + java_lcd_update = (*env_ptr)->GetMethodID(env_ptr, + Framebuffer_class, + "java_lcd_update", + "()V"); + + /* map the framebuffer to a ByteBuffer, this way lcd updates will + * be directly feched from the framebuffer */ + jobject buf = (*env_ptr)->NewDirectByteBuffer(env_ptr, + lcd_framebuffer, + sizeof(lcd_framebuffer)); - (*env_ptr)->CallVoidMethod(env_ptr, Framebuffer_instance, java_init_lcd, LCD_WIDTH, LCD_HEIGHT, buf); + (*env_ptr)->CallVoidMethod(env_ptr, + Framebuffer_instance, + java_init_lcd, + LCD_WIDTH, LCD_HEIGHT, buf); } void lcd_update() { + /* tell the system we're ready for drawing */ (*env_ptr)->CallVoidMethod(env_ptr, Framebuffer_instance, java_lcd_update); } void lcd_update_rect(int x, int y, int height, int width) { + /* can't do partial updates yet */ (void)x; (void)y; (void)height; (void)width; lcd_update(); } +/* below is a plain copy from lcd-sdl.c */ + /** * |R| |1.000000 -0.000001 1.402000| |Y'| * |G| = |1.000000 -0.334136 -0.714136| |Pb| -- 2.11.4.GIT