]> git.street.me.uk Git - andy/viking.git/commitdiff
Refactoring: use a GObject model to implement MapSource hierarchy tree
authorGuilhem Bonnefille <guilhem.bonnefille@gmail.com>
Sun, 27 Sep 2009 20:20:41 +0000 (22:20 +0200)
committerGuilhem Bonnefille <guilhem.bonnefille@gmail.com>
Sun, 27 Sep 2009 20:20:41 +0000 (22:20 +0200)
Merge branch 'gobjectify-map-type'

1  2 
configure.ac
src/vikmapslayer.c

diff --combined configure.ac
index b19e882e44ee3422c2f3ae38c335af124f42720e,e6b7eb28e75183239fcfe99b54aa08f0dc339fef..71d3821182099585cdce913f80081bc0579c62bf
@@@ -11,6 -11,7 +11,7 @@@ AC_CONFIG_HEADERS([src/config.h]
  AC_PROG_CC
  AC_PROG_MAKE_SET
  AC_PROG_RANLIB
+ AC_PATH_PROG(GLIB_MKENUMS, glib-mkenums)
  
  # I18N
  GETTEXT_PACKAGE=viking
@@@ -62,7 -63,7 +63,7 @@@ dnl  -----------------
  PKG_CHECK_MODULES(PACKAGE, [
          glib-2.0          >= 2.12
          gthread-2.0       >= 2.2
 -        gtk+-2.0          >= 2.8
 +        gtk+-2.0          >= 2.12
  ])
  
  AC_SUBST(PACKAGE_CFLAGS)
@@@ -288,6 -289,8 +289,8 @@@ echo "Google Maps                      
  echo "Terraserver Maps                 : $ac_cv_enable_terraserver"
  #echo "Expedia Maps                     : $ac_cv_enable_expedia"
  echo "Open Street Map                  : $ac_cv_enable_openstreetmap"
+ echo "OpenAerial                       : $ac_cv_enable_openaerial"
+ echo "BlueMarble                       : $ac_cv_enable_bluemarble"
  echo "Geonames                         : $ac_cv_enable_geonames"
  #echo "Geocaches Acquire                : $ac_cv_enable_geocaches"
  echo "USGS 24k DEM                     : $ac_cv_enable_dem24k"
diff --combined src/vikmapslayer.c
index 045e315a6d3e8ba2b24b492c9c9d42a739f787e5,597c823c548a482d63ffd7340c708b9f9be39026..5e4bbc2ef9f0b91e31ec0ca26bee935237f26af6
@@@ -206,11 -206,13 +206,13 @@@ enum { REDOWNLOAD_NONE = 0, REDOWNLOAD_
  /******** MAPS LAYER TYPES **************/
  /****************************************/
  
- void maps_layer_register_type ( const char *label, guint id, VikMapsLayer_MapType *map_type )
+ void maps_layer_register_map_source ( VikMapSource *map )
  {
+   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);
-   g_assert(map_type != NULL);
-   g_assert(id == map_type->uniq_id);
  
    /* Add the label */
    params_maptypes = g_list_append(params_maptypes, g_strdup(label));
    params_maptypes_ids = g_list_append(params_maptypes_ids, GUINT_TO_POINTER (id));
  
    /* We have to clone */
-   VikMapsLayer_MapType *clone = g_memdup(map_type, sizeof(VikMapsLayer_MapType));
+   VikMapSource *clone = VIK_MAP_SOURCE(g_object_ref(map));
    /* Register the clone in the list */
    __map_types = g_list_append(__map_types, clone);
  
  
  #define MAPS_LAYER_NTH_LABEL(n) ((gchar*)g_list_nth_data(params_maptypes, (n)))
  #define MAPS_LAYER_NTH_ID(n) ((guint)g_list_nth_data(params_maptypes_ids, (n)))
- #define MAPS_LAYER_NTH_TYPE(n) ((VikMapsLayer_MapType*)g_list_nth_data(__map_types, (n)))
+ #define MAPS_LAYER_NTH_TYPE(n) (VIK_MAP_SOURCE(g_list_nth_data(__map_types, (n))))
  
  gint vik_maps_layer_get_map_type(VikMapsLayer *vml)
  {
@@@ -366,14 -368,14 +368,14 @@@ GType vik_maps_layer_get_type (
  static guint map_index_to_uniq_id (guint8 index)
  {
    g_assert ( index < NUM_MAP_TYPES );
-   return MAPS_LAYER_NTH_TYPE(index)->uniq_id;
+   return vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(index));
  }
  
  static guint map_uniq_id_to_index ( guint uniq_id )
  {
    gint i;
    for ( i = 0; i < NUM_MAP_TYPES; i++ )
-     if ( MAPS_LAYER_NTH_TYPE(i)->uniq_id == uniq_id )
+     if ( vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(i)) == uniq_id )
        return i;
    return NUM_MAP_TYPES; /* no such thing */
  }
@@@ -458,12 -460,12 +460,12 @@@ static void maps_layer_post_read (VikLa
       * So, we can check if we have to inform the user about inconsistency */
      VikViewportDrawMode vp_drawmode;
      VikMapsLayer *vml = VIK_MAPS_LAYER(vl);
-     VikMapsLayer_MapType *map_type = NULL;
+     VikMapSource *map = NULL;
   
      vp_drawmode = vik_viewport_get_drawmode ( VIK_VIEWPORT(vp) );
-     map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
-     if (map_type->drawmode != vp_drawmode) {
-       const gchar *drawmode_name = vik_viewport_get_drawmode_name (VIK_VIEWPORT(vp), map_type->drawmode);
+     map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+     if (vik_map_source_get_drawmode(map) != vp_drawmode) {
+       const gchar *drawmode_name = vik_viewport_get_drawmode_name (VIK_VIEWPORT(vp), vik_map_source_get_drawmode(map));
        gchar *msg = g_strdup_printf(_("New map cannot be displayed in the current drawmode.\nSelect \"%s\" from View menu to view it."), drawmode_name);
        a_dialog_warning_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), msg );
        g_free(msg);
@@@ -516,7 -518,7 +518,7 @@@ static GdkPixbuf *pixbuf_shrink ( GdkPi
  {
    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;
  }
@@@ -554,7 -556,7 +556,7 @@@ static GdkPixbuf *get_pixbuf( VikMapsLa
              pixbuf = pixbuf_shrink ( pixbuf, xshrinkfactor, yshrinkfactor );
  
            a_mapcache_add ( pixbuf, mapcoord->x, mapcoord->y, 
-               mapcoord->z, MAPS_LAYER_NTH_TYPE(vml->maptype)->uniq_id, 
+               mapcoord->z, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(vml->maptype)),
                mapcoord->scale, vml->alpha, xshrinkfactor, yshrinkfactor );
          }
        }
@@@ -613,15 -615,15 +615,15 @@@ static void maps_layer_draw_section ( V
    }
  
    /* coord -> ID */
-   VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
-   if ( map_type->coord_to_mapcoord ( ul, xzoom, yzoom, &ulm ) &&
-        map_type->coord_to_mapcoord ( br, xzoom, yzoom, &brm ) ) {
+   VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+   if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm ) &&
+        vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) ) {
  
      /* loop & draw */
      gint x, y;
      gint xmin = MIN(ulm.x, brm.x), xmax = MAX(ulm.x, brm.x);
      gint ymin = MIN(ulm.y, brm.y), ymax = MAX(ulm.y, brm.y);
-     gint mode = map_type->uniq_id;
+     gint mode = vik_map_source_get_uniq_id(map);
  
      VikCoord coord;
      gint xx, yy, width, height;
        start_download_thread ( vml, vvp, ul, br, REDOWNLOAD_NONE );
      }
  
