diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferline.c | 136 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 2 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.c | 130 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.h | 51 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 72 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 5 |
6 files changed, 364 insertions, 32 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index 6b5ab18..54f5fb6 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -51,7 +51,6 @@ typedef struct _buffer_line_column } buffer_line_column; - /* Réinitialise une colonne de ligne. */ static void reset_column(buffer_line_column *); @@ -71,11 +70,14 @@ static GBufferSegment *get_segment_at(const buffer_line_column *, gint *, GdkScr static GBufferSegment *find_near_segment(const buffer_line_column *, GBufferSegment *, GdkScrollDirection, bool *); /* Met en surbrillance des segments similaires. */ -GSList *highlight_all_same_segments(const buffer_line_column *, GSList *, const GBufferSegment *); +static GSList *highlight_all_same_segments(const buffer_line_column *, GSList *, const GBufferSegment *); /* Imprime le contenu d'une colonne de ligne de texte. */ static void draw_segments_of_column(buffer_line_column *, cairo_t *, gint, gint); +/* Exporte la ligne de texte représentée. */ +static void export_segments_of_column(buffer_line_column *, buffer_export_context *, BufferExportType, int); + /* ---------------------------- GESTION DE LINE COMPLETE ---------------------------- */ @@ -313,7 +315,7 @@ static GBufferSegment *find_near_segment(const buffer_line_column *column, GBuff * * ******************************************************************************/ -GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *list, const GBufferSegment *ref) +static GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *list, const GBufferSegment *ref) { size_t i; /* Boucle de parcours */ @@ -347,8 +349,8 @@ GSList *highlight_all_same_segments(const buffer_line_column *column, GSList *li static void draw_segments_of_column(buffer_line_column *column, cairo_t *cairo, gint x_init, gint y) { - gint x; - size_t i; + gint x; /* Abscisse d'impression */ + size_t i; /* Boucle de parcours */ x = x_init; @@ -358,6 +360,59 @@ static void draw_segments_of_column(buffer_line_column *column, cairo_t *cairo, } +/****************************************************************************** +* * +* Paramètres : column = colonne de ligne de texte à manipuler. * +* ctx = éléments à disposition pour l'exportation. * +* type = type d'exportation attendue. * +* span = fusion de colonnes au sein des cellules ? * +* * +* Description : Exporte la ligne de texte représentée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void export_segments_of_column(buffer_line_column *column, buffer_export_context *ctx, BufferExportType type, int span) +{ + size_t i; /* Boucle de parcours */ + + switch (type) + { + case BET_HTML: + switch (span) + { + case 0: + break; + case 1: + dprintf(ctx->fd, "\t\t<TD>"); + break; + default: + if (span > 0) dprintf(ctx->fd, "\t\t<TD colspan=\"%d\">", span); + break; + } + break; + default: + break; + } + + for (i = 0; i < column->count; i++) + g_buffer_segment_export(column->segments[i], ctx, type); + + switch (type) + { + case BET_HTML: + if (span < 0 || span == 1) dprintf(ctx->fd, "</TD>\n"); + break; + default: + break; + } + +} + + /* ---------------------------------------------------------------------------------- */ /* GESTION DE LINE COMPLETE */ @@ -1117,16 +1172,12 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths } - /****************************************************************************** * * * Paramètres : line = ligne de texte à manipuler. * -* fd = flux ouvert en écriture. * +* ctx = éléments à disposition pour l'exportation. * * type = type d'exportation attendue. * -* phys = indique si les positions doivent être affichées. * -* virt = indique si les adresses doivent être affichées. * -* code = indique si le code binaire doit être affiché. * -* content = indique si le gros du contenu doit être affiché. * +* display = règles d'affichage des colonnes modulables. * * * * Description : Exporte la ligne de texte représentée. * * * @@ -1136,19 +1187,70 @@ void g_buffer_line_draw(GBufferLine *line, cairo_t *cairo, const gint max_widths * * ******************************************************************************/ -void g_buffer_line_export(GBufferLine *line, int fd, BufferExportType type, bool phys, bool virt, bool code, bool content) +void g_buffer_line_export(GBufferLine *line, buffer_export_context *ctx, BufferExportType type, const bool *display) { BufferLineColumn i; /* Boucle de parcours */ + int col_span; /* Fusion de colonnes ? */ + + switch (type) + { + case BET_HTML: + dprintf(ctx->fd, "\t<TR>\n"); + break; + default: + break; + } for (i = 0; i < BLC_COUNT; i++) { - if (i == BLC_PHYSICAL && !phys) continue; - if (i == BLC_VIRTUAL && !virt) continue; - if (i == BLC_BINARY && !code) continue; - if (!(i == BLC_PHYSICAL || i == BLC_VIRTUAL || i == BLC_BINARY) && !content) continue; + if (i < BLC_DISPLAY && !display[i]) continue; + + switch (type) + { + case BET_TEXT: + if (i > 0) dprintf(ctx->fd, ctx->sep); + break; + default: + break; + } + + /** + * Pour la signification des différentes valeurs assignées, + * se référer au code de export_segments_of_column(). + * + * En gros : + * - 1 = rien de spécial. + * - >1 = il s'agit de la première cellule fusionnée de la ligne. + * - 0 = fusion déjà faite, on ne peut que rajouter du contenu dedans. + * - <1 = il s'agit de la dernière cellule fusionnée de la ligne. + * + * On considère qu'une fusion ne peut pas se réaliser sur la dernière + * cellule uniquement (ce qui a du sens : c'est inutile). + */ - dprintf(fd, "TODO\n"); + if (i < line->merge_start) + col_span = 1; + else if (i == line->merge_start) + col_span = BLC_COUNT - i; + + else + col_span = ((i + 1) == BLC_COUNT ? -1 : 0); + + export_segments_of_column(&line->columns[i], ctx, type, col_span); + + } + + switch (type) + { + case BET_TEXT: + dprintf(ctx->fd, "\n"); + break; + case BET_HTML: + dprintf(ctx->fd, "</TR>\n"); + break; + default: + break; } } diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index f6ee171..9b35f0b 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -130,7 +130,7 @@ void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn); void g_buffer_line_draw(GBufferLine *, cairo_t *, const gint [BLC_COUNT], gint, gint, const bool *); /* Exporte la ligne de texte représentée. */ -void g_buffer_line_export(GBufferLine *, int, BufferExportType, bool, bool, bool, bool); +void g_buffer_line_export(GBufferLine *, buffer_export_context *, BufferExportType, const bool *); diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index 3d9e5a9..1ebb543 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -200,7 +200,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) void define_rendering_pattern(GtkStyleContext *ctx, const char *name, rendering_pattern_t *pattern) { - GdkRGBA *tmp_color; + GdkRGBA *tmp_color; /* Description d'une couleur */ PangoFontDescription *font_desc; /* Description d'une police */ gtk_style_context_save(ctx); @@ -219,10 +219,10 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) case PANGO_STYLE_NORMAL: pattern->slant = CAIRO_FONT_SLANT_NORMAL; break; - case PANGO_STYLE_OBLIQUE: + case PANGO_STYLE_ITALIC: pattern->slant = CAIRO_FONT_SLANT_ITALIC; break; - case PANGO_STYLE_ITALIC: + case PANGO_STYLE_OBLIQUE: pattern->slant = CAIRO_FONT_SLANT_OBLIQUE; break; } @@ -303,7 +303,7 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL); - result->text = strdup(text); + result->text = strndup(text, length); result->hash = fnv_64a_hash(text); class = G_BUFFER_SEGMENT_GET_CLASS(result); @@ -640,3 +640,125 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin *x += segment->x_advance; } + + +/****************************************************************************** +* * +* Paramètres : ctx = éléments à disposition pour l'exportation. * +* type = type d'exportation attendue. * +* * +* Description : Exporte tous les styles utilisés par des segments. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_segment_export_style(buffer_export_context *ctx, BufferExportType type) +{ + GBufferSegment *dummy; /* Segment servant de sujet */ + GBufferSegmentClass *class; /* Classe des segments */ + size_t i; /* Boucle de parcours */ + const rendering_pattern_t *pattern; /* Modèle à transcrire */ + + dummy = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL); + class = G_BUFFER_SEGMENT_GET_CLASS(dummy); + + for (i = 0; i < RTT_COUNT; i++) + { + pattern = &class->patterns[i]; + + switch (type) + { + case BET_HTML: + + dprintf(ctx->fd, ".%s {\n", _segment_names[i]); + + if (pattern->foreground.has_color) + dprintf(ctx->fd, "\tcolor: #%02hhx%02hhx%02hhx;\n", + (unsigned char)(pattern->foreground.color.red * 255), + (unsigned char)(pattern->foreground.color.green * 255), + (unsigned char)(pattern->foreground.color.blue * 255)); + + switch (pattern->slant) + { + case CAIRO_FONT_SLANT_ITALIC: + dprintf(ctx->fd, "\tfont-style: italic;\n"); + break; + case CAIRO_FONT_SLANT_OBLIQUE: + dprintf(ctx->fd, "\tfont-style: oblique;\n"); + break; + default: + dprintf(ctx->fd, "\tfont-style: normal;\n"); + break; + } + + switch (pattern->weight) + { + case CAIRO_FONT_WEIGHT_BOLD: + dprintf(ctx->fd, "\tfont-weight: bold;\n"); + break; + default: + dprintf(ctx->fd, "\tfont-weight: normal;\n"); + break; + } + + dprintf(ctx->fd, "}\n"); + + break; + + default: + break; + + } + + } + + g_object_unref(G_OBJECT(dummy)); + +} + + +/****************************************************************************** +* * +* Paramètres : segment = fragment de texte à manipuler. * +* ctx = éléments à disposition pour l'exportation. * +* type = type d'exportation attendue. * +* * +* Description : Exporte le fragment de texte représenté. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_segment_export(const GBufferSegment *segment, buffer_export_context *ctx, BufferExportType type) +{ + GBufferSegmentClass *class; /* Classe des segments */ + size_t index; /* Indice du modèle de rendu */ + + switch (type) + { + case BET_HTML: + class = G_BUFFER_SEGMENT_GET_CLASS(segment); + index = (segment->pattern - class->patterns); + dprintf(ctx->fd, "<SPAN class=\"%s\">", _segment_names[index]); + break; + default: + break; + } + + dprintf(ctx->fd, "%s", segment->text); + + switch (type) + { + case BET_HTML: + dprintf(ctx->fd, "</SPAN>"); + break; + default: + break; + } + +} diff --git a/src/glibext/gbuffersegment.h b/src/glibext/gbuffersegment.h index f5cd4b2..10ae374 100644 --- a/src/glibext/gbuffersegment.h +++ b/src/glibext/gbuffersegment.h @@ -91,15 +91,6 @@ typedef enum _SegRenderingStyle } SegRenderingStyle; -/* Types d'exportation */ -typedef enum _BufferExportType -{ - BET_TEXT, - - BET_COUNT - -} BufferExportType; - /* Fragment de caractères aux propriétés communes (instance) */ typedef struct _GBufferSegment GBufferSegment; @@ -136,6 +127,48 @@ void g_buffer_segment_set_style(GBufferSegment *, SegRenderingStyle); /* Imprime le fragment de texte représenté. */ void g_buffer_segment_draw(GBufferSegment *, cairo_t *, gint *, gint); +/* Types d'exportation */ +typedef enum _BufferExportType +{ + BET_TEXT, /* Exportation en texte brut */ + BET_HTML, /* Exportation en HTML */ + + BET_COUNT + +} BufferExportType; + +/* Elements sur lesquels une exportation peut s'appuyer */ +typedef struct _buffer_export_context +{ + union + { + int fd; /* Flux ouvert en écriture */ + + }; + + union + { + /* BET_TEXT */ + const char *sep; /* Séparation entre colonnes */ + + /* BET_HTML */ + struct + { + const char *font_name; /* Police d'impression */ + const char *bg_color; /* Fond du tableau HTML */ + + }; + + }; + +} buffer_export_context; + +/* Exporte tous les styles utilisés par des segments. */ +void g_buffer_segment_export_style(buffer_export_context *, BufferExportType); + +/* Exporte le fragment de texte représenté. */ +void g_buffer_segment_export(const GBufferSegment *, buffer_export_context *, BufferExportType); + #endif /* _GLIBEXT_GBUFFERSEGMENT_H */ diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index eab418e..d13c9d6 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -1572,6 +1572,78 @@ void g_buffer_view_draw(const GBufferView *view, cairo_t *cr, gint fake_x, gint /****************************************************************************** * * +* Paramètres : view = visualisation à représenter. * +* ctx = éléments à disposition pour l'exportation. * +* type = type d'exportation attendue. * +* display = règles d'affichage des colonnes modulables. * +* * +* Description : Exporte le contenu du tampon de code désassemblé. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_view_export(const GBufferView *view, buffer_export_context *ctx, BufferExportType type, const bool *display) +{ + size_t start; /* Première ligne visée */ + size_t end; /* Dernière ligne avant limite */ + GBufferLine **lines; /* Liste des lignes à traiter */ + size_t i; /* Boucle de parcours */ + + start = g_code_buffer_get_index_from_address(view->buffer, view->start, true); + end = g_code_buffer_get_index_from_address(view->buffer, view->end, false); + + lines = view->buffer->lines; + + switch (type) + { + case BET_HTML: + dprintf(ctx->fd, "<HTML>\n"); + dprintf(ctx->fd, "<HEAD>\n"); + dprintf(ctx->fd, "\t<META http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"/>\n"); + dprintf(ctx->fd, "</HEAD>\n"); + dprintf(ctx->fd, "<BODY>\n"); + dprintf(ctx->fd, "<STYLE type=\"text/css\">\n"); + dprintf(ctx->fd, "TABLE {\n"); + dprintf(ctx->fd, "\tbackground-color: %s;\n", ctx->bg_color); + dprintf(ctx->fd, "\tborder: 0px;\n"); + dprintf(ctx->fd, "\tfont-family: %s;\n", ctx->font_name); + dprintf(ctx->fd, "}\n"); + dprintf(ctx->fd, "TD {\n"); + dprintf(ctx->fd, "\tborder: 0px;\n"); + dprintf(ctx->fd, "\tpadding-left: 8px;\n"); + dprintf(ctx->fd, "\tpadding-right: 8px;\n"); + dprintf(ctx->fd, "}\n"); + g_buffer_segment_export_style(ctx, type); + dprintf(ctx->fd, "</STYLE>\n"); + dprintf(ctx->fd, "<TABLE>\n"); + break; + default: + break; + } + + if (view->buffer->used > 0) + for (i = start; i <= end; i++) + g_buffer_line_export(lines[i], ctx, type, display); + + switch (type) + { + case BET_HTML: + dprintf(ctx->fd, "</TABLE>\n"); + dprintf(ctx->fd, "</BODY>\n"); + dprintf(ctx->fd, "</HTML>\n"); + break; + default: + break; + } + +} + + +/****************************************************************************** +* * * Paramètres : view = visualisation à consulter. * * y = ordonnée comprise dans la ligne recherchée. * * idx = indice de la ligne trouvée ou NULL. [OUT] * diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index ece7c59..62b725c 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -82,7 +82,7 @@ void g_code_buffer_dec_indentation(GCodeBuffer *); typedef bool (* process_line_fc) (GCodeBuffer *, GBufferLine *, void *); /* Exporte dans un fichier le tampon de code désassemblé. */ -void g_buffer_code_scan(GCodeBuffer *, vmpa_t, vmpa_t, const char *, process_line_fc, void *); +void g_buffer_code_scan(GCodeBuffer *, vmpa_t, vmpa_t, const char *, process_line_fc, void *) __attribute__ ((deprecated)); @@ -143,6 +143,9 @@ void g_buffer_view_highlight_segments(GBufferView *, gint, gint); /* Imprime la visualisation du tampon de code désassemblé. */ void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_rectangle_int_t *, const bool *); +/* Exporte le contenu du tampon de code désassemblé. */ +void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferExportType, const bool *); + /* Fournit la ligne présente à une ordonnée donnée. */ GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); |