diff options
Diffstat (limited to 'src/gtkext/graph/edge.c')
-rw-r--r-- | src/gtkext/graph/edge.c | 71 |
1 files changed, 31 insertions, 40 deletions
diff --git a/src/gtkext/graph/edge.c b/src/gtkext/graph/edge.c index c07c6c5..e3844f3 100644 --- a/src/gtkext/graph/edge.c +++ b/src/gtkext/graph/edge.c @@ -38,12 +38,11 @@ struct _GGraphEdge EdgeColor color; /* Couleur du rendu */ - const GdkPoint *start; /* Point de départ du lien */ - GdkPoint *mid[2]; /* Etapes intermédiaires */ - size_t m_count; /* Quantité de ces étapes */ - const GdkPoint *end; /* Point d'arrivée du lien */ - - GdkPoint *points; /* Points de la ligne dessinée */ + union + { + const GdkPoint **templates; /* Inspirations de coordonnées */ + GdkPoint *points; /* Points de la ligne dessinée */ + }; size_t count; /* Quantité de ces points */ }; @@ -157,8 +156,7 @@ static void g_graph_edge_dispose(GGraphEdge *edge) static void g_graph_edge_finalize(GGraphEdge *edge) { - if (edge->points != NULL) - free(edge->points); + free(edge->points); G_OBJECT_CLASS(g_graph_edge_parent_class)->finalize(G_OBJECT(edge)); @@ -167,11 +165,9 @@ static void g_graph_edge_finalize(GGraphEdge *edge) /****************************************************************************** * * -* Paramètres : start = point de départ de la flêche. * -* mid = points intermédiares variables. * -* count = nombre de ces points fournis. * -* end = point d'arrivée de la flêche. * -* color = couleur de rendu à l'écran. * +* Paramètres : templates = coordonnées des futurs points. * +* count = nombre de ces points fournis. * +* color = couleur de rendu à l'écran. * * * * Description : Etablit un lien graphique entre deux noeuds graphiques. * * * @@ -181,7 +177,7 @@ static void g_graph_edge_finalize(GGraphEdge *edge) * * ******************************************************************************/ -GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_t count, const GdkPoint *end, EdgeColor color) +GGraphEdge *_g_graph_edge_new(const GdkPoint **templates, size_t count, EdgeColor color) { GGraphEdge *result; /* Structure à retourner */ @@ -189,16 +185,14 @@ GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_ result->color = color; - assert(count == 1 || count == 2); + assert(count == 4 || count == 6); - result->start = start; + result->templates = malloc(count * sizeof(GdkPoint *)); + memcpy(result->templates, templates, count * sizeof(GdkPoint *)); - memcpy(result->mid, mid, count * sizeof(GdkPoint)); - result->m_count = count; + result->count = count; - result->end = end; - - return G_GRAPH_EDGE(result); + return result; } @@ -219,8 +213,14 @@ GGraphEdge *_g_graph_edge_new(const GdkPoint *start, const GdkPoint **mid, size_ void g_graph_edge_get_x_borders(const GGraphEdge *edge, gint *x1, gint *x2) { - *x1 = edge->start->x; - *x2 = edge->end->x; + /** + * A l'appel de cette fonction, les informations des points n'ont + * pas encore été fixées ni recopiées. + */ + + *x1 = edge->templates[0]->x; + *x2 = edge->templates[edge->count - 1]->x; + } @@ -238,29 +238,20 @@ void g_graph_edge_get_x_borders(const GGraphEdge *edge, gint *x1, gint *x2) void g_graph_edge_resolve(GGraphEdge *edge) { - edge->count = 2 + 2 * edge->m_count; - edge->points = (GdkPoint *)calloc(edge->count, sizeof(GdkPoint)); + const GdkPoint **templates; /* Inspirations de coordonnées */ + size_t i; /* Boucle de parcours */ - edge->points[0] = *edge->start; + templates = edge->templates; - edge->points[1].x = edge->start->x; - edge->points[1].y = edge->mid[0]->y; + edge->points = malloc(edge->count * sizeof(GdkPoint)); - if (edge->m_count == 1) - { - edge->points[2].x = edge->end->x; - edge->points[2].y = edge->mid[0]->y; - } - else + for (i = 0; i < edge->count; i++) { - memcpy(&edge->points[2], edge->mid, edge->m_count * sizeof(GdkPoint)); - - edge->points[4].x = edge->end->x; - edge->points[4].y = edge->mid[3]->y; - + edge->points[i].x = templates[i]->x; + edge->points[i].y = templates[i]->y; } - edge->points[edge->count - 1] = *edge->end; + free(templates); } |