summaryrefslogtreecommitdiff
path: root/src/glibext/gwidthtracker.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext/gwidthtracker.c')
-rw-r--r--src/glibext/gwidthtracker.c102
1 files changed, 74 insertions, 28 deletions
diff --git a/src/glibext/gwidthtracker.c b/src/glibext/gwidthtracker.c
index 11ea0b1..10d01ab 100644
--- a/src/glibext/gwidthtracker.c
+++ b/src/glibext/gwidthtracker.c
@@ -41,6 +41,7 @@ typedef struct _common_metrics
size_t last; /* Dernier indice de portion */
line_width_summary summary; /* Compilation de largeurs */
+ bool cached; /* Mise en cache des calculs */
} common_metrics;
@@ -86,8 +87,11 @@ static size_t g_width_tracker_find_metrics(const GWidthTracker *, size_t);
/* Prend en compte une évolution du volume de lignes. */
static void g_width_tracker_update_ranges(GWidthTracker *, size_t, size_t);
+/* Réinitialise les largeurs requises par une portion de lignes.* */
+static void g_width_tracker_reset_widths(GWidthTracker *, size_t);
+
/* Recalcule les largeurs requises par une portion de lignes. */
-static void g_width_tracker_update_widths(GWidthTracker *, size_t);
+static const line_width_summary *g_width_tracker_get_up_to_date_widths(GWidthTracker *, size_t);
/* Calcule les largeurs requises par un ensemble de lignes. */
static void g_width_tracker_ensure_valid_required_widths(GWidthTracker *);
@@ -259,13 +263,13 @@ GWidthTracker *g_width_tracker_new_restricted(const GWidthTracker *template, siz
if (result->portions[0].first != first)
{
result->portions[0].first = first;
- g_width_tracker_update_widths(result, 0);
+ g_width_tracker_reset_widths(result, 0);
}
if (result->portions[result->count - 1].last != last)
{
result->portions[result->count - 1].last = last;
- g_width_tracker_update_widths(result, result->count - 1);
+ g_width_tracker_reset_widths(result, result->count - 1);
}
return result;
@@ -351,9 +355,9 @@ static void g_width_tracker_update_ranges(GWidthTracker *tracker, size_t start,
/******************************************************************************
* *
* Paramètres : tracker = gestionnaire de largeurs de lignes à mettre jour. *
-* index = indice de la portion à rafraîchir. *
+* index = indice de portion à marquer pour réinitialisation. *
* *
-* Description : Recalcule les largeurs requises par une portion de lignes. *
+* Description : Réinitialise les largeurs requises par une portion de lignes.*
* *
* Retour : - *
* *
@@ -361,12 +365,10 @@ static void g_width_tracker_update_ranges(GWidthTracker *tracker, size_t start,
* *
******************************************************************************/
-static void g_width_tracker_update_widths(GWidthTracker *tracker, size_t index)
+static void g_width_tracker_reset_widths(GWidthTracker *tracker, size_t index)
{
common_metrics *portion; /* Portion à actualiser */
- BufferLineColumn k; /* Boucle de parcours #1 */
- size_t i; /* Boucle de parcours #2 */
- GBufferLine *line; /* Ligne à manipuler */
+ BufferLineColumn k; /* Boucle de parcours */
assert(index < tracker->count);
@@ -374,25 +376,69 @@ static void g_width_tracker_update_widths(GWidthTracker *tracker, size_t index)
/* Réinitialisation globale ? */
- for (k = 0; k < BLC_COUNT && tracker->cached; k++)
- tracker->cached &= (tracker->summary.max_widths[k] != portion->summary.max_widths[k]);
+ if (portion->cached)
+ {
+ for (k = 0; k < BLC_COUNT && tracker->cached; k++)
+ tracker->cached &= (tracker->summary.max_widths[k] != portion->summary.max_widths[k]);
- tracker->cached &= (tracker->summary.merged_width != portion->summary.merged_width);
+ tracker->cached &= (tracker->summary.merged_width != portion->summary.merged_width);
+
+ }
/* Réinitialisation locale */
- memset(&portion->summary, 0, sizeof(line_width_summary));
+ portion->cached = false;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : tracker = gestionnaire de largeurs de lignes à mettre jour. *
+* index = indice de la portion à rafraîchir. *
+* *
+* Description : Recalcule les largeurs requises par une portion de lignes. *
+* *
+* Retour : Accès en lecture seule au résumé à jour. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static const line_width_summary *g_width_tracker_get_up_to_date_widths(GWidthTracker *tracker, size_t index)
+{
+ common_metrics *portion; /* Portion à actualiser */
+ size_t i; /* Boucle de parcours */
+ GBufferLine *line; /* Ligne à manipuler */
- /* Collecte */
+ assert(index < tracker->count);
- for (i = portion->first; i <= portion->last; i++)
+ portion = &tracker->portions[index];
+
+ if (!portion->cached)
{
- line = g_code_buffer_find_line_by_index(tracker->buffer, i);
+ /* Réinitialisation locale */
- g_buffer_line_collect_widths(line, &portion->summary);
+ memset(&portion->summary, 0, sizeof(line_width_summary));
+
+ /* Collecte */
+
+ for (i = portion->first; i <= portion->last; i++)
+ {
+ line = g_code_buffer_find_line_by_index(tracker->buffer, i);
+
+ g_buffer_line_collect_widths(line, &portion->summary);
+
+ }
+
+ /* Marquage pour mémoire */
+
+ portion->cached = true;
}
+ return &portion->summary;
+
}
@@ -431,7 +477,7 @@ void g_width_tracker_update_added(GWidthTracker *tracker, size_t index, size_t c
tracker->portions[0].first = 0;
tracker->portions[0].last = count - 1;
- g_width_tracker_update_widths(tracker, 0);
+ g_width_tracker_reset_widths(tracker, 0);
return;
@@ -453,7 +499,7 @@ void g_width_tracker_update_added(GWidthTracker *tracker, size_t index, size_t c
portion->last += count;
- g_width_tracker_update_widths(tracker, current);
+ g_width_tracker_reset_widths(tracker, current);
next = current + 1;
@@ -506,9 +552,9 @@ void g_width_tracker_update_added(GWidthTracker *tracker, size_t index, size_t c
/* Mise à jour des largeurs */
- g_width_tracker_update_widths(tracker, current);
+ g_width_tracker_reset_widths(tracker, current);
- g_width_tracker_update_widths(tracker, current + 1);
+ g_width_tracker_reset_widths(tracker, current + 1);
}
@@ -614,10 +660,10 @@ void g_width_tracker_update_deleted(GWidthTracker *tracker, size_t start, size_t
/* Mise à jour des largeurs aux extrémités */
if (keep_first)
- g_width_tracker_update_widths(tracker, first);
+ g_width_tracker_reset_widths(tracker, first);
if (keep_last && last != first)
- g_width_tracker_update_widths(tracker, dest);
+ g_width_tracker_reset_widths(tracker, dest);
}
@@ -653,7 +699,7 @@ static void g_width_tracker_ensure_valid_required_widths(GWidthTracker *tracker)
for (i = 0; i < tracker->count; i++)
{
- summary = &tracker->portions[i].summary;
+ summary = g_width_tracker_get_up_to_date_widths(tracker, i);
for (k = 0; k < BLC_COUNT; k++)
global->max_widths[k] = MAX(global->max_widths[k], summary->max_widths[k]);
@@ -707,7 +753,7 @@ const line_width_summary *g_width_tracker_get_width_summary(GWidthTracker *track
void g_width_tracker_get_local_width_summary(GWidthTracker *tracker, size_t index, line_width_summary *summary)
{
size_t current; /* Indice de portion visée */
- common_metrics *portion; /* Portion locale à consulter */
+ const line_width_summary *local; /* Valeurs à intégrer */
BufferLineColumn i; /* Boucle de parcours */
g_width_tracker_ensure_valid_required_widths(tracker);
@@ -715,15 +761,15 @@ void g_width_tracker_get_local_width_summary(GWidthTracker *tracker, size_t inde
current = g_width_tracker_find_metrics(tracker, index);
assert(current < tracker->count);
- portion = &tracker->portions[current];
+ local = g_width_tracker_get_up_to_date_widths(tracker, current);
for (i = BLC_FIRST; i < BLC_DISPLAY; i++)
summary->max_widths[i] = tracker->summary.max_widths[i];
for (i = BLC_DISPLAY; i < BLC_COUNT; i++)
- summary->max_widths[i] = portion->summary.max_widths[i];
+ summary->max_widths[i] = local->max_widths[i];
- summary->merged_width = portion->summary.merged_width;
+ summary->merged_width = local->merged_width;
}