box-drawing: add infrastructure for rendering box drawing characters ourselves

* ‘term’ struct contains an array of 160 fcft glyph pointers
* the glyph pointers are lazily allocated when we need to draw a box
  drawings character
* Filtering out box drawings characters is easy - they are (except
  unicode 13, which isn’t handled yet )all in a single range.
This commit is contained in:
Daniel Eklöf 2020-12-26 16:24:16 +01:00
parent 44b32104a7
commit 7acdb3a0dd
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
7 changed files with 274 additions and 1 deletions

View file

@ -16,6 +16,7 @@
#define LOG_MODULE "render"
#define LOG_ENABLE_DBG 0
#include "log.h"
#include "box-drawing.h"
#include "config.h"
#include "grid.h"
#include "hsl.h"
@ -449,7 +450,26 @@ render_cell(struct terminal *term, pixman_image_t *pix,
base = composed->base;
}
glyph = fcft_glyph_rasterize(font, base, term->font_subpixel);
if (unlikely(base >= 0x2500 && base <= 0x259f)) {
/* Box drawing characters */
size_t idx = base - 0x2500;
assert(idx < ALEN(term->box_drawing));
if (likely(term->box_drawing[idx] != NULL))
glyph = term->box_drawing[idx];
else {
mtx_lock(&term->render.workers.lock);
/* Parallel thread may have instantiated it while we took the lock */
if (term->box_drawing[idx] == NULL)
term->box_drawing[idx] = box_drawing(term, base);
mtx_unlock(&term->render.workers.lock);
glyph = term->box_drawing[idx];
assert(glyph != NULL);
}
} else
glyph = fcft_glyph_rasterize(font, base, term->font_subpixel);
}
const int cols_left = term->cols - col;