diff options
Diffstat (limited to 'src/glibext/gbuffersegment.c')
-rw-r--r-- | src/glibext/gbuffersegment.c | 222 |
1 files changed, 194 insertions, 28 deletions
diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index d25d728..8e7613f 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -36,6 +36,9 @@ +/* -------------------- NATURE DE BASE POUR UN FRAGMENT DE TEXTE -------------------- */ + + /* Propriétés de rendu */ typedef struct _rendering_color_t @@ -105,8 +108,6 @@ struct _GBufferSegment rendering_pattern_t *pattern; /* Propriétés du rendu */ - SegRenderingStyle style; /* Apparence du segment */ - rendering_color_t cache_bg; /* Fond d'impression */ rendering_color_t alt_fg; /* Couleur d'impression bis */ const rendering_color_t *used_fg; /* Couleur d'impression utile */ @@ -144,6 +145,25 @@ static void g_buffer_segment_prepare(GBufferSegment *, size_t); + +/* -------------------- GESTION OPTIMALE D'UNE LISTE DE CONTENUS -------------------- */ + + +/* Liste identifiant un ensemble de segments */ +struct _segcnt_list +{ + fnv64_t *hashes; /* Empreinte pour comparaisons */ + size_t count; /* Nommbre de ces empreintes */ + +}; + + + +/* ---------------------------------------------------------------------------------- */ +/* NATURE DE BASE POUR UN FRAGMENT DE TEXTE */ +/* ---------------------------------------------------------------------------------- */ + + /* Détermine le type du fragment de caractères aux propriétés communes. */ G_DEFINE_TYPE(GBufferSegment, g_buffer_segment, G_TYPE_OBJECT); @@ -360,15 +380,13 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si result = g_object_new(G_TYPE_BUFFER_SEGMENT, NULL); result->text = strndup(text, length); - result->hash = fnv_64a_hash(text); + result->hash = fnv_64a_hash(result->text); class = G_BUFFER_SEGMENT_GET_CLASS(result); result->pattern = &class->patterns[type]; g_buffer_segment_prepare(result, length); - g_buffer_segment_set_style(result, SRS_CLASSIC); - return result; } @@ -702,9 +720,12 @@ bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ct /****************************************************************************** * * * Paramètres : segment = fragment de texte à manipuler. * -* style = style de rendu pour le segment. * +* cairo = contexte graphique à utiliser pour les pinceaux. * +* x = abscisse du point d'impression (à maj). [OUT] * +* y = ordonnée du point d'impression. * +* list = liste de contenus à mettre en évidence. * * * -* Description : Module l'apparence finale du composant. * +* Description : Imprime le fragment de texte représenté. * * * * Retour : - * * * @@ -712,10 +733,14 @@ bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ct * * ******************************************************************************/ -void g_buffer_segment_set_style(GBufferSegment *segment, SegRenderingStyle style) +void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gint y, const segcnt_list *list) { - segment->style = style; + bool selected; /* Marquer une sélection ? */ + cairo_font_extents_t extents; + + + /* switch (style) { default: @@ -734,34 +759,28 @@ void g_buffer_segment_set_style(GBufferSegment *segment, SegRenderingStyle style break; } + */ -} + segment->used_fg = &segment->pattern->foreground; -/****************************************************************************** -* * -* Paramètres : segment = fragment de texte à manipuler. * -* cairo = contexte graphique à utiliser pour les pinceaux. * -* x = abscisse du point d'impression (à maj). [OUT] * -* y = ordonnée du point d'impression. * -* * -* Description : Imprime le fragment de texte représenté. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ -void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gint y) -{ + selected = selection_list_has_segment_content(list, segment); - cairo_font_extents_t extents; + if (selected) + { + segment->cache_bg.color.red = 0.5; + segment->cache_bg.color.green = 0.5; + segment->cache_bg.color.blue = 0.5; + + segment->used_fg = &segment->alt_fg; + + } /* Fond du texte */ - if (segment->style != SRS_CLASSIC) + if (selected) { cairo_set_source_rgb(cairo, segment->cache_bg.color.red, @@ -935,3 +954,150 @@ void g_buffer_segment_export(const GBufferSegment *segment, buffer_export_contex } } + + + +/* ---------------------------------------------------------------------------------- */ +/* GESTION OPTIMALE D'UNE LISTE DE CONTENUS */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Initilise une liste de contenus de segments. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +segcnt_list *init_segment_content_list(void) +{ + segcnt_list *result; /* Structure à retourner */ + + result = (segcnt_list *)calloc(1, sizeof(segcnt_list)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de références de contenus à traiter. * +* * +* Description : Libère la mémoire occupée par une liste de contenus. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void exit_segment_content_list(segcnt_list *list) +{ + reset_segment_content_list(list); + + free(list); + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de références de contenus à manipuler. * +* * +* Description : Vide, si besoin est, une liste de contenus de segments. * +* * +* Retour : true si des éléments ont été purgés, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool reset_segment_content_list(segcnt_list *list) +{ + bool result; /* Bilan d'action à renvoyer */ + + result = (list->count > 0); + + if (list->hashes != NULL) + { + free(list->hashes); + list->hashes = NULL; + } + + list->count = 0; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de références de contenus à manipuler. * +* segment = fragment de texte à conservr. * +* * +* Description : Marque le contenu d'un segment comme remarquable. * +* * +* Retour : true si la liste a été complétée, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool add_segment_content_to_selection_list(segcnt_list *list, const GBufferSegment *segment) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + + static const char white_list[] = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + result = false; + + for (i = 0; i < (sizeof(white_list) - 1) && !result; i++) + result = (strchr(segment->text, white_list[i]) != NULL); + + if (result) + { + list->hashes = (fnv64_t *)realloc(list->hashes, ++list->count * sizeof(fnv64_t)); + + list->hashes[list->count - 1] = segment->hash; + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de références de contenus à consulter. * +* segment = fragment de texte à comparer. * +* * +* Description : Indique si le contenu d'un segment est notable ou non. * +* * +* Retour : true si le segment a un contenu présent dans la sélection. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool selection_list_has_segment_content(const segcnt_list *list, const GBufferSegment *segment) +{ + bool result; /* Bilan à retourner */ + size_t i; /* Boucle de parcours */ + + result = false; + + for (i = 0; i < list->count && !result; i++) + result = (cmp_fnv_64a(list->hashes[i], segment->hash) == 0); + + return result; + +} |