]> git.street.me.uk Git - andy/viking.git/commitdiff
Add map's logo support
authorGuilhem Bonnefille <guilhem.bonnefille@gmail.com>
Sun, 27 Mar 2011 20:26:50 +0000 (22:26 +0200)
committerGuilhem Bonnefille <guilhem.bonnefille@gmail.com>
Sun, 27 Mar 2011 20:26:50 +0000 (22:26 +0200)
Add support for map's logo, displayed in viewport.
Each map layer can provides a logo, displayed in the viewport.

Signed-off-by: Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
src/vikmapslayer.c
src/vikmapsource.c
src/vikmapsource.h
src/vikmapsourcedefault.c
src/vikviewport.c
src/vikviewport.h
src/vikwindow.c

index 27822e6e106fac7cbb71938bebdbeb74e11d0399..e43aa6efe1c138816d7f761f9e85b39e815d6af3 100644 (file)
@@ -859,6 +859,10 @@ static void maps_layer_draw ( VikMapsLayer *vml, VikViewport *vvp )
     const gchar *copyright = vik_map_source_get_copyright ( MAPS_LAYER_NTH_TYPE(vml->maptype) );
     vik_viewport_add_copyright ( vvp, copyright );
 
+    /* Logo */
+    const GdkPixbuf *logo = vik_map_source_get_logo ( MAPS_LAYER_NTH_TYPE(vml->maptype) );
+    vik_viewport_add_logo ( vvp, logo );
+
     /* get corner coords */
     if ( vik_viewport_get_coord_mode ( vvp ) == VIK_COORD_UTM && ! vik_viewport_is_one_zone ( vvp ) ) {
       /* UTM multi-zone stuff by Kit Transue */
index 98f4d50a10afeb7bd41689dea972ab21d479c3e8..d3a9500774c2d50238daaf9b9ddaf8b828b7ffae 100644 (file)
@@ -64,6 +64,7 @@ vik_map_source_class_init (VikMapSourceClass *klass)
        klass->get_copyright = NULL;
        klass->get_license = NULL;
        klass->get_license_url = NULL;
+       klass->get_logo = NULL;
        klass->get_uniq_id = NULL;
        klass->get_label = NULL;
        klass->get_tilesize_x = NULL;
@@ -125,6 +126,19 @@ vik_map_source_get_license_url (VikMapSource *self)
        return (*klass->get_license_url)(self);
 }
 
+const GdkPixbuf *
+vik_map_source_get_logo (VikMapSource *self)
+{
+       VikMapSourceClass *klass;
+       g_return_val_if_fail (self != NULL, NULL);
+       g_return_val_if_fail (VIK_IS_MAP_SOURCE (self), NULL);
+       klass = VIK_MAP_SOURCE_GET_CLASS(self);
+
+       g_return_val_if_fail (klass->get_logo != NULL, NULL);
+
+       return (*klass->get_logo)(self);
+}
+
 guint8
 vik_map_source_get_uniq_id (VikMapSource *self)
 {
index c0b80f3c65bd6f2143332563b1ec57bc1f804f58..2400fec9533d68cc32fc0a4cf16aa94e9b07c0f9 100644 (file)
@@ -46,6 +46,7 @@ struct _VikMapSourceClass
        const gchar *(* get_copyright) (VikMapSource * self);
        const gchar *(* get_license) (VikMapSource * self);
        const gchar *(* get_license_url) (VikMapSource * self);
+       const GdkPixbuf *(* get_logo) (VikMapSource * self);
 
        guint8 (* get_uniq_id) (VikMapSource * self);
        const gchar * (* get_label) (VikMapSource * self);
@@ -70,6 +71,7 @@ GType vik_map_source_get_type (void) G_GNUC_CONST;
 const gchar *vik_map_source_get_copyright (VikMapSource * self);
 const gchar *vik_map_source_get_license (VikMapSource * self);
 const gchar *vik_map_source_get_license_url (VikMapSource * self);
+const GdkPixbuf *vik_map_source_get_logo (VikMapSource * self);
 
 guint8 vik_map_source_get_uniq_id (VikMapSource * self);
 const gchar *vik_map_source_get_label (VikMapSource * self);
index 43d10ea5c6c7e45c84e4f8e84ae5cb7c2a73423d..b13089ab395930aec1972601820e766321de1989 100644 (file)
@@ -33,6 +33,7 @@
 static const gchar *map_source_get_copyright (VikMapSource *self);
 static const gchar *map_source_get_license (VikMapSource *self);
 static const gchar *map_source_get_license_url (VikMapSource *self);
+static const GdkPixbuf *map_source_get_logo (VikMapSource *self);
 
 static guint8 map_source_get_uniq_id (VikMapSource *self);
 static const gchar *map_source_get_label (VikMapSource *self);
@@ -51,7 +52,8 @@ struct _VikMapSourceDefaultPrivate
        gchar *copyright;
        gchar *license;
        gchar *license_url;
-       
+       GdkPixbuf *logo;
+
        guint8 uniq_id;
        gchar *label;
        guint16 tilesize_x;
@@ -88,6 +90,7 @@ vik_map_source_default_init (VikMapSourceDefault *object)
   priv->copyright = NULL;
   priv->license = NULL;
   priv->license_url = NULL;
+  priv->logo = NULL;
 }
 
 static void
