summaryrefslogtreecommitdiff
path: root/navit/graphics.c
diff options
context:
space:
mode:
authormdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-02-10 22:51:55 +0000
committermdankov <mdankov@ffa7fe5e-494d-0410-b361-a75ebd5db220>2012-02-10 22:51:55 +0000
commit52afa5e955540d63d8387c166202ac7bd0c18ccb (patch)
tree5f7ea916fb7e16123f74a97a35567ba483ddada4 /navit/graphics.c
parent705290c5e6b3f80811051b597686def2b900ca53 (diff)
downloadnavit-52afa5e955540d63d8387c166202ac7bd0c18ccb.tar.gz
Fix:core:Fix reference to already freed object in displaylist->dc.transform. Was causing a crash when entering Map Point information if both menu_on_map_click is on and osd button firing gui.menu() is enabled.
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4930 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/graphics.c')
-rw-r--r--navit/graphics.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/navit/graphics.c b/navit/graphics.c
index 2040e72d9..3b6a7fc8e 100644
--- a/navit/graphics.c
+++ b/navit/graphics.c
@@ -2179,7 +2179,10 @@ do_draw(struct displaylist *displaylist, int cancel, int flags)
void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags)
{
int order=transform_get_order(trans);
- displaylist->dc.trans=trans;
+ if(displaylist->dc.trans && displaylist->dc.trans!=trans)
+ transform_destroy(displaylist->dc.trans);
+ if(displaylist->dc.trans!=trans)
+ displaylist->dc.trans=transform_dup(trans);
displaylist->dc.gra=gra;
displaylist->dc.mindist=transform_get_scale(trans)/2;
// FIXME find a better place to set the background color
@@ -2217,7 +2220,10 @@ static void graphics_load_mapset(struct graphics *gra, struct displaylist *displ
displaylist->dc.gra=gra;
displaylist->ms=mapset;
- displaylist->dc.trans=trans;
+ if(displaylist->dc.trans && displaylist->dc.trans!=trans)
+ transform_destroy(displaylist->dc.trans);
+ if(displaylist->dc.trans!=trans)
+ displaylist->dc.trans=transform_dup(trans);
displaylist->workload=async ? 100 : 0;
displaylist->cb=cb;
displaylist->seq++;
@@ -2335,6 +2341,15 @@ struct displaylist * graphics_displaylist_new(void)
return ret;
}
+void graphics_displaylist_destroy(struct displaylist *displaylist)
+{
+ if(displaylist->dc.trans)
+ transform_destroy(displaylist->dc.trans);
+ g_free(displaylist);
+
+}
+
+
/**
* Get the map item which given displayitem is based on.
* NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members.