From 99ec8a898b7571c07fb322e2365b186df1681687 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 12 Feb 2017 16:36:12 -0500 Subject: avoid an allocation on every glyph string draw probably not super meaningful compared to the cost of the cairo operations, but may as well --- src/display.c | 27 +++++++++++++++++---------- src/display.h | 2 ++ src/term.c | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/display.c b/src/display.c index 9c7ce87..59b7b14 100644 --- a/src/display.c +++ b/src/display.c @@ -44,6 +44,16 @@ RunesDisplay *runes_display_new(char *font_name) return display; } +void runes_display_set_window_size(RunesTerm *t, int row, int col) +{ + RunesDisplay *display = t->display; + + UNUSED(row); + + free(display->glyph_buf); + display->glyph_buf = malloc(col * sizeof(cairo_glyph_t)); +} + void runes_display_set_context(RunesTerm *t, cairo_t *cr) { RunesDisplay *display = t->display; @@ -244,6 +254,7 @@ void runes_display_maybe_clear_selection(RunesTerm *t) void runes_display_delete(RunesDisplay *display) { free(display->ascii_glyph_index_cache); + free(display->glyph_buf); cairo_scaled_font_destroy(display->scaled_font); cairo_pattern_destroy(display->buffer); g_object_unref(display->layout); @@ -492,37 +503,33 @@ static void runes_display_draw_glyphs_fast( size_t len, int row, int col) { RunesDisplay *display = t->display; - cairo_glyph_t *glyphs; size_t i; - glyphs = malloc(len * sizeof(cairo_glyph_t)); - for (i = 0; i < len; ++i) { + cairo_glyph_t *glyph = &display->glyph_buf[i]; switch (cells[i]->len) { case 0: - glyphs[i].index = display->ascii_glyph_index_cache[' ']; + glyph->index = display->ascii_glyph_index_cache[' ']; break; case 1: { char c = cells[i]->contents[0]; - glyphs[i].index = display->ascii_glyph_index_cache[(int)c]; + glyph->index = display->ascii_glyph_index_cache[(int)c]; break; } default: fprintf(stderr, "runes_display_draw_glyphs_fast requires ascii\n"); return; } - glyphs[i].x = (col + i) * display->fontx; - glyphs[i].y = (row + 1) * display->fonty - display->font_descent; + glyph->x = (col + i) * display->fontx; + glyph->y = (row + 1) * display->fonty - display->font_descent; } cairo_save(display->cr); cairo_move_to(display->cr, col * display->fontx, row * display->fonty); cairo_set_source(display->cr, pattern); cairo_set_scaled_font(display->cr, display->scaled_font); - cairo_show_glyphs(display->cr, glyphs, len); + cairo_show_glyphs(display->cr, display->glyph_buf, len); cairo_restore(display->cr); - - free(glyphs); } static void runes_display_draw_glyphs_slow( diff --git a/src/display.h b/src/display.h index e4ddc28..79ab068 100644 --- a/src/display.h +++ b/src/display.h @@ -11,6 +11,7 @@ struct runes_display { PangoLayout *layout; cairo_scaled_font_t *scaled_font; PangoGlyph *ascii_glyph_index_cache; + cairo_glyph_t *glyph_buf; int row_visible_offset; @@ -31,6 +32,7 @@ struct runes_display { }; RunesDisplay *runes_display_new(char *font_name); +void runes_display_set_window_size(RunesTerm *t, int row, int col); void runes_display_set_context(RunesTerm *t, cairo_t *cr); void runes_display_draw_screen(RunesTerm *t); void runes_display_draw_cursor(RunesTerm *t); diff --git a/src/term.c b/src/term.c index 3477dab..bee110b 100644 --- a/src/term.c +++ b/src/term.c @@ -47,6 +47,7 @@ void runes_term_set_window_size(RunesTerm *t, int xpixel, int ypixel) int row = ypixel / t->display->fonty, col = xpixel / t->display->fontx; runes_pty_set_window_size(t, row, col, xpixel, ypixel); + runes_display_set_window_size(t, row, col); vt100_screen_set_window_size(t->scr, row, col); } -- cgit v1.2.3