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:
parent
a0109ffabc
commit
a220fbae1a
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user