diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-03-04 20:52:50 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-03-04 20:52:50 (GMT) |
commit | 27c21356d494824850005932f3dee5f38d7a8e82 (patch) | |
tree | 6d7381f9cde78d28b4664f73ef03d0adb5b7b288 /src/gtkext | |
parent | 72bebbd9dc7d59f69e23442b6c5b5526feb2a1a9 (diff) |
Provided access to the graph layout from Python.
Diffstat (limited to 'src/gtkext')
-rw-r--r-- | src/gtkext/graph/cluster.c | 364 | ||||
-rw-r--r-- | src/gtkext/graph/cluster.h | 20 | ||||
-rw-r--r-- | src/gtkext/graph/edge.c | 49 | ||||
-rw-r--r-- | src/gtkext/graph/edge.h | 8 |
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); |