--- trunk/src/osm-gps-map-osd-classic.c 2009/09/23 11:23:45 123 +++ trunk/src/osm-gps-map-osd-classic.c 2009/09/24 14:09:53 124 @@ -19,6 +19,7 @@ #include "config.h" #include // abs +#include #include // M_PI/cos() /* parameters that can be overwritten from the config file: */ @@ -1071,7 +1072,7 @@ #define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6) #define OSD_COORDINATES_W (8*OSD_COORDINATES_FONT_SIZE+2*OSD_COORDINATES_OFFSET) -#define OSD_COORDINATES_H (2*OSD_COORDINATES_FONT_SIZE+OSD_COORDINATES_OFFSET) +#define OSD_COORDINATES_H (2*OSD_COORDINATES_FONT_SIZE+2*OSD_COORDINATES_OFFSET) /* these can be overwritten with versions that support */ /* localization */ @@ -1129,17 +1130,35 @@ c, (int)integral, fractional*60.0); } -static void -osd_render_text(cairo_t *cr, int x, int y, char *text) { +/* render a string at the given screen position */ +static int +osd_render_centered_text(cairo_t *cr, int y, int width, char *text) { + char *p = g_strdup(text); + cairo_text_extents_t extents; + cairo_text_extents (cr, p, &extents); + + /* check if text needs to be truncated */ + int len = strlen(text)-2; + while(extents.width > width) { + len--; + strcpy(p+len, "..."); + cairo_text_extents (cr, p, &extents); + } + cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); - cairo_move_to (cr, x, y); - cairo_text_path (cr, text); + cairo_move_to (cr, (width - extents.width)/2, y - extents.y_bearing); + cairo_text_path (cr, p); cairo_stroke (cr); cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); - cairo_move_to (cr, x, y); - cairo_show_text (cr, text); + cairo_move_to (cr, (width - extents.width)/2, y - extents.y_bearing); + cairo_show_text (cr, p); + + g_free(p); + + /* skip + 1/4 line */ + return y + 5*OSD_COORDINATES_FONT_SIZE/4; } static void @@ -1177,20 +1196,9 @@ char *latitude = osd_latitude_str(lat); char *longitude = osd_longitude_str(lon); - cairo_text_extents_t lat_extents, lon_extents; - cairo_text_extents (cr, latitude, &lat_extents); - cairo_text_extents (cr, longitude, &lon_extents); - - osd_render_text(cr, - (OSD_COORDINATES_W - lat_extents.width)/2, - OSD_COORDINATES_OFFSET - lat_extents.y_bearing, - latitude); - - osd_render_text(cr, - (OSD_COORDINATES_W - lon_extents.width)/2, - OSD_COORDINATES_OFFSET - lon_extents.y_bearing + - OSD_COORDINATES_FONT_SIZE, - longitude); + int y = OSD_COORDINATES_OFFSET; + y = osd_render_centered_text(cr, y, OSD_COORDINATES_W, latitude); + y = osd_render_centered_text(cr, y, OSD_COORDINATES_W, longitude); g_free(latitude); g_free(longitude); @@ -1226,27 +1234,10 @@ char *latitude = osd_latitude_str(priv->nav.lat); char *longitude = osd_longitude_str(priv->nav.lon); - cairo_text_extents_t lat_extents, lon_extents, name_extents; - cairo_text_extents (cr, priv->nav.name, &name_extents); - cairo_text_extents (cr, latitude, &lat_extents); - cairo_text_extents (cr, longitude, &lon_extents); - - osd_render_text(cr, - (OSD_NAV_W - name_extents.width)/2, - OSD_COORDINATES_OFFSET - name_extents.y_bearing, - priv->nav.name); - - osd_render_text(cr, - (OSD_NAV_W - lat_extents.width)/2, - OSD_COORDINATES_OFFSET - lat_extents.y_bearing + - OSD_COORDINATES_FONT_SIZE, - latitude); - - osd_render_text(cr, - (OSD_NAV_W - lon_extents.width)/2, - OSD_COORDINATES_OFFSET - lon_extents.y_bearing + - 2 * OSD_COORDINATES_FONT_SIZE, - longitude); + int y = OSD_COORDINATES_OFFSET; + y = osd_render_centered_text(cr, y, OSD_NAV_W, priv->nav.name); + y = osd_render_centered_text(cr, y, OSD_NAV_W, latitude); + y = osd_render_centered_text(cr, y, OSD_NAV_W, longitude); g_free(latitude); g_free(longitude);