#include "vikmapslayer.h"
#include "icons/icons.h"
#include "metatile.h"
+#include "ui_util.h"
#ifdef HAVE_SQLITE3_H
#include "sqlite3.h"
#define VIK_SETTINGS_MAP_REAL_MIN_SHRINKFACTOR "maps_real_min_shrinkfactor"
static gdouble REAL_MIN_SHRINKFACTOR = 0.0039062499; /* if shrinkfactor is between MAX and REAL_MAX, will only check for existence */
+#define VIK_SETTINGS_MAP_SCALE_INC_UP "maps_scale_inc_up"
+static guint SCALE_INC_UP = 2;
+#define VIK_SETTINGS_MAP_SCALE_INC_DOWN "maps_scale_inc_down"
+static guint SCALE_INC_DOWN = 4;
+#define VIK_SETTINGS_MAP_SCALE_SMALLER_ZOOM_FIRST "maps_scale_smaller_zoom_first"
+static gboolean SCALE_SMALLER_ZOOM_FIRST = TRUE;
+
/****** MAP TYPES ******/
static GList *__map_types = NULL;
if ( a_settings_get_double ( VIK_SETTINGS_MAP_REAL_MIN_SHRINKFACTOR, &gdtmp ) )
REAL_MIN_SHRINKFACTOR = gdtmp;
+
+ gint gitmp = 0;
+ if ( a_settings_get_integer ( VIK_SETTINGS_MAP_SCALE_INC_UP, &gitmp ) )
+ SCALE_INC_UP = gitmp;
+
+ if ( a_settings_get_integer ( VIK_SETTINGS_MAP_SCALE_INC_DOWN, &gitmp ) )
+ SCALE_INC_DOWN = gitmp;
+
+ gboolean gbtmp = TRUE;
+ if ( a_settings_get_boolean ( VIK_SETTINGS_MAP_SCALE_SMALLER_ZOOM_FIRST, &gbtmp ) )
+ SCALE_SMALLER_ZOOM_FIRST = gbtmp;
+
}
/****************************************/
/****** DRAWING ******/
/*********************/
-static GdkPixbuf *pixbuf_set_alpha ( GdkPixbuf *pixbuf, guint8 alpha )
-{
- guchar *pixels;
- gint width, height, iii, jjj;
-
- if ( ! gdk_pixbuf_get_has_alpha ( pixbuf ) )
- {
- GdkPixbuf *tmp = gdk_pixbuf_add_alpha(pixbuf,FALSE,0,0,0);
- g_object_unref(G_OBJECT(pixbuf));
- pixbuf = tmp;
- if ( !pixbuf )
- return NULL;
- }
-
- pixels = gdk_pixbuf_get_pixels(pixbuf);
- width = gdk_pixbuf_get_width(pixbuf);
- height = gdk_pixbuf_get_height(pixbuf);
-
- /* r,g,b,a,r,g,b,a.... */
- for (iii = 0; iii < width; iii++) for (jjj = 0; jjj < height; jjj++)
- {
- pixels += 3;
- *pixels++ = alpha;
- }
- return pixbuf;
-}
-
static GdkPixbuf *pixbuf_shrink ( GdkPixbuf *pixbuf, gdouble xshrinkfactor, gdouble yshrinkfactor )
{
GdkPixbuf *tmp;
{
// Apply alpha setting
if ( pixbuf && vml->alpha < 255 )
- pixbuf = pixbuf_set_alpha ( pixbuf, vml->alpha );
+ pixbuf = ui_pixbuf_set_alpha ( pixbuf, vml->alpha );
if ( pixbuf && ( xshrinkfactor != 1.0 || yshrinkfactor != 1.0 ) )
pixbuf = pixbuf_shrink ( pixbuf, xshrinkfactor, yshrinkfactor );
return TRUE;
}
+/**
+ *
+ */
+gboolean try_draw_scale_down (VikMapsLayer *vml, VikViewport *vvp, MapCoord ulm, gint xx, gint yy, gint tilesize_x_ceil, gint tilesize_y_ceil,
+ gdouble xshrinkfactor, gdouble yshrinkfactor, guint id, const gchar *mapname, gchar *path_buf, guint max_path_len)
+{
+ GdkPixbuf *pixbuf;
+ int scale_inc;
+ for (scale_inc = 1; scale_inc < SCALE_INC_DOWN; scale_inc ++) {
+ // Try with smaller zooms
+ 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, id, mapname, &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 );
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+/**
+ *
+ */
+gboolean try_draw_scale_up (VikMapsLayer *vml, VikViewport *vvp, MapCoord ulm, gint xx, gint yy, gint tilesize_x_ceil, gint tilesize_y_ceil,
+ gdouble xshrinkfactor, gdouble yshrinkfactor, guint id, const gchar *mapname, gchar *path_buf, guint max_path_len)
+{
+ GdkPixbuf *pixbuf;
+ // Try with bigger zooms
+ int scale_dec;
+ for (scale_dec = 1; scale_dec < SCALE_INC_UP; scale_dec ++) {
+ int pict_x, pict_y;
+ int scale_factor = 1 << scale_dec; /* 2^scale_dec */
+ MapCoord ulm2 = ulm;
+ ulm2.x = ulm.x * scale_factor;
+ ulm2.y = ulm.y * scale_factor;
+ ulm2.scale = ulm.scale - scale_dec;
+ for (pict_x = 0; pict_x < scale_factor; pict_x ++) {
+ for (pict_y = 0; pict_y < scale_factor; pict_y ++) {
+ MapCoord ulm3 = ulm2;
+ ulm3.x += pict_x;
+ ulm3.y += pict_y;
+ pixbuf = get_pixbuf ( vml, id, mapname, &ulm3, path_buf, max_path_len, xshrinkfactor / scale_factor, yshrinkfactor / scale_factor );
+ if ( pixbuf ) {
+ gint src_x = 0;
+ gint src_y = 0;
+ gint dest_x = xx + pict_x * (tilesize_x_ceil / scale_factor);
+ gint dest_y = yy + pict_y * (tilesize_y_ceil / scale_factor);
+ vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, dest_x, dest_y, tilesize_x_ceil / scale_factor, tilesize_y_ceil / scale_factor );
+ return TRUE;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
static void maps_layer_draw_section ( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br )
{
MapCoord ulm, brm;
vik_viewport_draw_line ( vvp, black_gc, xx+tilesize_x_ceil, yy, xx, yy+tilesize_y_ceil );
}
} else {
- int scale_inc;
- for (scale_inc = 0; scale_inc < 4; scale_inc ++) {
- /* try with correct then smaller zooms */
- 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, id, mapname, &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;
-#ifdef DEBUG
- printf("maps_layer_draw_section - x=%d, y=%d, z=%d, src_x=%d, src_y=%d, xx=%d, yy=%d - %x\n", ulm.x, ulm.y, ulm.scale, src_x, src_y, (int)xx, (int)yy, vvp);
-#endif
- vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, xx, yy, tilesize_x_ceil, tilesize_y_ceil );
- break;
- }
+ // Try correct scale first
+ int scale_factor = 1;
+ pixbuf = get_pixbuf ( vml, id, mapname, &ulm, 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 );
}
- if ( !pixbuf ) {
- /* retry with bigger zooms */
- int scale_dec;
- for (scale_dec = 1; scale_dec < 2; scale_dec ++) {
- int pict_x, pict_y;
- int scale_factor = 1 << scale_dec; /* 2^scale_dec */
- MapCoord ulm2 = ulm;
- ulm2.x = ulm.x * scale_factor;
- ulm2.y = ulm.y * scale_factor;
- ulm2.scale = ulm.scale - scale_dec;
- for (pict_x = 0; pict_x < scale_factor; pict_x ++) {
- for (pict_y = 0; pict_y < scale_factor; pict_y ++) {
- MapCoord ulm3 = ulm2;
- ulm3.x += pict_x;
- ulm3.y += pict_y;
- pixbuf = get_pixbuf ( vml, id, mapname, &ulm3, path_buf, max_path_len, xshrinkfactor / scale_factor, yshrinkfactor / scale_factor );
- if ( pixbuf ) {
- gint src_x = 0;
- gint src_y = 0;
- gint dest_x = xx + pict_x * (tilesize_x_ceil / scale_factor);
- gint dest_y = yy + pict_y * (tilesize_y_ceil / scale_factor);
- vik_viewport_draw_pixbuf ( vvp, pixbuf, src_x, src_y, dest_x, dest_y, tilesize_x_ceil / scale_factor, tilesize_y_ceil / scale_factor );
- }
- }
+ else {
+ // Otherwise try different scales
+ if ( SCALE_SMALLER_ZOOM_FIRST ) {
+ if ( !try_draw_scale_down(vml,vvp,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len) ) {
+ try_draw_scale_up(vml,vvp,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len);
+ }
+ }
+ else {
+ if ( !try_draw_scale_up(vml,vvp,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len) ) {
+ try_draw_scale_down(vml,vvp,ulm,xx,yy,tilesize_x_ceil,tilesize_y_ceil,xshrinkfactor,yshrinkfactor,id,mapname,path_buf,max_path_len);
}
}
}
g_mutex_unlock(mdi->mutex);
}
+static gboolean is_in_area (VikMapSource *map, MapCoord mc)
+{
+ VikCoord vc;
+ vik_map_source_mapcoord_to_center_coord ( map, &mc, &vc );
+
+ struct LatLon tl;
+ tl.lat = vik_map_source_get_lat_max(map);
+ tl.lon = vik_map_source_get_lon_min(map);
+ struct LatLon br;
+ br.lat = vik_map_source_get_lat_min(map);
+ br.lon = vik_map_source_get_lon_max(map);
+ VikCoord vctl;
+ vik_coord_load_from_latlon (&vctl, VIK_COORD_LATLON, &tl);
+ VikCoord vcbr;
+ vik_coord_load_from_latlon (&vcbr, VIK_COORD_LATLON, &br);
+
+ return vik_coord_inside ( &vc, &vctl, &vcbr );
+}
+
static int map_download_thread ( MapDownloadInfo *mdi, gpointer threaddata )
{
void *handle = vik_map_source_download_handle_init(MAPS_LAYER_NTH_TYPE(mdi->maptype));
guint donemaps = 0;
+ MapCoord mcoord = mdi->mapcoord;
gint x, y;
for ( x = mdi->x0; x <= mdi->xf; x++ )
{
+ mcoord.x = x;
for ( y = mdi->y0; y <= mdi->yf; y++ )
{
- gboolean remove_mem_cache = FALSE;
- gboolean need_download = FALSE;
-
- get_filename ( mdi->cache_dir, mdi->cache_layout,
- vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
- vik_map_source_get_name(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
- mdi->mapcoord.scale, mdi->mapcoord.z, x, y, mdi->filename_buf, mdi->maxlen,
- vik_map_source_get_file_extension(MAPS_LAYER_NTH_TYPE(mdi->maptype)) );
-
- donemaps++;
- int res = a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */
- if (res != 0) {
- vik_map_source_download_handle_cleanup(MAPS_LAYER_NTH_TYPE(mdi->maptype), handle);
- return -1;
- }
+ mcoord.y = y;
+ // Only attempt to download a tile from supported areas
+ if ( is_in_area ( MAPS_LAYER_NTH_TYPE(mdi->maptype), mcoord ) )
+ {
+ gboolean remove_mem_cache = FALSE;
+ gboolean need_download = FALSE;
- if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) {
- need_download = TRUE;
- remove_mem_cache = TRUE;
+ get_filename ( mdi->cache_dir, mdi->cache_layout,
+ vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
+ vik_map_source_get_name(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
+ mdi->mapcoord.scale, mdi->mapcoord.z, x, y, mdi->filename_buf, mdi->maxlen,
+ vik_map_source_get_file_extension(MAPS_LAYER_NTH_TYPE(mdi->maptype)) );
+
+ donemaps++;
+ int res = a_background_thread_progress ( threaddata, ((gdouble)donemaps) / mdi->mapstoget ); /* this also calls testcancel */
+ if (res != 0) {
+ vik_map_source_download_handle_cleanup(MAPS_LAYER_NTH_TYPE(mdi->maptype), handle);
+ return -1;
+ }
- } else { /* in case map file already exists */
- switch (mdi->redownload) {
- case REDOWNLOAD_NONE:
- continue;
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) {
+ need_download = TRUE;
+ remove_mem_cache = TRUE;
- case REDOWNLOAD_BAD:
- {
- /* see if this one is bad or what */
- GError *gx = NULL;
- GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx );
- if (gx || (!pixbuf)) {
- g_remove ( mdi->filename_buf );
- need_download = TRUE;
- remove_mem_cache = TRUE;
- g_error_free ( gx );
+ } else { /* in case map file already exists */
+ switch (mdi->redownload) {
+ case REDOWNLOAD_NONE:
+ continue;
- } else {
- g_object_unref ( pixbuf );
+ case REDOWNLOAD_BAD:
+ {
+ /* see if this one is bad or what */
+ GError *gx = NULL;
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx );
+ if (gx || (!pixbuf)) {
+ g_remove ( mdi->filename_buf );
+ need_download = TRUE;
+ remove_mem_cache = TRUE;
+ g_error_free ( gx );
+
+ } else {
+ g_object_unref ( pixbuf );
+ }
+ break;
}
- break;
- }
- case REDOWNLOAD_NEW:
- need_download = TRUE;
- remove_mem_cache = TRUE;
- break;
+ case REDOWNLOAD_NEW:
+ need_download = TRUE;
+ remove_mem_cache = TRUE;
+ break;
- case REDOWNLOAD_ALL:
- /* FIXME: need a better way than to erase file in case of server/network problem */
- g_remove ( mdi->filename_buf );
- need_download = TRUE;
- remove_mem_cache = TRUE;
- break;
+ case REDOWNLOAD_ALL:
+ /* FIXME: need a better way than to erase file in case of server/network problem */
+ g_remove ( mdi->filename_buf );
+ need_download = TRUE;
+ remove_mem_cache = TRUE;
+ break;
- case DOWNLOAD_OR_REFRESH:
- remove_mem_cache = TRUE;
- break;
+ case DOWNLOAD_OR_REFRESH:
+ remove_mem_cache = TRUE;
+ break;
- default:
- g_warning ( "redownload state %d unknown\n", mdi->redownload);
+ default:
+ g_warning ( "redownload state %d unknown\n", mdi->redownload);
+ }
}
- }
-
- mdi->mapcoord.x = x; mdi->mapcoord.y = y;
- if (need_download) {
- DownloadResult_t dr = vik_map_source_download( MAPS_LAYER_NTH_TYPE(mdi->maptype), &(mdi->mapcoord), mdi->filename_buf, handle);
- switch ( dr ) {
- case DOWNLOAD_HTTP_ERROR:
- case DOWNLOAD_CONTENT_ERROR: {
- // TODO: ?? count up the number of download errors somehow...
- gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Failed to download tile") );
- vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO );
- g_free (msg);
- break;
- }
- case DOWNLOAD_FILE_WRITE_ERROR: {
- gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Unable to save tile") );
- vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO );
- g_free (msg);
- break;
+ mdi->mapcoord.x = x; mdi->mapcoord.y = y;
+
+ if (need_download) {
+ DownloadResult_t dr = vik_map_source_download( MAPS_LAYER_NTH_TYPE(mdi->maptype), &(mdi->mapcoord), mdi->filename_buf, handle);
+ switch ( dr ) {
+ case DOWNLOAD_HTTP_ERROR:
+ case DOWNLOAD_CONTENT_ERROR: {
+ // TODO: ?? count up the number of download errors somehow...
+ gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Failed to download tile") );
+ vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO );
+ g_free (msg);
+ break;
+ }
+ case DOWNLOAD_FILE_WRITE_ERROR: {
+ gchar* msg = g_strdup_printf ( "%s: %s", vik_maps_layer_get_map_label (mdi->vml), _("Unable to save tile") );
+ vik_window_statusbar_update ( (VikWindow*)VIK_GTK_WINDOW_FROM_LAYER(mdi->vml), msg, VIK_STATUSBAR_INFO );
+ g_free (msg);
+ break;
+ }
+ case DOWNLOAD_SUCCESS:
+ case DOWNLOAD_NOT_REQUIRED:
+ default:
+ break;
}
- case DOWNLOAD_SUCCESS:
- case DOWNLOAD_NOT_REQUIRED:
- default:
- break;
}
- }
- g_mutex_lock(mdi->mutex);
- if (remove_mem_cache)
- a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale );
- if (mdi->refresh_display && mdi->map_layer_alive) {
- /* TODO: check if it's on visible area */
- vik_layer_emit_update ( VIK_LAYER(mdi->vml) ); // NB update display from background
+ g_mutex_lock(mdi->mutex);
+ if (remove_mem_cache)
+ a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)), mdi->mapcoord.scale );
+ if (mdi->refresh_display && mdi->map_layer_alive) {
+ /* TODO: check if it's on visible area */
+ vik_layer_emit_update ( VIK_LAYER(mdi->vml) ); // NB update display from background
+ }
+ g_mutex_unlock(mdi->mutex);
+ mdi->mapcoord.x = mdi->mapcoord.y = 0; /* we're temporarily between downloads */
}
- g_mutex_unlock(mdi->mutex);
- mdi->mapcoord.x = mdi->mapcoord.y = 0; /* we're temporarily between downloads */
-
}
}
vik_map_source_download_handle_cleanup(MAPS_LAYER_NTH_TYPE(mdi->maptype), handle);
mdi->mapstoget = 0;
+ MapCoord mcoord = mdi->mapcoord;
+
if ( mdi->redownload ) {
mdi->mapstoget = (mdi->xf - mdi->x0 + 1) * (mdi->yf - mdi->y0 + 1);
} else {
/* calculate how many we need */
for ( a = mdi->x0; a <= mdi->xf; a++ )
{
+ mcoord.x = a;
for ( b = mdi->y0; b <= mdi->yf; b++ )
{
- get_filename ( mdi->cache_dir, mdi->cache_layout,
- vik_map_source_get_uniq_id(map),
- vik_map_source_get_name(map),
- ulm.scale, ulm.z, a, b, mdi->filename_buf, mdi->maxlen,
- vik_map_source_get_file_extension(map) );
- if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
- mdi->mapstoget++;
+ mcoord.y = b;
+ // Only count tiles from supported areas
+ if ( is_in_area (map, mcoord) )
+ {
+ get_filename ( mdi->cache_dir, mdi->cache_layout,
+ vik_map_source_get_uniq_id(map),
+ vik_map_source_get_name(map),
+ ulm.scale, ulm.z, a, b, mdi->filename_buf, mdi->maxlen,
+ vik_map_source_get_file_extension(map) );
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
+ mdi->mapstoget++;
+ }
}
}
}
mdi->mapstoget = 0;
+ MapCoord mcoord = mdi->mapcoord;
+
for (i = mdi->x0; i <= mdi->xf; i++) {
+ mcoord.x = i;
for (j = mdi->y0; j <= mdi->yf; j++) {
- get_filename ( mdi->cache_dir, mdi->cache_layout,
- vik_map_source_get_uniq_id(map),
- vik_map_source_get_name(map),
- ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen,
- vik_map_source_get_file_extension(map) );
- if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
- mdi->mapstoget++;
+ mcoord.y = j;
+ // Only count tiles from supported areas
+ if ( is_in_area (map, mcoord) ) {
+ get_filename ( mdi->cache_dir, mdi->cache_layout,
+ vik_map_source_get_uniq_id(map),
+ vik_map_source_get_name(map),
+ ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen,
+ vik_map_source_get_file_extension(map) );
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
+ mdi->mapstoget++;
+ }
}
}
download_onscreen_maps( values, REDOWNLOAD_ALL);
}
-static void maps_layers_about ( gpointer vml_vvp[2] )
+static void maps_layer_about ( gpointer vml_vvp[2] )
{
VikMapsLayer *vml = vml_vvp[0];
VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
}
else {
/* calculate how many we need */
+ MapCoord mcoord = mdi->mapcoord;
for (i = mdi->x0; i <= mdi->xf; i++) {
+ mcoord.x = i;
for (j = mdi->y0; j <= mdi->yf; j++) {
- get_filename ( mdi->cache_dir, mdi->cache_layout,
- vik_map_source_get_uniq_id(map),
- vik_map_source_get_name(map),
- ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen,
- vik_map_source_get_file_extension(map) );
- if ( mdi->redownload == REDOWNLOAD_NEW ) {
- // Assume the worst - always a new file
- // Absolute value would requires server lookup - but that is too slow
- mdi->mapstoget++;
- }
- else {
- if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) {
- // Missing
+ mcoord.y = j;
+ // Only count tiles from supported areas
+ if ( is_in_area ( map, mcoord ) ) {
+ get_filename ( mdi->cache_dir, mdi->cache_layout,
+ vik_map_source_get_uniq_id(map),
+ vik_map_source_get_name(map),
+ ulm.scale, ulm.z, i, j, mdi->filename_buf, mdi->maxlen,
+ vik_map_source_get_file_extension(map) );
+ if ( mdi->redownload == REDOWNLOAD_NEW ) {
+ // Assume the worst - always a new file
+ // Absolute value would require a server lookup - but that is too slow
mdi->mapstoget++;
}
else {
- if ( mdi->redownload == REDOWNLOAD_BAD ) {
- /* see if this one is bad or what */
- GError *gx = NULL;
- GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx );
- if (gx || (!pixbuf)) {
- mdi->mapstoget++;
+ if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE ) {
+ // Missing
+ mdi->mapstoget++;
+ }
+ else {
+ if ( mdi->redownload == REDOWNLOAD_BAD ) {
+ /* see if this one is bad or what */
+ GError *gx = NULL;
+ GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file ( mdi->filename_buf, &gx );
+ if (gx || (!pixbuf)) {
+ mdi->mapstoget++;
+ }
+ break;
+ // Other download cases already considered or just ignored
}
- break;
- // Other download cases already considered or just ignored
}
}
}
gtk_widget_show ( item );
item = gtk_image_menu_item_new_from_stock ( GTK_STOCK_ABOUT, NULL );
- g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layers_about), values );
+ g_signal_connect_swapped ( G_OBJECT(item), "activate", G_CALLBACK(maps_layer_about), values );
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show ( item );
}