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; |
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) { |
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 |
|
|
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, |