diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-02-25 21:57:42 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-02-25 21:57:42 (GMT) |
commit | 4724b73c5161140222cab3c61bb5b3d0c8dde360 (patch) | |
tree | d341f43bacdad465ddae8c8b6c076a573c53e43d /src/glibext | |
parent | 9ff8702e5c51c7916e239caee13b974dccff6413 (diff) |
Provided tweaks about positions when looking for address coordinates.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@480 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gcodebuffer.c | 53 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 2 |
2 files changed, 36 insertions, 19 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index afad0f4..4b5378d 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -678,6 +678,9 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm { if ((index + 1) == buffer->used) break; + /* FIXME : vérifier que l'adresse est toujours celle recherchée ! */ + /* TODO : passer la recherche de code en option via argument ? */ + result = buffer->lines[++index]; } @@ -1756,6 +1759,7 @@ GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx) * addr = adresse à présenter à l'écran. * * x = position horizontale au sein du composant. [OUT] * * y = position verticale au sein du composant. [OUT] * +* code = s'arrête si possible à une ligne avec code. * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * @@ -1765,7 +1769,7 @@ GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t *idx) * * ******************************************************************************/ -bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr, gint *x, gint *y) +bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr, gint *x, gint *y, bool code) { bool result; /* Bilan à retourner */ gint lheight; /* Hauteur d'une ligne */ @@ -1784,24 +1788,37 @@ bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr first = g_code_buffer_get_index_from_address(view->buffer, view->start, true); last = g_code_buffer_get_index_from_address(view->buffer, view->end, false); - if (view->buffer->used > 0) - for (i = first; i <= last; i++) + for (i = first; i <= last; i++) + { + /** + * Si l'adresse recherchée est plus petite que l'adresse de départ, + * on va effectuer un parcours complet pour rien. + * + * On considère cependant que le seul cas où celà peut arriver + * est lorsque que des découpages en blocs sont impliqués. + * + * Les découpages conduisent alors à la formation de petites zones, + * rapides à parcourir. + */ + + range = g_buffer_line_get_range(view->buffer->lines[i]); + + result = mrange_contains_addr(range, addr); + if (result) break; + + *y += lheight; + + } + + if (result && code) + for (; i <= last; i++) { - /** - * Si l'adresse recherchée est plus petite que l'adresse de départ, - * on va effectuer un parcours complet pour rien. - * - * On considère cependant que le seul cas où celà peut arriver - * est lorsque que des découpages en blocs sont impliqués. - * - * Les découpages conduisent alors à la formation de petites zones, - * rapides à parcourir. - */ - - range = g_buffer_line_get_range(view->buffer->lines[i]); - - result = mrange_contains_addr(range, addr); - if (result) break; + if (g_buffer_line_get_flags(view->buffer->lines[i]) & BLF_HAS_CODE) break; + + if (i == last) break; + + range = g_buffer_line_get_range(view->buffer->lines[i + 1]); + if (!mrange_contains_addr(range, addr)) break; *y += lheight; diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index ddd45db..5fd4e7b 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -150,7 +150,7 @@ void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferEx GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *); /* Indique la position d'affichage d'une adresse donnée. */ -bool g_buffer_view_get_address_coordinates(GBufferView *, const vmpa2t *, gint *, gint *); +bool g_buffer_view_get_address_coordinates(GBufferView *, const vmpa2t *, gint *, gint *, bool); |