diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-07-14 11:48:54 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-07-14 11:48:54 (GMT) |
commit | bea3337108fa5b59b8f6fdbe016d5ed6a6300bc6 (patch) | |
tree | 517abf46e76b2a6cc8ddb3ac2dec5ffacc28a128 /src/glibext/gbuffercache.c | |
parent | e0af5dc9c01a5b9649c68ec63109ba98b6843329 (diff) |
Begun to switch to abstract locations in internal rendering buffers.
Diffstat (limited to 'src/glibext/gbuffercache.c')
-rw-r--r-- | src/glibext/gbuffercache.c | 96 |
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; } |