Diff of /trunk/src/osm-gps-map-osd-classic.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 107 by harbaum, Fri Sep 11 12:16:50 2009 UTC revision 108 by harbaum, Fri Sep 11 19:20:55 2009 UTC
# Line 37  Line 37 
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;
# Line 50  typedef struct { Line 56  typedef struct {
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
# Line 737  osd_zoom_labels(cairo_t *cr, gint x, gin Line 744  osd_zoom_labels(cairo_t *cr, gint x, gin
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 */
# Line 796  static char Line 805  static char
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  {  {
# Line 807  osd_render_coordinates(osm_gps_map_osd_t Line 814  osd_render_coordinates(osm_gps_map_osd_t
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    
# Line 829  osd_render_coordinates(osm_gps_map_osd_t Line 844  osd_render_coordinates(osm_gps_map_osd_t
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);
# Line 842  osd_render_coordinates(osm_gps_map_osd_t Line 857  osd_render_coordinates(osm_gps_map_osd_t
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);
# Line 1063  osd_render_scale(osm_gps_map_osd_t *osd) Line 1078  osd_render_scale(osm_gps_map_osd_t *osd)
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];
# Line 1074  osd_render(osm_gps_map_osd_t *osd) Line 1100  osd_render(osm_gps_map_osd_t *osd)
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);
# Line 1145  osd_render(osm_gps_map_osd_t *osd) Line 1171  osd_render(osm_gps_map_osd_t *osd)
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);
# Line 1170  osd_draw(osm_gps_map_osd_t *osd, GdkDraw Line 1202  osd_draw(osm_gps_map_osd_t *osd, GdkDraw
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 =
# Line 1199  osd_draw(osm_gps_map_osd_t *osd, GdkDraw Line 1236  osd_draw(osm_gps_map_osd_t *osd, GdkDraw
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 */
# Line 1246  osd_draw(osm_gps_map_osd_t *osd, GdkDraw Line 1285  osd_draw(osm_gps_map_osd_t *osd, GdkDraw
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
# Line 1279  osd_free(osm_gps_map_osd_t *osd) Line 1318  osd_free(osm_gps_map_osd_t *osd)
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)

Legend:
Removed from v.107  
changed lines
  Added in v.108