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

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

revision 74 by harbaum, Mon Aug 24 09:23:36 2009 UTC revision 75 by harbaum, Mon Aug 24 12:57:15 2009 UTC
# Line 38  typedef struct { Line 38  typedef struct {
38      /* the offscreen representation of the OSD */      /* the offscreen representation of the OSD */
39      cairo_surface_t *overlay;      cairo_surface_t *overlay;
40    
     /* stuff required to restore the original map content */  
     GdkPixmap *backup;  
     gint backup_x, backup_y;  
   
41      GdkColor bg, fg, da;      GdkColor bg, fg, da;
42    
43  } osd_priv_t;  } osd_priv_t;
# Line 372  osm_gps_map_osd_render(osm_gps_map_osd_t Line 368  osm_gps_map_osd_render(osm_gps_map_osd_t
368  }  }
369    
370  static void  static void
371  osm_gps_map_osd_draw(osm_gps_map_osd_t *osd, gint xoffset, gint yoffset)  osm_gps_map_osd_draw(osm_gps_map_osd_t *osd, GdkDrawable *drawable)
372  {  {
373      osd_priv_t *priv = (osd_priv_t*)osd->priv;      osd_priv_t *priv = (osd_priv_t*)osd->priv;
374    
     /* backup previous contents */  
     if(!priv->backup)  
         priv->backup = gdk_pixmap_new(osd->pixmap, OSD_W+2, OSD_H+2, -1);  
   
     gint x = OSD_X + xoffset;  
     gint y = OSD_Y + yoffset;  
   
     /* create backup of background */  
     gdk_draw_drawable(priv->backup,  
         osd->widget->style->fg_gc[GTK_WIDGET_STATE(osd->widget)],  
                       osd->pixmap, x-1, y-1, 0, 0, OSD_W+2, OSD_H+2);  
   
     priv->backup_x = x-1;  
     priv->backup_y = y-1;  
   
375      /* OSD itself uses some off-screen rendering, so check if the */      /* OSD itself uses some off-screen rendering, so check if the */
376      /* offscreen buffer is present and create it if not */      /* offscreen buffer is present and create it if not */
377      if(!priv->overlay) {      if(!priv->overlay) {
# Line 402  osm_gps_map_osd_draw(osm_gps_map_osd_t * Line 383  osm_gps_map_osd_draw(osm_gps_map_osd_t *
383      }      }
384    
385      // now draw this onto the original context      // now draw this onto the original context
386      cairo_t *cr = gdk_cairo_create(osd->pixmap);      cairo_t *cr = gdk_cairo_create(drawable);
387      cairo_set_source_surface(cr, priv->overlay, x, y);      cairo_set_source_surface(cr, priv->overlay, OSD_X, OSD_Y);
388      cairo_paint(cr);      cairo_paint(cr);
389      cairo_destroy(cr);      cairo_destroy(cr);
390  }  }
391    
392  static void  static void
 osm_gps_map_osd_restore (osm_gps_map_osd_t *osd)  
 {  
     osd_priv_t *priv = (osd_priv_t*)osd->priv;  
   
     /* restore backup of previous contents */  
     if(priv->backup) {  
         /* create backup of background */  
         gdk_draw_drawable(osd->pixmap,  
                           osd->widget->style->fg_gc[GTK_WIDGET_STATE(osd->widget)],  
                           priv->backup, 0, 0,  
                           priv->backup_x, priv->backup_y, OSD_W+2, OSD_H+2);  
     }  
 }  
   
 static void  
393  osm_gps_map_osd_free(osm_gps_map_osd_t *osd)  osm_gps_map_osd_free(osm_gps_map_osd_t *osd)
394  {  {
395      osd_priv_t *priv = (osd_priv_t *)(osd->priv);      osd_priv_t *priv = (osd_priv_t *)(osd->priv);
396    
     if (priv->backup)  
         g_object_unref(priv->backup);  
   
397      if (priv->overlay)      if (priv->overlay)
398           cairo_surface_destroy(priv->overlay);           cairo_surface_destroy(priv->overlay);
399    
# Line 438  osm_gps_map_osd_free(osm_gps_map_osd_t * Line 401  osm_gps_map_osd_free(osm_gps_map_osd_t *
401  }  }
402    
403  static osm_gps_map_osd_t osd_classic = {  static osm_gps_map_osd_t osd_classic = {
     .restore    = osm_gps_map_osd_restore,  
404      .draw       = osm_gps_map_osd_draw,      .draw       = osm_gps_map_osd_draw,
405      .check      = osm_gps_map_osd_check,      .check      = osm_gps_map_osd_check,
406      .render     = osm_gps_map_osd_render,      .render     = osm_gps_map_osd_render,

Legend:
Removed from v.74  
changed lines
  Added in v.75