summaryrefslogtreecommitdiff
path: root/navit
diff options
context:
space:
mode:
authormdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-01-07 13:28:10 +0000
committermdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-01-07 13:28:10 +0000
commit74cf49ec0ec52e089b57fc2975999b5dc75eac1d (patch)
treeb41fcd042d7e3013d182cf884cc5fc51fbbe1524 /navit
parentf62bfb4396124d70e309b58da263dadbf6d96e71 (diff)
downloadnavit-svn-74cf49ec0ec52e089b57fc2975999b5dc75eac1d.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')
-rw-r--r--navit/graphics/android/graphics_android.c92
1 files changed, 50 insertions, 42 deletions
diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c
index 82908215..38c71151 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;