aboutsummaryrefslogtreecommitdiffstats
path: root/display.c
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-15 01:29:35 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-15 01:29:35 -0400
commit2fbfa56f06883c7d78384d6fc11f05b16721c62d (patch)
tree4000038fa00fcadd787c328b3c6cf8ce5ccb0c27 /display.c
parent98231f90d60fd75e23ea48e602823d7a341b2a1c (diff)
downloadrunes-2fbfa56f06883c7d78384d6fc11f05b16721c62d.tar.gz
runes-2fbfa56f06883c7d78384d6fc11f05b16721c62d.zip
stop recalculating the font size all the time
Diffstat (limited to 'display.c')
-rw-r--r--display.c92
1 files changed, 38 insertions, 54 deletions
diff --git a/display.c b/display.c
index 63b7242..260ca13 100644
--- a/display.c
+++ b/display.c
@@ -3,6 +3,7 @@
#include "runes.h"
+static void runes_display_calculate_font_dimensions(RunesTerm *t);
static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t);
static void runes_display_scroll_down(RunesTerm *t, int rows);
@@ -34,6 +35,8 @@ void runes_display_init(RunesTerm *t)
t->font_bold = 0;
t->font_italic = 0;
t->font_underline = 0;
+
+ runes_display_calculate_font_dimensions(t);
}
void runes_display_post_init(RunesTerm *t)
@@ -55,7 +58,6 @@ void runes_display_post_init(RunesTerm *t)
void runes_display_set_window_size(RunesTerm *t, int width, int height)
{
- double fontx, fonty, ascent;
cairo_t *old_cr = NULL;
if (width == t->xpixel && height == t->ypixel) {
@@ -65,9 +67,8 @@ void runes_display_set_window_size(RunesTerm *t, int width, int height)
t->xpixel = width;
t->ypixel = height;
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
- t->rows = t->ypixel / fonty;
- t->cols = t->xpixel / fontx;
+ t->rows = t->ypixel / t->fonty;
+ t->cols = t->xpixel / t->fontx;
old_cr = t->cr;
@@ -101,39 +102,27 @@ void runes_display_set_window_size(RunesTerm *t, int width, int height)
}
}
-void runes_display_get_font_dimensions(
- RunesTerm *t, double *fontx, double *fonty, double *ascent)
-{
- cairo_font_extents_t extents;
-
- cairo_scaled_font_extents(runes_display_make_font(t), &extents);
-
- *fontx = extents.max_x_advance;
- *fonty = extents.height;
- *ascent = extents.ascent;
-}
-
/* note: this uses the backend cairo context because it should be redrawn every
* time, and shouldn't be left behind when it moves */
void runes_display_draw_cursor(RunesTerm *t)
{
if (t->show_cursor) {
double x, y;
- double fontx, fonty, ascent;
cairo_save(t->backend_cr);
cairo_set_source(t->backend_cr, t->cursorcolor);
runes_display_move_to(t, t->row, t->col);
cairo_get_current_point(t->cr, &x, &y);
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
if (t->focused) {
- cairo_rectangle(t->backend_cr, x, y - ascent, fontx, fonty);
+ cairo_rectangle(
+ t->backend_cr, x, y - t->ascent, t->fontx, t->fonty);
cairo_fill(t->backend_cr);
}
else {
cairo_set_line_width(t->backend_cr, 1);
cairo_rectangle(
- t->backend_cr, x + 0.5, y - ascent + 0.5, fontx, fonty);
+ t->backend_cr,
+ x + 0.5, y - t->ascent + 0.5, t->fontx, t->fonty);
cairo_stroke(t->backend_cr);
}
cairo_restore(t->backend_cr);
@@ -152,33 +141,27 @@ void runes_display_focus_out(RunesTerm *t)
void runes_display_move_to(RunesTerm *t, int row, int col)
{
- double fontx, fonty, ascent;
int scroll = row - t->scroll_bottom;
t->row = row + t->scroll_top;
t->col = col;
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
-
if (scroll > 0) {
runes_display_scroll_down(t, scroll);
t->row = t->scroll_bottom;
}
- cairo_move_to(t->cr, t->col * fontx, t->row * fonty + ascent);
+ cairo_move_to(t->cr, t->col * t->fontx, t->row * t->fonty + t->ascent);
}
void runes_display_show_string(RunesTerm *t, char *buf, size_t len)
{
if (len) {
double x, y;
- double fontx, fonty, ascent;
int remaining = len, space_in_row = t->cols - t->col;
buf[len] = '\0';
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
-
runes_display_move_to(t, t->row, t->col);
do {
@@ -189,7 +172,8 @@ void runes_display_show_string(RunesTerm *t, char *buf, size_t len)
cairo_set_source(t->cr, t->bgcolor);
cairo_get_current_point(t->cr, &x, &y);
/* XXX broken with utf8 */
- cairo_rectangle(t->cr, x, y - ascent, fontx * to_write, fonty);
+ cairo_rectangle(
+ t->cr, x, y - t->ascent, t->fontx * to_write, t->fonty);
cairo_fill(t->cr);
cairo_restore(t->cr);
@@ -210,8 +194,9 @@ void runes_display_show_string(RunesTerm *t, char *buf, size_t len)
if (t->font_underline) {
cairo_save(t->cr);
cairo_set_line_width(t->cr, 1);
- cairo_move_to(t->cr, x, y - ascent + fonty - 0.5);
- cairo_line_to(t->cr, x + (fontx * len), y - ascent + fonty - 0.5);
+ cairo_move_to(t->cr, x, y - t->ascent + t->fonty - 0.5);
+ cairo_line_to(
+ t->cr, x + (t->fontx * len), y - t->ascent + t->fonty - 0.5);
cairo_stroke(t->cr);
cairo_restore(t->cr);
}
@@ -234,18 +219,16 @@ void runes_display_clear_screen(RunesTerm *t)
void runes_display_clear_screen_forward(RunesTerm *t)
{
double x, y;
- double fontx, fonty, ascent;
runes_display_kill_line_forward(t);
cairo_save(t->cr);
cairo_set_source(t->cr, t->bgcolor);
cairo_get_current_point(t->cr, &x, &y);
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
cairo_rectangle(
t->cr,
- 0, y - ascent + fonty,
- t->xpixel, t->ypixel - y + ascent - fonty);
+ 0, y - t->ascent + t->fonty,
+ t->xpixel, t->ypixel - y + t->ascent - t->fonty);
cairo_fill(t->cr);
cairo_restore(t->cr);
@@ -255,15 +238,13 @@ void runes_display_clear_screen_forward(RunesTerm *t)
void runes_display_kill_line_forward(RunesTerm *t)
{
double x, y;
- double fontx, fonty, ascent;
runes_display_move_to(t, t->row, t->col);
cairo_save(t->cr);
cairo_set_source(t->cr, t->bgcolor);
cairo_get_current_point(t->cr, &x, &y);
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
- cairo_rectangle(t->cr, x, y - ascent, t->xpixel - x, fonty);
+ cairo_rectangle(t->cr, x, y - t->ascent, t->xpixel - x, t->fonty);
cairo_fill(t->cr);
cairo_restore(t->cr);
@@ -427,28 +408,35 @@ void runes_display_set_scroll_region(
void runes_display_scroll_up(RunesTerm *t, int rows)
{
- double fontx, fonty, ascent;
-
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
-
cairo_save(t->cr);
cairo_push_group(t->cr);
cairo_set_source_surface(
- t->cr, cairo_get_target(t->cr), 0.0, rows * fonty);
+ t->cr, cairo_get_target(t->cr), 0.0, rows * t->fonty);
cairo_rectangle(
t->cr,
- 0.0, (t->scroll_top + rows) * fonty,
- t->xpixel, (t->scroll_bottom - t->scroll_top + 1 - rows) * fonty);
+ 0.0, (t->scroll_top + rows) * t->fonty,
+ t->xpixel, (t->scroll_bottom - t->scroll_top + 1 - rows) * t->fonty);
cairo_fill(t->cr);
cairo_pop_group_to_source(t->cr);
cairo_paint(t->cr);
cairo_set_source(t->cr, t->colors[0]);
cairo_rectangle(
- t->cr, 0.0, t->scroll_top * fonty, t->xpixel, rows * fonty);
+ t->cr, 0.0, t->scroll_top * t->fonty, t->xpixel, rows * t->fonty);
cairo_fill(t->cr);
cairo_restore(t->cr);
}
+static void runes_display_calculate_font_dimensions(RunesTerm *t)
+{
+ cairo_font_extents_t extents;
+
+ cairo_scaled_font_extents(runes_display_make_font(t), &extents);
+
+ t->fontx = extents.max_x_advance;
+ t->fonty = extents.height;
+ t->ascent = extents.ascent;
+}
+
static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t)
{
cairo_font_face_t *font_face;
@@ -466,22 +454,18 @@ static cairo_scaled_font_t *runes_display_make_font(RunesTerm *t)
static void runes_display_scroll_down(RunesTerm *t, int rows)
{
- double fontx, fonty, ascent;
-
- runes_display_get_font_dimensions(t, &fontx, &fonty, &ascent);
-
cairo_save(t->cr);
cairo_push_group(t->cr);
cairo_set_source_surface(
- t->cr, cairo_get_target(t->cr), 0.0, -rows * fonty);
+ t->cr, cairo_get_target(t->cr), 0.0, -rows * t->fonty);
if (t->scroll_top == 0 && t->scroll_bottom == t->rows - 1) {
cairo_paint(t->cr);
}
else {
cairo_rectangle(
t->cr,
- 0.0, t->scroll_top * fonty,
- t->xpixel, (t->scroll_bottom - t->scroll_top) * fonty);
+ 0.0, t->scroll_top * t->fonty,
+ t->xpixel, (t->scroll_bottom - t->scroll_top) * t->fonty);
cairo_fill(t->cr);
}
cairo_pop_group_to_source(t->cr);
@@ -489,8 +473,8 @@ static void runes_display_scroll_down(RunesTerm *t, int rows)
cairo_set_source(t->cr, t->colors[0]);
cairo_rectangle(
t->cr,
- 0.0, (t->scroll_bottom + 1 - rows) * fonty,
- t->xpixel, rows * fonty);
+ 0.0, (t->scroll_bottom + 1 - rows) * t->fonty,
+ t->xpixel, rows * t->fonty);
cairo_fill(t->cr);
cairo_restore(t->cr);
}