From e86f211252a66d6c1b4abec350217f5241b6ef66 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 11 Dec 2012 21:25:54 +0000 Subject: 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 --- ChangeLog | 12 +++++ src/decomp/output.c | 3 +- src/glibext/gbufferline.c | 39 +++++++++----- src/glibext/gbufferline.h | 11 ++-- src/glibext/gcodebuffer.c | 127 ++++++++++++++++++++++++++++++++++++++++------ 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 + * 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 + * 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); -- cgit v0.11.2-87-g4458