diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferline.c | 35 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 3 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.c | 96 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.h | 3 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 2 |
5 files changed, 130 insertions, 9 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index bfb77bb..da08184 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -63,6 +63,7 @@ struct _GBufferLine GObject parent; /* A laisser en premier */ buffer_line_column columns[BLC_COUNT]; /* Répartition du texte */ + BufferLineColumn merge_start; /* Début de la zone globale */ }; @@ -250,11 +251,13 @@ static void g_buffer_line_class_init(GBufferLineClass *class) static void g_buffer_line_init(GBufferLine *line) { - unsigned int i; /* Boucle de parcours */ + BufferLineColumn i; /* Boucle de parcours */ - for (i = 0; i < BLC_COUNT; i++) + for (i = BLC_ADDRESS; i < BLC_COUNT; i++) reset_column(&line->columns[i]); + line->merge_start = BLC_COUNT; + } @@ -325,6 +328,26 @@ gint g_buffer_line_get_width(GBufferLine *line, BufferLineColumn index) /****************************************************************************** * * +* Paramètres : line = ligne à venir compléter. * +* start = début de la première (et unique) zone globale. * +* * +* Description : Définit la colonne à partir de laquelle la fusion opère. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start) +{ + line->merge_start = start; + +} + + +/****************************************************************************** +* * * Paramètres : line = ligne de texte à manipuler. * * drawable = surface de rendu où travailler. * * gc = contexte graphique à utiliser pour les pinceaux.* @@ -343,16 +366,18 @@ gint g_buffer_line_get_width(GBufferLine *line, BufferLineColumn index) 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 */ + BufferLineColumn i; /* Boucle de parcours */ x = x_init; - for (i = 0; i < BLC_COUNT; i++) + for (i = BLC_ADDRESS; i < BLC_COUNT; i++) { /* TODO : skip if... */ draw_segments_of_column(&line->columns[i], drawable, gc, x, y); - x += max_widths[i] + 23; + + if (i < line->merge_start) + x += max_widths[i] + 23; } diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h index 4113c28..d9e1edb 100644 --- a/src/glibext/gbufferline.h +++ b/src/glibext/gbufferline.h @@ -78,6 +78,9 @@ void g_buffer_line_add_segment(GBufferLine *, BufferLineColumn, GBufferSegment * /* Fournit la largeur requise pour une colonne de ligne donnée. */ gint g_buffer_line_get_width(GBufferLine *, BufferLineColumn); +/* Définit la colonne à partir de laquelle la fusion opère. */ +void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn); + /* Imprime la ligne de texte représentée. */ void g_buffer_line_draw(GBufferLine *, GdkDrawable *, GdkGC *, const gint [BLC_COUNT], gint, gint); diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index bcafa97..0714e9c 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -28,7 +28,9 @@ - +/* Utilisation du champ pixel des couleurs cachées */ +#define COLOR_NOT_SET 0 +#define COLOR_SET 1 /* Fragment de caractères aux propriétés communes (instance) */ @@ -36,6 +38,10 @@ struct _GBufferSegment { GObject parent; /* A laisser en premier */ + PangoAttrList *attribs; /* Propriétés du rendu */ + + GdkColor cache_fg; /* Couleur d'impression */ + PangoGlyphString *glyphs; /* Caractères traités */ PangoFont *font; /* Police utilisée à l'analyse */ @@ -176,6 +182,9 @@ static bool ascii_glyph_table_init(GBufferSegmentClass *class, PangoContext *con static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *context, PangoAttrList *attribs, const char *text, size_t length) { PangoGlyphString *glyphs; /* Caractères traités */ + bool must_use_pango; /* Passage par Pango obligé ? */ + PangoAttrIterator *iterator; /* Guide de parcours */ + PangoAttribute *attrib; /* Attribut générique */ GList *item_list; PangoItem *item; @@ -199,6 +208,29 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *cont + + + /* Existe-t-il des attributs particuliers ? */ + + must_use_pango = false; + + iterator = pango_attr_list_get_iterator(attribs); + + attrib = pango_attr_iterator_get(iterator, PANGO_ATTR_WEIGHT); + must_use_pango |= (attrib != NULL); + + pango_attr_iterator_destroy(iterator); + + if (must_use_pango) + goto not_ascii; + + + + + + + + /** * Petite astuce empruntée à Vim... * (cf. src/gui_gtk_x11.c, fonction gui_gtk2_draw_string()). @@ -229,6 +261,10 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *cont log_clusters[i] = i; } + segment->font = class->ascii_font; + + pango_glyph_string_extents(glyphs, class->ascii_font, NULL, &segment->logical); + goto next; not_ascii: @@ -243,7 +279,9 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *cont item = (PangoItem *)item_list->data; pango_shape(text, length, &item->analysis, glyphs); - //segment->font = item->analysis.font;/* TODO : ref ! */ + segment->font = item->analysis.font;/* TODO : ref ! */ + + pango_glyph_string_extents(glyphs, item->analysis.font, NULL, &segment->logical); next: @@ -252,7 +290,7 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, PangoContext *cont //pango_shape(text, length, &item->analysis, glyphs); - pango_glyph_string_extents(glyphs, class->ascii_font, NULL, &segment->logical); + //pango_glyph_string_extents(glyphs, class->ascii_font, NULL, &segment->logical); segment->logical.y /= PANGO_SCALE; segment->logical.width /= PANGO_SCALE; @@ -338,8 +376,11 @@ GBufferSegment *g_buffer_segment_new(PangoContext *context, PangoAttrList *attri result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL); //result = g_new(GBufferSegment, 1); + result->attribs = pango_attr_list_ref(attribs); + g_buffer_segment_prepare(result, context, attribs, text, length); + g_buffer_segment_cache_colors(result); return result; @@ -367,6 +408,46 @@ gint g_buffer_segment_get_width(const GBufferSegment *segment) /****************************************************************************** * * +* Paramètres : segment = fragment de texte à manipuler. * +* * +* Description : (Re)charge les couleurs à partir de la liste d'attributs. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_segment_cache_colors(GBufferSegment *segment) +{ + PangoAttrIterator *iterator; /* Guide de parcours */ + PangoAttribute *attrib; /* Attribut générique */ + PangoAttrColor *color_attrib; /* Propriété de couleur */ + + iterator = pango_attr_list_get_iterator(segment->attribs); + + /* Couleur d'impression */ + + attrib = pango_attr_iterator_get(iterator, PANGO_ATTR_FOREGROUND); + segment->cache_fg.pixel = (attrib != NULL ? COLOR_SET : COLOR_NOT_SET); + + if (segment->cache_fg.pixel == COLOR_SET) + { + color_attrib = (PangoAttrColor *)attrib; + + segment->cache_fg.red = color_attrib->color.red; + segment->cache_fg.green = color_attrib->color.green; + segment->cache_fg.blue = color_attrib->color.blue; + + } + + pango_attr_iterator_destroy(iterator); + +} + + +/****************************************************************************** +* * * Paramètres : segment = fragment de texte à manipuler. * * drawable = surface de rendu où travailler. * * gc = contexte graphique à utiliser pour les pinceaux. * @@ -383,7 +464,14 @@ gint g_buffer_segment_get_width(const GBufferSegment *segment) void g_buffer_segment_draw(GBufferSegment *segment, GdkDrawable *drawable, GdkGC *gc, gint *x, gint y) { - gdk_draw_glyphs(drawable, gc, G_BUFFER_SEGMENT_GET_CLASS(segment)->ascii_font, + /* Couleur d'impression */ + + if (segment->cache_fg.pixel == COLOR_SET) + gdk_gc_set_rgb_fg_color(gc, &segment->cache_fg); + + /* Impression du texte */ + + gdk_draw_glyphs(drawable, gc, segment->font, *x, y - segment->logical.y, segment->glyphs); *x += segment->logical.width; diff --git a/src/glibext/gbuffersegment.h b/src/glibext/gbuffersegment.h index 28338b9..5731415 100644 --- a/src/glibext/gbuffersegment.h +++ b/src/glibext/gbuffersegment.h @@ -57,6 +57,9 @@ GBufferSegment *g_buffer_segment_new(PangoContext *, PangoAttrList *, const char /* Fournit la quantité de pixels requise pour l'impression. */ gint g_buffer_segment_get_width(const GBufferSegment *); +/* (Re)charge les couleurs à partir de la liste d'attributs. */ +void g_buffer_segment_cache_colors(GBufferSegment *); + /* Imprime le fragment de texte représenté. */ void g_buffer_segment_draw(GBufferSegment *, GdkDrawable *, GdkGC *, gint *, gint); diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index fda2c01..75c2e94 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -461,6 +461,8 @@ void g_buffer_view_draw(const GBufferView *view, const GdkEventExpose *event, Gd last = first + (event->area.height / view->line_height); if (event->area.height % view->line_height > 0) last++; + last = MIN(last, view->buffer->used > 0 ? view->buffer->used - 1 : 0); + y = event->area.y - (real_y % view->line_height); |