X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/820c59f46fb345afff468d146c539d34d2266f11..d260d7985116255a0eb2232edfd8a0dbc29f31d6:/src/vikmapslayer.c diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index 828b5014..5e4bbc2e 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -36,8 +36,13 @@ #include #include +#ifdef HAVE_STRING_H #include +#endif +#ifdef HAVE_MATH_H #include +#endif + #include "globals.h" #include "coords.h" #include "vikcoord.h" @@ -112,7 +117,7 @@ static VikLayerParamScale params_scales[] = { VikLayerParam maps_layer_params[] = { { "mode", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Map Type:"), VIK_LAYER_WIDGET_RADIOGROUP, NULL, NULL }, - { "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory (Optional):"), VIK_LAYER_WIDGET_FILEENTRY }, + { "directory", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Maps Directory:"), VIK_LAYER_WIDGET_FOLDERENTRY }, { "alpha", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Alpha:"), VIK_LAYER_WIDGET_HSCALE, params_scales }, { "autodownload", VIK_LAYER_PARAM_BOOLEAN, VIK_LAYER_GROUP_NONE, N_("Autodownload maps:"), VIK_LAYER_WIDGET_CHECKBUTTON }, { "mapzoom", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Zoom Level:"), VIK_LAYER_WIDGET_COMBOBOX, params_mapzooms }, @@ -142,7 +147,7 @@ VikLayerInterface vik_maps_layer_interface = { (VikLayerFuncCreate) maps_layer_new, (VikLayerFuncRealize) NULL, - maps_layer_post_read, + (VikLayerFuncPostRead) maps_layer_post_read, (VikLayerFuncFree) maps_layer_free, (VikLayerFuncProperties) NULL, @@ -201,12 +206,13 @@ enum { REDOWNLOAD_NONE = 0, REDOWNLOAD_BAD, REDOWNLOAD_ALL, DOWNLOAD_OR_REFRESH /******** MAPS LAYER TYPES **************/ /****************************************/ -void maps_layer_register_map_source ( const char *label, VikMapSource *map ) +void maps_layer_register_map_source ( VikMapSource *map ) { - g_assert(label != NULL); g_assert(map != NULL); guint id = vik_map_source_get_uniq_id(map); + const char *label = vik_map_source_get_label(map); + g_assert(label != NULL); /* Add the label */ params_maptypes = g_list_append(params_maptypes, g_strdup(label)); @@ -401,7 +407,7 @@ static VikLayerParamData maps_layer_get_param ( VikMapsLayer *vml, guint16 id ) VikLayerParamData rv; switch ( id ) { - case PARAM_CACHE_DIR: rv.s = (vml->cache_dir && strcmp(vml->cache_dir, MAPS_CACHE_DIR) != 0) ? vml->cache_dir : ""; break; + case PARAM_CACHE_DIR: rv.s = vml->cache_dir ? vml->cache_dir : ""; break; case PARAM_MAPTYPE: rv.u = map_index_to_uniq_id ( vml->maptype ); break; case PARAM_ALPHA: rv.u = vml->alpha; break; case PARAM_AUTODOWNLOAD: rv.u = vml->autodownload; break; @@ -512,7 +518,7 @@ static GdkPixbuf *pixbuf_shrink ( GdkPixbuf *pixbuf, gdouble xshrinkfactor, gdou { GdkPixbuf *tmp; guint16 width = gdk_pixbuf_get_width(pixbuf), height = gdk_pixbuf_get_height(pixbuf); - tmp = gdk_pixbuf_scale_simple(pixbuf, ceil(width * xshrinkfactor), ceil(height * yshrinkfactor), GDK_INTERP_BILINEAR); + tmp = gdk_pixbuf_scale_simple(pixbuf, ceil(width * xshrinkfactor), ceil(height * yshrinkfactor), GDK_INTERP_NEAREST); g_object_unref ( G_OBJECT(pixbuf) ); return tmp; } @@ -693,6 +699,24 @@ static void maps_layer_draw_section ( VikMapsLayer *vml, VikViewport *vvp, VikCo pixbuf = get_pixbuf ( vml, mode, &ulm, path_buf, max_path_len, xshrinkfactor, yshrinkfactor ); if ( pixbuf ) vik_viewport_draw_pixbuf ( vvp, pixbuf, 0, 0, xx, yy, tilesize_x_ceil, tilesize_y_ceil ); + else { + /* retry with bigger shrinkfactor */ + int scale_inc; + for (scale_inc = 1; scale_inc < 4; scale_inc ++) { + int scale_factor = 1 << scale_inc; /* 2^scale_inc */ + MapCoord ulm2 = ulm; + ulm2.x = ulm.x / scale_factor; + ulm2.y = ulm.y / scale_factor; + ulm2.scale = ulm.scale + scale_inc; + pixbuf = get_pixbuf ( vml, mode, &ulm2, path_buf, max_path_len, xshrinkfactor * scale_factor, yshrinkfactor * scale_factor ); + if ( pixbuf ) { + gint src_x = (ulm.x % scale_factor) * tilesize_x_ceil; + gint src_y = (ulm.y % scale_factor) * tilesize_y_ceil; + vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, xx, yy, tilesize_x_ceil, tilesize_y_ceil ); + break; + } + } + } } yy += tilesize_y; @@ -770,7 +794,7 @@ static void weak_ref_cb(gpointer ptr, GObject * dead_vml) g_mutex_unlock(mdi->mutex); } -static void map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) +static int map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) { guint donemaps = 0; gint x, y; @@ -785,7 +809,9 @@ static void map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) mdi->mapcoord.scale, mdi->mapcoord.z, x, y ); donemaps++; - a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */ + int res = a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */ + if (res != 0) + return -1; if ( mdi->redownload == REDOWNLOAD_ALL) g_remove ( mdi->filename_buf ); @@ -839,6 +865,7 @@ static void map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata ) if (mdi->map_layer_alive) g_object_weak_unref(G_OBJECT(mdi->vml), weak_ref_cb, mdi); g_mutex_unlock(mdi->mutex); + return 0; } static void mdi_cancel_cleanup ( MapDownloadInfo *mdi ) @@ -1170,6 +1197,7 @@ static void maps_layer_add_menu_items ( VikMapsLayer *vml, GtkMenu *menu, VikLay gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); gtk_widget_show ( item ); + /* TODO Add GTK_STOCK_REFRESH icon */ item = gtk_menu_item_new_with_label ( _("Refresh Onscreen Tiles") ); g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_redownload_all_onscreen_maps), pass_along ); gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);