diff options
author | rikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-03-12 20:40:57 +0000 |
---|---|---|
committer | rikky <rikky@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-03-12 20:40:57 +0000 |
commit | 74aa411b815bd9c66e7c850de88b9494c37b6f96 (patch) | |
tree | 05830bcf1f621336fe05f9b8ff842ae45d535156 /navit/graphics/android | |
parent | 4c47b444c592f036d062a26020faf73fa2af75b7 (diff) | |
download | navit-svn-74aa411b815bd9c66e7c850de88b9494c37b6f96.tar.gz |
Add:android/graphics:Add an image cache to speed up map and gui drawing
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4335 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/graphics/android')
-rw-r--r-- | navit/graphics/android/graphics_android.c | 100 |
1 files changed, 57 insertions, 43 deletions
diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c index 386016c3..ce141f13 100644 --- a/navit/graphics/android/graphics_android.c +++ b/navit/graphics/android/graphics_android.c @@ -57,6 +57,7 @@ struct graphics_priv { struct callback_list *cbl; struct window win; + GHashTable *image_cache_hash; }; struct graphics_font_priv { @@ -64,7 +65,7 @@ struct graphics_font_priv { }; struct graphics_gc_priv { - struct graphics_priv *gra; + struct graphics_priv *gra; int linewidth; enum draw_mode_num mode; int a,r,g,b; @@ -72,6 +73,9 @@ struct graphics_gc_priv { struct graphics_image_priv { jobject Bitmap; + int width; + int height; + struct point hot; }; static int @@ -194,48 +198,59 @@ static struct graphics_image_methods image_methods = { 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=g_new0(struct graphics_image_priv, 1); - jstring string; - int id; - - dbg(1,"enter %s\n",path); - *meth=image_methods; - if (!strncmp(path,"res/drawable/",13)) { - jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); - jstring b=(*jnienv)->NewStringUTF(jnienv, "org.navitproject.navit"); - char *path_noext=g_strdup(path+13); - char *pos=strrchr(path_noext, '.'); - if (pos) - *pos='\0'; - dbg(1,"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, b); - dbg(1,"id=%d\n",id); - if (id) - ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); - (*jnienv)->DeleteLocalRef(jnienv, b); - (*jnienv)->DeleteLocalRef(jnienv, a); - } else { - string = (*jnienv)->NewStringUTF(jnienv, path); - ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); + struct graphics_image_priv* ret; + + if ( !g_hash_table_lookup_extended( gra->image_cache_hash, path, NULL, (gpointer)&ret) ) + { + ret=g_new0(struct graphics_image_priv, 1); + jstring string; + int id; + + dbg(1,"enter %s\n",path); + if (!strncmp(path,"res/drawable/",13)) { + jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); + jstring b=(*jnienv)->NewStringUTF(jnienv, "org.navitproject.navit"); + char *path_noext=g_strdup(path+13); + char *pos=strrchr(path_noext, '.'); + if (pos) + *pos='\0'; + dbg(1,"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, b); + dbg(1,"id=%d\n",id); + if (id) + ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); + (*jnienv)->DeleteLocalRef(jnienv, b); + (*jnienv)->DeleteLocalRef(jnienv, a); + } else { + string = (*jnienv)->NewStringUTF(jnienv, path); + ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); + } + dbg(1,"result=%p\n",ret->Bitmap); + if (ret->Bitmap) { + (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap); + (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap); + ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); + ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); + dbg(1,"w=%d h=%d for %s\n",ret->width,ret->height,path); + ret->hot.x=*w/2; + ret->hot.y=*h/2; + } else { + g_free(ret); + ret=NULL; + dbg(0,"Failed to open %s\n",path); + } + (*jnienv)->DeleteLocalRef(jnienv, string); + g_hash_table_insert(gra->image_cache_hash, g_strdup( path ), (gpointer)ret ); } - dbg(1,"result=%p\n",ret->Bitmap); - if (ret->Bitmap) { - (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap); - (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap); - *w=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); - *h=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); - dbg(1,"w=%d h=%d for %s\n",*w,*h,path); - hot->x=*w/2; - hot->y=*h/2; - } else { - g_free(ret); - ret=NULL; - dbg(0,"Failed to open %s\n",path); + if (ret) { + *w=ret->width; + *h=ret->height; + if (hot) + *hot=ret->hot; } - (*jnienv)->DeleteLocalRef(jnienv, string); - + return ret; } @@ -356,8 +371,6 @@ get_data(struct graphics_priv *this, char *type) static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) { - (*jnienv)->DeleteGlobalRef(jnienv, priv->Bitmap); - g_free(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) @@ -645,6 +658,7 @@ graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct at if ((attr=attr_search(attrs, NULL, attr_use_camera))) { use_camera=attr->u.num; } + ret->image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) { dbg(0,"returning %p\n",ret); return ret; |