summaryrefslogtreecommitdiff
path: root/champlain/champlain-file-tile-source.c
diff options
context:
space:
mode:
Diffstat (limited to 'champlain/champlain-file-tile-source.c')
-rw-r--r--champlain/champlain-file-tile-source.c66
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);
+ }
}