diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-05-11 21:33:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-05-11 21:33:36 (GMT) |
commit | d2861533cc53fbcc217048bafebf34b1f70ba3aa (patch) | |
tree | 28c847a8093761fcaa0916be54445328d843096d /src/glibext/gbuffercache.c | |
parent | 6c9e1b5f7ee0915036d47b83f1e34b87b44b1723 (diff) |
Updated the API for buffer caches.
Diffstat (limited to 'src/glibext/gbuffercache.c')
-rw-r--r-- | src/glibext/gbuffercache.c | 111 |
1 files changed, 44 insertions, 67 deletions
diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index 08ca020..d918a5d 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -29,6 +29,7 @@ #include <stdlib.h> +#include "gbuffercache-int.h" #include "chrysamarshal.h" @@ -36,31 +37,6 @@ /* --------------------- FONCTIONS AUXILIAIRES DE MANIPULATIONS --------------------- */ -/* Informations rattachées à la génération d'une ligne */ -typedef struct _generator_link -{ - GLineGenerator *instance; /* Fournisseur de contenu */ - size_t repeat; /* Compteur de successions */ - -} generator_link; - -/* Suivi interne de l'état d'une ligne */ -typedef struct _cache_info -{ - union - { - generator_link generator; /* Générateur unique */ - generator_link *generators; /* Liste de générateurs */ - }; - size_t count; /* Taille de cette liste */ - - GBufferLine *line; /* Ligne en place ou NULL */ - - BufferLineFlags extra_flags; /* Propriétés supplémentaires */ - -} cache_info; - - /* Gros verrou global pour alléger les structures... */ G_LOCK_DEFINE_STATIC(_line_update); @@ -97,37 +73,6 @@ static void reset_cache_info_line(cache_info *); /* -------------------------- TAMPON POUR CODE DESASSEMBLE -------------------------- */ -/* Tampon pour gestion de lignes optimisée (instance) */ -struct _GBufferCache -{ - GObject parent; /* A laisser en premier */ - - GBinContent *content; /* Contenu binaire global */ - - cache_info *lines; /* Liste des lignes intégrées */ - size_t count; /* Quantité en cache */ - size_t used; /* Quantité utilisée */ - - GWidthTracker *tracker; /* Suivi des largeurs */ - -}; - -/* Tampon pour gestion de lignes optimisée (classe) */ -struct _GBufferCacheClass -{ - GObjectClass parent; /* A laisser en premier */ - - gint line_height; /* Hauteur maximale des lignes */ - gint left_margin; /* Marge gauche + espace */ - gint text_pos; /* Début d'impression du code */ - - /* Signaux */ - - void (* size_changed) (GBufferCache *, bool, size_t, size_t); - -}; - - /* Taille des allocations de masse */ #define LINE_ALLOC_BULK 1000 @@ -388,7 +333,7 @@ static void get_cache_info_cursor(const cache_info *info, size_t index, gint x, else generator = &info->generators[0]; - g_line_generator_compute_cursor(generator->instance, x, index, generator->repeat, cursor); + *cursor = g_line_generator_compute_cursor(generator->instance, x, index, generator->repeat); } @@ -586,6 +531,12 @@ static void g_buffer_cache_class_init(GBufferCacheClass *class) static void g_buffer_cache_init(GBufferCache *cache) { + cache->content = NULL; + + cache->lines = NULL; + cache->count = 0; + cache->used = 0; + cache->tracker = g_width_tracker_new(cache); } @@ -723,6 +674,32 @@ gint g_buffer_cache_get_line_height(const GBufferCache *cache) * * * Paramètres : cache = tampon de lignes à consulter. * * * +* Description : Indique l'éventuel contenu binaire associé au cache. * +* * +* Retour : Eventuel contenu renseigné ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBinContent *g_buffer_cache_get_content(const GBufferCache *cache) +{ + GBinContent *result; /* Contenu à retourner */ + + result = cache->content; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : cache = tampon de lignes à consulter. * +* * * Description : Fournit la taille réservée pour la marge gauche. * * * * Retour : Largeur en pixels. * @@ -895,14 +872,14 @@ void g_buffer_cache_insert_at(GBufferCache *cache, size_t index, GLineGenerator if (!before && !after) { - g_line_generator_compute_cursor(generator, 0, index, 0, &gen_cursor); + gen_cursor = g_line_generator_compute_cursor(generator, 0, index, 0); get_cache_info_cursor(&cache->lines[index], index, 0, &line_cursor); ret = g_line_cursor_compare(gen_cursor, line_cursor); - g_object_unref(G_OBJECT(gen_cursor)); g_object_unref(G_OBJECT(line_cursor)); + g_object_unref(G_OBJECT(gen_cursor)); assert(ret == 0); @@ -1264,8 +1241,6 @@ void g_buffer_cache_extend_with(GBufferCache *cache, size_t count, GLineGenerato cache->used = count; - g_object_unref(G_OBJECT(generator)); - if (added > 0) { g_width_tracker_update_added(cache->tracker, index, added); @@ -1297,8 +1272,6 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max) size_t j; /* Boucle de parcours #2 */ size_t removed; /* Nombre de retraits effectués*/ - assert(max <= cache->used); - for (i = max; i < cache->used; i++) { info = &cache->lines[i]; @@ -1319,12 +1292,12 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max) } - removed = cache->used - max; + if (max < cache->used) + { + removed = cache->used - max; - cache->used = max; + cache->used = max; - if (removed > 0) - { g_width_tracker_update_deleted(cache->tracker, max, max + removed - 1); g_signal_emit_by_name(cache, "size-changed", false, max, removed); @@ -1378,6 +1351,8 @@ BufferLineFlags g_buffer_cache_get_line_flags(const GBufferCache *cache, size_t const generator_link *generator; /* Générateur retenu */ size_t i; /* Boucle de parcours */ + // TODO : check lock + assert(index < cache->used); info = &cache->lines[index]; @@ -1650,6 +1625,8 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf GLineCursor *next; /* Localisation suivante */ int ret; /* Bilan de comparaison */ + // TODO : check lock + assert(start < cache->used); result = start; |