@@ -104,6 +107,8 @@ vik_map_source_default_finalize (GObject *object)
   priv->license = NULL;
   g_free (priv->license_url);
   priv->license_url = NULL;
+  g_free (priv->logo);
+  priv->license_url = NULL;
        
   G_OBJECT_CLASS (vik_map_source_default_parent_class)->finalize (object);
 }
@@ -226,6 +231,7 @@ vik_map_source_default_class_init (VikMapSourceDefaultClass *klass)
        parent_class->get_copyright =   map_source_get_copyright;
        parent_class->get_license =     map_source_get_license;
        parent_class->get_license_url = map_source_get_license_url;
+       parent_class->get_logo =        map_source_get_logo;
        parent_class->get_uniq_id =    map_source_get_uniq_id;
        parent_class->get_label =      map_source_get_label;
        parent_class->get_tilesize_x = map_source_get_tilesize_x;
@@ -338,6 +344,16 @@ map_source_get_license_url (VikMapSource *self)
        return priv->license_url;
 }
 
+static const GdkPixbuf *
+map_source_get_logo (VikMapSource *self)
+{
+       g_return_val_if_fail (VIK_IS_MAP_SOURCE_DEFAULT(self), NULL);
+
+       VikMapSourceDefaultPrivate *priv = VIK_MAP_SOURCE_DEFAULT_PRIVATE(self);
+
+       return priv->logo;
+}
+
 static guint8
 map_source_get_uniq_id (VikMapSource *self)
 {
index 749089b26951a1e2ba56695e0d3b6edb7e50f52a..51f2155194d6c4d9e3923bce965dc5b807e8601f 100644 (file)
@@ -49,6 +49,8 @@
 
 static gdouble EASTING_OFFSET = 500000.0;
 
+static gint PAD = 10;
+
 static void viewport_class_init ( VikViewportClass *klass );
 static void viewport_init ( VikViewport *vvp );
 static void viewport_finalize ( GObject *gob );
@@ -84,6 +86,7 @@ struct _VikViewport {
   GdkGC *scale_bg_gc;
 
   GSList *copyrights;
+  GSList *logos;
 
   /* Wether or not display OSD info */
   gboolean draw_scale;
@@ -351,6 +354,7 @@ void vik_viewport_clear ( VikViewport *vvp )
   g_return_if_fail ( vvp != NULL );
   gdk_draw_rectangle(GDK_DRAWABLE(vvp->scr_buffer), vvp->background_gc, TRUE, 0, 0, vvp->width, vvp->height);
   vik_viewport_reset_copyrights ( vvp );
+  vik_viewport_reset_logos ( vvp );
 }
 
 /**
@@ -377,7 +381,7 @@ void vik_viewport_draw_scale ( VikViewport *vvp )
   if ( vvp->draw_scale ) {
     VikCoord left, right;
     gdouble unit, base, diff, old_unit, old_diff, ratio;
-    gint odd, len, PAD = 10, SCSIZE = 5, HEIGHT=10;
+    gint odd, len, SCSIZE = 5, HEIGHT=10;
     PangoFontDescription *pfd;
     PangoLayout *pl;
     gchar s[128];
@@ -486,7 +490,6 @@ void vik_viewport_draw_copyright ( VikViewport *vvp )
 {
   g_return_if_fail ( vvp != NULL );
 
-  gint PAD = 10;
   PangoFontDescription *pfd;
   PangoLayout *pl;
   PangoRectangle ink_rect, logical_rect;
@@ -567,6 +570,26 @@ void vik_viewport_draw_centermark ( VikViewport *vvp )
   
 }
 
+void vik_viewport_draw_logo ( VikViewport *vvp )
+{
+  g_return_if_fail ( vvp != NULL );
+
+  /* compute copyrights string */
+  guint len = g_slist_length ( vvp->logos );
+  gint x = vvp->width - PAD;
+  gint y = PAD;
+  int i;
+  for (i = 0 ; i < len ; i++)
+  {
+    GdkPixbuf *logo = g_slist_nth_data ( vvp->logos, i );
+    gint width = gdk_pixbuf_get_width ( logo );
+    gint height = gdk_pixbuf_get_height ( logo );
+    vik_viewport_draw_pixbuf ( vvp, logo, 0, 0, x - width, y, width, height );
+    x = x - width - PAD;
+  }
+
+}
+
 void vik_viewport_sync ( VikViewport *vvp )
 {
   g_return_if_fail ( vvp != NULL );
@@ -1219,3 +1242,24 @@ void vik_viewport_add_copyright ( VikViewport *vp, const gchar *copyright )
     }
   }
 }
