mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
box-drawing: SEXTANTS, U+1fb00-1fb3b
This commit is contained in:
parent
00d0e53a95
commit
25d2b03a5c
3 changed files with 143 additions and 3 deletions
135
box-drawing.c
135
box-drawing.c
|
|
@ -9,6 +9,7 @@
|
|||
#include "macros.h"
|
||||
#include "stride.h"
|
||||
#include "terminal.h"
|
||||
#include "util.h"
|
||||
#include "xmalloc.h"
|
||||
|
||||
#define LIGHT 1.0
|
||||
|
|
@ -1321,9 +1322,137 @@ draw_quadrant_upper_right_and_lower_left_and_lower_right(uint8_t *buf, int width
|
|||
quad_lower_right();
|
||||
}
|
||||
|
||||
#define sextant_upper_left() rect(0, 0, round(width / 2.), round(height / 3.))
|
||||
#define sextant_middle_left() rect(0, height / 3, round(width / 2.), round(2. * height / 3.))
|
||||
#define sextant_lower_left() rect(0, 2 * height / 3, round(width / 2.), height)
|
||||
#define sextant_upper_right() rect(width / 2, 0, width, round(height / 3.))
|
||||
#define sextant_middle_right() rect(width / 2, height / 3, width, round(2. * height / 3.))
|
||||
#define sextant_lower_right() rect(width / 2, 2 * height / 3, width, height)
|
||||
|
||||
static void
|
||||
draw_sextant(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi)
|
||||
{
|
||||
/*
|
||||
* Each byte encodes one sextant:
|
||||
*
|
||||
* Bit sextant
|
||||
* 0 upper left
|
||||
* 1 middle left
|
||||
* 2 lower left
|
||||
* 3 upper right
|
||||
* 4 middle right
|
||||
* 5 lower right
|
||||
*/
|
||||
#define UPPER_LEFT (1 << 0)
|
||||
#define MIDDLE_LEFT (1 << 1)
|
||||
#define LOWER_LEFT (1 << 2)
|
||||
#define UPPER_RIGHT (1 << 3)
|
||||
#define MIDDLE_RIGHT (1 << 4)
|
||||
#define LOWER_RIGHT (1 << 5)
|
||||
|
||||
static const uint8_t matrix[60] = {
|
||||
/* U+1fb00 - U+1fb0f */
|
||||
UPPER_LEFT,
|
||||
UPPER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT,
|
||||
MIDDLE_LEFT,
|
||||
UPPER_LEFT | MIDDLE_LEFT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT,
|
||||
MIDDLE_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT,
|
||||
MIDDLE_LEFT | MIDDLE_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT,
|
||||
LOWER_LEFT,
|
||||
|
||||
/* U+1fb10 - U+1fb1f */
|
||||
UPPER_LEFT | LOWER_LEFT,
|
||||
UPPER_RIGHT | LOWER_LEFT,
|
||||
UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT,
|
||||
MIDDLE_LEFT | LOWER_LEFT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT,
|
||||
MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT,
|
||||
LOWER_RIGHT,
|
||||
UPPER_LEFT | LOWER_RIGHT,
|
||||
|
||||
/* U+1fb20 - U+1fb2f */
|
||||
UPPER_RIGHT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | LOWER_RIGHT,
|
||||
MIDDLE_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_RIGHT,
|
||||
MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_RIGHT,
|
||||
LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
|
||||
/* U+1fb30 - U+1fb3b */
|
||||
UPPER_LEFT | UPPER_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_LEFT | LOWER_LEFT | LOWER_RIGHT,
|
||||
MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | UPPER_RIGHT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_LEFT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
UPPER_RIGHT | MIDDLE_LEFT | MIDDLE_RIGHT | LOWER_LEFT | LOWER_RIGHT,
|
||||
};
|
||||
|
||||
assert(wc >= 0x1fb00 && wc <= 0x1fb3b);
|
||||
const size_t idx = wc - 0x1fb00;
|
||||
|
||||
assert(idx < ALEN(matrix));
|
||||
uint8_t encoded = matrix[idx];
|
||||
|
||||
if (encoded & UPPER_LEFT)
|
||||
sextant_upper_left();
|
||||
|
||||
if (encoded & MIDDLE_LEFT)
|
||||
sextant_middle_left();
|
||||
|
||||
if (encoded & LOWER_LEFT)
|
||||
sextant_lower_left();
|
||||
|
||||
if (encoded & UPPER_RIGHT)
|
||||
sextant_upper_right();
|
||||
|
||||
if (encoded & MIDDLE_RIGHT)
|
||||
sextant_middle_right();
|
||||
|
||||
if (encoded & LOWER_RIGHT)
|
||||
sextant_lower_right();
|
||||
}
|
||||
|
||||
static void
|
||||
draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi)
|
||||
{
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wpedantic"
|
||||
#endif
|
||||
|
||||
switch (wc) {
|
||||
case 0x2500: draw_box_drawings_light_horizontal(buf, width, height, stride, dpi); break;
|
||||
case 0x2501: draw_box_drawings_heavy_horizontal(buf, width, height, stride, dpi); break;
|
||||
|
|
@ -1505,7 +1634,13 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi)
|
|||
case 0x259d: draw_quadrant_upper_right(buf, width, height, stride, dpi); break;
|
||||
case 0x259e: draw_quadrant_upper_right_and_lower_left(buf, width, height, stride, dpi); break;
|
||||
case 0x259f: draw_quadrant_upper_right_and_lower_left_and_lower_right(buf, width, height, stride, dpi); break;
|
||||
|
||||
case 0x1fb00 ... 0x1fb3b: draw_sextant(wc, buf, width, height, stride, dpi); break;
|
||||
}
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
}
|
||||
|
||||
struct fcft_glyph * COLD
|
||||
|
|
|
|||
5
render.c
5
render.c
|
|
@ -450,9 +450,10 @@ render_cell(struct terminal *term, pixman_image_t *pix,
|
|||
base = composed->base;
|
||||
}
|
||||
|
||||
if (unlikely(base >= 0x2500 && base <= 0x259f)) {
|
||||
if (unlikely((base >= 0x2500 && base <= 0x259f) ||
|
||||
(base >= 0x1fb00 && base <= 0x1fb3b))) {
|
||||
/* Box drawing characters */
|
||||
size_t idx = base - 0x2500;
|
||||
size_t idx = base >= 0x1fb00 ? base - 0x1fb00 + 160 : base - 0x2500;
|
||||
assert(idx < ALEN(term->box_drawing));
|
||||
|
||||
if (likely(term->box_drawing[idx] != NULL))
|
||||
|
|
|
|||
|
|
@ -261,7 +261,11 @@ struct terminal {
|
|||
int font_scale;
|
||||
enum fcft_subpixel font_subpixel;
|
||||
|
||||
struct fcft_glyph *box_drawing[160];
|
||||
/*
|
||||
* 0-159: U+250U+259F
|
||||
* 160-219: U+1FB00-1FB3B
|
||||
*/
|
||||
struct fcft_glyph *box_drawing[220];
|
||||
|
||||
bool is_sending_paste_data;
|
||||
ptmx_buffer_list_t ptmx_buffers;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue