diff --git a/src/console.c b/src/console.c index c9d302b..501b5e0 100644 --- a/src/console.c +++ b/src/console.c @@ -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) diff --git a/src/console.h b/src/console.h index f11954e..4c50d90 100644 --- a/src/console.h +++ b/src/console.h @@ -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); diff --git a/src/terminal.c b/src/terminal.c index 31ee0f2..ae83c31 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -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);