[libchamplain] Draw the lines using Cairo
- From: Pierre-Luc Beaudoin <plbeaudoin src gnome org>
- To: svn-commits-list gnome org
- Subject: [libchamplain] Draw the lines using Cairo
- Date: Fri, 12 Jun 2009 00:57:27 -0400 (EDT)
commit 0997ebec1ce628862c5390dc0df4baed994d3caf
Author: Pierre-Luc Beaudoin <pierre-luc pierlux com>
Date: Sun May 24 22:10:15 2009 -0400
Draw the lines using Cairo
The lines are drawn on a cairo surface, which is updated
each time the view changes (zoom, center, scroll).
champlain/champlain-line.c | 5 +---
champlain/champlain-private.h | 4 +++
champlain/champlain-view.c | 44 ++++++++++++++++++++++++++++++++++------
demos/lines.c | 4 +-
4 files changed, 44 insertions(+), 13 deletions(-)
---
diff --git a/champlain/champlain-line.c b/champlain/champlain-line.c
index 2eeb5cb..e432dc3 100644
--- a/champlain/champlain-line.c
+++ b/champlain/champlain-line.c
@@ -32,6 +32,7 @@
#include "champlain-line.h"
#include "champlain-defines.h"
+#include "champlain-private.h"
#include <clutter/clutter.h>
#include <glib.h>
@@ -46,10 +47,6 @@ enum
PROP_0
};
-struct _ChamplainLinePrivate {
- GList *points;
-};
-
static void
champlain_line_get_property (GObject *object,
guint property_id,
diff --git a/champlain/champlain-private.h b/champlain/champlain-private.h
index d27e705..e837afa 100644
--- a/champlain/champlain-private.h
+++ b/champlain/champlain-private.h
@@ -37,6 +37,10 @@ struct _ChamplainBaseMarkerPrivate
gdouble lat;
};
+struct _ChamplainLinePrivate {
+ GList *points;
+};
+
typedef struct
{
gint x;
diff --git a/champlain/champlain-view.c b/champlain/champlain-view.c
index 1406a1d..5c95b69 100644
--- a/champlain/champlain-view.c
+++ b/champlain/champlain-view.c
@@ -855,7 +855,7 @@ champlain_view_init (ChamplainView *view)
priv->user_layers);
clutter_actor_raise (priv->user_layers, priv->map_layer);
- /* Setup user_layers */
+ /* Setup line layer */
priv->line_layer = g_object_ref (clutter_cairo_new (800, 600));
clutter_actor_show (priv->line_layer);
clutter_container_add_actor (CLUTTER_CONTAINER (priv->viewport),
@@ -1094,6 +1094,7 @@ champlain_view_center_on (ChamplainView *view,
view_load_visible_tiles (view);
view_tiles_reposition (view);
+ view_update_lines (view);
marker_reposition (view);
}
@@ -2185,16 +2186,45 @@ champlain_view_add_line (ChamplainView *view,
static void
view_update_lines (ChamplainView *view)
{
+ ChamplainViewPrivate *priv = view->priv;
+
+ if (priv->line == NULL)
+ return;
+
cairo_t *cr;
- cr = clutter_cairo_create (CLUTTER_CAIRO (view->priv->line_layer));
+ cr = clutter_cairo_create (CLUTTER_CAIRO (priv->line_layer));
+
+ /* Clear the drawing area */
+ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
+ cairo_rectangle (cr, 0, 0, 800, 600);
+ cairo_fill (cr);
+
+ /* Draw the line */
+ cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+ GList *list = g_list_first (priv->line->priv->points);
+ while (list != NULL)
+ {
+ ChamplainPoint *point = (ChamplainPoint*) list->data;
+ gint x, y;
+
+ x = champlain_map_source_get_x (priv->map_source, priv->zoom_level,
+ point->lon);
+ y = champlain_map_source_get_y (priv->map_source, priv->zoom_level,
+ point->lat);
+
+ x -= priv->viewport_size.x + priv->anchor.x;
+ y -= priv->viewport_size.y + priv->anchor.y;
+
+ cairo_line_to (cr, x, y);
+ list = list->next;
+ }
+ gint x, y;
- cairo_move_to (cr, 0, 0);
- cairo_line_to (cr, 100, 0);
- cairo_line_to (cr, 100, 200);
- cairo_line_to (cr, 100, 100);
- cairo_line_to (cr, 0, 100);
+ x = priv->viewport_size.x;
+ y = priv->viewport_size.y;
cairo_stroke (cr);
cairo_destroy (cr);
+ clutter_actor_set_position (priv->line_layer, x, y);
}
diff --git a/demos/lines.c b/demos/lines.c
index f47b66b..2bbfd98 100644
--- a/demos/lines.c
+++ b/demos/lines.c
@@ -109,8 +109,8 @@ main (int argc,
/* draw a line */
line = champlain_line_new ();
- champlain_line_add_point (line, -40, -70);
- champlain_line_add_point (line, -45, -75);
+ champlain_line_add_point (line, 44, -74);
+ champlain_line_add_point (line, 45, -75);
champlain_view_add_line (CHAMPLAIN_VIEW (actor), line);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]