summaryrefslogtreecommitdiff
path: root/src/gtkext/graph
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-03-04 20:52:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-03-04 20:52:50 (GMT)
commit27c21356d494824850005932f3dee5f38d7a8e82 (patch)
tree6d7381f9cde78d28b4664f73ef03d0adb5b7b288 /src/gtkext/graph
parent72bebbd9dc7d59f69e23442b6c5b5526feb2a1a9 (diff)
Provided access to the graph layout from Python.
Diffstat (limited to 'src/gtkext/graph')
-rw-r--r--src/gtkext/graph/cluster.c364
-rw-r--r--src/gtkext/graph/cluster.h20
-rw-r--r--src/gtkext/graph/edge.c49
-rw-r--r--src/gtkext/graph/edge.h8
4 files changed, 410 insertions, 31 deletions
diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c
index 8220bfe..84f3b38 100644
--- a/src/gtkext/graph/cluster.c
+++ b/src/gtkext/graph/cluster.c
@@ -264,9 +264,19 @@ static void set_y_for_graph_rank(const graph_rank_t *, gint *);
/* Détermine les ordonnées de tous les liens en place. */
static void compute_loop_link_with_graph_rank(const graph_rank_t *, const GtkAllocation *);
+/* Recherche le groupe de blocs avec un bloc donné comme chef. */
+static GGraphCluster *find_cluster_by_block_in_graph_rank(const graph_rank_t *, GCodeBlock *);
+
/* Recherche le groupe de blocs avec un composant comme chef. */
static GGraphCluster *find_cluster_by_widget_in_graph_rank(const graph_rank_t *, GtkWidget *);
+/* Collecte tous les chefs de file de blocs de code. */
+static GGraphCluster **collect_graph_ranks_clusters(const graph_rank_t *, GGraphCluster **, size_t *);
+
+/* Collecte tous les liens de chefs de file de blocs de code. */
+static GGraphEdge **collect_graph_ranks_cluster_edges(const graph_rank_t *, GGraphEdge **, size_t *);
+
+
/* -------------------------- DEFINITION D'UN CHEF DE FILE -------------------------- */
@@ -402,6 +412,12 @@ static void g_graph_cluster_compute_link_y_positions(GGraphCluster *);
/* Applique les positions calculées pour chaque lien graphique. */
static void g_graph_cluster_resolve_links(const GGraphCluster *);
+/* Collecte tous les chefs de file de blocs de code. */
+static GGraphCluster **g_graph_cluster_collect(GGraphCluster *, GGraphCluster **, size_t *);
+
+/* Collecte tous les liens de chefs de file de blocs de code. */
+static GGraphEdge **g_graph_cluster_collect_edges(GGraphCluster *, GGraphEdge **, size_t *);
+
/* ------------------------- CALCUL DE REPARTITION DE BLOCS ------------------------- */
@@ -1791,7 +1807,35 @@ static void compute_loop_link_with_graph_rank(const graph_rank_t *grank, const G
/******************************************************************************
* *
* Paramètres : grank = ensemble de blocs de même rang à analyser. *
-* widget = composant graphique à retrouver. *
+* block = bloc de code à retrouver. *
+* *
+* Description : Recherche le groupe de blocs avec un bloc donné comme chef. *
+* *
+* Retour : Groupe trouvé ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GGraphCluster *find_cluster_by_block_in_graph_rank(const graph_rank_t *grank, GCodeBlock *block)
+{
+ GGraphCluster *result; /* Trouvaille à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = NULL;
+
+ for (i = 0; i < grank->count && result == NULL; i++)
+ result = g_graph_cluster_find_by_block(grank->clusters[i], block);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : grank = ensemble de blocs de même rang à analyser. *
+* widget = composant graphique à retrouver. *
* *
* Description : Recherche le groupe de blocs avec un composant comme chef. *
* *
@@ -1816,6 +1860,64 @@ static GGraphCluster *find_cluster_by_widget_in_graph_rank(const graph_rank_t *g
}
+/******************************************************************************
+* *
+* Paramètres : grank = ensemble de blocs de même rang à analyser. *
+* list = liste en cours de constitution. [OUT] *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les chefs de file de blocs de code. *
+* *
+* Retour : Liste de graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GGraphCluster **collect_graph_ranks_clusters(const graph_rank_t *grank, GGraphCluster **list, size_t *count)
+{
+ GGraphCluster **result; /* Liste complétée à renvoyer */
+ size_t i; /* Boucle de parcours */
+
+ result = list;
+
+ for (i = 0; i < grank->count; i++)
+ result = g_graph_cluster_collect(grank->clusters[i], result, count);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : grank = ensemble de blocs de même rang à analyser. *
+* list = liste en cours de constitution. [OUT] *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les liens de chefs de file de blocs de code. *
+* *
+* Retour : Liste de liens graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GGraphEdge **collect_graph_ranks_cluster_edges(const graph_rank_t *grank, GGraphEdge **list, size_t *count)
+{
+ GGraphEdge **result; /* Liste complétée à renvoyer */
+ size_t i; /* Boucle de parcours */
+
+ result = list;
+
+ for (i = 0; i < grank->count; i++)
+ result = g_graph_cluster_collect_edges(grank->clusters[i], result, count);
+
+ return result;
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* DEFINITION D'UN CHEF DE FILE */
@@ -2773,7 +2875,77 @@ static void g_graph_cluster_set_y(GGraphCluster *cluster, gint base)
/******************************************************************************
* *
* Paramètres : cluster = encapsulation à consulter. *
-* alloc = emplacement idéal pour l'affichage. *
+* *
+* Description : Fournit le bloc de code principal du groupe. *
+* *
+* Retour : Bloc de code associé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GCodeBlock *g_graph_cluster_get_block(GGraphCluster *cluster)
+{
+ GCodeBlock *result; /* Bloc de code à retourner */
+
+ result = cluster->block;
+
+ g_object_ref(G_OBJECT(result));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cluster = encapsulation à consulter. *
+* *
+* Description : Fournit le composant graphique principal du groupe. *
+* *
+* Retour : Composant graphique principal utilisé. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GtkWidget *g_graph_cluster_get_widget(GGraphCluster *cluster)
+{
+ GtkWidget *result; /* Composant à retourner */
+
+ result = cluster->display;
+
+ g_object_ref(G_OBJECT(result));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cluster = encapsulation à consulter. *
+* alloc = emplacement idéal pour l'affichage. [OUT] *
+* *
+* Description : Fournit l'emplacement prévu pour un chef de file de blocs. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_graph_cluster_get_allocation(const GGraphCluster *cluster, GtkAllocation *alloc)
+{
+ *alloc = cluster->alloc;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cluster = encapsulation à consulter. *
+* alloc = emplacement idéal pour l'affichage. [OUT] *
* *
* Description : Détermine l'emplacement requis d'un ensemble de blocs. *
* *
@@ -2819,31 +2991,6 @@ void g_graph_cluster_compute_needed_alloc(const GGraphCluster *cluster, GtkAlloc
/******************************************************************************
* *
-* Paramètres : cluster = encapsulation à consulter. *
-* *
-* Description : Fournit le composant graphique principal du groupe. *
-* *
-* Retour : Composant graphique principal utilisé. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GtkWidget *g_graph_cluster_get_widget(GGraphCluster *cluster)
-{
- GtkWidget *result;
-
- result = cluster->display;
-
- g_object_ref(G_OBJECT(result));
-
- return result;
-
-}
-
-
-/******************************************************************************
-* *
* Paramètres : cluster = encapsulation à traiter. *
* display = support de destination finale. *
* *
@@ -3394,6 +3541,44 @@ static void g_graph_cluster_resolve_links(const GGraphCluster *cluster)
/******************************************************************************
* *
* Paramètres : cluster = graphique de blocs à analyser. *
+* block = bloc de code à retrouver. *
+* *
+* Description : Recherche le groupe de blocs avec un bloc donné comme chef. *
+* *
+* Retour : Groupe trouvé ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GGraphCluster *g_graph_cluster_find_by_block(GGraphCluster *cluster, GCodeBlock *block)
+{
+ GGraphCluster *result; /* Trouvaille à retourner */
+ size_t i; /* Boucle de parcours */
+
+ if (cluster->block == block)
+ {
+ result = cluster;
+ g_object_ref(G_OBJECT(result));
+ }
+
+ else
+ {
+ result = NULL;
+
+ for (i = 0; i < cluster->ranks_count && result == NULL; i++)
+ result = find_cluster_by_block_in_graph_rank(&cluster->ranks[i], block);
+
+ }
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cluster = graphique de blocs à analyser. *
* widget = composant graphique à retrouver. *
* *
* Description : Recherche le groupe de blocs avec un composant comme chef. *
@@ -3429,6 +3614,75 @@ GGraphCluster *g_graph_cluster_find_by_widget(GGraphCluster *cluster, GtkWidget
}
+/******************************************************************************
+* *
+* Paramètres : cluster = graphique de blocs à analyser. *
+* list = liste en cours de constitution. [OUT] *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les chefs de file de blocs de code. *
+* *
+* Retour : Liste de graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GGraphCluster **g_graph_cluster_collect(GGraphCluster *cluster, GGraphCluster **list, size_t *count)
+{
+ GGraphCluster **result; /* Liste complétée à renvoyer */
+ size_t i; /* Boucle de parcours */
+
+ result = realloc(list, ++(*count) * sizeof(GGraphCluster *));
+
+ result[*count - 1] = cluster;
+ g_object_ref(G_OBJECT(cluster));
+
+ for (i = 0; i < cluster->ranks_count; i++)
+ result = collect_graph_ranks_clusters(&cluster->ranks[i], result, count);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : cluster = graphique de blocs à analyser. *
+* list = liste en cours de constitution. [OUT] *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les liens de chefs de file de blocs de code. *
+* *
+* Retour : Liste de liens graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GGraphEdge **g_graph_cluster_collect_edges(GGraphCluster *cluster, GGraphEdge **list, size_t *count)
+{
+ GGraphEdge **result; /* Liste complétée à renvoyer */
+ size_t i; /* Boucle de parcours */
+
+ result = realloc(list, (*count + cluster->ta_count) * sizeof(GGraphEdge *));
+
+ for (i = 0; i < cluster->ta_count; i++)
+ {
+ result[*count + i] = cluster->top_anchors[i]->edge;
+ g_object_ref(G_OBJECT(result[*count + i]));
+ }
+
+ *count += cluster->ta_count;
+
+ for (i = 0; i < cluster->ranks_count; i++)
+ result = collect_graph_ranks_cluster_edges(&cluster->ranks[i], result, count);
+
+ return result;
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* CALCUL DE REPARTITION DE BLOCS */
@@ -3603,7 +3857,7 @@ static GGraphCluster *setup_graph_clusters(GLoadedBinary *binary, const GBlockLi
* *
* Description : Construit un graphique à partir de blocs basiques. *
* *
-* Retour : Adresse de la structure mise en place. *
+* Retour : Structure mise en place. *
* *
* Remarques : - *
* *
@@ -3721,3 +3975,57 @@ GGraphCluster *bootstrap_graph_cluster(GLoadedBinary *binary, const GBlockList *
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : root = graphique de blocs à analyser. *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les chefs de file de blocs de code. *
+* *
+* Retour : Liste de graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GGraphCluster **collect_graph_clusters(GGraphCluster *root, size_t *count)
+{
+ GGraphCluster **result; /* Liste à retourner */
+
+ result = NULL;
+ *count = 0;
+
+ result = g_graph_cluster_collect(root, result, count);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : root = graphique de blocs à analyser. *
+* count = taille de cette liste. [OUT] *
+* *
+* Description : Collecte tous les liens de chefs de file de blocs de code. *
+* *
+* Retour : Liste de liens graphiques de blocs rassemblés. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GGraphEdge **collect_graph_cluster_edges(GGraphCluster *root, size_t *count)
+{
+ GGraphEdge **result; /* Liste à retourner */
+
+ result = NULL;
+ *count = 0;
+
+ result = g_graph_cluster_collect_edges(root, result, count);
+
+ return result;
+
+}
diff --git a/src/gtkext/graph/cluster.h b/src/gtkext/graph/cluster.h
index 2a48b25..ee4249e 100644
--- a/src/gtkext/graph/cluster.h
+++ b/src/gtkext/graph/cluster.h
@@ -25,6 +25,7 @@
#define _GTKEXT_GRAPH_CLUSTER_H
+#include "edge.h"
#include "../gtkgraphdisplay.h"
#include "../../analysis/binary.h"
#include "../../analysis/disass/block.h"
@@ -55,15 +56,24 @@ GType g_graph_cluster_get_type(void);
/* Construit un graphique à partir de blocs de code. */
GGraphCluster *g_graph_cluster_new(GCodeBlock *, segcnt_list *, GLoadedBinary *);
-/* Détermine l'emplacement requis d'un ensemble de blocs. */
-void g_graph_cluster_compute_needed_alloc(const GGraphCluster *, GtkAllocation *);
+/* Fournit le bloc de code principal du groupe. */
+GCodeBlock *g_graph_cluster_get_block(GGraphCluster *);
/* Fournit le composant graphique principal du groupe. */
GtkWidget *g_graph_cluster_get_widget(GGraphCluster *);
+/* Fournit l'emplacement prévu pour un chef de file de blocs. */
+void g_graph_cluster_get_allocation(const GGraphCluster *, GtkAllocation *);
+
+/* Détermine l'emplacement requis d'un ensemble de blocs. */
+void g_graph_cluster_compute_needed_alloc(const GGraphCluster *, GtkAllocation *);
+
/* Dispose chaque noeud sur la surface de destination donnée. */
void g_graph_cluster_place(GGraphCluster *, GtkGraphDisplay *);
+/* Recherche le groupe de blocs avec un bloc donné comme chef. */
+GGraphCluster *g_graph_cluster_find_by_block(GGraphCluster *, GCodeBlock *);
+
/* Recherche le groupe de blocs avec un composant comme chef. */
GGraphCluster *g_graph_cluster_find_by_widget(GGraphCluster *, GtkWidget *);
@@ -75,6 +85,12 @@ GGraphCluster *g_graph_cluster_find_by_widget(GGraphCluster *, GtkWidget *);
/* Construit un graphique à partir de blocs basiques. */
GGraphCluster *bootstrap_graph_cluster(GLoadedBinary *, const GBlockList *, segcnt_list *);
+/* Collecte tous les chefs de file de blocs de code. */
+GGraphCluster **collect_graph_clusters(GGraphCluster *, size_t *);
+
+/* Collecte tous les liens de chefs de file de blocs de code. */
+GGraphEdge **collect_graph_cluster_edges(GGraphCluster *, size_t *);
+
#endif /* _GTKEXT_GRAPH_CLUSTER_H */
diff --git a/src/gtkext/graph/edge.c b/src/gtkext/graph/edge.c
index 20f1988..93f020b 100644
--- a/src/gtkext/graph/edge.c
+++ b/src/gtkext/graph/edge.c
@@ -237,6 +237,29 @@ void g_graph_edge_get_boundaries(const GGraphEdge *edge, GCodeBlock **src, GCode
/******************************************************************************
* *
* Paramètres : edge = ligne de rendu à consulter. *
+* *
+* Description : Fournit la couleur de rendu d'un lien graphique. *
+* *
+* Retour : Identifiant de couleur de rendu. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+EdgeColor g_graph_edge_get_color(const GGraphEdge *edge)
+{
+ EdgeColor result; /* Couleur à retourner */
+
+ result = edge->color;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : edge = ligne de rendu à consulter. *
* x1 = abscisse du point de départ de la ligne. [OUT] *
* x2 = abscisse du point d'arrivée de la ligne. [OUT] *
* *
@@ -322,6 +345,32 @@ void g_graph_edge_offset(GGraphEdge *edge, gint dx, gint dy)
/******************************************************************************
* *
+* Paramètres : edge = ligne de rendu avec positions à consulter. *
+* count = quantité de points représentés. [OUT] *
+* *
+* Description : Fournit l'ensemble des points constituant un lien graphique. *
+* *
+* Retour : Liste de points utilisés pour le dessin d'un lien. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const GdkPoint *g_graph_edge_get_points(const GGraphEdge *edge, size_t *count)
+{
+ const GdkPoint *result; /* Liste de points à renvoyer */
+
+ result = edge->points;
+
+ *count = edge->count;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : edge = ligne de rendu avec positions à consulter. *
* x = emplacement de la souris sur l'axe des abscisses. *
* y = emplacement de la souris sur l'axe des ordonnées. *
diff --git a/src/gtkext/graph/edge.h b/src/gtkext/graph/edge.h
index ec33544..5342766 100644
--- a/src/gtkext/graph/edge.h
+++ b/src/gtkext/graph/edge.h
@@ -30,7 +30,7 @@
#include <gtk/gtk.h>
-#include "../../analysis/disass/block.h"
+#include "../../analysis/block.h"
@@ -88,6 +88,9 @@ GGraphEdge *_g_graph_edge_new(GCodeBlock *, GCodeBlock *, const GdkPoint **, siz
/* Fournit les deux blocs aux extrémités d'un lien. */
void g_graph_edge_get_boundaries(const GGraphEdge *, GCodeBlock **, GCodeBlock **);
+/* Fournit la couleur de rendu d'un lien graphique. */
+EdgeColor g_graph_edge_get_color(const GGraphEdge *);
+
/* Fournit les abscisses des points extrèmes de la ligne. */
void g_graph_edge_get_x_borders(const GGraphEdge *, gint *, gint *);
@@ -97,6 +100,9 @@ void g_graph_edge_resolve(GGraphEdge *);
/* Opère un décalage du lien dans une direction donnée. */
void g_graph_edge_offset(GGraphEdge *, gint, gint);
+/* Fournit l'ensemble des points constituant un lien graphique. */
+const GdkPoint *g_graph_edge_get_points(const GGraphEdge *, size_t *);
+
/* Opère un décalage du lien dans une direction donnée. */
bool g_graph_edge_detect_at(const GGraphEdge *, gint, gint);