aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2017-02-12 16:36:12 -0500
committerJesse Luehrs <doy@tozt.net>2017-02-12 16:36:12 -0500
commit99ec8a898b7571c07fb322e2365b186df1681687 (patch)
treec54ef209ea2c1f5aa33fcb9ea7bfcac6a475aada
parent23590b5069a2ad466c3c85997c35bf9b07bc6339 (diff)
downloadrunes-99ec8a898b7571c07fb322e2365b186df1681687.tar.gz
runes-99ec8a898b7571c07fb322e2365b186df1681687.zip
avoid an allocation on every glyph string draw
probably not super meaningful compared to the cost of the cairo operations, but may as well
-rw-r--r--src/display.c27
-rw-r--r--src/display.h2
-rw-r--r--src/term.c1
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);
}