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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (show annotations) (download)
Fri Oct 28 21:19:04 2011 UTC (12 years, 5 months ago) by zoff99
File MIME type: text/plain
File size: 30727 byte(s)
import files
1 /**
2 * Navit, a modular navigation system.
3 * Copyright (C) 2005-2008 Navit Team
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
20 #include <unistd.h>
21 #include <glib.h>
22 #include "config.h"
23 #include "window.h"
24 #include "point.h"
25 #include "graphics.h"
26 #include "color.h"
27 #include "plugin.h"
28 #include "event.h"
29 #include "debug.h"
30 #include "callback.h"
31 #include "android.h"
32
33 int dummy;
34
35 struct graphics_priv {
36 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;
38
39 jclass PaintClass;
40 jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB;
41
42 jobject NavitGraphics;
43 jobject Paint;
44
45 jclass BitmapFactoryClass;
46 jmethodID BitmapFactory_decodeFile, BitmapFactory_decodeResource;
47
48 jclass BitmapClass;
49 jmethodID Bitmap_getHeight, Bitmap_getWidth;
50
51 jclass ContextClass;
52 jmethodID Context_getResources;
53
54 jclass ResourcesClass;
55 jobject Resources;
56 jmethodID Resources_getIdentifier;
57
58 struct callback_list *cbl;
59 struct window win;
60 };
61
62 struct graphics_font_priv {
63 int size;
64 };
65
66 struct graphics_gc_priv {
67 struct graphics_priv *gra;
68 int linewidth;
69 enum draw_mode_num mode;
70 int a,r,g,b;
71 };
72
73 struct graphics_image_priv {
74 jobject Bitmap;
75 int width;
76 int height;
77 struct point hot;
78 };
79
80 static GHashTable *image_cache_hash = NULL;
81
82 static int
83 find_class_global(char *name, jclass *ret)
84 {
85 *ret=(*jnienv)->FindClass(jnienv, name);
86 if (! *ret) {
87 dbg(0,"Failed to get Class %s\n",name);
88 return 0;
89 }
90 (*jnienv)->NewGlobalRef(jnienv, *ret);
91 return 1;
92 }
93
94 static int
95 find_method(jclass class, char *name, char *args, jmethodID *ret)
96 {
97 *ret = (*jnienv)->GetMethodID(jnienv, class, name, args);
98 if (*ret == NULL) {
99 dbg(0,"Failed to get Method %s with signature %s\n",name,args);
100 return 0;
101 }
102 return 1;
103 }
104
105 static int
106 find_static_method(jclass class, char *name, char *args, jmethodID *ret)
107 {
108 *ret = (*jnienv)->GetStaticMethodID(jnienv, class, name, args);
109 if (*ret == NULL) {
110 dbg(0,"Failed to get static Method %s with signature %s\n",name,args);
111 return 0;
112 }
113 return 1;
114 }
115
116 static void
117 graphics_destroy(struct graphics_priv *gr)
118 {
119 }
120
121 static void font_destroy(struct graphics_font_priv *font)
122 {
123 g_free(font);
124 }
125
126 static struct graphics_font_methods font_methods = {
127 font_destroy
128 };
129
130 static struct graphics_font_priv *font_new(struct graphics_priv *gr, struct graphics_font_methods *meth, char *font, int size, int flags)
131 {
132 struct graphics_font_priv *ret=g_new0(struct graphics_font_priv, 1);
133 *meth=font_methods;
134
135 ret->size=size;
136 return ret;
137 }
138
139 static void
140 gc_destroy(struct graphics_gc_priv *gc)
141 {
142 //dbg(0,"EEnter\n");
143
144 g_free(gc);
145 }
146
147 static void
148 gc_set_linewidth(struct graphics_gc_priv *gc, int w)
149 {
150 gc->linewidth = w;
151 }
152
153 static void
154 gc_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
161 static void
162 gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
163 {
164 gc->r = c->r >> 8;
165 gc->g = c->g >> 8;
166 gc->b = c->b >> 8;
167 gc->a = c->a >> 8;
168 }
169
170 static void
171 gc_set_background(struct graphics_gc_priv *gc, struct color *c)
172 {
173 }
174
175 static struct graphics_gc_methods gc_methods = {
176 gc_destroy,
177 gc_set_linewidth,
178 gc_set_dashes,
179 gc_set_foreground,
180 gc_set_background
181 };
182
183 static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
184 {
185 //dbg(0,"EEnter\n");
186
187 struct graphics_gc_priv *ret=g_new0(struct graphics_gc_priv, 1);
188 *meth=gc_methods;
189
190 ret->gra = gr;
191 ret->a = ret->r = ret->g = ret->b = 255;
192 ret->linewidth=1;
193 return ret;
194 }
195
196 static void image_destroy(struct graphics_image_priv *img)
197 {
198 // unused?
199 }
200
201 static struct graphics_image_methods image_methods = {
202 image_destroy
203 };
204
205
206 static struct graphics_image_priv *
207 image_new(struct graphics_priv *gra, struct graphics_image_methods *meth, char *path, int *w, int *h, struct point *hot, int rotation)
208 {
209 //dbg(0,"EEnter\n");
210
211 struct graphics_image_priv* ret = NULL;
212
213 if ( !g_hash_table_lookup_extended( image_cache_hash, path, NULL, (gpointer)&ret) )
214 {
215 ret=g_new0(struct graphics_image_priv, 1);
216 jstring string;
217 int id;
218
219 dbg(1,"enter %s\n",path);
220 if (!strncmp(path,"res/drawable/",13)) {
221 jstring a=(*jnienv)->NewStringUTF(jnienv, "drawable");
222 jstring b=(*jnienv)->NewStringUTF(jnienv, "com.zoffcc.applications.zanavi");
223 char *path_noext=g_strdup(path+13);
224 char *pos=strrchr(path_noext, '.');
225 if (pos)
226 *pos='\0';
227 dbg(1,"path_noext=%s\n",path_noext);
228 string = (*jnienv)->NewStringUTF(jnienv, path_noext);
229 g_free(path_noext);
230 id=(*jnienv)->CallIntMethod(jnienv, gra->Resources, gra->Resources_getIdentifier, string, a, b);
231 dbg(1,"id=%d\n",id);
232 if (id)
233 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeResource, gra->Resources, id);
234 (*jnienv)->DeleteLocalRef(jnienv, b);
235 (*jnienv)->DeleteLocalRef(jnienv, a);
236 } else {
237 string = (*jnienv)->NewStringUTF(jnienv, path);
238 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->BitmapFactoryClass, gra->BitmapFactory_decodeFile, string);
239 // there should be a check here, if we really want any rotation/scaling
240 // otherwise the call is overkill
241 ret->Bitmap=(*jnienv)->CallStaticObjectMethod(jnienv, gra->NavitGraphicsClass, gra->NavitGraphicsClass_rotate_and_scale_bitmap, ret->Bitmap, *w, *h, rotation);
242 }
243 dbg(1,"result=%p\n",ret->Bitmap);
244 if (ret->Bitmap) {
245 (*jnienv)->NewGlobalRef(jnienv, ret->Bitmap);
246 (*jnienv)->DeleteLocalRef(jnienv, ret->Bitmap);
247 ret->width=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getWidth);
248 ret->height=(*jnienv)->CallIntMethod(jnienv, ret->Bitmap, gra->Bitmap_getHeight);
249 dbg(1,"w=%d h=%d for %s\n",ret->width,ret->height,path);
250 ret->hot.x=ret->width/2;
251 ret->hot.y=ret->height/2;
252 } else {
253 g_free(ret);
254 ret=NULL;
255 dbg(0,"Failed to open %s\n",path);
256 }
257 (*jnienv)->DeleteLocalRef(jnienv, string);
258 g_hash_table_insert(image_cache_hash, g_strdup( path ), (gpointer)ret );
259 }
260 if (ret) {
261 *w=ret->width;
262 *h=ret->height;
263 if (hot)
264 *hot=ret->hot;
265 }
266
267 return ret;
268 }
269
270 static void initPaint(struct graphics_priv *gra, struct graphics_gc_priv *gc)
271 {
272 //dbg(0,"EEnter\n");
273
274 float wf = gc->linewidth;
275 (*jnienv)->CallVoidMethod(jnienv, 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);
277 }
278
279 static void
280 draw_lines(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
281 {
282 jint pc[count*2];
283 int i;
284 jintArray points;
285 if (count <= 0)
286 return;
287 points = (*jnienv)->NewIntArray(jnienv,count*2);
288 for (i = 0 ; i < count ; i++) {
289 pc[i*2]=p[i].x;
290 pc[i*2+1]=p[i].y;
291 }
292 initPaint(gra, gc);
293 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
294 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline, gc->gra->Paint, points);
295 (*jnienv)->DeleteLocalRef(jnienv, points);
296 }
297
298 static void
299 draw_lines2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
300 {
301 jint pc[count*2];
302 int i;
303 jintArray points;
304 if (count <= 0)
305 return;
306 points = (*jnienv)->NewIntArray(jnienv,count*2);
307 for (i = 0 ; i < count ; i++) {
308 pc[i*2]=p[i].x;
309 pc[i*2+1]=p[i].y;
310 }
311 initPaint(gra, gc);
312 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
313 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline2, gc->gra->Paint, points, order, oneway);
314 (*jnienv)->DeleteLocalRef(jnienv, points);
315 }
316
317
318 static void
319 draw_lines_dashed(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
320 {
321 jint pc[count*2];
322 int i;
323 jintArray points;
324 if (count <= 0)
325 return;
326 points = (*jnienv)->NewIntArray(jnienv,count*2);
327 for (i = 0 ; i < count ; i++) {
328 pc[i*2]=p[i].x;
329 pc[i*2+1]=p[i].y;
330 }
331 initPaint(gra, gc);
332 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
333 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polyline_dashed, gc->gra->Paint, points, order, oneway);
334 (*jnienv)->DeleteLocalRef(jnienv, points);
335 }
336
337 static void
338 draw_polygon(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count)
339 {
340 jint pc[count*2];
341 int i;
342 jintArray points;
343 if (count <= 0)
344 return;
345 points = (*jnienv)->NewIntArray(jnienv,count*2);
346 for (i = 0 ; i < count ; i++) {
347 pc[i*2]=p[i].x;
348 pc[i*2+1]=p[i].y;
349 }
350 initPaint(gra, gc);
351 (*jnienv)->SetIntArrayRegion(jnienv, points, 0, count*2, pc);
352 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_polygon, gc->gra->Paint, points);
353 (*jnienv)->DeleteLocalRef(jnienv, points);
354 }
355
356 static void
357 draw_polygon2(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int count, int order, int oneway)
358 {
359 jint pc[count*2];
360 int i;
361 jintArray points;
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);
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
376 static void
377 draw_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);
381 }
382
383 static void
384 draw_circle(struct graphics_priv *gra, struct graphics_gc_priv *gc, struct point *p, int r)
385 {
386 initPaint(gra, gc);
387 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_circle, gc->gra->Paint, p->x, p->y, r);
388 }
389
390
391 static void
392 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 {
394 dbg(1,"enter %s\n", text);
395 initPaint(gra, fg);
396 jstring string = (*jnienv)->NewStringUTF(jnienv, text);
397 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_text, fg->gra->Paint, p->x, p->y, string, font->size, dx, dy);
398 (*jnienv)->DeleteLocalRef(jnienv, string);
399 }
400
401 static void
402 draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img)
403 {
404 //dbg(0,"EEnter\n");
405
406 dbg(1,"enter %p\n",img);
407 initPaint(gra, fg);
408 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_image, fg->gra->Paint, p->x, p->y, img->Bitmap);
409
410 }
411
412 static void
413 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 {
415 //dbg(0,"EEnter\n");
416
417 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_bigmap, yaw, order, clat, clng, x, y, scx, scy, px, py, valid);
418 }
419
420 static void
421 send_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 }
435
436
437 static void
438 draw_image_warp(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, char *data)
439 {
440 }
441
442 static void
443 draw_restore(struct graphics_priv *gr, struct point *p, int w, int h)
444 {
445 }
446
447 static void draw_drag(struct graphics_priv *gra, struct point *p)
448 {
449 //dbg(0,"EEnter\n");
450
451 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0);
452 }
453
454 static void
455 background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
456 {
457 }
458
459 static void
460 draw_mode(struct graphics_priv *gra, enum draw_mode_num mode)
461 {
462 //dbg(0,"EEnter\n");
463
464 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_mode, (int)mode);
465 }
466
467 static struct graphics_priv * overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound);
468
469 static void *
470 get_data(struct graphics_priv *this, const char *type)
471 {
472 //dbg(0,"EEnter\n");
473
474 if (strcmp(type,"window"))
475 return NULL;
476 return &this->win;
477 }
478
479 static void image_free(struct graphics_priv *gr, struct graphics_image_priv *priv)
480 {
481 }
482
483 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)
484 {
485 //dbg(0,"EEnter\n");
486
487 int len = g_utf8_strlen(text, -1);
488 int xMin = 0;
489 int yMin = 0;
490 int yMax = 13*font->size/256;
491 int xMax = 9*font->size*len/256;
492
493 ret[0].x = xMin;
494 ret[0].y = -yMin;
495 ret[1].x = xMin;
496 ret[1].y = -yMax;
497 ret[2].x = xMax;
498 ret[2].y = -yMax;
499 ret[3].x = xMax;
500 ret[3].y = -yMin;
501 }
502
503 static void overlay_disable(struct graphics_priv *gra, int disable)
504 {
505 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_disable, disable);
506 }
507
508 static void overlay_resize(struct graphics_priv *gra, struct point *pnt, int w, int h, int alpha, int wraparound)
509 {
510 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_overlay_resize, pnt ? pnt->x:0 , pnt ? pnt->y:0, w, h, alpha, wraparound);
511 }
512
513 static int
514 set_attr(struct graphics_priv *gra, struct attr *attr)
515 {
516 switch (attr->type) {
517 case attr_use_camera:
518 (*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_SetCamera, attr->u.num);
519 return 1;
520 default:
521 return 0;
522 }
523 }
524
525 static struct graphics_methods graphics_methods = {
526 graphics_destroy,
527 draw_mode,
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
555 static void
556 resize_callback(struct graphics_priv *gra, int w, int h)
557 {
558 //dbg(0,"EEnter\n");
559
560 // dbg(0,"w=%d h=%d ok\n",w,h);
561 callback_list_call_attr_2(gra->cbl, attr_resize, (void *)w, (void *)h);
562 }
563
564 static void
565 motion_callback(struct graphics_priv *gra, int x, int y)
566 {
567 //dbg(0,"EEnter\n");
568
569 struct point p;
570 p.x=x;
571 p.y=y;
572 callback_list_call_attr_1(gra->cbl, attr_motion, (void *)&p);
573 }
574
575 static void
576 keypress_callback(struct graphics_priv *gra, char *s)
577 {
578 callback_list_call_attr_1(gra->cbl, attr_keypress, s);
579 }
580
581 static void
582 button_callback(struct graphics_priv *gra, int pressed, int button, int x, int y)
583 {
584 //dbg(0,"EEnter\n");
585
586 struct point p;
587 p.x=x;
588 p.y=y;
589 // dbg(0,"XXXXXXXYYYYYYYYY\n");
590 callback_list_call_attr_3(gra->cbl, attr_button, (void *)pressed, (void *)button, (void *)&p);
591 }
592
593
594 static int
595 set_activity(jobject graphics)
596 {
597 //dbg(0,"EEnter\n");
598
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;
618 }
619
620 static int
621 graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, struct point *pnt, int w, int h, int alpha, int wraparound, int use_camera)
622 {
623 struct callback *cb;
624 jmethodID cid;
625
626 dbg(0,"at 2 jnienv=%p\n",jnienv);
627 if (!find_class_global("android/graphics/Paint", &ret->PaintClass))
628 return 0;
629 if (!find_method(ret->PaintClass, "<init>", "(I)V", &ret->Paint_init))
630 return 0;
631 if (!find_method(ret->PaintClass, "setARGB", "(IIII)V", &ret->Paint_setARGB))
632 return 0;
633 if (!find_method(ret->PaintClass, "setStrokeWidth", "(F)V", &ret->Paint_setStrokeWidth))
634 return 0;
635
636 if (!find_class_global("android/graphics/BitmapFactory", &ret->BitmapFactoryClass))
637 return 0;
638 if (!find_static_method(ret->BitmapFactoryClass, "decodeFile", "(Ljava/lang/String;)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeFile))
639 return 0;
640 if (!find_static_method(ret->BitmapFactoryClass, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;", &ret->BitmapFactory_decodeResource))
641 return 0;
642
643 if (!find_class_global("android/graphics/Bitmap", &ret->BitmapClass))
644 return 0;
645 if (!find_method(ret->BitmapClass, "getHeight", "()I", &ret->Bitmap_getHeight))
646 return 0;
647 if (!find_method(ret->BitmapClass, "getWidth", "()I", &ret->Bitmap_getWidth))
648 return 0;
649
650 if (!find_class_global("android/content/Context", &ret->ContextClass))
651 return 0;
652 if (!find_method(ret->ContextClass, "getResources", "()Landroid/content/res/Resources;", &ret->Context_getResources))
653 return 0;
654
655
656 ret->Resources=(*jnienv)->CallObjectMethod(jnienv, android_activity, ret->Context_getResources);
657 if (ret->Resources)
658 (*jnienv)->NewGlobalRef(jnienv, ret->Resources);
659 if (!find_class_global("android/content/res/Resources", &ret->ResourcesClass))
660 return 0;
661 if (!find_method(ret->ResourcesClass, "getIdentifier", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", &ret->Resources_getIdentifier))
662 return 0;
663
664 if (!find_class_global("com/zoffcc/applications/zanavi/NavitGraphics", &ret->NavitGraphicsClass))
665 return 0;
666 dbg(0,"at 3\n");
667 cid = (*jnienv)->GetMethodID(jnienv, ret->NavitGraphicsClass, "<init>", "(Landroid/app/Activity;Lcom/zoffcc/applications/zanavi/NavitGraphics;IIIIIII)V");
668 if (cid == NULL) {
669 dbg(0,"no method found\n");
670 return 0; /* exception thrown */
671 }
672 dbg(0,"at 4 android_activity=%p\n",android_activity);
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);
674 dbg(0,"result=%p\n",ret->NavitGraphics);
675 if (ret->NavitGraphics)
676 (*jnienv)->NewGlobalRef(jnienv, ret->NavitGraphics);
677
678 /* Create a single global Paint, otherwise android will quickly run out
679 * of global refs.*/
680 /* 0x101 = text kerning (default), antialiasing */
681 ret->Paint=(*jnienv)->NewObject(jnienv, ret->PaintClass, ret->Paint_init, 0x101);
682
683 dbg(0,"result=%p\n",ret->Paint);
684 if (ret->Paint)
685 (*jnienv)->NewGlobalRef(jnienv, 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 }
692 cb=callback_new_1(callback_cast(resize_callback), ret);
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
711
712 // public Bitmap rotate_and_scale_bitmap(Bitmap in, int w, int h, int angle)
713
714 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;
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))
733 return 0;
734 if (!find_method(ret->NavitGraphicsClass, "draw_polyline2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline2))
735 return 0;
736 if (!find_method(ret->NavitGraphicsClass, "draw_polyline_dashed", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polyline_dashed))
737 return 0;
738 if (!find_method(ret->NavitGraphicsClass, "draw_polygon", "(Landroid/graphics/Paint;[I)V", &ret->NavitGraphics_draw_polygon))
739 return 0;
740 if (!find_method(ret->NavitGraphicsClass, "draw_polygon2", "(Landroid/graphics/Paint;[III)V", &ret->NavitGraphics_draw_polygon2))
741 return 0;
742 if (!find_method(ret->NavitGraphicsClass, "draw_rectangle", "(Landroid/graphics/Paint;IIII)V", &ret->NavitGraphics_draw_rectangle))
743 return 0;
744 if (!find_method(ret->NavitGraphicsClass, "draw_circle", "(Landroid/graphics/Paint;III)V", &ret->NavitGraphics_draw_circle))
745 return 0;
746 if (!find_method(ret->NavitGraphicsClass, "draw_text", "(Landroid/graphics/Paint;IILjava/lang/String;III)V", &ret->NavitGraphics_draw_text))
747 return 0;
748 if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image))
749 return 0;
750 if (!find_method(ret->NavitGraphicsClass, "draw_bigmap", "(IIFFIIIIIII)V", &ret->NavitGraphics_draw_bigmap))
751 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))
753 return 0;
754 if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode))
755 return 0;
756 if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag))
757 return 0;
758 if (!find_method(ret->NavitGraphicsClass, "overlay_disable", "(I)V", &ret->NavitGraphics_overlay_disable))
759 return 0;
760 if (!find_method(ret->NavitGraphicsClass, "overlay_resize", "(IIIIII)V", &ret->NavitGraphics_overlay_resize))
761 return 0;
762 if (!find_method(ret->NavitGraphicsClass, "SetCamera", "(I)V", &ret->NavitGraphics_SetCamera))
763 return 0;
764 #if 0
765 set_activity(ret->NavitGraphics);
766 #endif
767 return 1;
768 }
769
770 static int
771 graphics_android_fullscreen(struct window *win, int on)
772 {
773 return 1;
774 }
775
776 static jclass NavitClass;
777 static jmethodID Navit_disableSuspend, Navit_exit;
778
779 static void
780 graphics_android_disable_suspend(struct window *win)
781 {
782 //dbg(0,"enter\n");
783 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_disableSuspend);
784 }
785
786
787
788 static struct graphics_priv *
789 graphics_android_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
790 {
791 //dbg(0,"EEnter\n");
792
793 struct graphics_priv *ret;
794 struct attr *attr;
795 int use_camera=0;
796 if (!event_request_system("android","graphics_android"))
797 return NULL;
798 ret=g_new0(struct graphics_priv, 1);
799
800 ret->cbl=cbl;
801 *meth=graphics_methods;
802 ret->win.priv=ret;
803 ret->win.fullscreen=graphics_android_fullscreen;
804 ret->win.disable_suspend=graphics_android_disable_suspend;
805 if ((attr=attr_search(attrs, NULL, attr_use_camera))) {
806 use_camera=attr->u.num;
807 }
808 image_cache_hash = g_hash_table_new(g_str_hash, g_str_equal);
809 if (graphics_android_init(ret, NULL, NULL, 0, 0, 0, 0, use_camera)) {
810 //dbg(0,"returning %p\n",ret);
811 return ret;
812 } else {
813 g_free(ret);
814 return NULL;
815 }
816 }
817
818 static struct graphics_priv *
819 overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int alpha, int wraparound)
820 {
821 //dbg(0,"EEnter\n");
822
823 struct graphics_priv *ret=g_new0(struct graphics_priv, 1);
824 *meth=graphics_methods;
825 if (graphics_android_init(ret, gr, p, w, h, alpha, wraparound, 0)) {
826 dbg(0,"returning %p\n",ret);
827 return ret;
828 } else {
829 g_free(ret);
830 return NULL;
831 }
832 }
833
834
835 static void
836 event_android_main_loop_run(void)
837 {
838 dbg(0,"enter\n");
839 }
840
841 static void event_android_main_loop_quit(void)
842 {
843 dbg(0,"enter\n");
844 // exit(0);
845 (*jnienv)->CallVoidMethod(jnienv, android_activity, Navit_exit);
846 }
847
848
849 static jclass NavitTimeoutClass;
850 static jmethodID NavitTimeout_init;
851 static jmethodID NavitTimeout_remove;
852
853 static jclass NavitIdleClass;
854 static jmethodID NavitIdle_init;
855 static jmethodID NavitIdle_remove;
856
857 static jclass NavitWatchClass;
858 static jmethodID NavitWatch_init;
859 static jmethodID NavitWatch_remove;
860
861 static struct event_watch *
862 event_android_add_watch(void *h, enum event_watch_cond cond, struct callback *cb)
863 {
864 jobject ret;
865 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);
867 if (ret)
868 (*jnienv)->NewGlobalRef(jnienv, ret);
869 return (struct event_watch *)ret;
870 }
871
872 static void
873 event_android_remove_watch(struct event_watch *ev)
874 {
875 //dbg(0,"enter %p\n",ev);
876 if (ev) {
877 jobject obj=(jobject )ev;
878 (*jnienv)->CallVoidMethod(jnienv, obj, NavitWatch_remove);
879 (*jnienv)->DeleteGlobalRef(jnienv, obj);
880 }
881 }
882
883 static struct event_timeout *
884 event_android_add_timeout(int timeout, int multi, struct callback *cb)
885 {
886 //dbg(0,"EEnter\n");
887
888 jobject ret;
889 ret=(*jnienv)->NewObject(jnienv, NavitTimeoutClass, NavitTimeout_init, timeout, multi, (int)cb);
890 dbg(1,"result for %d,%d,%p=%p\n",timeout,multi,cb,ret);
891 if (ret)
892 (*jnienv)->NewGlobalRef(jnienv, ret);
893 return (struct event_timeout *)ret;
894 }
895
896 static void
897 event_android_remove_timeout(struct event_timeout *to)
898 {
899 //dbg(0,"EEnter\n");
900
901 dbg(1,"enter %p\n",to);
902 if (to) {
903 jobject obj=(jobject )to;
904 (*jnienv)->CallVoidMethod(jnienv, obj, NavitTimeout_remove);
905 (*jnienv)->DeleteGlobalRef(jnienv, obj);
906 }
907 }
908
909
910 static struct event_idle *
911 event_android_add_idle(int priority, struct callback *cb)
912 {
913 //dbg(0,"EEnter\n");
914
915 #if 0
916 jobject ret;
917 dbg(1,"enter\n");
918 ret=(*jnienv)->NewObject(jnienv, NavitIdleClass, NavitIdle_init, (int)cb);
919 dbg(1,"result for %p=%p\n",cb,ret);
920 if (ret)
921 (*jnienv)->NewGlobalRef(jnienv, ret);
922 return (struct event_idle *)ret;
923 #endif
924 return (struct event_idle *)event_android_add_timeout(1, 1, cb);
925 }
926
927 static void
928 event_android_remove_idle(struct event_idle *ev)
929 {
930 //dbg(0,"EEnter\n");
931
932 #if 0
933 dbg(1,"enter %p\n",ev);
934 if (ev) {
935 jobject obj=(jobject )ev;
936 (*jnienv)->CallVoidMethod(jnienv, obj, NavitIdle_remove);
937 (*jnienv)->DeleteGlobalRef(jnienv, obj);
938 }
939 #endif
940 event_android_remove_timeout((struct event_timeout *)ev);
941 }
942
943 static void
944 event_android_call_callback(struct callback_list *cb)
945 {
946 // dbg(0,"enter\n");
947 }
948
949 static struct event_methods event_android_methods = {
950 event_android_main_loop_run,
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
961 static struct event_priv *
962 event_android_new(struct event_methods *meth)
963 {
964 //dbg(0,"enter\n");
965 if (!find_class_global("com/zoffcc/applications/zanavi/NavitTimeout", &NavitTimeoutClass))
966 return NULL;
967 NavitTimeout_init = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "<init>", "(IZI)V");
968 if (NavitTimeout_init == NULL)
969 return NULL;
970 NavitTimeout_remove = (*jnienv)->GetMethodID(jnienv, NavitTimeoutClass, "remove", "()V");
971 if (NavitTimeout_remove == NULL)
972 return NULL;
973 #if 0
974 if (!find_class_global("com/zoffcc/applications/zanavi/NavitIdle", &NavitIdleClass))
975 return NULL;
976 NavitIdle_init = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "<init>", "(I)V");
977 if (NavitIdle_init == NULL)
978 return NULL;
979 NavitIdle_remove = (*jnienv)->GetMethodID(jnienv, NavitIdleClass, "remove", "()V");
980 if (NavitIdle_remove == NULL)
981 return NULL;
982 #endif
983
984 if (!find_class_global("com/zoffcc/applications/zanavi/NavitWatch", &NavitWatchClass))
985 return NULL;
986 NavitWatch_init = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "<init>", "(III)V");
987 if (NavitWatch_init == NULL)
988 return NULL;
989 NavitWatch_remove = (*jnienv)->GetMethodID(jnienv, NavitWatchClass, "remove", "()V");
990 if (NavitWatch_remove == NULL)
991 return NULL;
992
993 if (!find_class_global("com/zoffcc/applications/zanavi/Navit", &NavitClass))
994 return NULL;
995 Navit_disableSuspend = (*jnienv)->GetMethodID(jnienv, NavitClass, "disableSuspend", "()V");
996 if (Navit_disableSuspend == NULL)
997 return NULL;
998 Navit_exit = (*jnienv)->GetMethodID(jnienv, NavitClass, "exit", "()V");
999 if (Navit_exit == NULL)
1000 return NULL;
1001 //dbg(0,"ok\n");
1002 *meth=event_android_methods;
1003 return NULL;
1004 }
1005
1006
1007 void
1008 plugin_init(void)
1009 {
1010 //dbg(0,"enter\n");
1011 plugin_register_graphics_type("android", graphics_android_new);
1012 plugin_register_event_type("android", event_android_new);
1013 }

   
Visit the ZANavi Wiki