+
+void vik_viewport_reset_logos ( VikViewport *vp )
+{
+  g_return_if_fail ( vp != NULL );
+  /* do not free elem */
+  g_slist_free ( vp->logos );
+  vp->logos = NULL;
+}
+
+void vik_viewport_add_logo ( VikViewport *vp, const GdkPixbuf *logo )
+{
+  g_return_if_fail ( vp != NULL );
+  if ( logo )
+  {
+    GdkPixbuf *found = NULL; /* FIXME (GdkPixbuf*)g_slist_find_custom ( vp->logos, logo, (GCompareFunc)== ); */
+    if ( found == NULL )
+    {
+      vp->logos = g_slist_prepend ( vp->logos, (gpointer)logo );
+    }
+  }
+}
index 42133170c7a6aae496638c0f8cc4625a0abc5312..a7017b15439df98f14de9b76d2df3fe49be7eef2 100644 (file)
@@ -138,6 +138,9 @@ gint vik_viewport_get_height ( VikViewport *vvp );
 void vik_viewport_reset_copyrights ( VikViewport *vp );
 void vik_viewport_add_copyright ( VikViewport *vp, const gchar *copyright );
 
+void vik_viewport_reset_logos ( VikViewport *vp );
+void vik_viewport_add_logo ( VikViewport *vp, const GdkPixbuf *logo );
+
 /* Viewport features */
 void vik_viewport_draw_scale ( VikViewport *vvp );
 void vik_viewport_set_draw_scale ( VikViewport *vvp, gboolean draw_scale );
@@ -146,6 +149,7 @@ void vik_viewport_draw_copyright ( VikViewport *vvp );
 void vik_viewport_draw_centermark ( VikViewport *vvp );
 void vik_viewport_set_draw_centermark ( VikViewport *vvp, gboolean draw_centermark );
 gboolean vik_viewport_get_draw_centermark ( VikViewport *vvp );
+void vik_viewport_draw_logo ( VikViewport *vvp );
 
 /* Color/graphics context management */
 void vik_viewport_set_background_color ( VikViewport *vvp, const gchar *color );
index 0b2b600b6d56922fcf2231b4142985dd69303fc7..2c0cc3e7014848dd2e8574c09cb242eea06885bf 100644 (file)
@@ -477,6 +477,7 @@ static void draw_redraw ( VikWindow *vw )
   vik_viewport_draw_scale ( vw->viking_vvp );
   vik_viewport_draw_copyright ( vw->viking_vvp );
   vik_viewport_draw_centermark ( vw->viking_vvp );
+  vik_viewport_draw_logo ( vw->viking_vvp );
 
   vik_viewport_set_half_drawn ( vw->viking_vvp, FALSE ); /* just in case. */
 }