diff options
Diffstat (limited to 'navit/graphics/android')
-rw-r--r-- | navit/graphics/android/graphics_android.c | 1664 |
1 files changed, 797 insertions, 867 deletions
diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c index 0d6aa30d2..68cf1874d 100644 --- a/navit/graphics/android/graphics_android.c +++ b/navit/graphics/android/graphics_android.c @@ -35,454 +35,414 @@ #include "command.h" struct graphics_priv { - jclass NavitGraphicsClass; - jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, - NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, - NavitGraphics_draw_image_warp, NavitGraphics_draw_mode, NavitGraphics_draw_drag, - NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, - NavitGraphics_setBackgroundColor; - - jclass PaintClass; - jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; - - jobject NavitGraphics; - jobject Paint; - - jclass BitmapFactoryClass; - jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; - - jclass BitmapClass; - jmethodID Bitmap_getHeight, Bitmap_getWidth, Bitmap_createScaledBitmap; - - jclass ContextClass; - jmethodID Context_getResources; - - jclass ResourcesClass; - jobject Resources; - jmethodID Resources_getIdentifier; - - jobject packageName; - - struct callback_list *cbl; - struct window win; - struct padding *padding; - jint bgcolor; + jclass NavitGraphicsClass; + jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, + NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, + NavitGraphics_draw_image_warp, NavitGraphics_draw_mode, NavitGraphics_draw_drag, + NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, + NavitGraphics_setBackgroundColor; + + jclass PaintClass; + jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; + + jobject NavitGraphics; + jobject Paint; + + jclass BitmapFactoryClass; + jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; + + jclass BitmapClass; + jmethodID Bitmap_getHeight, Bitmap_getWidth, Bitmap_createScaledBitmap; + + jclass ContextClass; + jmethodID Context_getResources; + + jclass ResourcesClass; + jobject Resources; + jmethodID Resources_getIdentifier; + + jobject packageName; + + struct callback_list *cbl; + struct window win; + struct padding *padding; + jint bgcolor; }; struct graphics_font_priv { - int size; + int size; }; struct graphics_gc_priv { - struct graphics_priv *gra; - int linewidth; - enum draw_mode_num mode; - int a,r,g,b; - unsigned char *dashes; - int ndashes; + struct graphics_priv *gra; + int linewidth; + enum draw_mode_num mode; + int a,r,g,b; + unsigned char *dashes; + int ndashes; }; struct graphics_image_priv { - jobject Bitmap; - int width; - int height; - struct point hot; + jobject Bitmap; + int width; + int height; + struct point hot; }; static GHashTable *image_cache_hash = NULL; -static int -find_class_global(char *name, jclass *ret) -{ - *ret=(*jnienv)->FindClass(jnienv, name); - if (! *ret) { - dbg(lvl_error,"Failed to get Class %s\n",name); - return 0; - } - *ret = (*jnienv)->NewGlobalRef(jnienv, *ret); - return 1; +static int find_class_global(char *name, jclass *ret) { + *ret=(*jnienv)->FindClass(jnienv, name); + if (! *ret) { + dbg(lvl_error,"Failed to get Class %s",name); + return 0; + } + *ret = (*jnienv)->NewGlobalRef(jnienv, *ret); + return 1; } -static int -find_method(jclass class, char *name, char *args, jmethodID *ret) -{ - *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); - if (*ret == NULL) { - dbg(lvl_error,"Failed to get Method %s with signature %s\n",name,args); - return 0; - } - return 1; +static int find_method(jclass class, char *name, char *args, jmethodID *ret) { + *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); + if (*ret == NULL) { + dbg(lvl_error,"Failed to get Method %s with signature %s",name,args); + return 0; + } + return 1; } -static int -find_static_method(jclass class, char *name, char *args, jmethodID *ret) -{ - *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); - if (*ret == NULL) { - dbg(lvl_error,"Failed to get static Method %s with signature %s\n",name,args); - return 0; - } - return 1; +static int find_static_method(jclass class, char *name, char *args, jmethodID *ret) { + *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); + if (*ret == NULL) { + dbg(lvl_error,"Failed to get static Method %s with signature %s",name,args); + return 0; + } + return 1; } -static void -graphics_destroy(struct graphics_priv *gr) -{ +static void graphics_destroy(struct graphics_priv *gr) { } -static void font_destroy(struct graphics_font_priv *font) -{ - g_free(font); +static void font_destroy(struct graphics_font_priv *font) { + g_free(font); } static struct graphics_font_methods font_methods = { - font_destroy + font_destroy }; -static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) -{ - struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); - *meth=font_methods; +static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, + int size, int flags) { + struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); + *meth=font_methods; - ret->size=size; - return ret; + ret->size=size; + return ret; } -static void -gc_destroy(struct graphics_gc_priv *gc) -{ - g_free(gc->dashes); - g_free(gc); +static void gc_destroy(struct graphics_gc_priv *gc) { + g_free(gc->dashes); + g_free(gc); } -static void -gc_set_linewidth(struct graphics_gc_priv *gc, int w) -{ +static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) { gc->linewidth = w; } -static void -gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) -{ - g_free(gc->dashes); - gc->ndashes=n; - if(n) { - gc->dashes=g_malloc(n); - memcpy(gc->dashes, dash_list, n); - } else { - gc->dashes=NULL; - } +static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) { + g_free(gc->dashes); + gc->ndashes=n; + if(n) { + gc->dashes=g_malloc(n); + memcpy(gc->dashes, dash_list, n); + } else { + gc->dashes=NULL; + } } -static void -gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) -{ +static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) { gc->r = c->r >> 8; gc->g = c->g >> 8; gc->b = c->b >> 8; gc->a = c->a >> 8; } -static void -gc_set_background(struct graphics_gc_priv *gc, struct color *c) -{ +static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) { } static struct graphics_gc_methods gc_methods = { - gc_destroy, - gc_set_linewidth, - gc_set_dashes, - gc_set_foreground, - gc_set_background + gc_destroy, + gc_set_linewidth, + gc_set_dashes, + gc_set_foreground, + gc_set_background }; -static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) -{ - struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); - *meth=gc_methods; +static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) { + struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); + *meth=gc_methods; - ret->gra = gr; - ret->a = ret->r = ret->g = ret->b = 255; - ret->linewidth=1; - return ret; + ret->gra = gr; + ret->a = ret->r = ret->g = ret->b = 255; + ret->linewidth=1; + return ret; } -static void image_destroy(struct graphics_image_priv *img) -{ +static void image_destroy(struct graphics_image_priv *img) { // unused? } static struct graphics_image_methods image_methods = { - image_destroy + image_destroy }; -static struct graphics_image_priv * -image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) -{ - struct graphics_image_priv* ret = NULL; - - ret=g_new0(struct graphics_image_priv, 1); - jstring string; - jclass localBitmap = NULL; - int id; - - dbg(lvl_debug,"enter %s\n",path); - if (!strncmp(path,"res/drawable/",13)) { - jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); - char *path_noext=g_strdup(path+13); - char *pos=strrchr(path_noext, '.'); - if (pos) - *pos='\0'; - dbg(lvl_debug,"path_noext=%s\n",path_noext); - string = (*jnienv)->NewStringUTF(jnienv, path_noext); - g_free(path_noext); - id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, gra->packageName); - dbg(lvl_debug,"id=%d\n",id); - if (id) - localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); - (*jnienv)->DeleteLocalRef(jnienv, a); - } else { - string = (*jnienv)->NewStringUTF(jnienv, path); - localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); - } - if (localBitmap) { - ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); - ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); - if((*w!=IMAGE_W_H_UNSET && *w!=ret->width) || (*h!=IMAGE_W_H_UNSET && *w!=ret->height)) { - jclass scaledBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapClass, - gra->Bitmap_createScaledBitmap, localBitmap, (*w==IMAGE_W_H_UNSET)?ret->width:*w, (*h==IMAGE_W_H_UNSET)?ret->height:*h, JNI_TRUE); - if(!scaledBitmap) { - dbg(lvl_error,"Bitmap scaling to %dx%d failed for %s",*w,*h,path); - } else { - (*jnienv)->DeleteLocalRef(jnienv, localBitmap); - localBitmap=scaledBitmap; - ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); - ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); - } - } - ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, localBitmap); - (*jnienv)->DeleteLocalRef(jnienv, localBitmap); - - dbg(lvl_debug,"w=%d h=%d for %s\n",ret->width,ret->height,path); - ret->hot.x=ret->width/2; - ret->hot.y=ret->height/2; - } else { - g_free(ret); - ret=NULL; - dbg(lvl_warning,"Failed to open %s\n",path); - } - (*jnienv)->DeleteLocalRef(jnienv, string); - if (ret) { - *w=ret->width; - *h=ret->height; - if (hot) - *hot=ret->hot; - } - - return ret; +static struct graphics_image_priv *image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, + int *w, int *h, struct point *hot, int rotation) { + struct graphics_image_priv* ret = NULL; + + ret=g_new0(struct graphics_image_priv, 1); + jstring string; + jclass localBitmap = NULL; + int id; + + dbg(lvl_debug,"enter %s",path); + if (!strncmp(path,"res/drawable/",13)) { + jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); + char *path_noext=g_strdup(path+13); + char *pos=strrchr(path_noext, '.'); + if (pos) + *pos='\0'; + dbg(lvl_debug,"path_noext=%s",path_noext); + string = (*jnienv)->NewStringUTF(jnienv, path_noext); + g_free(path_noext); + id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, gra->packageName); + dbg(lvl_debug,"id=%d",id); + if (id) + localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, + gra->Resources, id); + (*jnienv)->DeleteLocalRef(jnienv, a); + } else { + string = (*jnienv)->NewStringUTF(jnienv, path); + localBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); + } + if (localBitmap) { + ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); + ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); + if((*w!=IMAGE_W_H_UNSET && *w!=ret->width) || (*h!=IMAGE_W_H_UNSET && *w!=ret->height)) { + jclass scaledBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapClass, + gra->Bitmap_createScaledBitmap, localBitmap, (*w==IMAGE_W_H_UNSET)?ret->width:*w, (*h==IMAGE_W_H_UNSET)?ret->height:*h, + JNI_TRUE); + if(!scaledBitmap) { + dbg(lvl_error,"Bitmap scaling to %dx%d failed for %s",*w,*h,path); + } else { + (*jnienv)->DeleteLocalRef(jnienv, localBitmap); + localBitmap=scaledBitmap; + ret->width=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getWidth); + ret->height=(*jnienv)->CallIntMethod(jnienv, localBitmap, gra->Bitmap_getHeight); + } + } + ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, localBitmap); + (*jnienv)->DeleteLocalRef(jnienv, localBitmap); + + dbg(lvl_debug,"w=%d h=%d for %s",ret->width,ret->height,path); + ret->hot.x=ret->width/2; + ret->hot.y=ret->height/2; + } else { + g_free(ret); + ret=NULL; + dbg(lvl_warning,"Failed to open %s",path); + } + (*jnienv)->DeleteLocalRef(jnienv, string); + if (ret) { + *w=ret->width; + *h=ret->height; + if (hot) + *hot=ret->hot; + } + + return ret; } -static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) -{ +static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) { float wf = gc->linewidth; (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); } -static void -draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) -{ - int arrsize=1+4+1+gc->ndashes+count*2; - jint pc[arrsize]; - int i; - jintArray points; - if (count <= 0) - return; - points = (*jnienv)->NewIntArray(jnienv,arrsize); - pc[0]=gc->linewidth; - pc[1]=gc->a; - pc[2]=gc->r; - pc[3]=gc->g; - pc[4]=gc->b; - pc[5]=gc->ndashes; - for (i = 0 ; i < gc->ndashes ; i++) { - pc[6+i] = gc->dashes[i]; - } - for (i = 0 ; i < count ; i++) { - pc[6+gc->ndashes+i*2]=p[i].x; - pc[6+gc->ndashes+i*2+1]=p[i].y; - } - (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); - (*jnienv)->DeleteLocalRef(jnienv, points); +static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { + int arrsize=1+4+1+gc->ndashes+count*2; + jint pc[arrsize]; + int i; + jintArray points; + if (count <= 0) + return; + points = (*jnienv)->NewIntArray(jnienv,arrsize); + pc[0]=gc->linewidth; + pc[1]=gc->a; + pc[2]=gc->r; + pc[3]=gc->g; + pc[4]=gc->b; + pc[5]=gc->ndashes; + for (i = 0 ; i < gc->ndashes ; i++) { + pc[6+i] = gc->dashes[i]; + } + for (i = 0 ; i < count ; i++) { + pc[6+gc->ndashes+i*2]=p[i].x; + pc[6+gc->ndashes+i*2+1]=p[i].y; + } + (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); + (*jnienv)->DeleteLocalRef(jnienv, points); } -static void -draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) -{ - int arrsize=1+4+count*2; - jint pc[arrsize]; - int i; - jintArray points; - if (count <= 0) - return; - points = (*jnienv)->NewIntArray(jnienv,arrsize); - for (i = 0 ; i < count ; i++) { - pc[5+i*2]=p[i].x; - pc[5+i*2+1]=p[i].y; - } - pc[0]=gc->linewidth; - pc[1]=gc->a; - pc[2]=gc->r; - pc[3]=gc->g; - pc[4]=gc->b; - (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); - (*jnienv)->DeleteLocalRef(jnienv, points); +static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) { + int arrsize=1+4+count*2; + jint pc[arrsize]; + int i; + jintArray points; + if (count <= 0) + return; + points = (*jnienv)->NewIntArray(jnienv,arrsize); + for (i = 0 ; i < count ; i++) { + pc[5+i*2]=p[i].x; + pc[5+i*2+1]=p[i].y; + } + pc[0]=gc->linewidth; + pc[1]=gc->a; + pc[2]=gc->r; + pc[3]=gc->g; + pc[4]=gc->b; + (*jnienv)->SetIntArrayRegion(jnienv, points, 0, arrsize, pc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); + (*jnienv)->DeleteLocalRef(jnienv, points); } -static void -draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h) -{ - initPaint(gra, gc); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h); +static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h) { + initPaint(gra, gc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, + h); } -static void -draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) -{ - initPaint(gra, gc); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); +static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) { + initPaint(gra, gc); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); } -static void -draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) -{ - int bgcolor=0; - dbg(lvl_debug,"enter %s\n", text); - initPaint(gra, fg); - if(bg) - bgcolor=(bg->a<<24)| (bg->r<<16) | (bg->g<<8) | bg->b; - jstring string = (*jnienv)->NewStringUTF(jnienv, text); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy, bgcolor); - (*jnienv)->DeleteLocalRef(jnienv, string); +static void draw_text(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg, + struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) { + int bgcolor=0; + dbg(lvl_debug,"enter %s", text); + initPaint(gra, fg); + if(bg) + bgcolor=(bg->a<<24)| (bg->r<<16) | (bg->g<<8) | bg->b; + jstring string = (*jnienv)->NewStringUTF(jnienv, text); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, + font->size, dx, dy, bgcolor); + (*jnienv)->DeleteLocalRef(jnienv, string); } -static void -draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) -{ - dbg(lvl_debug,"enter %p\n",img); - initPaint(gra, fg); - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); - +static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, + struct graphics_image_priv *img) { + dbg(lvl_debug,"enter %p",img); + initPaint(gra, fg); + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, + img->Bitmap); + } -static void -draw_image_warp (struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img) -{ - - /* - * - * - * if coord count==3 then top.left top.right bottom.left - * - */ - - if (count==3) - { - initPaint(gr, fg); - (*jnienv)->CallVoidMethod(jnienv, gr->NavitGraphics, gr->NavitGraphics_draw_image_warp, fg->gra->Paint, - count, p[0].x, p[0].y,p[1].x, p[1].y, p[2].x, p[2].y, img->Bitmap); - } else - dbg(lvl_debug,"draw_image_warp is called with unsupported count parameter value %d\n", count); +static void draw_image_warp (struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, + struct graphics_image_priv *img) { + + /* + * + * + * if coord count==3 then top.left top.right bottom.left + * + */ + + if (count==3) { + initPaint(gr, fg); + (*jnienv)->CallVoidMethod(jnienv, gr->NavitGraphics, gr->NavitGraphics_draw_image_warp, fg->gra->Paint, count, + p[0].x, p[0].y,p[1].x, p[1].y, p[2].x, p[2].y, img->Bitmap); + } else + dbg(lvl_debug,"draw_image_warp is called with unsupported count parameter value %d", count); } -static void draw_drag(struct graphics_priv *gra, struct point *p) -{ - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); +static void draw_drag(struct graphics_priv *gra, struct point *p) { + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); } -static void -background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) -{ +static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) { } -static void -draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) -{ - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); +static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) { + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); } -static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound); +static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, + int w, int h, int wraparound); -static void * -get_data(struct graphics_priv *this, const char *type) -{ - if (!strcmp(type,"padding")) - return this->padding; - if (!strcmp(type,"window")) - return &this->win; - return NULL; +static void *get_data(struct graphics_priv *this, const char *type) { + if (!strcmp(type,"padding")) + return this->padding; + if (!strcmp(type,"window")) + return &this->win; + return NULL; } -static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) -{ +static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { } -static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) -{ - int len = g_utf8_strlen(text, -1); - int xMin = 0; - int yMin = 0; - int yMax = 13*font->size/256; - int xMax = 9*font->size*len/256; - - ret[0].x = xMin; - ret[0].y = -yMin; - ret[1].x = xMin; - ret[1].y = -yMax; - ret[2].x = xMax; - ret[2].y = -yMax; - ret[3].x = xMax; - ret[3].y = -yMin; +static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, + struct point *ret, int estimate) { + int len = g_utf8_strlen(text, -1); + int xMin = 0; + int yMin = 0; + int yMax = 13*font->size/256; + int xMax = 9*font->size*len/256; + + ret[0].x = xMin; + ret[0].y = -yMin; + ret[1].x = xMin; + ret[1].y = -yMax; + ret[2].x = xMax; + ret[2].y = -yMax; + ret[3].x = xMax; + ret[3].y = -yMin; } -static void overlay_disable(struct graphics_priv *gra, int disable) -{ - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); +static void overlay_disable(struct graphics_priv *gra, int disable) { + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); } -static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int wraparound) -{ - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, wraparound); +static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int wraparound) { + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0, pnt ? pnt->y:0, + w, h, wraparound); } -static int -set_attr(struct graphics_priv *gra, struct attr *attr) -{ - switch (attr->type) { - case attr_use_camera: - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); - return 1; - case attr_background_color: - gra->bgcolor = (attr->u.color->a / 0x101) << 24 - | (attr->u.color->r / 0x101) << 16 - | (attr->u.color->g / 0x101) << 8 - | (attr->u.color->b / 0x101); - dbg(lvl_debug, "set attr_background_color %04x %04x %04x %04x (%08x)\n", - attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, gra->bgcolor); - if (gra->NavitGraphics_setBackgroundColor != NULL) - (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_setBackgroundColor, gra->bgcolor); - else - dbg(lvl_error, "NavitGraphics.setBackgroundColor not found, cannot set background color\n"); - return 1; - default: - return 0; - } +static int set_attr(struct graphics_priv *gra, struct attr *attr) { + switch (attr->type) { + case attr_use_camera: + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); + return 1; + case attr_background_color: + gra->bgcolor = (attr->u.color->a / 0x101) << 24 + | (attr->u.color->r / 0x101) << 16 + | (attr->u.color->g / 0x101) << 8 + | (attr->u.color->b / 0x101); + dbg(lvl_debug, "set attr_background_color %04x %04x %04x %04x (%08x)", + attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, gra->bgcolor); + if (gra->NavitGraphics_setBackgroundColor != NULL) + (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_setBackgroundColor, gra->bgcolor); + else + dbg(lvl_error, "NavitGraphics.setBackgroundColor not found, cannot set background color"); + return 1; + default: + return 0; + } } @@ -492,97 +452,85 @@ void hide_native_keyboard (struct graphics_keyboard *kbd); static struct graphics_methods graphics_methods = { - graphics_destroy, - draw_mode, - draw_lines, - draw_polygon, - draw_rectangle, - draw_circle, - draw_text, - draw_image, - draw_image_warp, - draw_drag, - font_new, - gc_new, - background_gc, - overlay_new, - image_new, - get_data, - image_free, - get_text_bbox, - overlay_disable, - overlay_resize, - set_attr, - show_native_keyboard, - hide_native_keyboard, + graphics_destroy, + draw_mode, + draw_lines, + draw_polygon, + draw_rectangle, + draw_circle, + draw_text, + draw_image, + draw_image_warp, + draw_drag, + font_new, + gc_new, + background_gc, + overlay_new, + image_new, + get_data, + image_free, + get_text_bbox, + overlay_disable, + overlay_resize, + set_attr, + show_native_keyboard, + hide_native_keyboard, }; -static void -resize_callback(struct graphics_priv *gra, int w, int h) -{ - dbg(lvl_debug,"w=%d h=%d ok\n",w,h); - dbg(lvl_debug,"gra=%p, %d callbacks in list\n", gra, g_list_length(gra->cbl)); - callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); +static void resize_callback(struct graphics_priv *gra, int w, int h) { + dbg(lvl_debug,"w=%d h=%d ok",w,h); + dbg(lvl_debug,"gra=%p, %d callbacks in list", gra, g_list_length(gra->cbl)); + callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); } -static void -padding_callback(struct graphics_priv *gra, int left, int top, int right, int bottom) -{ - dbg(lvl_debug, "win.padding left=%d top=%d right=%d bottom=%d ok\n", left, top, right, bottom); - gra->padding->left = left; - gra->padding->top = top; - gra->padding->right = right; - gra->padding->bottom = bottom; +static void padding_callback(struct graphics_priv *gra, int left, int top, int right, int bottom) { + dbg(lvl_debug, "win.padding left=%d top=%d right=%d bottom=%d ok", left, top, right, bottom); + gra->padding->left = left; + gra->padding->top = top; + gra->padding->right = right; + gra->padding->bottom = bottom; } -static void -motion_callback(struct graphics_priv *gra, int x, int y) -{ - struct point p; - p.x=x; - p.y=y; - callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); +static void motion_callback(struct graphics_priv *gra, int x, int y) { + struct point p; + p.x=x; + p.y=y; + callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); } -static void -keypress_callback(struct graphics_priv *gra, char *s) -{ - dbg(lvl_debug,"enter %s\n",s); - callback_list_call_attr_1(gra->cbl, attr_keypress, s); +static void keypress_callback(struct graphics_priv *gra, char *s) { + dbg(lvl_debug,"enter %s",s); + callback_list_call_attr_1(gra->cbl, attr_keypress, s); } -static void -button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) -{ - struct point p; - p.x=x; - p.y=y; - callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); +static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) { + struct point p; + p.x=x; + p.y=y; + callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); } -static int -set_activity(jobject graphics) -{ - jclass ActivityClass; - jmethodID cid; - - ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity); - dbg(lvl_debug,"at 5\n"); - if (ActivityClass == NULL) { - dbg(lvl_debug,"no activity class found\n"); - return 0; - } - dbg(lvl_debug,"at 6\n"); - cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V"); - if (cid == NULL) { - dbg(lvl_error,"no setContentView method found\n"); - return 0; - } - dbg(lvl_debug,"at 7\n"); - (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics); - dbg(lvl_debug,"at 8\n"); - return 1; +static int set_activity(jobject graphics) { + jclass ActivityClass; + jmethodID cid; + + ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity); + dbg(lvl_debug,"at 5"); + if (ActivityClass == NULL) { + dbg(lvl_debug,"no activity class found"); + return 0; + } + dbg(lvl_debug,"at 6"); + cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V"); + if (cid == NULL) { + dbg(lvl_error,"no setContentView method found"); + return 0; + } + dbg(lvl_debug,"at 7"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics); + dbg(lvl_debug,"at 8"); + return 1; } /** @@ -598,167 +546,176 @@ set_activity(jobject graphics) * @param wraparound (0 for the main view) * @param use_camera Whether to use the camera (0 for overlays) */ -static int -graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int wraparound, int use_camera) -{ - struct callback *cb; - jmethodID cid, Context_getPackageName; - - dbg(lvl_debug,"at 2 jnienv=%p\n",jnienv); - if (parent) - ret->padding = parent->padding; - if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) - return 0; - if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init)) - return 0; - if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) - return 0; - if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) - return 0; - - if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) - return 0; - if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) - return 0; - if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) - return 0; - - if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) - return 0; - if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) - return 0; - if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) - return 0; - if (!find_static_method(ret->BitmapClass, "createScaledBitmap", "(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;", &ret->Bitmap_createScaledBitmap)) - return 0; - - if (!find_class_global("android/content/Context", &ret->ContextClass)) - return 0; - if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) - return 0; - - - ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); - if (ret->Resources) - ret->Resources = (*jnienv)->NewGlobalRef(jnienv, ret->Resources); - if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) - return 0; - if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) - return 0; - - if (!find_method(ret->ContextClass, "getPackageName", "()Ljava/lang/String;", &Context_getPackageName)) - return 0; - ret->packageName=(*jnienv)->CallObjectMethod(jnienv, android_activity, Context_getPackageName); - ret->packageName=(*jnienv)->NewGlobalRef(jnienv, ret->packageName); - - if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass)) - return 0; - dbg(lvl_debug,"at 3\n"); - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIII)V"); - if (cid == NULL) { - dbg(lvl_error,"no method found\n"); - return 0; /* exception thrown */ - } - dbg(lvl_debug,"at 4 android_activity=%p\n",android_activity); - ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, wraparound, use_camera); - dbg(lvl_debug,"result=%p\n",ret->NavitGraphics); - if (ret->NavitGraphics) - ret->NavitGraphics = (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); - - /* Create a single global Paint, otherwise android will quickly run out - * of global refs.*/ - /* 0x101 = text kerning (default), antialiasing */ - ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); - - dbg(lvl_debug,"result=%p\n",ret->Paint); - if (ret->Paint) - ret->Paint = (*jnienv)->NewGlobalRef(jnienv, ret->Paint); - - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V"); - if (cid == NULL) { - dbg(lvl_error,"no SetResizeCallback method found\n"); - return 0; /* exception thrown */ - } - cb=callback_new_1(callback_cast(resize_callback), ret); - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); - - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setPaddingChangedCallback", "(I)V"); - if (cid == NULL) { - dbg(lvl_error,"no SetPaddingCallback method found\n"); - return 0; /* exception thrown */ - } - cb=callback_new_1(callback_cast(padding_callback), ret); - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); - - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); - if (cid == NULL) { - dbg(lvl_error,"no SetButtonCallback method found\n"); - return 0; /* exception thrown */ - } - cb=callback_new_1(callback_cast(button_callback), ret); - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); - - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V"); - if (cid == NULL) { - dbg(lvl_error,"no SetMotionCallback method found\n"); - return 0; /* exception thrown */ - } - cb=callback_new_1(callback_cast(motion_callback), ret); - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); - - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V"); - if (cid == NULL) { - dbg(lvl_error,"no SetKeypressCallback method found\n"); - return 0; /* exception thrown */ - } - cb=callback_new_1(callback_cast(keypress_callback), ret); - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); - - if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;IIII)V", &ret->NavitGraphics_draw_text)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_image_warp", "(Landroid/graphics/Paint;IIIIIIILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image_warp)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIII)V", &ret->NavitGraphics_overlay_resize)) - return 0; - if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) - return 0; +static int graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, + int h, int wraparound, int use_camera) { + struct callback *cb; + jmethodID cid, Context_getPackageName; + + dbg(lvl_debug,"at 2 jnienv=%p",jnienv); + if (parent) + ret->padding = parent->padding; + if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) + return 0; + if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init)) + return 0; + if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) + return 0; + if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) + return 0; + + if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) + return 0; + if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", + &ret->BitmapFactory_decodeFile)) + return 0; + if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", + "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) + return 0; + + if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) + return 0; + if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) + return 0; + if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) + return 0; + if (!find_static_method(ret->BitmapClass, "createScaledBitmap", + "(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;", &ret->Bitmap_createScaledBitmap)) + return 0; + + if (!find_class_global("android/content/Context", &ret->ContextClass)) + return 0; + if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) + return 0; + + + ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); + if (ret->Resources) + ret->Resources = (*jnienv)->NewGlobalRef(jnienv, ret->Resources); + if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) + return 0; + if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", + &ret->Resources_getIdentifier)) + return 0; + + if (!find_method(ret->ContextClass, "getPackageName", "()Ljava/lang/String;", &Context_getPackageName)) + return 0; + ret->packageName=(*jnienv)->CallObjectMethod(jnienv, android_activity, Context_getPackageName); + ret->packageName=(*jnienv)->NewGlobalRef(jnienv, ret->packageName); + + if (!find_class_global("org/navitproject/navit/NavitGraphics", &ret->NavitGraphicsClass)) + return 0; + dbg(lvl_debug,"at 3"); + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", + "(Landroid/app/Activity;Lorg/navitproject/navit/NavitGraphics;IIIIII)V"); + if (cid == NULL) { + dbg(lvl_error,"no method found"); + return 0; /* exception thrown */ + } + dbg(lvl_debug,"at 4 android_activity=%p",android_activity); + ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, + parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0, pnt ? pnt->y:0, w, h, wraparound, use_camera); + dbg(lvl_debug,"result=%p",ret->NavitGraphics); + if (ret->NavitGraphics) + ret->NavitGraphics = (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); + + /* Create a single global Paint, otherwise android will quickly run out + * of global refs.*/ + /* 0x101 = text kerning (default), antialiasing */ + ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); + + dbg(lvl_debug,"result=%p",ret->Paint); + if (ret->Paint) + ret->Paint = (*jnienv)->NewGlobalRef(jnienv, ret->Paint); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetResizeCallback method found"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(resize_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setPaddingChangedCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetPaddingCallback method found"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(padding_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetButtonCallback method found"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(button_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetMotionCallback method found"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(motion_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V"); + if (cid == NULL) { + dbg(lvl_error,"no SetKeypressCallback method found"); + return 0; /* exception thrown */ + } + cb=callback_new_1(callback_cast(keypress_callback), ret); + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb); + + if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", + &ret->NavitGraphics_draw_polyline)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", + &ret->NavitGraphics_draw_polygon)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", + &ret->NavitGraphics_draw_rectangle)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", + &ret->NavitGraphics_draw_circle)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;IIII)V", + &ret->NavitGraphics_draw_text)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", + &ret->NavitGraphics_draw_image)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_image_warp", + "(Landroid/graphics/Paint;IIIIIIILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image_warp)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIII)V", &ret->NavitGraphics_overlay_resize)) + return 0; + if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) + return 0; #if 0 - set_activity(ret->NavitGraphics); + set_activity(ret->NavitGraphics); #endif - return 1; + return 1; } static jclass NavitClass; -static jmethodID Navit_disableSuspend, Navit_exit, Navit_fullscreen, Navit_runOptionsItem, Navit_showMenu, Navit_showNativeKeyboard, Navit_hideNativeKeyboard; +static jmethodID Navit_disableSuspend, Navit_exit, Navit_fullscreen, Navit_runOptionsItem, Navit_showMenu, + Navit_showNativeKeyboard, Navit_hideNativeKeyboard; -static int -graphics_android_fullscreen(struct window *win, int on) -{ - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_fullscreen, on); - return 1; +static int graphics_android_fullscreen(struct window *win, int on) { + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_fullscreen, on); + return 1; } -static void -graphics_android_disable_suspend(struct window *win) -{ - dbg(lvl_debug,"enter\n"); - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); +static void graphics_android_disable_suspend(struct window *win) { + dbg(lvl_debug,"enter"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); } /** @@ -772,19 +729,18 @@ graphics_android_disable_suspend(struct window *win) * @param out Points to a buffer which will receive a pointer to the output of the command * @param valid */ -static void -graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) -{ - int ncmd=0; - dbg(0,"Running %s\n",function); - if(!strcmp(function,"map_download_dialog")) { - ncmd=3; - } else if(!strcmp(function,"backup_restore_dialog")) { - ncmd=7; - } else if(!strcmp(function,"set_map_location")) { - ncmd=10; - } - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_runOptionsItem, ncmd); +static void graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, struct attr **in, + struct attr ***out, int *valid) { + int ncmd=0; + dbg(0,"Running %s",function); + if(!strcmp(function,"map_download_dialog")) { + ncmd=3; + } else if(!strcmp(function,"backup_restore_dialog")) { + ncmd=7; + } else if(!strcmp(function,"set_map_location")) { + ncmd=10; + } + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_runOptionsItem, ncmd); } /** @@ -798,11 +754,10 @@ graphics_android_cmd_runMenuItem(struct graphics_priv *this, char *function, str * @param out Points to a buffer which will receive a pointer to the output of the command * @param valid */ -static void -graphics_android_cmd_menu(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, int *valid) -{ - dbg(lvl_debug, "enter\n"); - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_showMenu); +static void graphics_android_cmd_menu(struct graphics_priv *this, char *function, struct attr **in, struct attr ***out, + int *valid) { + dbg(lvl_debug, "enter"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_showMenu); } /** @@ -810,10 +765,10 @@ graphics_android_cmd_menu(struct graphics_priv *this, char *function, struct att * this command. */ static struct command_table commands[] = { - {"map_download_dialog",command_cast(graphics_android_cmd_runMenuItem)}, - {"set_map_location",command_cast(graphics_android_cmd_runMenuItem)}, - {"backup_restore_dialog",command_cast(graphics_android_cmd_runMenuItem)}, - {"menu", command_cast(graphics_android_cmd_menu)}, + {"map_download_dialog",command_cast(graphics_android_cmd_runMenuItem)}, + {"set_map_location",command_cast(graphics_android_cmd_runMenuItem)}, + {"backup_restore_dialog",command_cast(graphics_android_cmd_runMenuItem)}, + {"menu", command_cast(graphics_android_cmd_menu)}, }; /** @@ -829,76 +784,76 @@ static struct command_table commands[] = { * * @return The new graphics instance */ -static struct graphics_priv * -graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) -{ - struct graphics_priv *ret; - struct attr *attr; - int use_camera=0; - jmethodID cid; - jint android_bgcolor; - - dbg(lvl_debug, "enter\n"); - if (!event_request_system("android","graphics_android")) - return NULL; - ret=g_new0(struct graphics_priv, 1); - - ret->cbl=cbl; - *meth=graphics_methods; - ret->win.priv=ret; - ret->win.fullscreen=graphics_android_fullscreen; - ret->win.disable_suspend=graphics_android_disable_suspend; - ret->padding = g_new0(struct padding, 1); - ret->padding->left = 0; - ret->padding->top = 0; - ret->padding->right = 0; - ret->padding->bottom = 0; - /* attr_background_color is the background color for system bars (API 17+ only) */ - if ((attr=attr_search(attrs, NULL, attr_background_color))) { - ret->bgcolor = (attr->u.color->a / 0x101) << 24 - | (attr->u.color->r / 0x101) << 16 - | (attr->u.color->g / 0x101) << 8 - | (attr->u.color->b / 0x101); - dbg(lvl_debug, "attr_background_color %04x %04x %04x %04x (%08x)\n", - attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, ret->bgcolor); - } else { - /* default is the same as for OSD */ - ret->bgcolor = 0x60000000; - } - if ((attr=attr_search(attrs, NULL, attr_use_camera))) { - use_camera=attr->u.num; - } - if ((attr=attr_search(attrs, NULL, attr_callback_list))) { - command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), ret); +static struct graphics_priv *graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, + struct callback_list *cbl) { + struct graphics_priv *ret; + struct attr *attr; + int use_camera=0; + jmethodID cid; + jint android_bgcolor; + + dbg(lvl_debug, "enter"); + if (!event_request_system("android","graphics_android")) + return NULL; + ret=g_new0(struct graphics_priv, 1); + + ret->cbl=cbl; + *meth=graphics_methods; + ret->win.priv=ret; + ret->win.fullscreen=graphics_android_fullscreen; + ret->win.disable_suspend=graphics_android_disable_suspend; + ret->padding = g_new0(struct padding, 1); + ret->padding->left = 0; + ret->padding->top = 0; + ret->padding->right = 0; + ret->padding->bottom = 0; + /* attr_background_color is the background color for system bars (API 17+ only) */ + if ((attr=attr_search(attrs, NULL, attr_background_color))) { + ret->bgcolor = (attr->u.color->a / 0x101) << 24 + | (attr->u.color->r / 0x101) << 16 + | (attr->u.color->g / 0x101) << 8 + | (attr->u.color->b / 0x101); + dbg(lvl_debug, "attr_background_color %04x %04x %04x %04x (%08x)", + attr->u.color->r, attr->u.color->g, attr->u.color->b, attr->u.color->a, ret->bgcolor); + } else { + /* default is the same as for OSD */ + ret->bgcolor = 0xa0000000; + } + if ((attr=attr_search(attrs, NULL, attr_use_camera))) { + use_camera=attr->u.num; + } + if ((attr=attr_search(attrs, NULL, attr_callback_list))) { + command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), ret); + } + image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); + if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, use_camera)) { + cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "hasMenuButton", "()Z"); + if (cid != NULL) { + attr = g_new0(struct attr, 1); + attr->type = attr_has_menu_button; + attr->u.num = (*jnienv)->CallBooleanMethod(jnienv, ret->NavitGraphics, cid); + + /* + * Although the attribute refers to information obtained by the graphics plugin, we are storing it + * with the navit object: the object is easier to access from anywhere in the program, and ultimately + * it refers to a configuration value affecting all of Navit, thus users are likely to look for it in + * the navit object (as the fact that graphics also handles input devices is not immedately obvious). + */ + navit_object_set_attr((struct navit_object *) nav, attr); + dbg(lvl_debug, "attr_has_menu_button=%d", attr->u.num); + g_free(attr); + } + ret->NavitGraphics_setBackgroundColor = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setBackgroundColor", + "(I)V"); + if (ret->NavitGraphics_setBackgroundColor != NULL) { + (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, ret->NavitGraphics_setBackgroundColor, ret->bgcolor); } - image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); - if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, use_camera)) { - cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "hasMenuButton", "()Z"); - if (cid != NULL) { - attr = g_new0(struct attr, 1); - attr->type = attr_has_menu_button; - attr->u.num = (*jnienv)->CallBooleanMethod(jnienv, ret->NavitGraphics, cid); - - /* - * Although the attribute refers to information obtained by the graphics plugin, we are storing it - * with the navit object: the object is easier to access from anywhere in the program, and ultimately - * it refers to a configuration value affecting all of Navit, thus users are likely to look for it in - * the navit object (as the fact that graphics also handles input devices is not immedately obvious). - */ - navit_object_set_attr((struct navit_object *) nav, attr); - dbg(lvl_debug, "attr_has_menu_button=%d\n", attr->u.num); - g_free(attr); - } - ret->NavitGraphics_setBackgroundColor = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setBackgroundColor", "(I)V"); - if (ret->NavitGraphics_setBackgroundColor != NULL) { - (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, ret->NavitGraphics_setBackgroundColor, ret->bgcolor); - } - dbg(lvl_debug,"returning %p\n",ret); - return ret; - } else { - g_free(ret); - return NULL; - } + dbg(lvl_debug,"returning %p",ret); + return ret; + } else { + g_free(ret); + return NULL; + } } /** @@ -916,31 +871,27 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at * * @return The graphics instance for the new overlay */ -static struct graphics_priv * -overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound) -{ - struct graphics_priv *ret=g_new0(struct graphics_priv, 1); - *meth=graphics_methods; - if (graphics_android_init(ret, gr, p, w, h, wraparound, 0)) { - dbg(lvl_debug,"returning %p\n",ret); - return ret; - } else { - g_free(ret); - return NULL; - } +static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, + int w, int h, int wraparound) { + struct graphics_priv *ret=g_new0(struct graphics_priv, 1); + *meth=graphics_methods; + if (graphics_android_init(ret, gr, p, w, h, wraparound, 0)) { + dbg(lvl_debug,"returning %p",ret); + return ret; + } else { + g_free(ret); + return NULL; + } } -static void -event_android_main_loop_run(void) -{ - dbg(lvl_debug,"enter\n"); +static void event_android_main_loop_run(void) { + dbg(lvl_debug,"enter"); } -static void event_android_main_loop_quit(void) -{ - dbg(lvl_debug,"enter\n"); - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); +static void event_android_main_loop_quit(void) { + dbg(lvl_debug,"enter"); + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); } @@ -957,191 +908,172 @@ static jmethodID NavitWatch_init; static jmethodID NavitWatch_remove; -static void do_poll(JNIEnv *env, int fd, int cond) -{ - struct pollfd pfd; - pfd.fd=fd; - dbg(lvl_debug,"%p poll called for %d %d\n", fd, cond); - switch ((enum event_watch_cond)cond) { - case event_watch_cond_read: - pfd.events=POLLIN; - break; - case event_watch_cond_write: - pfd.events=POLLOUT; - break; - case event_watch_cond_except: - pfd.events=POLLERR; - break; - default: - pfd.events=0; - } - pfd.revents=0; - poll(&pfd, 1, -1); +static void do_poll(JNIEnv *env, int fd, int cond) { + struct pollfd pfd; + pfd.fd=fd; + dbg(lvl_debug,"%p poll called for %d %d", fd, cond); + switch ((enum event_watch_cond)cond) { + case event_watch_cond_read: + pfd.events=POLLIN; + break; + case event_watch_cond_write: + pfd.events=POLLOUT; + break; + case event_watch_cond_except: + pfd.events=POLLERR; + break; + default: + pfd.events=0; + } + pfd.revents=0; + poll(&pfd, 1, -1); } -static struct event_watch * -event_android_add_watch(int h, enum event_watch_cond cond, struct callback *cb) -{ - jobject ret; - ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, h, (int) cond, (int)cb); - dbg(lvl_debug,"result for %d,%d,%p=%p\n",h,cond,cb,ret); - if (ret) - ret = (*jnienv)->NewGlobalRef(jnienv, ret); - return (struct event_watch *)ret; +static struct event_watch *event_android_add_watch(int h, enum event_watch_cond cond, struct callback *cb) { + jobject ret; + ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int)do_poll, h, (int) cond, (int)cb); + dbg(lvl_debug,"result for %d,%d,%p=%p",h,cond,cb,ret); + if (ret) + ret = (*jnienv)->NewGlobalRef(jnienv, ret); + return (struct event_watch *)ret; } -static void -event_android_remove_watch(struct event_watch *ev) -{ - dbg(lvl_debug,"enter %p\n",ev); - if (ev) { - jobject obj=(jobject )ev; - (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); - (*jnienv)->DeleteGlobalRef(jnienv, obj); - } +static void event_android_remove_watch(struct event_watch *ev) { + dbg(lvl_debug,"enter %p",ev); + if (ev) { + jobject obj=(jobject )ev; + (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); + (*jnienv)->DeleteGlobalRef(jnienv, obj); + } } -struct event_timeout -{ - void (*handle_timeout)(struct event_timeout *priv); - jobject jni_timeout; - int multi; - struct callback *cb; +struct event_timeout { + void (*handle_timeout)(struct event_timeout *priv); + jobject jni_timeout; + int multi; + struct callback *cb; }; -static void -event_android_remove_timeout(struct event_timeout *priv) -{ - if (priv && priv->jni_timeout) { - (*jnienv)->CallVoidMethod(jnienv, priv->jni_timeout, NavitTimeout_remove); - (*jnienv)->DeleteGlobalRef(jnienv, priv->jni_timeout); - priv->jni_timeout = NULL; - } +static void event_android_remove_timeout(struct event_timeout *priv) { + if (priv && priv->jni_timeout) { + (*jnienv)->CallVoidMethod(jnienv, priv->jni_timeout, NavitTimeout_remove); + (*jnienv)->DeleteGlobalRef(jnienv, priv->jni_timeout); + priv->jni_timeout = NULL; + } } -static void event_android_handle_timeout(struct event_timeout *priv) -{ - callback_call_0(priv->cb); - if (!priv->multi) - event_android_remove_timeout(priv); +static void event_android_handle_timeout(struct event_timeout *priv) { + callback_call_0(priv->cb); + if (!priv->multi) + event_android_remove_timeout(priv); } -static struct event_timeout * -event_android_add_timeout(int timeout, int multi, struct callback *cb) -{ - struct event_timeout *ret = g_new0(struct event_timeout, 1); - ret->cb = cb; - ret->multi = multi; - ret->handle_timeout = event_android_handle_timeout; - ret->jni_timeout = (*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)ret); - if (ret->jni_timeout) - ret->jni_timeout = (*jnienv)->NewGlobalRef(jnienv, ret->jni_timeout); - return ret; +static struct event_timeout *event_android_add_timeout(int timeout, int multi, struct callback *cb) { + struct event_timeout *ret = g_new0(struct event_timeout, 1); + ret->cb = cb; + ret->multi = multi; + ret->handle_timeout = event_android_handle_timeout; + ret->jni_timeout = (*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)ret); + if (ret->jni_timeout) + ret->jni_timeout = (*jnienv)->NewGlobalRef(jnienv, ret->jni_timeout); + return ret; } -static struct event_idle * -event_android_add_idle(int priority, struct callback *cb) -{ +static struct event_idle *event_android_add_idle(int priority, struct callback *cb) { #if 0 - jobject ret; - dbg(lvl_debug,"enter\n"); - ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); - dbg(lvl_debug,"result for %p=%p\n",cb,ret); - if (ret) - ret = (*jnienv)->NewGlobalRef(jnienv, ret); - return (struct event_idle *)ret; + jobject ret; + dbg(lvl_debug,"enter"); + ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); + dbg(lvl_debug,"result for %p=%p",cb,ret); + if (ret) + ret = (*jnienv)->NewGlobalRef(jnienv, ret); + return (struct event_idle *)ret; #endif - return (struct event_idle *)event_android_add_timeout(1, 1, cb); + return (struct event_idle *)event_android_add_timeout(1, 1, cb); } -static void -event_android_remove_idle(struct event_idle *ev) -{ +static void event_android_remove_idle(struct event_idle *ev) { #if 0 - dbg(lvl_debug,"enter %p\n",ev); - if (ev) { - jobject obj=(jobject )ev; - (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); - (*jnienv)->DeleteGlobalRef(jnienv, obj); - } + dbg(lvl_debug,"enter %p",ev); + if (ev) { + jobject obj=(jobject )ev; + (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); + (*jnienv)->DeleteGlobalRef(jnienv, obj); + } #endif - event_android_remove_timeout((struct event_timeout *)ev); + event_android_remove_timeout((struct event_timeout *)ev); } -static void -event_android_call_callback(struct callback_list *cb) -{ - dbg(lvl_debug,"enter\n"); +static void event_android_call_callback(struct callback_list *cb) { + dbg(lvl_debug,"enter"); } static struct event_methods event_android_methods = { - event_android_main_loop_run, - event_android_main_loop_quit, - event_android_add_watch, - event_android_remove_watch, - event_android_add_timeout, - event_android_remove_timeout, - event_android_add_idle, - event_android_remove_idle, - event_android_call_callback, + event_android_main_loop_run, + event_android_main_loop_quit, + event_android_add_watch, + event_android_remove_watch, + event_android_add_timeout, + event_android_remove_timeout, + event_android_add_idle, + event_android_remove_idle, + event_android_call_callback, }; -static struct event_priv * -event_android_new(struct event_methods *meth) -{ - dbg(lvl_debug,"enter\n"); - if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass)) - return NULL; - NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V"); - if (NavitTimeout_init == NULL) - return NULL; - NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); - if (NavitTimeout_remove == NULL) - return NULL; +static struct event_priv *event_android_new(struct event_methods *meth) { + dbg(lvl_debug,"enter"); + if (!find_class_global("org/navitproject/navit/NavitTimeout", &NavitTimeoutClass)) + return NULL; + NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V"); + if (NavitTimeout_init == NULL) + return NULL; + NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); + if (NavitTimeout_remove == NULL) + return NULL; #if 0 - if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass)) - return NULL; - NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V"); - if (NavitIdle_init == NULL) - return NULL; - NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); - if (NavitIdle_remove == NULL) - return NULL; + if (!find_class_global("org/navitproject/navit/NavitIdle", &NavitIdleClass)) + return NULL; + NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V"); + if (NavitIdle_init == NULL) + return NULL; + NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); + if (NavitIdle_remove == NULL) + return NULL; #endif - if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) - return NULL; - NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(IIII)V"); - if (NavitWatch_init == NULL) - return NULL; - NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); - if (NavitWatch_remove == NULL) - return NULL; - - if (!find_class_global("org/navitproject/navit/Navit", &NavitClass)) - return NULL; - Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); - if (Navit_disableSuspend == NULL) - return NULL; - Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); - if (Navit_exit == NULL) - return NULL; - Navit_fullscreen = (*jnienv)->GetMethodID(jnienv, NavitClass, "fullscreen", "(I)V"); - if (Navit_fullscreen == NULL) - return NULL; - Navit_runOptionsItem = (*jnienv)->GetMethodID(jnienv, NavitClass, "runOptionsItem", "(I)V"); - if (Navit_runOptionsItem == NULL) - return NULL; - Navit_showMenu = (*jnienv)->GetMethodID(jnienv, NavitClass, "showMenu", "()V"); - if (Navit_showMenu == NULL) - return NULL; - Navit_showNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "showNativeKeyboard", "()I"); - Navit_hideNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "hideNativeKeyboard", "()V"); - - dbg(lvl_debug,"ok\n"); - *meth=event_android_methods; + if (!find_class_global("org/navitproject/navit/NavitWatch", &NavitWatchClass)) + return NULL; + NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(IIII)V"); + if (NavitWatch_init == NULL) return NULL; + NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); + if (NavitWatch_remove == NULL) + return NULL; + + if (!find_class_global("org/navitproject/navit/Navit", &NavitClass)) + return NULL; + Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); + if (Navit_disableSuspend == NULL) + return NULL; + Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); + if (Navit_exit == NULL) + return NULL; + Navit_fullscreen = (*jnienv)->GetMethodID(jnienv, NavitClass, "fullscreen", "(I)V"); + if (Navit_fullscreen == NULL) + return NULL; + Navit_runOptionsItem = (*jnienv)->GetMethodID(jnienv, NavitClass, "runOptionsItem", "(I)V"); + if (Navit_runOptionsItem == NULL) + return NULL; + Navit_showMenu = (*jnienv)->GetMethodID(jnienv, NavitClass, "showMenu", "()V"); + if (Navit_showMenu == NULL) + return NULL; + Navit_showNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "showNativeKeyboard", "()I"); + Navit_hideNativeKeyboard = (*jnienv)->GetMethodID(jnienv, NavitClass, "hideNativeKeyboard", "()V"); + + dbg(lvl_debug,"ok"); + *meth=event_android_methods; + return NULL; } @@ -1164,16 +1096,16 @@ event_android_new(struct event_methods *meth) * @return True if the input method is going to be displayed, false if not. */ int show_native_keyboard (struct graphics_keyboard *kbd) { - kbd->w = -1; - if (Navit_showNativeKeyboard == NULL) { - dbg(lvl_error, "method Navit.showNativeKeyboard() not found, cannot display keyboard\n"); - return 0; - } - kbd->h = (*jnienv)->CallIntMethod(jnienv, android_activity, Navit_showNativeKeyboard); - dbg(lvl_error, "keyboard size is %d x %d px\n", kbd->w, kbd->h); - dbg(lvl_error, "return\n"); - /* zero height means we're not showing a keyboard, therefore normalize height to boolean */ - return !!(kbd->h); + kbd->w = -1; + if (Navit_showNativeKeyboard == NULL) { + dbg(lvl_error, "method Navit.showNativeKeyboard() not found, cannot display keyboard"); + return 0; + } + kbd->h = (*jnienv)->CallIntMethod(jnienv, android_activity, Navit_showNativeKeyboard); + dbg(lvl_error, "keyboard size is %d x %d px", kbd->w, kbd->h); + dbg(lvl_error, "return"); + /* zero height means we're not showing a keyboard, therefore normalize height to boolean */ + return !!(kbd->h); } @@ -1185,19 +1117,17 @@ int show_native_keyboard (struct graphics_keyboard *kbd) { * will be freed by this function. */ void hide_native_keyboard (struct graphics_keyboard *kbd) { - if (Navit_hideNativeKeyboard == NULL) { - dbg(lvl_error, "method Navit.hideNativeKeyboard() not found, cannot dismiss keyboard\n"); - return; - } - (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_hideNativeKeyboard); - g_free(kbd->gra_priv); + if (Navit_hideNativeKeyboard == NULL) { + dbg(lvl_error, "method Navit.hideNativeKeyboard() not found, cannot dismiss keyboard"); + return; + } + (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_hideNativeKeyboard); + g_free(kbd->gra_priv); } -void -plugin_init(void) -{ - dbg(lvl_debug,"enter\n"); - plugin_register_category_graphics("android", graphics_android_new); - plugin_register_category_event("android", event_android_new); +void plugin_init(void) { + dbg(lvl_debug,"enter"); + plugin_register_category_graphics("android", graphics_android_new); + plugin_register_category_event("android", event_android_new); } |