diff options
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; | 
