diff options
author | mdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2015-01-07 13:28:10 +0000 |
---|---|---|
committer | mdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2015-01-07 13:28:10 +0000 |
commit | ba6fedc9c502bff61db82165e95275b84692cef4 (patch) | |
tree | b41fcd042d7e3013d182cf884cc5fc51fbbe1524 /navit/graphics | |
parent | 495e4950aafbaf7d3a3186ba96ecf52e491c8026 (diff) | |
download | navit-ba6fedc9c502bff61db82165e95275b84692cef4.tar.gz |
Add:graphics_android:Allow to scale images.
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@5992 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/graphics')
-rw-r--r-- | navit/graphics/android/graphics_android.c | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c index 829082153..38c711516 100644 --- a/navit/graphics/android/graphics_android.c +++ b/navit/graphics/android/graphics_android.c @@ -48,7 +48,7 @@ struct graphics_priv { jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; jclass BitmapClass; - jmethodID Bitmap_getHeight, Bitmap_getWidth; + jmethodID Bitmap_getHeight, Bitmap_getWidth, Bitmap_createScaledBitmap; jclass ContextClass; jmethodID Context_getResources; @@ -216,49 +216,55 @@ image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char * { struct graphics_image_priv* ret = NULL; - if ( !g_hash_table_lookup_extended( image_cache_hash, path, NULL, (gpointer)&ret) ) - { - 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); - } - dbg(lvl_debug,"result=%p\n",localBitmap); - if (localBitmap) { - ret->Bitmap = (*jnienv)->NewGlobalRef(jnienv, localBitmap); - (*jnienv)->DeleteLocalRef(jnienv, localBitmap); - ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); - ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); - 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); + 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!=-1 || *h!=-1) { + jclass scaledBitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapClass, + gra->Bitmap_createScaledBitmap, localBitmap, (*w==-1)?ret->width:*w, (*h==-1)?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; + } } - (*jnienv)->DeleteLocalRef(jnienv, string); - g_hash_table_insert(image_cache_hash, g_strdup( path ), (gpointer)ret ); + 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; @@ -551,6 +557,8 @@ graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, s 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; |