/[zanavi_public1]/navit/navit/graphics/android/graphics_android.c
ZANavi

Diff of /navit/navit/graphics/android/graphics_android.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 2 Revision 31
1/**
2 * ZANavi, Zoff Android Navigation system.
3 * Copyright (C) 2011-2012 Zoff <zoff@zoff.cc>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * version 2 as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
1/** 20/**
2 * Navit, a modular navigation system. 21 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team 22 * Copyright (C) 2005-2008 Navit Team
4 * 23 *
5 * This program is free software; you can redistribute it and/or 24 * This program is free software; you can redistribute it and/or
30#include "callback.h" 49#include "callback.h"
31#include "android.h" 50#include "android.h"
32 51
33int dummy; 52int dummy;
34 53
54jclass NavitClass2 = NULL;
55jmethodID Navit_get_graphics_object_by_name;
56
35struct graphics_priv { 57struct graphics_priv
58{
36 jclass NavitGraphicsClass; 59 jclass NavitGraphicsClass;
37 jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polyline2, NavitGraphics_draw_polyline_dashed, NavitGraphics_draw_polygon, NavitGraphics_draw_polygon2, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_bigmap, NavitGraphics_send_osd_values, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera,NavitGraphicsClass_rotate_and_scale_bitmap; 60 jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polyline2, NavitGraphics_draw_polyline3, NavitGraphics_draw_polyline4, NavitGraphics_draw_polyline_dashed, NavitGraphics_set_dashes, NavitGraphics_draw_polygon, NavitGraphics_draw_polygon2, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image,
61 NavitGraphics_draw_bigmap, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera, NavitGraphicsClass_rotate_and_scale_bitmap;
38 62
39 jclass PaintClass; 63 jclass PaintClass;
40 jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB; 64 jmethodID Paint_init, Paint_setStrokeWidth, Paint_setARGB;
41 65
42 jobject NavitGraphics; 66 jobject NavitGraphics;
43 jobject Paint; 67 jobject Paint;
44 68
45 jclass BitmapFactoryClass; 69 jclass BitmapFactoryClass;
46 jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource; 70 jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource;
47 71
48 jclass BitmapClass; 72 jclass BitmapClass;
49 jmethodID Bitmap_getHeight, Bitmap_getWidth; 73 jmethodID Bitmap_getHeight, Bitmap_getWidth;
50 74
57 81
58 struct callback_list *cbl; 82 struct callback_list *cbl;
59 struct window win; 83 struct window win;
60}; 84};
61 85
62struct graphics_font_priv { 86struct graphics_font_priv
87{
63 int size; 88 int size;
64}; 89};
65 90
66struct graphics_gc_priv { 91struct graphics_gc_priv
92{
67 struct graphics_priv *gra; 93 struct graphics_priv *gra;
68 int linewidth; 94 int linewidth;
69 enum draw_mode_num mode; 95 enum draw_mode_num mode;
70 int a,r,g,b; 96 int a, r, g, b;
71}; 97};
72 98
73struct graphics_image_priv { 99struct graphics_image_priv
100{
74 jobject Bitmap; 101 jobject Bitmap;
75 int width; 102 int width;
76 int height; 103 int height;
77 struct point hot; 104 struct point hot;
78}; 105};
79 106
80static GHashTable *image_cache_hash = NULL; 107static GHashTable *image_cache_hash = NULL;
81 108
82static int
83find_class_global(char *name, jclass *ret) 109static int find_class_global(char *name, jclass *ret)
84{ 110{
111 //DBG // dbg(0,"EEnter\n");
112 JNIEnv *jnienv2;
113 jnienv2 = jni_getenv();
114
85 *ret=(*jnienv)->FindClass(jnienv, name); 115 *ret = (*jnienv2)->FindClass(jnienv2, name);
86 if (! *ret) { 116 if (!*ret)
117 {
87 dbg(0,"Failed to get Class %s\n",name); 118 //DBG // dbg(0, "Failed to get Class %s\n", name);
88 return 0; 119 return 0;
89 } 120 }
90 (*jnienv)->NewGlobalRef(jnienv, *ret); 121 *ret = (*jnienv2)->NewGlobalRef(jnienv2, *ret);
91 return 1; 122 return 1;
92} 123}
93 124
94static int
95find_method(jclass class, char *name, char *args, jmethodID *ret) 125static int find_method(jclass class, char *name, char *args, jmethodID *ret)
96{ 126{
127 JNIEnv *jnienv2;
128 jnienv2 = jni_getenv();
129
130 //DBG // dbg(0,"EEnter\n");
97 *ret = (*jnienv)->GetMethodID(jnienv, class, name, args); 131 *ret = (*jnienv2)->GetMethodID(jnienv2, class, name, args);
98 if (*ret == NULL) { 132 if (*ret == NULL)
133 {
99 dbg(0,"Failed to get Method %s with signature %s\n",name,args); 134 //DBG // dbg(0, "Failed to get Method %s with signature %s\n", name, args);
100 return 0; 135 return 0;
101 } 136 }
102 return 1; 137 return 1;
103} 138}
104 139
105static int
106find_static_method(jclass class, char *name, char *args, jmethodID *ret) 140static int find_static_method(jclass class, char *name, char *args, jmethodID *ret)
107{ 141{
142 JNIEnv *jnienv2;
143 jnienv2 = jni_getenv();
144
145 //DBG // dbg(0,"EEnter\n");
108 *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args); 146 *ret = (*jnienv2)->GetStaticMethodID(jnienv2, class, name, args);
109 if (*ret == NULL) { 147 if (*ret == NULL)
148 {
110 dbg(0,"Failed to get static Method %s with signature %s\n",name,args); 149 //DBG // dbg(0, "Failed to get static Method %s with signature %s\n", name, args);
111 return 0; 150 return 0;
112 } 151 }
113 return 1; 152 return 1;
114} 153}
115 154
116static void
117graphics_destroy(struct graphics_priv *gr) 155static void graphics_destroy(struct graphics_priv *gr)
118{ 156{
119} 157}
120 158
121static void font_destroy(struct graphics_font_priv *font) 159static void font_destroy(struct graphics_font_priv *font)
122{ 160{
123 g_free(font); 161 g_free(font);
124} 162}
125 163
126static struct graphics_font_methods font_methods = { 164static struct graphics_font_methods font_methods =
127 font_destroy 165{ font_destroy };
128};
129 166
130static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags) 167static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags)
131{ 168{
132 struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1); 169 struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1);
133 *meth=font_methods; 170 *meth = font_methods;
134 171
135 ret->size=size; 172 ret->size = size;
136 return ret; 173 return ret;
137} 174}
138 175
139static void
140gc_destroy(struct graphics_gc_priv *gc) 176static void gc_destroy(struct graphics_gc_priv *gc)
141{ 177{
142 //dbg(0,"EEnter\n"); 178 //DBG // dbg(0,"EEnter\n");
143 179
144 g_free(gc); 180 g_free(gc);
145} 181}
146 182
147static void
148gc_set_linewidth(struct graphics_gc_priv *gc, int w) 183static void gc_set_linewidth(struct graphics_gc_priv *gc, int w)
149{ 184{
150 gc->linewidth = w; 185 gc->linewidth = w;
151} 186}
152 187
153static void
154gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n)
155{
156 // should call a java routine that does something like:
157 //
158 // paint.setPathEffect(new DashPathEffect(new float[] { 8, 3 }, 1));
159}
160 188
161static void 189// UNUSED --------------
190static void gc_set_dashes(struct graphics_priv *gra, struct graphics_gc_priv *gc, int w, int offset, int dash_list[], int order)
191{
192 //JNIEnv *jnienv2;
193 //jnienv2 = jni_getenv();
194 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_set_dashes, gc->gra->Paint, dash_list[0], order);
195}
196
197
162gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) 198static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
163{ 199{
164 gc->r = c->r >> 8; 200 gc->r = c->r >> 8;
165 gc->g = c->g >> 8; 201 gc->g = c->g >> 8;
166 gc->b = c->b >> 8; 202 gc->b = c->b >> 8;
167 gc->a = c->a >> 8; 203 gc->a = c->a >> 8;
168} 204}
169 205
170static void
171gc_set_background(struct graphics_gc_priv *gc, struct color *c) 206static void gc_set_background(struct graphics_gc_priv *gc, struct color *c)
172{ 207{
173} 208}
174 209
175static struct graphics_gc_methods gc_methods = { 210static struct graphics_gc_methods gc_methods =
176 gc_destroy, 211{ gc_destroy, gc_set_linewidth, gc_set_dashes, gc_set_foreground, gc_set_background };
177 gc_set_linewidth,
178 gc_set_dashes,
179 gc_set_foreground,
180 gc_set_background
181};
182 212
183static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) 213static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
184{ 214{
185 //dbg(0,"EEnter\n"); 215 ////DBG // dbg(0,"EEnter\n");
186 216
187 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1); 217 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1);
188 *meth=gc_methods; 218 *meth = gc_methods;
189 219
190 ret->gra = gr; 220 ret->gra = gr;
191 ret->a = ret->r = ret->g = ret->b = 255; 221 ret->a = ret->r = ret->g = ret->b = 255;
192 ret->linewidth=1; 222 ret->linewidth = 1;
193 return ret; 223 return ret;
194} 224}
195 225
196static void image_destroy(struct graphics_image_priv *img) 226static void image_destroy(struct graphics_image_priv *img)
197{ 227{
198 // unused? 228 // unused?
199} 229}
200 230
201static struct graphics_image_methods image_methods = { 231static struct graphics_image_methods image_methods =
202 image_destroy 232{ image_destroy };
203};
204
205 233
206static struct graphics_image_priv * 234static struct graphics_image_priv *
207image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation) 235image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation)
208{ 236{
209 //dbg(0,"EEnter\n"); 237 //DBG // dbg(0,"EEnter\n");
238
239 JNIEnv *jnienv2;
240 jnienv2 = jni_getenv();
241
242 int thread_id = gettid();
243 // dbg(0, "THREAD ID=%d\n", thread_id);
244
210 245
211 struct graphics_image_priv* ret = NULL; 246 struct graphics_image_priv* ret = NULL;
212 247
213 if ( !g_hash_table_lookup_extended( image_cache_hash, path, NULL, (gpointer)&ret) ) 248 if (!g_hash_table_lookup_extended(image_cache_hash, path, NULL, (gpointer) & ret))
214 { 249 {
215 ret=g_new0(struct graphics_image_priv, 1); 250 ret=g_new0(struct graphics_image_priv, 1);
216 jstring string; 251 jstring string;
217 int id; 252 int id;
218 253
219 dbg(1,"enter %s\n",path); 254 // // dbg(1, "enter %s\n", path);
220 if (!strncmp(path,"res/drawable/",13)) { 255 if (!strncmp(path, "res/drawable/", 13))
256 {
221 jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable"); 257 jstring a = (*jnienv2)->NewStringUTF(jnienv2, "drawable");
222 jstring b=(*jnienv)->NewStringUTF(jnienv, "com.zoffcc.applications.zanavi"); 258 jstring b = (*jnienv2)->NewStringUTF(jnienv2, "com.zoffcc.applications.zanavi");
223 char *path_noext=g_strdup(path+13); 259 char *path_noext = g_strdup(path + 13);
224 char *pos=strrchr(path_noext, '.'); 260 char *pos = strrchr(path_noext, '.');
225 if (pos) 261 if (pos)
226 *pos='\0'; 262 *pos = '\0';
227 dbg(1,"path_noext=%s\n",path_noext); 263 //DBG // dbg(0, "path_noext=%s\n", path_noext);
228 string = (*jnienv)->NewStringUTF(jnienv, path_noext); 264 string = (*jnienv2)->NewStringUTF(jnienv2, path_noext);
229 g_free(path_noext); 265 g_free(path_noext);
230 id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, b); 266 id = (*jnienv2)->CallIntMethod(jnienv2, gra->Resources, gra->Resources_getIdentifier, string, a, b);
231 dbg(1,"id=%d\n",id); 267 //DBG // dbg(0, "id=%d\n", id);
268 //DBG // dbg(0,"JNI\n");
232 if (id) 269 if (id)
270 {
233 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id); 271 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id);
272 }
234 (*jnienv)->DeleteLocalRef(jnienv, b); 273 (*jnienv2)->DeleteLocalRef(jnienv2, b);
235 (*jnienv)->DeleteLocalRef(jnienv, a); 274 (*jnienv2)->DeleteLocalRef(jnienv2, a);
275 }
236 } else { 276 else
277 {
237 string = (*jnienv)->NewStringUTF(jnienv, path); 278 string = (*jnienv2)->NewStringUTF(jnienv2, path);
279 //DBG // dbg(0,"JNI\n");
238 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string); 280 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string);
239 // there should be a check here, if we really want any rotation/scaling 281 // there should be a check here, if we really want any rotation/scaling
240 // otherwise the call is overkill 282 // otherwise the call is overkill
283 //DBG // dbg(0,"JNI\n");
241 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->NavitGraphicsClass, gra->NavitGraphicsClass_rotate_and_scale_bitmap, ret->Bitmap, *w, *h, rotation); 284 ret->Bitmap = (*jnienv2)->CallStaticObjectMethod(jnienv2, gra->NavitGraphicsClass, gra->NavitGraphicsClass_rotate_and_scale_bitmap, ret->Bitmap, *w, *h, rotation);
242 } 285 }
243 dbg(1,"result=%p\n",ret->Bitmap); 286 //// dbg(1, "result=%p\n", ret->Bitmap);
244 if (ret->Bitmap) { 287 if (ret->Bitmap)
288 {
289 //DBG // dbg(0,"JNI\n");
245 (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap); 290 ret->Bitmap = (*jnienv2)->NewGlobalRef(jnienv2, ret->Bitmap);
246 (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap); 291 // ICS (*jnienv2)->DeleteLocalRef(jnienv2, ret->Bitmap);
292 //DBG // dbg(0,"JNI\n");
247 ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth); 293 ret->width = (*jnienv2)->CallIntMethod(jnienv2, ret->Bitmap, gra->Bitmap_getWidth);
294 //DBG // dbg(0,"JNI\n");
248 ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight); 295 ret->height = (*jnienv2)->CallIntMethod(jnienv2, ret->Bitmap, gra->Bitmap_getHeight);
249 dbg(1,"w=%d h=%d for %s\n",ret->width,ret->height,path); 296 //// dbg(1, "w=%d h=%d for %s\n", ret->width, ret->height, path);
250 ret->hot.x=ret->width/2; 297 ret->hot.x = ret->width / 2;
251 ret->hot.y=ret->height/2; 298 ret->hot.y = ret->height / 2;
299 }
252 } else { 300 else
301 {
253 g_free(ret); 302 g_free(ret);
254 ret=NULL; 303 ret = NULL;
255 dbg(0,"Failed to open %s\n",path); 304 //DBG // dbg(0, "Failed to open %s\n", path);
256 } 305 }
306 //DBG // dbg(0,"JNI\n");
257 (*jnienv)->DeleteLocalRef(jnienv, string); 307 (*jnienv2)->DeleteLocalRef(jnienv2, string);
308 //DBG // dbg(0,"JNI\n");
258 g_hash_table_insert(image_cache_hash, g_strdup( path ), (gpointer)ret ); 309 g_hash_table_insert(image_cache_hash, g_strdup(path), (gpointer) ret);
259 } 310 }
260 if (ret) { 311 if (ret)
312 {
261 *w=ret->width; 313 *w = ret->width;
262 *h=ret->height; 314 *h = ret->height;
263 if (hot) 315 if (hot)
316 {
264 *hot=ret->hot; 317 *hot = ret->hot;
318 }
265 } 319 }
266 320
267 return ret; 321 return ret;
268} 322}
269 323
270static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc) 324static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc)
271{ 325{
272 //dbg(0,"EEnter\n"); 326 //DBG // dbg(0,"EEnter\n");
273 327
328 JNIEnv *jnienv2;
329 jnienv2 = jni_getenv();
330
274 float wf = gc->linewidth; 331 float wf = gc->linewidth;
275 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setStrokeWidth, wf); 332 (*jnienv2)->CallVoidMethod(jnienv2, gc->gra->Paint, gra->Paint_setStrokeWidth, wf);
276 (*jnienv)->CallVoidMethod(jnienv, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b); 333 (*jnienv2)->CallVoidMethod(jnienv2, gc->gra->Paint, gra->Paint_setARGB, gc->a, gc->r, gc->g, gc->b);
277} 334}
278 335
279static void
280draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) 336static void draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
281{ 337{
338 //DBG // dbg(0,"EEnter\n");
282 jint pc[count*2]; 339 jint pc[count * 2];
340 int i;
341 jintArray points;
342
343 if (count <= 0)
344 return;
345
346 JNIEnv *jnienv2;
347 jnienv2 = jni_getenv();
348
349 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
350 for (i = 0; i < count; i++)
351 {
352 pc[i * 2] = p[i].x;
353 pc[i * 2 + 1] = p[i].y;
354 }
355 initPaint(gra, gc);
356 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
357 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points);
358 (*jnienv2)->DeleteLocalRef(jnienv2, points);
359}
360
361static void draw_lines3(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width, int dashes, struct color *c)
362{
363 //DBG // dbg(0,"EEnter\n");
364 jint pc[count * 2];
365 int i;
366 jintArray points;
367 if (count <= 0)
368 {
369 return;
370 }
371
372 JNIEnv *jnienv2;
373 jnienv2 = jni_getenv();
374
375 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
376 for (i = 0; i < count; i++)
377 {
378 pc[i * 2] = p[i].x;
379 pc[i * 2 + 1] = p[i].y;
380 }
381 //initPaint(gra, gc);
382 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
383 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline3, points, order, width, dashes, c->r >> 8, c->g >> 8, c->b >> 8, c->a >> 8);
384 (*jnienv2)->DeleteLocalRef(jnienv2, points);
385}
386
387static void draw_lines4(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int width, int type, int dashes, struct color *c)
388{
389 //DBG // dbg(0,"EEnter\n");
390
391 // draw tunnel-street or bridge-street
392 // type:1 -> tunnel
393 // type:2 -> bridge
394 // ------------------------------------------
395 // type > 90 -> some signal (not a real line)
396
397 JNIEnv *jnienv2;
398 jnienv2 = jni_getenv();
399
400
401 if (type > 90)
402 {
403 // "***" signal
404 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline4, NULL, order, width, type, 0, 0, 0, 0, 0);
405 }
406 else
407 {
408 jint pc[count * 2];
409 int i;
410 jintArray points;
411 if (count <= 0)
412 {
413 return;
414 }
415 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
416 for (i = 0; i < count; i++)
417 {
418 pc[i * 2] = p[i].x;
419 pc[i * 2 + 1] = p[i].y;
420 }
421 // initPaint(gra, gc);
422 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
423 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline4, points, order, width, type, dashes, c->r >> 8, c->g >> 8, c->b >> 8, c->a >> 8);
424 (*jnienv2)->DeleteLocalRef(jnienv2, points);
425 }
426}
427
428static void draw_lines2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
429{
430 //DBG // dbg(0,"EEnter\n");
431 jint pc[count * 2];
283 int i; 432 int i;
284 jintArray points; 433 jintArray points;
285 if (count <= 0) 434 if (count <= 0)
286 return; 435 return;
436
437 JNIEnv *jnienv2;
438 jnienv2 = jni_getenv();
439
287 points = (*jnienv)->NewIntArray(jnienv,count*2); 440 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
288 for (i = 0 ; i < count ; i++) { 441 for (i = 0; i < count; i++)
442 {
289 pc[i*2]=p[i].x; 443 pc[i * 2] = p[i].x;
290 pc[i*2+1]=p[i].y; 444 pc[i * 2 + 1] = p[i].y;
291 } 445 }
292 initPaint(gra, gc); 446 initPaint(gra, gc);
293 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); 447 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
294 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points); 448 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline2, gc->gra->Paint, points, order, oneway);
295 (*jnienv)->DeleteLocalRef(jnienv, points); 449 (*jnienv2)->DeleteLocalRef(jnienv2, points);
296} 450}
297 451
298static void
299draw_lines2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 452static void draw_lines_dashed(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
300{ 453{
301 jint pc[count*2]; 454 jint pc[count * 2];
302 int i; 455 int i;
303 jintArray points; 456 jintArray points;
304 if (count <= 0) 457 if (count <= 0)
305 return; 458 return;
459
460 JNIEnv *jnienv2;
461 jnienv2 = jni_getenv();
462
306 points = (*jnienv)->NewIntArray(jnienv,count*2); 463 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
307 for (i = 0 ; i < count ; i++) { 464 for (i = 0; i < count; i++)
465 {
308 pc[i*2]=p[i].x; 466 pc[i * 2] = p[i].x;
309 pc[i*2+1]=p[i].y; 467 pc[i * 2 + 1] = p[i].y;
310 } 468 }
311 initPaint(gra, gc); 469 initPaint(gra, gc);
312 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); 470 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
313 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline2, gc->gra->Paint, points, order, oneway); 471 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polyline_dashed, gc->gra->Paint, points, order, oneway);
314 (*jnienv)->DeleteLocalRef(jnienv, points); 472 (*jnienv2)->DeleteLocalRef(jnienv2, points);
315} 473}
316 474
317
318static void
319draw_lines_dashed(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 475static void draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
320{ 476{
321 jint pc[count*2]; 477 jint pc[count * 2];
322 int i; 478 int i;
323 jintArray points; 479 jintArray points;
324 if (count <= 0) 480 if (count <= 0)
325 return; 481 return;
482
483 JNIEnv *jnienv2;
484 jnienv2 = jni_getenv();
485
326 points = (*jnienv)->NewIntArray(jnienv,count*2); 486 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
327 for (i = 0 ; i < count ; i++) { 487 for (i = 0; i < count; i++)
488 {
328 pc[i*2]=p[i].x; 489 pc[i * 2] = p[i].x;
329 pc[i*2+1]=p[i].y; 490 pc[i * 2 + 1] = p[i].y;
330 } 491 }
331 initPaint(gra, gc); 492 initPaint(gra, gc);
332 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); 493 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
333 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline_dashed, gc->gra->Paint, points, order, oneway); 494 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points);
334 (*jnienv)->DeleteLocalRef(jnienv, points); 495 (*jnienv2)->DeleteLocalRef(jnienv2, points);
335} 496}
336 497
337static void
338draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count) 498static void draw_polygon2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
339{ 499{
340 jint pc[count*2]; 500 jint pc[count * 2];
341 int i; 501 int i;
342 jintArray points; 502 jintArray points;
343 if (count <= 0) 503 if (count <= 0)
344 return; 504 return;
505
506 JNIEnv *jnienv2;
507 jnienv2 = jni_getenv();
508
345 points = (*jnienv)->NewIntArray(jnienv,count*2); 509 points = (*jnienv2)->NewIntArray(jnienv2, count * 2);
346 for (i = 0 ; i < count ; i++) { 510 for (i = 0; i < count; i++)
511 {
347 pc[i*2]=p[i].x; 512 pc[i * 2] = p[i].x;
348 pc[i*2+1]=p[i].y; 513 pc[i * 2 + 1] = p[i].y;
349 } 514 }
350 initPaint(gra, gc); 515 initPaint(gra, gc);
351 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc); 516 (*jnienv2)->SetIntArrayRegion(jnienv2, points, 0, count * 2, pc);
352 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points); 517 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_polygon2, gc->gra->Paint, points, order, oneway);
353 (*jnienv)->DeleteLocalRef(jnienv, points); 518 (*jnienv2)->DeleteLocalRef(jnienv2, points);
354} 519}
355 520
356static void
357draw_polygon2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway) 521static void draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h)
358{ 522{
359 jint pc[count*2]; 523 JNIEnv *jnienv2;
360 int i; 524 jnienv2 = jni_getenv();
361 jintArray points; 525
362 if (count <= 0)
363 return;
364 points = (*jnienv)->NewIntArray(jnienv,count*2);
365 for (i = 0 ; i < count ; i++) {
366 pc[i*2]=p[i].x;
367 pc[i*2+1]=p[i].y;
368 }
369 initPaint(gra, gc); 526 initPaint(gra, gc);
370 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
371 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon2, gc->gra->Paint, points, order, oneway);
372 (*jnienv)->DeleteLocalRef(jnienv, points);
373}
374
375
376static void
377draw_rectangle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int w, int h)
378{
379 initPaint(gra, gc);
380 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h); 527 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_rectangle, gc->gra->Paint, p->x, p->y, w, h);
381} 528}
382 529
383static void
384draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r) 530static void draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r)
385{ 531{
532 JNIEnv *jnienv2;
533 jnienv2 = jni_getenv();
534
386 initPaint(gra, gc); 535 initPaint(gra, gc);
387 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r); 536 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r);
388} 537}
389 538
390
391static void
392draw_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) 539static 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)
393{ 540{
394 dbg(1,"enter %s\n", text); 541 //// dbg(1, "enter %s\n", text);
542 JNIEnv *jnienv2;
543 jnienv2 = jni_getenv();
544
395 initPaint(gra, fg); 545 initPaint(gra, fg);
396 jstring string = (*jnienv)->NewStringUTF(jnienv, text); 546 jstring string = (*jnienv2)->NewStringUTF(jnienv2, text);
397 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy); 547 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy);
398 (*jnienv)->DeleteLocalRef(jnienv, string); 548 (*jnienv2)->DeleteLocalRef(jnienv2, string);
399} 549}
400 550
401static void
402draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img) 551static void draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img)
403{ 552{
404 //dbg(0,"EEnter\n"); 553 //DBG // dbg(0,"EEnter\n");
405 554
555 JNIEnv *jnienv2;
556 jnienv2 = jni_getenv();
557
406 dbg(1,"enter %p\n",img); 558 //// dbg(1, "enter %p\n", img);
407 initPaint(gra, fg); 559 initPaint(gra, fg);
408 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap); 560 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap);
409
410}
411 561
412static void 562}
563
413draw_bigmap(struct graphics_priv *gra, struct graphics_gc_priv *fg, int yaw, int order, float clat, float clng, int x, int y, int scx, int scy, int px, int py, int valid) 564static void draw_bigmap(struct graphics_priv *gra, struct graphics_gc_priv *fg, int yaw, int order, float clat, float clng, int x, int y, int scx, int scy, int px, int py, int valid)
414{ 565{
415 //dbg(0,"EEnter\n"); 566 //DBG // dbg(0,"EEnter\n");
416 567
568 JNIEnv *jnienv2;
569 jnienv2 = jni_getenv();
570
417 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_bigmap, yaw, order, clat, clng, x, y, scx, scy, px, py, valid); 571 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_bigmap, yaw, order, clat, clng, x, y, scx, scy, px, py, valid);
418}
419 572
420static void 573 //DBG // dbg(0,"leave\n");
421send_osd_values(struct graphics_priv *gra, struct graphics_gc_priv *fg, char *id, char *text1, char *text2, char *text3, int i1, int i2, int i3, int i4, float f1, float f2, float f3)
422{
423 //dbg(0,"EEnter\n");
424
425 jstring string1 = (*jnienv)->NewStringUTF(jnienv, id);
426 jstring string2 = (*jnienv)->NewStringUTF(jnienv, text1);
427 jstring string3 = (*jnienv)->NewStringUTF(jnienv, text2);
428 jstring string4 = (*jnienv)->NewStringUTF(jnienv, text3);
429 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_send_osd_values, string1, string2, string3, string4, i1, i2, i3, i4, f1, f2, f3);
430 (*jnienv)->DeleteLocalRef(jnienv, string1);
431 (*jnienv)->DeleteLocalRef(jnienv, string2);
432 (*jnienv)->DeleteLocalRef(jnienv, string3);
433 (*jnienv)->DeleteLocalRef(jnienv, string4);
434} 574}
435 575
436
437static void
438draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data) 576static void draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data)
439{ 577{
440} 578}
441 579
442static void
443draw_restore(struct graphics_priv *gr, struct point *p, int w, int h) 580static void draw_restore(struct graphics_priv *gr, struct point *p, int w, int h)
444{ 581{
445} 582}
446 583
447static void draw_drag(struct graphics_priv *gra, struct point *p) 584static void draw_drag(struct graphics_priv *gra, struct point *p)
448{ 585{
449 //dbg(0,"EEnter\n"); 586 //DBG // dbg(0,"EEnter\n");
587 JNIEnv *jnienv2;
588 jnienv2 = jni_getenv();
450 589
451 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0); 590 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0);
452} 591}
453 592
454static void
455background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) 593static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
456{ 594{
457} 595}
458 596
459static void
460draw_mode(struct graphics_priv *gra, enum draw_mode_num mode) 597static void draw_mode(struct graphics_priv *gra, enum draw_mode_num mode)
461{ 598{
462 //dbg(0,"EEnter\n"); 599 //DBG // dbg(0,"EEnter\n");
600 JNIEnv *jnienv2;
601 jnienv2 = jni_getenv();
463 602
464 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode); 603 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int) mode);
465} 604}
466 605
467static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound); 606static struct graphics_priv * overlay_new(const char* name, struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound);
468 607
469static void * 608static void *
470get_data(struct graphics_priv *this, const char *type) 609get_data(struct graphics_priv *this, const char *type)
471{ 610{
472 //dbg(0,"EEnter\n"); 611 //DBG // dbg(0,"EEnter\n");
473 612
474 if (strcmp(type,"window")) 613 if (strcmp(type, "window"))
614 {
475 return NULL; 615 return NULL;
616 }
617
476 return &this->win; 618 return &this->win;
477} 619}
478 620
479static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv) 621static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
480{ 622{
481} 623}
482 624
483static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate) 625static void get_text_bbox(struct graphics_priv *gr, struct graphics_font_priv *font, char *text, int dx, int dy, struct point *ret, int estimate)
484{ 626{
485 //dbg(0,"EEnter\n"); 627 ////DBG // dbg(0,"EEnter\n");
628
629 // this is a rough estimate!! otherwise java methods would be called, and thats too slow!
486 630
487 int len = g_utf8_strlen(text, -1); 631 int len = g_utf8_strlen(text, -1);
488 int xMin = 0; 632 int xMin = 0;
489 int yMin = 0; 633 int yMin = 0;
490 int yMax = 13*font->size/256; 634 int yMax = 13 * font->size / 256;
491 int xMax = 9*font->size*len/256; 635 int xMax = 9 * font->size * len / 256;
492 636
493 ret[0].x = xMin; 637 ret[0].x = xMin;
494 ret[0].y = -yMin; 638 ret[0].y = -yMin;
495 ret[1].x = xMin; 639 ret[1].x = xMin;
496 ret[1].y = -yMax; 640 ret[1].y = -yMax;
500 ret[3].y = -yMin; 644 ret[3].y = -yMin;
501} 645}
502 646
503static void overlay_disable(struct graphics_priv *gra, int disable) 647static void overlay_disable(struct graphics_priv *gra, int disable)
504{ 648{
649 // UNUSED ----
650
651 //DBG // dbg(0,"EEnter\n");
652 //JNIEnv *jnienv2;
653 //jnienv2 = jni_getenv();
654 //
505 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable); 655 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable);
506} 656}
507 657
508static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound) 658static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound)
509{ 659{
660 // UNUSED ----
661
662 //DBG // dbg(0,"EEnter\n");
663 //JNIEnv *jnienv2;
664 //jnienv2 = jni_getenv();
665 //
510 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound); 666 //(*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x : 0, pnt ? pnt->y : 0, w, h, alpha, wraparound);
511} 667}
512 668
513static int
514set_attr(struct graphics_priv *gra, struct attr *attr) 669static int set_attr(struct graphics_priv *gra, struct attr *attr)
515{ 670{
671 //DBG // dbg(0,"EEnter\n");
672 JNIEnv *jnienv2;
673 jnienv2 = jni_getenv();
674
516 switch (attr->type) { 675 switch (attr->type)
676 {
517 case attr_use_camera: 677 case attr_use_camera:
518 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num); 678 (*jnienv2)->CallVoidMethod(jnienv2, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num);
519 return 1; 679 return 1;
520 default: 680 default:
521 return 0; 681 return 0;
522 } 682 }
523} 683}
524 684
525static struct graphics_methods graphics_methods = { 685static struct graphics_methods graphics_methods =
526 graphics_destroy, 686{ graphics_destroy, draw_mode, draw_lines, draw_lines2, draw_lines3, draw_lines4, draw_lines_dashed, draw_polygon, draw_polygon2, draw_rectangle, draw_circle, draw_text, draw_image, draw_bigmap, draw_image_warp, draw_restore, draw_drag, font_new, gc_new, background_gc, overlay_new, image_new, get_data,
527 draw_mode, 687 image_free, get_text_bbox, overlay_disable, overlay_resize, set_attr, };
528 draw_lines,
529 draw_lines2,
530 draw_lines_dashed,
531 draw_polygon,
532 draw_polygon2,
533 draw_rectangle,
534 draw_circle,
535 draw_text,
536 draw_image,
537 draw_bigmap,
538 send_osd_values,
539 draw_image_warp,
540 draw_restore,
541 draw_drag,
542 font_new,
543 gc_new,
544 background_gc,
545 overlay_new,
546 image_new,
547 get_data,
548 image_free,
549 get_text_bbox,
550 overlay_disable,
551 overlay_resize,
552 set_attr,
553};
554 688
555static void 689/*
556resize_callback(struct graphics_priv *gra, int w, int h) 690static void resize_callback(struct graphics_priv *gra, int w, int h)
557{ 691{
558 //dbg(0,"EEnter\n"); 692 //DBG // dbg(0,"EEnter\n");
559
560 // dbg(0,"w=%d h=%d ok\n",w,h); 693 // //DBG // dbg(0,"w=%d h=%d ok\n",w,h);
561 callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h); 694 // callback_list_call_attr_2(gra->cbl, attr_resize, (void *) w, (void *) h);
695 navit_resize(attr_resize, this_);
562} 696}
697*/
563 698
564static void 699/*
565motion_callback(struct graphics_priv *gra, int x, int y) 700static void motion_callback(struct graphics_priv *gra, int x, int y)
566{ 701{
567 //dbg(0,"EEnter\n"); 702 //DBG // dbg(0,"EEnter\n");
568 703
569 struct point p; 704 struct point p;
570 p.x=x; 705 p.x = x;
571 p.y=y; 706 p.y = y;
572 callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p); 707 callback_list_call_attr_1(gra->cbl, attr_motion, (void *) &p);
573} 708}
709*/
574 710
575static void 711/*
576keypress_callback(struct graphics_priv *gra, char *s) 712static void keypress_callback(struct graphics_priv *gra, char *s)
577{ 713{
714 //DBG // dbg(0,"EEnter\n");
578 callback_list_call_attr_1(gra->cbl, attr_keypress, s); 715 callback_list_call_attr_1(gra->cbl, attr_keypress, s);
579} 716}
717*/
580 718
581static void 719/*
582button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y) 720static void button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y)
583{ 721{
584 //dbg(0,"EEnter\n"); 722 //DBG // dbg(0,"EEnter\n");
585 723
586 struct point p; 724 struct point p;
587 p.x=x; 725 p.x = x;
588 p.y=y; 726 p.y = y;
589 // dbg(0,"XXXXXXXYYYYYYYYY\n"); 727 // //DBG // dbg(0,"XXXXXXXYYYYYYYYY\n");
590 callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p); 728 callback_list_call_attr_3(gra->cbl, attr_button, (void *) pressed, (void *) button, (void *) &p);
591} 729}
730*/
592 731
593
594static int
595set_activity(jobject graphics) 732static int set_activity(jobject graphics)
596{ 733{
597 //dbg(0,"EEnter\n"); 734 // dbg(0,"EEnter\n");
598 735 // ---- DISABLED -------
599 jclass ActivityClass;
600 jmethodID cid;
601
602 ActivityClass = (*jnienv)->GetObjectClass(jnienv, android_activity);
603 // dbg(0,"at 5\n");
604 if (ActivityClass == NULL) {
605 dbg(0,"no activity class found\n");
606 return 0;
607 }
608 // dbg(0,"at 6\n");
609 cid = (*jnienv)->GetMethodID(jnienv, ActivityClass, "setContentView", "(Landroid/view/View;)V");
610 if (cid == NULL) {
611 dbg(0,"no setContentView method found\n");
612 return 0;
613 }
614 // dbg(0,"at 7\n");
615 (*jnienv)->CallVoidMethod(jnienv, android_activity, cid, graphics);
616 // dbg(0,"at 8\n");
617 return 1; 736 return 1;
618} 737}
619 738
620static int
621graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera) 739static int graphics_android_init(const char* name, struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera)
622{ 740{
623 struct callback *cb; 741 struct callback *cb;
624 jmethodID cid;
625 742
743 // overwrite JNIenv!!
744 JNIEnv *jnienv2;
745 jnienv2 = jni_getenv();
746
626 dbg(0,"at 2 jnienv=%p\n",jnienv); 747 // dbg(0, "at 2 jnienv2=%p\n", jnienv2);
748 int thread_id = gettid();
749 // dbg(0, "THREAD ID=%d\n", thread_id);
750
751 //DBG // dbg(0,"a1\n");
627 if (!find_class_global("android/graphics/Paint", &ret->PaintClass)) 752 if (!find_class_global("android/graphics/Paint", &ret->PaintClass))
628 return 0; 753 return 0;
754 //DBG // dbg(0,"a2\n");
629 if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init)) 755 if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init))
630 return 0; 756 return 0;
757 //DBG // dbg(0,"a3\n");
631 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB)) 758 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB))
632 return 0; 759 return 0;
760 //DBG // dbg(0,"a4\n");
633 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth)) 761 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth))
634 return 0; 762 return 0;
635 763
764 //DBG // dbg(0,"a4.1\n");
636 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass)) 765 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass))
637 return 0; 766 return 0;
767 //DBG // dbg(0,"a4.2\n");
638 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile)) 768 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile))
639 return 0; 769 return 0;
770 //DBG // dbg(0,"a4.3\n");
640 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource)) 771 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource))
641 return 0; 772 return 0;
642 773
774 //DBG // dbg(0,"a4.4\n");
643 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass)) 775 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass))
644 return 0; 776 return 0;
777 //DBG // dbg(0,"a4.5\n");
645 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight)) 778 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight))
646 return 0; 779 return 0;
780 //DBG // dbg(0,"a4.6\n");
647 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth)) 781 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth))
648 return 0; 782 return 0;
649 783 //DBG // dbg(0,"a4.7\n");
650 if (!find_class_global("android/content/Context", &ret->ContextClass)) 784 if (!find_class_global("android/content/Context", &ret->ContextClass))
651 return 0; 785 return 0;
786 //DBG // dbg(0,"a4.8\n");
652 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources)) 787 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources))
653 return 0; 788 return 0;
654 789 //DBG // dbg(0,"a5\n");
655
656 ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources); 790 ret->Resources = (*jnienv2)->CallObjectMethod(jnienv2, android_activity, ret->Context_getResources);
791 //DBG // dbg(0,"a6\n");
657 if (ret->Resources) 792 if (ret->Resources)
793 {
658 (*jnienv)->NewGlobalRef(jnienv, ret->Resources); 794 ret->Resources = (*jnienv2)->NewGlobalRef(jnienv2, ret->Resources);
795 }
796 //DBG // dbg(0,"a7\n");
659 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass)) 797 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass))
660 return 0; 798 return 0;
799 //DBG // dbg(0,"a8\n");
661 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier)) 800 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier))
662 return 0; 801 return 0;
663 802 //DBG // dbg(0,"a9\n");
664 if (!find_class_global("com/zoffcc/applications/zanavi/NavitGraphics", &ret->NavitGraphicsClass)) 803 if (!find_class_global("com/zoffcc/applications/zanavi/NavitGraphics", &ret->NavitGraphicsClass))
665 return 0; 804 return 0;
666 dbg(0,"at 3\n"); 805 //DBG // dbg(0, "at 3\n");
667 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lcom/zoffcc/applications/zanavi/NavitGraphics;IIIIIII)V"); 806
668 if (cid == NULL) { 807
669 dbg(0,"no method found\n"); 808 // --------------- Init the new Graphics Object here -----------------
670 return 0; /* exception thrown */ 809 // --------------- Init the new Graphics Object here -----------------
671 } 810 // --------------- Init the new Graphics Object here -----------------
811 // dbg(0,"Init the new Graphics Object here: %s\n", name);
812
672 dbg(0,"at 4 android_activity=%p\n",android_activity); 813 //DBG // dbg(0, "at 4 android_activity=%p\n", android_activity);
814
815
816
817
818 if (NavitClass2 == NULL)
819 {
820 if (!android_find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass2))
821 {
822 NavitClass2 = NULL;
823 return 0;
824 }
825 }
826
827 if (!find_static_method(NavitClass2, "get_graphics_object_by_name", "(Ljava/lang/String;)Lcom/zoffcc/applications/zanavi/NavitGraphics;", &Navit_get_graphics_object_by_name))
828 return 0;
829
830
673 ret->NavitGraphics=(*jnienv)->NewObject(jnienv, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound, use_camera); 831 /// --old-- ret->NavitGraphics = (*jnienv2)->NewObject(jnienv2, ret->NavitGraphicsClass, cid, android_activity, parent ? parent->NavitGraphics : NULL, pnt ? pnt->x : 0, pnt ? pnt->y : 0, w, h, alpha, wraparound, use_camera);
832
833 /// --new--
834 jstring string = (*jnienv2)->NewStringUTF(jnienv2, name);
835 ret->NavitGraphics = (*jnienv2)->CallStaticObjectMethod(jnienv2, NavitClass2, Navit_get_graphics_object_by_name, string);
836 (*jnienv2)->DeleteLocalRef(jnienv2, string);
837 /// --new--
838
839
674 dbg(0,"result=%p\n",ret->NavitGraphics); 840 // dbg(0, "result=%p\n", ret->NavitGraphics);
675 if (ret->NavitGraphics) 841 if (ret->NavitGraphics)
842 {
676 (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics); 843 ret->NavitGraphics = (*jnienv2)->NewGlobalRef(jnienv2, ret->NavitGraphics);
844 }
845
846 // --------------- Init the new Graphics Object here -----------------
847 // --------------- Init the new Graphics Object here -----------------
848 // --------------- Init the new Graphics Object here -----------------
849
850
851
852
853
677 854
678 /* Create a single global Paint, otherwise android will quickly run out 855 /* Create a single global Paint, otherwise android will quickly run out
679 * of global refs.*/ 856 * of global refs.*/
680 /* 0x101 = text kerning (default), antialiasing */ 857 /* 0x101 = text kerning (default), antialiasing */
681 ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101); 858 ret->Paint = (*jnienv2)->NewObject(jnienv2, ret->PaintClass, ret->Paint_init, 0x101);
682 859
683 dbg(0,"result=%p\n",ret->Paint); 860 //DBG // dbg(0, "l result=%p\n", ret->Paint);
684 if (ret->Paint) 861 if (ret->Paint)
862 {
685 (*jnienv)->NewGlobalRef(jnienv, ret->Paint); 863 ret->Paint = (*jnienv2)->NewGlobalRef(jnienv2, ret->Paint);
686
687 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setSizeChangedCallback", "(I)V");
688 if (cid == NULL) {
689 dbg(0,"no SetResizeCallback method found\n");
690 return 0; /* exception thrown */
691 } 864 }
692 cb=callback_new_1(callback_cast(resize_callback), ret); 865 //DBG // dbg(0, "g result=%p\n", ret->Paint);
693 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
694
695 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setButtonCallback", "(I)V");
696 if (cid == NULL) {
697 dbg(0,"no SetButtonCallback method found\n");
698 return 0; /* exception thrown */
699 }
700 cb=callback_new_1(callback_cast(button_callback), ret);
701 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
702
703 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setMotionCallback", "(I)V");
704 if (cid == NULL) {
705 dbg(0,"no SetMotionCallback method found\n");
706 return 0; /* exception thrown */
707 }
708 cb=callback_new_1(callback_cast(motion_callback), ret);
709 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
710 866
711 867
712 // public Bitmap rotate_and_scale_bitmap(Bitmap in, int w, int h, int angle) 868 // public Bitmap rotate_and_scale_bitmap(Bitmap in, int w, int h, int angle)
713 869
714 if (!find_static_method(ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;", &ret->NavitGraphicsClass_rotate_and_scale_bitmap)) 870 if (!find_static_method(ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;", &ret->NavitGraphicsClass_rotate_and_scale_bitmap))
715 return 0; 871 return 0;
716
717 //
718 //cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "rotate_and_scale_bitmap", "(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;");
719 //if (cid == NULL) {
720 // dbg(0,"no rotate_and_scale_bitmap method found\n");
721 // return 0; /* exception thrown */
722 //}
723
724 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "setKeypressCallback", "(I)V");
725 if (cid == NULL) {
726 dbg(0,"no SetKeypressCallback method found\n");
727 return 0; /* exception thrown */
728 }
729 cb=callback_new_1(callback_cast(keypress_callback), ret);
730 (*jnienv)->CallVoidMethod(jnienv, ret->NavitGraphics, cid, (int)cb);
731
732 if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline)) 872 if (!find_method(ret->NavitGraphicsClass, "draw_polyline", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polyline))
733 return 0; 873 return 0;
734 if (!find_method(ret->NavitGraphicsClass, "draw_polyline2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline2)) 874 if (!find_method(ret->NavitGraphicsClass, "draw_polyline2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline2))
735 return 0; 875 return 0;
876 if (!find_method(ret->NavitGraphicsClass, "draw_polyline3", "([IIIIIIII)V", &ret->NavitGraphics_draw_polyline3))
877 return 0;
878 if (!find_method(ret->NavitGraphicsClass, "draw_polyline4", "([IIIIIIIII)V", &ret->NavitGraphics_draw_polyline4))
879 return 0;
736 if (!find_method(ret->NavitGraphicsClass, "draw_polyline_dashed", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline_dashed)) 880 if (!find_method(ret->NavitGraphicsClass, "draw_polyline_dashed", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline_dashed))
737 return 0; 881 return 0;
882 if (!find_method(ret->NavitGraphicsClass, "set_dashes", "(Landroid/graphics/Paint;II)V", &ret->NavitGraphics_set_dashes))
883 return 0;
738 if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon)) 884 if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon))
739 return 0; 885 return 0;
740 if (!find_method(ret->NavitGraphicsClass, "draw_polygon2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polygon2)) 886 if (!find_method(ret->NavitGraphicsClass, "draw_polygon2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polygon2))
741 return 0; 887 return 0;
742 if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle)) 888 if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle))
747 return 0; 893 return 0;
748 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image)) 894 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image))
749 return 0; 895 return 0;
750 if (!find_method(ret->NavitGraphicsClass, "draw_bigmap", "(IIFFIIIIIII)V", &ret->NavitGraphics_draw_bigmap)) 896 if (!find_method(ret->NavitGraphicsClass, "draw_bigmap", "(IIFFIIIIIII)V", &ret->NavitGraphics_draw_bigmap))
751 return 0; 897 return 0;
752 if (!find_method(ret->NavitGraphicsClass, "send_osd_values", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIFFF)V", &ret->NavitGraphics_send_osd_values)) 898
753 return 0;
754 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode)) 899 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode))
755 return 0; 900 return 0;
756 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag)) 901 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag))
757 return 0; 902 return 0;
758 if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable)) 903 //if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable))
759 return 0; 904 // return 0;
760 if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize)) 905 //if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize))
761 return 0; 906 // return 0;
907 /*
762 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera)) 908 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera))
763 return 0; 909 return 0;
910 */
911
912 //DBG // dbg(0,"99\n");
764#if 0 913#if 0
765 set_activity(ret->NavitGraphics); 914 set_activity(ret->NavitGraphics);
766#endif 915#endif
767 return 1; 916 return 1;
768} 917}
769 918
770static int
771graphics_android_fullscreen(struct window *win, int on) 919static int graphics_android_fullscreen(struct window *win, int on)
772{ 920{
773 return 1; 921 return 1;
774} 922}
775 923
776static jclass NavitClass; 924static jclass NavitClass;
777static jmethodID Navit_disableSuspend, Navit_exit; 925static jmethodID Navit_disableSuspend, Navit_exit;
778 926
779static void
780graphics_android_disable_suspend(struct window *win) 927static void graphics_android_disable_suspend(struct window *win)
781{ 928{
782 //dbg(0,"enter\n"); 929 //DBG // dbg(0,"enter\n");
930 JNIEnv *jnienv2;
931 jnienv2 = jni_getenv();
932
783 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend); 933 (*jnienv2)->CallVoidMethod(jnienv2, android_activity, Navit_disableSuspend);
784} 934}
785
786
787 935
788static struct graphics_priv * 936static struct graphics_priv *
789graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl) 937graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
790{ 938{
791 //dbg(0,"EEnter\n"); 939 // dbg(0,"EEnter\n");
940
941 int thread_id = gettid();
942 // dbg(0, "THREAD ID=%d\n", thread_id);
792 943
793 struct graphics_priv *ret; 944 struct graphics_priv *ret;
794 struct attr *attr; 945 struct attr *attr;
795 int use_camera=0; 946 int use_camera = 0;
947
948 // dbg(0,"event system - start\n");
796 if (!event_request_system("android","graphics_android")) 949 if (!event_request_system("android", "graphics_android"))
950 {
797 return NULL; 951 return NULL;
952 }
953 // dbg(0,"event system - end\n");
954
798 ret=g_new0(struct graphics_priv, 1); 955 ret=g_new0(struct graphics_priv, 1);
799
800 ret->cbl=cbl; 956 ret->cbl = cbl;
801 *meth=graphics_methods; 957 *meth = graphics_methods;
802 ret->win.priv=ret; 958 ret->win.priv = ret;
803 ret->win.fullscreen=graphics_android_fullscreen; 959 ret->win.fullscreen = graphics_android_fullscreen;
804 ret->win.disable_suspend=graphics_android_disable_suspend; 960 ret->win.disable_suspend = graphics_android_disable_suspend;
805 if ((attr=attr_search(attrs, NULL, attr_use_camera))) { 961 if ((attr = attr_search(attrs, NULL, attr_use_camera)))
962 {
806 use_camera=attr->u.num; 963 use_camera = attr->u.num;
807 } 964 }
808 image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal); 965 image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal);
966
967
968 // --------------- try to get a new Graphics Object -----------------
969 // --------------- try to get a new Graphics Object -----------------
970 // --------------- try to get a new Graphics Object -----------------
971 // dbg(0,"try to get a new Graphics Object\n");
809 if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) { 972 if (graphics_android_init("type:map-main", ret, NULL, NULL, 0, 0, 0, 0, use_camera))
973 {
810 //dbg(0,"returning %p\n",ret); 974 ////DBG // dbg(0,"returning %p\n",ret);
811 return ret; 975 return ret;
812 } else { 976 }
977 else
978 {
813 g_free(ret); 979 g_free(ret);
814 return NULL; 980 return NULL;
815 } 981 }
816} 982}
817 983
818static struct graphics_priv * 984static struct graphics_priv *
819overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound) 985overlay_new(const char* name, struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound)
820{ 986{
821 //dbg(0,"EEnter\n"); 987 // dbg(0,"EEnter\n");
988
989 int thread_id = gettid();
990 // dbg(0, "THREAD ID=%d\n", thread_id);
822 991
823 struct graphics_priv *ret=g_new0(struct graphics_priv, 1); 992 struct graphics_priv *ret=g_new0(struct graphics_priv, 1);
824 *meth=graphics_methods; 993 *meth = graphics_methods;
994
995 // --------------- try to get a new Graphics Object -----------------
996 // --------------- try to get a new Graphics Object -----------------
997 // --------------- try to get a new Graphics Object -----------------
998 // dbg(0,"try to get a new Graphics Object: %s\n", name);
825 if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) { 999 if (graphics_android_init(name ,ret, gr, p, w, h, alpha, wraparound, 0))
1000 {
826 dbg(0,"returning %p\n",ret); 1001 // dbg(0, "returning %p\n", ret);
827 return ret; 1002 return ret;
828 } else { 1003 }
1004 else
1005 {
829 g_free(ret); 1006 g_free(ret);
830 return NULL; 1007 return NULL;
831 } 1008 }
832} 1009}
833 1010
834
835static void
836event_android_main_loop_run(void) 1011static void event_android_main_loop_run(void)
837{ 1012{
838 dbg(0,"enter\n"); 1013 // dbg(0, "enter\n");
839} 1014}
840 1015
841static void event_android_main_loop_quit(void) 1016static void event_android_main_loop_quit(void)
842{ 1017{
843 dbg(0,"enter\n"); 1018 // dbg(0, "enter\n");
1019
1020 // overwrite JNIenv!!
1021 JNIEnv *jnienv2;
1022 jnienv2 = jni_getenv();
1023
1024 int thread_id = gettid();
1025 // dbg(0, "THREAD ID=%d\n", thread_id);
1026
844 // exit(0); 1027 // ******* exit(0);
845 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit); 1028 (*jnienv2)->CallVoidMethod(jnienv2, android_activity, Navit_exit);
846} 1029}
847
848 1030
849static jclass NavitTimeoutClass; 1031static jclass NavitTimeoutClass;
850static jmethodID NavitTimeout_init; 1032static jmethodID NavitTimeout_init;
851static jmethodID NavitTimeout_remove; 1033static jmethodID NavitTimeout_remove;
852 1034
859static jmethodID NavitWatch_remove; 1041static jmethodID NavitWatch_remove;
860 1042
861static struct event_watch * 1043static struct event_watch *
862event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb) 1044event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb)
863{ 1045{
1046 // dbg(0,"enter\n");
864 jobject ret; 1047 jobject ret;
865 ret=(*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int)cb); 1048 ret = (*jnienv)->NewObject(jnienv, NavitWatchClass, NavitWatch_init, (int) h, (int) cond, (int) cb);
866 //dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret); 1049 // //DBG // dbg(0,"result for %p,%d,%p=%p\n",h,cond,cb,ret);
867 if (ret) 1050 if (ret)
1051 {
1052 //DBG // dbg(0,"result for %p,%p\n",h,ret);
868 (*jnienv)->NewGlobalRef(jnienv, ret); 1053 ret = (*jnienv)->NewGlobalRef(jnienv, ret);
1054 //DBG // dbg(0,"g ret %p\n",ret);
1055 }
869 return (struct event_watch *)ret; 1056 return (struct event_watch *) ret;
870} 1057}
871 1058
872static void
873event_android_remove_watch(struct event_watch *ev) 1059static void event_android_remove_watch(struct event_watch *ev)
874{ 1060{
875 //dbg(0,"enter %p\n",ev); 1061 // dbg(0,"enter\n");
876 if (ev) { 1062 if (ev)
1063 {
1064 //DBG // dbg(0,"enter %p\n",ev);
877 jobject obj=(jobject )ev; 1065 jobject obj = (jobject) ev;
1066 // maybe need this ? ICS obj = (*jnienv)->NewGlobalRef(jnienv, obj);
878 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove); 1067 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove);
879 (*jnienv)->DeleteGlobalRef(jnienv, obj); 1068 // ICS (*jnienv)->DeleteGlobalRef(jnienv, obj);
880 } 1069 }
881} 1070}
882 1071
883static struct event_timeout * 1072static struct event_timeout *
884event_android_add_timeout(int timeout, int multi, struct callback *cb) 1073event_android_add_timeout(int timeout, int multi, struct callback *cb)
885{ 1074{
886 //dbg(0,"EEnter\n"); 1075 // dbg(0,"EEnter\n");
1076
1077 // overwrite JNIenv!!
1078 JNIEnv *jnienv2;
1079 jnienv2 = jni_getenv();
1080
1081 int thread_id = gettid();
1082 // dbg(0, "THREAD ID=%d\n", thread_id);
1083
1084 // timeout -> delay in milliseconds
887 1085
888 jobject ret; 1086 jobject ret;
1087 jobject ret_g = NULL;
889 ret=(*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)cb); 1088 ret = (*jnienv2)->NewObject(jnienv2, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int) cb);
890 dbg(1,"result for %d,%d,%p=%p\n",timeout,multi,cb,ret); 1089 //// dbg(0, "result for %d,%d,%p\n", timeout, multi, cb);
1090
891 if (ret) 1091 if (ret)
1092 {
1093 //// dbg(0,"l ret=%p\n",ret);
892 (*jnienv)->NewGlobalRef(jnienv, ret); 1094 ret_g = (*jnienv2)->NewGlobalRef(jnienv2, ret);
1095 // dbg(0,"g ret=%p\n",ret_g);
1096 }
1097 //// dbg(0,"leave\n");
893 return (struct event_timeout *)ret; 1098 return (struct event_timeout *) ret_g;
894} 1099}
895 1100
896static void
897event_android_remove_timeout(struct event_timeout *to) 1101static void event_android_remove_timeout(struct event_timeout *to)
898{ 1102{
899 //dbg(0,"EEnter\n"); 1103 // dbg(0,"EEnter\n");
900 1104
901 dbg(1,"enter %p\n",to); 1105 // overwrite JNIenv!!
1106 JNIEnv *jnienv2;
1107 jnienv2 = jni_getenv();
1108
1109 // int thread_id = gettid();
1110 // dbg(0, "THREAD ID=%d\n", thread_id);
1111
1112
902 if (to) { 1113 if (to)
1114 {
1115 // dbg(0, "remove %p\n", to);
903 jobject obj=(jobject )to; 1116 jobject obj = (jobject) to;
904 (*jnienv)->CallVoidMethod(jnienv, obj, NavitTimeout_remove); 1117 (*jnienv2)->CallVoidMethod(jnienv2, obj, NavitTimeout_remove);
1118 // ICS
1119 //// dbg(0, "remove 1\n");
905 (*jnienv)->DeleteGlobalRef(jnienv, obj); 1120 (*jnienv2)->DeleteGlobalRef(jnienv2, obj);
1121 //// dbg(0, "remove 2\n");
906 } 1122 }
907} 1123}
908
909 1124
910static struct event_idle * 1125static struct event_idle *
911event_android_add_idle(int priority, struct callback *cb) 1126event_android_add_idle(int priority, struct callback *cb)
912{ 1127{
1128 // ----------------------------------------------------
1129 // ----------------------------------------------------
1130 // "priority" param is now misused here as "multi"
1131 // priority == 1000 -> set multi = 0
1132 // ----------------------------------------------------
1133 // ----------------------------------------------------
1134
913 //dbg(0,"EEnter\n"); 1135 //// dbg(0,"EEnter\n");
914 1136
915#if 0 1137#if 0
916 jobject ret; 1138 jobject ret;
917 dbg(1,"enter\n"); 1139 // dbg(1,"enter\n");
918 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb); 1140 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb);
919 dbg(1,"result for %p=%p\n",cb,ret); 1141 // dbg(1,"result for %p=%p\n",cb,ret);
920 if (ret) 1142 if (ret)
921 (*jnienv)->NewGlobalRef(jnienv, ret); 1143 (*jnienv)->NewGlobalRef(jnienv, ret);
922 return (struct event_idle *)ret; 1144 return (struct event_idle *)ret;
923#endif 1145#endif
1146 // ----- xxxxxxxx ------
1147 if (priority == 1000)
1148 {
1149 //dbg(0,"event add idle timeout=10 multi=0\n", priority);
924 return (struct event_idle *)event_android_add_timeout(1, 1, cb); 1150 return (struct event_idle *) event_android_add_timeout(10, 0, cb);
1151 }
1152 else
1153 {
1154 //dbg(0,"event add idle timeout=%d multi=1\n", priority);
1155 return (struct event_idle *) event_android_add_timeout(priority, 1, cb);
1156 }
925} 1157}
926 1158
927static void
928event_android_remove_idle(struct event_idle *ev) 1159static void event_android_remove_idle(struct event_idle *ev)
929{ 1160{
930 //dbg(0,"EEnter\n"); 1161 //// dbg(0,"EEnter\n");
931 1162
932#if 0 1163#if 0
933 dbg(1,"enter %p\n",ev); 1164 // dbg(1,"enter %p\n",ev);
934 if (ev) { 1165 if (ev)
1166 {
935 jobject obj=(jobject )ev; 1167 jobject obj=(jobject )ev;
936 (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove); 1168 (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove);
937 (*jnienv)->DeleteGlobalRef(jnienv, obj); 1169 (*jnienv)->DeleteGlobalRef(jnienv, obj);
938 } 1170 }
939#endif 1171#endif
940 event_android_remove_timeout((struct event_timeout *)ev); 1172 event_android_remove_timeout((struct event_timeout *) ev);
941} 1173}
942 1174
943static void
944event_android_call_callback(struct callback_list *cb) 1175static void event_android_call_callback(struct callback_list *cb)
945{ 1176{
946 // dbg(0,"enter\n"); 1177 //DBG // dbg(0,"enter\n");
947} 1178}
948 1179
949static struct event_methods event_android_methods = { 1180static struct event_methods event_android_methods =
950 event_android_main_loop_run, 1181{ 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, };
951 event_android_main_loop_quit,
952 event_android_add_watch,
953 event_android_remove_watch,
954 event_android_add_timeout,
955 event_android_remove_timeout,
956 event_android_add_idle,
957 event_android_remove_idle,
958 event_android_call_callback,
959};
960 1182
961static struct event_priv * 1183static struct event_priv *
962event_android_new(struct event_methods *meth) 1184event_android_new(struct event_methods *meth)
963{ 1185{
1186
1187 // overwrite JNIenv!!
1188 JNIEnv *jnienv2;
1189 jnienv2 = jni_getenv();
1190
1191 // int thread_id = gettid();
1192 // dbg(0, "THREAD ID=%d\n", thread_id);
1193
1194
964 //dbg(0,"enter\n"); 1195 // dbg(0,"enter\n");
965 if (!find_class_global("com/zoffcc/applications/zanavi/NavitTimeout", &NavitTimeoutClass)) 1196 if (!find_class_global("com/zoffcc/applications/zanavi/NavitTimeout", &NavitTimeoutClass))
966 return NULL; 1197 return NULL;
1198
1199 // dbg(0,"ev 001\n");
967 NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V"); 1200 NavitTimeout_init = (*jnienv2)->GetMethodID(jnienv2, NavitTimeoutClass, "<init>", "(IZI)V");
968 if (NavitTimeout_init == NULL) 1201 if (NavitTimeout_init == NULL)
969 return NULL; 1202 return NULL;
1203 // dbg(0,"ev 002\n");
970 NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V"); 1204 NavitTimeout_remove = (*jnienv2)->GetMethodID(jnienv2, NavitTimeoutClass, "remove", "()V");
971 if (NavitTimeout_remove == NULL) 1205 if (NavitTimeout_remove == NULL)
972 return NULL; 1206 return NULL;
973#if 0 1207#if 0
974 if (!find_class_global("com/zoffcc/applications/zanavi/NavitIdle", &NavitIdleClass)) 1208 if (!find_class_global("com/zoffcc/applications/zanavi/NavitIdle", &NavitIdleClass))
975 return NULL; 1209 return NULL;
976 NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V"); 1210 NavitIdle_init = (*jnienv2)->GetMethodID(jnienv2, NavitIdleClass, "<init>", "(I)V");
977 if (NavitIdle_init == NULL) 1211 if (NavitIdle_init == NULL)
978 return NULL; 1212 return NULL;
979 NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V"); 1213 NavitIdle_remove = (*jnienv2)->GetMethodID(jnienv2, NavitIdleClass, "remove", "()V");
980 if (NavitIdle_remove == NULL) 1214 if (NavitIdle_remove == NULL)
981 return NULL; 1215 return NULL;
982#endif 1216#endif
983 1217
1218 // dbg(0,"ev 003\n");
984 if (!find_class_global("com/zoffcc/applications/zanavi/NavitWatch", &NavitWatchClass)) 1219 if (!find_class_global("com/zoffcc/applications/zanavi/NavitWatch", &NavitWatchClass))
985 return NULL; 1220 return NULL;
1221 // dbg(0,"ev 004\n");
986 NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(III)V"); 1222 NavitWatch_init = (*jnienv2)->GetMethodID(jnienv2, NavitWatchClass, "<init>", "(III)V");
987 if (NavitWatch_init == NULL) 1223 if (NavitWatch_init == NULL)
988 return NULL; 1224 return NULL;
1225 // dbg(0,"ev 005\n");
989 NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V"); 1226 NavitWatch_remove = (*jnienv2)->GetMethodID(jnienv2, NavitWatchClass, "remove", "()V");
990 if (NavitWatch_remove == NULL) 1227 if (NavitWatch_remove == NULL)
991 return NULL; 1228 return NULL;
992 1229
1230 // dbg(0,"ev 006\n");
993 if (!find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass)) 1231 if (!find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass))
994 return NULL; 1232 return NULL;
1233 // dbg(0,"ev 007\n");
995 Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V"); 1234 Navit_disableSuspend = (*jnienv2)->GetMethodID(jnienv2, NavitClass, "disableSuspend", "()V");
996 if (Navit_disableSuspend == NULL) 1235 if (Navit_disableSuspend == NULL)
997 return NULL; 1236 return NULL;
1237 // dbg(0,"ev 008\n");
998 Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V"); 1238 Navit_exit = (*jnienv2)->GetMethodID(jnienv2, NavitClass, "exit2", "()V");
999 if (Navit_exit == NULL) 1239 if (Navit_exit == NULL)
1000 return NULL; 1240 return NULL;
1241
1001 //dbg(0,"ok\n"); 1242 // dbg(0,"ok\n");
1243
1002 *meth=event_android_methods; 1244 *meth = event_android_methods;
1003 return NULL; 1245 return NULL;
1004} 1246}
1005 1247
1006
1007void
1008plugin_init(void) 1248void plugin_init(void)
1009{ 1249{
1010 //dbg(0,"enter\n"); 1250 dbg(0,"enter\n");
1011 plugin_register_graphics_type("android", graphics_android_new); 1251 plugin_register_graphics_type("android", graphics_android_new);
1012 plugin_register_event_type("android", event_android_new); 1252 plugin_register_event_type("android", event_android_new);
1013} 1253}
1254

Legend:
Removed from v.2  
changed lines
  Added in v.31

   
Visit the ZANavi Wiki