summaryrefslogtreecommitdiff
path: root/src/gtkext/graph/cluster.c
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/cluster.c
parent72bebbd9dc7d59f69e23442b6c5b5526feb2a1a9 (diff)
Provided access to the graph layout from Python.
Diffstat (limited to 'src/gtkext/graph/cluster.c')
-rw-r--r--src/gtkext/graph/cluster.c364
1 files changed, 336 insertions, 28 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;
+
+}