25 |
/* OSD_DIAMETER */ |
/* OSD_DIAMETER */ |
26 |
/* OSD_X, OSD_Y */ |
/* OSD_X, OSD_Y */ |
27 |
|
|
|
#define OSD_NAV |
|
|
|
|
28 |
#ifndef USE_CAIRO |
#ifndef USE_CAIRO |
29 |
#error "OSD control display lacks a non-cairo implementation!" |
#error "OSD control display lacks a non-cairo implementation!" |
30 |
#endif |
#endif |
79 |
#ifdef OSD_NAV |
#ifdef OSD_NAV |
80 |
struct { |
struct { |
81 |
cairo_surface_t *surface; |
cairo_surface_t *surface; |
82 |
|
float lat, lon; |
83 |
|
char *name; |
84 |
} nav; |
} nav; |
85 |
#endif |
#endif |
86 |
|
|
1130 |
} |
} |
1131 |
|
|
1132 |
static void |
static void |
1133 |
|
osd_render_text(cairo_t *cr, int x, int y, char *text) { |
1134 |
|
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); |
1135 |
|
cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); |
1136 |
|
cairo_move_to (cr, x, y); |
1137 |
|
cairo_text_path (cr, text); |
1138 |
|
cairo_stroke (cr); |
1139 |
|
|
1140 |
|
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); |
1141 |
|
cairo_move_to (cr, x, y); |
1142 |
|
cairo_show_text (cr, text); |
1143 |
|
} |
1144 |
|
|
1145 |
|
static void |
1146 |
osd_render_coordinates(osm_gps_map_osd_t *osd) |
osd_render_coordinates(osm_gps_map_osd_t *osd) |
1147 |
{ |
{ |
1148 |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
1180 |
cairo_text_extents_t lat_extents, lon_extents; |
cairo_text_extents_t lat_extents, lon_extents; |
1181 |
cairo_text_extents (cr, latitude, &lat_extents); |
cairo_text_extents (cr, latitude, &lat_extents); |
1182 |
cairo_text_extents (cr, longitude, &lon_extents); |
cairo_text_extents (cr, longitude, &lon_extents); |
1183 |
|
|
1184 |
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); |
osd_render_text(cr, |
1185 |
cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); |
(OSD_COORDINATES_W - lat_extents.width)/2, |
1186 |
cairo_move_to (cr, |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing, |
1187 |
(OSD_COORDINATES_W - lat_extents.width)/2, |
latitude); |
1188 |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
|
1189 |
cairo_text_path (cr, latitude); |
osd_render_text(cr, |
1190 |
cairo_move_to (cr, |
(OSD_COORDINATES_W - lon_extents.width)/2, |
1191 |
(OSD_COORDINATES_W - lon_extents.width)/2, |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
1192 |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
OSD_COORDINATES_FONT_SIZE, |
1193 |
OSD_COORDINATES_FONT_SIZE); |
longitude); |
1194 |
cairo_text_path (cr, longitude); |
|
|
cairo_stroke (cr); |
|
|
|
|
|
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); |
|
|
cairo_move_to (cr, |
|
|
(OSD_COORDINATES_W - lat_extents.width)/2, |
|
|
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
|
|
cairo_show_text (cr, latitude); |
|
|
cairo_move_to (cr, |
|
|
(OSD_COORDINATES_W - lon_extents.width)/2, |
|
|
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
|
|
OSD_COORDINATES_FONT_SIZE); |
|
|
cairo_show_text (cr, longitude); |
|
|
|
|
1195 |
g_free(latitude); |
g_free(latitude); |
1196 |
g_free(longitude); |
g_free(longitude); |
1197 |
|
|
1200 |
#endif // OSD_COORDINATES |
#endif // OSD_COORDINATES |
1201 |
|
|
1202 |
#ifdef OSD_NAV |
#ifdef OSD_NAV |
1203 |
#define OSD_NAV_W (100) |
#define OSD_NAV_W (8*OSD_COORDINATES_FONT_SIZE+2*OSD_COORDINATES_OFFSET) |
1204 |
#define OSD_NAV_H (100) |
#define OSD_NAV_H (100) |
1205 |
|
|
1206 |
static void |
static void |
1208 |
{ |
{ |
1209 |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
1210 |
|
|
1211 |
|
if(!priv->nav.surface || isnan(priv->nav.lat) || isnan(priv->nav.lon)) |
1212 |
|
return; |
1213 |
|
|
1214 |
/* first fill with transparency */ |
/* first fill with transparency */ |
1215 |
cairo_t *cr = cairo_create(priv->nav.surface); |
cairo_t *cr = cairo_create(priv->nav.surface); |
1216 |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
1218 |
cairo_paint(cr); |
cairo_paint(cr); |
1219 |
cairo_set_operator(cr, CAIRO_OPERATOR_OVER); |
cairo_set_operator(cr, CAIRO_OPERATOR_OVER); |
1220 |
|
|
1221 |
|
cairo_select_font_face (cr, "Sans", |
1222 |
|
CAIRO_FONT_SLANT_NORMAL, |
1223 |
|
CAIRO_FONT_WEIGHT_BOLD); |
1224 |
|
cairo_set_font_size (cr, OSD_COORDINATES_FONT_SIZE); |
1225 |
|
|
1226 |
|
char *latitude = osd_latitude_str(priv->nav.lat); |
1227 |
|
char *longitude = osd_longitude_str(priv->nav.lon); |
1228 |
|
|
1229 |
|
cairo_text_extents_t lat_extents, lon_extents, name_extents; |
1230 |
|
cairo_text_extents (cr, priv->nav.name, &name_extents); |
1231 |
|
cairo_text_extents (cr, latitude, &lat_extents); |
1232 |
|
cairo_text_extents (cr, longitude, &lon_extents); |
1233 |
|
|
1234 |
|
osd_render_text(cr, |
1235 |
|
(OSD_NAV_W - name_extents.width)/2, |
1236 |
|
OSD_COORDINATES_OFFSET - name_extents.y_bearing, |
1237 |
|
priv->nav.name); |
1238 |
|
|
1239 |
|
osd_render_text(cr, |
1240 |
|
(OSD_NAV_W - lat_extents.width)/2, |
1241 |
|
OSD_COORDINATES_OFFSET - lat_extents.y_bearing + |
1242 |
|
OSD_COORDINATES_FONT_SIZE, |
1243 |
|
latitude); |
1244 |
|
|
1245 |
|
osd_render_text(cr, |
1246 |
|
(OSD_NAV_W - lon_extents.width)/2, |
1247 |
|
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
1248 |
|
2 * OSD_COORDINATES_FONT_SIZE, |
1249 |
|
longitude); |
1250 |
|
|
1251 |
|
g_free(latitude); |
1252 |
|
g_free(longitude); |
1253 |
|
|
1254 |
cairo_destroy(cr); |
cairo_destroy(cr); |
1255 |
} |
} |
1256 |
|
|
1257 |
|
void osm_gps_map_osd_clear_nav (OsmGpsMap *map) { |
1258 |
|
g_return_if_fail (OSM_IS_GPS_MAP (map)); |
1259 |
|
|
1260 |
|
osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); |
1261 |
|
g_return_if_fail (osd); |
1262 |
|
|
1263 |
|
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
1264 |
|
g_return_if_fail (priv); |
1265 |
|
|
1266 |
|
if(priv->nav.surface) { |
1267 |
|
cairo_surface_destroy(priv->nav.surface); |
1268 |
|
priv->nav.surface = NULL; |
1269 |
|
priv->nav.lat = OSM_GPS_MAP_INVALID; |
1270 |
|
priv->nav.lon = OSM_GPS_MAP_INVALID; |
1271 |
|
if(priv->nav.name) g_free(priv->nav.name); |
1272 |
|
} |
1273 |
|
osm_gps_map_redraw(map); |
1274 |
|
} |
1275 |
|
|
1276 |
|
void |
1277 |
|
osm_gps_map_osd_draw_nav (OsmGpsMap *map, float latitude, float longitude, |
1278 |
|
char *name) { |
1279 |
|
g_return_if_fail (OSM_IS_GPS_MAP (map)); |
1280 |
|
|
1281 |
|
osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map); |
1282 |
|
g_return_if_fail (osd); |
1283 |
|
|
1284 |
|
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
1285 |
|
g_return_if_fail (priv); |
1286 |
|
|
1287 |
|
osm_gps_map_osd_clear_nav (map); |
1288 |
|
|
1289 |
|
/* allocate balloon surface */ |
1290 |
|
priv->nav.surface = |
1291 |
|
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
1292 |
|
OSD_NAV_W+2, OSD_NAV_H+2); |
1293 |
|
|
1294 |
|
priv->nav.lat = latitude; |
1295 |
|
priv->nav.lon = longitude; |
1296 |
|
priv->nav.name = g_strdup(name); |
1297 |
|
|
1298 |
|
osd_render_nav(osd); |
1299 |
|
|
1300 |
|
osm_gps_map_redraw(map); |
1301 |
|
} |
1302 |
|
|
1303 |
#endif // OSD_NAV |
#endif // OSD_NAV |
1304 |
|
|
1305 |
|
|
1678 |
priv->crosshair.rendered = FALSE; |
priv->crosshair.rendered = FALSE; |
1679 |
#endif |
#endif |
1680 |
|
|
|
#ifdef OSD_NAV |
|
|
priv->nav.surface = |
|
|
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
|
|
OSD_NAV_W, OSD_NAV_H); |
|
|
#endif |
|
|
|
|
1681 |
#ifdef OSD_COORDINATES |
#ifdef OSD_COORDINATES |
1682 |
priv->coordinates.surface = |
priv->coordinates.surface = |
1683 |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
1714 |
#endif |
#endif |
1715 |
|
|
1716 |
#ifdef OSD_NAV |
#ifdef OSD_NAV |
1717 |
x = OSD_X; |
if(priv->nav.surface) { |
1718 |
if(x < 0) x += osd->widget->allocation.width - OSD_NAV_W; |
x = OSD_X; |
1719 |
y = (osd->widget->allocation.height - OSD_NAV_H)/2; |
if(x < 0) x += osd->widget->allocation.width - OSD_NAV_W; |
1720 |
|
y = (osd->widget->allocation.height - OSD_NAV_H)/2; |
1721 |
cairo_set_source_surface(cr, priv->nav.surface, x, y); |
|
1722 |
cairo_paint(cr); |
cairo_set_source_surface(cr, priv->nav.surface, x, y); |
1723 |
|
cairo_paint(cr); |
1724 |
|
} |
1725 |
#endif |
#endif |
1726 |
|
|
1727 |
#ifdef OSD_COORDINATES |
#ifdef OSD_COORDINATES |