diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2012-11-02 15:50:07 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2012-11-02 15:50:07 (GMT) |
commit | f5df6496fa50927d3d274c939a888afde652b7ad (patch) | |
tree | 281dbfdfdcb8765fea7036af274c63fb5acde8ff /src/gtkext/gtklinkrenderer.c | |
parent | c3aba0893c29cc098c029306fd7a4c8c1fa2eee2 (diff) |
Improved the computing and the rendering of the graphic view.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@277 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtklinkrenderer.c')
-rw-r--r-- | src/gtkext/gtklinkrenderer.c | 100 |
1 files changed, 97 insertions, 3 deletions
diff --git a/src/gtkext/gtklinkrenderer.c b/src/gtkext/gtklinkrenderer.c index 9332860..2913c19 100644 --- a/src/gtkext/gtklinkrenderer.c +++ b/src/gtkext/gtklinkrenderer.c @@ -24,12 +24,16 @@ #include "gtklinkrenderer.h" +#include <math.h> + + /* Lien entre morceaux de code (instance) */ struct _GtkLinkRenderer { GtkObject parent; /* A laisser en premier */ + LinkColor color; /* Couleur d'impression */ GdkPoint *points; /* Points de la ligne dessinée */ size_t count; /* Quantité de ces points */ @@ -44,12 +48,18 @@ struct _GtkLinkRendererClass }; +#define ARROW_LENGHT 10 +#define ARROW_DEGREES 10 + + /* Initialise la classe générique des liens graphiques. */ static void gtk_link_renderer_class_init(GtkLinkRendererClass *); /* Initialise une instance de lien graphique entre codes. */ static void gtk_link_renderer_init(GtkLinkRenderer *); +/* Dessine une flèche au bout du lien représenté. */ +static void draw_link_arrow(cairo_t *, gint, gint, gint, gint); @@ -95,7 +105,8 @@ static void gtk_link_renderer_init(GtkLinkRenderer *view) /****************************************************************************** * * -* Paramètres : points = points consituant la ligne à représenter. * +* Paramètres : color = couleur d'impression. * +ù points = points consituant la ligne à représenter. * * count = nombre de ces points. * * * * Description : Crée un nouveau moteur de rendu pour les liens graphiques. * @@ -106,12 +117,13 @@ static void gtk_link_renderer_init(GtkLinkRenderer *view) * * ******************************************************************************/ -GtkObject *gtk_link_renderer_new(GdkPoint *points, size_t count) +GtkObject *gtk_link_renderer_new(LinkColor color, GdkPoint *points, size_t count) { GtkLinkRenderer *result; /* Moteur de rendu à retourner */ result = g_object_new(GTK_TYPE_LINK_RENDERER, NULL); + result->color = color; result->points = points; result->count = count; @@ -136,6 +148,88 @@ GtkObject *gtk_link_renderer_new(GdkPoint *points, size_t count) void gtk_link_renderer_draw(const GtkLinkRenderer *renderer, GdkDrawable *drawable, GdkGC *gc) { - gdk_draw_lines(drawable, gc, renderer->points, renderer->count); + cairo_t *cairo; /* Gestionnaire de rendu */ + size_t i; /* Boucle de parcours */ + + cairo = gdk_cairo_create(drawable); + + switch (renderer->color) + { + default: + case LKC_DEFAULT: + cairo_set_source_rgb(cairo, 0, 0, 0); + break; + case LKC_GREEN: + cairo_set_source_rgb(cairo, 0, 0.6, 0); + break; + case LKC_RED: + cairo_set_source_rgb(cairo, 0.8, 0, 0); + break; + } + + cairo_set_line_width(cairo, 1); + + cairo_move_to(cairo, renderer->points[0].x, renderer->points[0].y); + + for (i = 1; i < renderer->count; i++) + cairo_line_to(cairo, renderer->points[i].x, renderer->points[i].y); + + cairo_stroke(cairo); + + draw_link_arrow(cairo, + renderer->points[renderer->count - 2].x, + renderer->points[renderer->count - 2].y, + renderer->points[renderer->count - 1].x, + renderer->points[renderer->count - 1].y); + + cairo_destroy(cairo); + +} + + +/****************************************************************************** +* * +* Paramètres : cairo = gestionnaire de rendu graphique. * +* start_x = abscisse du début du segment final. * +* start_y = ordonnée du début du segment final. * +* end_x = abscisse de fin de segment et pointe de flèche. * +* end_y = ordonnée de fin de segment et pointe de flèche. * +* * +* Description : Dessine une flèche au bout du lien représenté. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void draw_link_arrow(cairo_t *cairo, gint start_x, gint start_y, gint end_x, gint end_y) +{ + double angle; /* Angle du triangle à remplir */ + double factor_x; /* Direction de la flèche #1 */ + double factor_y; /* Direction de la flèche #2 */ + double x1; /* Abscisse du point n°1 */ + double y1; /* Ordonnée du point n°1 */ + double x2; /* Abscisse du point n°2 */ + double y2; /* Ordonnée du point n°2 */ + + angle = atan2(end_y - start_y, end_x - start_x) + M_PI; + + factor_x = -1; + factor_y = -1; + + x1 = end_x + factor_x * ARROW_LENGHT * cos(angle - ARROW_DEGREES); + y1 = end_y + factor_y * ARROW_LENGHT * sin(angle - ARROW_DEGREES); + x2 = end_x + factor_x * ARROW_LENGHT * cos(angle + ARROW_DEGREES); + y2 = end_y + factor_y * ARROW_LENGHT * sin(angle + ARROW_DEGREES); + + cairo_move_to(cairo, end_x, end_y); + + cairo_line_to(cairo, x1, y1); + cairo_line_to(cairo, x2, y2); + + cairo_move_to(cairo, end_x, end_y); + + cairo_fill(cairo); } |