terminal: use new font backend

Instead of using the slow old font-factory we now use the new font_screen
object which allows faster software rendering with pango/cairo.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-04-01 19:25:54 +02:00
parent a0109ffabc
commit a220fbae1a
3 changed files with 41 additions and 56 deletions

View File

@ -722,32 +722,22 @@ static int kmscon_buffer_set_margins(struct kmscon_buffer *buf,
}
static void kmscon_buffer_draw(struct kmscon_buffer *buf,
struct kmscon_font *font,
struct gl_shader *shader)
struct font_screen *fscr)
{
float xs, ys;
unsigned int i, j, k, num;
struct line *iter, *line = NULL;
struct cell *cell;
float *m;
int idx;
float m[16];
if (!buf || !font)
if (!buf || !fscr)
return;
m = gl_m4_stack_tip(buf->stack);
gl_m4_identity(m);
xs = 1.0 / buf->size_x;
ys = 1.0 / buf->size_y;
gl_m4_scale(m, 2, 2, 1);
gl_m4_translate(m, -0.5, -0.5, 0);
gl_m4_scale(m, xs, ys, 1);
font_screen_draw_start(fscr);
iter = buf->position;
k = 0;
idx = 0;
for (i = 0; i < buf->size_y; ++i) {
if (iter) {
line = iter;
@ -788,18 +778,14 @@ static void kmscon_buffer_draw(struct kmscon_buffer *buf,
for (j = 0; j < num; ++j) {
cell = &line->cells[j];
m = gl_m4_stack_push(buf->stack);
if (!m) {
log_warn("cannot push matrix");
break;
}
gl_m4_translate(m, j, i, 0);
kmscon_font_draw(font, cell->ch, m, shader);
m = gl_m4_stack_pop(buf->stack);
font_screen_draw_char(fscr, cell->ch, j, i, 1, 1);
}
}
gl_m4_identity(m);
gl_m4_translate(m, -1, -1, 0);
gl_m4_scale(m, 2, 2, 1);
font_screen_draw_perform(fscr, m);
}
static void kmscon_buffer_write(struct kmscon_buffer *buf, unsigned int x,
@ -1130,19 +1116,12 @@ int kmscon_console_resize(struct kmscon_console *con, unsigned int x,
return 0;
}
/*
* This maps the console onto the current GL framebuffer. It expects the
* framebuffer to have 0/0 in the middle, -1/-1 in the upper left and 1/1 in
* the lower right (default GL settings).
* This does not clear the screen, nor does it paint the background. Instead
* the background is transparent and blended on top of the framebuffer.
*/
void kmscon_console_map(struct kmscon_console *con, struct gl_shader *shader)
void kmscon_console_draw(struct kmscon_console *con, struct font_screen *fscr)
{
if (!con)
return;
kmscon_buffer_draw(con->cells, con->font, shader);
kmscon_buffer_draw(con->cells, fscr);
}
void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch)

View File

@ -54,8 +54,7 @@ unsigned int kmscon_console_get_height(struct kmscon_console *con);
int kmscon_console_resize(struct kmscon_console *con, unsigned int x,
unsigned int y, unsigned int height);
void kmscon_console_map(struct kmscon_console *con,
struct gl_shader *shader);
void kmscon_console_draw(struct kmscon_console *con, struct font_screen *fscr);
void kmscon_console_write(struct kmscon_console *con, kmscon_symbol_t ch);
void kmscon_console_newline(struct kmscon_console *con);

View File

@ -56,6 +56,8 @@ struct screen {
struct screen *prev;
struct uterm_display *disp;
struct uterm_screen *screen;
struct font_buffer *buf;
struct font_screen *fscr;
};
struct kmscon_terminal {
@ -99,7 +101,7 @@ static void draw_all(struct ev_idle *idle, void *data)
gl_viewport(screen);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
kmscon_console_map(term->console, term->shader);
kmscon_console_draw(term->console, iter->fscr);
uterm_screen_swap(screen);
}
}
@ -118,7 +120,6 @@ static int add_display(struct kmscon_terminal *term, struct uterm_display *disp)
struct screen *scr;
int ret;
unsigned int width, height;
bool resize;
scr = malloc(sizeof(*scr));
if (!scr)
@ -127,39 +128,45 @@ static int add_display(struct kmscon_terminal *term, struct uterm_display *disp)
scr->disp = disp;
ret = uterm_screen_new_single(&scr->screen, disp);
if (ret) {
free(scr);
return ret;
}
if (ret)
goto err_free;
width = uterm_screen_width(scr->screen);
height = uterm_screen_height(scr->screen);
ret = font_buffer_new(&scr->buf, width, height);
if (ret)
goto err_screen;
ret = font_screen_new_fixed(&scr->fscr, scr->buf, FONT_ATTR(NULL, 12, 0),
80, 24,
term->shader);
if (ret)
goto err_buf;
scr->next = term->screens;
if (scr->next)
scr->next->prev = scr;
term->screens = scr;
resize = false;
width = uterm_screen_width(scr->screen);
height = uterm_screen_height(scr->screen);
if (term->max_width < width) {
term->max_width = width;
resize = true;
}
if (term->max_height < height) {
term->max_height = height;
resize = true;
}
if (resize)
kmscon_console_resize(term->console, 0, 0, term->max_height);
log_debug("added display %p to terminal %p", disp, term);
schedule_redraw(term);
uterm_display_ref(scr->disp);
return 0;
err_buf:
font_buffer_free(scr->buf);
err_screen:
uterm_screen_unref(scr->screen);
err_free:
free(scr);
return ret;
}
static void free_screen(struct screen *scr)
{
font_screen_free(scr->fscr);
font_buffer_free(scr->buf);
uterm_screen_unref(scr->screen);
uterm_display_unref(scr->disp);
free(scr);