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); | 
