diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/line-int.h | 6 | ||||
-rw-r--r-- | src/analysis/line.c | 28 | ||||
-rw-r--r-- | src/analysis/line.h | 20 | ||||
-rw-r--r-- | src/analysis/line_code.c | 15 | ||||
-rw-r--r-- | src/analysis/line_comment.c | 20 | ||||
-rw-r--r-- | src/analysis/line_prologue.c | 9 | ||||
-rw-r--r-- | src/gtkext/gtkblockview.c | 28 | ||||
-rw-r--r-- | src/gtkext/gtkblockview.h | 6 | ||||
-rw-r--r-- | src/gtkext/gtkgraphview.c | 10 | ||||
-rw-r--r-- | src/project.c | 2 |
10 files changed, 97 insertions, 47 deletions
diff --git a/src/analysis/line-int.h b/src/analysis/line-int.h index 59ef5f8..ea8bce0 100644 --- a/src/analysis/line-int.h +++ b/src/analysis/line-int.h @@ -36,7 +36,7 @@ typedef void (* get_bin_len_fc) (GRenderingLine *, off_t *); /* Méthode de mise à jour d'une ligne de représentation. */ -typedef void (* refresh_markup_fc) (GRenderingLine *); +typedef void (* refresh_markup_fc) (GRenderingLine *, LinesMainOwner); /* Ligne de représentation générique (instance) */ @@ -57,10 +57,10 @@ struct _GRenderingLine GRenderingLine *to; /* Eventuelle ligne visée */ InstructionLinkType link_type; /* Type de visée */ - PangoLayout *layout; /* Moteur de rendu du code/txt */ + PangoLayout *layout[LMO_COUNT]; /* Moteur de rendu du code/txt */ get_bin_len_fc get_bin_len; /* Nbre d'octets représentés */ - off_t max_bin_len; /* Nombre global maximal */ + off_t max_bin_len[LMO_COUNT]; /* Nombre global maximal */ refresh_markup_fc refresh_markup; /* Reconstruit la représentat° */ diff --git a/src/analysis/line.c b/src/analysis/line.c index 958efe3..332e88d 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -104,6 +104,8 @@ static void g_rendering_line_init(GRenderingLine *line) { GdkScreen *screen; /* Ecran d'application */ PangoFontDescription *desc; /* Description de la police */ + LinesMainOwner i; /* Boucle de parcours */ + static PangoContext *context = NULL; /* Contexte graphique Pango */ DL_LIST_ITEM_INIT(&line->link); @@ -118,7 +120,8 @@ static void g_rendering_line_init(GRenderingLine *line) } - line->layout = pango_layout_new(context); + for (i = 0; i < LMO_COUNT; i++) + line->layout[i] = pango_layout_new(context); line->get_bin_len = NULL; line->refresh_markup = NULL; @@ -401,6 +404,7 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const * x1 = abscisse de la zone de rendu (texte). * * y = ordonnée de la zone de rendu. * * h = hauteur réservée pour la ligne. * +* owner = support effectif final des lignes de code. * * * * Description : Procède à l'initialisation des bases d'une représentation. * * * @@ -410,11 +414,11 @@ static GdkPixbuf *g_rendering_line_render_icon(const GRenderingLine *line, const * * ******************************************************************************/ -void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h) +void g_rendering_line_draw(GRenderingLine *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h, LinesMainOwner owner) { GdkPixbuf *pixbuf; /* Données utiles au dessin */ - gdk_draw_layout(drawable, gc, x1, y, line->layout); + gdk_draw_layout(drawable, gc, x1, y, line->layout[owner]); if (line->to != NULL) pixbuf = g_rendering_line_render_icon(line, "gtk-bold", GTK_ICON_SIZE_MENU); @@ -559,6 +563,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen * * * Paramètres : lines = liste de lignes de représentation à actualiser. * * last = dernière élément imposé du parcours ou NULL. * +* owner = support effectif des lignes pour l'appelant. * * * * Description : Met à jour le nombre d'octets maximal par instruction. * * * @@ -568,7 +573,7 @@ GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *lines, const GRen * * ******************************************************************************/ -void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine *last) +void g_rendering_line_update_bin_len(GRenderingLine *lines, GRenderingLine *last, LinesMainOwner owner) { GRenderingLine *iter; /* Boucle de parcours */ off_t bin_len; /* Taille d'instruction */ @@ -586,8 +591,8 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine lines_list_for_each(iter, lines) { - iter->max_bin_len = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0); - iter->refresh_markup(iter); + iter->max_bin_len[owner] = (bin_len > 0 ? bin_len * 2 + (bin_len - 1) : 0); + iter->refresh_markup(iter, owner); if (iter == last) break; @@ -600,6 +605,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine * * * Paramètres : lines = liste de lignes de représentation à actualiser. * * last = dernière élément imposé du parcours ou NULL. * +* owner = support effectif final des lignes de code. * * width = largeur maximale des lignes. [OUT] * * height = hauteur maximale des lignes. [OUT] * * alone = hauteur d'une seule ligne. [OUT] * @@ -612,7 +618,7 @@ void g_rendering_line_update_bin_len(GRenderingLine *lines, const GRenderingLine * * ******************************************************************************/ -void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, int *width, int *height, int *alone) +void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last, LinesMainOwner owner, int *width, int *height, int *alone) { GRenderingLine *iter; /* Boucle de parcours */ int w; /* Largeur de l'objet actuelle */ @@ -624,7 +630,7 @@ void g_rendering_line_get_size(GRenderingLine *lines, const GRenderingLine *last lines_list_for_each(iter, lines) { - pango_layout_get_pixel_size(iter->layout, &w, &h); + pango_layout_get_pixel_size(iter->layout[owner], &w, &h); *width = MAX(*width, w); *height += h; @@ -660,7 +666,11 @@ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *lines, const GRenderi lines_list_for_each(result, lines) { - pango_layout_get_pixel_size(result->layout, NULL, &h); + /** + * Comme toutes les dispositions ont la même hauteur, + * on utilise la première... + */ + pango_layout_get_pixel_size(result->layout[0], NULL, &h); if (*y < h) break; else *y -= h; diff --git a/src/analysis/line.h b/src/analysis/line.h index e06c53c..981cf90 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -34,6 +34,20 @@ +/* Support principal de lignes */ +typedef enum _LinesMainOwner +{ + LMO_BLOCK, /* Unique bloc de code */ + LMO_GRAPH, /* Graphique de blocs de code */ + + LMO_COUNT + +} LinesMainOwner; + + + + + /* Définitions des types de ligne */ typedef enum _RenderingLineType { @@ -114,7 +128,7 @@ bool g_rendering_line_has_destination(const GRenderingLine *); GRenderingLine *g_rendering_line_get_destination(const GRenderingLine *, InstructionLinkType *); /* Procède à l'initialisation des bases d'une représentation. */ -void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint); +void g_rendering_line_draw(GRenderingLine *, GdkDrawable *, GdkGC *, gint, gint, gint, gint, LinesMainOwner); @@ -131,10 +145,10 @@ void g_rendering_line_insert_into_lines(GRenderingLine **, GRenderingLine *, boo GRenderingLine *g_rendering_line_get_next_iter(GRenderingLine *, const GRenderingLine *, const GRenderingLine *); /* Met à jour le nombre d'octets maximal par instruction. */ -void g_rendering_line_update_bin_len(GRenderingLine *, const GRenderingLine *); +void g_rendering_line_update_bin_len(GRenderingLine *, GRenderingLine *, LinesMainOwner); /* Fournit les dimensions de lignes de représentation. */ -void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, int *, int *, int *); +void g_rendering_line_get_size(GRenderingLine *, const GRenderingLine *, LinesMainOwner, int *, int *, int *); /* Recherche une ligne d'après sa position à l'écran. */ GRenderingLine *g_rendering_line_find_by_y(GRenderingLine *, const GRenderingLine *, gdouble *); diff --git a/src/analysis/line_code.c b/src/analysis/line_code.c index 5ca3623..84ab36c 100644 --- a/src/analysis/line_code.c +++ b/src/analysis/line_code.c @@ -61,7 +61,7 @@ static void g_code_line_init(GCodeLine *); void g_code_line_get_binary_len(GCodeLine *, off_t *); /* Met à jour la ligne de représentation de code. */ -void g_code_line_refresh_markup(GCodeLine *); +void g_code_line_refresh_markup(GCodeLine *, LinesMainOwner); @@ -140,7 +140,8 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen) /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * +* Paramètres : line = ligne de représentation à actualiser. * +* owner = support effectif final des lignes de code. * * * * Description : Met à jour la ligne de représentation de code. * * * @@ -150,7 +151,7 @@ void g_code_line_get_binary_len(GCodeLine *line, off_t *blen) * * ******************************************************************************/ -void g_code_line_refresh_markup(GCodeLine *line) +void g_code_line_refresh_markup(GCodeLine *line, LinesMainOwner owner) { size_t len; /* Taille du contenu */ char *content; /* Contenu réellement imprimé */ @@ -159,6 +160,7 @@ void g_code_line_refresh_markup(GCodeLine *line) char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser #1 */ char *buffer2; /* Zone tampon à utiliser #2 */ const uint8_t *exe_content; /* Contenu binaire global */ + const off_t *max_bin_len; /* Taille de ligne max/globale */ char *bin_code; /* Tampon du code binaire */ off_t k; /* Boucle de parcours #2 */ off_t j; /* Boucle de parcours #1 */ @@ -214,8 +216,9 @@ void g_code_line_refresh_markup(GCodeLine *line) if (line->options->show_code) { exe_content = get_exe_content(line->options->format, NULL); + max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner]; - bin_code = (char *)calloc(G_RENDERING_LINE(line)->max_bin_len + 1, sizeof(char)); + bin_code = (char *)calloc(*max_bin_len + 1, sizeof(char)); k = 0; @@ -227,7 +230,7 @@ void g_code_line_refresh_markup(GCodeLine *line) k += snprintf(&bin_code[j * (2 + 1)], 3, "%02hhx", exe_content[bin_offset + j]); } - for (; k < G_RENDERING_LINE(line)->max_bin_len; k++) + for (; k < *max_bin_len; k++) snprintf(&bin_code[k], 2, " "); if (line->options->show_address) len += strlen("\t"); @@ -259,7 +262,7 @@ void g_code_line_refresh_markup(GCodeLine *line) content = (char *)realloc(content, len * sizeof(char)); strcat(content, "</tt>"); - pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len - 1); + pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1); free(content); diff --git a/src/analysis/line_comment.c b/src/analysis/line_comment.c index 1d37613..331bd19 100644 --- a/src/analysis/line_comment.c +++ b/src/analysis/line_comment.c @@ -58,7 +58,7 @@ static void g_comment_line_class_init(GCommentLineClass *); static void g_comment_line_init(GCommentLine *); /* Met à jour la ligne de représentation de commentaires. */ -void g_comment_line_refresh_markup(GCommentLine *); +void g_comment_line_refresh_markup(GCommentLine *, LinesMainOwner); @@ -112,7 +112,8 @@ static void g_comment_line_init(GCommentLine *line) /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * +* Paramètres : line = ligne de représentation à actualiser. * +* owner = support effectif final des lignes de code. * * * * Description : Met à jour la ligne de représentation de commentaires. * * * @@ -122,11 +123,12 @@ static void g_comment_line_init(GCommentLine *line) * * ******************************************************************************/ -void g_comment_line_refresh_markup(GCommentLine *line) +void g_comment_line_refresh_markup(GCommentLine *line, LinesMainOwner owner) { size_t len; /* Taille du contenu */ char *content; /* Contenu réellement imprimé */ char buffer[CODE_BUFFER_LEN]; /* Zone tampon à utiliser */ + const off_t *max_bin_len; /* Taille de ligne max/globale */ size_t clen; /* Taille du commentaire */ len = strlen("<tt>") + 1; @@ -176,8 +178,10 @@ void g_comment_line_refresh_markup(GCommentLine *line) if (line->options->show_code) { + max_bin_len = &G_RENDERING_LINE(line)->max_bin_len[owner]; + clen = (line->options->show_address ? strlen("\t") : 0); - clen += G_RENDERING_LINE(line)->max_bin_len; + clen += *max_bin_len; content = (char *)realloc(content, (len + clen) * sizeof(char)); @@ -187,9 +191,9 @@ void g_comment_line_refresh_markup(GCommentLine *line) len += strlen("\t"); } - memset(&content[len - 1], G_RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ', - G_RENDERING_LINE(line)->max_bin_len); - len += G_RENDERING_LINE(line)->max_bin_len; + memset(&content[len - 1], + G_RENDERING_LINE(line)->type == RLT_PROTOTYPE ? '-' : ' ', *max_bin_len); + len += *max_bin_len; content[len - 1] = '\0'; @@ -221,7 +225,7 @@ void g_comment_line_refresh_markup(GCommentLine *line) content = (char *)realloc(content, len * sizeof(char)); strcat(content, "</tt>"); - pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len - 1); + pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len - 1); free(content); diff --git a/src/analysis/line_prologue.c b/src/analysis/line_prologue.c index 74b5642..16876af 100644 --- a/src/analysis/line_prologue.c +++ b/src/analysis/line_prologue.c @@ -57,7 +57,7 @@ static void g_prologue_line_class_init(GPrologueLineClass *); static void g_prologue_line_init(GPrologueLine *); /* Met à jour la ligne de représentation de prologue. */ -void g_prologue_line_refresh_markup(GPrologueLine *); +void g_prologue_line_refresh_markup(GPrologueLine *, LinesMainOwner); @@ -113,7 +113,8 @@ static void g_prologue_line_init(GPrologueLine *line) /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * +* Paramètres : line = ligne de représentation à actualiser. * +* owner = support effectif final des lignes de code. * * * * Description : Met à jour la ligne de représentation de prologue. * * * @@ -123,7 +124,7 @@ static void g_prologue_line_init(GPrologueLine *line) * * ******************************************************************************/ -void g_prologue_line_refresh_markup(GPrologueLine *line) +void g_prologue_line_refresh_markup(GPrologueLine *line, LinesMainOwner owner) { size_t len; /* Taille du contenu */ char *content; /* Contenu réellement imprimé */ @@ -136,7 +137,7 @@ void g_prologue_line_refresh_markup(GPrologueLine *line) snprintf(content, len + 1, "<b><span foreground='#003300'>; %s</span></b>", line->comment); - pango_layout_set_markup(G_RENDERING_LINE(line)->layout, content, len); + pango_layout_set_markup(G_RENDERING_LINE(line)->layout[owner], content, len); free(content); diff --git a/src/gtkext/gtkblockview.c b/src/gtkext/gtkblockview.c index cfd4ee0..f0ee0dd 100644 --- a/src/gtkext/gtkblockview.c +++ b/src/gtkext/gtkblockview.c @@ -41,6 +41,8 @@ struct _GtkBlockView { GtkBinView parent; /* A laisser en premier */ + LinesMainOwner owner; /* Support final des lignes */ + bool show_vaddress; /* Affichage des adresses ? */ bool show_code; /* Affichage du code brut ? */ @@ -114,17 +116,30 @@ static void gtk_block_view_destroy(GtkObject *object); +/* Détermine le type du composant d'affichage en block. */ G_DEFINE_TYPE(GtkBlockView, gtk_block_view, GTK_TYPE_BIN_VIEW) +/****************************************************************************** +* * +* Paramètres : owner = support effectif des lignes au final. * +* * +* Description : Crée un nouveau composant pour l'affichage en block. * +* * +* Retour : Composant GTK créé. * +* * +* Remarques : - * +* * +******************************************************************************/ - -GtkWidget * gtk_block_view_new(void) +GtkWidget * gtk_block_view_new(LinesMainOwner owner) { GtkBlockView *result; result = gtk_type_new(gtk_block_view_get_type()); + result->owner = owner; + return GTK_WIDGET(result); } @@ -387,7 +402,7 @@ gtk_block_view_paint(GtkBlockView *view) { g_rendering_line_draw(iter, GDK_DRAWABLE(widget->window), GTK_BIN_VIEW(view)->gc, MARGIN_SPACE, 2 * MARGIN_SPACE + view->line_height, - y, view->line_height); + y, view->line_height, view->owner); y += view->line_height; @@ -513,7 +528,8 @@ static void gtk_block_view_set_rendering_lines(GtkBlockView *view, GRenderingLin G_CALLBACK(gtk_block_view_update_margin), view); } - g_rendering_line_update_bin_len(GTK_BIN_VIEW(view)->lines, GTK_BIN_VIEW(view)->last); + g_rendering_line_update_bin_len(GTK_BIN_VIEW(view)->lines, + GTK_BIN_VIEW(view)->last, view->owner); gtk_block_view_recompute_size_request(view); @@ -540,7 +556,9 @@ void gtk_block_view_recompute_size_request(GtkBlockView *view) int width; /* Largeur de l'objet actuelle */ int height; /* Hauteur de l'objet actuelle */ - g_rendering_line_get_size(GTK_BIN_VIEW(view)->lines, GTK_BIN_VIEW(view)->last, + g_rendering_line_get_size(GTK_BIN_VIEW(view)->lines, + GTK_BIN_VIEW(view)->last, + view->owner, &width, &height, &view->line_height); gtk_widget_set_size_request(GTK_WIDGET(view), diff --git a/src/gtkext/gtkblockview.h b/src/gtkext/gtkblockview.h index d56ed95..43561b1 100644 --- a/src/gtkext/gtkblockview.h +++ b/src/gtkext/gtkblockview.h @@ -51,11 +51,11 @@ typedef struct _GtkBlockViewClass GtkBlockViewClass; -/* Détermine le type du composant d'affichage en blockique. */ +/* Détermine le type du composant d'affichage en block. */ GType gtk_block_view_get_type(void); -/* Crée un nouveau composant pour l'affichage en blockique. */ -GtkWidget *gtk_block_view_new(void); +/* Crée un nouveau composant pour l'affichage en block. */ +GtkWidget *gtk_block_view_new(LinesMainOwner); diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c index d060f69..03693d5 100644 --- a/src/gtkext/gtkgraphview.c +++ b/src/gtkext/gtkgraphview.c @@ -241,7 +241,7 @@ static void gtk_graph_view_set_rendering_lines(GtkGraphView *view, GRenderingLin view->childs = (GtkBinView **)calloc(2, sizeof(GtkBinView *)); view->childs_count = 2; - view->childs[0] = GTK_BIN_VIEW(gtk_block_view_new()); + view->childs[0] = GTK_BIN_VIEW(gtk_block_view_new(LMO_GRAPH)); gtk_widget_show(GTK_WIDGET(view->childs[0])); gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->childs[0]), 50, 50); @@ -256,7 +256,7 @@ static void gtk_graph_view_set_rendering_lines(GtkGraphView *view, GRenderingLin printf("mainl : %p\n", mainl); - view->childs[1] = GTK_BIN_VIEW(gtk_block_view_new()); + view->childs[1] = GTK_BIN_VIEW(gtk_block_view_new(LMO_GRAPH)); gtk_widget_show(GTK_WIDGET(view->childs[1])); gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->childs[1]), 100, 450); @@ -405,7 +405,7 @@ static GtkBinView **gtk_graph_view_load_nodes(openida_binary *binary, GRendering { result = (GtkBinView **)realloc(result, ++(*count) * sizeof(GtkBinView *)); - result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new()); + result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new(LMO_GRAPH)); gtk_widget_show(GTK_WIDGET(result[*count - 1])); gtk_bin_view_show_border(result[*count - 1], true); @@ -422,7 +422,7 @@ static GtkBinView **gtk_graph_view_load_nodes(openida_binary *binary, GRendering { result = (GtkBinView **)realloc(result, ++(*count) * sizeof(GtkBinView *)); - result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new()); + result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new(LMO_GRAPH)); gtk_widget_show(GTK_WIDGET(result[*count - 1])); gtk_bin_view_show_border(result[*count - 1], true); @@ -438,7 +438,7 @@ static GtkBinView **gtk_graph_view_load_nodes(openida_binary *binary, GRendering { result = (GtkBinView **)realloc(result, ++(*count) * sizeof(GtkBinView *)); - result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new()); + result[*count - 1] = GTK_BIN_VIEW(gtk_block_view_new(LMO_GRAPH)); gtk_widget_show(GTK_WIDGET(result[*count - 1])); gtk_bin_view_show_border(result[*count - 1], true); diff --git a/src/project.c b/src/project.c index 0e6f0a7..d1b7225 100644 --- a/src/project.c +++ b/src/project.c @@ -108,7 +108,7 @@ loaded_binary *load_openida_binary(openida_binary *binary) { default: /* GCC ! */ case BVW_BLOCK: - view = gtk_block_view_new(); + view = gtk_block_view_new(LMO_BLOCK); break; case BVW_GRAPH: view = gtk_graph_view_new(); |