summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-07-05 15:00:40 +0000
committermdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2015-07-05 15:00:40 +0000
commit690bb8146056ba1e6c6351831a515b98caa5088e (patch)
treef816b1e55fccd1770e725a00ede27cbf3b9a007a
parent93c301484fb90162806c729c7b1b3097e06664fa (diff)
downloadnavit-svn-690bb8146056ba1e6c6351831a515b98caa5088e.tar.gz
Add:port_android:Support raster maps on Android as described in #1285.|Thank you jandegr
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@6126 ffa7fe5e-494d-0410-b361-a75ebd5db220
-rw-r--r--navit/android/src/org/navitproject/navit/NavitGraphics.java43
-rw-r--r--navit/graphics/android/graphics_android.c31
2 files changed, 72 insertions, 2 deletions
diff --git a/navit/android/src/org/navitproject/navit/NavitGraphics.java b/navit/android/src/org/navitproject/navit/NavitGraphics.java
index ef73a544..fc494424 100644
--- a/navit/android/src/org/navitproject/navit/NavitGraphics.java
+++ b/navit/android/src/org/navitproject/navit/NavitGraphics.java
@@ -27,6 +27,7 @@ import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
@@ -931,6 +932,48 @@ public class NavitGraphics
draw_canvas.drawBitmap(bitmap, x, y, paint);
}
+ /* takes an image and draws it on the screen as a prerendered maptile
+ *
+ *
+ *
+ * @param paint Paint object used to draw the image
+ * @param count the number of points specified
+ * @param p0x and p0y specifying the top left point
+ * @param p1x and p1y specifying the top right point
+ * @param p2x and p2y specifying the bottom left point, not yet used but kept
+ * for compatibility with the linux port
+ * @param bitmap Bitmap object holding the image to draw
+ *
+ * TODO make it work with 4 points specified to make it work for 3D mapview, so it can be used
+ * for small but very detailed maps as well as for large maps with very little detail but large
+ * coverage.
+ * TODO make it work with rectangular tiles as well ?
+ */
+ protected void draw_image_warp(Paint paint, int count, int p0x, int p0y, int p1x, int p1y, int p2x, int p2y, Bitmap bitmap)
+ {
+
+ float width;
+ float scale;
+ float deltaY;
+ float deltaX;
+ float angle;
+ Matrix matrix;
+
+ if (count == 3)
+ {
+ matrix = new Matrix();
+ deltaX = p1x - p0x;
+ deltaY = p1y - p0y;
+ width = (float) (Math.sqrt((deltaX * deltaX) + (deltaY * deltaY)));
+ angle = (float) (Math.atan2(deltaY, deltaX) * 180d / Math.PI);
+ scale = width / bitmap.getWidth();
+ matrix.preScale(scale, scale);
+ matrix.postTranslate(p0x, p0y);
+ matrix.postRotate(angle, p0x, p0y);
+ draw_canvas.drawBitmap(bitmap, matrix, paint);
+ }
+ }
+
/* These constants must be synchronized with enum draw_mode_num in graphics.h. */
public static final int draw_mode_begin = 0;
public static final int draw_mode_end = 1;
diff --git a/navit/graphics/android/graphics_android.c b/navit/graphics/android/graphics_android.c
index 01532695..362e3d9d 100644
--- a/navit/graphics/android/graphics_android.c
+++ b/navit/graphics/android/graphics_android.c
@@ -36,7 +36,10 @@ int dummy;
struct graphics_priv {
jclass NavitGraphicsClass;
- jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle, NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image, NavitGraphics_draw_mode, NavitGraphics_draw_drag, NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera;
+ jmethodID NavitGraphics_draw_polyline, NavitGraphics_draw_polygon, NavitGraphics_draw_rectangle,
+ NavitGraphics_draw_circle, NavitGraphics_draw_text, NavitGraphics_draw_image,
+ NavitGraphics_draw_image_warp, NavitGraphics_draw_mode, NavitGraphics_draw_drag,
+ NavitGraphics_overlay_disable, NavitGraphics_overlay_resize, NavitGraphics_SetCamera;
jclass PaintClass;
jmethodID Paint_init,Paint_setStrokeWidth,Paint_setARGB;
@@ -373,6 +376,28 @@ draw_image(struct graphics_priv *gra, struct graphics_gc_priv *fg, struct point
}
+static void
+draw_image_warp (struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, int count, struct graphics_image_priv *img)
+{
+
+ /*
+ *
+ *
+ * if coord count==3 then top.left top.right bottom.left
+ *
+ */
+
+ if (count==3)
+ {
+ initPaint(gr, fg);
+ (*jnienv)->CallVoidMethod(jnienv, gr->NavitGraphics, gr->NavitGraphics_draw_image_warp, fg->gra->Paint,
+ count, p[0].x, p[0].y,p[1].x, p[1].y, p[2].x, p[2].y, img->Bitmap);
+ } else
+ dbg(lvl_debug,"draw_image_warp is called with unsupported count parameter value %d\n", count);
+}
+
+
+
static void draw_drag(struct graphics_priv *gra, struct point *p)
{
(*jnienv)->CallVoidMethod(jnienv, gra->NavitGraphics, gra->NavitGraphics_draw_drag, p ? p->x : 0, p ? p->y : 0);
@@ -452,7 +477,7 @@ static struct graphics_methods graphics_methods = {
draw_circle,
draw_text,
draw_image,
- NULL,
+ draw_image_warp,
draw_drag,
font_new,
gc_new,
@@ -642,6 +667,8 @@ graphics_android_init(struct graphics_priv *ret, struct graphics_priv *parent, s
return 0;
if (!find_method(ret->NavitGraphicsClass, "draw_image", "(Landroid/graphics/Paint;IILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image))
return 0;
+ if (!find_method(ret->NavitGraphicsClass, "draw_image_warp", "(Landroid/graphics/Paint;IIIIIIILandroid/graphics/Bitmap;)V", &ret->NavitGraphics_draw_image_warp))
+ return 0;
if (!find_method(ret->NavitGraphicsClass, "draw_mode", "(I)V", &ret->NavitGraphics_draw_mode))
return 0;
if (!find_method(ret->NavitGraphicsClass, "draw_drag", "(II)V", &ret->NavitGraphics_draw_drag))