-     if ( map_type->tilesize_x == 0 && !existence_only ) {
+     if ( vik_map_source_get_tilesize_x(map) == 0 && !existence_only ) {
        for ( x = xmin; x <= xmax; x++ ) {
          for ( y = ymin; y <= ymax; y++ ) {
            ulm.x = x;
              width = gdk_pixbuf_get_width ( pixbuf );
              height = gdk_pixbuf_get_height ( pixbuf );
  
-             map_type->mapcoord_to_center_coord ( &ulm, &coord );
+             vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord );
              vik_viewport_coord_to_screen ( vvp, &coord, &xx, &yy );
              xx -= (width/2);
              yy -= (height/2);
          }
        }
      } else { /* tilesize is known, don't have to keep converting coords */
-       gdouble tilesize_x = map_type->tilesize_x * xshrinkfactor;
-       gdouble tilesize_y = map_type->tilesize_y * yshrinkfactor;
+       gdouble tilesize_x = vik_map_source_get_tilesize_x(map) * xshrinkfactor;
+       gdouble tilesize_y = vik_map_source_get_tilesize_y(map) * yshrinkfactor;
        /* ceiled so tiles will be maximum size in the case of funky shrinkfactor */
        gint tilesize_x_ceil = ceil ( tilesize_x );
        gint tilesize_y_ceil = ceil ( tilesize_y );
        xend = (xinc == 1) ? (xmax+1) : (xmin-1);
        yend = (yinc == 1) ? (ymax+1) : (ymin-1);
  
-       map_type->mapcoord_to_center_coord ( &ulm, &coord );
+       vik_map_source_mapcoord_to_center_coord ( map, &ulm, &coord );
        vik_viewport_coord_to_screen ( vvp, &coord, &xx_tmp, &yy_tmp );
        xx = xx_tmp; yy = yy_tmp;
        /* above trick so xx,yy doubles. this is so shrinkfactors aren't rounded off
              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;
  
  static void maps_layer_draw ( VikMapsLayer *vml, VikViewport *vvp )
  {
-   if ( MAPS_LAYER_NTH_TYPE(vml->maptype)->drawmode == vik_viewport_get_drawmode ( vvp ) )
+   if ( vik_map_source_get_drawmode(MAPS_LAYER_NTH_TYPE(vml->maptype)) == vik_viewport_get_drawmode ( vvp ) )
    {
      VikCoord ul, br;
  
@@@ -803,7 -787,7 +805,7 @@@ static int map_download_thread ( MapDow
        gboolean remove_mem_cache = FALSE;
        gboolean need_download = FALSE;
        g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
-                      mdi->cache_dir, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id,
+                      mdi->cache_dir, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
                       mdi->mapcoord.scale, mdi->mapcoord.z, x, y );
  
        donemaps++;
        mdi->mapcoord.x = x; mdi->mapcoord.y = y;
  
        if (need_download) {
-         if ( MAPS_LAYER_NTH_TYPE(mdi->maptype)->download ( &(mdi->mapcoord), mdi->filename_buf ))
+         if ( vik_map_source_download( MAPS_LAYER_NTH_TYPE(mdi->maptype), &(mdi->mapcoord), mdi->filename_buf ))
            continue;
        }
  
        gdk_threads_enter();
        g_mutex_lock(mdi->mutex);
        if (remove_mem_cache)
-           a_mapcache_remove_all_shrinkfactors ( x, y, mdi->mapcoord.z, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id, mdi->mapcoord.scale );
+           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) );
@@@ -871,7 -855,7 +873,7 @@@ static void mdi_cancel_cleanup ( MapDow
    if ( mdi->mapcoord.x || mdi->mapcoord.y )
    {
      g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
-                      mdi->cache_dir, MAPS_LAYER_NTH_TYPE(mdi->maptype)->uniq_id,
+                      mdi->cache_dir, vik_map_source_get_uniq_id(MAPS_LAYER_NTH_TYPE(mdi->maptype)),
                       mdi->mapcoord.scale, mdi->mapcoord.z, mdi->mapcoord.x, mdi->mapcoord.y );
      if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == TRUE)
      {
@@@ -885,9 -869,9 +887,9 @@@ static void start_download_thread ( Vik
    gdouble xzoom = vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp );
    gdouble yzoom = vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp );
    MapCoord ulm, brm;
-   VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
-   if ( map_type->coord_to_mapcoord ( ul, xzoom, yzoom, &ulm ) 
-     && map_type->coord_to_mapcoord ( br, xzoom, yzoom, &brm ) )
+   VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+   if ( vik_map_source_coord_to_mapcoord ( map, ul, xzoom, yzoom, &ulm ) 
+     && vik_map_source_coord_to_mapcoord ( map, br, xzoom, yzoom, &brm ) )
    {
      MapDownloadInfo *mdi = g_malloc ( sizeof(MapDownloadInfo) );
      gint a, b;
          for ( b = mdi->y0; b <= mdi->yf; b++ )
          {
            g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
-                        vml->cache_dir, map_type->uniq_id, ulm.scale,
+                        vml->cache_dir, vik_map_source_get_uniq_id(map), ulm.scale,
                         ulm.z, a, b );
            if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
              mdi->mapstoget++;
  void maps_layer_download_section_without_redraw( VikMapsLayer *vml, VikViewport *vvp, VikCoord *ul, VikCoord *br, gdouble zoom)
  {
    MapCoord ulm, brm;
-   VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
+   VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
  
-   if (!map_type->coord_to_mapcoord(ul, zoom, zoom, &ulm) 
-     || !map_type->coord_to_mapcoord(br, zoom, zoom, &brm)) {
+   if (!vik_map_source_coord_to_mapcoord(map, ul, zoom, zoom, &ulm) 
+     || !vik_map_source_coord_to_mapcoord(map, br, zoom, zoom, &brm)) {
      g_warning("%s() coord_to_mapcoord() failed", __PRETTY_FUNCTION__);
      return;
    }
    for (i = mdi->x0; i <= mdi->xf; i++) {
      for (j = mdi->y0; j <= mdi->yf; j++) {
        g_snprintf ( mdi->filename_buf, mdi->maxlen, DIRSTRUCTURE,
-                    vml->cache_dir, map_type->uniq_id, ulm.scale,
+                    vml->cache_dir, vik_map_source_get_uniq_id(map), ulm.scale,
                     ulm.z, i, j );
        if ( g_file_test ( mdi->filename_buf, G_FILE_TEST_EXISTS ) == FALSE )
              mdi->mapstoget++;
@@@ -1102,9 -1086,9 +1104,9 @@@ static gboolean maps_layer_download_cli
    MapCoord tmp;
    if (!vml || vml->vl.type != VIK_LAYER_MAPS)
      return FALSE;
-   VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
-   if ( map_type->drawmode == vik_viewport_get_drawmode ( vvp ) &&
-        map_type->coord_to_mapcoord ( vik_viewport_get_center ( vvp ),
+   VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+   if ( vik_map_source_get_drawmode(map) == vik_viewport_get_drawmode ( vvp ) &&
+        vik_map_source_coord_to_mapcoord ( map, vik_viewport_get_center ( vvp ),
             vml->xmapzoom ? vml->xmapzoom : vik_viewport_get_xmpp ( vvp ),
             vml->ymapzoom ? vml->ymapzoom : vik_viewport_get_ympp ( vvp ),
             &tmp ) ) {
@@@ -1153,13 -1137,13 +1155,13 @@@ static void download_onscreen_maps ( gp
    vik_viewport_screen_to_coord ( vvp, 0, 0, &ul );
    vik_viewport_screen_to_coord ( vvp, vik_viewport_get_width(vvp), vik_viewport_get_height(vvp), &br );
  
-   VikMapsLayer_MapType *map_type = MAPS_LAYER_NTH_TYPE(vml->maptype);
-   if ( map_type->drawmode == vp_drawmode &&
-        map_type->coord_to_mapcoord ( &ul, xzoom, yzoom, &ulm ) &&
-        map_type->coord_to_mapcoord ( &br, xzoom, yzoom, &brm ) )
+   VikMapSource *map = MAPS_LAYER_NTH_TYPE(vml->maptype);
+   if ( vik_map_source_get_drawmode(map) == vp_drawmode &&
+        vik_map_source_coord_to_mapcoord ( map, &ul, xzoom, yzoom, &ulm ) &&
+        vik_map_source_coord_to_mapcoord ( map, &br, xzoom, yzoom, &brm ) )
      start_download_thread ( vml, vvp, &ul, &br, redownload );
-   else if (map_type->drawmode != vp_drawmode) {
-     const gchar *drawmode_name = vik_viewport_get_drawmode_name (vvp, map_type->drawmode);
+   else if (vik_map_source_get_drawmode(map) != vp_drawmode) {
+     const gchar *drawmode_name = vik_viewport_get_drawmode_name (vvp, vik_map_source_get_drawmode(map));
      gchar *err = g_strdup_printf(_("Wrong drawmode for this map.\nSelect \"%s\" from View menu and try again."), _(drawmode_name));
      a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vml), err );
      g_free(err);