From 1514eb04fc391dbe8009e0fa57f5c902bba1af76 Mon Sep 17 00:00:00 2001 From: martin-s Date: Fri, 28 Dec 2007 10:04:39 +0000 Subject: [PATCH] Add:Core:Better support for route map git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@674 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/src/attr.h | 1 + navit/src/attr_def.h | 1 + navit/src/graphics.c | 19 ++- navit/src/graphics.h | 2 + navit/src/main.c | 1 + navit/src/map.c | 13 ++ navit/src/map.h | 8 - navit/src/navit.c | 37 +++-- navit/src/navit.h | 1 + navit/src/route.c | 296 +++++++++++++--------------------- navit/src/route.h | 1 + navit/src/track.c | 2 + navit/src/vehicle/demo/vehicle_demo.c | 52 +++--- 13 files changed, 194 insertions(+), 240 deletions(-) diff --git a/navit/src/attr.h b/navit/src/attr.h index 13b935c..e3ddeb4 100644 --- a/navit/src/attr.h +++ b/navit/src/attr.h @@ -37,6 +37,7 @@ struct attr { struct navit *navit; struct callback *callback; struct log *log; + struct route *route; } u; }; diff --git a/navit/src/attr_def.h b/navit/src/attr_def.h index 17940f9..299001f 100644 --- a/navit/src/attr_def.h +++ b/navit/src/attr_def.h @@ -94,4 +94,5 @@ ATTR2(0x00080000,type_object_begin) ATTR(navit) ATTR(log) ATTR(callback) +ATTR(route) ATTR2(0x0008ffff,type_object_end) diff --git a/navit/src/graphics.c b/navit/src/graphics.c index 815fcd7..dc2e631 100644 --- a/navit/src/graphics.c +++ b/navit/src/graphics.c @@ -475,6 +475,10 @@ do_draw_map(struct displaylist *displaylist, struct transformation *t, struct ma mr=map_rect_new(m, route_selection); else mr=map_rect_new(m, sel); + if (! mr) { + map_selection_destroy(sel); + return; + } while ((item=map_rect_get_item(mr))) { count=item_coord_get(item, ca, item->type < type_line ? 1: max); if (item->type >= type_line && count < 2) { @@ -518,7 +522,7 @@ do_draw_map(struct displaylist *displaylist, struct transformation *t, struct ma } static void -do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapsets, int order, struct route *route) +do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapsets, int order) { struct mapset *ms; struct map *m; @@ -532,11 +536,6 @@ do_draw(struct displaylist *displaylist, struct transformation *t, GList *mapset do_draw_map(displaylist, t, m, order); } mapset_close(h); - if (route) { - m = route_get_map(route); - if (m) - do_draw_map(displaylist, t, m, order); - } } int @@ -546,7 +545,7 @@ graphics_ready(struct graphics *this_) } void -graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts, struct route *route) +graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts) { int order=transform_get_order(trans); gra->meth.draw_mode(gra->priv, draw_mode_begin); @@ -573,7 +572,7 @@ graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy) void -graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts, struct route *route) +graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts) { int order=transform_get_order(trans); @@ -593,9 +592,9 @@ graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *maps } #endif profile(0,NULL); - do_draw(displaylist, trans, mapsets, order, route); + do_draw(displaylist, trans, mapsets, order); profile(1,"do_draw"); - graphics_displaylist_draw(gra, displaylist, trans, layouts, route); + graphics_displaylist_draw(gra, displaylist, trans, layouts); profile(1,"xdisplay_draw"); profile(0,"end"); diff --git a/navit/src/graphics.h b/navit/src/graphics.h index 33ccd18..47fc321 100644 --- a/navit/src/graphics.h +++ b/navit/src/graphics.h @@ -117,7 +117,9 @@ void graphics_draw_circle(struct graphics *this_, struct graphics_gc *gc, struct void graphics_draw_rectangle(struct graphics *this_, struct graphics_gc *gc, struct point *p, int w, int h); void display_add(struct displaylist *displaylist, struct item *item, int count, struct point *pnt, char *label); int graphics_ready(struct graphics *this_); +void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, GList *layouts); void graphics_displaylist_move(struct displaylist *displaylist, int dx, int dy); +void graphics_draw(struct graphics *gra, struct displaylist *displaylist, GList *mapsets, struct transformation *trans, GList *layouts); struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist); struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh); void graphics_displaylist_close(struct displaylist_handle *dlh); diff --git a/navit/src/main.c b/navit/src/main.c index 0acdfff..020b7d4 100644 --- a/navit/src/main.c +++ b/navit/src/main.c @@ -137,6 +137,7 @@ int main(int argc, char **argv) if (s) { setenv("SDL_WINDOWID", s, 0); } + route_init(); config_file=NULL; if (argc > 1) config_file=argv[1]; diff --git a/navit/src/map.c b/navit/src/map.c index f7a872d..c86ad5b 100644 --- a/navit/src/map.c +++ b/navit/src/map.c @@ -10,6 +10,15 @@ #include "plugin.h" #include "country.h" + +struct map { + struct map_methods meth; + struct map_priv *priv; + char *type; + char *filename; + int active; +}; + struct map_rect { struct map *m; struct map_rect_priv *priv; @@ -106,6 +115,10 @@ map_rect_new(struct map *m, struct map_selection *sel) mr=g_new0(struct map_rect, 1); mr->m=m; mr->priv=m->meth.map_rect_new(m->priv, sel); + if (! mr->priv) { + g_free(mr); + mr=NULL; + } return mr; } diff --git a/navit/src/map.h b/navit/src/map.h index 9392a20..74da1a3 100644 --- a/navit/src/map.h +++ b/navit/src/map.h @@ -29,14 +29,6 @@ struct map_methods { struct item * (*map_search_get_item)(struct map_search_priv *ms); }; -struct map { - struct map_methods meth; - struct map_priv *priv; - char *type; - char *filename; - int active; -}; - static inline int map_selection_contains_point(struct map_selection *sel, struct coord *c) { diff --git a/navit/src/navit.c b/navit/src/navit.c index ab18bf1..8cf7454 100644 --- a/navit/src/navit.c +++ b/navit/src/navit.c @@ -71,6 +71,8 @@ struct navit { struct statusbar *statusbar; struct menu *menubar; struct route *route; + struct map *route_map; + struct map *route_graph_map; struct navigation *navigation; struct speech *speech; struct tracking *tracking; @@ -133,7 +135,7 @@ navit_draw(struct navit *this_) struct navit_vehicle *nv; transform_setup_source_rect(this_->trans); - graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route); + graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts); l=this_->vehicles; while (l) { nv=l->data; @@ -146,9 +148,8 @@ navit_draw(struct navit *this_) void navit_draw_displaylist(struct navit *this_) { - if (this_->ready) { - graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts, this_->route); - } + if (this_->ready) + graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts); } static void @@ -233,7 +234,7 @@ navit_motion_timeout(void *data) if (dx || dy) { this_->last=this_->current; graphics_displaylist_move(this_->displaylist, dx, dy); - graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts, this_->route); + graphics_displaylist_draw(this_->gra, this_->displaylist, this_->trans, this_->layouts); this_->moved=1; } this_->motion_timeout=0; @@ -1020,6 +1021,10 @@ navit_init(struct navit *this_) } if (this_->mapsets) { ms=this_->mapsets->data; + if (this_->route_map) + mapset_add(ms, this_->route_map); + if (this_->route_graph_map) + mapset_add(ms, this_->route_graph_map); if (this_->route) route_set_mapset(this_->route, ms); if (this_->tracking) @@ -1323,7 +1328,20 @@ navit_tracking_add(struct navit *this_, struct tracking *tracking) void navit_route_add(struct navit *this_, struct route *route) { + struct attr route_attr={.type=attr_route,.u.route=route}; + struct attr data_attr={.type=attr_data,.u.str=""}; + struct attr *attrs_route[]={&route_attr, &data_attr, NULL}; + struct attr *attrs_route_graph[]={&route_attr, &data_attr, NULL}; this_->route=route; + this_->route_map=map_new("route",attrs_route); + this_->route_graph_map=map_new("route_graph",attrs_route_graph); + map_set_active(this_->route_graph_map, 0); +} + +struct map * +navit_get_route_map(struct navit *this_) +{ + return this_->route_map; } void @@ -1377,13 +1395,4 @@ navit_destroy(struct navit *this_) g_free(this_); } -void -navit_toggle_routegraph_display(struct navit *nav) -{ - if (!nav->route) - return; - route_toggle_routegraph_display(nav->route); - navit_draw(nav); -} - /** @} */ diff --git a/navit/src/navit.h b/navit/src/navit.h index 812d73d..20588d3 100644 --- a/navit/src/navit.h +++ b/navit/src/navit.h @@ -72,6 +72,7 @@ void navit_remove_init_cb(struct navit *this_, struct callback *cb); void navit_set_vehicle(struct navit *this_, struct navit_vehicle *nv); void navit_tracking_add(struct navit *this_, struct tracking *tracking); void navit_route_add(struct navit *this_, struct route *route); +struct map *navit_get_route_map(struct navit *this_); void navit_navigation_add(struct navit *this_, struct navigation *navigation); void navit_set_speech(struct navit *this_, struct speech *speech); struct gui *navit_get_gui(struct navit *this_); diff --git a/navit/src/route.c b/navit/src/route.c index 74bd7cb..61dac6d 100644 --- a/navit/src/route.c +++ b/navit/src/route.c @@ -21,26 +21,13 @@ #include "point.h" #include "graphics.h" #include "transform.h" +#include "plugin.h" #include "fib.h" -#if 0 -static int speed_list[]={ - 10, /* street_0 */ - 10, /* street_1_city */ - 30, /* street_2_city */ - 40, /* street_3_city */ - 50, /* street_4_city */ - 80, /* highway_city */ - 60, /* street_1_land */ - 65, /* street_2_land */ - 70, /* street_3_land */ - 80, /* street_4_land */ - 120, /* street_n_lanes */ - 120, /* highway_land */ - 40, /* ramp */ - 30, /* ferry */ + +struct map_priv { + struct route *route; }; -#endif int debug_route=0; @@ -106,7 +93,6 @@ struct route_path { struct route { int version; struct mapset *ms; - struct map route_map; unsigned flags; struct route_info *pos; struct route_info *dst; @@ -253,6 +239,7 @@ route_set_position(struct route *this, struct pcoord *pos) { if (this->pos) route_info_free(this->pos); + this->pos=NULL; this->pos=route_find_nearest_street(this->ms, pos); dbg(1,"this->pos=%p\n", this->pos); if (! this->pos) @@ -276,6 +263,7 @@ route_set_position_from_tracking(struct route *this, struct tracking *tracking) } if (this->pos) route_info_free(this->pos); + this->pos=NULL; ret->c=*c; ret->lp=*c; ret->pos=tracking_get_segment_pos(tracking); @@ -646,113 +634,6 @@ route_path_close(struct route_path_handle *h) g_free(h); } -struct route_path_coord_handle { - struct route *route; - int pos; /* -1 = Begin, 0 = Middle, 1 = End */ - int dir; - int spos; - struct coord last; - struct route_info_handle *ri; - struct route_path_handle *rp; - struct street_data *street_data; -}; - -struct route_path_coord_handle * -route_path_coord_open(struct route *this) -{ - struct route_path_coord_handle *ret; - - if (! route_get_pos(this) || ! route_get_dst(this)) - return NULL; - - ret=g_new0(struct route_path_coord_handle, 1); - if (!ret) { - printf("%s:Out of memory\n", __FUNCTION__); - return ret; - } - ret->route=this; - ret->ri=route_info_open(route_get_pos(this), route_get_dst(this), 0); - if (!ret->ri) { - ret->ri=route_info_open(route_get_pos(this), NULL, 0); - ret->pos=-1; - } - else - ret->pos=1; - return ret; -} - -struct coord * -route_path_coord_get(struct route_path_coord_handle *h) -{ - struct coord *c; - struct route_path_segment *seg; - struct item *item, *item2; - struct map_rect *mr; - - switch(h->pos) { - case -1: - c=route_info_get(h->ri); - if (c) { - h->last=*c; - return c; - } - h->pos=0; - h->rp=route_path_open(h->route); - case 0: - if (! h->street_data && h->rp) { - seg=route_path_get_segment(h->rp); - if (seg) { - item=route_path_segment_get_item(seg); - mr=map_rect_new(item->map,NULL); - item2=map_rect_get_item_byid(mr, item->id_hi, item->id_lo); - h->street_data=street_get_data(item2); - map_rect_destroy(mr); - if (h->street_data->c[0].x == h->last.x && h->street_data->c[0].y == h->last.y) { - h->spos=1; - h->dir=1; - } else { - h->spos=h->street_data->count-2; - h->dir=-1; - } - } - } - if (h->street_data) { - c=&h->street_data->c[h->spos]; - h->last=*c; - h->spos+=h->dir; - if (h->spos < 0 || h->spos >= h->street_data->count) { - street_data_free(h->street_data); - h->street_data=NULL; - } - return c; - } - h->pos=1; - case 1: - c=route_info_get(h->ri); - if (c) { - h->last=*c; - return c; - } - h->pos=2; - default: - return NULL; - } - -} - -void -route_path_coord_close(struct route_path_coord_handle *h) -{ - if (h->street_data) - street_data_free(h->street_data); - if (h->rp) - route_path_close(h->rp); - if (h->ri) - route_info_close(h->ri); - g_free(h); -} - - static void route_graph_free_segments(struct route_graph *this) { @@ -1116,6 +997,8 @@ route_graph_build(struct mapset *ms, struct coord *c1, struct coord *c2) h=mapset_open(ms); while ((m=mapset_next(h,1))) { mr=map_rect_new(m, sel); + if (! mr) + continue; while ((item=map_rect_get_item(mr))) { if (item->type >= type_street_0 && item->type <= type_ferry) { route_process_street_graph(ret, item); @@ -1218,6 +1101,8 @@ route_find_nearest_street(struct mapset *ms, struct pcoord *pc) transform_from_geo(map_projection(m), &g, &c); } mr=map_rect_new(m, sel); + if (! mr) + continue; while ((item=map_rect_get_item(mr))) { if (item->type >= type_street_0 && item->type <= type_ferry) { sd=street_get_data(item); @@ -1454,11 +1339,10 @@ struct map_rect_priv { struct route_info_handle *ri; int pos_next; int pos; - struct route *mpriv; + struct map_priv *mpriv; struct item item; unsigned int last_coord; struct route_path_segment *seg; - int segsdone; struct route_graph_point *point; char *label; }; @@ -1575,25 +1459,43 @@ static struct item_methods methods_point_item = { static void rm_destroy(struct map_priv *priv) { + g_free(priv); } static struct map_rect_priv * -rm_rect_new(struct map_priv *map, struct map_selection *sel) +rm_rect_new(struct map_priv *priv, struct map_selection *sel) { - struct route *route=(struct route *)map; struct map_rect_priv * mr; dbg(1,"enter\n"); + if (! route_get_pos(priv->route)) + return NULL; + if (! route_get_dst(priv->route)) + return NULL; + if (! priv->route->path2) + return NULL; mr=g_new0(struct map_rect_priv, 1); - mr->mpriv = route; - mr->ri=route_info_open(route_get_pos(route), route_get_dst(route), 0); + mr->mpriv = priv; + mr->ri=route_info_open(route_get_pos(priv->route), route_get_dst(priv->route), 0); mr->pos_next=1; if (!mr->ri) { - mr->ri=route_info_open(route_get_pos(route), NULL, 0); + mr->ri=route_info_open(route_get_pos(priv->route), NULL, 0); mr->pos_next=-1; } return mr; } +static struct map_rect_priv * +rp_rect_new(struct map_priv *priv, struct map_selection *sel) +{ + struct map_rect_priv * mr; + dbg(1,"enter\n"); + if (! priv->route->graph || ! priv->route->graph->route_points) + return NULL; + mr=g_new0(struct map_rect_priv, 1); + mr->mpriv = priv; + return mr; +} + static void rm_rect_destroy(struct map_rect_priv *mr) { @@ -1605,37 +1507,35 @@ rm_rect_destroy(struct map_rect_priv *mr) } static struct item * +rp_get_item(struct map_rect_priv *mr) +{ + struct route *r = mr->mpriv->route; + struct route_graph_point *p = mr->point; + + if (!p) + p = r->graph->route_points; + else + p = p->next; + if (!p) + return NULL; + mr->point = p; + mr->last_coord = 0; + mr->item.id_hi = 0; + mr->item.id_lo = 0; + mr->item.map = NULL; + mr->item.priv_data = mr; + mr->item.type = type_rg_point; + mr->item.meth = &methods_point_item; + return &mr->item; +} + +static struct item * rm_get_item(struct map_rect_priv *mr) { - struct route *r = mr->mpriv; + struct route *r = mr->mpriv->route; struct route_path_segment *seg = mr->seg; dbg(1,"enter\n", mr->pos); -rep: - if (mr->segsdone) { - if (!(r->flags & RF_SHOWGRAPH)) - return NULL; - else { - struct route_graph_point *p = mr->point; - if (!p) - p = r->graph->route_points; - else - p = p->next; - if (!p) - return NULL; - mr->point = p; - mr->last_coord = 0; - mr->item.id_hi = 0; - mr->item.id_lo = 0; - mr->item.map = NULL; -// mr->item = NULL; - mr->item.priv_data = mr; - mr->item.type = type_rg_point; - mr->item.meth = &methods_point_item; - return &mr->item; - } - } - mr->pos=mr->pos_next; switch(mr->pos) { case -1: @@ -1657,9 +1557,6 @@ rep: mr->pos_next=2; break; case 2: - mr->segsdone = 1; - if (r->flags & RF_SHOWGRAPH) - goto rep; return NULL; } mr->seg = seg; @@ -1676,12 +1573,12 @@ rep: static struct item * rm_get_item_byid(struct map_rect_priv *mr, int id_hi, int id_lo) { - printf("%s called on Route map\n", __FUNCTION__); + dbg(0,"called on Route map\n"); return NULL; } static struct map_methods route_meth = { - projection_none, + projection_mg, NULL, rm_destroy, rm_rect_new, @@ -1693,27 +1590,18 @@ static struct map_methods route_meth = { NULL, }; -static void -route_init_map(struct route *route) -{ - struct map *m = &route->route_map; - m->priv = (struct map_priv *)route; - m->type = "Route"; - m->filename = NULL; - m->active = 0; - m->meth = route_meth; - m->meth.pro = route_projection(route); -} - -struct map * -route_get_map(struct route *route) -{ - if (route->pos && route->dst && route->path2) { - route_init_map(route); - return &route->route_map; - } - return NULL; -} +static struct map_methods route_graph_meth = { + projection_mg, + NULL, + rm_destroy, + rp_rect_new, + rm_rect_destroy, + rp_get_item, + rm_get_item_byid, + NULL, + NULL, + NULL, +}; void route_toggle_routegraph_display(struct route *route) @@ -1724,3 +1612,43 @@ route_toggle_routegraph_display(struct route *route) route->flags |= RF_SHOWGRAPH; } } + +static struct map_priv * +route_map_new_helper(struct map_methods *meth, struct attr **attrs, int graph) +{ + struct map_priv *ret; + struct attr *route_attr; + + route_attr=attr_search(attrs, NULL, attr_route); + if (! route_attr) + return NULL; + ret=g_new0(struct map_priv, 1); + if (graph) + *meth=route_graph_meth; + else + *meth=route_meth; + ret->route=route_attr->u.route; + + return ret; +} + +static struct map_priv * +route_map_new(struct map_methods *meth, struct attr **attrs) +{ + return route_map_new_helper(meth, attrs, 0); +} + +static struct map_priv * +route_graph_map_new(struct map_methods *meth, struct attr **attrs) +{ + return route_map_new_helper(meth, attrs, 1); +} + + + +void +route_init(void) +{ + plugin_register_map_type("route", route_map_new); + plugin_register_map_type("route_graph", route_graph_map_new); +} diff --git a/navit/src/route.h b/navit/src/route.h index 6455cff..06575e0 100644 --- a/navit/src/route.h +++ b/navit/src/route.h @@ -74,6 +74,7 @@ void route_info_close(struct route_info_handle *h); void route_draw(struct route *this, struct transformation *t, struct displaylist *dsp); struct map *route_get_map(struct route *route); void route_toggle_routegraph_display(struct route *route); +void route_init(void); /* end of prototypes */ #endif diff --git a/navit/src/track.c b/navit/src/track.c index 268ec6e..1f10d4c 100644 --- a/navit/src/track.c +++ b/navit/src/track.c @@ -123,6 +123,8 @@ tracking_doupdate_lines(struct tracking *tr, struct coord *cc) h=mapset_open(tr->ms); while ((m=mapset_next(h,1))) { mr=map_rect_new(m, sel); + if (! mr) + continue; while ((item=map_rect_get_item(mr))) { if (item->type >= type_street_0 && item->type <= type_ferry) { street=street_get_data(item); diff --git a/navit/src/vehicle/demo/vehicle_demo.c b/navit/src/vehicle/demo/vehicle_demo.c index a87e873..b6c7e20 100644 --- a/navit/src/vehicle/demo/vehicle_demo.c +++ b/navit/src/vehicle/demo/vehicle_demo.c @@ -3,6 +3,7 @@ #include "coord.h" #include "item.h" #include "navit.h" +#include "map.h" #include "route.h" #include "callback.h" #include "transform.h" @@ -67,9 +68,11 @@ struct vehicle_methods vehicle_demo_methods = { static int vehicle_demo_timer(struct vehicle_priv *priv) { - struct route_path_coord_handle *h=NULL; - struct coord *c, *pos=NULL, ci; + struct coord c, pos, ci; int slen, len, dx, dy; + struct map *route_map=NULL; + struct map_rect *mr=NULL; + struct item *item=NULL; len = (priv->speed * priv->interval / 1000)/ 3.6; dbg(1, "###### Entering simulation loop\n"); @@ -77,38 +80,37 @@ vehicle_demo_timer(struct vehicle_priv *priv) dbg(1, "vehicle->navit is not set. Can't simulate\n"); return 1; } - struct route *vehicle_route = navit_get_route(priv->navit); - if (vehicle_route) - h = route_path_coord_open(vehicle_route); - if (h) - pos = route_path_coord_get(h); - dbg(1, "current pos=%p\n", pos); - if (pos) { + route_map=navit_get_route_map(priv->navit); + if (route_map) + mr=map_rect_new(route_map, NULL); + if (mr) + item=map_rect_get_item(mr); + if (mr && item_coord_get(item, &pos, 1)) { priv->position_set=0; - dbg(1, "current pos=0x%x,0x%x\n", pos->x, pos->y); + dbg(1, "current pos=0x%x,0x%x\n", pos.x, pos.y); dbg(1, "last pos=0x%x,0x%x\n", priv->last.x, priv->last.y); - if (priv->last.x == pos->x && priv->last.y == pos->y) { + if (priv->last.x == pos.x && priv->last.y == pos.y) { dbg(1, "endless loop\n"); } - priv->last = *pos; - for (;;) { - c = route_path_coord_get(h); - dbg(1, "next pos=%p\n", c); - if (!c) - break; - dbg(1, "next pos=0x%x,0x%x\n", c->x, c->y); - slen = transform_distance(projection_mg, pos, c); + priv->last = pos; + while (item) { + if (!item_coord_get(item, &c, 1)) { + item=map_rect_get_item(mr); + continue; + } + dbg(1, "next pos=0x%x,0x%x\n", c.x, c.y); + slen = transform_distance(projection_mg, &pos, &c); dbg(1, "len=%d slen=%d\n", len, slen); if (slen < len) { len -= slen; pos = c; } else { - dx = c->x - pos->x; - dy = c->y - pos->y; - ci.x = pos->x + dx * len / slen; - ci.y = pos->y + dy * len / slen; + dx = c.x - pos.x; + dy = c.y - pos.y; + ci.x = pos.x + dx * len / slen; + ci.y = pos.y + dy * len / slen; priv->direction = - transform_get_angle_delta(pos, c, 0); + transform_get_angle_delta(&pos, &c, 0); dbg(1, "ci=0x%x,0x%x\n", ci.x, ci.y); transform_to_geo(projection_mg, &ci, &priv->geo); @@ -120,6 +122,8 @@ vehicle_demo_timer(struct vehicle_priv *priv) if (priv->position_set) callback_list_call_0(priv->cbl); } + if (mr) + map_rect_destroy(mr); return 1; } -- 2.7.4