diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/arch/instruction.c | 2 | ||||
-rw-r--r-- | src/glibext/gbufferline.c | 48 | ||||
-rw-r--r-- | src/glibext/gbuffersegment.c | 39 |
4 files changed, 79 insertions, 19 deletions
@@ -1,3 +1,12 @@ +14-08-20 Cyrille Bagard <nocbos@gmail.com> + + * src/arch/instruction.c: + Fix a bug by adding a missing 'return'. + + * src/glibext/gbufferline.c: + * src/glibext/gbuffersegment.c: + Rewrite some parts of code to increase the binary processing speed. + 14-08-19 Cyrille Bagard <nocbos@gmail.com> * configure.ac: diff --git a/src/arch/instruction.c b/src/arch/instruction.c index 95910ba..e1ee023 100644 --- a/src/arch/instruction.c +++ b/src/arch/instruction.c @@ -673,7 +673,7 @@ size_t g_arch_instruction_compute_group_index(GArchInstruction **iter, GArchInst const char *g_arch_instruction_get_keyword(const GArchInstruction *instr, AsmSyntax syntax) { - G_ARCH_INSTRUCTION_GET_CLASS(instr)->get_key(instr, syntax); + return G_ARCH_INSTRUCTION_GET_CLASS(instr)->get_key(instr, syntax); } diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c index fbca259..6e06fe4 100644 --- a/src/glibext/gbufferline.c +++ b/src/glibext/gbufferline.c @@ -419,12 +419,17 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor { size_t len; /* Taille de l'élément inséré */ VMPA_BUFFER(address); /* Adresse au format texte */ - char *bin_code; /* Tampon du code binaire */ + size_t required; /* Taille de traitement requise*/ + char static_buffer[64]; /* Petit tampon local rapide */ + char *bin_code; /* Tampon utilisé pour le code */ off_t start; /* Début de traitement */ off_t end; /* Limite de traitement */ off_t i; /* Boucle de parcours #1 */ char *iter; /* Boucle de parcours #2 */ int ret; /* Progression dans l'écriture */ + bin_t byte; /* Octet à représenter */ + + static const char *charset = "0123456789abcdef"; /* Adresse physique puis virtuelle */ @@ -434,25 +439,56 @@ void g_buffer_line_fill_for_instr(GBufferLine *line, MemoryDataSize psize, Memor vmpa2_virt_to_string(line->addr, vsize, address, &len); g_buffer_line_insert_text(line, BLC_VIRTUAL, address, len, RTT_RAW); - /* Code brut */ + /* Détermination du réceptacle */ + + required = length * 3 + 3; + + if (required <= sizeof(static_buffer)) + bin_code = static_buffer; + else + bin_code = (char *)calloc(required, sizeof(char)); - bin_code = (char *)calloc(length * 3 + 3, sizeof(char)); + /* Code brut */ start = get_phy_addr(line->addr); end = start + length; for (i = start, iter = bin_code; i < end; i++, iter += ret) { + byte = content[i]; + + iter[0] = charset[byte >> 4]; + iter[1] = charset[byte & 0x0f]; + if ((i + 1) < end) - ret = snprintf(iter, 4, "%02hhx ", content[i]); + { + iter[2] = ' '; + ret = 3; + } + else - ret = snprintf(iter, 6, "%02hhx%s", content[i], full ? "" : "..."); + { + if (full) + { + iter[2] = '\0'; + ret = 2; + } + else + { + strcpy(iter + 2, "..."); + ret = 5; + } + + } } + /* Conclusion */ + g_buffer_line_insert_text(line, BLC_BINARY, bin_code, iter - bin_code, RTT_RAW_CODE); - free(bin_code); + if (bin_code != static_buffer) + free(bin_code); } diff --git a/src/glibext/gbuffersegment.c b/src/glibext/gbuffersegment.c index e610a51..ff32e3c 100644 --- a/src/glibext/gbuffersegment.c +++ b/src/glibext/gbuffersegment.c @@ -55,7 +55,7 @@ typedef struct _rendering_pattern_t #define CAIRO_FONT_WEIGHT_COUNT 2 #define CAIRO_FONTS_COUNT (CAIRO_FONT_SLANT_COUNT * CAIRO_FONT_WEIGHT_COUNT) -#define CAIRO_FONT_INDEX(s, w) ((s) * CAIRO_FONT_SLANT_COUNT + (w)) +#define CAIRO_FONT_INDEX(s, w) ((s) + (w) * CAIRO_FONT_WEIGHT_COUNT) /* Fragment de caractères aux propriétés communes (instance) */ struct _GBufferSegment @@ -73,7 +73,7 @@ struct _GBufferSegment GdkColor alt_fg; /* Couleur d'impression bis */ GdkColor *used_fg; /* Couleur d'impression utile */ - cairo_text_extents_t extents; /* Dimensions du texte */ + gint x_advance; /* Dimensions du texte */ }; @@ -83,6 +83,7 @@ struct _GBufferSegmentClass GObjectClass parent; /* A laisser en premier */ cairo_t *font_ctxts[CAIRO_FONTS_COUNT]; /* Contextes de police */ + double x_advances[CAIRO_FONTS_COUNT]; /* Largeurs par caractère */ rendering_pattern_t patterns[RTT_COUNT];/* Modèles d'impression */ }; @@ -95,7 +96,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *); static void g_buffer_segment_init(GBufferSegment *); /* Définit les dernières propriétés de rendu restantes. */ -static void g_buffer_segment_prepare(GBufferSegment *, const char *); +static void g_buffer_segment_prepare(GBufferSegment *, size_t); @@ -122,6 +123,7 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) cairo_font_weight_t w; /* Boucle de parcours #2 */ cairo_t **cr; /* Contexte à créer */ cairo_surface_t *surface; /* Surface pour dessin Cairo */ + cairo_text_extents_t extents; /* Couverture des caractères */ /* Contextes pour les mesures initiales */ @@ -140,8 +142,22 @@ static void g_buffer_segment_class_init(GBufferSegmentClass *class) cairo_select_font_face(*cr, "mono", s, w); cairo_set_font_size(*cr, 13); + cairo_text_extents(*cr, "A", &extents); + class->x_advances[CAIRO_FONT_INDEX(s, w)] = extents.x_advance; + + + printf("s=%d w=%d ==>> %g vs %g\n", s, w, + extents.x_advance, class->x_advances[CAIRO_FONT_INDEX(s, w)]); + + printf(" >> %d\n", CAIRO_FONT_INDEX(s, w)); + + + printf("[x] = %g [0] = %g\n", class->x_advances[CAIRO_FONT_INDEX(s, w)], class->x_advances[0]); + } + printf("class=%p [0]=%g\n", class, class->x_advances[0]); + g_free(filename); /* Propriétés d'impression */ @@ -245,7 +261,7 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si class = G_BUFFER_SEGMENT_GET_CLASS(result); result->pattern = &class->patterns[type]; - g_buffer_segment_prepare(result, text); + g_buffer_segment_prepare(result, length); g_buffer_segment_set_style(result, SRS_CLASSIC); @@ -267,12 +283,11 @@ GBufferSegment *g_buffer_segment_new(RenderingTagType type, const char *text, si * * ******************************************************************************/ -static void g_buffer_segment_prepare(GBufferSegment *segment, const char *text) +static void g_buffer_segment_prepare(GBufferSegment *segment, size_t length) { GBufferSegmentClass *class; /* Classe associée à l'instance*/ cairo_font_slant_t slant; /* Style d'impression */ cairo_font_weight_t weight; /* Poids de la police */ - cairo_t *cr; /* Contexte de rendu */ /* Taille */ @@ -281,9 +296,7 @@ static void g_buffer_segment_prepare(GBufferSegment *segment, const char *text) slant = segment->pattern->slant; weight = segment->pattern->weight; - cr = class->font_ctxts[CAIRO_FONT_INDEX(slant, weight)]; - - cairo_text_extents(cr, text, &segment->extents); + segment->x_advance = class->x_advances[CAIRO_FONT_INDEX(slant, weight)] * length; /* Couleurs */ @@ -354,7 +367,7 @@ const char *g_buffer_segment_get_text(const GBufferSegment *segment) gint g_buffer_segment_get_width(const GBufferSegment *segment) { - return segment->extents.x_advance; + return segment->x_advance; } @@ -470,7 +483,7 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin segment->cache_bg.green / 65535.0, segment->cache_bg.blue / 65535.0); - cairo_rectangle(cairo, *x, y, segment->extents.x_advance, 17); + cairo_rectangle(cairo, *x, y, segment->x_advance, 17); cairo_set_operator(cairo, CAIRO_OPERATOR_DIFFERENCE); cairo_fill(cairo); @@ -501,13 +514,15 @@ void g_buffer_segment_draw(GBufferSegment *segment, cairo_t *cairo, gint *x, gin cairo_font_extents(cairo, &extents); +#if 1 if (extents.descent != 3) printf("FONT : %g, %g\n", extents.ascent, extents.descent); +#endif cairo_show_text(cairo, segment->text); //printf(">> %s >> %f %f\n", segment->text, segment->extents.width, segment->extents.x_advance); - *x += segment->extents.x_advance; + *x += segment->x_advance; } |