summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-12-11 21:25:54 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-12-11 21:25:54 (GMT)
commite86f211252a66d6c1b4abec350217f5241b6ef66 (patch)
treec99db8e8e2fcc058dca806617c270b81770f3957
parent79ec14ee5c1cea5c4ad345a7047b47b9205fc29e (diff)
Fixed/improved the computing of buffer lines cached dimensions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@300 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog12
-rw-r--r--src/decomp/output.c3
-rw-r--r--src/glibext/gbufferline.c39
-rw-r--r--src/glibext/gbufferline.h11
-rw-r--r--src/glibext/gcodebuffer.c127
5 files changed, 156 insertions, 36 deletions
diff --git a/ChangeLog b/ChangeLog
index 83e1f04..34bf9e4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,17 @@
12-12-11 Cyrille Bagard <nocbos@gmail.com>
+ * src/decomp/output.c:
+ Update code.
+
+ * src/glibext/gbufferline.c:
+ * src/glibext/gbufferline.h:
+ Provide access to merging column and its width.
+
+ * src/glibext/gcodebuffer.c:
+ Fix/improve the computing of buffer lines cached dimensions.
+
+12-12-11 Cyrille Bagard <nocbos@gmail.com>
+
* plugins/androhelpers/androhelpers.c:
Check for Dex format and handle a new process.
diff --git a/src/decomp/output.c b/src/decomp/output.c
index 648dddc..5689319 100644
--- a/src/decomp/output.c
+++ b/src/decomp/output.c
@@ -272,9 +272,8 @@ GBufferLine *g_lang_output_start_routine_info(const GLangOutput *output, GCodeBu
if (output->start_routine_proto != NULL)
{
result = output->start_info(output, buffer);
- g_buffer_line_skip_width(result);
+ g_buffer_line_start_merge_at(result, BLC_LAST_USED);
}
-
else result = NULL;
return result;
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 562aded..9dc970b 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -85,8 +85,6 @@ struct _GBufferLine
BufferLineColumn merge_start; /* Début de la zone globale */
BufferLineColumn last_used; /* Dernière colonne utilisée */
- bool skip_width; /* Pas de taille comptabilisée */
-
};
/* Représentation de fragments de texte en ligne (classe) */
@@ -680,19 +678,25 @@ char *g_buffer_line_get_text(const GBufferLine *line)
/******************************************************************************
* *
-* Paramètres : line = ligne à venir compléter. *
+* Paramètres : line = ligne à venir compléter. *
+* index = index de la colonne visée par la procédure. *
* *
-* Description : Marque la ligne comme étant sans largeur à comptabiliser. *
+* Description : Fournit la largeur requise pour une colonne de ligne donnée. *
* *
-* Retour : - *
+* Retour : Largeur en pixel requise. *
* *
* Remarques : - *
* *
******************************************************************************/
-void g_buffer_line_skip_width(GBufferLine *line)
+gint g_buffer_line_get_column_width(GBufferLine *line, BufferLineColumn index)
{
- line->skip_width = true;
+ gint result; /* Largeur à retourner */
+
+ if (index >= line->merge_start) result = 0;
+ else result = get_column_width(&line->columns[index]);
+
+ return result;
}
@@ -700,9 +704,11 @@ void g_buffer_line_skip_width(GBufferLine *line)
/******************************************************************************
* *
* Paramètres : line = ligne à venir compléter. *
-* index = index de la colonne visée par la procédure. *
+* merge = précise la première colonne marquant la fusion. [OUT]*
+* addr = indique si les positions doivent être affichées. *
+* code = indique si le code binaire doit être affiché. *
* *
-* Description : Fournit la largeur requise pour une colonne de ligne donnée. *
+* Description : Fournit la dernière largeur d'une ligne avec fusion. *
* *
* Retour : Largeur en pixel requise. *
* *
@@ -710,12 +716,16 @@ void g_buffer_line_skip_width(GBufferLine *line)
* *
******************************************************************************/
-gint g_buffer_line_get_width(GBufferLine *line, BufferLineColumn index)
+gint g_buffer_line_get_merge_width(GBufferLine *line, BufferLineColumn *merge, bool addr, bool code)
{
gint result; /* Largeur à retourner */
- if (line->skip_width) result = 0;
- else result = get_column_width(&line->columns[index]);
+ result = 0;
+
+ *merge = line->merge_start;
+
+ if (line->merge_start < BLC_COUNT)
+ result = get_column_width(&line->columns[line->merge_start]);
return result;
@@ -737,7 +747,10 @@ gint g_buffer_line_get_width(GBufferLine *line, BufferLineColumn index)
void g_buffer_line_start_merge_at(GBufferLine *line, BufferLineColumn start)
{
- line->merge_start = start;
+ if (start == BLC_LAST_USED)
+ line->merge_start = line->last_used;
+ else
+ line->merge_start = start;
}
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 028ae8e..9afff58 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -61,7 +61,8 @@ typedef enum _BufferLineColumn
BLC_COUNT,
- BLC_LAST_USED /* Dernière colonne utilisée */
+ BLC_LAST_USED, /* Dernière colonne utilisée */
+ BLC_INVALID /* Valeur de non-initialisation*/
} BufferLineColumn;
@@ -139,11 +140,11 @@ void g_buffer_line_insert_text(GBufferLine *, BufferLineColumn, const char *, si
/* Donne le texte représenté par une ligne de tampon. */
char *g_buffer_line_get_text(const GBufferLine *);
-/* Marque la ligne comme étant sans largeur à comptabiliser. */
-void g_buffer_line_skip_width(GBufferLine *);
-
/* Fournit la largeur requise pour une colonne de ligne donnée. */
-gint g_buffer_line_get_width(GBufferLine *, BufferLineColumn);
+gint g_buffer_line_get_column_width(GBufferLine *, BufferLineColumn);
+
+/* Fournit la dernière largeur d'une ligne avec fusion. */
+gint g_buffer_line_get_merge_width(GBufferLine *, BufferLineColumn *, bool, bool);
/* Définit la colonne à partir de laquelle la fusion opère. */
void g_buffer_line_start_merge_at(GBufferLine *, BufferLineColumn);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 4302f14..452d695 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -146,6 +146,8 @@ struct _GBufferView
gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */
gint left_margin; /* Marge gauche + espace */
gint left_text; /* Début d'impression du code */
+ gint last_width; /* Plus grande col. de fusion */
+ BufferLineColumn last_merge; /* Colonne de fusion extrême */
buffer_line_draw_fc drawing_extra; /* Fonction d'accompagnement */
void *drawing_data; /* Donnée utilisateur */
@@ -165,6 +167,7 @@ struct _GBufferViewClass
};
+#define HEIGHT_CACHED(view) ((view)->line_height != -1)
#define WIDTHS_CACHED(view) ((view)->max_widths[0] != -1)
@@ -174,11 +177,14 @@ static void g_buffer_view_class_init(GBufferViewClass *);
/* Procède à l'initialisation d'une vue d'un tampon pour code. */
static void g_buffer_view_init(GBufferView *);
+/* Réinitialise le cache de la hauteur des lignes. */
+static void g_buffer_view_reset_required_height(GBufferView *);
+
/* Réinitialise le cache des largeurs de colonne calculées. */
static void g_buffer_view_reset_required_widths(GBufferView *);
-/* Calcule les dimensions requises par une visualisation. */
-static void g_buffer_view_compute_required_widths(GBufferView *);
+/* Calcule les largeurs requises par une visualisation. */
+static void g_buffer_view_compute_required_widths(GBufferView *, bool, bool);
@@ -713,6 +719,9 @@ static void g_buffer_view_init(GBufferView *buffer)
{
buffer->fcache = g_font_cache_new();
+ g_buffer_view_reset_required_height(buffer);
+ g_buffer_view_reset_required_widths(buffer);
+
}
@@ -741,8 +750,6 @@ GBufferView *g_buffer_view_new(GCodeBuffer *buffer)
result->start = 0;
result->end = VMPA_MAX;
- g_buffer_view_reset_required_widths(result);
-
return result;
}
@@ -815,6 +822,25 @@ GCodeBuffer *g_buffer_view_get_buffer(const GBufferView *view)
* *
* Paramètres : view = visualisation à consulter. *
* *
+* Description : Réinitialise le cache de la hauteur des lignes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_view_reset_required_height(GBufferView *view)
+{
+ view->line_height = -1;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = visualisation à consulter. *
+* *
* Description : Réinitialise le cache des largeurs de colonne calculées. *
* *
* Retour : - *
@@ -835,9 +861,9 @@ static void g_buffer_view_reset_required_widths(GBufferView *view)
/******************************************************************************
* *
-* Paramètres : view = visualisation à consulter. *
+* Paramètres : view = visualisation à mettre à jour. *
* *
-* Description : Calcule les dimensions requises par une visualisation. *
+* Description : Calcule la hauteur requise par une visualisation. *
* *
* Retour : - *
* *
@@ -845,7 +871,28 @@ static void g_buffer_view_reset_required_widths(GBufferView *view)
* *
******************************************************************************/
-static void g_buffer_view_compute_required_widths(GBufferView *view)
+static void g_buffer_view_compute_required_height(GBufferView *view)
+{
+ view->line_height = 17;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = visualisation à mettre à jour. *
+* addr = indique si les positions doivent être affichées. *
+* code = indique si le code binaire doit être affiché. *
+* *
+* Description : Calcule les largeurs requises par une visualisation. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_buffer_view_compute_required_widths(GBufferView *view, bool addr, bool code)
{
GBufferLine **lines; /* Liste des lignes à traiter */
size_t first; /* Première ligne intégrée */
@@ -853,25 +900,46 @@ static void g_buffer_view_compute_required_widths(GBufferView *view)
size_t i; /* Boucle de parcours #1 */
unsigned int j; /* Boucle de parcours #2 */
gint width; /* Largeur d'une colonne */
+ BufferLineColumn merge; /* Début de fusion de colonnes */
+
+ if (!HEIGHT_CACHED(view))
+ g_buffer_view_compute_required_height(view);
lines = view->buffer->lines;
first = g_code_buffer_get_index_from_address(view->buffer, view->start);
last = g_code_buffer_get_index_from_address(view->buffer, view->end);
- view->line_height = 17;
-
view->left_margin = 2 * view->line_height;
view->left_text = 2.5 * view->line_height;
+ view->last_width = 0;
+ view->last_merge = BLC_INVALID;
+
if (view->buffer->used > 0)
for (i = first; i <= last; i++)
+ {
for (j = 0; j < BLC_COUNT; j++)
{
- width = g_buffer_line_get_width(lines[i], j);
+ width = g_buffer_line_get_column_width(lines[i], j);
view->max_widths[j] = MAX(view->max_widths[j], width);
}
+ width = g_buffer_line_get_merge_width(lines[i], &merge, addr, code);
+ view->last_width = MAX(view->last_width, width);
+ if (merge != BLC_COUNT)
+ {
+ if (view->last_merge == BLC_INVALID)
+ view->last_merge = merge;
+ else
+ view->last_merge = MAX(view->last_merge, merge);
+ }
+
+ }
+
+ if (view->last_merge == BLC_INVALID)
+ view->last_merge = BLC_COUNT;
+
}
@@ -889,8 +957,8 @@ static void g_buffer_view_compute_required_widths(GBufferView *view)
gint g_buffer_view_get_line_height(GBufferView *view)
{
- if (!WIDTHS_CACHED(view))
- g_buffer_view_compute_required_widths(view);
+ if (!HEIGHT_CACHED(view))
+ g_buffer_view_compute_required_height(view);
return view->line_height;
@@ -915,28 +983,55 @@ gint g_buffer_view_get_line_height(GBufferView *view)
void g_buffer_view_get_size(GBufferView *view, gint *width, gint *height, bool addr, bool code)
{
- unsigned int i; /* Boucle de parcours */
+ gint col_width; /* Calcul selon les colonnes */
+ gint full_width; /* Calcul selon les fusions */
+ BufferLineColumn i; /* Boucle de parcours */
size_t first; /* Première ligne intégrée */
size_t last; /* Dernière ligne intégrée */
if (!WIDTHS_CACHED(view))
- g_buffer_view_compute_required_widths(view);
+ g_buffer_view_compute_required_widths(view, addr, code);
*width = view->left_text;
*height = view->line_height;
+ col_width = 0;
+ full_width = 0;
+
+ /* Première méthode */
+
for (i = 0; i < BLC_COUNT; i++)
{
if (i == BLC_ADDRESS && !addr) continue;
if (i == BLC_BINARY && !code) continue;
- *width += view->max_widths[i];
+ col_width += view->max_widths[i];
if ((i + 1) < BLC_COUNT)
- *width += COL_MARGIN;
+ col_width += COL_MARGIN;
}
+ /* Seconde méthode */
+
+ for (i = 0; i < view->last_merge; i++)
+ {
+ if (i == BLC_ADDRESS && !addr) continue;
+ if (i == BLC_BINARY && !code) continue;
+
+ full_width += view->max_widths[i];
+
+ if ((i + 1) < view->last_merge)
+ full_width += COL_MARGIN;
+
+ }
+
+ full_width += view->last_width + COL_MARGIN;
+
+ /* Mise en concurrence et poursuite... */
+
+ *width += + MAX(col_width, full_width);
+
first = g_code_buffer_get_index_from_address(view->buffer, view->start);
last = g_code_buffer_get_index_from_address(view->buffer, view->end);