summaryrefslogtreecommitdiff
path: root/champlain
diff options
context:
space:
mode:
authorMarius Stanciu <stanciumarius94@gmail.com>2016-08-08 19:51:40 +0300
committerMarius Stanciu <stanciumarius94@gmail.com>2016-08-08 19:51:40 +0300
commit46cc00ab5bec50005bf0ccdb479a6c7fd58937a4 (patch)
treebae07e0a37b0d81078a33a8ec0fb0c821c9254e9 /champlain
parent34eb2bb4b0db0a0ae7c965d23de52bd1651ca04d (diff)
downloadlibchamplain-46cc00ab5bec50005bf0ccdb479a6c7fd58937a4.tar.gz
Make path layer exportablility compatible with recent wrap changes.
Diffstat (limited to 'champlain')
-rw-r--r--champlain/champlain-path-layer.c64
1 files changed, 63 insertions, 1 deletions
diff --git a/champlain/champlain-path-layer.c b/champlain/champlain-path-layer.c
index dc3baf8..ac19351 100644
--- a/champlain/champlain-path-layer.c
+++ b/champlain/champlain-path-layer.c
@@ -110,6 +110,12 @@ struct _ChamplainPathLayerPrivate
ClutterContent *right_canvas;
ClutterContent *left_canvas;
+ cairo_surface_t *right_surface;
+ cairo_surface_t *left_surface;
+
+ gboolean right_surface_updated;
+ gboolean left_surface_updated;
+
GList *nodes;
gboolean redraw_scheduled;
};
@@ -445,6 +451,9 @@ champlain_path_layer_init (ChamplainPathLayer *self)
priv->right_canvas = clutter_canvas_new ();
priv->left_canvas = clutter_canvas_new ();
+ priv->right_surface_updated = FALSE;
+ priv->left_surface_updated = FALSE;
+
clutter_canvas_set_size (CLUTTER_CANVAS (priv->right_canvas), 255, 255);
clutter_canvas_set_size (CLUTTER_CANVAS (priv->left_canvas), 0, 0);
@@ -569,12 +578,14 @@ invalidate_canvas (ChamplainPathLayer *layer)
clutter_actor_set_size (priv->right_actor, right_actor_width, right_actor_height);
clutter_canvas_set_size (CLUTTER_CANVAS (priv->right_canvas), right_actor_width, right_actor_height);
+ priv->right_surface_updated = FALSE;
clutter_content_invalidate (priv->right_canvas);
if (left_actor_width != 0)
{
clutter_actor_set_size (priv->left_actor, left_actor_width, left_actor_height);
clutter_canvas_set_size (CLUTTER_CANVAS (priv->left_canvas), left_actor_width, left_actor_height);
+ priv->left_surface_updated = FALSE;
clutter_content_invalidate (priv->left_canvas);
}
@@ -760,6 +771,57 @@ relocate_cb (G_GNUC_UNUSED GObject *gobject,
schedule_redraw (layer);
}
+static void
+update_surface (ChamplainPathLayer *layer,
+ ClutterCanvas *canvas,
+ cairo_surface_t *surface)
+{
+ ChamplainPathLayerPrivate *priv = layer->priv;
+
+ if (canvas == CLUTTER_CANVAS (priv->right_canvas))
+ {
+ cairo_surface_destroy (priv->right_surface);
+ priv->right_surface = cairo_surface_reference (surface);
+ priv->right_surface_updated = TRUE;
+ }
+ else if (canvas == CLUTTER_CANVAS (priv->left_canvas))
+ {
+ cairo_surface_destroy (priv->left_surface);
+ priv->left_surface = cairo_surface_reference (surface);
+ priv->left_surface_updated = TRUE;
+ }
+
+ /* Updating the exportable surface. Path layer has two surfaces (one for each canvas)
+ * which have to be merged into a single new one.
+ */
+ if (priv->left_surface_updated && priv->right_surface_updated)
+ {
+ gfloat view_width, view_height;
+ gint map_width, viewport_x, anchor_x;
+ cairo_surface_t *new_surface;
+ cairo_t *cr;
+
+ get_map_size (priv->view, &map_width, NULL);
+ clutter_actor_get_size (CLUTTER_ACTOR (priv->view), &view_width, &view_height);
+ champlain_view_get_viewport_origin (priv->view, &viewport_x, NULL);
+ champlain_view_get_viewport_anchor (priv->view, &anchor_x, NULL);
+
+ new_surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, view_width, view_height);
+ cr = cairo_create (new_surface);
+
+ cairo_set_source_surface (cr,
+ priv->right_surface,
+ 0, 0);
+ cairo_paint (cr);
+
+ cairo_set_source_surface (cr,
+ priv->left_surface,
+ map_width - viewport_x - anchor_x, 0);
+ cairo_paint (cr);
+
+ set_surface (CHAMPLAIN_EXPORTABLE (layer), new_surface);
+ }
+}
static gboolean
redraw_path (ClutterCanvas *canvas,
@@ -834,7 +896,7 @@ redraw_path (ClutterCanvas *canvas,
if (priv->stroke)
cairo_stroke (cr);
- set_surface (CHAMPLAIN_EXPORTABLE (layer), cairo_get_target (cr));
+ update_surface (layer, canvas, cairo_get_target (cr));
return FALSE;
}