diff options
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 *); | 
