diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2009-04-05 01:17:39 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2009-04-05 01:17:39 (GMT) |
commit | 193565c98b3c8df5c18f6f305871d60e2dd88e3b (patch) | |
tree | ff78567a274a5de1340c19b18bb690d27fd87d85 /src/analysis | |
parent | 4ad9e532a78401f787f0a8a6742095512b520488 (diff) |
Managed double linked lists in a more powerful way.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@56 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/line.c | 148 | ||||
-rw-r--r-- | src/analysis/line.h | 23 |
2 files changed, 107 insertions, 64 deletions
diff --git a/src/analysis/line.c b/src/analysis/line.c index 62acb8e..21f0fd5 100644 --- a/src/analysis/line.c +++ b/src/analysis/line.c @@ -53,7 +53,7 @@ typedef void (* refresh_markup_fc) (rendering_line *); /* Ligne de représentation générique */ struct _rendering_line { - DL_LIST_ITEM; + DL_LIST_ITEM(link); /* Maillon de liste chaînée */ uint64_t offset; /* Position en mémoire/physique*/ @@ -73,6 +73,12 @@ struct _rendering_line #define RENDERING_LINE(l) ((rendering_line *)l) +#define lines_list_next_iter(iter, head) dl_list_next_iter(iter, head, rendering_line, link) +#define lines_list_add_tail(new, head) dl_list_add_tail(new, head, rendering_line, link) +#define lines_list_splice_before(pos, head1, head2) dl_list_splice_before(pos, head1, head2, rendering_line, link) +#define lines_list_for_each(pos, head) dl_list_for_each(pos, head, rendering_line, link) + + /* Procède à l'initialisation des bases d'une représentation. */ void init_rendering_line(rendering_line *); @@ -158,7 +164,7 @@ void refresh_code_markup(code_line *); void init_rendering_line(rendering_line *line) { - DL_LIST_ITEM_INIT(DLL_CAST(line)); + DL_LIST_ITEM_INIT(&line->link); line->layout = gtk_widget_create_pango_layout(mywid, NULL); @@ -246,7 +252,7 @@ RenderingLineFlag get_rendering_line_flags(const rendering_line *line) void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) { - dl_list_add_tail(DLL_CAST(line), (dl_list_item **)lines); + lines_list_add_tail(line, lines); } @@ -268,9 +274,8 @@ void add_line_to_rendering_lines(rendering_line **lines, rendering_line *line) void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *line, bool first) { rendering_line *iter; /* Boucle de parcours */ - rendering_line *next; /* Prochaine ligne parcourue */ - dl_list_for_each_safe(iter, DLL_HCAST(lines), next, rendering_line *) + lines_list_for_each(iter, *lines) { if (first && iter->offset >= line->offset) break; else if (!first) @@ -281,12 +286,12 @@ void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *li } if (iter == NULL) - dl_list_add_tail(line, DLL_HCAST(lines)); + lines_list_add_tail(line, lines); else { if (first) - dl_list_insert_before(line, iter, DLL_HCAST(lines)); + lines_list_splice_before(iter, lines, line); else /* TODO */; } @@ -307,11 +312,11 @@ void insert_line_into_rendering_lines(rendering_line **lines, rendering_line *li * * ******************************************************************************/ -rendering_line *find_offset_in_rendering_lines(const rendering_line **lines, uint64_t offset) +rendering_line *find_offset_in_rendering_lines(rendering_line *lines, uint64_t offset) { rendering_line *result; - dl_list_for_each(result, DLL_HCAST(lines), rendering_line *) + lines_list_for_each(result, lines) if (result->offset == offset) break; return result; @@ -319,13 +324,17 @@ rendering_line *find_offset_in_rendering_lines(const rendering_line **lines, uin } - /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * -* blen = longueur maximale à mettre à jour. [OUT] * +* Paramètres : line = adresse de la structure à représenter. * +* drawable = support de rendu pour le dessin. * +* gc = contexte graphique à utiliser. * +* x0 = abscisse de la zone de rendu (marge). * +* x1 = abscisse de la zone de rendu (texte). * +* y = ordonnée de la zone de rendu. * +* h = hauteur réservée pour la ligne. * * * -* Description : Met à jour le nombre d'octets maximal par instruction. * +* Description : Procède à l'initialisation des bases d'une représentation. * * * * Retour : - * * * @@ -333,43 +342,67 @@ rendering_line *find_offset_in_rendering_lines(const rendering_line **lines, uin * * ******************************************************************************/ -void get_rendering_line_binary_len(rendering_line *line, off_t *blen) +void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h) { - if (line->get_bin_len != NULL) - line->get_bin_len(line, blen); + GdkPixbuf *pixbuf; /* Données utiles au dessin */ + + gdk_draw_layout(drawable, gc, x1, y, line->layout); + + if (line->flags & RLF_ENTRY_POINT) + pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL); + + else pixbuf = NULL; + + if (pixbuf != NULL) + { + gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y, + gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), + GDK_RGB_DITHER_NORMAL, 0, 0); + + g_object_unref(pixbuf); + + } } + +/* ---------------------------------------------------------------------------------- */ +/* TRAITEMENT DES LIGNES PAR GROUPE */ +/* ---------------------------------------------------------------------------------- */ + + /****************************************************************************** * * -* Paramètres : line = ligne de représentation à actualiser. * -* blen = longueur maximale à prendre en compte. * +* Paramètres : line = liste de lignes de représentation à actualiser. * +* : iter = position actuelle dans la liste. * * * -* Description : Prend en compte le nombre d'octets maximal par instruction. * +* Description : Fournit l'élement suivant un autre pour un parcours. * * * -* Retour : - * +* Retour : Elément suivant ou NULL si aucun. * * * * Remarques : - * * * ******************************************************************************/ -void set_rendering_line_max_binary_len(rendering_line *line, off_t blen) +rendering_line *g_rendering_line_get_next_iter(rendering_line *lines, const rendering_line *iter) { - line->max_bin_len = blen * 2 + (blen - 1); + rendering_line *result; /* Elément suivant à renvoyer */ + + if (iter == NULL) iter = lines; - line->refresh_markup(line); + result = lines_list_next_iter(iter, lines); + + return result; } /****************************************************************************** * * -* Paramètres : line = adresse de la structure à représenter. * -* width = largeur maximale des lignes à compléter. * -* height = hauteur maximale des lignes à compléter. * +* Paramètres : line = liste de lignes de représentation à actualiser. * * * -* Description : Fournit les dimensions d'une ligne par rapport à d'autres. * +* Description : Met à jour le nombre d'octets maximal par instruction. * * * * Retour : - * * * @@ -377,30 +410,34 @@ void set_rendering_line_max_binary_len(rendering_line *line, off_t blen) * * ******************************************************************************/ -void get_rendering_line_size(rendering_line *line, int *width, int *height) +void g_rendering_lines_update_bin_len(rendering_line *lines) { - int w; /* Largeur de l'objet actuelle */ - int h; /* Hauteur de l'objet actuelle */ + rendering_line *iter; /* Boucle de parcours */ + off_t bin_len; /* Taille d'instruction */ - pango_layout_get_pixel_size(line->layout, &w, &h); + bin_len = 0; - *width = MAX(*width, w); - *height += h; + lines_list_for_each(iter, lines) + if (iter->get_bin_len != NULL) + iter->get_bin_len(iter, &bin_len); + + lines_list_for_each(iter, lines) + { + iter->max_bin_len = bin_len * 2 + (bin_len - 1); + iter->refresh_markup(iter); + } } /****************************************************************************** * * -* Paramètres : line = adresse de la structure à représenter. * -* drawable = support de rendu pour le dessin. * -* gc = contexte graphique à utiliser. * -* x0 = abscisse de la zone de rendu (marge). * -* x1 = abscisse de la zone de rendu (texte). * -* y = ordonnée de la zone de rendu. * -* h = hauteur réservée pour la ligne. * +* Paramètres : lines = liste de lignes de représentation à actualiser. * +* width = largeur maximale des lignes. [OUT] * +* height = hauteur maximale des lignes. [OUT] * +* alone = hauteur d'une seule ligne. [OUT] * * * -* Description : Procède à l'initialisation des bases d'une représentation. * +* Description : Fournit les dimensions de lignes de représentation. * * * * Retour : - * * * @@ -408,24 +445,25 @@ void get_rendering_line_size(rendering_line *line, int *width, int *height) * * ******************************************************************************/ -void draw_rendering_line(rendering_line *line, GdkDrawable *drawable, GdkGC *gc, gint x0, gint x1, gint y, gint h) +void g_rendering_lines_get_size(rendering_line *lines, int *width, int *height, int *alone) { - GdkPixbuf *pixbuf; /* Données utiles au dessin */ - - gdk_draw_layout(drawable, gc, x1, y, line->layout); - - if (line->flags & RLF_ENTRY_POINT) - pixbuf = gtk_widget_render_icon(mywid, "gtk-go-forward", GTK_ICON_SIZE_MENU, NULL); + rendering_line *iter; /* Boucle de parcours */ + int w; /* Largeur de l'objet actuelle */ + int h; /* Hauteur de l'objet actuelle */ - else pixbuf = NULL; + *width = 0; + *height = 0; + *alone = 0; - if (pixbuf != NULL) + lines_list_for_each(iter, lines) { - gdk_draw_pixbuf(drawable, gc, pixbuf, 0, 0, x0, y, - gdk_pixbuf_get_width(pixbuf), gdk_pixbuf_get_height(pixbuf), - GDK_RGB_DITHER_NORMAL, 0, 0); + pango_layout_get_pixel_size(iter->layout, &w, &h); - g_object_unref(pixbuf); + *width = MAX(*width, w); + *height += h; + + if (iter == lines) + *alone = h; } @@ -528,7 +566,7 @@ rendering_line *create_comment_line(uint64_t offset, RenderingLineType type, con { comment_line *result; /* Structure à retourner */ - result = (prologue_line *)calloc(1, sizeof(prologue_line)); + result = (comment_line *)calloc(1, sizeof(comment_line)); init_rendering_line(RENDERING_LINE(result)); diff --git a/src/analysis/line.h b/src/analysis/line.h index bb628b6..abb2757 100644 --- a/src/analysis/line.h +++ b/src/analysis/line.h @@ -88,21 +88,26 @@ void add_line_to_rendering_lines(rendering_line **, rendering_line *); void insert_line_into_rendering_lines(rendering_line **, rendering_line *, bool); /* Recherche une ligne d'après sa position en mémoire/physique. */ -rendering_line *find_offset_in_rendering_lines(const rendering_line **, uint64_t); +rendering_line *find_offset_in_rendering_lines(rendering_line *, uint64_t); -/* Met à jour la nombre d'octets maximale par instruction. */ -void get_rendering_line_binary_len(rendering_line *, off_t *); +/* Procède à l'initialisation des bases d'une représentation. */ +void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint, gint, gint); -/* Prend en compte le nombre d'octets maximal par instruction. */ -void set_rendering_line_max_binary_len(rendering_line *, off_t); -/* Fournit les dimensions d'une ligne par rapport à d'autres. */ -void get_rendering_line_size(rendering_line *, int *, int *); -/* Procède à l'initialisation des bases d'une représentation. */ -void draw_rendering_line(rendering_line *, GdkDrawable *, GdkGC *, gint, gint, gint, gint); +/* ------------------------ TRAITEMENT DES LIGNES PAR GROUPE ------------------------ */ + + +/* Fournit l'élement suivant un autre pour un parcours. */ +rendering_line *g_rendering_line_get_next_iter(rendering_line *, const rendering_line *); + +/* Met à jour le nombre d'octets maximal par instruction. */ +void g_rendering_lines_update_bin_len(rendering_line *); + +/* Fournit les dimensions de lignes de représentation. */ +void g_rendering_lines_get_size(rendering_line *, int *, int *, int *); |