summaryrefslogtreecommitdiff
path: root/src/analysis/line.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-04-05 01:17:39 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-04-05 01:17:39 (GMT)
commit193565c98b3c8df5c18f6f305871d60e2dd88e3b (patch)
treeff78567a274a5de1340c19b18bb690d27fd87d85 /src/analysis/line.c
parent4ad9e532a78401f787f0a8a6742095512b520488 (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/line.c')
-rw-r--r--src/analysis/line.c148
1 files changed, 93 insertions, 55 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));