summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-02-25 21:57:42 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-02-25 21:57:42 (GMT)
commit4724b73c5161140222cab3c61bb5b3d0c8dde360 (patch)
treed341f43bacdad465ddae8c8b6c076a573c53e43d /src/glibext
parent9ff8702e5c51c7916e239caee13b974dccff6413 (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.c53
-rw-r--r--src/glibext/gcodebuffer.h2
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);