From 26336cf0db5532e80d37c82983338e09d7789d9d Mon Sep 17 00:00:00 2001 From: Guilhem Bonnefille Date: Sun, 27 Mar 2011 22:26:50 +0200 Subject: [PATCH] Add map's logo support 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 --- src/vikmapslayer.c | 4 ++++ src/vikmapsource.c | 14 ++++++++++++ src/vikmapsource.h | 2 ++ src/vikmapsourcedefault.c | 18 ++++++++++++++- src/vikviewport.c | 48 +++++++++++++++++++++++++++++++++++++-- src/vikviewport.h | 4 ++++ src/vikwindow.c | 1 + 7 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/vikmapslayer.c b/src/vikmapslayer.c index 27822e6e..e43aa6ef 100644 --- a/src/vikmapslayer.c +++ b/src/vikmapslayer.c @@ -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 */ diff --git a/src/vikmapsource.c b/src/vikmapsource.c index 98f4d50a..d3a95007 100644 --- a/src/vikmapsource.c +++ b/src/vikmapsource.c @@ -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) { diff --git a/src/vikmapsource.h b/src/vikmapsource.h index c0b80f3c..2400fec9 100644 --- a/src/vikmapsource.h +++ b/src/vikmapsource.h @@ -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); diff --git a/src/vikmapsourcedefault.c b/src/vikmapsourcedefault.c index 43d10ea5..b13089ab 100644 --- a/src/vikmapsourcedefault.c +++ b/src/vikmapsourcedefault.c @@ -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) { diff --git a/src/vikviewport.c b/src/vikviewport.c index 749089b2..51f21551 100644 --- a/src/vikviewport.c +++ b/src/vikviewport.c @@ -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 ); + } + } +} diff --git a/src/vikviewport.h b/src/vikviewport.h index 42133170..a7017b15 100644 --- a/src/vikviewport.h +++ b/src/vikviewport.h @@ -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 ); diff --git a/src/vikwindow.c b/src/vikwindow.c index 0b2b600b..2c0cc3e7 100644 --- a/src/vikwindow.c +++ b/src/vikwindow.c @@ -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. */ } -- 2.39.5