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