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

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

revision 72 by harbaum, Fri Aug 21 13:20:40 2009 UTC revision 73 by harbaum, Sun Aug 23 19:38:15 2009 UTC
# Line 17  Line 17 
17   * with this program.  If not, see <http://www.gnu.org/licenses/>.   * with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */   */
19    
20  #include "config.h"  #include "config.h"
21    #include <stdlib.h>  // abs
22    #include <math.h>    // M_PI
23    
24  /* parameters that can be overwritten from the config file: */  /* parameters that can be overwritten from the config file: */
25  /* OSM_GPS_MAP_OSD_DIAMETER */  /* OSM_GPS_MAP_OSD_DIAMETER */
# Line 29  Line 31 
31  #include <cairo.h>  #include <cairo.h>
32    
33  #include "osm-gps-map.h"  #include "osm-gps-map.h"
34    #include "osm-gps-map-osd-classic.h"
35    
36  //the osd controls  //the osd controls
37  typedef struct {  typedef struct {
38      GdkPixmap *backup;      GdkPixmap *backup;
39      gint backup_x, backup_y;      gint backup_x, backup_y;
   
40      cairo_surface_t *overlay;      cairo_surface_t *overlay;
   
     OsmGpsMapOsdGpsCallback cb;  
     gpointer data;  
41  } osd_priv_t;  } osd_priv_t;
42    
 /* the osd structure mainly contains various callbacks */  
 /* required to draw and update the OSD */  
 typedef struct {  
   
     void(enable_gps)(OsmGpsMap *, OsmGpsMapOsdGpsCallback, gpointer);  
     void(restore)(OsmGpsMap*);  
     void(draw)(OsmGpsMap *, gint, gint);  
     void(render)(OsmGpsMapPrivate *);  
     osd_button_t(*check)(gint, gint);       /* check if x/y lies within OSD */  
     void(free)(gpointer);  
   
     gpointer priv;  
 } osm_gps_map_osd_t;  
   
 static osm_gps_map_osd_t osd_classic = {  
     .restore    = osm_gps_map_osd_restore,  
     .draw       = osm_gps_map_osd_draw_controls,  
     .check      = osm_gps_map_osd_check,  
     .render     = osm_gps_map_osd_render,  
     .enable_gps = osm_gps_map_osd_enable_gps,  
     .free       = osm_gps_map_osd_free,  
     .priv       = NULL;  
 }  
   
 /* this is the only function that's externally visible */  
 osm_gps_map_osd_t *  
 osm_gps_map_osd_classic_init(void)  
 {  
     return osd_classic;  
 }  
   
 static void  
 osm_gps_map_osd_free(gpointer priv_ptr)  
 {  
     osd_priv_t *priv = (osd_priv_t *)priv_ptr;  
   
   
     g_free(priv);  
 }  
   
