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>
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 */
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;
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)
{
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);
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);
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);
gchar *copyright;
gchar *license;
gchar *license_url;
-
+ GdkPixbuf *logo;
+
guint8 uniq_id;
gchar *label;
guint16 tilesize_x;
priv->copyright = NULL;
priv->license = NULL;
priv->license_url = NULL;
+ priv->logo = NULL;
}
static void
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);
}
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;
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)
{
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 );
GdkGC *scale_bg_gc;
GSList *copyrights;
+ GSList *logos;
/* Wether or not display OSD info */
gboolean draw_scale;
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 );
}
/**
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];
{
g_return_if_fail ( vvp != NULL );
- gint PAD = 10;
PangoFontDescription *pfd;
PangoLayout *pl;
PangoRectangle ink_rect, logical_rect;
}
+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 );
}
}
}
+
+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 );
+ }
+ }
+}
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 );
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 );
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. */
}