37 |
//the osd controls |
//the osd controls |
38 |
typedef struct { |
typedef struct { |
39 |
/* the offscreen representation of the OSD */ |
/* the offscreen representation of the OSD */ |
40 |
cairo_surface_t *overlay; |
struct { |
41 |
|
cairo_surface_t *surface; |
42 |
|
gboolean rendered; |
43 |
|
#ifdef OSD_GPS_BUTTON |
44 |
|
gboolean gps_enabled; |
45 |
|
#endif |
46 |
|
} controls; |
47 |
|
|
48 |
#ifdef OSD_SCALE |
#ifdef OSD_SCALE |
49 |
cairo_surface_t *scale; |
cairo_surface_t *scale; |
56 |
|
|
57 |
#ifdef OSD_COORDINATES |
#ifdef OSD_COORDINATES |
58 |
cairo_surface_t *coordinates; |
cairo_surface_t *coordinates; |
59 |
|
float coo_lat, coo_lon; |
60 |
#endif |
#endif |
61 |
|
|
62 |
#ifdef OSD_SOURCE_SEL |
#ifdef OSD_SOURCE_SEL |
744 |
#define OSD_COORDINATES_FONT_SIZE 12 |
#define OSD_COORDINATES_FONT_SIZE 12 |
745 |
#endif |
#endif |
746 |
|
|
747 |
#define OSD_COORDINATES_W (9*OSD_COORDINATES_FONT_SIZE) |
#define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6) |
748 |
#define OSD_COORDINATES_H (2*OSD_COORDINATES_FONT_SIZE) |
|
749 |
|
#define OSD_COORDINATES_W (8*OSD_COORDINATES_FONT_SIZE+2*OSD_COORDINATES_OFFSET) |
750 |
|
#define OSD_COORDINATES_H (2*OSD_COORDINATES_FONT_SIZE+OSD_COORDINATES_OFFSET) |
751 |
|
|
752 |
/* these can be overwritten with versions that support */ |
/* these can be overwritten with versions that support */ |
753 |
/* localization */ |
/* localization */ |
805 |
c, (int)integral, fractional*60.0); |
c, (int)integral, fractional*60.0); |
806 |
} |
} |
807 |
|
|
|
#define OSD_COORDINATES_OFFSET (OSD_COORDINATES_FONT_SIZE/6) |
|
|
|
|
808 |
static void |
static void |
809 |
osd_render_coordinates(osm_gps_map_osd_t *osd) |
osd_render_coordinates(osm_gps_map_osd_t *osd) |
810 |
{ |
{ |
814 |
gfloat lat, lon; |
gfloat lat, lon; |
815 |
g_object_get(osd->widget, "latitude", &lat, "longitude", &lon, NULL); |
g_object_get(osd->widget, "latitude", &lat, "longitude", &lon, NULL); |
816 |
|
|
817 |
/* first fill with transparency */ |
/* check if position has changed enough to require redraw */ |
818 |
|
if(!isnan(priv->coo_lat) && !isnan(priv->coo_lon)) |
819 |
|
if((fabsf(lat - priv->coo_lat) < 1/60000) && /* 1/60000 == 1/1000 minute */ |
820 |
|
(fabsf(lon - priv->coo_lon) < 1/60000)) |
821 |
|
return; |
822 |
|
|
823 |
|
priv->coo_lat = lat; |
824 |
|
priv->coo_lon = lon; |
825 |
|
|
826 |
|
/* first fill with light transparency */ |
827 |
cairo_t *cr = cairo_create(priv->coordinates); |
cairo_t *cr = cairo_create(priv->coordinates); |
828 |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
829 |
// cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0); |
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.5); |
|
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.2); |
|
830 |
cairo_paint(cr); |
cairo_paint(cr); |
831 |
cairo_set_operator(cr, CAIRO_OPERATOR_OVER); |
cairo_set_operator(cr, CAIRO_OPERATOR_OVER); |
832 |
|
|
844 |
|
|
845 |
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); |
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); |
846 |
cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); |
cairo_set_line_width (cr, OSD_COORDINATES_FONT_SIZE/6); |
847 |
cairo_move_to (cr, |
cairo_move_to (cr, |
848 |
OSD_COORDINATES_OFFSET - lat_extents.x_bearing, |
(OSD_COORDINATES_W - lat_extents.width)/2, |
849 |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
850 |
cairo_text_path (cr, latitude); |
cairo_text_path (cr, latitude); |
851 |
cairo_move_to (cr, |
cairo_move_to (cr, |
852 |
OSD_COORDINATES_OFFSET - lon_extents.x_bearing, |
(OSD_COORDINATES_W - lon_extents.width)/2, |
853 |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
854 |
OSD_COORDINATES_FONT_SIZE); |
OSD_COORDINATES_FONT_SIZE); |
855 |
cairo_text_path (cr, longitude); |
cairo_text_path (cr, longitude); |
857 |
|
|
858 |
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); |
cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); |
859 |
cairo_move_to (cr, |
cairo_move_to (cr, |
860 |
OSD_COORDINATES_OFFSET - lat_extents.x_bearing, |
(OSD_COORDINATES_W - lat_extents.width)/2, |
861 |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
OSD_COORDINATES_OFFSET - lat_extents.y_bearing); |
862 |
cairo_show_text (cr, latitude); |
cairo_show_text (cr, latitude); |
863 |
cairo_move_to (cr, |
cairo_move_to (cr, |
864 |
OSD_COORDINATES_OFFSET - lon_extents.x_bearing, |
(OSD_COORDINATES_W - lon_extents.width)/2, |
865 |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
OSD_COORDINATES_OFFSET - lon_extents.y_bearing + |
866 |
OSD_COORDINATES_FONT_SIZE); |
OSD_COORDINATES_FONT_SIZE); |
867 |
cairo_show_text (cr, longitude); |
cairo_show_text (cr, longitude); |
1078 |
#endif |
#endif |
1079 |
|
|
1080 |
static void |
static void |
1081 |
osd_render(osm_gps_map_osd_t *osd) |
osd_render_controls(osm_gps_map_osd_t *osd) |
1082 |
{ |
{ |
1083 |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
osd_priv_t *priv = (osd_priv_t*)osd->priv; |
1084 |
|
|
1085 |
|
if(priv->controls.rendered |
1086 |
|
#ifdef OSD_GPS_BUTTON |
1087 |
|
&& (priv->controls.gps_enabled == (osd->cb != NULL)) |
1088 |
|
#endif |
1089 |
|
) |
1090 |
|
return; |
1091 |
|
|
1092 |
|
#ifdef OSD_GPS_BUTTON |
1093 |
|
priv->controls.gps_enabled = (osd->cb != NULL); |
1094 |
|
#endif |
1095 |
|
|
1096 |
#ifndef OSD_COLOR |
#ifndef OSD_COLOR |
1097 |
GdkColor bg = GTK_WIDGET(osd->widget)->style->bg[GTK_STATE_NORMAL]; |
GdkColor bg = GTK_WIDGET(osd->widget)->style->bg[GTK_STATE_NORMAL]; |
1098 |
GdkColor fg = GTK_WIDGET(osd->widget)->style->fg[GTK_STATE_NORMAL]; |
GdkColor fg = GTK_WIDGET(osd->widget)->style->fg[GTK_STATE_NORMAL]; |
1100 |
#endif |
#endif |
1101 |
|
|
1102 |
/* first fill with transparency */ |
/* first fill with transparency */ |
1103 |
cairo_t *cr = cairo_create(priv->overlay); |
cairo_t *cr = cairo_create(priv->controls.surface); |
1104 |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); |
1105 |
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0); |
cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.0); |
1106 |
cairo_paint(cr); |
cairo_paint(cr); |
1171 |
cairo_stroke(cr); |
cairo_stroke(cr); |
1172 |
|
|
1173 |
cairo_destroy(cr); |
cairo_destroy(cr); |
1174 |
|
} |
1175 |
|
|
1176 |
|
static void |
1177 |
|
osd_render(osm_gps_map_osd_t *osd) |
1178 |
|
{ |
1179 |
|
osd_render_controls(osd); |
1180 |
|
|
1181 |
#ifdef OSD_SOURCE_SEL |
#ifdef OSD_SOURCE_SEL |
1182 |
osd_render_source_sel(osd); |
osd_render_source_sel(osd); |
1202 |
|
|
1203 |
/* OSD itself uses some off-screen rendering, so check if the */ |
/* OSD itself uses some off-screen rendering, so check if the */ |
1204 |
/* offscreen buffer is present and create it if not */ |
/* offscreen buffer is present and create it if not */ |
1205 |
if(!priv->overlay) { |
if(!priv->controls.surface) { |
1206 |
/* create overlay ... */ |
/* create overlay ... */ |
1207 |
priv->overlay = |
priv->controls.surface = |
1208 |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, OSD_W+2, OSD_H+2); |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, OSD_W+2, OSD_H+2); |
1209 |
|
|
1210 |
|
priv->controls.rendered = FALSE; |
1211 |
|
#ifdef OSD_GPS_BUTTON |
1212 |
|
priv->controls.gps_enabled = FALSE; |
1213 |
|
#endif |
1214 |
|
|
1215 |
#ifdef OSD_SOURCE_SEL |
#ifdef OSD_SOURCE_SEL |
1216 |
/* the initial OSD state is alway not-expanded */ |
/* the initial OSD state is alway not-expanded */ |
1217 |
priv->map_source = |
priv->map_source = |
1236 |
priv->coordinates = |
priv->coordinates = |
1237 |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, |
1238 |
OSD_COORDINATES_W, OSD_COORDINATES_H); |
OSD_COORDINATES_W, OSD_COORDINATES_H); |
1239 |
|
|
1240 |
|
priv->coo_lat = priv->coo_lon = OSM_GPS_MAP_INVALID; |
1241 |
#endif |
#endif |
1242 |
|
|
1243 |
/* ... and render it */ |
/* ... and render it */ |
1285 |
if(y < 0) |
if(y < 0) |
1286 |
y += osd->widget->allocation.height - OSD_H; |
y += osd->widget->allocation.height - OSD_H; |
1287 |
|
|
1288 |
cairo_set_source_surface(cr, priv->overlay, x, y); |
cairo_set_source_surface(cr, priv->controls.surface, x, y); |
1289 |
cairo_paint(cr); |
cairo_paint(cr); |
1290 |
|
|
1291 |
#ifdef OSD_SOURCE_SEL |
#ifdef OSD_SOURCE_SEL |
1318 |
{ |
{ |
1319 |
osd_priv_t *priv = (osd_priv_t *)(osd->priv); |
osd_priv_t *priv = (osd_priv_t *)(osd->priv); |
1320 |
|
|
1321 |
if (priv->overlay) |
if (priv->controls.surface) |
1322 |
cairo_surface_destroy(priv->overlay); |
cairo_surface_destroy(priv->controls.surface); |
1323 |
|
|
1324 |
#ifdef OSD_SOURCE_SEL |
#ifdef OSD_SOURCE_SEL |
1325 |
if(priv->handler_id) |
if(priv->handler_id) |