diff options
Diffstat (limited to 'src/glibext/gbufferline.c')
-rw-r--r-- | src/glibext/gbufferline.c | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c new file mode 100644 index 0000000..bfb77bb --- /dev/null +++ b/src/glibext/gbufferline.c @@ -0,0 +1,359 @@ + +/* OpenIDA - Outil d'analyse de fichiers binaires + * gbufferline.c - représentation de fragments de texte en ligne + * + * Copyright (C) 2010 Cyrille Bagard + * + * This file is part of OpenIDA. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "gbufferline.h" + + + + +#include <malloc.h> /* FIXME : à virer */ + + + +/* Informations sur le contenu d'une colonne */ +typedef struct _buffer_line_column +{ + GBufferSegment **segments; + size_t count; + + int max_width; /* Largeur max. de l'espace */ + +} buffer_line_column; + + + +/* Réinitialise une colonne de ligne. */ +static void reset_column(buffer_line_column *); + +/* Fournit la quantité de pixels requise pour l'impression. */ +static gint get_column_width(buffer_line_column *); + +/* Ajoute un fragment de texte à une colonne de ligne. */ +static void add_segment_to_column(buffer_line_column *, GBufferSegment *); + +/* Imprime le contenu d'une colonne de ligne de texte. */ +static void draw_segments_of_column(buffer_line_column *, GdkDrawable *, GdkGC *, gint, gint); + + + + +/* Représentation de fragments de texte en ligne (instance) */ +struct _GBufferLine +{ + GObject parent; /* A laisser en premier */ + + buffer_line_column columns[BLC_COUNT]; /* Répartition du texte */ + +}; + +/* Représentation de fragments de texte en ligne (classe) */ +struct _GBufferLineClass +{ + GObjectClass parent; /* A laisser en premier */ + +}; + + +/* Procède à l'initialisation d'une classe de représentation. */ +static void g_buffer_line_class_init(GBufferLineClass *); + +/* Procède à l'initialisation d'une représentation de fragments. */ +static void g_buffer_line_init(GBufferLine *); + + + + + + + +/****************************************************************************** +* * +* Paramètres : column = colonne de ligne à mettre à jour. * +* * +* Description : Réinitialise une colonne de ligne. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void reset_column(buffer_line_column *column) +{ + column->max_width = -1; + +} + + +/****************************************************************************** +* * +* Paramètres : column = colonne de ligne à consulter. * +* * +* Description : Fournit la quantité de pixels requise pour l'impression. * +* * +* Retour : Largeur requise par la colonne, en pixel. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gint get_column_width(buffer_line_column *column) +{ + size_t i; + + if (column->max_width == -1) + { + column->max_width = 0; + + for (i = 0; i < column->count; i++) + column->max_width += g_buffer_segment_get_width(column->segments[i]); + + } + + return column->max_width; + +} + + +/****************************************************************************** +* * +* Paramètres : column = colonne de ligne à venir compléter. * +* segment = fragment de texte à ajouter à la colonne. * +* * +* Description : Ajoute un fragment de texte à une colonne de ligne. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void add_segment_to_column(buffer_line_column *column, GBufferSegment *segment) +{ + + /* FIXME : à remplacer */ + + + column->segments = (GBufferSegment **)realloc(column->segments, ++column->count * sizeof(GBufferSegment *)); + + + column->segments[column->count - 1] = segment; + + +} + + +/****************************************************************************** +* * +* Paramètres : column = colonne de ligne de texte à manipuler. * +* drawable = surface de rendu où travailler. * +* gc = contexte graphique à utiliser pour les pinceaux. * +* x_init = abscisse du point d'impression de départ. * +* y = ordonnée du point d'impression. * +* * +* Description : Imprime le contenu d'une colonne de ligne de texte. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void draw_segments_of_column(buffer_line_column *column, GdkDrawable *drawable, GdkGC *gc, gint x_init, gint y) +{ + gint x; + size_t i; + + x = x_init; + + for (i = 0; i < column->count; i++) + g_buffer_segment_draw(column->segments[i], drawable, gc, &x, y); + +} + + + + + + + + + + + + + + + + + + + + + + + +/* Détermine le type de la représentation de fragments de texte en ligne. */ +G_DEFINE_TYPE(GBufferLine, g_buffer_line, G_TYPE_OBJECT); + + + +/****************************************************************************** +* * +* Paramètres : class = classe de composant GTK à initialiser. * +* * +* Description : Procède à l'initialisation d'une classe de représentation. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_line_class_init(GBufferLineClass *class) +{ + +} + + +/****************************************************************************** +* * +* Paramètres : line = composant GTK à initialiser. * +* * +* Description : Procède à l'initialisation d'une représentation de fragments.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_buffer_line_init(GBufferLine *line) +{ + unsigned int i; /* Boucle de parcours */ + + for (i = 0; i < BLC_COUNT; i++) + reset_column(&line->columns[i]); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Crée une nouvelle représentation de fragments de texte. * +* * +* Retour : Composant GTK créé. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_buffer_line_new(void) +{ + GBufferLine *result; /* Composant à retourner */ + + result = g_object_new(G_TYPE_BUFFER_LINE, NULL); + //result = g_new0(GBufferLine, 1); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne à venir compléter. * +* index = index de la colonne visée par la procédure. * +* segment = fragment de texte à ajouter à la colonne. * +* * +* Description : Ajoute un fragment de texte à une colonne de ligne. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_line_add_segment(GBufferLine *line, BufferLineColumn index, GBufferSegment *segment) +{ + add_segment_to_column(&line->columns[index], segment); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne à venir compléter. * +* index = index de la colonne visée par la procédure. * +* * +* Description : Fournit la largeur requise pour une colonne de ligne donnée. * +* * +* Retour : Largeur en pixel requise. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gint g_buffer_line_get_width(GBufferLine *line, BufferLineColumn index) +{ + return get_column_width(&line->columns[index]); + +} + + +/****************************************************************************** +* * +* Paramètres : line = ligne de texte à manipuler. * +* drawable = surface de rendu où travailler. * +* gc = contexte graphique à utiliser pour les pinceaux.* +* max_widths = largeurs de colonne à respecter. * +* x_init = abscisse du point d'impression de départ. * +* y = ordonnée du point d'impression. * +* * +* Description : Imprime la ligne de texte représentée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_line_draw(GBufferLine *line, GdkDrawable *drawable, GdkGC *gc, const gint max_widths[BLC_COUNT], gint x_init, gint y) +{ + gint x; /* Point de départ d'impression*/ + unsigned int i; /* Boucle de parcours */ + + x = x_init; + + for (i = 0; i < BLC_COUNT; i++) + { + /* TODO : skip if... */ + + draw_segments_of_column(&line->columns[i], drawable, gc, x, y); + x += max_widths[i] + 23; + + } + +} |