diff options
Diffstat (limited to 'champlain/champlain-file-tile-source.c')
-rw-r--r-- | champlain/champlain-file-tile-source.c | 66 |
1 files changed, 54 insertions, 12 deletions
diff --git a/champlain/champlain-file-tile-source.c b/champlain/champlain-file-tile-source.c index 81c428b..23a6aec 100644 --- a/champlain/champlain-file-tile-source.c +++ b/champlain/champlain-file-tile-source.c @@ -141,17 +141,33 @@ champlain_file_tile_source_load_map_data (ChamplainFileTileSource *self, } +typedef struct +{ + ChamplainMapSource *map_source; +} TileRenderedData; + + static void tile_rendered_cb (ChamplainTile *tile, ChamplainRenderCallbackData *data, - ChamplainMapSource *map_source) + TileRenderedData *user_data) { - ChamplainTileSource *tile_source = CHAMPLAIN_TILE_SOURCE (map_source); - ChamplainTileCache *tile_cache = champlain_tile_source_get_cache (tile_source); - ChamplainMapSource *next_source = champlain_map_source_get_next_source (map_source); + ChamplainMapSource *map_source = user_data->map_source; + ChamplainMapSource *next_source; + + // frees user_data - must not be used later in the function + g_signal_handlers_disconnect_by_func (tile, tile_rendered_cb, map_source); + + if (!map_source) + return; + next_source = champlain_map_source_get_next_source (map_source); + if (!data->error) { + ChamplainTileSource *tile_source = CHAMPLAIN_TILE_SOURCE (map_source); + ChamplainTileCache *tile_cache = champlain_tile_source_get_cache (tile_source); + if (tile_cache && data->data) champlain_tile_cache_store_tile (tile_cache, tile, data->data, data->size); @@ -161,9 +177,17 @@ tile_rendered_cb (ChamplainTile *tile, } else if (next_source) champlain_map_source_fill_tile (next_source, tile); +} - g_object_unref (map_source); - g_signal_handlers_disconnect_by_func (tile, tile_rendered_cb, map_source); + +static void +destroy_cb_data (TileRenderedData *data, + G_GNUC_UNUSED GClosure *closure) +{ + if (data->map_source) + g_object_remove_weak_pointer (G_OBJECT (data->map_source), (gpointer *) &data->map_source); + + g_slice_free (TileRenderedData, data); } @@ -174,15 +198,33 @@ fill_tile (ChamplainMapSource *map_source, g_return_if_fail (CHAMPLAIN_IS_FILE_TILE_SOURCE (map_source)); g_return_if_fail (CHAMPLAIN_IS_TILE (tile)); - ChamplainRenderer *renderer; + ChamplainMapSource *next_source = champlain_map_source_get_next_source (map_source); + + if (champlain_tile_get_state (tile) != CHAMPLAIN_STATE_LOADED) + { + ChamplainRenderer *renderer; + TileRenderedData *user_data; + + renderer = champlain_map_source_get_renderer (map_source); - renderer = champlain_map_source_get_renderer (map_source); + g_return_if_fail (CHAMPLAIN_IS_RENDERER (renderer)); - g_return_if_fail (CHAMPLAIN_IS_RENDERER (renderer)); + user_data = g_slice_new (TileRenderedData); + user_data->map_source = map_source; - g_object_ref (map_source); + g_object_add_weak_pointer (G_OBJECT (map_source), (gpointer *) &user_data->map_source); - g_signal_connect (tile, "render-complete", G_CALLBACK (tile_rendered_cb), map_source); + g_signal_connect_data (tile, "render-complete", G_CALLBACK (tile_rendered_cb), + user_data, (GClosureNotify) destroy_cb_data, 0); - champlain_renderer_render (renderer, tile); + champlain_renderer_render (renderer, tile); + } + else if (CHAMPLAIN_IS_MAP_SOURCE (next_source)) + champlain_map_source_fill_tile (next_source, tile); + else if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_LOADED) + { + /* if we have some content, use the tile even if it wasn't validated */ + champlain_tile_set_state (tile, CHAMPLAIN_STATE_DONE); + champlain_tile_display_content (tile); + } } |