diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-07-01 22:20:38 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-07-01 22:20:38 (GMT) |
commit | b6893c7b85c34f7a3c65ac76bfd9d95b1c4ebf55 (patch) | |
tree | 5ce9e501c095e5906f6b1a349c82217d41b605f1 /src/analysis | |
parent | 176ad970db109523a3ac6d501b23608540d4a930 (diff) |
Made the lines to have different rendering widths depending on the views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@88 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-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 |
6 files changed, 65 insertions, 33 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); |