[FOSS-GPS] Whats up with FoxtrotGPS?

John Stowers john.stowers.lists at gmail.com
Sat Dec 25 21:01:48 EST 2010


On Sat, 2010-12-25 at 09:30 -0500, Joshua Judson Rosen wrote:
> John Stowers <john.stowers.lists at gmail.com> writes:
> >
> > On Thu, 2010-11-04 at 12:48 -0400, Joshua Judson Rosen wrote:
> > >
> > > Did you have any thoughts on adding a `zoom offset' control
> > > to osm-gps-map?
> > 
> > Sorry, I don't know what you mean by this, would you care to explain?
> 
> Something like this:

Thanks, applied. I remember talking about this with you previously.

Is there anything else you need from osm-gps-map, I am looking to do a
release this week.

John

> 
> Python File (no console) attachment (tile-zoom-offset.mbox), "Git
> patch-series implementing configurable lower bounds on
> tile-upsampling"
> From 2dcfc5e04117152a0bb97523aa32278c7e8fe537 Mon Sep 17 00:00:00 2001
> From: Joshua Judson Rosen <rozzin at geekspace.com>
> Date: Fri, 24 Dec 2010 17:23:29 -0500
> Subject: [PATCH] Use osm_gps_map_blit_tile() consistently
>  (don't duplicate its code in osm_gps_map_load_tile()).
> 
> ---
>  src/osm-gps-map-widget.c |    8 +-------
>  1 files changed, 1 insertions(+), 7 deletions(-)
> 
> diff --git a/src/osm-gps-map-widget.c b/src/osm-gps-map-widget.c
> index 06c0dd7..7ced161 100644
> --- a/src/osm-gps-map-widget.c
> +++ b/src/osm-gps-map-widget.c
> @@ -1062,13 +1062,7 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>           * levels */
>          pixbuf = osm_gps_map_render_missing_tile (map, zoom, x, y);
>          if (pixbuf) {
> -            gdk_draw_pixbuf (priv->pixmap,
> -                             priv->gc_map,
> -                             pixbuf,
> -                             0,0,
> -                             offset_x,offset_y,
> -                             TILESIZE,TILESIZE,
> -                             GDK_RGB_DITHER_NONE, 0, 0);
> +            osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y);
>              g_object_unref (pixbuf);
>          } else {
>              /* prevent some artifacts when drawing not yet loaded areas. */
> -- 
> 1.5.6.5
> 
> 
> From d17d86ae1aae53f373e240d9b7926f26af79af58 Mon Sep 17 00:00:00 2001
> From: Joshua Judson Rosen <rozzin at geekspace.com>
> Date: Fri, 24 Dec 2010 17:25:14 -0500
> Subject: [PATCH] Split the upscaling logic from osm_gps_map_render_missing_tile_upscaled()
>  into osm_gps_map_render_tile_upscaled().
> 
> ---
>  src/osm-gps-map-widget.c |   25 +++++++++++++++++++++----
>  1 files changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/src/osm-gps-map-widget.c b/src/osm-gps-map-widget.c
> index 7ced161..79da9ed 100644
> --- a/src/osm-gps-map-widget.c
> +++ b/src/osm-gps-map-widget.c
> @@ -319,6 +319,7 @@ static void     osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, i
>  static void     osm_gps_map_fill_tiles_pixel (OsmGpsMap *map);
>  static gboolean osm_gps_map_map_redraw (OsmGpsMap *map);
>  static void     osm_gps_map_map_redraw_idle (OsmGpsMap *map);
> +static GdkPixbuf* osm_gps_map_render_tile_upscaled (OsmGpsMap *map, GdkPixbuf *tile, int tile_zoom, int zoom, int x, int y);
>  
>  static void
>  cached_tile_free (OsmCachedTile *tile)
> @@ -993,24 +994,40 @@ static GdkPixbuf *
>  osm_gps_map_render_missing_tile_upscaled (OsmGpsMap *map, int zoom,
>                                            int x, int y)
>  {
> -    GdkPixbuf *pixbuf, *big, *area;
> -    int zoom_big, zoom_diff, area_size, area_x, area_y;
> -    int modulo;
> +    GdkPixbuf *pixbuf, *big;
> +    int zoom_big;
>  
>      big = osm_gps_map_find_bigger_tile (map, zoom, x, y, &zoom_big);
>      if (!big) return NULL;
>  
>      g_debug ("Found bigger tile (zoom = %d, wanted = %d)", zoom_big, zoom);
>  
> +    pixbuf = osm_gps_map_render_tile_upscaled (map, big, zoom_big,
> +                                               zoom, x, y);
> +    g_object_unref (big);
> +
> +    return pixbuf;
> +}
> +static GdkPixbuf*
> +osm_gps_map_render_tile_upscaled (OsmGpsMap *map, GdkPixbuf *big, int zoom_big,
> +                                  int zoom, int x, int y)
> +{
> +    GdkPixbuf *pixbuf, *area;
> +    int area_size, area_x, area_y;
> +    int modulo;
> +    int zoom_diff;
> +
>      /* get a Pixbuf for the area to magnify */
>      zoom_diff = zoom - zoom_big;
> +
> +    g_debug ("Upscaling by %d levels into tile %d,%d", zoom_diff, x, y);
> +
>      area_size = TILESIZE >> zoom_diff;
>      modulo = 1 << zoom_diff;
>      area_x = (x % modulo) * area_size;
>      area_y = (y % modulo) * area_size;
>      area = gdk_pixbuf_new_subpixbuf (big, area_x, area_y,
>                                       area_size, area_size);
> -    g_object_unref (big);
>      pixbuf = gdk_pixbuf_scale_simple (area, TILESIZE, TILESIZE,
>                                        GDK_INTERP_NEAREST);
>      g_object_unref (area);
> -- 
> 1.5.6.5
> 
> 
> From 0e30312daada1fa6924bed9ca1ac2e8cefef37e2 Mon Sep 17 00:00:00 2001
> From: Joshua Judson Rosen <rozzin at geekspace.com>
> Date: Fri, 24 Dec 2010 17:28:47 -0500
> Subject: [PATCH] Enable osm_gps_map_blit_tile() to handle tiles from lower zoom-levels, upscaling as necessary.
>  Added tile_zoom, target_x, and target_y arguments to facilitate that.
> 
> ---
>  src/osm-gps-map-widget.c |   42 +++++++++++++++++++++++++++++-------------
>  1 files changed, 29 insertions(+), 13 deletions(-)
> 
> diff --git a/src/osm-gps-map-widget.c b/src/osm-gps-map-widget.c
> index 79da9ed..d7f9591 100644
> --- a/src/osm-gps-map-widget.c
> +++ b/src/osm-gps-map-widget.c
> @@ -308,7 +308,7 @@ G_DEFINE_TYPE (OsmGpsMap, osm_gps_map, GTK_TYPE_DRAWING_AREA);
>   */
>  static gchar    *replace_string(const gchar *src, const gchar *from, const gchar *to);
>  static gchar    *replace_map_uri(OsmGpsMap *map, const gchar *uri, int zoom, int x, int y);
> -static void     osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, int offset_x, int offset_y);
> +static void     osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, int offset_x, int offset_y, int tile_zoom, int target_x, int target_y);
>  #if USE_LIBSOUP22
>  static void     osm_gps_map_tile_download_complete (SoupMessage *msg, gpointer user_data);
>  #else
> @@ -708,20 +708,33 @@ osm_gps_map_draw_gps_point (OsmGpsMap *map, GdkDrawable *drawable)
>  }
>  
>  static void
> -osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, int offset_x, int offset_y)
> +osm_gps_map_blit_tile(OsmGpsMap *map, GdkPixbuf *pixbuf, int offset_x, int offset_y,
> +                      int tile_zoom, int target_x, int target_y)
>  {
>      OsmGpsMapPrivate *priv = map->priv;
> +    int target_zoom = priv->map_zoom;
>  
>      g_debug("Queing redraw @ %d,%d (w:%d h:%d)", offset_x,offset_y, TILESIZE,TILESIZE);
>  
> -    /* draw pixbuf onto pixmap */
> -    gdk_draw_pixbuf (priv->pixmap,
> -                     priv->gc_map,
> -                     pixbuf,
> -                     0,0,
> -                     offset_x,offset_y,
> -                     TILESIZE,TILESIZE,
> -                     GDK_RGB_DITHER_NONE, 0, 0);
> +    if (tile_zoom == target_zoom) {
> +        /* draw pixbuf onto pixmap */
> +        gdk_draw_pixbuf (priv->pixmap,
> +                         priv->gc_map,
> +                         pixbuf,
> +                         0,0,
> +                         offset_x,offset_y,
> +                         TILESIZE,TILESIZE,
> +                         GDK_RGB_DITHER_NONE, 0, 0);
> +    } else {
> +        /* get an upscaled version of the pixbuf, and then draw it */
> +        GdkPixbuf *pixmap_scaled = osm_gps_map_render_tile_upscaled
> +            (map, pixbuf, tile_zoom, target_zoom, target_x, target_y);
> +
> +        osm_gps_map_blit_tile (map, pixmap_scaled, offset_x, offset_y,
> +                               target_zoom, target_x, target_y);
> +
> +        g_object_unref (pixmap_scaled);
> +    }
>  }
>  
>  /* libsoup-2.2 and libsoup-2.4 use different ways to store the body data */
> @@ -1051,7 +1064,8 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>      g_debug("Load tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
>  
>      if (priv->map_source == OSM_GPS_MAP_SOURCE_NULL) {
> -        osm_gps_map_blit_tile(map, priv->null_tile, offset_x,offset_y);
> +        osm_gps_map_blit_tile(map, priv->null_tile, offset_x, offset_y,
> +                              priv->map_zoom, x, y);
>          return;
>      }
>  
> @@ -1068,7 +1082,8 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>  
>      if(pixbuf) {
>          g_debug("Found tile %s", filename);
> -        osm_gps_map_blit_tile(map, pixbuf, offset_x,offset_y);
> +        osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y,
> +                              zoom, x, y);
>          g_object_unref (pixbuf);
>      } else {
>          if (priv->map_auto_download_enabled) {
> @@ -1079,7 +1094,8 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>           * levels */
>          pixbuf = osm_gps_map_render_missing_tile (map, zoom, x, y);
>          if (pixbuf) {
> -            osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y);
> +            osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y,
> +                                   zoom, x, y);
>              g_object_unref (pixbuf);
>          } else {
>              /* prevent some artifacts when drawing not yet loaded areas. */
> -- 
> 1.5.6.5
> 
> 
> From deffe10e177141a9e88f018bf8da74d7296e8c1c Mon Sep 17 00:00:00 2001
> From: Joshua Judson Rosen <rozzin at geekspace.com>
> Date: Fri, 24 Dec 2010 17:34:56 -0500
> Subject: [PATCH] Support a `tile zoom-offset' property on map-objects.
>  This allows OsmGpsMap to be configured to always use upscaled tiles from lower zoom-levels, which is useful, for example, on displays with much higher resolution than expected my a tile-set's rasteriser, for displays viewed from greater distances, or for devices on slower networks.
> 
> ---
>  src/osm-gps-map-widget.c |   57 ++++++++++++++++++++++++++++++++++++++++++---
>  src/osm-gps-map-widget.h |    1 +
>  src/private.h            |    3 ++
>  3 files changed, 57 insertions(+), 4 deletions(-)
> 
> diff --git a/src/osm-gps-map-widget.c b/src/osm-gps-map-widget.c
> index d7f9591..deac8f0 100644
> --- a/src/osm-gps-map-widget.c
> +++ b/src/osm-gps-map-widget.c
> @@ -156,6 +156,9 @@ struct _OsmGpsMapPrivate
>      int map_zoom;
>      int max_zoom;
>      int min_zoom;
> +
> +    int tile_zoom_offset;
> +
>      int map_x;
>      int map_y;
>  
> @@ -283,6 +286,7 @@ enum
>      PROP_TILE_CACHE_DIR,
>      PROP_TILE_CACHE_BASE_DIR,
>      PROP_TILE_CACHE_DIR_IS_FULL_PATH,
> +    PROP_TILE_ZOOM_OFFSET,
>      PROP_ZOOM,
>      PROP_MAX_ZOOM,
>      PROP_MIN_ZOOM,
> @@ -1060,12 +1064,22 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>      OsmGpsMapPrivate *priv = map->priv;
>      gchar *filename;
>      GdkPixbuf *pixbuf;
> +    int zoom_offset = priv->tile_zoom_offset;
> +    int target_x, target_y;
>  
> -    g_debug("Load tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
> +    g_debug("Load virtual tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
> +
> +    if (zoom > MIN_ZOOM) {
> +      zoom -= zoom_offset;
> +      target_x = x; x >>= zoom_offset;
> +      target_y = y; y >>= zoom_offset;
> +    }
> +
> +    g_debug("Load actual tile %d,%d (%d,%d) z:%d", x, y, offset_x, offset_y, zoom);
>  
>      if (priv->map_source == OSM_GPS_MAP_SOURCE_NULL) {
>          osm_gps_map_blit_tile(map, priv->null_tile, offset_x, offset_y,
> -                              priv->map_zoom, x, y);
> +                              priv->map_zoom, target_x, target_y);
>          return;
>      }
>  
> @@ -1083,7 +1097,7 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>      if(pixbuf) {
>          g_debug("Found tile %s", filename);
>          osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y,
> -                              zoom, x, y);
> +                              zoom, target_x, target_y);
>          g_object_unref (pixbuf);
>      } else {
>          if (priv->map_auto_download_enabled) {
> @@ -1095,7 +1109,7 @@ osm_gps_map_load_tile (OsmGpsMap *map, int zoom, int x, int y, int offset_x, int
>          pixbuf = osm_gps_map_render_missing_tile (map, zoom, x, y);
>          if (pixbuf) {
>              osm_gps_map_blit_tile(map, pixbuf, offset_x, offset_y,
> -                                   zoom, x, y);
> +                                   zoom, target_x, target_y);
>              g_object_unref (pixbuf);
>          } else {
>              /* prevent some artifacts when drawing not yet loaded areas. */
> @@ -1800,6 +1814,9 @@ osm_gps_map_set_property (GObject *object, guint prop_id, const GValue *value, G
>              break;
>          case PROP_TILE_CACHE_DIR_IS_FULL_PATH:
>               break;
> +        case PROP_TILE_ZOOM_OFFSET:
> +            priv->tile_zoom_offset = g_value_get_int (value);
> +            break;
>          case PROP_ZOOM:
>              priv->map_zoom = g_value_get_int (value);
>              break;
> @@ -1897,6 +1914,9 @@ osm_gps_map_get_property (GObject *object, guint prop_id, GValue *value, GParamS
>          case PROP_TILE_CACHE_DIR_IS_FULL_PATH:
>              g_value_set_boolean(value, FALSE);
>              break;
> +        case PROP_TILE_ZOOM_OFFSET:
> +            g_value_set_int(value, priv->tile_zoom_offset);
> +            break;
>          case PROP_ZOOM:
>              g_value_set_int(value, priv->map_zoom);
>              break;
> @@ -2485,6 +2505,16 @@ osm_gps_map_class_init (OsmGpsMapClass *klass)
>                                                         G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
>  
>      g_object_class_install_property (object_class,
> +                                     PROP_TILE_ZOOM_OFFSET,
> +                                     g_param_spec_int ("tile-zoom-offset",
> +                                                       "tile zoom-offset",
> +                                                       "Number of zoom-levels to upsample tiles",
> +                                                       MIN_TILE_ZOOM_OFFSET, /* minimum propery value */
> +                                                       MAX_TILE_ZOOM_OFFSET, /* maximum propery value */
> +                                                       0,
> +                                                       G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
> +
> +    g_object_class_install_property (object_class,
>                                       PROP_MAX_ZOOM,
>                                       g_param_spec_int ("max-zoom",
>                                                         "max zoom",
> @@ -2794,6 +2824,25 @@ osm_gps_map_set_center (OsmGpsMap *map, float latitude, float longitude)
>  }
>  
>  /**
> + * osm_gps_map_set_zoom_offset:
> + *
> + **/
> +void
> +osm_gps_map_set_zoom_offset (OsmGpsMap *map, int zoom_offset)
> +{
> +    OsmGpsMapPrivate *priv;
> +
> +    g_return_if_fail (OSM_GPS_MAP (map));
> +    priv = map->priv;
> +
> +    if (zoom_offset != priv->tile_zoom_offset)
> +    {
> +        priv->tile_zoom_offset = zoom_offset;
> +        osm_gps_map_map_redraw_idle (map);
> +    }
> +}
> +
> +/**
>   * osm_gps_map_set_zoom:
>   *
>   **/
> diff --git a/src/osm-gps-map-widget.h b/src/osm-gps-map-widget.h
> index da76529..29be13b 100644
> --- a/src/osm-gps-map-widget.h
> +++ b/src/osm-gps-map-widget.h
> @@ -89,6 +89,7 @@ void            osm_gps_map_get_bbox                    (OsmGpsMap *map, OsmGpsM
>  void            osm_gps_map_set_center_and_zoom         (OsmGpsMap *map, float latitude, float longitude, int zoom);
>  void            osm_gps_map_set_center                  (OsmGpsMap *map, float latitude, float longitude);
>  int             osm_gps_map_set_zoom                    (OsmGpsMap *map, int zoom);
> +void            osm_gps_map_set_zoom_offset             (OsmGpsMap *map, int zoom_offset);
>  int             osm_gps_map_zoom_in                     (OsmGpsMap *map);
>  int             osm_gps_map_zoom_out                    (OsmGpsMap *map);
>  void            osm_gps_map_scroll                      (OsmGpsMap *map, gint dx, gint dy);
> diff --git a/src/private.h b/src/private.h
> index 637338f..33c89f9 100644
> --- a/src/private.h
> +++ b/src/private.h
> @@ -34,6 +34,9 @@
>  #define MAX_ZOOM 20
>  #define MIN_ZOOM 0
>  
> +#define MAX_TILE_ZOOM_OFFSET 10
> +#define MIN_TILE_ZOOM_OFFSET 0
> +
>  #define OSM_REPO_URI        "http://tile.openstreetmap.org/#Z/#X/#Y.png"
>  #define OSM_MIN_ZOOM        1
>  #define OSM_MAX_ZOOM        18




More information about the FOSS-GPS mailing list