summaryrefslogtreecommitdiff
path: root/src/glibext/gbuffercache.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-14 11:48:54 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-14 11:48:54 (GMT)
commitbea3337108fa5b59b8f6fdbe016d5ed6a6300bc6 (patch)
tree517abf46e76b2a6cc8ddb3ac2dec5ffacc28a128 /src/glibext/gbuffercache.c
parente0af5dc9c01a5b9649c68ec63109ba98b6843329 (diff)
Begun to switch to abstract locations in internal rendering buffers.
Diffstat (limited to 'src/glibext/gbuffercache.c')
-rw-r--r--src/glibext/gbuffercache.c96
1 files changed, 65 insertions, 31 deletions
diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c
index 66ecf27..a64ec68 100644
--- a/src/glibext/gbuffercache.c
+++ b/src/glibext/gbuffercache.c
@@ -29,6 +29,7 @@
#include <stdlib.h>
+#include "gbinarycursor.h" // REMME
#include "chrysamarshal.h"
@@ -78,7 +79,7 @@ static void extend_cache_info(cache_info *, GLineGenerator *);
static void remove_from_cache_info(cache_info *, GLineGenerator *);
/* Retrouve l'emplacement correspondant à une position de ligne. */
-static void get_cache_info_addr(const cache_info *, size_t, gint, vmpa2t *);
+static void get_cache_info_cursor(const cache_info *, size_t, gint, GLineCursor **);
/* Suivit les variations du compteur de références d'une ligne. */
static void on_line_ref_toggle(cache_info *, GBufferLine *, gboolean);
@@ -352,10 +353,10 @@ static void remove_from_cache_info(cache_info *info, GLineGenerator *generator)
/******************************************************************************
* *
-* Paramètres : info = informations sur une ligne à venir consulter. *
-* index = indice de la ligne visée par la consultation. *
-* x = position géographique sur la ligne concernée. *
-* addr = adresse à renseigner. [OUT] *
+* Paramètres : info = informations sur une ligne à venir consulter. *
+* index = indice de la ligne visée par la consultation. *
+* x = position géographique sur la ligne concernée. *
+* cursor = emplacement à constituer. [OUT] *
* *
* Description : Retrouve l'emplacement correspondant à une position de ligne.*
* *
@@ -365,7 +366,7 @@ static void remove_from_cache_info(cache_info *info, GLineGenerator *generator)
* *
******************************************************************************/
-static void get_cache_info_addr(const cache_info *info, size_t index, gint x, vmpa2t *addr)
+static void get_cache_info_cursor(const cache_info *info, size_t index, gint x, GLineCursor **cursor)
{
const generator_link *generator; /* Générateur retenu */
@@ -374,7 +375,7 @@ static void get_cache_info_addr(const cache_info *info, size_t index, gint x, vm
else
generator = &info->generators[0];
- g_line_generator_compute_addr(generator->instance, x, addr, index, generator->repeat);
+ g_line_generator_compute_cursor(generator->instance, x, index, generator->repeat, cursor);
}
@@ -867,8 +868,9 @@ static size_t g_buffer_cache_compute_repetition(GBufferCache *cache, size_t inde
void g_buffer_cache_insert_at(GBufferCache *cache, size_t index, GLineGenerator *generator, bool before, bool after)
{
#ifndef NDEBUG
- vmpa2t gen_addr; /* Position du générateur */
- vmpa2t line_addr; /* Position de la ligne */
+ GLineCursor *gen_cursor; /* Position du générateur */
+ GLineCursor *line_cursor; /* Position de la ligne */
+ int ret; /* Bilan de comparaison */
#endif
size_t needed; /* Emplacements nécessaires */
size_t i; /* Boucle de parcours */
@@ -879,14 +881,19 @@ void g_buffer_cache_insert_at(GBufferCache *cache, size_t index, GLineGenerator
#ifndef NDEBUG
- g_line_generator_compute_addr(generator, 0, &gen_addr, index, 0);
+ g_line_generator_compute_cursor(generator, 0, index, 0, &gen_cursor);
+
+ get_cache_info_cursor(&cache->lines[index], index, 0, &line_cursor);
+
+ ret = g_line_cursor_compare(gen_cursor, line_cursor);
- get_cache_info_addr(&cache->lines[index], index, 0, &line_addr);
+ g_object_unref(G_OBJECT(gen_cursor));
+ g_object_unref(G_OBJECT(line_cursor));
///////////////////////////////////////
- if (cmp_vmpa(&gen_addr, &line_addr) != 0) return;
+ if (ret != 0) return;
- assert(cmp_vmpa(&gen_addr, &line_addr) == 0);
+ assert(ret == 0);
#endif
@@ -1282,10 +1289,10 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max)
/******************************************************************************
* *
-* Paramètres : cache = tampon de lignes à venir consulter. *
-* index = indice de la ligne visée par la consultation. *
-* x = position géographique sur la ligne concernée. *
-* addr = adresse à renseigner. [OUT] *
+* Paramètres : cache = tampon de lignes à venir consulter. *
+* index = indice de la ligne visée par la consultation. *
+* x = position géographique sur la ligne concernée. *
+* cursor = emplacement à constituer. [OUT] *
* *
* Description : Retrouve l'emplacement correspondant à une position de ligne.*
* *
@@ -1295,11 +1302,11 @@ void g_buffer_cache_truncate(GBufferCache *cache, size_t max)
* *
******************************************************************************/
-void g_buffer_cache_get_line_addr(const GBufferCache *cache, size_t index, gint x, vmpa2t *addr)
+void g_buffer_cache_get_line_cursor(const GBufferCache *cache, size_t index, gint x, GLineCursor **cursor)
{
assert(index < cache->used);
- get_cache_info_addr(&cache->lines[index], index, x, addr);
+ get_cache_info_cursor(&cache->lines[index], index, x, cursor);
}
@@ -1489,9 +1496,10 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s
size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2t *addr, bool first, size_t start, size_t end)
{
size_t result; /* Indice à retourner */
+ GLineCursor *___tmp;
cache_info *found; /* Eventuel élément trouvé */
- int find_containing_generator(const vmpa2t *a, const cache_info *i)
+ int find_containing_generator(const GLineCursor *c, const cache_info *i)
{
const generator_link *generator; /* Générateur retenu */
@@ -1500,12 +1508,17 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2
else
generator = &i->generators[0];
- return g_line_generator_contains_addr(generator->instance, addr,
- i - cache->lines, generator->repeat);
+ return g_line_generator_contains_cursor(generator->instance,
+ i - cache->lines, generator->repeat, c);
}
- found = (cache_info *)bsearch(addr, &cache->lines[start], end - start + 1,
+
+ ___tmp = g_binary_cursor_new();
+ g_binary_cursor_update(G_BINARY_CURSOR(___tmp), addr);
+
+
+ found = (cache_info *)bsearch(___tmp, &cache->lines[start], end - start + 1,
sizeof(cache_info), (__compar_fn_t)find_containing_generator);
if (found == NULL)
@@ -1523,7 +1536,7 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2
{
found = &cache->lines[result - 1];
- if (find_containing_generator(addr, found) != 0)
+ if (find_containing_generator(___tmp, found) != 0)
break;
}
@@ -1533,13 +1546,17 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2
{
found = &cache->lines[result + 1];
- if (find_containing_generator(addr, found) != 0)
+ if (find_containing_generator(___tmp, found) != 0)
break;
}
}
+
+ g_object_unref(G_OBJECT(___tmp));
+
+
return result;
}
@@ -1590,21 +1607,26 @@ size_t g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2t
size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, BufferLineFlags flag)
{
size_t result; /* Indice de ligne à retourner */
- vmpa2t start_addr; /* Localisation de départ */
+ GLineCursor *init; /* Localisation de départ */
size_t i; /* Boucle de parcours */
- vmpa2t addr; /* Localisation suivante */
+ GLineCursor *next; /* Localisation suivante */
+ int ret; /* Bilan de comparaison */
assert(start < cache->used);
result = start;
- get_cache_info_addr(&cache->lines[start], start, 0, &start_addr);
+ get_cache_info_cursor(&cache->lines[start], start, 0, &init);
for (i = start + 1; i < cache->used; i++)
{
- get_cache_info_addr(&cache->lines[i], i, 0, &addr);
+ get_cache_info_cursor(&cache->lines[i], i, 0, &next);
+
+ ret = g_line_cursor_compare(init, next);
+
+ g_object_unref(G_OBJECT(next));
- if (cmp_vmpa(&start_addr, &addr) != 0)
+ if (ret != 0)
break;
if ((g_buffer_cache_get_line_flags(cache, i) & flag) != 0)
@@ -1615,6 +1637,8 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf
}
+ g_object_unref(G_OBJECT(init));
+
return result;
}
@@ -1641,11 +1665,17 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf
bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmpa2t *addr, size_t first, size_t last, bool code, gint *x, gint *y)
{
bool result; /* Bilan à retourner */
+ GLineCursor *___tmp;
size_t index; /* Indice de correspondance */
gint lheight; /* Hauteur d'une ligne */
const cache_info *info; /* Infos sur une ligne donnée */
const generator_link *generator; /* Générateur retenu */
+
+ ___tmp = g_binary_cursor_new();
+ g_binary_cursor_update(G_BINARY_CURSOR(___tmp), addr);
+
+
index = _g_buffer_cache_find_index_by_addr(cache, addr, true, first, last);
result = (index < cache->used);
@@ -1672,7 +1702,7 @@ bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmp
else
generator = &info->generators[0];
- if (!g_line_generator_contains_addr(generator->instance, addr, index + 1, generator->repeat))
+ if (!g_line_generator_contains_cursor(generator->instance, index + 1, generator->repeat, ___tmp))
break;
*y += lheight;
@@ -1681,6 +1711,10 @@ bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmp
}
+
+ g_object_unref(G_OBJECT(___tmp));
+
+
return result;
}