summaryrefslogtreecommitdiff
path: root/src/glibext/gbuffersegment.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/gbuffersegment.c')
-rw-r--r--src/glibext/gbuffersegment.c95
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 */