43  /* position and extent of bounding box */  /* position and extent of bounding box */
44  #define OSD_X      (10)  #define OSD_X      (10)
45  #define OSD_Y      (10)  #define OSD_Y      (10)
# Line 312  osm_gps_map_osd_labels_shadow(cairo_t *c Line 271  osm_gps_map_osd_labels_shadow(cairo_t *c
271  }  }
272    
273  static void  static void
274  osm_gps_map_osd_render(OsmGpsMapPrivate *priv) {  osm_gps_map_osd_render(osm_gps_map_osd_t *osd) {
275        osd_priv_t *priv = (osd_priv_t*)osd->priv;
276    
277      /* first fill with transparency */      /* first fill with transparency */
278      cairo_t *cr = cairo_create(priv->osd.overlay);      cairo_t *cr = cairo_create(priv->overlay);
279      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);      cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
280      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);
281      cairo_paint(cr);      cairo_paint(cr);
# Line 343  osm_gps_map_osd_render(OsmGpsMapPrivate Line 303  osm_gps_map_osd_render(OsmGpsMapPrivate
303      osm_gps_map_osd_dpad_labels(cr, x + OSD_LBL_SHADOW, y + OSD_LBL_SHADOW);      osm_gps_map_osd_dpad_labels(cr, x + OSD_LBL_SHADOW, y + OSD_LBL_SHADOW);
304      osm_gps_map_osd_labels_shadow(cr, Z_RAD/3, TRUE);      osm_gps_map_osd_labels_shadow(cr, Z_RAD/3, TRUE);
305      osm_gps_map_osd_dpad_gps(cr, x + OSD_LBL_SHADOW, y + OSD_LBL_SHADOW);      osm_gps_map_osd_dpad_gps(cr, x + OSD_LBL_SHADOW, y + OSD_LBL_SHADOW);
306      osm_gps_map_osd_labels_shadow(cr, Z_RAD/6, priv->osd.cb != NULL);      osm_gps_map_osd_labels_shadow(cr, Z_RAD/6, osd->cb != NULL);
307    
308      osm_gps_map_osd_zoom_labels(cr, x, y);      osm_gps_map_osd_zoom_labels(cr, x, y);
309      osm_gps_map_osd_dpad_labels(cr, x, y);      osm_gps_map_osd_dpad_labels(cr, x, y);
310      osm_gps_map_osd_labels(cr, Z_RAD/3, TRUE);      osm_gps_map_osd_labels(cr, Z_RAD/3, TRUE);
311      osm_gps_map_osd_dpad_gps(cr, x, y);      osm_gps_map_osd_dpad_gps(cr, x, y);
312      osm_gps_map_osd_labels(cr, Z_RAD/6, priv->osd.cb != NULL);      osm_gps_map_osd_labels(cr, Z_RAD/6, osd->cb != NULL);
313    
314      cairo_destroy(cr);      cairo_destroy(cr);
315  }  }
316    
317  static void  static void
318  osm_gps_map_osd_draw_controls (OsmGpsMap *map, gint xoffset, gint yoffset)  osm_gps_map_osd_draw(osm_gps_map_osd_t *osd, gint xoffset, gint yoffset)
319  {  {
320      OsmGpsMapPrivate *priv = map->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
321    
322      /* backup previous contents */      /* backup previous contents */
323      if(!priv->osd.backup)      if(!priv->backup)
324          priv->osd.backup = gdk_pixmap_new(priv->pixmap, OSD_W+2, OSD_H+2, -1);          priv->backup = gdk_pixmap_new(osd->pixmap, OSD_W+2, OSD_H+2, -1);
325    
326      gint x = OSD_X + EXTRA_BORDER + xoffset;      gint x = OSD_X + xoffset;
327      gint y = OSD_Y + EXTRA_BORDER + yoffset;      gint y = OSD_Y + yoffset;
328    
329      /* create backup of background */      /* create backup of background */
330      gdk_draw_drawable(priv->osd.backup,      gdk_draw_drawable(priv->backup,
331          GTK_WIDGET(map)->style->fg_gc[GTK_WIDGET_STATE(GTK_WIDGET(map))],          osd->widget->style->fg_gc[GTK_WIDGET_STATE(osd->widget)],
332                        priv->pixmap, x-1, y-1, 0, 0, OSD_W+2, OSD_H+2);                        osd->pixmap, x-1, y-1, 0, 0, OSD_W+2, OSD_H+2);
333    
334      priv->osd.backup_x = x-1;      priv->backup_x = x-1;
335      priv->osd.backup_y = y-1;      priv->backup_y = y-1;
336    
337      /* OSD itself uses some off-screen rendering, so check if the */      /* OSD itself uses some off-screen rendering, so check if the */
338      /* offscreen buffer is present and create it if not */      /* offscreen buffer is present and create it if not */
339      if(!priv->osd.overlay) {      if(!priv->overlay) {
340          /* create overlay ... */          /* create overlay ... */
341          priv->osd.overlay =          priv->overlay =
342              cairo_image_surface_create(CAIRO_FORMAT_ARGB32, OSD_W, OSD_H);              cairo_image_surface_create(CAIRO_FORMAT_ARGB32, OSD_W, OSD_H);
343          /* ... and render it */          /* ... and render it */
344          osm_gps_map_osd_render(priv);          osm_gps_map_osd_render(osd);
345      }      }
346    
347      // now draw this onto the original context      // now draw this onto the original context
348      cairo_t *cr = gdk_cairo_create(priv->pixmap);      cairo_t *cr = gdk_cairo_create(osd->pixmap);
349      cairo_set_source_surface(cr, priv->osd.overlay, x, y);      cairo_set_source_surface(cr, priv->overlay, x, y);
350      cairo_paint(cr);      cairo_paint(cr);
351      cairo_destroy(cr);      cairo_destroy(cr);
352  }  }
353    
354  static void  static void
355  osm_gps_map_osd_restore (OsmGpsMap *map)  osm_gps_map_osd_restore (osm_gps_map_osd_t *osd)
356  {  {
357      OsmGpsMapPrivate *priv = map->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
358    
359      /* restore backup of previous contents */      /* restore backup of previous contents */
360      if(priv->osd.backup) {      if(priv->backup) {
361          /* create backup of background */          /* create backup of background */
362          gdk_draw_drawable(priv->pixmap,          gdk_draw_drawable(osd->pixmap,
363              GTK_WIDGET(map)->style->fg_gc[GTK_WIDGET_STATE(GTK_WIDGET(map))],                            osd->widget->style->fg_gc[GTK_WIDGET_STATE(osd->widget)],
364                        priv->osd.backup, 0, 0,                            priv->backup, 0, 0,
365                        priv->osd.backup_x, priv->osd.backup_y, OSD_W+2, OSD_H+2);                            priv->backup_x, priv->backup_y, OSD_W+2, OSD_H+2);
366      }      }
367  }  }
368    
369  static void  static void
370  osm_gps_map_osd_enable_gps (OsmGpsMap *map, OsmGpsMapOsdGpsCallback cb, gpointer data)  osm_gps_map_osd_free(osm_gps_map_osd_t *osd)
371  {  {
372      OsmGpsMapPrivate *priv;      osd_priv_t *priv = (osd_priv_t *)(osd->priv);
373    
374        if (priv->backup)
375            g_object_unref(priv->backup);
376    
377        if (priv->overlay)
378             cairo_surface_destroy(priv->overlay);
379    
380        g_free(priv);
381    }
382    
383    static osm_gps_map_osd_t osd_classic = {
384        .restore    = osm_gps_map_osd_restore,
385        .draw       = osm_gps_map_osd_draw,
386        .check      = osm_gps_map_osd_check,
387        .render     = osm_gps_map_osd_render,
388        .free       = osm_gps_map_osd_free,
389    
390        .cb         = NULL,
391        .data       = NULL,
392    
393        .priv       = NULL
394    };
395    
396    /* this is the only function that's externally visible */
397    void
398    osm_gps_map_osd_classic_init(OsmGpsMap *map)
399    {
400        osd_priv_t *priv = osd_classic.priv = g_new0(osd_priv_t, 1);
401    
402        osd_classic.priv = priv;
403    
404        osm_gps_map_register_osd(map, &osd_classic);
405    }
406    
407    
408    void osm_gps_map_osd_enable_gps (OsmGpsMap *map, OsmGpsMapOsdCallback cb, gpointer data) {
409        osm_gps_map_osd_t *osd = osm_gps_map_osd_get(map);
410    
411      g_return_if_fail (OSM_IS_GPS_MAP (map));      g_return_if_fail (osd);
     priv = map->priv;  
412    
413      priv->osd.cb = cb;      osd->cb = cb;
414      priv->osd.data = data;      osd->data = data;
415    
416      /* this may have changed the state of the gps button */      /* this may have changed the state of the gps button */
417      /* we thus re-render the overlay */      /* we thus re-render the overlay */
418      osm_gps_map_osd_render(priv);      osd->render(osd);
419    
420      osm_gps_map_map_redraw_idle(map);      osm_gps_map_redraw(map);
421  }  }

Legend:
Removed from v.72  
changed lines
  Added in v.73