diff --git a/src/font_pango.c b/src/font_pango.c index 623bed88..289a0ac5 100644 --- a/src/font_pango.c +++ b/src/font_pango.c @@ -115,7 +115,7 @@ static int get_glyph(struct face *face, struct kmscon_glyph **out, struct kmscon_glyph *glyph; PangoLayout *layout; PangoAttrList *attrlist; - PangoRectangle rec; + PangoRectangle rec, logical_rec; PangoLayoutLine *line; FT_Bitmap bitmap; unsigned int cwidth; @@ -197,8 +197,9 @@ static int get_glyph(struct face *face, struct kmscon_glyph **out, line = pango_layout_get_line_readonly(layout, 0); - pango_layout_line_get_pixel_extents(line, NULL, &rec); + pango_layout_line_get_pixel_extents(line, &logical_rec, &rec); glyph->buf.width = face->real_attr.width * cwidth; + if (logical_rec.width > glyph->buf.width) glyph->buf.width = logical_rec.width; glyph->buf.height = face->real_attr.height; glyph->buf.stride = glyph->buf.width; glyph->buf.format = UTERM_FORMAT_GREY; diff --git a/src/kmscon_terminal.c b/src/kmscon_terminal.c index ee986033..1ebed100 100644 --- a/src/kmscon_terminal.c +++ b/src/kmscon_terminal.c @@ -84,12 +84,11 @@ struct kmscon_terminal { struct kmscon_font *bold_font; }; -static void do_clear_margins(struct screen *scr) +static void do_clear_screen(struct screen *scr) { - unsigned int w, h, sw, sh; + unsigned int sw, sh; struct uterm_mode *mode; struct tsm_screen_attr attr; - int dw, dh; mode = uterm_display_get_current(scr->disp); if (!mode) @@ -97,21 +96,9 @@ static void do_clear_margins(struct screen *scr) sw = uterm_mode_get_width(mode); sh = uterm_mode_get_height(mode); - w = scr->txt->font->attr.width * scr->txt->cols; - h = scr->txt->font->attr.height * scr->txt->rows; - dw = sw - w; - dh = sh - h; - tsm_vte_get_def_attr(scr->term->vte, &attr); - if (dw > 0) - uterm_display_fill(scr->disp, attr.br, attr.bg, attr.bb, - w, 0, - dw, h); - if (dh > 0) - uterm_display_fill(scr->disp, attr.br, attr.bg, attr.bb, - 0, h, - sw, dh); + uterm_display_fill(scr->disp, attr.br, attr.bg, attr.bb, 0, 0, sw, sh); } static int font_set(struct kmscon_terminal *term); @@ -124,7 +111,7 @@ static void do_redraw_screen(struct screen *scr) return; scr->pending = false; - do_clear_margins(scr); + do_clear_screen(scr); kmscon_text_prepare(scr->txt); tsm_screen_draw(scr->term->console, kmscon_text_draw_cb, scr->txt); diff --git a/src/uterm_drm2d_render.c b/src/uterm_drm2d_render.c index cfe4d755..a8fd3d27 100644 --- a/src/uterm_drm2d_render.c +++ b/src/uterm_drm2d_render.c @@ -101,7 +101,7 @@ int uterm_drm2d_display_fake_blendv(struct uterm_display *disp, uint8_t *dst, *src; unsigned int width, height, i, j; unsigned int sw, sh; - uint_fast32_t r, g, b, out; + uint_fast32_t r, g, b, out, cr, cg, cb; struct uterm_drm2d_rb *rb; struct uterm_drm2d_display *d2d = uterm_drm_display_get_data(disp); @@ -135,11 +135,16 @@ int uterm_drm2d_display_fake_blendv(struct uterm_display *disp, else height = req->buf->height; - dst = rb->map; - dst = &dst[req->y * rb->stride + req->x * 4]; + dst = rb->map + (req->y * rb->stride + req->x * 4); src = req->buf->data; + uint32_t *line = malloc(width * 4); + if (!line) + return -ENOMEM; + while (height--) { + memcpy(line, dst, width * 4); + for (i = 0; i < width; ++i) { /* Division by 255 (t /= 255) is done with: * t += 0x80 @@ -150,12 +155,10 @@ int uterm_drm2d_display_fake_blendv(struct uterm_display *disp, r = req->br; g = req->bg; b = req->bb; - out = (r << 16) | (g << 8) | b; } else if (src[i] == 255) { r = req->fr; g = req->fg; b = req->fb; - out = (r << 16) | (g << 8) | b; } else { r = req->fr * src[i] + req->br * (255 - src[i]); @@ -171,14 +174,21 @@ int uterm_drm2d_display_fake_blendv(struct uterm_display *disp, req->bb * (255 - src[i]); b += 0x80; b = (b + (b >> 8)) >> 8; - out = (r << 16) | (g << 8) | b; } - ((uint32_t*)dst)[i] = out; + out = line[i]; + cr = (out >> 16) & 0xff; if (r < cr) r = cr; + cg = (out >> 8) & 0xff; if (g < cg) g = cg; + cb = (out >> 0) & 0xff; if (b < cb) b = cb; + line[i] = (r << 16) | (g << 8) | b; } + + memcpy(dst, line, width * 4); dst += rb->stride; src += req->buf->stride; } + + free(line); } return 0;