diff options
Diffstat (limited to 'src/glibext/gbuffersegment.c')
-rw-r--r-- | src/glibext/gbuffersegment.c | 95 |
1 files changed, 93 insertions, 2 deletions
diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index 6e862ad..5125631 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -28,6 +28,9 @@ #include <string.h> +#include "../common/fnv1a.h" + + /* Utilisation du champ pixel des couleurs cachées */ #define COLOR_NOT_SET 0 @@ -40,10 +43,16 @@ struct _GBufferSegment GObject parent; /* A laisser en premier */ char *text; /* Texte brut conservé */ + fnv64_t hash; /* Empreinte pour comparaisons */ PangoAttrList *attribs; /* Propriétés du rendu */ - GdkColor cache_fg; /* Couleur d'impression */ + SegRenderingStyle style; /* Apparence du segment */ + + GdkColor cache_bg; /* Fond d'impression */ + GdkColor cache_fg; /* Couleur d'impression #1 */ + GdkColor cache_alt_fg; /* Couleur d'impression #2 */ + GdkColor *cache_used_fg; /* Couleur d'impression utile */ PangoGlyphString *glyphs; /* Caractères traités */ PangoFont *font; /* Police utilisée à l'analyse */ @@ -380,6 +389,7 @@ GBufferSegment *g_buffer_segment_new(PangoContext *context, PangoAttrList *attri //result = g_new(GBufferSegment, 1); result->text = strdup(text); + result->hash = fnv_64a_hash(text); result->attribs = pango_attr_list_ref(attribs); @@ -387,6 +397,34 @@ GBufferSegment *g_buffer_segment_new(PangoContext *context, PangoAttrList *attri g_buffer_segment_cache_colors(result); + g_buffer_segment_set_style(result, SRS_CLASSIC); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : segment = fragment de texte à consulter. * +* ref = segment de référence servant à la comparaison. * +* * +* Description : Indique si les textes de deux segments sont identiques. * +* * +* Retour : Bilan de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_buffer_segment_compare(const GBufferSegment *segment, const GBufferSegment *ref) +{ + bool result; /* Bilan à retourner */ + + result = cmp_fnv_64a(segment->hash, ref->hash); + + result &= (strcmp(segment->text, ref->text) == 0); + return result; } @@ -472,6 +510,49 @@ void g_buffer_segment_cache_colors(GBufferSegment *segment) /****************************************************************************** * * +* Paramètres : segment = fragment de texte à manipuler. * +* style = style de rendu pour le segment. * +* * +* Description : Module l'apparence finale du composant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_buffer_segment_set_style(GBufferSegment *segment, SegRenderingStyle style) +{ + segment->style = style; + + switch (style) + { + default: + case SRS_CLASSIC: + segment->cache_used_fg = &segment->cache_fg; + break; + + case SRS_HIGHLIGHT_SAME: + + segment->cache_bg.red = 0; + segment->cache_bg.green = 0; + segment->cache_bg.blue = 65535; + + segment->cache_alt_fg.red = 65535 - segment->cache_fg.red; + segment->cache_alt_fg.green = 65535 - segment->cache_fg.green; + segment->cache_alt_fg.blue = 65535 - segment->cache_fg.blue; + + segment->cache_used_fg = &segment->cache_alt_fg; + + break; + + } + +} + + +/****************************************************************************** +* * * Paramètres : segment = fragment de texte à manipuler. * * drawable = surface de rendu où travailler. * * gc = contexte graphique à utiliser pour les pinceaux. * @@ -488,10 +569,20 @@ void g_buffer_segment_cache_colors(GBufferSegment *segment) void g_buffer_segment_draw(GBufferSegment *segment, GdkDrawable *drawable, GdkGC *gc, gint *x, gint y) { + /* Fond du texte */ + if (segment->style != SRS_CLASSIC) + { + gdk_gc_set_rgb_fg_color(gc, &segment->cache_bg); + + gdk_draw_rectangle(drawable, gc, TRUE, + *x, y, segment->logical.width, segment->logical.height); + + } + /* Couleur d'impression */ if (segment->cache_fg.pixel == COLOR_SET) - gdk_gc_set_rgb_fg_color(gc, &segment->cache_fg); + gdk_gc_set_rgb_fg_color(gc, segment->cache_used_fg); /* Impression du texte */ |