From 7acdb3a0dd5633ac79aa7664df300b1fdbe715f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 16:24:16 +0100 Subject: [PATCH 01/62] box-drawing: add infrastructure for rendering box drawing characters ourselves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ‘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. --- box-drawing.c | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++ box-drawing.h | 6 ++ meson.build | 1 + render.c | 22 ++++- stride.h | 9 ++ terminal.c | 7 ++ terminal.h | 2 + 7 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 box-drawing.c create mode 100644 box-drawing.h create mode 100644 stride.h diff --git a/box-drawing.c b/box-drawing.c new file mode 100644 index 00000000..c7e5ec7f --- /dev/null +++ b/box-drawing.c @@ -0,0 +1,228 @@ +#include "box-drawing.h" + +#include +#include + +#define LOG_MODULE "box-drawing" +#define LOG_ENABLE_DBG 1 +#include "log.h" +#include "stride.h" +#include "terminal.h" +#include "xmalloc.h" + +static void +draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) +{ + switch (wc) { + case 0x2500: + case 0x2501: + case 0x2502: + case 0x2503: + case 0x2504: + case 0x2505: + case 0x2506: + case 0x2507: + case 0x2508: + case 0x2509: + case 0x250a: + case 0x250b: + case 0x250c: + case 0x250d: + case 0x250e: + case 0x250f: + + case 0x2510: + case 0x2511: + case 0x2512: + case 0x2513: + case 0x2514: + case 0x2515: + case 0x2516: + case 0x2517: + case 0x2518: + case 0x2519: + case 0x251a: + case 0x251b: + case 0x251c: + case 0x251d: + case 0x251e: + case 0x251f: + + case 0x2520: + case 0x2521: + case 0x2522: + case 0x2523: + case 0x2524: + case 0x2525: + case 0x2526: + case 0x2527: + case 0x2528: + case 0x2529: + case 0x252a: + case 0x252b: + case 0x252c: + case 0x252d: + case 0x252e: + case 0x252f: + + case 0x2530: + case 0x2531: + case 0x2532: + case 0x2533: + case 0x2534: + case 0x2535: + case 0x2536: + case 0x2537: + case 0x2538: + case 0x2539: + case 0x253a: + case 0x253b: + case 0x253c: + case 0x253d: + case 0x253e: + case 0x253f: + + case 0x2540: + case 0x2541: + case 0x2542: + case 0x2543: + case 0x2544: + case 0x2545: + case 0x2546: + case 0x2547: + case 0x2548: + case 0x2549: + case 0x254a: + case 0x254b: + case 0x254c: + case 0x254d: + case 0x254e: + case 0x254f: + + case 0x2550: + case 0x2551: + case 0x2552: + case 0x2553: + case 0x2554: + case 0x2555: + case 0x2556: + case 0x2557: + case 0x2558: + case 0x2559: + case 0x255a: + case 0x255b: + case 0x255c: + case 0x255d: + case 0x255e: + case 0x255f: + + case 0x2560: + case 0x2561: + case 0x2562: + case 0x2563: + case 0x2564: + case 0x2565: + case 0x2566: + case 0x2567: + case 0x2568: + case 0x2569: + case 0x256a: + case 0x256b: + case 0x256c: + case 0x256d: + case 0x256e: + case 0x256f: + + case 0x2570: + case 0x2571: + case 0x2572: + case 0x2573: + case 0x2574: + case 0x2575: + case 0x2576: + case 0x2577: + case 0x2578: + case 0x2579: + case 0x257a: + case 0x257b: + case 0x257c: + case 0x257d: + case 0x257e: + case 0x257f: + + case 0x2580: + case 0x2581: + case 0x2582: + case 0x2583: + case 0x2584: + case 0x2585: + case 0x2586: + case 0x2587: + case 0x2588: + case 0x2589: + case 0x258a: + case 0x258b: + case 0x258c: + case 0x258d: + case 0x258e: + case 0x258f: + + case 0x2590: + case 0x2591: + case 0x2592: + case 0x2593: + case 0x2594: + case 0x2595: + case 0x2596: + case 0x2597: + case 0x2598: + case 0x2599: + case 0x259a: + case 0x259b: + case 0x259c: + case 0x259d: + case 0x259e: + case 0x259f: + LOG_WARN("unimplemented: box drawing: wc=%04x", wc); + //assert(false); + break; + } +} + +struct fcft_glyph * +box_drawing(struct terminal *term, wchar_t wc) +{ + LOG_DBG("rendering 0x%04x", wc); + + int width = term->cell_width; + int height = term->cell_height; + int stride = stride_for_format_and_width(PIXMAN_a1, width); + uint8_t *data = xcalloc(height * stride, 1); + + pixman_image_t *pix = pixman_image_create_bits_no_clear( + PIXMAN_a1, width, height, (uint32_t*)data, stride); + + if (pix == NULL) { + errno = ENOMEM; + perror(__func__); + abort(); + } + + draw_glyph(wc, pix, width, height, stride); + + struct fcft_glyph *glyph = xmalloc(sizeof(*glyph)); + *glyph = (struct fcft_glyph){ + .wc = wc, + .cols = 1, + .pix = pix, + .x = 0, + .y = term->fonts[0]->ascent, + .width = width, + .height = height, + .advance = { + .x = width, + .y = height, + }, + }; + return glyph; +} diff --git a/box-drawing.h b/box-drawing.h new file mode 100644 index 00000000..aecbf1b3 --- /dev/null +++ b/box-drawing.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +struct terminal; +struct fcft_glyph *box_drawing(struct terminal *term, wchar_t wc); diff --git a/meson.build b/meson.build index b382b496..dc76f041 100644 --- a/meson.build +++ b/meson.build @@ -149,6 +149,7 @@ executable( executable( 'foot', 'async.c', 'async.h', + 'box-drawing.c', 'box-drawing.h', 'config.c', 'config.h', 'commands.c', 'commands.h', 'extract.c', 'extract.h', diff --git a/render.c b/render.c index f66e277e..77e6ba5f 100644 --- a/render.c +++ b/render.c @@ -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; diff --git a/stride.h b/stride.h new file mode 100644 index 00000000..b2c71a71 --- /dev/null +++ b/stride.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +static inline int +stride_for_format_and_width(pixman_format_code_t format, int width) +{ + return (((PIXMAN_FORMAT_BPP(format) * width + 7) / 8 + 4 - 1) & -4); +} diff --git a/terminal.c b/terminal.c index ecb4e6cc..1a0a9cf9 100644 --- a/terminal.c +++ b/terminal.c @@ -1412,6 +1412,13 @@ term_destroy(struct terminal *term) for (size_t i = 0; i < 4; i++) free(term->font_sizes[i]); + for (size_t i = 0; i < ALEN(term->box_drawing); i++) { + if (term->box_drawing[i] != NULL) { + pixman_image_unref(term->box_drawing[i]->pix); + free(term->box_drawing[i]); + } + } + free(term->search.buf); if (term->render.workers.threads != NULL) { diff --git a/terminal.h b/terminal.h index e13243a2..8dea2435 100644 --- a/terminal.h +++ b/terminal.h @@ -261,6 +261,8 @@ struct terminal { int font_scale; enum fcft_subpixel font_subpixel; + struct fcft_glyph *box_drawing[160]; + bool is_sending_paste_data; ptmx_buffer_list_t ptmx_buffers; ptmx_buffer_list_t ptmx_paste_buffers; From 92dc581bea428a69bb944d574629f8ad7f0dd3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 16:34:55 +0100 Subject: [PATCH 02/62] box-drawing: fix compilation error on 32-bit; wc is int on 64-bit, long on 32-bit --- box-drawing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index c7e5ec7f..0319412f 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -183,7 +183,7 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x259d: case 0x259e: case 0x259f: - LOG_WARN("unimplemented: box drawing: wc=%04x", wc); + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); //assert(false); break; } @@ -192,7 +192,7 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) struct fcft_glyph * box_drawing(struct terminal *term, wchar_t wc) { - LOG_DBG("rendering 0x%04x", wc); + LOG_DBG("rendering 0x%04lx", (long)wc); int width = term->cell_width; int height = term->cell_height; From 736c88c3fbc5c08df2eba704b6ee542dcd55db97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 16:44:11 +0100 Subject: [PATCH 03/62] term: clear box drawing glyph cache when reloading fonts --- terminal.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/terminal.c b/terminal.c index 1a0a9cf9..6ba04677 100644 --- a/terminal.c +++ b/terminal.c @@ -618,6 +618,14 @@ term_set_fonts(struct terminal *term, struct fcft_font *fonts[static 4]) term->fonts[i] = fonts[i]; } + for (size_t i = 0; i < ALEN(term->box_drawing); i++) { + if (term->box_drawing[i] != NULL) { + pixman_image_unref(term->box_drawing[i]->pix); + free(term->box_drawing[i]); + term->box_drawing[i] = NULL; + } + } + const int old_cell_width = term->cell_width; const int old_cell_height = term->cell_height; From fc95c7f48c0a8ae4aa68442d9d344452eca2983b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 18:47:55 +0100 Subject: [PATCH 04/62] box-drawing: initial set of LIGHT box drawings * 2500 * 2502 * 250c * 2510 * 2514 * 2518 * 251c * 2524 * 252c * 2534 * 253c --- box-drawing.c | 182 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 167 insertions(+), 15 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 0319412f..af97ecc6 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -11,12 +11,145 @@ #include "xmalloc.h" static void -draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) +hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) +{ + for (size_t row = y; row < y + thick; row++) { + for (size_t col = x1; col < x2; col++) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + +static void +vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) +{ + for (size_t row = y1; row < y2; row++) { + for (size_t col = x; col < x + thick; col++) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + +static void +draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + const int thick = 1 * dpi / 72; + hline(buf, 0, width, (height - thick) / 2, thick, stride); +} + +static void +draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + assert(false); +} + +static void +draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + vline(buf, 0, height, (width - thick) / 2, thick, stride); +} + +static void +draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, vmid, width, hmid, thick, stride); + vline(buf, hmid, height, vmid, thick, stride); +} + +static void +draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, 0, vmid, hmid, thick, stride); + vline(buf, hmid, height, vmid, thick, stride); +} + +static void +draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, vmid, width, hmid, thick, stride); + vline(buf, 0, hmid, vmid, thick, stride); +} + +static void +draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, 0, vmid, hmid, thick, stride); + vline(buf, 0, hmid + 1, vmid, thick, stride); +} + +static void +draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, vmid, width, hmid, thick, stride); + vline(buf, 0, height, vmid, thick, stride); +} + +static void +draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, 0, vmid, hmid, thick, stride); + vline(buf, 0, height, vmid, thick, stride); +} + +static void +draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, 0, width, hmid, thick, stride); + vline(buf, hmid, height, vmid, thick, stride); +} + +static void +draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = 1 * dpi / 72; + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, 0, width, hmid, thick, stride); + vline(buf, 0, hmid, vmid, thick, stride); +} + +static void +draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_light_vertical(buf, width, height, stride, dpi); + draw_box_drawings_light_horizontal(buf, width, height, stride, dpi); +} + +static void +draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { switch (wc) { - case 0x2500: - case 0x2501: - case 0x2502: + 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; + case 0x2502: draw_box_drawings_light_vertical(buf, width, height, stride, dpi); break; + case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; + case 0x2503: case 0x2504: case 0x2505: @@ -26,33 +159,39 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x2509: case 0x250a: case 0x250b: - case 0x250c: case 0x250d: case 0x250e: case 0x250f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; + + case 0x2510: draw_box_drawings_light_down_and_left(buf, width, height, stride, dpi); break; + case 0x2514: draw_box_drawings_light_up_and_right(buf, width, height, stride, dpi); break; + case 0x2518: draw_box_drawings_light_up_and_left(buf, width, height, stride, dpi); break; + case 0x251c: draw_box_drawings_light_vertical_and_right(buf, width, height, stride, dpi); break; - case 0x2510: case 0x2511: case 0x2512: case 0x2513: - case 0x2514: case 0x2515: case 0x2516: case 0x2517: - case 0x2518: case 0x2519: case 0x251a: case 0x251b: - case 0x251c: case 0x251d: case 0x251e: case 0x251f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; + + case 0x2524: draw_box_drawings_light_vertical_and_left(buf, width, height, stride, dpi); break; + case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; case 0x2520: case 0x2521: case 0x2522: case 0x2523: - case 0x2524: case 0x2525: case 0x2526: case 0x2527: @@ -60,16 +199,19 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x2529: case 0x252a: case 0x252b: - case 0x252c: case 0x252d: case 0x252e: case 0x252f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; + + case 0x2534: draw_box_drawings_light_up_and_horizontal(buf, width, height, stride, dpi); break; + case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; case 0x2530: case 0x2531: case 0x2532: case 0x2533: - case 0x2534: case 0x2535: case 0x2536: case 0x2537: @@ -77,10 +219,11 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x2539: case 0x253a: case 0x253b: - case 0x253c: case 0x253d: case 0x253e: case 0x253f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2540: case 0x2541: @@ -98,6 +241,8 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x254d: case 0x254e: case 0x254f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2550: case 0x2551: @@ -115,6 +260,8 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x255d: case 0x255e: case 0x255f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2560: case 0x2561: @@ -132,6 +279,8 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x256d: case 0x256e: case 0x256f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2570: case 0x2571: @@ -149,6 +298,8 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x257d: case 0x257e: case 0x257f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2580: case 0x2581: @@ -166,6 +317,8 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x258d: case 0x258e: case 0x258f: + LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); + break; case 0x2590: case 0x2591: @@ -184,7 +337,6 @@ draw_glyph(wchar_t wc, pixman_image_t *pix, int width, int height, int stride) case 0x259e: case 0x259f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - //assert(false); break; } } @@ -208,7 +360,7 @@ box_drawing(struct terminal *term, wchar_t wc) abort(); } - draw_glyph(wc, pix, width, height, stride); + draw_glyph(wc, data, width, height, stride, term->font_dpi); struct fcft_glyph *glyph = xmalloc(sizeof(*glyph)); *glyph = (struct fcft_glyph){ From 032da5b14e083aaf499490477f524e5bf6c80186 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 20:57:17 +0100 Subject: [PATCH 05/62] box-drawing: break out thickness calculation --- box-drawing.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index af97ecc6..b870541f 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -10,6 +10,12 @@ #include "terminal.h" #include "xmalloc.h" +static int +thickness(int pts, int dpi) +{ + return pts * dpi / 72; +} + static void hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) { @@ -37,7 +43,7 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); hline(buf, 0, width, (height - thick) / 2, thick, stride); } @@ -50,14 +56,14 @@ draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stri static void draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); vline(buf, 0, height, (width - thick) / 2, thick, stride); } static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, vmid, width, hmid, thick, stride); @@ -67,7 +73,7 @@ draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int static void draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, vmid, hmid, thick, stride); @@ -77,7 +83,7 @@ draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int s static void draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, vmid, width, hmid, thick, stride); @@ -87,7 +93,7 @@ draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int st static void draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, vmid, hmid, thick, stride); @@ -97,7 +103,7 @@ draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int str static void draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, vmid, width, hmid, thick, stride); @@ -107,7 +113,7 @@ draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, static void draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, vmid, hmid, thick, stride); @@ -117,7 +123,7 @@ draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, i static void draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, width, hmid, thick, stride); @@ -127,7 +133,7 @@ draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, static void draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - int thick = 1 * dpi / 72; + const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, width, hmid, thick, stride); From 4f6595c0f3ac5794cf3aa8c44c4e96ef499ce391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 21:21:58 +0100 Subject: [PATCH 06/62] box-drawing: HEAVY versions of solid lines --- box-drawing.c | 182 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 147 insertions(+), 35 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index b870541f..0b871b11 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -40,70 +40,129 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } +static void +draw_box_drawings_xxx_horizontal(uint8_t *buf, int width, int height, int stride, int thick) +{ + hline(buf, 0, width, (height - thick) / 2, thick, stride); +} + static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); - hline(buf, 0, width, (height - thick) / 2, thick, stride); + draw_box_drawings_xxx_horizontal(buf, width, height, stride, thickness(1, dpi)); } static void draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - assert(false); + draw_box_drawings_xxx_horizontal(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_vertical(uint8_t *buf, int width, int height, int stride, int thick) +{ + vline(buf, 0, height, (width - thick) / 2, thick, stride); } static void draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); - vline(buf, 0, height, (width - thick) / 2, thick, stride); + draw_box_drawings_xxx_vertical(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_vertical(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_down_and_right(uint8_t *buf, int width, int height, int stride, int thick) +{ + int hmid = (height - thick) / 2; + int vmid = (width - thick) / 2; + hline(buf, vmid, width, hmid, thick, stride); + vline(buf, hmid, height, vmid, thick, stride); } static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); + draw_box_drawings_xxx_down_and_right(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_down_and_right(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_down_and_left(uint8_t *buf, int width, int height, int stride, int thick) +{ int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; - hline(buf, vmid, width, hmid, thick, stride); + hline(buf, 0, vmid, hmid, thick, stride); vline(buf, hmid, height, vmid, thick, stride); } static void draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); + draw_box_drawings_xxx_down_and_left(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_down_and_left(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_up_and_right(uint8_t *buf, int width, int height, int stride, int thick) +{ int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; - hline(buf, 0, vmid, hmid, thick, stride); - vline(buf, hmid, height, vmid, thick, stride); + hline(buf, vmid, width, hmid, thick, stride); + vline(buf, 0, hmid, vmid, thick, stride); } static void draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); + draw_box_drawings_xxx_up_and_right(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_up_and_right(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_up_and_left(uint8_t *buf, int width, int height, int stride, int thick) +{ int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; - hline(buf, vmid, width, hmid, thick, stride); + hline(buf, 0, vmid + thick, hmid, thick, stride); vline(buf, 0, hmid, vmid, thick, stride); } static void draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - const int thick = thickness(1, dpi); - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, vmid, hmid, thick, stride); - vline(buf, 0, hmid + 1, vmid, thick, stride); + draw_box_drawings_xxx_up_and_left(buf, width, height, stride, thickness(1, dpi)); } static void -draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_up_and_left(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_vertical_and_right(uint8_t *buf, int width, int height, int stride, int thick) { - const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, vmid, width, hmid, thick, stride); @@ -111,9 +170,20 @@ draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, } static void -draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_vertical_and_right(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_vertical_and_right(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_vertical_and_left(uint8_t *buf, int width, int height, int stride, int thick) { - const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, vmid, hmid, thick, stride); @@ -121,9 +191,20 @@ draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, i } static void -draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_vertical_and_left(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_vertical_and_left(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int thick) { - const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, width, hmid, thick, stride); @@ -131,15 +212,38 @@ draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, } static void -draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_down_and_horizontal(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_down_and_horizontal(buf, width, height, stride, thickness(2, dpi)); +} + +static void +draw_box_drawings_xxx_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int thick) { - const int thick = thickness(1, dpi); int hmid = (height - thick) / 2; int vmid = (width - thick) / 2; hline(buf, 0, width, hmid, thick, stride); vline(buf, 0, hmid, vmid, thick, stride); } +static void +draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_up_and_horizontal(buf, width, height, stride, thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_xxx_up_and_horizontal(buf, width, height, stride, thickness(2, dpi)); +} + static void draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -147,6 +251,13 @@ draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int hei draw_box_drawings_light_horizontal(buf, width, height, stride, dpi); } +static void +draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); + draw_box_drawings_heavy_horizontal(buf, width, height, stride, dpi); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -154,9 +265,10 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) 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; case 0x2502: draw_box_drawings_light_vertical(buf, width, height, stride, dpi); break; + case 0x2503: draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); break; case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; + case 0x250f: draw_box_drawings_heavy_down_and_right(buf, width, height, stride, dpi); break; - case 0x2503: case 0x2504: case 0x2505: case 0x2506: @@ -167,70 +279,71 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x250b: case 0x250d: case 0x250e: - case 0x250f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; case 0x2510: draw_box_drawings_light_down_and_left(buf, width, height, stride, dpi); break; + case 0x2513: draw_box_drawings_heavy_down_and_left(buf, width, height, stride, dpi); break; case 0x2514: draw_box_drawings_light_up_and_right(buf, width, height, stride, dpi); break; + case 0x2517: draw_box_drawings_heavy_up_and_right(buf, width, height, stride, dpi); break; case 0x2518: draw_box_drawings_light_up_and_left(buf, width, height, stride, dpi); break; + case 0x251b: draw_box_drawings_heavy_up_and_left(buf, width, height, stride, dpi); break; case 0x251c: draw_box_drawings_light_vertical_and_right(buf, width, height, stride, dpi); break; case 0x2511: case 0x2512: - case 0x2513: case 0x2515: case 0x2516: - case 0x2517: case 0x2519: case 0x251a: - case 0x251b: case 0x251d: case 0x251e: case 0x251f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; + case 0x2523: draw_box_drawings_heavy_vertical_and_right(buf, width, height, stride, dpi); break; case 0x2524: draw_box_drawings_light_vertical_and_left(buf, width, height, stride, dpi); break; + case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf, width, height, stride, dpi); break; case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; case 0x2520: case 0x2521: case 0x2522: - case 0x2523: case 0x2525: case 0x2526: case 0x2527: case 0x2528: case 0x2529: case 0x252a: - case 0x252b: case 0x252d: case 0x252e: case 0x252f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; + case 0x2533: draw_box_drawings_heavy_down_and_horizontal(buf, width, height, stride, dpi); break; case 0x2534: draw_box_drawings_light_up_and_horizontal(buf, width, height, stride, dpi); break; + case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf, width, height, stride, dpi); break; case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; case 0x2530: case 0x2531: case 0x2532: - case 0x2533: case 0x2535: case 0x2536: case 0x2537: case 0x2538: case 0x2539: case 0x253a: - case 0x253b: case 0x253d: case 0x253e: case 0x253f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; + case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf, width, height, stride, dpi); break; + case 0x2540: case 0x2541: case 0x2542: @@ -242,7 +355,6 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2548: case 0x2549: case 0x254a: - case 0x254b: case 0x254c: case 0x254d: case 0x254e: From a692ecf65662f6c8aabd93876ff077e2348499c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 22:23:56 +0100 Subject: [PATCH 07/62] box-drawing: add {h,v}line_middle_{left,right,up,down} primitives All solid lines LIGHT/HEAVY line drawings implemented so far can be implemented in terms of these. --- box-drawing.c | 180 ++++++++++++++++++++------------------------------ 1 file changed, 71 insertions(+), 109 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 0b871b11..a438c103 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -40,222 +40,186 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } -static void -draw_box_drawings_xxx_horizontal(uint8_t *buf, int width, int height, int stride, int thick) -{ - hline(buf, 0, width, (height - thick) / 2, thick, stride); -} +/* Vertially centered horizontal line, from the center out to the left edge */ +#define hline_middle_left(thick) \ + hline(buf, 0, (width - thick) / 2 + thick, (height - thick) / 2, thick, stride) + +/* Vertially centered horizontal line, from the center out to the right edge */ +#define hline_middle_right(thick) \ + hline(buf, (width - thick) / 2, width, (height - thick) / 2, thick, stride) + +/* Horizontally centered vertical line, from the center up to the top edge */ +#define vline_middle_up(thick) \ + vline(buf, 0, (height - thick) / 2 + thick, (width - thick) / 2, thick, stride) + +/* Horizontally centered vertical line, from the center down to the bottom edge */ +#define vline_middle_down(thick) \ + vline(buf, (height - thick) / 2, height, (width - thick) / 2, thick, stride) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_horizontal(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); } static void draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_horizontal(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_vertical(uint8_t *buf, int width, int height, int stride, int thick) -{ - vline(buf, 0, height, (width - thick) / 2, thick, stride); + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); } static void draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical(buf, width, height, stride, thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_down_and_right(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, vmid, width, hmid, thick, stride); - vline(buf, hmid, height, vmid, thick, stride); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_right(buf, width, height, stride, thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_right(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_down_and_left(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, vmid, hmid, thick, stride); - vline(buf, hmid, height, vmid, thick, stride); + hline_middle_right(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_left(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_left(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_up_and_right(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, vmid, width, hmid, thick, stride); - vline(buf, 0, hmid, vmid, thick, stride); + hline_middle_left(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_right(buf, width, height, stride, thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); } static void draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_right(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_up_and_left(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, vmid + thick, hmid, thick, stride); - vline(buf, 0, hmid, vmid, thick, stride); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); } static void draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_left(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); } static void draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_left(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_vertical_and_right(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, vmid, width, hmid, thick, stride); - vline(buf, 0, height, vmid, thick, stride); + hline_middle_left(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); } static void draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical_and_right(buf, width, height, stride, thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical_and_right(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_vertical_and_left(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, vmid, hmid, thick, stride); - vline(buf, 0, height, vmid, thick, stride); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical_and_left(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_vertical_and_left(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, width, hmid, thick, stride); - vline(buf, hmid, height, vmid, thick, stride); + hline_middle_left(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_horizontal(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_down_and_horizontal(buf, width, height, stride, thickness(2, dpi)); -} - -static void -draw_box_drawings_xxx_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int thick) -{ - int hmid = (height - thick) / 2; - int vmid = (width - thick) / 2; - hline(buf, 0, width, hmid, thick, stride); - vline(buf, 0, hmid, vmid, thick, stride); + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_horizontal(buf, width, height, stride, thickness(1, dpi)); + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); } static void draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_xxx_up_and_horizontal(buf, width, height, stride, thickness(2, dpi)); + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); } static void draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_light_vertical(buf, width, height, stride, dpi); - draw_box_drawings_light_horizontal(buf, width, height, stride, dpi); + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); } static void draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); - draw_box_drawings_heavy_horizontal(buf, width, height, stride, dpi); + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); } static void @@ -462,8 +426,6 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) struct fcft_glyph * box_drawing(struct terminal *term, wchar_t wc) { - LOG_DBG("rendering 0x%04lx", (long)wc); - int width = term->cell_width; int height = term->cell_height; int stride = stride_for_format_and_width(PIXMAN_a1, width); From 42e22027efc20f32a49071f6fb872fd0273dcb39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 22:58:08 +0100 Subject: [PATCH 08/62] box-drawing: add mixed LIGHT/HEAVY corners * U+250D * U+250E * U+2511 * U+2512 * U+2515 * U+2516 * U+2519 * U+251A --- box-drawing.c | 98 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 22 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index a438c103..d6af6b4e 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -40,21 +40,19 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } -/* Vertially centered horizontal line, from the center out to the left edge */ -#define hline_middle_left(thick) \ - hline(buf, 0, (width - thick) / 2 + thick, (height - thick) / 2, thick, stride) +#define _hline_middle_left(vthick, hthick) \ + hline(buf, 0, (width - vthick) / 2 + vthick, (height - hthick) / 2, hthick, stride) +#define _hline_middle_right(vthick, hthick) \ + hline(buf, (width - vthick) / 2, width, (height - hthick) / 2, hthick, stride) +#define _vline_middle_up(vthick, hthick) \ + vline(buf, 0, (height - hthick) / 2 + hthick, (width - vthick) / 2, vthick, stride) +#define _vline_middle_down(vthick, hthick) \ + vline(buf, (height - hthick) / 2, height, (width - vthick) / 2, vthick, stride) -/* Vertially centered horizontal line, from the center out to the right edge */ -#define hline_middle_right(thick) \ - hline(buf, (width - thick) / 2, width, (height - thick) / 2, thick, stride) - -/* Horizontally centered vertical line, from the center up to the top edge */ -#define vline_middle_up(thick) \ - vline(buf, 0, (height - thick) / 2 + thick, (width - thick) / 2, thick, stride) - -/* Horizontally centered vertical line, from the center down to the bottom edge */ -#define vline_middle_down(thick) \ - vline(buf, (height - thick) / 2, height, (width - thick) / 2, thick, stride) +#define hline_middle_left(thick) _hline_middle_left(thick, thick) +#define hline_middle_right(thick) _hline_middle_right(thick, thick) +#define vline_middle_up(thick) _vline_middle_up(thick, thick) +#define vline_middle_down(thick) _vline_middle_down(thick, thick) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) @@ -91,6 +89,20 @@ draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_down_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + static void draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -105,6 +117,20 @@ draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int s vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_down_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + static void draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -119,6 +145,20 @@ draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int st vline_middle_up(thickness(1, dpi)); } +static void +draw_box_drawings_up_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); +} + static void draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -133,6 +173,20 @@ draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int str vline_middle_up(thickness(1, dpi)); } +static void +draw_box_drawings_up_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); +} + static void draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -231,6 +285,8 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2502: draw_box_drawings_light_vertical(buf, width, height, stride, dpi); break; case 0x2503: draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); break; case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; + case 0x250d: draw_box_drawings_down_light_and_right_heavy(buf, width, height, stride, dpi); break; + case 0x250e: draw_box_drawings_down_heavy_and_right_light(buf, width, height, stride, dpi); break; case 0x250f: draw_box_drawings_heavy_down_and_right(buf, width, height, stride, dpi); break; case 0x2504: @@ -241,25 +297,23 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2509: case 0x250a: case 0x250b: - case 0x250d: - case 0x250e: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; case 0x2510: draw_box_drawings_light_down_and_left(buf, width, height, stride, dpi); break; + case 0x2511: draw_box_drawings_down_light_and_left_heavy(buf, width, height, stride, dpi); break; + case 0x2512: draw_box_drawings_down_heavy_and_left_light(buf, width, height, stride, dpi); break; case 0x2513: draw_box_drawings_heavy_down_and_left(buf, width, height, stride, dpi); break; case 0x2514: draw_box_drawings_light_up_and_right(buf, width, height, stride, dpi); break; + case 0x2515: draw_box_drawings_up_light_and_right_heavy(buf, width, height, stride, dpi); break; + case 0x2516: draw_box_drawings_up_heavy_and_right_light(buf, width, height, stride, dpi); break; case 0x2517: draw_box_drawings_heavy_up_and_right(buf, width, height, stride, dpi); break; case 0x2518: draw_box_drawings_light_up_and_left(buf, width, height, stride, dpi); break; + case 0x2519: draw_box_drawings_up_light_and_left_heavy(buf, width, height, stride, dpi); break; + case 0x251a: draw_box_drawings_up_heavy_and_left_light(buf, width, height, stride, dpi); break; case 0x251b: draw_box_drawings_heavy_up_and_left(buf, width, height, stride, dpi); break; case 0x251c: draw_box_drawings_light_vertical_and_right(buf, width, height, stride, dpi); break; - case 0x2511: - case 0x2512: - case 0x2515: - case 0x2516: - case 0x2519: - case 0x251a: case 0x251d: case 0x251e: case 0x251f: From 56920558d6d5a86c56af1b245341fb11614198be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 26 Dec 2020 23:14:54 +0100 Subject: [PATCH 09/62] box-drawing: add mixed LIGHT/HEAVY VERTICAL AND RIGHT * U+251D * U+251E * U+251F * U+2520 * U+2521 * U+2522 --- box-drawing.c | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index d6af6b4e..4fe3def4 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -202,6 +202,54 @@ draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_vertical_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + +static void +draw_box_drawings_vertical_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_down_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + static void draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -313,21 +361,18 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x251a: draw_box_drawings_up_heavy_and_left_light(buf, width, height, stride, dpi); break; case 0x251b: draw_box_drawings_heavy_up_and_left(buf, width, height, stride, dpi); break; case 0x251c: draw_box_drawings_light_vertical_and_right(buf, width, height, stride, dpi); break; + case 0x251d: draw_box_drawings_vertical_light_and_right_heavy(buf, width, height, stride, dpi); break; + case 0x251e: draw_box_drawings_up_heavy_and_right_down_light(buf, width, height, stride, dpi); break; + case 0x251f: draw_box_drawings_down_heavy_and_right_up_light(buf, width, height, stride, dpi); break; - case 0x251d: - case 0x251e: - case 0x251f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; - + case 0x2520: draw_box_drawings_vertical_heavy_and_right_light(buf, width, height, stride, dpi); break; + case 0x2521: draw_box_drawings_down_light_and_right_up_heavy(buf, width, height, stride, dpi); break; + case 0x2522: draw_box_drawings_up_light_and_right_down_heavy(buf, width, height, stride, dpi); break; case 0x2523: draw_box_drawings_heavy_vertical_and_right(buf, width, height, stride, dpi); break; case 0x2524: draw_box_drawings_light_vertical_and_left(buf, width, height, stride, dpi); break; case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf, width, height, stride, dpi); break; case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2520: - case 0x2521: - case 0x2522: case 0x2525: case 0x2526: case 0x2527: From fe54fcc69478d2ec762ffe3ac205abddaed211d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 12:12:24 +0100 Subject: [PATCH 10/62] box-drawing: mixed LIGHT/HEAVY variants of VERTICAL AND LEFT * U+2525 * U+2526 * U+2527 * U+2528 * U+2529 * U+252A --- box-drawing.c | 60 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 4fe3def4..ebe5b585 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -266,6 +266,54 @@ draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, i vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_vertical_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + +static void +draw_box_drawings_vertical_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_down_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + static void draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -370,15 +418,15 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2522: draw_box_drawings_up_light_and_right_down_heavy(buf, width, height, stride, dpi); break; case 0x2523: draw_box_drawings_heavy_vertical_and_right(buf, width, height, stride, dpi); break; case 0x2524: draw_box_drawings_light_vertical_and_left(buf, width, height, stride, dpi); break; + case 0x2525: draw_box_drawings_vertical_light_and_left_heavy(buf, width, height, stride, dpi); break; + case 0x2526: draw_box_drawings_up_heavy_and_left_down_light(buf, width, height, stride, dpi); break; + case 0x2527: draw_box_drawings_down_heavy_and_left_up_light(buf, width, height, stride, dpi); break; + case 0x2528: draw_box_drawings_vertical_heavy_and_left_light(buf, width, height, stride, dpi); break; + case 0x2529: draw_box_drawings_down_light_and_left_up_heavy(buf, width, height, stride, dpi); break; + case 0x252a: draw_box_drawings_up_light_and_left_down_heavy(buf, width, height, stride, dpi); break; case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf, width, height, stride, dpi); break; case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2525: - case 0x2526: - case 0x2527: - case 0x2528: - case 0x2529: - case 0x252a: case 0x252d: case 0x252e: case 0x252f: From 20c9a0a91881e681c8748b228591f698e844c18f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 12:21:37 +0100 Subject: [PATCH 11/62] box-drawing: mixed LIGHT/HEAVY variants of DOWN AND HORIZONTAL * U+252d * U+252e * U+252f * U+2530 * U+2531 * U+2532 --- box-drawing.c | 63 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 9 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index ebe5b585..682a6403 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -330,6 +330,54 @@ draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_left_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_right_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + +static void +draw_box_drawings_right_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_left_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + static void draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -426,21 +474,18 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x252a: draw_box_drawings_up_light_and_left_down_heavy(buf, width, height, stride, dpi); break; case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf, width, height, stride, dpi); break; case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; + case 0x252d: draw_box_drawings_left_heavy_and_right_down_light(buf, width, height, stride, dpi); break; + case 0x252e: draw_box_drawings_right_heavy_and_left_down_light(buf, width, height, stride, dpi); break; + case 0x252f: draw_box_drawings_down_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; - case 0x252d: - case 0x252e: - case 0x252f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; - + case 0x2530: draw_box_drawings_down_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; + case 0x2531: draw_box_drawings_right_light_and_left_down_heavy(buf, width, height, stride, dpi); break; + case 0x2532: draw_box_drawings_left_light_and_right_down_heavy(buf, width, height, stride, dpi); break; case 0x2533: draw_box_drawings_heavy_down_and_horizontal(buf, width, height, stride, dpi); break; case 0x2534: draw_box_drawings_light_up_and_horizontal(buf, width, height, stride, dpi); break; case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf, width, height, stride, dpi); break; case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2530: - case 0x2531: - case 0x2532: case 0x2535: case 0x2536: case 0x2537: From 011c58f759f9bfa89b3b2fa653e84afeb9a6138e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 12:29:44 +0100 Subject: [PATCH 12/62] box-drawing: mixed LIGHT/HEAVY variants of UP AND HORIZONTAL * U+2535 * U+2536 * U+2537 * U+2538 * U+2539 * U+253A --- box-drawing.c | 60 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 682a6403..28142c92 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -394,6 +394,54 @@ draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, i vline_middle_up(thickness(1, dpi)); } +static void +draw_box_drawings_left_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_right_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); +} + +static void +draw_box_drawings_right_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); +} + +static void +draw_box_drawings_left_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); +} + static void draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -483,15 +531,15 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2532: draw_box_drawings_left_light_and_right_down_heavy(buf, width, height, stride, dpi); break; case 0x2533: draw_box_drawings_heavy_down_and_horizontal(buf, width, height, stride, dpi); break; case 0x2534: draw_box_drawings_light_up_and_horizontal(buf, width, height, stride, dpi); break; + case 0x2535: draw_box_drawings_left_heavy_and_right_up_light(buf, width, height, stride, dpi); break; + case 0x2536: draw_box_drawings_right_heavy_and_left_up_light(buf, width, height, stride, dpi); break; + case 0x2537: draw_box_drawings_up_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; + case 0x2538: draw_box_drawings_up_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; + case 0x2539: draw_box_drawings_right_light_and_left_up_heavy(buf, width, height, stride, dpi); break; + case 0x253a: draw_box_drawings_left_light_and_right_up_heavy(buf, width, height, stride, dpi); break; case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf, width, height, stride, dpi); break; case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2535: - case 0x2536: - case 0x2537: - case 0x2538: - case 0x2539: - case 0x253a: case 0x253d: case 0x253e: case 0x253f: From 9a1e299cadaec6e139e6c80a545a88c180d65cde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 12:44:02 +0100 Subject: [PATCH 13/62] box-drawing: mixed LIGHT/HEAVY variants of VERTICAL AND HORIZONTAL * U+253D * U+253E * U+253F * U+2540 * U+2541 * U+2542 * U+2542 * U+2543 * U+2544 * U+2545 * U+2546 * U+2547 * U+2548 * U+2549 * U+254A --- box-drawing.c | 157 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 140 insertions(+), 17 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 28142c92..2d33565b 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -459,6 +459,132 @@ draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int hei vline_middle_down(thickness(1, dpi)); } +static void +draw_box_drawings_left_heavy_and_right_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_right_heavy_and_left_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_vertical_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_heavy_and_down_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_down_heavy_and_up_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); +} + +static void +draw_box_drawings_vertical_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_left_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_right_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_left_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_right_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_down_light_and_up_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_up_light_and_down_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(1, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_right_light_and_left_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); + hline_middle_right(thickness(1, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + +static void +draw_box_drawings_left_light_and_right_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); + hline_middle_right(thickness(2, dpi)); + vline_middle_up(thickness(2, dpi)); + vline_middle_down(thickness(2, dpi)); +} + static void draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -539,26 +665,23 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x253a: draw_box_drawings_left_light_and_right_up_heavy(buf, width, height, stride, dpi); break; case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf, width, height, stride, dpi); break; case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; + case 0x253d: draw_box_drawings_left_heavy_and_right_vertical_light(buf, width, height, stride, dpi); break; + case 0x253e: draw_box_drawings_right_heavy_and_left_vertical_light(buf, width, height, stride, dpi); break; + case 0x253f: draw_box_drawings_vertical_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; - case 0x253d: - case 0x253e: - case 0x253f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; - + case 0x2540: draw_box_drawings_up_heavy_and_down_horizontal_light(buf, width, height, stride, dpi); break; + case 0x2541: draw_box_drawings_down_heavy_and_up_horizontal_light(buf, width, height, stride, dpi); break; + case 0x2542: draw_box_drawings_vertical_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; + case 0x2543: draw_box_drawings_left_up_heavy_and_right_down_light(buf, width, height, stride, dpi); break; + case 0x2544: draw_box_drawings_right_up_heavy_and_left_down_light(buf, width, height, stride, dpi); break; + case 0x2545: draw_box_drawings_left_down_heavy_and_right_up_light(buf, width, height, stride, dpi); break; + case 0x2546: draw_box_drawings_right_down_heavy_and_left_up_light(buf, width, height, stride, dpi); break; + case 0x2547: draw_box_drawings_down_light_and_up_horizontal_heavy(buf, width, height, stride, dpi); break; + case 0x2548: draw_box_drawings_up_light_and_down_horizontal_heavy(buf, width, height, stride, dpi); break; + case 0x2549: draw_box_drawings_right_light_and_left_vertical_heavy(buf, width, height, stride, dpi); break; + case 0x254a: draw_box_drawings_left_light_and_right_vertical_heavy(buf, width, height, stride, dpi); break; case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2540: - case 0x2541: - case 0x2542: - case 0x2543: - case 0x2544: - case 0x2545: - case 0x2546: - case 0x2547: - case 0x2548: - case 0x2549: - case 0x254a: case 0x254c: case 0x254d: case 0x254e: From c1cc75051f73b46fbd6a622b189eef120c90f934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:02:01 +0100 Subject: [PATCH 14/62] box-drawing: LIGH/HEAVY LEFT, UP, RIGTH, DOWN * U+2574 * U+2575 * U+2576 * U+2577 * U+2578 * U+2579 * U+257A * U+257B --- box-drawing.c | 65 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 2d33565b..dda9ea3c 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -594,6 +594,54 @@ draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int hei vline_middle_down(thickness(2, dpi)); } +static void +draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(1, dpi)); +} + +static void +draw_box_drawings_light_up(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_up(thickness(1, dpi)); +} + +static void +draw_box_drawings_light_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(1, dpi)); +} + +static void +draw_box_drawings_light_down(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_down(thickness(1, dpi)); +} + +static void +draw_box_drawings_heavy_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(thickness(2, dpi)); +} + +static void +draw_box_drawings_heavy_up(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_up(thickness(2, dpi)); +} + +static void +draw_box_drawings_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_right(thickness(2, dpi)); +} + +static void +draw_box_drawings_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_down(thickness(2, dpi)); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -727,18 +775,19 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; + case 0x2574: draw_box_drawings_light_left(buf, width, height, stride, dpi); break; + case 0x2575: draw_box_drawings_light_up(buf, width, height, stride, dpi); break; + case 0x2576: draw_box_drawings_light_right(buf, width, height, stride, dpi); break; + case 0x2577: draw_box_drawings_light_down(buf, width, height, stride, dpi); break; + case 0x2578: draw_box_drawings_heavy_left(buf, width, height, stride, dpi); break; + case 0x2579: draw_box_drawings_heavy_up(buf, width, height, stride, dpi); break; + case 0x257a: draw_box_drawings_heavy_right(buf, width, height, stride, dpi); break; + case 0x257b: draw_box_drawings_heavy_down(buf, width, height, stride, dpi); break; + case 0x2570: case 0x2571: case 0x2572: case 0x2573: - case 0x2574: - case 0x2575: - case 0x2576: - case 0x2577: - case 0x2578: - case 0x2579: - case 0x257a: - case 0x257b: case 0x257c: case 0x257d: case 0x257e: From 973a57a09603a46fe19ebe0c59b9615952b622e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:14:17 +0100 Subject: [PATCH 15/62] macros: add CONST (__attribute((__const__))) --- macros.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/macros.h b/macros.h index 323b3748..4d63404c 100644 --- a/macros.h +++ b/macros.h @@ -26,6 +26,12 @@ #define UNUSED #endif +#if HAS_ATTRIBUTE(const) + #define CONST __attribute__((__const__)) +#else + #define CONST +#endif + #if GNUC_AT_LEAST(3, 0) || HAS_ATTRIBUTE(malloc) #define MALLOC __attribute__((__malloc__)) #else From 8b1e702827a0e710c7eaa52865c2ff680b8e6f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:14:37 +0100 Subject: [PATCH 16/62] box-drawing: thickness(): tag as CONST, convert point-size to a float --- box-drawing.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index dda9ea3c..e37cfbee 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -6,14 +6,15 @@ #define LOG_MODULE "box-drawing" #define LOG_ENABLE_DBG 1 #include "log.h" +#include "macros.h" #include "stride.h" #include "terminal.h" #include "xmalloc.h" -static int -thickness(int pts, int dpi) +static int CONST +thickness(float pts, int dpi) { - return pts * dpi / 72; + return pts * (float)dpi / 72.0; } static void From f2add75895b6af233736fe38f498bd4667b35e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:15:34 +0100 Subject: [PATCH 17/62] box-drawing: hline/vline macros now call thickness() --- box-drawing.c | 451 ++++++++++++++++++++++++++------------------------ 1 file changed, 235 insertions(+), 216 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index e37cfbee..38ff0134 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -41,14 +41,33 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } -#define _hline_middle_left(vthick, hthick) \ - hline(buf, 0, (width - vthick) / 2 + vthick, (height - hthick) / 2, hthick, stride) -#define _hline_middle_right(vthick, hthick) \ - hline(buf, (width - vthick) / 2, width, (height - hthick) / 2, hthick, stride) -#define _vline_middle_up(vthick, hthick) \ - vline(buf, 0, (height - hthick) / 2 + hthick, (width - vthick) / 2, vthick, stride) -#define _vline_middle_down(vthick, hthick) \ - vline(buf, (height - hthick) / 2, height, (width - vthick) / 2, vthick, stride) +#define _hline_middle_left(_vthick, _hthick) \ + do { \ + int vthick = thickness(_vthick, dpi); \ + int hthick = thickness(_hthick, dpi); \ + hline(buf, 0, (width + vthick) / 2, (height - hthick) / 2, hthick, stride); \ + } while (0) + +#define _hline_middle_right(_vthick, _hthick) \ + do { \ + int vthick = thickness(_vthick, dpi); \ + int hthick = thickness(_hthick, dpi); \ + hline(buf, (width - vthick) / 2, width, (height - hthick) / 2, hthick, stride); \ + } while (0) + +#define _vline_middle_up(_vthick, _hthick) \ + do { \ + int vthick = thickness(_vthick, dpi); \ + int hthick = thickness(_hthick, dpi); \ + vline(buf, 0, (height + hthick) / 2, (width - vthick) / 2, vthick, stride); \ + } while (0) + +#define _vline_middle_down(_vthick, _hthick) \ + do { \ + int vthick = thickness(_vthick, dpi); \ + int hthick = thickness(_hthick, dpi); \ + vline(buf, (height - hthick) / 2, height, (width - vthick) / 2, vthick, stride); \ + } while (0) #define hline_middle_left(thick) _hline_middle_left(thick, thick) #define hline_middle_right(thick) _hline_middle_right(thick, thick) @@ -58,589 +77,589 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); } static void draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); } static void draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_right(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_right(1.0, 2.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_right(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_right(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); + hline_middle_right(1.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); + _hline_middle_right(1.0, 2.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + hline_middle_right(1.0); + _vline_middle_up(2.0, 1.0); } static void draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); + hline_middle_right(2.0); + vline_middle_up(2.0); } static void draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); + hline_middle_left(1.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + _vline_middle_up(2.0, 1.0); } static void draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); + hline_middle_left(2.0); + vline_middle_up(2.0); } static void draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_right(1.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_vertical_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_right(1.0, 2.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_right(1.0); + _vline_middle_up(2.0, 1.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_right(1.0); + vline_middle_up(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_vertical_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_right(1.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_down_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_right(2.0); + vline_middle_up(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_vertical_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + _vline_middle_up(2.0, 1.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + vline_middle_up(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_vertical_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(1.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_down_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(2.0); + vline_middle_up(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + vline_middle_up(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_left_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + hline_middle_right(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_right_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + _hline_middle_right(1.0, 2.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_right_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_left_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(1.0); + hline_middle_right(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + vline_middle_up(1.0); } static void draw_box_drawings_left_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + hline_middle_right(1.0); + vline_middle_up(1.0); } static void draw_box_drawings_right_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); + hline_middle_left(1.0); + _hline_middle_right(1.0, 2.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(1.0); } static void draw_box_drawings_up_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + _vline_middle_up(2.0, 1.0); } static void draw_box_drawings_right_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(1.0); + vline_middle_up(2.0); } static void draw_box_drawings_left_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); + hline_middle_left(1.0); + hline_middle_right(2.0); + vline_middle_up(2.0); } static void draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(2.0); } static void draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_left_heavy_and_right_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(thickness(1, dpi), thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + _hline_middle_left(1.0, 2.0); + hline_middle_right(1.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_right_heavy_and_left_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - _hline_middle_right(thickness(1, dpi), thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + _hline_middle_right(1.0, 2.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_vertical_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(1.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_heavy_and_down_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - _vline_middle_up(thickness(2, dpi), thickness(1, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + _vline_middle_up(2.0, 1.0); + vline_middle_down(1.0); } static void draw_box_drawings_down_heavy_and_up_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - _vline_middle_down(thickness(2, dpi), thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + vline_middle_up(1.0); + _vline_middle_down(2.0, 1.0); } static void draw_box_drawings_vertical_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(1.0); + hline_middle_right(1.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_left_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(2.0); + hline_middle_right(1.0); + vline_middle_up(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_right_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(1.0); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_left_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(1.0); + vline_middle_up(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_right_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(1.0); + hline_middle_right(2.0); + vline_middle_up(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_down_light_and_up_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(1, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(1.0); } static void draw_box_drawings_up_light_and_down_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(1, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(1.0); + vline_middle_down(2.0); } static void draw_box_drawings_right_light_and_left_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(1, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(1.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_left_light_and_right_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(1.0); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); - hline_middle_right(thickness(2, dpi)); - vline_middle_up(thickness(2, dpi)); - vline_middle_down(thickness(2, dpi)); + hline_middle_left(2.0); + hline_middle_right(2.0); + vline_middle_up(2.0); + vline_middle_down(2.0); } static void draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(1, dpi)); + hline_middle_left(1.0); } static void draw_box_drawings_light_up(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(thickness(1, dpi)); + vline_middle_up(1.0); } static void draw_box_drawings_light_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(1, dpi)); + hline_middle_right(1.0); } static void draw_box_drawings_light_down(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_down(thickness(1, dpi)); + vline_middle_down(1.0); } static void draw_box_drawings_heavy_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(thickness(2, dpi)); + hline_middle_left(2.0); } static void draw_box_drawings_heavy_up(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(thickness(2, dpi)); + vline_middle_up(2.0); } static void draw_box_drawings_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(thickness(2, dpi)); + hline_middle_right(2.0); } static void draw_box_drawings_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_down(thickness(2, dpi)); + vline_middle_down(2.0); } static void From b001b7d27b7c4d481c1a778f075e687f25f8697f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:32:21 +0100 Subject: [PATCH 18/62] box-drawing: use #defines for LIGHT and HEAVY thicknesses --- box-drawing.c | 419 +++++++++++++++++++++++++------------------------- 1 file changed, 211 insertions(+), 208 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 38ff0134..3f2baeda 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -11,6 +11,9 @@ #include "terminal.h" #include "xmalloc.h" +#define LIGHT 1.0 +#define HEAVY 2.0 + static int CONST thickness(float pts, int dpi) { @@ -77,589 +80,589 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); } static void draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); } static void draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(1.0); - vline_middle_down(1.0); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(2.0); - vline_middle_down(2.0); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - vline_middle_down(1.0); + hline_middle_right(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(1.0, 2.0); - vline_middle_down(1.0); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_right(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); - vline_middle_down(2.0); + hline_middle_right(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - vline_middle_down(1.0); + _hline_middle_left(LIGHT, HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_left(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - vline_middle_up(1.0); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(1.0, 2.0); - vline_middle_up(1.0); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - _vline_middle_up(2.0, 1.0); + hline_middle_right(LIGHT); + _vline_middle_up(HEAVY, LIGHT); } static void draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); - vline_middle_up(2.0); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); } static void draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - vline_middle_up(1.0); + hline_middle_left(LIGHT); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - vline_middle_up(1.0); + _hline_middle_left(LIGHT, HEAVY); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _vline_middle_up(2.0, 1.0); + hline_middle_left(LIGHT); + _vline_middle_up(HEAVY, LIGHT); } static void draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - vline_middle_up(2.0); + hline_middle_left(HEAVY); + vline_middle_up(HEAVY); } static void draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_vertical_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_right(1.0, 2.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - _vline_middle_up(2.0, 1.0); - vline_middle_down(1.0); + hline_middle_right(LIGHT); + _vline_middle_up(HEAVY, LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - vline_middle_up(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_vertical_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_right(LIGHT); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_down_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(1.0); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); - vline_middle_up(1.0); - vline_middle_down(2.0); + hline_middle_right(HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_vertical_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + _hline_middle_left(LIGHT, HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _vline_middle_up(2.0, 1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + _vline_middle_up(HEAVY, LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - vline_middle_up(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_left(LIGHT); + vline_middle_up(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_vertical_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(LIGHT); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_down_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - vline_middle_up(2.0); - vline_middle_down(1.0); + hline_middle_left(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - vline_middle_up(1.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_left_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - hline_middle_right(1.0); - vline_middle_down(1.0); + _hline_middle_left(LIGHT, HEAVY); + hline_middle_right(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_right_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _hline_middle_right(1.0, 2.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_down(1.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_right_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(1.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_left_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(2.0); - vline_middle_down(2.0); + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - vline_middle_up(1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); } static void draw_box_drawings_left_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - hline_middle_right(1.0); - vline_middle_up(1.0); + _hline_middle_left(LIGHT, HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); } static void draw_box_drawings_right_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _hline_middle_right(1.0, 2.0); - vline_middle_up(1.0); + hline_middle_left(LIGHT); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(1.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(LIGHT); } static void draw_box_drawings_up_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - _vline_middle_up(2.0, 1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + _vline_middle_up(HEAVY, LIGHT); } static void draw_box_drawings_right_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(1.0); - vline_middle_up(2.0); + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(HEAVY); } static void draw_box_drawings_left_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(2.0); - vline_middle_up(2.0); + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); } static void draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(2.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); } static void draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_left_heavy_and_right_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) { - _hline_middle_left(1.0, 2.0); - hline_middle_right(1.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + _hline_middle_left(LIGHT, HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_right_heavy_and_left_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - _hline_middle_right(1.0, 2.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + _hline_middle_right(LIGHT, HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_vertical_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(1.0); - vline_middle_down(1.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_heavy_and_down_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - _vline_middle_up(2.0, 1.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + _vline_middle_up(HEAVY, LIGHT); + vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_up_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - vline_middle_up(1.0); - _vline_middle_down(2.0, 1.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + _vline_middle_down(HEAVY, LIGHT); } static void draw_box_drawings_vertical_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(1.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_left_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(1.0); - vline_middle_up(2.0); - vline_middle_down(1.0); + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_right_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(1.0); + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_left_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(1.0); - vline_middle_up(1.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_right_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(2.0); - vline_middle_up(1.0); - vline_middle_down(2.0); + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_down_light_and_up_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(1.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); } static void draw_box_drawings_up_light_and_down_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(1.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); } static void draw_box_drawings_right_light_and_left_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(1.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_left_light_and_right_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); - hline_middle_right(2.0); - vline_middle_up(2.0); - vline_middle_down(2.0); + hline_middle_left(HEAVY); + hline_middle_right(HEAVY); + vline_middle_up(HEAVY); + vline_middle_down(HEAVY); } static void draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(1.0); + hline_middle_left(LIGHT); } static void draw_box_drawings_light_up(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(1.0); + vline_middle_up(LIGHT); } static void draw_box_drawings_light_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(1.0); + hline_middle_right(LIGHT); } static void draw_box_drawings_light_down(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_down(1.0); + vline_middle_down(LIGHT); } static void draw_box_drawings_heavy_left(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_left(2.0); + hline_middle_left(HEAVY); } static void draw_box_drawings_heavy_up(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_up(2.0); + vline_middle_up(HEAVY); } static void draw_box_drawings_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) { - hline_middle_right(2.0); + hline_middle_right(HEAVY); } static void draw_box_drawings_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) { - vline_middle_down(2.0); + vline_middle_down(HEAVY); } static void From 0c263be815e00bc9f365506c573173189b7079a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 16:32:43 +0100 Subject: [PATCH 19/62] box-drawing: mixed LIGHT/HEAVY HORIZONTAL, VERTICAL * U+257C * U+257D * U+257E * U+257F --- box-drawing.c | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 3f2baeda..8a140931 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -665,6 +665,34 @@ draw_box_drawings_heavy_down(uint8_t *buf, int width, int height, int stride, in vline_middle_down(HEAVY); } +static void +draw_box_drawings_light_left_and_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(LIGHT); + hline_middle_right(HEAVY); +} + +static void +draw_box_drawings_light_up_and_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_up(LIGHT); + vline_middle_down(HEAVY); +} + +static void +draw_box_drawings_heavy_left_and_light_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + hline_middle_left(HEAVY); + hline_middle_right(LIGHT); +} + +static void +draw_box_drawings_heavy_up_and_light_down(uint8_t *buf, int width, int height, int stride, int dpi) +{ + vline_middle_up(HEAVY); + vline_middle_down(LIGHT); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -806,15 +834,15 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2579: draw_box_drawings_heavy_up(buf, width, height, stride, dpi); break; case 0x257a: draw_box_drawings_heavy_right(buf, width, height, stride, dpi); break; case 0x257b: draw_box_drawings_heavy_down(buf, width, height, stride, dpi); break; + case 0x257c: draw_box_drawings_light_left_and_heavy_right(buf, width, height, stride, dpi); break; + case 0x257d: draw_box_drawings_light_up_and_heavy_down(buf, width, height, stride, dpi); break; + case 0x257e: draw_box_drawings_heavy_left_and_light_right(buf, width, height, stride, dpi); break; + case 0x257f: draw_box_drawings_heavy_up_and_light_down(buf, width, height, stride, dpi); break; case 0x2570: case 0x2571: case 0x2572: case 0x2573: - case 0x257c: - case 0x257d: - case 0x257e: - case 0x257f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; From 013253a20b824aef36ef7f0526d0850ff93cb840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 17:11:49 +0100 Subject: [PATCH 20/62] box-drawing: first half of the block elements, U+2580-U+258F --- box-drawing.c | 144 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 126 insertions(+), 18 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 8a140931..5b7b3aed 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -44,6 +44,18 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } +static void +rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) +{ + for (size_t row = y1; row < y2; row++) { + for (size_t col = x1; col < x2; col++) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + #define _hline_middle_left(_vthick, _hthick) \ do { \ int vthick = thickness(_vthick, dpi); \ @@ -77,6 +89,8 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) #define vline_middle_up(thick) _vline_middle_up(thick, thick) #define vline_middle_down(thick) _vline_middle_down(thick, thick) +#define rect(x1, y1, x2, y2) rectangle(buf, x1, y1, x2, y2, stride) + static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -693,6 +707,102 @@ draw_box_drawings_heavy_up_and_light_down(uint8_t *buf, int width, int height, i vline_middle_down(LIGHT); } +static void +draw_upper_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width, height / 2); +} + +static void +draw_lower_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - height / 8, width, height); +} + +static void +draw_lower_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - height / 4, width, height); +} + +static void +draw_lower_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - 3 * height / 8, width, height); +} + +static void +draw_lower_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - height / 2, width, height); +} + +static void +draw_lower_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - 5 * height / 8, width, height); +} + +static void +draw_lower_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - 3 * height / 4, width, height); +} + +static void +draw_lower_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, height - 7 * height / 8, width, height); +} + +static void +draw_full_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width, height); +} + +static void +draw_left_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, 7 * width / 8, height); +} + +static void +draw_left_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, 3 * width / 4, height); +} + +static void +draw_left_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, 5 * width / 8, height); +} + +static void +draw_left_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width / 2, height); +} + +static void +draw_left_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, 3 * width / 8, height); +} + +static void +draw_left_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width / 4, height); +} + +static void +draw_left_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width / 8, height); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -846,24 +956,22 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; - case 0x2580: - case 0x2581: - case 0x2582: - case 0x2583: - case 0x2584: - case 0x2585: - case 0x2586: - case 0x2587: - case 0x2588: - case 0x2589: - case 0x258a: - case 0x258b: - case 0x258c: - case 0x258d: - case 0x258e: - case 0x258f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; + case 0x2580: draw_upper_half_block(buf, width, height, stride, dpi); break; + case 0x2581: draw_lower_one_eighth_block(buf, width, height, stride, dpi); break; + case 0x2582: draw_lower_one_quarter_block(buf, width, height, stride, dpi); break; + case 0x2583: draw_lower_three_eighths_block(buf, width, height, stride, dpi); break; + case 0x2584: draw_lower_half_block(buf, width, height, stride, dpi); break; + case 0x2585: draw_lower_five_eighths_block(buf, width, height, stride, dpi); break; + case 0x2586: draw_lower_three_quarters_block(buf, width, height, stride, dpi); break; + case 0x2587: draw_lower_seven_eighths_block(buf, width, height, stride, dpi); break; + case 0x2588: draw_full_block(buf, width, height, stride, dpi); break; + case 0x2589: draw_left_seven_eighths_block(buf, width, height, stride, dpi); break; + case 0x258a: draw_left_three_quarters_block(buf, width, height, stride, dpi); break; + case 0x258b: draw_left_five_eighths_block(buf, width, height, stride, dpi); break; + case 0x258c: draw_left_half_block(buf, width, height, stride, dpi); break; + case 0x258d: draw_left_three_eighths_block(buf, width, height, stride, dpi); break; + case 0x258e: draw_left_one_quarter_block(buf, width, height, stride, dpi); break; + case 0x258f: draw_left_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2590: case 0x2591: From 08280553b51a59553bfd34ec6a66d39464c8059c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 17:16:50 +0100 Subject: [PATCH 21/62] box-drawing: use floating point math, and round(), when drawing block elements This is especially important for the LEFT xxx BLOCK characters, since cells can be quite narrow, and one eighth is not a lot... --- box-drawing.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 5b7b3aed..5e3caf5a 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -710,49 +710,49 @@ draw_box_drawings_heavy_up_and_light_down(uint8_t *buf, int width, int height, i static void draw_upper_half_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, width, height / 2); + rect(0, 0, width, round(height / 2.)); } static void draw_lower_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - height / 8, width, height); + rect(0, height - round(height / 8.), width, height); } static void draw_lower_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - height / 4, width, height); + rect(0, height - round(height / 4.), width, height); } static void draw_lower_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - 3 * height / 8, width, height); + rect(0, height - round(3. * height / 8.), width, height); } static void draw_lower_half_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - height / 2, width, height); + rect(0, height - round(height / 2.), width, height); } static void draw_lower_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - 5 * height / 8, width, height); + rect(0, height - round(5. * height / 8.), width, height); } static void draw_lower_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - 3 * height / 4, width, height); + rect(0, height - round(3. * height / 4.), width, height); } static void draw_lower_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, height - 7 * height / 8, width, height); + rect(0, height - round(7. * height / 8.), width, height); } static void @@ -764,43 +764,43 @@ draw_full_block(uint8_t *buf, int width, int height, int stride, int dpi) static void draw_left_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, 7 * width / 8, height); + rect(0, 0, round(7. * width / 8.), height); } static void draw_left_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, 3 * width / 4, height); + rect(0, 0, round(3. * width / 4.), height); } static void draw_left_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, 5 * width / 8, height); + rect(0, 0, round(5. * width / 8.), height); } static void draw_left_half_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, width / 2, height); + rect(0, 0, round(width / 2.), height); } static void draw_left_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, 3 * width / 8, height); + rect(0, 0, round(3. * width / 8.), height); } static void draw_left_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, width / 4, height); + rect(0, 0, round(width / 4.), height); } static void draw_left_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) { - rect(0, 0, width / 8, height); + rect(0, 0, round(width / 8.), height); } static void From bca7c75393f1b05566da4c6422a8b68eabdfbf14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 18:42:23 +0100 Subject: [PATCH 22/62] box-drawing: RIGHT HALF, UPPER ONE EIGHTH and RIGHT ONE EIGTH * U+2590 * U+2594 * U+2595 --- box-drawing.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 5e3caf5a..1cdf0e06 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -803,6 +803,24 @@ draw_left_one_eighth_block(uint8_t *buf, int width, int height, int stride, int rect(0, 0, round(width / 8.), height); } +static void +draw_right_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(round(width / 2.), 0, width, height); +} + +static void +draw_upper_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(0, 0, width, round(height / 8.)); +} + +static void +draw_right_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +{ + rect(width - round(width / 8.), 0, width, height); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -973,12 +991,12 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x258e: draw_left_one_quarter_block(buf, width, height, stride, dpi); break; case 0x258f: draw_left_one_eighth_block(buf, width, height, stride, dpi); break; - case 0x2590: + case 0x2590: draw_right_half_block(buf, width, height, stride, dpi); break; + case 0x2594: draw_upper_one_eighth_block(buf, width, height, stride, dpi); break; + case 0x2595: draw_right_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2591: case 0x2592: case 0x2593: - case 0x2594: - case 0x2595: case 0x2596: case 0x2597: case 0x2598: From ddc997dd5e49f39c2db603874f16259fd80cac62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 18:43:11 +0100 Subject: [PATCH 23/62] box-drawing: QUADRANTs * U+2596 * U+2597 * U+2598 * U+2599 * U+259A * U+259B * U+259C * U+259D * U+259E * U+259F --- box-drawing.c | 96 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 86 insertions(+), 10 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 1cdf0e06..17f54f3f 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -91,6 +91,11 @@ rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) #define rect(x1, y1, x2, y2) rectangle(buf, x1, y1, x2, y2, stride) +#define quad_upper_left() rect(0, 0, width / 2, height / 2) +#define quad_upper_right() rect(width / 2, 0, width, height / 2) +#define quad_lower_left() rect(0, height / 2, width / 2, height) +#define quad_lower_right() rect(width / 2, height / 2, width, height) + static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -821,6 +826,76 @@ draw_right_one_eighth_block(uint8_t *buf, int width, int height, int stride, int rect(width - round(width / 8.), 0, width, height); } +static void +draw_quadrant_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_lower_left(); +} + +static void +draw_quadrant_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_lower_right(); +} + +static void +draw_quadrant_upper_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_left(); +} + +static void +draw_quadrant_upper_left_and_lower_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_left(); + quad_lower_left(); + quad_lower_right(); +} + +static void +draw_quadrant_upper_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_left(); + quad_lower_right(); +} + +static void +draw_quadrant_upper_left_and_upper_right_and_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_left(); + quad_upper_right(); + quad_lower_left(); +} + +static void +draw_quadrant_upper_left_and_upper_right_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_left(); + quad_upper_right(); + quad_lower_right(); +} + +static void +draw_quadrant_upper_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_right(); +} + +static void +draw_quadrant_upper_right_and_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_right(); + quad_lower_left(); +} + +static void +draw_quadrant_upper_right_and_lower_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + quad_upper_right(); + quad_lower_left(); + quad_lower_right(); +} + static void draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) { @@ -994,19 +1069,20 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2590: draw_right_half_block(buf, width, height, stride, dpi); break; case 0x2594: draw_upper_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2595: draw_right_one_eighth_block(buf, width, height, stride, dpi); break; + case 0x2596: draw_quadrant_lower_left(buf, width, height, stride, dpi); break; + case 0x2597: draw_quadrant_lower_right(buf, width, height, stride, dpi); break; + case 0x2598: draw_quadrant_upper_left(buf, width, height, stride, dpi); break; + case 0x2599: draw_quadrant_upper_left_and_lower_left_and_lower_right(buf, width, height, stride, dpi); break; + case 0x259a: draw_quadrant_upper_left_and_lower_right(buf, width, height, stride, dpi); break; + case 0x259b: draw_quadrant_upper_left_and_upper_right_and_lower_left(buf, width, height, stride, dpi); break; + case 0x259c: draw_quadrant_upper_left_and_upper_right_and_lower_right(buf, width, height, stride, dpi); break; + 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 0x2591: case 0x2592: case 0x2593: - case 0x2596: - case 0x2597: - case 0x2598: - case 0x2599: - case 0x259a: - case 0x259b: - case 0x259c: - case 0x259d: - case 0x259e: - case 0x259f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; } From 17a46378bf8fa7d96f72044bf001dbd1b5db3994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sun, 27 Dec 2020 19:44:30 +0100 Subject: [PATCH 24/62] box-drawing: QUADRANTs: ensure all quads have equal width and hight If the cell width/height is odd, the previous implementation would result in uneven quads. --- box-drawing.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 17f54f3f..86f66ea6 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -91,10 +91,10 @@ rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) #define rect(x1, y1, x2, y2) rectangle(buf, x1, y1, x2, y2, stride) -#define quad_upper_left() rect(0, 0, width / 2, height / 2) -#define quad_upper_right() rect(width / 2, 0, width, height / 2) -#define quad_lower_left() rect(0, height / 2, width / 2, height) -#define quad_lower_right() rect(width / 2, height / 2, width, height) +#define quad_upper_left() rect(0, 0, ceil(width / 2.), ceil(height / 2.)) +#define quad_upper_right() rect(floor(width / 2.), 0, width, ceil(height / 2.)) +#define quad_lower_left() rect(0, floor(height / 2.), ceil(width / 2.), height) +#define quad_lower_right() rect(floor(width / 2.), floor(height / 2.), width, height) static void draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) From 2d4185567c44858611adf774b7ed92a59b7fa6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 28 Dec 2020 12:50:28 +0100 Subject: [PATCH 25/62] box-drawing: LIGHT/MEDIUM/DARK SHADE * U+2591 * U+2592 * U+2593 --- box-drawing.c | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 86f66ea6..7733e14b 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -814,6 +814,42 @@ draw_right_half_block(uint8_t *buf, int width, int height, int stride, int dpi) rect(round(width / 2.), 0, width, height); } +static void +draw_light_shade(uint8_t *buf, int width, int height, int stride, int dpi) +{ + for (size_t row = 0; row < height; row += 2) { + for (size_t col = 0; col < width; col += 2) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + +static void +draw_medium_shade(uint8_t *buf, int width, int height, int stride, int dpi) +{ + for (size_t row = 0; row < height; row++) { + for (size_t col = row % 2; col < width; col += 2) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + +static void +draw_dark_shade(uint8_t *buf, int width, int height, int stride, int dpi) +{ + for (size_t row = 0; row < height; row++) { + for (size_t col = 0; col < width; col += 1 + row % 2) { + size_t idx = col / 8; + size_t bit_no = col % 8; + buf[row * stride + idx] |= 1 << bit_no; + } + } +} + static void draw_upper_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -1067,6 +1103,9 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x258f: draw_left_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2590: draw_right_half_block(buf, width, height, stride, dpi); break; + case 0x2591: draw_light_shade(buf, width, height, stride, dpi); break; + case 0x2592: draw_medium_shade(buf, width, height, stride, dpi); break; + case 0x2593: draw_dark_shade(buf, width, height, stride, dpi); break; case 0x2594: draw_upper_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2595: draw_right_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2596: draw_quadrant_lower_left(buf, width, height, stride, dpi); break; @@ -1080,9 +1119,6 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) 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 0x2591: - case 0x2592: - case 0x2593: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; } From 44f365bd0077b3ed6b26842f1ae9baba6004d00f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 28 Dec 2020 14:08:57 +0100 Subject: [PATCH 26/62] box-drawing: DOUBLE lines, U+2550-U+256C --- box-drawing.c | 449 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 418 insertions(+), 31 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 7733e14b..15b6e5c6 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -636,6 +636,395 @@ draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int hei vline_middle_down(HEAVY); } +static void +draw_box_drawings_double_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int mid = (height - thick * 3) / 2; + + hline(buf, 0, width, mid, thick, stride); + hline(buf, 0, width, mid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int mid = (width - thick * 3) / 2; + + vline(buf, 0, height, mid, thick, stride); + vline(buf, 0, height, mid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick) / 2; + + vline_middle_down(LIGHT); + + hline(buf, vmid, width, hmid, thick, stride); + hline(buf, vmid, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_right(LIGHT); + + vline(buf, hmid, height, vmid, thick, stride); + vline(buf, hmid, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, hmid, height, vmid, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + + hline(buf, vmid, width, hmid, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width + thick) / 2; + + vline_middle_down(LIGHT); + + hline(buf, 0, vmid, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_left(LIGHT); + + vline(buf, hmid, height, vmid, thick, stride); + vline(buf, hmid, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, hmid + 2 * thick, height, vmid, thick, stride); + vline(buf, hmid, height, vmid + 2 * thick, thick, stride); + + hline(buf, 0, vmid + 2 * thick, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick) / 2; + + vline_middle_up(LIGHT); + + hline(buf, vmid, width, hmid, thick, stride); + hline(buf, vmid, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height + thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_right(LIGHT); + + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, 0, hmid + 2 * thick, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + + hline(buf, vmid + 2 * thick, width, hmid, thick, stride); + hline(buf, vmid, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width + thick) / 2; + + vline_middle_up(LIGHT); + + hline(buf, 0, vmid, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height + thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_left(LIGHT); + + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, 0, hmid + 0 * thick + thick, vmid, thick, stride); + vline(buf, 0, hmid + 2 * thick + thick, vmid + 2 * thick, thick, stride); + + hline(buf, 0, vmid, hmid, thick, stride); + hline(buf, 0, vmid + 2 * thick, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick) / 2; + + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); + + hline(buf, vmid, width, hmid, thick, stride); + hline(buf, vmid, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int vmid = (width - thick * 3) / 2; + + hline(buf, vmid + 2 * thick, width, (height - thick) / 2, thick, stride); + + vline(buf, 0, height, vmid, thick, stride); + vline(buf, 0, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, 0, height, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + + hline(buf, vmid + 2 * thick, width, hmid, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width + thick) / 2; + + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); + + hline(buf, 0, vmid, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int vmid = (width - thick * 3) / 2; + + hline(buf, 0, vmid, (height - thick) / 2, thick, stride); + + vline(buf, 0, height, vmid, thick, stride); + vline(buf, 0, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, 0, height, vmid + 2 * thick, thick, stride); + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid, thick, stride); + + hline(buf, 0, vmid + thick, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + + vline(buf, hmid + 2 * thick, height, (width - thick) / 2, thick, stride); + + hline(buf, 0, width, hmid, thick, stride); + hline(buf, 0, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_down_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + + vline(buf, hmid, height, vmid, thick, stride); + vline(buf, hmid, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + hline(buf, 0, width, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + + vline(buf, hmid + 2 * thick, height, vmid, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick) / 2; + + vline(buf, 0, hmid, vmid, thick, stride); + + hline(buf, 0, width, hmid, thick, stride); + hline(buf, 0, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_up_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick) / 2; + int vmid = (width - thick * 3) / 2; + + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + + hline(buf, 0, vmid + thick, hmid, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid, thick, stride); + hline(buf, 0, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); + + hline(buf, 0, width, hmid, thick, stride); + hline(buf, 0, width, hmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_vertical_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int vmid = (width - thick * 3) / 2; + + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + + vline(buf, 0, height, vmid, thick, stride); + vline(buf, 0, height, vmid + 2 * thick, thick, stride); +} + +static void +draw_box_drawings_double_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int hmid = (height - thick * 3) / 2; + int vmid = (width - thick * 3) / 2; + + hline(buf, 0, vmid, hmid, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid, thick, stride); + hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + + vline(buf, 0, hmid, vmid, thick, stride); + vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid, thick, stride); + vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); +} + static void draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -1027,38 +1416,36 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); break; - case 0x2550: - case 0x2551: - case 0x2552: - case 0x2553: - case 0x2554: - case 0x2555: - case 0x2556: - case 0x2557: - case 0x2558: - case 0x2559: - case 0x255a: - case 0x255b: - case 0x255c: - case 0x255d: - case 0x255e: - case 0x255f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; + case 0x2550: draw_box_drawings_double_horizontal(buf, width, height, stride, dpi); break; + case 0x2551: draw_box_drawings_double_vertical(buf, width, height, stride, dpi); break; + case 0x2552: draw_box_drawings_down_single_and_right_double(buf, width, height, stride, dpi); break; + case 0x2553: draw_box_drawings_down_double_and_right_single(buf, width, height, stride, dpi); break; + case 0x2554: draw_box_drawings_double_down_and_right(buf, width, height, stride, dpi); break; + case 0x2555: draw_box_drawings_down_single_and_left_double(buf, width, height, stride, dpi); break; + case 0x2556: draw_box_drawings_down_double_and_left_single(buf, width, height, stride, dpi); break; + case 0x2557: draw_box_drawings_double_down_and_left(buf, width, height, stride, dpi); break; + case 0x2558: draw_box_drawings_up_single_and_right_double(buf, width, height, stride, dpi); break; + case 0x2559: draw_box_drawings_up_double_and_right_single(buf, width, height, stride, dpi); break; + case 0x255a: draw_box_drawings_double_up_and_right(buf, width, height, stride, dpi); break; + case 0x255b: draw_box_drawings_up_single_and_left_double(buf, width, height, stride, dpi); break; + case 0x255c: draw_box_drawings_up_double_and_left_single(buf, width, height, stride, dpi); break; + case 0x255d: draw_box_drawings_double_up_and_left(buf, width, height, stride, dpi); break; + case 0x255e: draw_box_drawings_vertical_single_and_right_double(buf, width, height, stride, dpi); break; + case 0x255f: draw_box_drawings_vertical_double_and_right_single(buf, width, height, stride, dpi); break; - case 0x2560: - case 0x2561: - case 0x2562: - case 0x2563: - case 0x2564: - case 0x2565: - case 0x2566: - case 0x2567: - case 0x2568: - case 0x2569: - case 0x256a: - case 0x256b: - case 0x256c: + case 0x2560: draw_box_drawings_double_vertical_and_right(buf, width, height, stride, dpi); break; + case 0x2561: draw_box_drawings_vertical_single_and_left_double(buf, width, height, stride, dpi); break; + case 0x2562: draw_box_drawings_vertical_double_and_left_single(buf, width, height, stride, dpi); break; + case 0x2563: draw_box_drawings_double_vertical_and_left(buf, width, height, stride, dpi); break; + case 0x2564: draw_box_drawings_down_single_and_horizontal_double(buf, width, height, stride, dpi); break; + case 0x2565: draw_box_drawings_down_double_and_horizontal_single(buf, width, height, stride, dpi); break; + case 0x2566: draw_box_drawings_double_down_and_horizontal(buf, width, height, stride, dpi); break; + case 0x2567: draw_box_drawings_up_single_and_horizontal_double(buf, width, height, stride, dpi); break; + case 0x2568: draw_box_drawings_up_double_and_horizontal_single(buf, width, height, stride, dpi); break; + case 0x2569: draw_box_drawings_double_up_and_horizontal(buf, width, height, stride, dpi); break; + case 0x256a: draw_box_drawings_vertical_single_and_horizontal_double(buf, width, height, stride, dpi); break; + case 0x256b: draw_box_drawings_vertical_double_and_horizontal_single(buf, width, height, stride, dpi); break; + case 0x256c: draw_box_drawings_double_vertical_and_horizontal(buf, width, height, stride, dpi); break; case 0x256d: case 0x256e: case 0x256f: From cf0270c1ea6136bbb8eeca1b91319118317285c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 10:40:58 +0100 Subject: [PATCH 27/62] =?UTF-8?q?box-drawing:=20make=20=E2=80=98term?= =?UTF-8?q?=E2=80=99=20parameter=20const?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-drawing.c | 2 +- box-drawing.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 15b6e5c6..fb6f8d1b 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1512,7 +1512,7 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) } struct fcft_glyph * -box_drawing(struct terminal *term, wchar_t wc) +box_drawing(const struct terminal *term, wchar_t wc) { int width = term->cell_width; int height = term->cell_height; diff --git a/box-drawing.h b/box-drawing.h index aecbf1b3..e4633c7e 100644 --- a/box-drawing.h +++ b/box-drawing.h @@ -3,4 +3,4 @@ #include struct terminal; -struct fcft_glyph *box_drawing(struct terminal *term, wchar_t wc); +struct fcft_glyph *box_drawing(const struct terminal *term, wchar_t wc); From 5b167bd18591101651666eb27f30e1eeaa61698b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 10:41:38 +0100 Subject: [PATCH 28/62] box-drawing: remove __attribute__((__const__)) from thickness() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thickness() is a static function and thus ‘const’ is not necessary. --- box-drawing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index fb6f8d1b..bca651da 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -14,7 +14,7 @@ #define LIGHT 1.0 #define HEAVY 2.0 -static int CONST +static int thickness(float pts, int dpi) { return pts * (float)dpi / 72.0; From 705cb9cfb001a70f4204a6042e6f0b12032e9f38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 10:44:27 +0100 Subject: [PATCH 29/62] =?UTF-8?q?box=5Fdrawing():=20mark=20function=20as?= =?UTF-8?q?=20=E2=80=98cold=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-drawing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index bca651da..0d51e704 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1511,7 +1511,7 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) } } -struct fcft_glyph * +struct fcft_glyph * COLD box_drawing(const struct terminal *term, wchar_t wc) { int width = term->cell_width; From 4ac33f4f4ef13b7c581997164b92936f1f0235be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 11:37:20 +0100 Subject: [PATCH 30/62] box-drawing: remove LOG_WARN from U+259x range - all codepoints have been implemented --- box-drawing.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 0d51e704..c409698d 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1505,13 +1505,10 @@ 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; - - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; } } -struct fcft_glyph * COLD +struct fcft_glyph * COLDx box_drawing(const struct terminal *term, wchar_t wc) { int width = term->cell_width; From 00d0e53a9507df770bae46580f170b6d82cca9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 11:39:10 +0100 Subject: [PATCH 31/62] =?UTF-8?q?box-drawing:=20oops=20-=20remove=20accide?= =?UTF-8?q?ntal=20=E2=80=98x=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-drawing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index c409698d..91dd57f2 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1508,7 +1508,7 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) } } -struct fcft_glyph * COLDx +struct fcft_glyph * COLD box_drawing(const struct terminal *term, wchar_t wc) { int width = term->cell_width; From 25d2b03a5cdde5b0aec496cf9eed04aa570a58ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 13:02:08 +0100 Subject: [PATCH 32/62] box-drawing: SEXTANTS, U+1fb00-1fb3b --- box-drawing.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++ render.c | 5 +- terminal.h | 6 ++- 3 files changed, 143 insertions(+), 3 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 91dd57f2..3f8f9537 100644 --- a/box-drawing.c +++ b/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 diff --git a/render.c b/render.c index 77e6ba5f..8bb52c46 100644 --- a/render.c +++ b/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)) diff --git a/terminal.h b/terminal.h index 8dea2435..0774aaa1 100644 --- a/terminal.h +++ b/terminal.h @@ -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; From b5ec34ca12459bbf2ebb871264b5dfa67735fe6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 19:38:02 +0100 Subject: [PATCH 33/62] box-drawing: wrap {h,v}hline() functions in macros, to shorten argument list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename the *function* {h,v}line() to _{h,v}line(), and add two new macros: hline() and vline(). This allows us to shorten the argument list by removing the ‘buf’ and ‘stride’ arguments. --- box-drawing.c | 192 ++++++++++++++++++++++++++------------------------ 1 file changed, 98 insertions(+), 94 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 3f8f9537..86cc00f7 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -22,7 +22,7 @@ thickness(float pts, int dpi) } static void -hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) +_hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) { for (size_t row = y; row < y + thick; row++) { for (size_t col = x1; col < x2; col++) { @@ -33,8 +33,10 @@ hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) } } +#define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick, stride) + static void -vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) +_vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) { for (size_t row = y1; row < y2; row++) { for (size_t col = x; col < x + thick; col++) { @@ -45,6 +47,8 @@ vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } +#define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick, stride) + static void rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) { @@ -61,28 +65,28 @@ rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) do { \ int vthick = thickness(_vthick, dpi); \ int hthick = thickness(_hthick, dpi); \ - hline(buf, 0, (width + vthick) / 2, (height - hthick) / 2, hthick, stride); \ + hline(0, (width + vthick) / 2, (height - hthick) / 2, hthick); \ } while (0) #define _hline_middle_right(_vthick, _hthick) \ do { \ int vthick = thickness(_vthick, dpi); \ int hthick = thickness(_hthick, dpi); \ - hline(buf, (width - vthick) / 2, width, (height - hthick) / 2, hthick, stride); \ + hline((width - vthick) / 2, width, (height - hthick) / 2, hthick); \ } while (0) #define _vline_middle_up(_vthick, _hthick) \ do { \ int vthick = thickness(_vthick, dpi); \ int hthick = thickness(_hthick, dpi); \ - vline(buf, 0, (height + hthick) / 2, (width - vthick) / 2, vthick, stride); \ + vline(0, (height + hthick) / 2, (width - vthick) / 2, vthick); \ } while (0) #define _vline_middle_down(_vthick, _hthick) \ do { \ int vthick = thickness(_vthick, dpi); \ int hthick = thickness(_hthick, dpi); \ - vline(buf, (height - hthick) / 2, height, (width - vthick) / 2, vthick, stride); \ + vline((height - hthick) / 2, height, (width - vthick) / 2, vthick); \ } while (0) #define hline_middle_left(thick) _hline_middle_left(thick, thick) @@ -643,8 +647,8 @@ draw_box_drawings_double_horizontal(uint8_t *buf, int width, int height, int str int thick = thickness(LIGHT, dpi); int mid = (height - thick * 3) / 2; - hline(buf, 0, width, mid, thick, stride); - hline(buf, 0, width, mid + 2 * thick, thick, stride); + hline(0, width, mid, thick); + hline(0, width, mid + 2 * thick, thick); } static void @@ -653,8 +657,8 @@ draw_box_drawings_double_vertical(uint8_t *buf, int width, int height, int strid int thick = thickness(LIGHT, dpi); int mid = (width - thick * 3) / 2; - vline(buf, 0, height, mid, thick, stride); - vline(buf, 0, height, mid + 2 * thick, thick, stride); + vline(0, height, mid, thick); + vline(0, height, mid + 2 * thick, thick); } static void @@ -666,8 +670,8 @@ draw_box_drawings_down_single_and_right_double(uint8_t *buf, int width, int heig vline_middle_down(LIGHT); - hline(buf, vmid, width, hmid, thick, stride); - hline(buf, vmid, width, hmid + 2 * thick, thick, stride); + hline(vmid, width, hmid, thick); + hline(vmid, width, hmid + 2 * thick, thick); } static void @@ -679,8 +683,8 @@ draw_box_drawings_down_double_and_right_single(uint8_t *buf, int width, int heig hline_middle_right(LIGHT); - vline(buf, hmid, height, vmid, thick, stride); - vline(buf, hmid, height, vmid + 2 * thick, thick, stride); + vline(hmid, height, vmid, thick); + vline(hmid, height, vmid + 2 * thick, thick); } static void @@ -690,11 +694,11 @@ draw_box_drawings_double_down_and_right(uint8_t *buf, int width, int height, int int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, hmid, height, vmid, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + vline(hmid, height, vmid, thick); + vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); - hline(buf, vmid, width, hmid, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + hline(vmid, width, hmid, thick); + hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); } static void @@ -706,8 +710,8 @@ draw_box_drawings_down_single_and_left_double(uint8_t *buf, int width, int heigh vline_middle_down(LIGHT); - hline(buf, 0, vmid, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(0, vmid, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); } static void @@ -719,8 +723,8 @@ draw_box_drawings_down_double_and_left_single(uint8_t *buf, int width, int heigh hline_middle_left(LIGHT); - vline(buf, hmid, height, vmid, thick, stride); - vline(buf, hmid, height, vmid + 2 * thick, thick, stride); + vline(hmid, height, vmid, thick); + vline(hmid, height, vmid + 2 * thick, thick); } static void @@ -730,11 +734,11 @@ draw_box_drawings_double_down_and_left(uint8_t *buf, int width, int height, int int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, hmid + 2 * thick, height, vmid, thick, stride); - vline(buf, hmid, height, vmid + 2 * thick, thick, stride); + vline(hmid + 2 * thick, height, vmid, thick); + vline(hmid, height, vmid + 2 * thick, thick); - hline(buf, 0, vmid + 2 * thick, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(0, vmid + 2 * thick, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); } static void @@ -746,8 +750,8 @@ draw_box_drawings_up_single_and_right_double(uint8_t *buf, int width, int height vline_middle_up(LIGHT); - hline(buf, vmid, width, hmid, thick, stride); - hline(buf, vmid, width, hmid + 2 * thick, thick, stride); + hline(vmid, width, hmid, thick); + hline(vmid, width, hmid + 2 * thick, thick); } static void @@ -759,8 +763,8 @@ draw_box_drawings_up_double_and_right_single(uint8_t *buf, int width, int height hline_middle_right(LIGHT); - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(0, hmid, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); } static void @@ -770,11 +774,11 @@ draw_box_drawings_double_up_and_right(uint8_t *buf, int width, int height, int s int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, 0, hmid + 2 * thick, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(0, hmid + 2 * thick, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); - hline(buf, vmid + 2 * thick, width, hmid, thick, stride); - hline(buf, vmid, width, hmid + 2 * thick, thick, stride); + hline(vmid + 2 * thick, width, hmid, thick); + hline(vmid, width, hmid + 2 * thick, thick); } static void @@ -786,8 +790,8 @@ draw_box_drawings_up_single_and_left_double(uint8_t *buf, int width, int height, vline_middle_up(LIGHT); - hline(buf, 0, vmid, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(0, vmid, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); } static void @@ -799,8 +803,8 @@ draw_box_drawings_up_double_and_left_single(uint8_t *buf, int width, int height, hline_middle_left(LIGHT); - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(0, hmid, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); } static void @@ -810,11 +814,11 @@ draw_box_drawings_double_up_and_left(uint8_t *buf, int width, int height, int st int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, 0, hmid + 0 * thick + thick, vmid, thick, stride); - vline(buf, 0, hmid + 2 * thick + thick, vmid + 2 * thick, thick, stride); + vline(0, hmid + 0 * thick + thick, vmid, thick); + vline(0, hmid + 2 * thick + thick, vmid + 2 * thick, thick); - hline(buf, 0, vmid, hmid, thick, stride); - hline(buf, 0, vmid + 2 * thick, hmid + 2 * thick, thick, stride); + hline(0, vmid, hmid, thick); + hline(0, vmid + 2 * thick, hmid + 2 * thick, thick); } static void @@ -827,8 +831,8 @@ draw_box_drawings_vertical_single_and_right_double(uint8_t *buf, int width, int vline_middle_up(LIGHT); vline_middle_down(LIGHT); - hline(buf, vmid, width, hmid, thick, stride); - hline(buf, vmid, width, hmid + 2 * thick, thick, stride); + hline(vmid, width, hmid, thick); + hline(vmid, width, hmid + 2 * thick, thick); } static void @@ -837,10 +841,10 @@ draw_box_drawings_vertical_double_and_right_single(uint8_t *buf, int width, int int thick = thickness(LIGHT, dpi); int vmid = (width - thick * 3) / 2; - hline(buf, vmid + 2 * thick, width, (height - thick) / 2, thick, stride); + hline(vmid + 2 * thick, width, (height - thick) / 2, thick); - vline(buf, 0, height, vmid, thick, stride); - vline(buf, 0, height, vmid + 2 * thick, thick, stride); + vline(0, height, vmid, thick); + vline(0, height, vmid + 2 * thick, thick); } static void @@ -850,12 +854,12 @@ draw_box_drawings_double_vertical_and_right(uint8_t *buf, int width, int height, int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, 0, height, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + vline(0, height, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); - hline(buf, vmid + 2 * thick, width, hmid, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + hline(vmid + 2 * thick, width, hmid, thick); + hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); } static void @@ -868,8 +872,8 @@ draw_box_drawings_vertical_single_and_left_double(uint8_t *buf, int width, int h vline_middle_up(LIGHT); vline_middle_down(LIGHT); - hline(buf, 0, vmid, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(0, vmid, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); } static void @@ -878,10 +882,10 @@ draw_box_drawings_vertical_double_and_left_single(uint8_t *buf, int width, int h int thick = thickness(LIGHT, dpi); int vmid = (width - thick * 3) / 2; - hline(buf, 0, vmid, (height - thick) / 2, thick, stride); + hline(0, vmid, (height - thick) / 2, thick); - vline(buf, 0, height, vmid, thick, stride); - vline(buf, 0, height, vmid + 2 * thick, thick, stride); + vline(0, height, vmid, thick); + vline(0, height, vmid + 2 * thick, thick); } static void @@ -891,12 +895,12 @@ draw_box_drawings_double_vertical_and_left(uint8_t *buf, int width, int height, int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, 0, height, vmid + 2 * thick, thick, stride); - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid, thick, stride); + vline(0, height, vmid + 2 * thick, thick); + vline(0, hmid, vmid, thick); + vline(hmid + 2 * thick, height, vmid, thick); - hline(buf, 0, vmid + thick, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); + hline(0, vmid + thick, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); } static void @@ -905,10 +909,10 @@ draw_box_drawings_down_single_and_horizontal_double(uint8_t *buf, int width, int int thick = thickness(LIGHT, dpi); int hmid = (height - thick * 3) / 2; - vline(buf, hmid + 2 * thick, height, (width - thick) / 2, thick, stride); + vline(hmid + 2 * thick, height, (width - thick) / 2, thick); - hline(buf, 0, width, hmid, thick, stride); - hline(buf, 0, width, hmid + 2 * thick, thick, stride); + hline(0, width, hmid, thick); + hline(0, width, hmid + 2 * thick, thick); } static void @@ -921,8 +925,8 @@ draw_box_drawings_down_double_and_horizontal_single(uint8_t *buf, int width, int hline_middle_left(LIGHT); hline_middle_right(LIGHT); - vline(buf, hmid, height, vmid, thick, stride); - vline(buf, hmid, height, vmid + 2 * thick, thick, stride); + vline(hmid, height, vmid, thick); + vline(hmid, height, vmid + 2 * thick, thick); } static void @@ -932,12 +936,12 @@ draw_box_drawings_double_down_and_horizontal(uint8_t *buf, int width, int height int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - hline(buf, 0, width, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + hline(0, width, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); - vline(buf, hmid + 2 * thick, height, vmid, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + vline(hmid + 2 * thick, height, vmid, thick); + vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); } static void @@ -947,10 +951,10 @@ draw_box_drawings_up_single_and_horizontal_double(uint8_t *buf, int width, int h int hmid = (height - thick * 3) / 2; int vmid = (width - thick) / 2; - vline(buf, 0, hmid, vmid, thick, stride); + vline(0, hmid, vmid, thick); - hline(buf, 0, width, hmid, thick, stride); - hline(buf, 0, width, hmid + 2 * thick, thick, stride); + hline(0, width, hmid, thick); + hline(0, width, hmid + 2 * thick, thick); } static void @@ -963,8 +967,8 @@ draw_box_drawings_up_double_and_horizontal_single(uint8_t *buf, int width, int h hline_middle_left(LIGHT); hline_middle_right(LIGHT); - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(0, hmid, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); } static void @@ -974,12 +978,12 @@ draw_box_drawings_double_up_and_horizontal(uint8_t *buf, int width, int height, int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); + vline(0, hmid, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); - hline(buf, 0, vmid + thick, hmid, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid, thick, stride); - hline(buf, 0, width, hmid + 2 * thick, thick, stride); + hline(0, vmid + thick, hmid, thick); + hline(vmid + 2 * thick, width, hmid, thick); + hline(0, width, hmid + 2 * thick, thick); } static void @@ -991,8 +995,8 @@ draw_box_drawings_vertical_single_and_horizontal_double(uint8_t *buf, int width, vline_middle_up(LIGHT); vline_middle_down(LIGHT); - hline(buf, 0, width, hmid, thick, stride); - hline(buf, 0, width, hmid + 2 * thick, thick, stride); + hline(0, width, hmid, thick); + hline(0, width, hmid + 2 * thick, thick); } static void @@ -1004,8 +1008,8 @@ draw_box_drawings_vertical_double_and_horizontal_single(uint8_t *buf, int width, hline_middle_left(LIGHT); hline_middle_right(LIGHT); - vline(buf, 0, height, vmid, thick, stride); - vline(buf, 0, height, vmid + 2 * thick, thick, stride); + vline(0, height, vmid, thick); + vline(0, height, vmid + 2 * thick, thick); } static void @@ -1015,15 +1019,15 @@ draw_box_drawings_double_vertical_and_horizontal(uint8_t *buf, int width, int he int hmid = (height - thick * 3) / 2; int vmid = (width - thick * 3) / 2; - hline(buf, 0, vmid, hmid, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid, thick, stride); - hline(buf, 0, vmid, hmid + 2 * thick, thick, stride); - hline(buf, vmid + 2 * thick, width, hmid + 2 * thick, thick, stride); + hline(0, vmid, hmid, thick); + hline(vmid + 2 * thick, width, hmid, thick); + hline(0, vmid, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); - vline(buf, 0, hmid, vmid, thick, stride); - vline(buf, 0, hmid, vmid + 2 * thick, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid, thick, stride); - vline(buf, hmid + 2 * thick, height, vmid + 2 * thick, thick, stride); + vline(0, hmid, vmid, thick); + vline(0, hmid, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, height, vmid, thick); + vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); } static void From 878adb970e1532224bf25eb25e1ecc86b6331262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Tue, 29 Dec 2020 19:42:56 +0100 Subject: [PATCH 34/62] box-drawing: make sure we never walk outside the (image) buffer --- box-drawing.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 86cc00f7..b368210a 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -22,10 +22,10 @@ thickness(float pts, int dpi) } static void -_hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) +_hline(uint8_t *buf, int x1, int x2, int y, int thick, int width, int height, int stride) { - for (size_t row = y; row < y + thick; row++) { - for (size_t col = x1; col < x2; col++) { + for (size_t row = max(y, 0); row < min(y + thick, height); row++) { + for (size_t col = max(x1, 0); col < min(x2, width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; buf[row * stride + idx] |= 1 << bit_no; @@ -33,13 +33,13 @@ _hline(uint8_t *buf, int x1, int x2, int y, int thick, int stride) } } -#define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick, stride) +#define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick, width, height, stride) static void -_vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) +_vline(uint8_t *buf, int y1, int y2, int x, int thick, int width, int height, int stride) { - for (size_t row = y1; row < y2; row++) { - for (size_t col = x; col < x + thick; col++) { + for (size_t row = max(y1, 0); row < min(y2, height); row++) { + for (size_t col = max(x, 0); col < min(x + thick, width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; buf[row * stride + idx] |= 1 << bit_no; @@ -47,13 +47,13 @@ _vline(uint8_t *buf, int y1, int y2, int x, int thick, int stride) } } -#define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick, stride) +#define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick, width, height, stride) static void -rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) +_rect(uint8_t *buf, int x1, int y1, int x2, int y2, int width, int height, int stride) { - for (size_t row = y1; row < y2; row++) { - for (size_t col = x1; col < x2; col++) { + for (size_t row = max(y1, 0); row < min(y2, height); row++) { + for (size_t col = max(x1, 0); col < min(x2, width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; buf[row * stride + idx] |= 1 << bit_no; @@ -61,6 +61,9 @@ rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) } } +#define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2, width, height, stride) + + #define _hline_middle_left(_vthick, _hthick) \ do { \ int vthick = thickness(_vthick, dpi); \ @@ -94,8 +97,6 @@ rectangle(uint8_t *buf, int x1, int y1, int x2, int y2, int stride) #define vline_middle_up(thick) _vline_middle_up(thick, thick) #define vline_middle_down(thick) _vline_middle_down(thick, thick) -#define rect(x1, y1, x2, y2) rectangle(buf, x1, y1, x2, y2, stride) - #define quad_upper_left() rect(0, 0, ceil(width / 2.), ceil(height / 2.)) #define quad_upper_right() rect(floor(width / 2.), 0, width, ceil(height / 2.)) #define quad_lower_left() rect(0, floor(height / 2.), ceil(width / 2.), height) From a8496eef037d063555e8e7dbe9094cb955ae6897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 30 Dec 2020 13:30:11 +0100 Subject: [PATCH 35/62] box-drawing: thickness(): ensure thickness is *at least* 1px --- box-drawing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index b368210a..8584f8ad 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -18,7 +18,7 @@ static int thickness(float pts, int dpi) { - return pts * (float)dpi / 72.0; + return max(pts * (float)dpi / 72.0, 1); } static void From bd42986a8bd67e5ea647d5ed91fc4a89307e308c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Wed, 30 Dec 2020 13:30:39 +0100 Subject: [PATCH 36/62] box-drawing: {h,v}line(): handle both start/end point being too small *and* too large --- box-drawing.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 8584f8ad..07deb387 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -24,8 +24,11 @@ thickness(float pts, int dpi) static void _hline(uint8_t *buf, int x1, int x2, int y, int thick, int width, int height, int stride) { + x1 = min(max(x1, 0), width); + x2 = min(max(x2, 0), width); + for (size_t row = max(y, 0); row < min(y + thick, height); row++) { - for (size_t col = max(x1, 0); col < min(x2, width); col++) { + for (size_t col = x1; col < x2; col++) { size_t idx = col / 8; size_t bit_no = col % 8; buf[row * stride + idx] |= 1 << bit_no; @@ -38,7 +41,10 @@ _hline(uint8_t *buf, int x1, int x2, int y, int thick, int width, int height, in static void _vline(uint8_t *buf, int y1, int y2, int x, int thick, int width, int height, int stride) { - for (size_t row = max(y1, 0); row < min(y2, height); row++) { + y1 = min(max(y1, 0), height); + y2 = min(max(y2, 0), height); + + for (size_t row = y1; row < y2; row++) { for (size_t col = max(x, 0); col < min(x + thick, width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; From c120e0c84fc5c3846cf095c75da3cfa829060616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 31 Dec 2020 17:22:14 +0100 Subject: [PATCH 37/62] box-drawing: wip: LIGHT ARC: U+256d-U+2570 --- box-drawing.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 07deb387..0e2bcb7b 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1037,6 +1037,100 @@ draw_box_drawings_double_vertical_and_horizontal(uint8_t *buf, int width, int he vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); } +#define cubic_bezier_x(t) __extension__ \ + ({ \ + double tm1 = 1 - t; \ + double tm1_3 = tm1 * tm1 * tm1; \ + double t_3 = t * t * t; \ + tm1_3 * start_x + 3 * t * tm1 * (tm1 * c1_x + t * c2_x) + t_3 * end_x; \ + }) + +#define cubic_bezier_y(t) __extension__ \ + ({ \ + double tm1 = 1 - t; \ + double tm1_3 = tm1 * tm1 * tm1; \ + double t_3 = t * t * t; \ + tm1_3 * start_y + 3 * t * tm1 * (tm1 * c1_y + t * c2_y) + t_3 * end_y; \ + }) + +static void +draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) +{ + int thick = thickness(LIGHT, dpi); + int delta = thick / 2; + int extra = thick % 2; + + int hw = (width - thick) / 2; + int hh = (height - thick) / 2; + int start_x, start_y, end_x, end_y, c1_x, c1_y, c2_x, c2_y; + + if (wc == L'╭') { + start_x = hw; + start_y = height - 1; + end_x = width - 1; + end_y = hh; + + c1_x = hw; + c1_y = round(3. * height / 4.); + + c2_x = hw; + c2_y = hh + 1; + } else if (wc == L'╮') { + start_x = 0; + start_y = hh; + end_x = hw; + end_y = height - 1; + + c1_x = hw + 1; + c1_y = hh + 1; + + c2_x = hw + 1; + c2_y = round(3. * height / 4.); + } else if (wc == L'╯') { + start_x = 0; + start_y = hh; + end_x = hw; + end_y = 0; + + c1_x = hw + 2; + c1_y = hh + 1; + + c2_x = hw + 1; + c2_y = round(height / 4.); + } else { + assert(wc == L'╰'); + + start_x = hw; + start_y = 0; + end_x = width - 1; + end_y = hh; + + c1_x = hw; + c1_y = round(height / 4.); + + c2_x = hw; + c2_y = hh + 1; + } + + LOG_INFO("%f, %f", round(3. * height / 4.), round(height / 4.)); + + int num_samples = height * 4; + + for (size_t i = 0; i < num_samples + 1; i++) { + double t = (double)i / num_samples; + int p_x = cubic_bezier_x(t); + int p_y = cubic_bezier_y(t); + + for (int y = max(p_y - delta, 0); y < min(p_y + delta + extra, height); y++) { + for (int x = max(p_x - delta, 0); x < min(p_x + delta + extra, width); x++) { + size_t ofs = x / 8; + size_t bit_no = x % 8; + buf[y * stride + ofs] |= 1 << bit_no; + } + } + } +} + static void draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -1586,11 +1680,7 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x256a: draw_box_drawings_vertical_single_and_horizontal_double(buf, width, height, stride, dpi); break; case 0x256b: draw_box_drawings_vertical_double_and_horizontal_single(buf, width, height, stride, dpi); break; case 0x256c: draw_box_drawings_double_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x256d: - case 0x256e: - case 0x256f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; + case 0x256d ... 0x2570: draw_box_drawings_light_arc(wc, buf, width, height, stride, dpi); break; case 0x2574: draw_box_drawings_light_left(buf, width, height, stride, dpi); break; case 0x2575: draw_box_drawings_light_up(buf, width, height, stride, dpi); break; @@ -1605,7 +1695,6 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x257e: draw_box_drawings_heavy_left_and_light_right(buf, width, height, stride, dpi); break; case 0x257f: draw_box_drawings_heavy_up_and_light_down(buf, width, height, stride, dpi); break; - case 0x2570: case 0x2571: case 0x2572: case 0x2573: From 56e947bb44dd654634bb068c0a11f173fdd85114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 12:47:57 +0100 Subject: [PATCH 38/62] box-drawing: LIGHT ARC: pixel-perfect At least in odd-sized cells, with a thickness of 1 pixel. --- box-drawing.c | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 0e2bcb7b..d2666d65 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1067,59 +1067,61 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int if (wc == L'╭') { start_x = hw; start_y = height - 1; + end_x = width - 1; end_y = hh; c1_x = hw; - c1_y = round(3. * height / 4.); + c1_y = 3. * height / 4.; c2_x = hw; - c2_y = hh + 1; + c2_y = hh; } else if (wc == L'╮') { - start_x = 0; - start_y = hh; - end_x = hw; - end_y = height - 1; + start_x = hw; + start_y = height - 1; - c1_x = hw + 1; - c1_y = hh + 1; + end_x = 0; + end_y = hh; - c2_x = hw + 1; - c2_y = round(3. * height / 4.); + c1_x = hw; + c1_y = 3. * height / 4.; + + c2_x = hw; + c2_y = hh; } else if (wc == L'╯') { - start_x = 0; - start_y = hh; - end_x = hw; - end_y = 0; + start_x = hw; + start_y = 0; - c1_x = hw + 2; - c1_y = hh + 1; + end_x = 0; + end_y = hh; - c2_x = hw + 1; - c2_y = round(height / 4.); + c1_x = hw; + c1_y = height / 4.; + + c2_x = hw; + c2_y = hh; } else { assert(wc == L'╰'); start_x = hw; start_y = 0; + end_x = width - 1; end_y = hh; c1_x = hw; - c1_y = round(height / 4.); + c1_y = height / 4.; c2_x = hw; - c2_y = hh + 1; + c2_y = hh; } - LOG_INFO("%f, %f", round(3. * height / 4.), round(height / 4.)); - int num_samples = height * 4; for (size_t i = 0; i < num_samples + 1; i++) { double t = (double)i / num_samples; - int p_x = cubic_bezier_x(t); - int p_y = cubic_bezier_y(t); + int p_x = round(cubic_bezier_x(t)); + int p_y = round(cubic_bezier_y(t)); for (int y = max(p_y - delta, 0); y < min(p_y + delta + extra, height); y++) { for (int x = max(p_x - delta, 0); x < min(p_x + delta + extra, width); x++) { From 167078c0767099c7fe42dc7e084ee5d8f75ddd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 13:18:05 +0100 Subject: [PATCH 39/62] =?UTF-8?q?box-drawing:=20LIGHT=20ARC:=20no=20need?= =?UTF-8?q?=20to=20do=20floating=20point=20since=20we=E2=80=99re=20truncat?= =?UTF-8?q?ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- box-drawing.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index d2666d65..3dd27d13 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1072,7 +1072,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = 3. * height / 4.; + c1_y = 3 * height / 4; c2_x = hw; c2_y = hh; @@ -1084,7 +1084,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = 3. * height / 4.; + c1_y = 3 * height / 4; c2_x = hw; c2_y = hh; @@ -1096,7 +1096,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = height / 4.; + c1_y = height / 4; c2_x = hw; c2_y = hh; @@ -1110,7 +1110,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = height / 4.; + c1_y = height / 4; c2_x = hw; c2_y = hh; From 848bd27dd52b433d1de789f7629f543c2b23fe82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 13:18:51 +0100 Subject: [PATCH 40/62] box-drawing: LIGHT ARC: improve symmetry when cell width is even --- box-drawing.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 3dd27d13..31fe191f 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1066,9 +1066,9 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int if (wc == L'╭') { start_x = hw; - start_y = height - 1; + start_y = 2 * hh; - end_x = width - 1; + end_x = 2 * hw; end_y = hh; c1_x = hw; @@ -1078,7 +1078,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int c2_y = hh; } else if (wc == L'╮') { start_x = hw; - start_y = height - 1; + start_y = 2 * hh; end_x = 0; end_y = hh; @@ -1106,7 +1106,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int start_x = hw; start_y = 0; - end_x = width - 1; + end_x = 2 * hw; end_y = hh; c1_x = hw; @@ -1131,6 +1131,26 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int } } } + + if (wc == L'╭' || wc == L'╰') { + for (int x = 2 * hw; x < width; x++) { + for (int y = max(hh - delta, 0); y < min(hh + delta + extra, height); y++) { + size_t ofs = x / 8; + size_t bit_no = x % 8; + buf[y * stride + ofs] |= 1 << bit_no; + } + } + } + + if (wc == L'╭' || wc == L'╮') { + for (int y = 2 * hh; y < height; y++) { + for (int x = max(hw - delta, 0); x < min(hw + delta + extra, width); x++) { + size_t ofs = x / 8; + size_t bit_no = x % 8; + buf[y * stride + ofs] |= 1 << bit_no; + } + } + } } static void From 34360fbb7d1ab9fd4290086c396ef19e7b5e4261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 14:06:48 +0100 Subject: [PATCH 41/62] box-drawing: LIGHT/HEAVY DOUBLE/TRIPLE/QUADRUPLE HORIZONTAL *U+2504 *U+2505 *U+2508 *U+2509 *U+254C *U+254D --- box-drawing.c | 136 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 6 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 31fe191f..ea1c962e 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -136,6 +136,116 @@ draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride vline_middle_down(HEAVY); } +static void +draw_box_drawings_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) +{ + int dash_width = (width - gap) / 2; + while (dash_width <= 0 && gap > 1) { + gap--; + dash_width = (width - gap) / 2; + } + + if (dash_width <= 0) { + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + return; + } + + assert(2 * dash_width + gap <= width); + + int x0 = 0; + int x1 = x0 + dash_width + gap; + + hline(x0, x0 + dash_width, (height - thick) / 2, thick); + hline(x1, width, (height - thick) / 2, thick); +} + +static void +draw_box_drawings_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) +{ + int dash_width = (width - (2 * gap)) / 3; + while (dash_width <= 0 && gap > 1) { + gap--; + dash_width = (width - (2 * gap)) / 3; + } + + if (dash_width <= 0) { + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + return; + } + + assert(3 * dash_width + 2 * gap <= width); + + int remaining = width - 3 * dash_width - 2 * gap; + + int x0 = 0; + int x1 = x0 + dash_width + gap; + int x2 = x1 + dash_width + remaining + gap; + + hline(x0, x0 + dash_width, (height - thick) / 2, thick); + hline(x1, x1 + dash_width + remaining, (height - thick) / 2, thick); + hline(x2, width, (height - thick) / 2, thick); +} + +static void +draw_box_drawings_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) +{ + int dash_width = (width - (3 * gap)) / 4; + while (dash_width <= 0 && gap > 1) { + gap--; + dash_width = (width - (3 * gap)) / 4; + } + + if (dash_width <= 0) { + hline_middle_left(LIGHT); + hline_middle_right(LIGHT); + return; + } + + assert(4 * dash_width + 3 * gap <= width); + + int remaining = width - 4 * dash_width - 3 * gap; + + int x0 = 0; + int x1 = x0 + dash_width + gap; + int x2 = x1 + dash_width + remaining / 2 + gap; + int x3 = x2 + dash_width + (remaining - remaining / 2) + gap; + + hline(x0, x0 + dash_width, (height - thick) / 2, thick); + hline(x1, x1 + dash_width + remaining / 2, (height - thick) / 2, thick); + hline(x2, x2 + dash_width + (remaining - remaining / 2), (height - thick) / 2, thick); + hline(x3, width, (height - thick) / 2, thick); +} + +static void +draw_box_drawings_light_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_triple_dash_horizontal( + buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_heavy_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_triple_dash_horizontal( + buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_light_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_quadruple_dash_horizontal( + buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_heavy_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_quadruple_dash_horizontal( + buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + static void draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -648,6 +758,20 @@ draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int hei vline_middle_down(HEAVY); } +static void +draw_box_drawings_light_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_double_dash_horizontal( + buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_heavy_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_double_dash_horizontal( + buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + static void draw_box_drawings_double_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -1585,17 +1709,17 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2501: draw_box_drawings_heavy_horizontal(buf, width, height, stride, dpi); break; case 0x2502: draw_box_drawings_light_vertical(buf, width, height, stride, dpi); break; case 0x2503: draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); break; + case 0x2504: draw_box_drawings_light_triple_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x2505: draw_box_drawings_heavy_triple_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x2508: draw_box_drawings_light_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x2509: draw_box_drawings_heavy_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; case 0x250d: draw_box_drawings_down_light_and_right_heavy(buf, width, height, stride, dpi); break; case 0x250e: draw_box_drawings_down_heavy_and_right_light(buf, width, height, stride, dpi); break; case 0x250f: draw_box_drawings_heavy_down_and_right(buf, width, height, stride, dpi); break; - case 0x2504: - case 0x2505: case 0x2506: case 0x2507: - case 0x2508: - case 0x2509: case 0x250a: case 0x250b: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); @@ -1664,9 +1788,9 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2549: draw_box_drawings_right_light_and_left_vertical_heavy(buf, width, height, stride, dpi); break; case 0x254a: draw_box_drawings_left_light_and_right_vertical_heavy(buf, width, height, stride, dpi); break; case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf, width, height, stride, dpi); break; + case 0x254c: draw_box_drawings_light_double_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x254d: draw_box_drawings_heavy_double_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x254c: - case 0x254d: case 0x254e: case 0x254f: LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); From ebb5e9eeae285f80b6696568f3a6f2f996322568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 20:33:38 +0100 Subject: [PATCH 42/62] box-drawing: LIGHT/HEAVY DOUBLE/TRIPLE/QUADRUPLE VERTICAL Also combine the HORIZONTAL versions into a single draw function. * U+2506 * U+2507 * U+250A * U+250B * U+254E * U+254F --- box-drawing.c | 210 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 138 insertions(+), 72 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index ea1c962e..1da99577 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -137,12 +137,15 @@ draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride } static void -draw_box_drawings_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) +draw_box_drawings_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int count, int thick, int gap) { - int dash_width = (width - gap) / 2; + assert(count >= 2 && count <= 4); + const int gap_count = count - 1; + + int dash_width = (width - (gap_count * gap)) / count; while (dash_width <= 0 && gap > 1) { gap--; - dash_width = (width - gap) / 2; + dash_width = (width - (gap_count * gap)) / count; } if (dash_width <= 0) { @@ -151,99 +154,154 @@ draw_box_drawings_double_dash_horizontal(uint8_t *buf, int width, int height, in return; } - assert(2 * dash_width + gap <= width); + assert(count * dash_width + gap_count * gap <= width); - int x0 = 0; - int x1 = x0 + dash_width + gap; + int remaining = width - count * dash_width - gap_count * gap; - hline(x0, x0 + dash_width, (height - thick) / 2, thick); - hline(x1, width, (height - thick) / 2, thick); + int x[4]; + int w[4] = {dash_width, dash_width, dash_width, dash_width}; + + x[0] = 0; + + x[1] = x[0] + w[0] + gap; + if (count == 2) + w[1] = width - x[1]; + else if (count == 3) + w[1] += remaining; + else + w[1] += remaining / 2; + + if (count >= 3) { + x[2] = x[1] + w[1] + gap; + if (count == 3) + w[2] = width - x[2]; + else + w[2] += remaining - remaining / 2; + } + + if (count >= 4) { + x[3] = x[2] + w[2] + gap; + w[3] = width - x[3]; + } + + hline(x[0], x[0] + w[0], (height - thick) / 2, thick); + hline(x[1], x[1] + w[1], (height - thick) / 2, thick); + if (count >= 3) + hline(x[2], x[2] + w[2], (height - thick) / 2, thick); + if (count >= 4) + hline(x[3], x[3] + w[3], (height - thick) / 2, thick); } static void -draw_box_drawings_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) +draw_box_drawings_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi, int count, int thick, int gap) { - int dash_width = (width - (2 * gap)) / 3; - while (dash_width <= 0 && gap > 1) { + assert(count >= 2 && count <= 4); + const int gap_count = count - 1; + + int dash_height = (height - (gap_count * gap)) / count; + while (dash_height <= 0 && gap > 1) { gap--; - dash_width = (width - (2 * gap)) / 3; + dash_height = (height - (gap_count * gap)) / count; } - if (dash_width <= 0) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + if (dash_height <= 0) { + vline_middle_up(LIGHT); + vline_middle_down(LIGHT); return; } - assert(3 * dash_width + 2 * gap <= width); + assert(count * dash_height + gap_count * gap <= height); - int remaining = width - 3 * dash_width - 2 * gap; + int remaining = height - count * dash_height - gap_count * gap; - int x0 = 0; - int x1 = x0 + dash_width + gap; - int x2 = x1 + dash_width + remaining + gap; + int y[4]; + int h[4] = {dash_height, dash_height, dash_height, dash_height}; - hline(x0, x0 + dash_width, (height - thick) / 2, thick); - hline(x1, x1 + dash_width + remaining, (height - thick) / 2, thick); - hline(x2, width, (height - thick) / 2, thick); -} + y[0] = 0; -static void -draw_box_drawings_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int thick, int gap) -{ - int dash_width = (width - (3 * gap)) / 4; - while (dash_width <= 0 && gap > 1) { - gap--; - dash_width = (width - (3 * gap)) / 4; + y[1] = y[0] + h[0] + gap; + if (count == 2) + h[1] = height - y[1]; + else if (count == 3) + h[1] += remaining; + else + h[1] += remaining / 2; + + if (count >= 3) { + y[2] = y[1] + h[1] + gap; + if (count == 3) + h[2] = height - y[2]; + else + h[2] += remaining - remaining / 2; } - if (dash_width <= 0) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); - return; + if (count >= 4) { + y[3] = y[2] + h[2] + gap; + h[3] = height - y[3]; } - assert(4 * dash_width + 3 * gap <= width); - - int remaining = width - 4 * dash_width - 3 * gap; - - int x0 = 0; - int x1 = x0 + dash_width + gap; - int x2 = x1 + dash_width + remaining / 2 + gap; - int x3 = x2 + dash_width + (remaining - remaining / 2) + gap; - - hline(x0, x0 + dash_width, (height - thick) / 2, thick); - hline(x1, x1 + dash_width + remaining / 2, (height - thick) / 2, thick); - hline(x2, x2 + dash_width + (remaining - remaining / 2), (height - thick) / 2, thick); - hline(x3, width, (height - thick) / 2, thick); + vline(y[0], y[0] + h[0], (width - thick) / 2, thick); + vline(y[1], y[1] + h[1], (width - thick) / 2, thick); + if (count >= 3) + vline(y[2], y[2] + h[2], (width - thick) / 2, thick); + if (count >= 4) + vline(y[3], y[3] + h[3], (width - thick) / 2, thick); } static void draw_box_drawings_light_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_triple_dash_horizontal( - buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 3, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); } static void draw_box_drawings_heavy_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_triple_dash_horizontal( - buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 3, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_light_triple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 3, thickness(LIGHT, dpi), thickness(HEAVY, dpi)); +} + +static void +draw_box_drawings_heavy_triple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 3, thickness(HEAVY, dpi), thickness(HEAVY, dpi)); } static void draw_box_drawings_light_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_quadruple_dash_horizontal( - buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 4, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); } static void draw_box_drawings_heavy_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_quadruple_dash_horizontal( - buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 4, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_light_quadruple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 4, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_heavy_quadruple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 4, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); } static void @@ -761,15 +819,29 @@ draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int hei static void draw_box_drawings_light_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_double_dash_horizontal( - buf, width, height, stride, dpi, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 2, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); } static void draw_box_drawings_heavy_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) { - draw_box_drawings_double_dash_horizontal( - buf, width, height, stride, dpi, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal( + buf, width, height, stride, dpi, 2, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); +} + +static void +draw_box_drawings_light_double_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 2, thickness(LIGHT, dpi), thickness(HEAVY, dpi)); +} + +static void +draw_box_drawings_heavy_double_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_dash_vertical( + buf, width, height, stride, dpi, 2, thickness(HEAVY, dpi), thickness(HEAVY, dpi)); } static void @@ -1711,20 +1783,17 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x2503: draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); break; case 0x2504: draw_box_drawings_light_triple_dash_horizontal(buf, width, height, stride, dpi); break; case 0x2505: draw_box_drawings_heavy_triple_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x2506: draw_box_drawings_light_triple_dash_vertical(buf, width, height, stride, dpi); break; + case 0x2507: draw_box_drawings_heavy_triple_dash_vertical(buf, width, height, stride, dpi); break; case 0x2508: draw_box_drawings_light_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; case 0x2509: draw_box_drawings_heavy_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; + case 0x250a: draw_box_drawings_light_quadruple_dash_vertical(buf, width, height, stride, dpi); break; + case 0x250b: draw_box_drawings_heavy_quadruple_dash_vertical(buf, width, height, stride, dpi); break; case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; case 0x250d: draw_box_drawings_down_light_and_right_heavy(buf, width, height, stride, dpi); break; case 0x250e: draw_box_drawings_down_heavy_and_right_light(buf, width, height, stride, dpi); break; case 0x250f: draw_box_drawings_heavy_down_and_right(buf, width, height, stride, dpi); break; - case 0x2506: - case 0x2507: - case 0x250a: - case 0x250b: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; - case 0x2510: draw_box_drawings_light_down_and_left(buf, width, height, stride, dpi); break; case 0x2511: draw_box_drawings_down_light_and_left_heavy(buf, width, height, stride, dpi); break; case 0x2512: draw_box_drawings_down_heavy_and_left_light(buf, width, height, stride, dpi); break; @@ -1790,11 +1859,8 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf, width, height, stride, dpi); break; case 0x254c: draw_box_drawings_light_double_dash_horizontal(buf, width, height, stride, dpi); break; case 0x254d: draw_box_drawings_heavy_double_dash_horizontal(buf, width, height, stride, dpi); break; - - case 0x254e: - case 0x254f: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; + case 0x254e: draw_box_drawings_light_double_dash_vertical(buf, width, height, stride, dpi); break; + case 0x254f: draw_box_drawings_heavy_double_dash_vertical(buf, width, height, stride, dpi); break; case 0x2550: draw_box_drawings_double_horizontal(buf, width, height, stride, dpi); break; case 0x2551: draw_box_drawings_double_vertical(buf, width, height, stride, dpi); break; From ca423bcb01877461c96eca6ae7c72cf41477e0a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:00:27 +0100 Subject: [PATCH 43/62] box-drawing: silence variable-may-not-be-initialized warnings --- box-drawing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 1da99577..a3a973cf 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -158,7 +158,7 @@ draw_box_drawings_dash_horizontal(uint8_t *buf, int width, int height, int strid int remaining = width - count * dash_width - gap_count * gap; - int x[4]; + int x[4] = {0}; int w[4] = {dash_width, dash_width, dash_width, dash_width}; x[0] = 0; @@ -214,7 +214,7 @@ draw_box_drawings_dash_vertical(uint8_t *buf, int width, int height, int stride, int remaining = height - count * dash_height - gap_count * gap; - int y[4]; + int y[4] = {0}; int h[4] = {dash_height, dash_height, dash_height, dash_height}; y[0] = 0; From 81ac95995ae2ff7431d67513510380d70c4ea054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:01:02 +0100 Subject: [PATCH 44/62] box-drawing: LIGHT DIAGONALs * U+2571 * U+2572 * U+2573 --- box-drawing.c | 56 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index a3a973cf..ae4849fa 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1349,6 +1349,53 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int } } +static void +draw_box_drawings_light_diagonal(uint8_t *buf, int width, int height, int stride, int dpi, double k, double c) +{ +#define linear_equation(x) (k * (x) + c) + + int num_samples = width * 16; + + for (int i = 0; i < num_samples; i++) { + double x = i / 16.; + int col = round(x); + int row = round(linear_equation(x)); + + if (row >= 0 && row < height) { + size_t ofs = col / 8; + size_t bit_no = col % 8; + buf[row * stride + ofs] |= 1 << bit_no; + } + } + +#undef linear_equation +} + +static void +draw_box_drawings_light_diagonal_upper_right_to_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +{ + /* y = k * x + c */ + double c = height - 1; + double k = (0 - (height - 1)) / (double)(width - 1 - 0); + draw_box_drawings_light_diagonal(buf, width, height, stride, dpi, k, c); +} + +static void +draw_box_drawings_light_diagonal_upper_left_to_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +{ + /* y = k * x + c */ + double c = 0; + double k = (height - 1 - 0) / (double)(width - 1 - 0); + draw_box_drawings_light_diagonal(buf, width, height, stride, dpi, k, c); +} + +static void +draw_box_drawings_light_diagonal_cross(uint8_t *buf, int width, int height, int stride, int dpi) +{ + draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf, width, height, stride, dpi); + draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf, width, height, stride, dpi); +} + static void draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) { @@ -1894,6 +1941,9 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x256c: draw_box_drawings_double_vertical_and_horizontal(buf, width, height, stride, dpi); break; case 0x256d ... 0x2570: draw_box_drawings_light_arc(wc, buf, width, height, stride, dpi); break; + case 0x2571: draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf, width, height, stride, dpi); break; + case 0x2572: draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf, width, height, stride, dpi); break; + case 0x2573: draw_box_drawings_light_diagonal_cross(buf, width, height, stride, dpi); break; case 0x2574: draw_box_drawings_light_left(buf, width, height, stride, dpi); break; case 0x2575: draw_box_drawings_light_up(buf, width, height, stride, dpi); break; case 0x2576: draw_box_drawings_light_right(buf, width, height, stride, dpi); break; @@ -1907,12 +1957,6 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) case 0x257e: draw_box_drawings_heavy_left_and_light_right(buf, width, height, stride, dpi); break; case 0x257f: draw_box_drawings_heavy_up_and_light_down(buf, width, height, stride, dpi); break; - case 0x2571: - case 0x2572: - case 0x2573: - LOG_WARN("unimplemented: box drawing: wc=%04lx", (long)wc); - break; - case 0x2580: draw_upper_half_block(buf, width, height, stride, dpi); break; case 0x2581: draw_lower_one_eighth_block(buf, width, height, stride, dpi); break; case 0x2582: draw_lower_one_quarter_block(buf, width, height, stride, dpi); break; From 71d187119f3abb821938d0f34d9d9777da732e34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:08:57 +0100 Subject: [PATCH 45/62] changelog: box drawing characters are rendered by foot --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95777467..8397608c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ * The fcft and tllist library subprojects are now handled via Meson [wrap files](https://mesonbuild.com/Wrap-dependency-system-manual.html) instead of needing to be manually cloned. +* Box drawing characters are now rendered by foot, instead of using + font glyphs (https://codeberg.org/dnkl/foot/issues/198) ### Deprecated From 11d4e9ee53eba9d845c93f1ff4aa912c4c231e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:27:53 +0100 Subject: [PATCH 46/62] box-drawing: disable debug output --- box-drawing.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index ae4849fa..f462540e 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -4,7 +4,7 @@ #include #define LOG_MODULE "box-drawing" -#define LOG_ENABLE_DBG 1 +#define LOG_ENABLE_DBG 0 #include "log.h" #include "macros.h" #include "stride.h" From 25f21d42024b60a4d6adba4122b2c17f666fd1e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:28:12 +0100 Subject: [PATCH 47/62] box-drawing: force minsize optimization --- box-drawing.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/box-drawing.c b/box-drawing.c index f462540e..96de8775 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -15,6 +15,8 @@ #define LIGHT 1.0 #define HEAVY 2.0 +#pragma GCC optimize("Os") + static int thickness(float pts, int dpi) { From c75192b4f8cf3d233fc3add0dd6525284ecd9dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:47:05 +0100 Subject: [PATCH 48/62] box-drawing: reduce number of function arguments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We were using so many function arguments that a lot of the emitted code was just stack push and pops to pass around arguments. Bundle the buffer data, width, height, stride, and current DPI, into a single ‘buf’ argument. This greatly reduces the number of arguments to all functions. --- box-drawing.c | 1168 +++++++++++++++++++++++++------------------------ 1 file changed, 589 insertions(+), 579 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 96de8775..87da54d6 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -17,87 +17,96 @@ #pragma GCC optimize("Os") +struct buf { + uint8_t *data; + int width; + int height; + int stride; + int dpi; +}; + static int -thickness(float pts, int dpi) +_thickness(struct buf *buf, float pts) { - return max(pts * (float)dpi / 72.0, 1); + return max(pts * buf->dpi / 72.0, 1); } +#define thickness(pts) _thickness(buf, pts) -static void -_hline(uint8_t *buf, int x1, int x2, int y, int thick, int width, int height, int stride) +static void __attribute__((noinline)) +_hline(struct buf *buf, int x1, int x2, int y, int thick) { - x1 = min(max(x1, 0), width); - x2 = min(max(x2, 0), width); + x1 = min(max(x1, 0), buf->width); + x2 = min(max(x2, 0), buf->width); - for (size_t row = max(y, 0); row < min(y + thick, height); row++) { + for (size_t row = max(y, 0); row < min(y + thick, buf->height); row++) { for (size_t col = x1; col < x2; col++) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } -#define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick, width, height, stride) +#define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick) -static void -_vline(uint8_t *buf, int y1, int y2, int x, int thick, int width, int height, int stride) +static void __attribute__((noinline)) +_vline(struct buf *buf, int y1, int y2, int x, int thick) { - y1 = min(max(y1, 0), height); - y2 = min(max(y2, 0), height); + y1 = min(max(y1, 0), buf->height); + y2 = min(max(y2, 0), buf->height); for (size_t row = y1; row < y2; row++) { - for (size_t col = max(x, 0); col < min(x + thick, width); col++) { + for (size_t col = max(x, 0); col < min(x + thick, buf->width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } -#define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick, width, height, stride) +#define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick) -static void -_rect(uint8_t *buf, int x1, int y1, int x2, int y2, int width, int height, int stride) +static void __attribute__((noinline)) +_rect(struct buf *buf, int x1, int y1, int x2, int y2) { - for (size_t row = max(y1, 0); row < min(y2, height); row++) { - for (size_t col = max(x1, 0); col < min(x2, width); col++) { + for (size_t row = max(y1, 0); row < min(y2, buf->height); row++) { + for (size_t col = max(x1, 0); col < min(x2, buf->width); col++) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } -#define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2, width, height, stride) +#define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2) #define _hline_middle_left(_vthick, _hthick) \ do { \ - int vthick = thickness(_vthick, dpi); \ - int hthick = thickness(_hthick, dpi); \ - hline(0, (width + vthick) / 2, (height - hthick) / 2, hthick); \ + int vthick = thickness(_vthick); \ + int hthick = thickness(_hthick); \ + hline(0, (buf->width + vthick) / 2, (buf->height - hthick) / 2, hthick); \ } while (0) #define _hline_middle_right(_vthick, _hthick) \ do { \ - int vthick = thickness(_vthick, dpi); \ - int hthick = thickness(_hthick, dpi); \ - hline((width - vthick) / 2, width, (height - hthick) / 2, hthick); \ + int vthick = thickness(_vthick); \ + int hthick = thickness(_hthick); \ + hline((buf->width - vthick) / 2, buf->width, (buf->height - hthick) / 2, hthick); \ } while (0) #define _vline_middle_up(_vthick, _hthick) \ do { \ - int vthick = thickness(_vthick, dpi); \ - int hthick = thickness(_hthick, dpi); \ - vline(0, (height + hthick) / 2, (width - vthick) / 2, vthick); \ + int vthick = thickness(_vthick); \ + int hthick = thickness(_hthick); \ + vline(0, (buf->height + hthick) / 2, (buf->width - vthick) / 2, vthick); \ } while (0) #define _vline_middle_down(_vthick, _hthick) \ do { \ - int vthick = thickness(_vthick, dpi); \ - int hthick = thickness(_hthick, dpi); \ - vline((height - hthick) / 2, height, (width - vthick) / 2, vthick); \ + int vthick = thickness(_vthick); \ + int hthick = thickness(_hthick); \ + vline((buf->height - hthick) / 2, buf->height, (buf->width - vthick) / 2, vthick); \ } while (0) #define hline_middle_left(thick) _hline_middle_left(thick, thick) @@ -105,42 +114,45 @@ _rect(uint8_t *buf, int x1, int y1, int x2, int y2, int width, int height, int s #define vline_middle_up(thick) _vline_middle_up(thick, thick) #define vline_middle_down(thick) _vline_middle_down(thick, thick) -#define quad_upper_left() rect(0, 0, ceil(width / 2.), ceil(height / 2.)) -#define quad_upper_right() rect(floor(width / 2.), 0, width, ceil(height / 2.)) -#define quad_lower_left() rect(0, floor(height / 2.), ceil(width / 2.), height) -#define quad_lower_right() rect(floor(width / 2.), floor(height / 2.), width, height) +#define quad_upper_left() rect(0, 0, ceil(buf->width / 2.), ceil(buf->height / 2.)) +#define quad_upper_right() rect(floor(buf->width / 2.), 0, buf->width, ceil(buf->height / 2.)) +#define quad_lower_left() rect(0, floor(buf->height / 2.), ceil(buf->width / 2.), buf->height) +#define quad_lower_right() rect(floor(buf->width / 2.), floor(buf->height / 2.), buf->width, buf->height) static void -draw_box_drawings_light_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_horizontal(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); } static void -draw_box_drawings_heavy_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_horizontal(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); } static void -draw_box_drawings_light_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical(struct buf *buf) { vline_middle_up(LIGHT); vline_middle_down(LIGHT); } static void -draw_box_drawings_heavy_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_vertical(struct buf *buf) { vline_middle_up(HEAVY); vline_middle_down(HEAVY); } static void -draw_box_drawings_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi, int count, int thick, int gap) +draw_box_drawings_dash_horizontal(struct buf *buf, int count, int thick, int gap) { + int width = buf->width; + int height = buf->height; + assert(count >= 2 && count <= 4); const int gap_count = count - 1; @@ -195,8 +207,11 @@ draw_box_drawings_dash_horizontal(uint8_t *buf, int width, int height, int strid } static void -draw_box_drawings_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi, int count, int thick, int gap) +draw_box_drawings_dash_vertical(struct buf *buf, int count, int thick, int gap) { + int width = buf->width; + int height = buf->height; + assert(count >= 2 && count <= 4); const int gap_count = count - 1; @@ -251,175 +266,167 @@ draw_box_drawings_dash_vertical(uint8_t *buf, int width, int height, int stride, } static void -draw_box_drawings_light_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_triple_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 3, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 3, thickness(LIGHT), thickness(LIGHT)); } static void -draw_box_drawings_heavy_triple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_triple_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 3, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 3, thickness(HEAVY), thickness(LIGHT)); } static void -draw_box_drawings_light_triple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_triple_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 3, thickness(LIGHT, dpi), thickness(HEAVY, dpi)); + draw_box_drawings_dash_vertical(buf, 3, thickness(LIGHT), thickness(HEAVY)); } static void -draw_box_drawings_heavy_triple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_triple_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 3, thickness(HEAVY, dpi), thickness(HEAVY, dpi)); + draw_box_drawings_dash_vertical(buf, 3, thickness(HEAVY), thickness(HEAVY)); } static void -draw_box_drawings_light_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_quadruple_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 4, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 4, thickness(LIGHT), thickness(LIGHT)); } static void -draw_box_drawings_heavy_quadruple_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_quadruple_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 4, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 4, thickness(HEAVY), thickness(LIGHT)); } static void -draw_box_drawings_light_quadruple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_quadruple_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 4, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_vertical(buf, 4, thickness(LIGHT), thickness(LIGHT)); } static void -draw_box_drawings_heavy_quadruple_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_quadruple_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 4, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_vertical(buf, 4, thickness(HEAVY), thickness(LIGHT)); } static void -draw_box_drawings_light_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_down_and_right(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_down(LIGHT); } static void -draw_box_drawings_down_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_right_heavy(struct buf *buf) { _hline_middle_right(LIGHT, HEAVY); vline_middle_down(LIGHT); } static void -draw_box_drawings_down_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); _vline_middle_down(HEAVY, LIGHT); } static void -draw_box_drawings_heavy_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_down_and_right(struct buf *buf) { hline_middle_right(HEAVY); vline_middle_down(HEAVY); } static void -draw_box_drawings_light_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_down_and_left(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_down(LIGHT); } static void -draw_box_drawings_down_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_left_heavy(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); vline_middle_down(LIGHT); } static void -draw_box_drawings_down_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); _vline_middle_down(HEAVY, LIGHT); } static void -draw_box_drawings_heavy_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_down_and_left(struct buf *buf) { hline_middle_left(HEAVY); vline_middle_down(HEAVY); } static void -draw_box_drawings_light_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_up_and_right(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(LIGHT); } static void -draw_box_drawings_up_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_right_heavy(struct buf *buf) { _hline_middle_right(LIGHT, HEAVY); vline_middle_up(LIGHT); } static void -draw_box_drawings_up_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); _vline_middle_up(HEAVY, LIGHT); } static void -draw_box_drawings_heavy_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up_and_right(struct buf *buf) { hline_middle_right(HEAVY); vline_middle_up(HEAVY); } static void -draw_box_drawings_light_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_up_and_left(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(LIGHT); } static void -draw_box_drawings_up_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_left_heavy(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); vline_middle_up(LIGHT); } static void -draw_box_drawings_up_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); _vline_middle_up(HEAVY, LIGHT); } static void -draw_box_drawings_heavy_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up_and_left(struct buf *buf) { hline_middle_left(HEAVY); vline_middle_up(HEAVY); } static void -draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical_and_right(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(LIGHT); @@ -427,7 +434,7 @@ draw_box_drawings_light_vertical_and_right(uint8_t *buf, int width, int height, } static void -draw_box_drawings_vertical_light_and_right_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_light_and_right_heavy(struct buf *buf) { _hline_middle_right(LIGHT, HEAVY); vline_middle_up(LIGHT); @@ -435,7 +442,7 @@ draw_box_drawings_vertical_light_and_right_heavy(uint8_t *buf, int width, int he } static void -draw_box_drawings_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_right_down_light(struct buf *buf) { hline_middle_right(LIGHT); _vline_middle_up(HEAVY, LIGHT); @@ -443,7 +450,7 @@ draw_box_drawings_up_heavy_and_right_down_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_right_up_light(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(LIGHT); @@ -451,7 +458,7 @@ draw_box_drawings_down_heavy_and_right_up_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_vertical_heavy_and_right_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(HEAVY); @@ -459,7 +466,7 @@ draw_box_drawings_vertical_heavy_and_right_light(uint8_t *buf, int width, int he } static void -draw_box_drawings_down_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_right_up_heavy(struct buf *buf) { hline_middle_right(HEAVY); vline_middle_up(HEAVY); @@ -467,7 +474,7 @@ draw_box_drawings_down_light_and_right_up_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_up_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_right_down_heavy(struct buf *buf) { hline_middle_right(HEAVY); vline_middle_up(LIGHT); @@ -475,7 +482,7 @@ draw_box_drawings_up_light_and_right_down_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_vertical_and_right(struct buf *buf) { hline_middle_right(HEAVY); vline_middle_up(HEAVY); @@ -483,7 +490,7 @@ draw_box_drawings_heavy_vertical_and_right(uint8_t *buf, int width, int height, } static void -draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical_and_left(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(LIGHT); @@ -491,7 +498,7 @@ draw_box_drawings_light_vertical_and_left(uint8_t *buf, int width, int height, i } static void -draw_box_drawings_vertical_light_and_left_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_light_and_left_heavy(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); vline_middle_up(LIGHT); @@ -499,7 +506,7 @@ draw_box_drawings_vertical_light_and_left_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); _vline_middle_up(HEAVY, LIGHT); @@ -507,7 +514,7 @@ draw_box_drawings_up_heavy_and_left_down_light(uint8_t *buf, int width, int heig } static void -draw_box_drawings_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(LIGHT); @@ -515,7 +522,7 @@ draw_box_drawings_down_heavy_and_left_up_light(uint8_t *buf, int width, int heig } static void -draw_box_drawings_vertical_heavy_and_left_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(HEAVY); @@ -523,7 +530,7 @@ draw_box_drawings_vertical_heavy_and_left_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_down_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_left_up_heavy(struct buf *buf) { hline_middle_left(HEAVY); vline_middle_up(HEAVY); @@ -531,7 +538,7 @@ draw_box_drawings_down_light_and_left_up_heavy(uint8_t *buf, int width, int heig } static void -draw_box_drawings_up_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_left_down_heavy(struct buf *buf) { hline_middle_left(HEAVY); vline_middle_up(LIGHT); @@ -539,7 +546,7 @@ draw_box_drawings_up_light_and_left_down_heavy(uint8_t *buf, int width, int heig } static void -draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_vertical_and_left(struct buf *buf) { hline_middle_left(HEAVY); vline_middle_up(HEAVY); @@ -547,7 +554,7 @@ draw_box_drawings_heavy_vertical_and_left(uint8_t *buf, int width, int height, i } static void -draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_down_and_horizontal(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -555,7 +562,7 @@ draw_box_drawings_light_down_and_horizontal(uint8_t *buf, int width, int height, } static void -draw_box_drawings_left_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_heavy_and_right_down_light(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); hline_middle_right(LIGHT); @@ -563,7 +570,7 @@ draw_box_drawings_left_heavy_and_right_down_light(uint8_t *buf, int width, int h } static void -draw_box_drawings_right_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); _hline_middle_right(LIGHT, HEAVY); @@ -571,7 +578,7 @@ draw_box_drawings_right_heavy_and_left_down_light(uint8_t *buf, int width, int h } static void -draw_box_drawings_down_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_horizontal_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -579,7 +586,7 @@ draw_box_drawings_down_light_and_horizontal_heavy(uint8_t *buf, int width, int h } static void -draw_box_drawings_down_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -587,7 +594,7 @@ draw_box_drawings_down_heavy_and_horizontal_light(uint8_t *buf, int width, int h } static void -draw_box_drawings_right_light_and_left_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_light_and_left_down_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); @@ -595,7 +602,7 @@ draw_box_drawings_right_light_and_left_down_heavy(uint8_t *buf, int width, int h } static void -draw_box_drawings_left_light_and_right_down_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_light_and_right_down_heavy(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); @@ -603,7 +610,7 @@ draw_box_drawings_left_light_and_right_down_heavy(uint8_t *buf, int width, int h } static void -draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_down_and_horizontal(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -611,7 +618,7 @@ draw_box_drawings_heavy_down_and_horizontal(uint8_t *buf, int width, int height, } static void -draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_up_and_horizontal(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -619,7 +626,7 @@ draw_box_drawings_light_up_and_horizontal(uint8_t *buf, int width, int height, i } static void -draw_box_drawings_left_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_heavy_and_right_up_light(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); hline_middle_right(LIGHT); @@ -627,7 +634,7 @@ draw_box_drawings_left_heavy_and_right_up_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_right_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); _hline_middle_right(LIGHT, HEAVY); @@ -635,7 +642,7 @@ draw_box_drawings_right_heavy_and_left_up_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_up_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_horizontal_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -643,7 +650,7 @@ draw_box_drawings_up_light_and_horizontal_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_up_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -651,7 +658,7 @@ draw_box_drawings_up_heavy_and_horizontal_light(uint8_t *buf, int width, int hei } static void -draw_box_drawings_right_light_and_left_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_light_and_left_up_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); @@ -659,7 +666,7 @@ draw_box_drawings_right_light_and_left_up_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_left_light_and_right_up_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_light_and_right_up_heavy(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); @@ -667,7 +674,7 @@ draw_box_drawings_left_light_and_right_up_heavy(uint8_t *buf, int width, int hei } static void -draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up_and_horizontal(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -675,7 +682,7 @@ draw_box_drawings_heavy_up_and_horizontal(uint8_t *buf, int width, int height, i } static void -draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_vertical_and_horizontal(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -684,7 +691,7 @@ draw_box_drawings_light_vertical_and_horizontal(uint8_t *buf, int width, int hei } static void -draw_box_drawings_left_heavy_and_right_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_heavy_and_right_vertical_light(struct buf *buf) { _hline_middle_left(LIGHT, HEAVY); hline_middle_right(LIGHT); @@ -693,7 +700,7 @@ draw_box_drawings_left_heavy_and_right_vertical_light(uint8_t *buf, int width, i } static void -draw_box_drawings_right_heavy_and_left_vertical_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_heavy_and_left_vertical_light(struct buf *buf) { hline_middle_left(LIGHT); _hline_middle_right(LIGHT, HEAVY); @@ -702,7 +709,7 @@ draw_box_drawings_right_heavy_and_left_vertical_light(uint8_t *buf, int width, i } static void -draw_box_drawings_vertical_light_and_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_light_and_horizontal_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -711,7 +718,7 @@ draw_box_drawings_vertical_light_and_horizontal_heavy(uint8_t *buf, int width, i } static void -draw_box_drawings_up_heavy_and_down_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_heavy_and_down_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -720,7 +727,7 @@ draw_box_drawings_up_heavy_and_down_horizontal_light(uint8_t *buf, int width, in } static void -draw_box_drawings_down_heavy_and_up_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_heavy_and_up_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -729,7 +736,7 @@ draw_box_drawings_down_heavy_and_up_horizontal_light(uint8_t *buf, int width, in } static void -draw_box_drawings_vertical_heavy_and_horizontal_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_heavy_and_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -738,7 +745,7 @@ draw_box_drawings_vertical_heavy_and_horizontal_light(uint8_t *buf, int width, i } static void -draw_box_drawings_left_up_heavy_and_right_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_up_heavy_and_right_down_light(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); @@ -747,7 +754,7 @@ draw_box_drawings_left_up_heavy_and_right_down_light(uint8_t *buf, int width, in } static void -draw_box_drawings_right_up_heavy_and_left_down_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_up_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); @@ -756,7 +763,7 @@ draw_box_drawings_right_up_heavy_and_left_down_light(uint8_t *buf, int width, in } static void -draw_box_drawings_left_down_heavy_and_right_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_down_heavy_and_right_up_light(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); @@ -765,7 +772,7 @@ draw_box_drawings_left_down_heavy_and_right_up_light(uint8_t *buf, int width, in } static void -draw_box_drawings_right_down_heavy_and_left_up_light(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_down_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); @@ -774,7 +781,7 @@ draw_box_drawings_right_down_heavy_and_left_up_light(uint8_t *buf, int width, in } static void -draw_box_drawings_down_light_and_up_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_light_and_up_horizontal_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -783,7 +790,7 @@ draw_box_drawings_down_light_and_up_horizontal_heavy(uint8_t *buf, int width, in } static void -draw_box_drawings_up_light_and_down_horizontal_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_light_and_down_horizontal_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -792,7 +799,7 @@ draw_box_drawings_up_light_and_down_horizontal_heavy(uint8_t *buf, int width, in } static void -draw_box_drawings_right_light_and_left_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_right_light_and_left_vertical_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); @@ -801,7 +808,7 @@ draw_box_drawings_right_light_and_left_vertical_heavy(uint8_t *buf, int width, i } static void -draw_box_drawings_left_light_and_right_vertical_heavy(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_left_light_and_right_vertical_heavy(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); @@ -810,7 +817,7 @@ draw_box_drawings_left_light_and_right_vertical_heavy(uint8_t *buf, int width, i } static void -draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_vertical_and_horizontal(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(HEAVY); @@ -819,99 +826,95 @@ draw_box_drawings_heavy_vertical_and_horizontal(uint8_t *buf, int width, int hei } static void -draw_box_drawings_light_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_double_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 2, thickness(LIGHT, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 2, thickness(LIGHT), thickness(LIGHT)); } static void -draw_box_drawings_heavy_double_dash_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_double_dash_horizontal(struct buf *buf) { - draw_box_drawings_dash_horizontal( - buf, width, height, stride, dpi, 2, thickness(HEAVY, dpi), thickness(LIGHT, dpi)); + draw_box_drawings_dash_horizontal(buf, 2, thickness(HEAVY), thickness(LIGHT)); } static void -draw_box_drawings_light_double_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_double_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 2, thickness(LIGHT, dpi), thickness(HEAVY, dpi)); + draw_box_drawings_dash_vertical(buf, 2, thickness(LIGHT), thickness(HEAVY)); } static void -draw_box_drawings_heavy_double_dash_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_double_dash_vertical(struct buf *buf) { - draw_box_drawings_dash_vertical( - buf, width, height, stride, dpi, 2, thickness(HEAVY, dpi), thickness(HEAVY, dpi)); + draw_box_drawings_dash_vertical(buf, 2, thickness(HEAVY), thickness(HEAVY)); } static void -draw_box_drawings_double_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_horizontal(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int mid = (height - thick * 3) / 2; + int thick = thickness(LIGHT); + int mid = (buf->height - thick * 3) / 2; - hline(0, width, mid, thick); - hline(0, width, mid + 2 * thick, thick); + hline(0, buf->width, mid, thick); + hline(0, buf->width, mid + 2 * thick, thick); } static void -draw_box_drawings_double_vertical(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_vertical(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int mid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int mid = (buf->width - thick * 3) / 2; - vline(0, height, mid, thick); - vline(0, height, mid + 2 * thick, thick); + vline(0, buf->height, mid, thick); + vline(0, buf->height, mid + 2 * thick, thick); } static void -draw_box_drawings_down_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_single_and_right_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick) / 2; vline_middle_down(LIGHT); - hline(vmid, width, hmid, thick); - hline(vmid, width, hmid + 2 * thick, thick); + hline(vmid, buf->width, hmid, thick); + hline(vmid, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_down_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_double_and_right_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_right(LIGHT); - vline(hmid, height, vmid, thick); - vline(hmid, height, vmid + 2 * thick, thick); + vline(hmid, buf->height, vmid, thick); + vline(hmid, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_down_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_down_and_right(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; - vline(hmid, height, vmid, thick); - vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); + vline(hmid, buf->height, vmid, thick); + vline(hmid + 2 * thick, buf->height, vmid + 2 * thick, thick); - hline(vmid, width, hmid, thick); - hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); + hline(vmid, buf->width, hmid, thick); + hline(vmid + 2 * thick, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_down_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_single_and_left_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width + thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width + thick) / 2; vline_middle_down(LIGHT); @@ -920,51 +923,51 @@ draw_box_drawings_down_single_and_left_double(uint8_t *buf, int width, int heigh } static void -draw_box_drawings_down_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_double_and_left_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_left(LIGHT); - vline(hmid, height, vmid, thick); - vline(hmid, height, vmid + 2 * thick, thick); + vline(hmid, buf->height, vmid, thick); + vline(hmid, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_down_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_down_and_left(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; - vline(hmid + 2 * thick, height, vmid, thick); - vline(hmid, height, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, buf->height, vmid, thick); + vline(hmid, buf->height, vmid + 2 * thick, thick); hline(0, vmid + 2 * thick, hmid, thick); hline(0, vmid, hmid + 2 * thick, thick); } static void -draw_box_drawings_up_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_single_and_right_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick) / 2; vline_middle_up(LIGHT); - hline(vmid, width, hmid, thick); - hline(vmid, width, hmid + 2 * thick, thick); + hline(vmid, buf->width, hmid, thick); + hline(vmid, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_up_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_double_and_right_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height + thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height + thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_right(LIGHT); @@ -973,25 +976,25 @@ draw_box_drawings_up_double_and_right_single(uint8_t *buf, int width, int height } static void -draw_box_drawings_double_up_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_up_and_right(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; vline(0, hmid + 2 * thick, vmid, thick); vline(0, hmid, vmid + 2 * thick, thick); - hline(vmid + 2 * thick, width, hmid, thick); - hline(vmid, width, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, buf->width, hmid, thick); + hline(vmid, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_up_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_single_and_left_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width + thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width + thick) / 2; vline_middle_up(LIGHT); @@ -1000,11 +1003,11 @@ draw_box_drawings_up_single_and_left_double(uint8_t *buf, int width, int height, } static void -draw_box_drawings_up_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_double_and_left_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height + thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height + thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_left(LIGHT); @@ -1013,11 +1016,11 @@ draw_box_drawings_up_double_and_left_single(uint8_t *buf, int width, int height, } static void -draw_box_drawings_double_up_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_up_and_left(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; vline(0, hmid + 0 * thick + thick, vmid, thick); vline(0, hmid + 2 * thick + thick, vmid + 2 * thick, thick); @@ -1027,52 +1030,52 @@ draw_box_drawings_double_up_and_left(uint8_t *buf, int width, int height, int st } static void -draw_box_drawings_vertical_single_and_right_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_single_and_right_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick) / 2; vline_middle_up(LIGHT); vline_middle_down(LIGHT); - hline(vmid, width, hmid, thick); - hline(vmid, width, hmid + 2 * thick, thick); + hline(vmid, buf->width, hmid, thick); + hline(vmid, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_vertical_double_and_right_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_double_and_right_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int vmid = (buf->width - thick * 3) / 2; - hline(vmid + 2 * thick, width, (height - thick) / 2, thick); + hline(vmid + 2 * thick, buf->width, (buf->height - thick) / 2, thick); - vline(0, height, vmid, thick); - vline(0, height, vmid + 2 * thick, thick); + vline(0, buf->height, vmid, thick); + vline(0, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_vertical_and_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_vertical_and_right(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; - vline(0, height, vmid, thick); + vline(0, buf->height, vmid, thick); vline(0, hmid, vmid + 2 * thick, thick); - vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, buf->height, vmid + 2 * thick, thick); - hline(vmid + 2 * thick, width, hmid, thick); - hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, buf->width, hmid, thick); + hline(vmid + 2 * thick, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_vertical_single_and_left_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_single_and_left_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width + thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width + thick) / 2; vline_middle_up(LIGHT); vline_middle_down(LIGHT); @@ -1082,92 +1085,92 @@ draw_box_drawings_vertical_single_and_left_double(uint8_t *buf, int width, int h } static void -draw_box_drawings_vertical_double_and_left_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_double_and_left_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int vmid = (buf->width - thick * 3) / 2; - hline(0, vmid, (height - thick) / 2, thick); + hline(0, vmid, (buf->height - thick) / 2, thick); - vline(0, height, vmid, thick); - vline(0, height, vmid + 2 * thick, thick); + vline(0, buf->height, vmid, thick); + vline(0, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_vertical_and_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_vertical_and_left(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; - vline(0, height, vmid + 2 * thick, thick); + vline(0, buf->height, vmid + 2 * thick, thick); vline(0, hmid, vmid, thick); - vline(hmid + 2 * thick, height, vmid, thick); + vline(hmid + 2 * thick, buf->height, vmid, thick); hline(0, vmid + thick, hmid, thick); hline(0, vmid, hmid + 2 * thick, thick); } static void -draw_box_drawings_down_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_single_and_horizontal_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; - vline(hmid + 2 * thick, height, (width - thick) / 2, thick); + vline(hmid + 2 * thick, buf->height, (buf->width - thick) / 2, thick); - hline(0, width, hmid, thick); - hline(0, width, hmid + 2 * thick, thick); + hline(0, buf->width, hmid, thick); + hline(0, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_down_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_down_double_and_horizontal_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_left(LIGHT); hline_middle_right(LIGHT); - vline(hmid, height, vmid, thick); - vline(hmid, height, vmid + 2 * thick, thick); + vline(hmid, buf->height, vmid, thick); + vline(hmid, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_down_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_down_and_horizontal(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; - hline(0, width, hmid, thick); + hline(0, buf->width, hmid, thick); hline(0, vmid, hmid + 2 * thick, thick); - hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, buf->width, hmid + 2 * thick, thick); - vline(hmid + 2 * thick, height, vmid, thick); - vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, buf->height, vmid, thick); + vline(hmid + 2 * thick, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_up_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_single_and_horizontal_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick) / 2; vline(0, hmid, vmid, thick); - hline(0, width, hmid, thick); - hline(0, width, hmid + 2 * thick, thick); + hline(0, buf->width, hmid, thick); + hline(0, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_up_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_up_double_and_horizontal_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick) / 2; + int vmid = (buf->width - thick * 3) / 2; hline_middle_left(LIGHT); hline_middle_right(LIGHT); @@ -1177,62 +1180,62 @@ draw_box_drawings_up_double_and_horizontal_single(uint8_t *buf, int width, int h } static void -draw_box_drawings_double_up_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_up_and_horizontal(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; vline(0, hmid, vmid, thick); vline(0, hmid, vmid + 2 * thick, thick); hline(0, vmid + thick, hmid, thick); - hline(vmid + 2 * thick, width, hmid, thick); - hline(0, width, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, buf->width, hmid, thick); + hline(0, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_vertical_single_and_horizontal_double(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_single_and_horizontal_double(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; vline_middle_up(LIGHT); vline_middle_down(LIGHT); - hline(0, width, hmid, thick); - hline(0, width, hmid + 2 * thick, thick); + hline(0, buf->width, hmid, thick); + hline(0, buf->width, hmid + 2 * thick, thick); } static void -draw_box_drawings_vertical_double_and_horizontal_single(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_vertical_double_and_horizontal_single(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int vmid = (buf->width - thick * 3) / 2; hline_middle_left(LIGHT); hline_middle_right(LIGHT); - vline(0, height, vmid, thick); - vline(0, height, vmid + 2 * thick, thick); + vline(0, buf->height, vmid, thick); + vline(0, buf->height, vmid + 2 * thick, thick); } static void -draw_box_drawings_double_vertical_and_horizontal(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_double_vertical_and_horizontal(struct buf *buf) { - int thick = thickness(LIGHT, dpi); - int hmid = (height - thick * 3) / 2; - int vmid = (width - thick * 3) / 2; + int thick = thickness(LIGHT); + int hmid = (buf->height - thick * 3) / 2; + int vmid = (buf->width - thick * 3) / 2; hline(0, vmid, hmid, thick); - hline(vmid + 2 * thick, width, hmid, thick); + hline(vmid + 2 * thick, buf->width, hmid, thick); hline(0, vmid, hmid + 2 * thick, thick); - hline(vmid + 2 * thick, width, hmid + 2 * thick, thick); + hline(vmid + 2 * thick, buf->width, hmid + 2 * thick, thick); vline(0, hmid, vmid, thick); vline(0, hmid, vmid + 2 * thick, thick); - vline(hmid + 2 * thick, height, vmid, thick); - vline(hmid + 2 * thick, height, vmid + 2 * thick, thick); + vline(hmid + 2 * thick, buf->height, vmid, thick); + vline(hmid + 2 * thick, buf->height, vmid + 2 * thick, thick); } #define cubic_bezier_x(t) __extension__ \ @@ -1252,14 +1255,14 @@ draw_box_drawings_double_vertical_and_horizontal(uint8_t *buf, int width, int he }) static void -draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) { - int thick = thickness(LIGHT, dpi); + int thick = thickness(LIGHT); int delta = thick / 2; int extra = thick % 2; - int hw = (width - thick) / 2; - int hh = (height - thick) / 2; + int hw = (buf->width - thick) / 2; + int hh = (buf->height - thick) / 2; int start_x, start_y, end_x, end_y, c1_x, c1_y, c2_x, c2_y; if (wc == L'╭') { @@ -1270,7 +1273,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = 3 * height / 4; + c1_y = 3 * buf->height / 4; c2_x = hw; c2_y = hh; @@ -1282,7 +1285,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = 3 * height / 4; + c1_y = 3 * buf->height / 4; c2_x = hw; c2_y = hh; @@ -1294,7 +1297,7 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = height / 4; + c1_y = buf->height / 4; c2_x = hw; c2_y = hh; @@ -1308,65 +1311,65 @@ draw_box_drawings_light_arc(wchar_t wc, uint8_t *buf, int width, int height, int end_y = hh; c1_x = hw; - c1_y = height / 4; + c1_y = buf->height / 4; c2_x = hw; c2_y = hh; } - int num_samples = height * 4; + int num_samples = buf->height * 4; for (size_t i = 0; i < num_samples + 1; i++) { double t = (double)i / num_samples; int p_x = round(cubic_bezier_x(t)); int p_y = round(cubic_bezier_y(t)); - for (int y = max(p_y - delta, 0); y < min(p_y + delta + extra, height); y++) { - for (int x = max(p_x - delta, 0); x < min(p_x + delta + extra, width); x++) { + for (int y = max(p_y - delta, 0); y < min(p_y + delta + extra, buf->height); y++) { + for (int x = max(p_x - delta, 0); x < min(p_x + delta + extra, buf->width); x++) { size_t ofs = x / 8; size_t bit_no = x % 8; - buf[y * stride + ofs] |= 1 << bit_no; + buf->data[y * buf->stride + ofs] |= 1 << bit_no; } } } if (wc == L'╭' || wc == L'╰') { - for (int x = 2 * hw; x < width; x++) { - for (int y = max(hh - delta, 0); y < min(hh + delta + extra, height); y++) { + for (int x = 2 * hw; x < buf->width; x++) { + for (int y = max(hh - delta, 0); y < min(hh + delta + extra, buf->height); y++) { size_t ofs = x / 8; size_t bit_no = x % 8; - buf[y * stride + ofs] |= 1 << bit_no; + buf->data[y * buf->stride + ofs] |= 1 << bit_no; } } } if (wc == L'╭' || wc == L'╮') { - for (int y = 2 * hh; y < height; y++) { - for (int x = max(hw - delta, 0); x < min(hw + delta + extra, width); x++) { + for (int y = 2 * hh; y < buf->height; y++) { + for (int x = max(hw - delta, 0); x < min(hw + delta + extra, buf->width); x++) { size_t ofs = x / 8; size_t bit_no = x % 8; - buf[y * stride + ofs] |= 1 << bit_no; + buf->data[y * buf->stride + ofs] |= 1 << bit_no; } } } } static void -draw_box_drawings_light_diagonal(uint8_t *buf, int width, int height, int stride, int dpi, double k, double c) +draw_box_drawings_light_diagonal(struct buf *buf, double k, double c) { #define linear_equation(x) (k * (x) + c) - int num_samples = width * 16; + int num_samples = buf->width * 16; for (int i = 0; i < num_samples; i++) { double x = i / 16.; int col = round(x); int row = round(linear_equation(x)); - if (row >= 0 && row < height) { + if (row >= 0 && row < buf->height) { size_t ofs = col / 8; size_t bit_no = col % 8; - buf[row * stride + ofs] |= 1 << bit_no; + buf->data[row * buf->stride + ofs] |= 1 << bit_no; } } @@ -1374,276 +1377,276 @@ draw_box_drawings_light_diagonal(uint8_t *buf, int width, int height, int stride } static void -draw_box_drawings_light_diagonal_upper_right_to_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_diagonal_upper_right_to_lower_left(struct buf *buf) { /* y = k * x + c */ - double c = height - 1; - double k = (0 - (height - 1)) / (double)(width - 1 - 0); - draw_box_drawings_light_diagonal(buf, width, height, stride, dpi, k, c); + double c = buf->height - 1; + double k = (0 - (buf->height - 1)) / (double)(buf->width - 1 - 0); + draw_box_drawings_light_diagonal(buf, k, c); } static void -draw_box_drawings_light_diagonal_upper_left_to_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_diagonal_upper_left_to_lower_right(struct buf *buf) { /* y = k * x + c */ double c = 0; - double k = (height - 1 - 0) / (double)(width - 1 - 0); - draw_box_drawings_light_diagonal(buf, width, height, stride, dpi, k, c); + double k = (buf->height - 1 - 0) / (double)(buf->width - 1 - 0); + draw_box_drawings_light_diagonal(buf, k, c); } static void -draw_box_drawings_light_diagonal_cross(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_diagonal_cross(struct buf *buf) { - draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf, width, height, stride, dpi); - draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf, width, height, stride, dpi); + draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf); + draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf); } static void -draw_box_drawings_light_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_left(struct buf *buf) { hline_middle_left(LIGHT); } static void -draw_box_drawings_light_up(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_up(struct buf *buf) { vline_middle_up(LIGHT); } static void -draw_box_drawings_light_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_right(struct buf *buf) { hline_middle_right(LIGHT); } static void -draw_box_drawings_light_down(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_down(struct buf *buf) { vline_middle_down(LIGHT); } static void -draw_box_drawings_heavy_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_left(struct buf *buf) { hline_middle_left(HEAVY); } static void -draw_box_drawings_heavy_up(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up(struct buf *buf) { vline_middle_up(HEAVY); } static void -draw_box_drawings_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_right(struct buf *buf) { hline_middle_right(HEAVY); } static void -draw_box_drawings_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_down(struct buf *buf) { vline_middle_down(HEAVY); } static void -draw_box_drawings_light_left_and_heavy_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_left_and_heavy_right(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); } static void -draw_box_drawings_light_up_and_heavy_down(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_light_up_and_heavy_down(struct buf *buf) { vline_middle_up(LIGHT); vline_middle_down(HEAVY); } static void -draw_box_drawings_heavy_left_and_light_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_left_and_light_right(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); } static void -draw_box_drawings_heavy_up_and_light_down(uint8_t *buf, int width, int height, int stride, int dpi) +draw_box_drawings_heavy_up_and_light_down(struct buf *buf) { vline_middle_up(HEAVY); vline_middle_down(LIGHT); } static void -draw_upper_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_upper_half_block(struct buf *buf) { - rect(0, 0, width, round(height / 2.)); + rect(0, 0, buf->width, round(buf->height / 2.)); } static void -draw_lower_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_one_eighth_block(struct buf *buf) { - rect(0, height - round(height / 8.), width, height); + rect(0, buf->height - round(buf->height / 8.), buf->width, buf->height); } static void -draw_lower_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_one_quarter_block(struct buf *buf) { - rect(0, height - round(height / 4.), width, height); + rect(0, buf->height - round(buf->height / 4.), buf->width, buf->height); } static void -draw_lower_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_three_eighths_block(struct buf *buf) { - rect(0, height - round(3. * height / 8.), width, height); + rect(0, buf->height - round(3. * buf->height / 8.), buf->width, buf->height); } static void -draw_lower_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_half_block(struct buf *buf) { - rect(0, height - round(height / 2.), width, height); + rect(0, buf->height - round(buf->height / 2.), buf->width, buf->height); } static void -draw_lower_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_five_eighths_block(struct buf *buf) { - rect(0, height - round(5. * height / 8.), width, height); + rect(0, buf->height - round(5. * buf->height / 8.), buf->width, buf->height); } static void -draw_lower_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_three_quarters_block(struct buf *buf) { - rect(0, height - round(3. * height / 4.), width, height); + rect(0, buf->height - round(3. * buf->height / 4.), buf->width, buf->height); } static void -draw_lower_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_lower_seven_eighths_block(struct buf *buf) { - rect(0, height - round(7. * height / 8.), width, height); + rect(0, buf->height - round(7. * buf->height / 8.), buf->width, buf->height); } static void -draw_full_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_full_block(struct buf *buf) { - rect(0, 0, width, height); + rect(0, 0, buf->width, buf->height); } static void -draw_left_seven_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_seven_eighths_block(struct buf *buf) { - rect(0, 0, round(7. * width / 8.), height); + rect(0, 0, round(7. * buf->width / 8.), buf->height); } static void -draw_left_three_quarters_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_three_quarters_block(struct buf *buf) { - rect(0, 0, round(3. * width / 4.), height); + rect(0, 0, round(3. * buf->width / 4.), buf->height); } static void -draw_left_five_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_five_eighths_block(struct buf *buf) { - rect(0, 0, round(5. * width / 8.), height); + rect(0, 0, round(5. * buf->width / 8.), buf->height); } static void -draw_left_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_half_block(struct buf *buf) { - rect(0, 0, round(width / 2.), height); + rect(0, 0, round(buf->width / 2.), buf->height); } static void -draw_left_three_eighths_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_three_eighths_block(struct buf *buf) { - rect(0, 0, round(3. * width / 8.), height); + rect(0, 0, round(3. * buf->width / 8.), buf->height); } static void -draw_left_one_quarter_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_one_quarter_block(struct buf *buf) { - rect(0, 0, round(width / 4.), height); + rect(0, 0, round(buf->width / 4.), buf->height); } static void -draw_left_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_left_one_eighth_block(struct buf *buf) { - rect(0, 0, round(width / 8.), height); + rect(0, 0, round(buf->width / 8.), buf->height); } static void -draw_right_half_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_right_half_block(struct buf *buf) { - rect(round(width / 2.), 0, width, height); + rect(round(buf->width / 2.), 0, buf->width, buf->height); } static void -draw_light_shade(uint8_t *buf, int width, int height, int stride, int dpi) +draw_light_shade(struct buf *buf) { - for (size_t row = 0; row < height; row += 2) { - for (size_t col = 0; col < width; col += 2) { + for (size_t row = 0; row < buf->height; row += 2) { + for (size_t col = 0; col < buf->width; col += 2) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } static void -draw_medium_shade(uint8_t *buf, int width, int height, int stride, int dpi) +draw_medium_shade(struct buf *buf) { - for (size_t row = 0; row < height; row++) { - for (size_t col = row % 2; col < width; col += 2) { + for (size_t row = 0; row < buf->height; row++) { + for (size_t col = row % 2; col < buf->width; col += 2) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } static void -draw_dark_shade(uint8_t *buf, int width, int height, int stride, int dpi) +draw_dark_shade(struct buf *buf) { - for (size_t row = 0; row < height; row++) { - for (size_t col = 0; col < width; col += 1 + row % 2) { + for (size_t row = 0; row < buf->height; row++) { + for (size_t col = 0; col < buf->width; col += 1 + row % 2) { size_t idx = col / 8; size_t bit_no = col % 8; - buf[row * stride + idx] |= 1 << bit_no; + buf->data[row * buf->stride + idx] |= 1 << bit_no; } } } static void -draw_upper_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_upper_one_eighth_block(struct buf *buf) { - rect(0, 0, width, round(height / 8.)); + rect(0, 0, buf->width, round(buf->height / 8.)); } static void -draw_right_one_eighth_block(uint8_t *buf, int width, int height, int stride, int dpi) +draw_right_one_eighth_block(struct buf *buf) { - rect(width - round(width / 8.), 0, width, height); + rect(buf->width - round(buf->width / 8.), 0, buf->width, buf->height); } static void -draw_quadrant_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_lower_left(struct buf *buf) { quad_lower_left(); } static void -draw_quadrant_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_lower_right(struct buf *buf) { quad_lower_right(); } static void -draw_quadrant_upper_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_left(struct buf *buf) { quad_upper_left(); } static void -draw_quadrant_upper_left_and_lower_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_left_and_lower_left_and_lower_right(struct buf *buf) { quad_upper_left(); quad_lower_left(); @@ -1651,14 +1654,14 @@ draw_quadrant_upper_left_and_lower_left_and_lower_right(uint8_t *buf, int width, } static void -draw_quadrant_upper_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_left_and_lower_right(struct buf *buf) { quad_upper_left(); quad_lower_right(); } static void -draw_quadrant_upper_left_and_upper_right_and_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_left_and_upper_right_and_lower_left(struct buf *buf) { quad_upper_left(); quad_upper_right(); @@ -1666,7 +1669,7 @@ draw_quadrant_upper_left_and_upper_right_and_lower_left(uint8_t *buf, int width, } static void -draw_quadrant_upper_left_and_upper_right_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_left_and_upper_right_and_lower_right(struct buf *buf) { quad_upper_left(); quad_upper_right(); @@ -1674,35 +1677,35 @@ draw_quadrant_upper_left_and_upper_right_and_lower_right(uint8_t *buf, int width } static void -draw_quadrant_upper_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_right(struct buf *buf) { quad_upper_right(); } static void -draw_quadrant_upper_right_and_lower_left(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_right_and_lower_left(struct buf *buf) { quad_upper_right(); quad_lower_left(); } static void -draw_quadrant_upper_right_and_lower_left_and_lower_right(uint8_t *buf, int width, int height, int stride, int dpi) +draw_quadrant_upper_right_and_lower_left_and_lower_right(struct buf *buf) { quad_upper_right(); quad_lower_left(); 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) +#define sextant_upper_left() rect(0, 0, round(buf->width / 2.), round(buf->height / 3.)) +#define sextant_middle_left() rect(0, buf->height / 3, round(buf->width / 2.), round(2. * buf->height / 3.)) +#define sextant_lower_left() rect(0, 2 * buf->height / 3, round(buf->width / 2.), buf->height) +#define sextant_upper_right() rect(buf->width / 2, 0, buf->width, round(buf->height / 3.)) +#define sextant_middle_right() rect(buf->width / 2, buf->height / 3, buf->width, round(2. * buf->height / 3.)) +#define sextant_lower_right() rect(buf->width / 2, 2 * buf->height / 3, buf->width, buf->height) static void -draw_sextant(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) +draw_sextant(wchar_t wc, struct buf *buf) { /* * Each byte encodes one sextant: @@ -1818,7 +1821,7 @@ draw_sextant(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dp } static void -draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) +draw_glyph(wchar_t wc, struct buf *buf) { #if defined(__GNUC__) #pragma GCC diagnostic push @@ -1826,174 +1829,174 @@ draw_glyph(wchar_t wc, uint8_t *buf, int width, int height, int stride, int dpi) #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; - case 0x2502: draw_box_drawings_light_vertical(buf, width, height, stride, dpi); break; - case 0x2503: draw_box_drawings_heavy_vertical(buf, width, height, stride, dpi); break; - case 0x2504: draw_box_drawings_light_triple_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x2505: draw_box_drawings_heavy_triple_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x2506: draw_box_drawings_light_triple_dash_vertical(buf, width, height, stride, dpi); break; - case 0x2507: draw_box_drawings_heavy_triple_dash_vertical(buf, width, height, stride, dpi); break; - case 0x2508: draw_box_drawings_light_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x2509: draw_box_drawings_heavy_quadruple_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x250a: draw_box_drawings_light_quadruple_dash_vertical(buf, width, height, stride, dpi); break; - case 0x250b: draw_box_drawings_heavy_quadruple_dash_vertical(buf, width, height, stride, dpi); break; - case 0x250c: draw_box_drawings_light_down_and_right(buf, width, height, stride, dpi); break; - case 0x250d: draw_box_drawings_down_light_and_right_heavy(buf, width, height, stride, dpi); break; - case 0x250e: draw_box_drawings_down_heavy_and_right_light(buf, width, height, stride, dpi); break; - case 0x250f: draw_box_drawings_heavy_down_and_right(buf, width, height, stride, dpi); break; + case 0x2500: draw_box_drawings_light_horizontal(buf); break; + case 0x2501: draw_box_drawings_heavy_horizontal(buf); break; + case 0x2502: draw_box_drawings_light_vertical(buf); break; + case 0x2503: draw_box_drawings_heavy_vertical(buf); break; + case 0x2504: draw_box_drawings_light_triple_dash_horizontal(buf); break; + case 0x2505: draw_box_drawings_heavy_triple_dash_horizontal(buf); break; + case 0x2506: draw_box_drawings_light_triple_dash_vertical(buf); break; + case 0x2507: draw_box_drawings_heavy_triple_dash_vertical(buf); break; + case 0x2508: draw_box_drawings_light_quadruple_dash_horizontal(buf); break; + case 0x2509: draw_box_drawings_heavy_quadruple_dash_horizontal(buf); break; + case 0x250a: draw_box_drawings_light_quadruple_dash_vertical(buf); break; + case 0x250b: draw_box_drawings_heavy_quadruple_dash_vertical(buf); break; + case 0x250c: draw_box_drawings_light_down_and_right(buf); break; + case 0x250d: draw_box_drawings_down_light_and_right_heavy(buf); break; + case 0x250e: draw_box_drawings_down_heavy_and_right_light(buf); break; + case 0x250f: draw_box_drawings_heavy_down_and_right(buf); break; - case 0x2510: draw_box_drawings_light_down_and_left(buf, width, height, stride, dpi); break; - case 0x2511: draw_box_drawings_down_light_and_left_heavy(buf, width, height, stride, dpi); break; - case 0x2512: draw_box_drawings_down_heavy_and_left_light(buf, width, height, stride, dpi); break; - case 0x2513: draw_box_drawings_heavy_down_and_left(buf, width, height, stride, dpi); break; - case 0x2514: draw_box_drawings_light_up_and_right(buf, width, height, stride, dpi); break; - case 0x2515: draw_box_drawings_up_light_and_right_heavy(buf, width, height, stride, dpi); break; - case 0x2516: draw_box_drawings_up_heavy_and_right_light(buf, width, height, stride, dpi); break; - case 0x2517: draw_box_drawings_heavy_up_and_right(buf, width, height, stride, dpi); break; - case 0x2518: draw_box_drawings_light_up_and_left(buf, width, height, stride, dpi); break; - case 0x2519: draw_box_drawings_up_light_and_left_heavy(buf, width, height, stride, dpi); break; - case 0x251a: draw_box_drawings_up_heavy_and_left_light(buf, width, height, stride, dpi); break; - case 0x251b: draw_box_drawings_heavy_up_and_left(buf, width, height, stride, dpi); break; - case 0x251c: draw_box_drawings_light_vertical_and_right(buf, width, height, stride, dpi); break; - case 0x251d: draw_box_drawings_vertical_light_and_right_heavy(buf, width, height, stride, dpi); break; - case 0x251e: draw_box_drawings_up_heavy_and_right_down_light(buf, width, height, stride, dpi); break; - case 0x251f: draw_box_drawings_down_heavy_and_right_up_light(buf, width, height, stride, dpi); break; + case 0x2510: draw_box_drawings_light_down_and_left(buf); break; + case 0x2511: draw_box_drawings_down_light_and_left_heavy(buf); break; + case 0x2512: draw_box_drawings_down_heavy_and_left_light(buf); break; + case 0x2513: draw_box_drawings_heavy_down_and_left(buf); break; + case 0x2514: draw_box_drawings_light_up_and_right(buf); break; + case 0x2515: draw_box_drawings_up_light_and_right_heavy(buf); break; + case 0x2516: draw_box_drawings_up_heavy_and_right_light(buf); break; + case 0x2517: draw_box_drawings_heavy_up_and_right(buf); break; + case 0x2518: draw_box_drawings_light_up_and_left(buf); break; + case 0x2519: draw_box_drawings_up_light_and_left_heavy(buf); break; + case 0x251a: draw_box_drawings_up_heavy_and_left_light(buf); break; + case 0x251b: draw_box_drawings_heavy_up_and_left(buf); break; + case 0x251c: draw_box_drawings_light_vertical_and_right(buf); break; + case 0x251d: draw_box_drawings_vertical_light_and_right_heavy(buf); break; + case 0x251e: draw_box_drawings_up_heavy_and_right_down_light(buf); break; + case 0x251f: draw_box_drawings_down_heavy_and_right_up_light(buf); break; - case 0x2520: draw_box_drawings_vertical_heavy_and_right_light(buf, width, height, stride, dpi); break; - case 0x2521: draw_box_drawings_down_light_and_right_up_heavy(buf, width, height, stride, dpi); break; - case 0x2522: draw_box_drawings_up_light_and_right_down_heavy(buf, width, height, stride, dpi); break; - case 0x2523: draw_box_drawings_heavy_vertical_and_right(buf, width, height, stride, dpi); break; - case 0x2524: draw_box_drawings_light_vertical_and_left(buf, width, height, stride, dpi); break; - case 0x2525: draw_box_drawings_vertical_light_and_left_heavy(buf, width, height, stride, dpi); break; - case 0x2526: draw_box_drawings_up_heavy_and_left_down_light(buf, width, height, stride, dpi); break; - case 0x2527: draw_box_drawings_down_heavy_and_left_up_light(buf, width, height, stride, dpi); break; - case 0x2528: draw_box_drawings_vertical_heavy_and_left_light(buf, width, height, stride, dpi); break; - case 0x2529: draw_box_drawings_down_light_and_left_up_heavy(buf, width, height, stride, dpi); break; - case 0x252a: draw_box_drawings_up_light_and_left_down_heavy(buf, width, height, stride, dpi); break; - case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf, width, height, stride, dpi); break; - case 0x252c: draw_box_drawings_light_down_and_horizontal(buf, width, height, stride, dpi); break; - case 0x252d: draw_box_drawings_left_heavy_and_right_down_light(buf, width, height, stride, dpi); break; - case 0x252e: draw_box_drawings_right_heavy_and_left_down_light(buf, width, height, stride, dpi); break; - case 0x252f: draw_box_drawings_down_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; + case 0x2520: draw_box_drawings_vertical_heavy_and_right_light(buf); break; + case 0x2521: draw_box_drawings_down_light_and_right_up_heavy(buf); break; + case 0x2522: draw_box_drawings_up_light_and_right_down_heavy(buf); break; + case 0x2523: draw_box_drawings_heavy_vertical_and_right(buf); break; + case 0x2524: draw_box_drawings_light_vertical_and_left(buf); break; + case 0x2525: draw_box_drawings_vertical_light_and_left_heavy(buf); break; + case 0x2526: draw_box_drawings_up_heavy_and_left_down_light(buf); break; + case 0x2527: draw_box_drawings_down_heavy_and_left_up_light(buf); break; + case 0x2528: draw_box_drawings_vertical_heavy_and_left_light(buf); break; + case 0x2529: draw_box_drawings_down_light_and_left_up_heavy(buf); break; + case 0x252a: draw_box_drawings_up_light_and_left_down_heavy(buf); break; + case 0x252b: draw_box_drawings_heavy_vertical_and_left(buf); break; + case 0x252c: draw_box_drawings_light_down_and_horizontal(buf); break; + case 0x252d: draw_box_drawings_left_heavy_and_right_down_light(buf); break; + case 0x252e: draw_box_drawings_right_heavy_and_left_down_light(buf); break; + case 0x252f: draw_box_drawings_down_light_and_horizontal_heavy(buf); break; - case 0x2530: draw_box_drawings_down_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; - case 0x2531: draw_box_drawings_right_light_and_left_down_heavy(buf, width, height, stride, dpi); break; - case 0x2532: draw_box_drawings_left_light_and_right_down_heavy(buf, width, height, stride, dpi); break; - case 0x2533: draw_box_drawings_heavy_down_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2534: draw_box_drawings_light_up_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2535: draw_box_drawings_left_heavy_and_right_up_light(buf, width, height, stride, dpi); break; - case 0x2536: draw_box_drawings_right_heavy_and_left_up_light(buf, width, height, stride, dpi); break; - case 0x2537: draw_box_drawings_up_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; - case 0x2538: draw_box_drawings_up_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; - case 0x2539: draw_box_drawings_right_light_and_left_up_heavy(buf, width, height, stride, dpi); break; - case 0x253a: draw_box_drawings_left_light_and_right_up_heavy(buf, width, height, stride, dpi); break; - case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf, width, height, stride, dpi); break; - case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x253d: draw_box_drawings_left_heavy_and_right_vertical_light(buf, width, height, stride, dpi); break; - case 0x253e: draw_box_drawings_right_heavy_and_left_vertical_light(buf, width, height, stride, dpi); break; - case 0x253f: draw_box_drawings_vertical_light_and_horizontal_heavy(buf, width, height, stride, dpi); break; + case 0x2530: draw_box_drawings_down_heavy_and_horizontal_light(buf); break; + case 0x2531: draw_box_drawings_right_light_and_left_down_heavy(buf); break; + case 0x2532: draw_box_drawings_left_light_and_right_down_heavy(buf); break; + case 0x2533: draw_box_drawings_heavy_down_and_horizontal(buf); break; + case 0x2534: draw_box_drawings_light_up_and_horizontal(buf); break; + case 0x2535: draw_box_drawings_left_heavy_and_right_up_light(buf); break; + case 0x2536: draw_box_drawings_right_heavy_and_left_up_light(buf); break; + case 0x2537: draw_box_drawings_up_light_and_horizontal_heavy(buf); break; + case 0x2538: draw_box_drawings_up_heavy_and_horizontal_light(buf); break; + case 0x2539: draw_box_drawings_right_light_and_left_up_heavy(buf); break; + case 0x253a: draw_box_drawings_left_light_and_right_up_heavy(buf); break; + case 0x253b: draw_box_drawings_heavy_up_and_horizontal(buf); break; + case 0x253c: draw_box_drawings_light_vertical_and_horizontal(buf); break; + case 0x253d: draw_box_drawings_left_heavy_and_right_vertical_light(buf); break; + case 0x253e: draw_box_drawings_right_heavy_and_left_vertical_light(buf); break; + case 0x253f: draw_box_drawings_vertical_light_and_horizontal_heavy(buf); break; - case 0x2540: draw_box_drawings_up_heavy_and_down_horizontal_light(buf, width, height, stride, dpi); break; - case 0x2541: draw_box_drawings_down_heavy_and_up_horizontal_light(buf, width, height, stride, dpi); break; - case 0x2542: draw_box_drawings_vertical_heavy_and_horizontal_light(buf, width, height, stride, dpi); break; - case 0x2543: draw_box_drawings_left_up_heavy_and_right_down_light(buf, width, height, stride, dpi); break; - case 0x2544: draw_box_drawings_right_up_heavy_and_left_down_light(buf, width, height, stride, dpi); break; - case 0x2545: draw_box_drawings_left_down_heavy_and_right_up_light(buf, width, height, stride, dpi); break; - case 0x2546: draw_box_drawings_right_down_heavy_and_left_up_light(buf, width, height, stride, dpi); break; - case 0x2547: draw_box_drawings_down_light_and_up_horizontal_heavy(buf, width, height, stride, dpi); break; - case 0x2548: draw_box_drawings_up_light_and_down_horizontal_heavy(buf, width, height, stride, dpi); break; - case 0x2549: draw_box_drawings_right_light_and_left_vertical_heavy(buf, width, height, stride, dpi); break; - case 0x254a: draw_box_drawings_left_light_and_right_vertical_heavy(buf, width, height, stride, dpi); break; - case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x254c: draw_box_drawings_light_double_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x254d: draw_box_drawings_heavy_double_dash_horizontal(buf, width, height, stride, dpi); break; - case 0x254e: draw_box_drawings_light_double_dash_vertical(buf, width, height, stride, dpi); break; - case 0x254f: draw_box_drawings_heavy_double_dash_vertical(buf, width, height, stride, dpi); break; + case 0x2540: draw_box_drawings_up_heavy_and_down_horizontal_light(buf); break; + case 0x2541: draw_box_drawings_down_heavy_and_up_horizontal_light(buf); break; + case 0x2542: draw_box_drawings_vertical_heavy_and_horizontal_light(buf); break; + case 0x2543: draw_box_drawings_left_up_heavy_and_right_down_light(buf); break; + case 0x2544: draw_box_drawings_right_up_heavy_and_left_down_light(buf); break; + case 0x2545: draw_box_drawings_left_down_heavy_and_right_up_light(buf); break; + case 0x2546: draw_box_drawings_right_down_heavy_and_left_up_light(buf); break; + case 0x2547: draw_box_drawings_down_light_and_up_horizontal_heavy(buf); break; + case 0x2548: draw_box_drawings_up_light_and_down_horizontal_heavy(buf); break; + case 0x2549: draw_box_drawings_right_light_and_left_vertical_heavy(buf); break; + case 0x254a: draw_box_drawings_left_light_and_right_vertical_heavy(buf); break; + case 0x254b: draw_box_drawings_heavy_vertical_and_horizontal(buf); break; + case 0x254c: draw_box_drawings_light_double_dash_horizontal(buf); break; + case 0x254d: draw_box_drawings_heavy_double_dash_horizontal(buf); break; + case 0x254e: draw_box_drawings_light_double_dash_vertical(buf); break; + case 0x254f: draw_box_drawings_heavy_double_dash_vertical(buf); break; - case 0x2550: draw_box_drawings_double_horizontal(buf, width, height, stride, dpi); break; - case 0x2551: draw_box_drawings_double_vertical(buf, width, height, stride, dpi); break; - case 0x2552: draw_box_drawings_down_single_and_right_double(buf, width, height, stride, dpi); break; - case 0x2553: draw_box_drawings_down_double_and_right_single(buf, width, height, stride, dpi); break; - case 0x2554: draw_box_drawings_double_down_and_right(buf, width, height, stride, dpi); break; - case 0x2555: draw_box_drawings_down_single_and_left_double(buf, width, height, stride, dpi); break; - case 0x2556: draw_box_drawings_down_double_and_left_single(buf, width, height, stride, dpi); break; - case 0x2557: draw_box_drawings_double_down_and_left(buf, width, height, stride, dpi); break; - case 0x2558: draw_box_drawings_up_single_and_right_double(buf, width, height, stride, dpi); break; - case 0x2559: draw_box_drawings_up_double_and_right_single(buf, width, height, stride, dpi); break; - case 0x255a: draw_box_drawings_double_up_and_right(buf, width, height, stride, dpi); break; - case 0x255b: draw_box_drawings_up_single_and_left_double(buf, width, height, stride, dpi); break; - case 0x255c: draw_box_drawings_up_double_and_left_single(buf, width, height, stride, dpi); break; - case 0x255d: draw_box_drawings_double_up_and_left(buf, width, height, stride, dpi); break; - case 0x255e: draw_box_drawings_vertical_single_and_right_double(buf, width, height, stride, dpi); break; - case 0x255f: draw_box_drawings_vertical_double_and_right_single(buf, width, height, stride, dpi); break; + case 0x2550: draw_box_drawings_double_horizontal(buf); break; + case 0x2551: draw_box_drawings_double_vertical(buf); break; + case 0x2552: draw_box_drawings_down_single_and_right_double(buf); break; + case 0x2553: draw_box_drawings_down_double_and_right_single(buf); break; + case 0x2554: draw_box_drawings_double_down_and_right(buf); break; + case 0x2555: draw_box_drawings_down_single_and_left_double(buf); break; + case 0x2556: draw_box_drawings_down_double_and_left_single(buf); break; + case 0x2557: draw_box_drawings_double_down_and_left(buf); break; + case 0x2558: draw_box_drawings_up_single_and_right_double(buf); break; + case 0x2559: draw_box_drawings_up_double_and_right_single(buf); break; + case 0x255a: draw_box_drawings_double_up_and_right(buf); break; + case 0x255b: draw_box_drawings_up_single_and_left_double(buf); break; + case 0x255c: draw_box_drawings_up_double_and_left_single(buf); break; + case 0x255d: draw_box_drawings_double_up_and_left(buf); break; + case 0x255e: draw_box_drawings_vertical_single_and_right_double(buf); break; + case 0x255f: draw_box_drawings_vertical_double_and_right_single(buf); break; - case 0x2560: draw_box_drawings_double_vertical_and_right(buf, width, height, stride, dpi); break; - case 0x2561: draw_box_drawings_vertical_single_and_left_double(buf, width, height, stride, dpi); break; - case 0x2562: draw_box_drawings_vertical_double_and_left_single(buf, width, height, stride, dpi); break; - case 0x2563: draw_box_drawings_double_vertical_and_left(buf, width, height, stride, dpi); break; - case 0x2564: draw_box_drawings_down_single_and_horizontal_double(buf, width, height, stride, dpi); break; - case 0x2565: draw_box_drawings_down_double_and_horizontal_single(buf, width, height, stride, dpi); break; - case 0x2566: draw_box_drawings_double_down_and_horizontal(buf, width, height, stride, dpi); break; - case 0x2567: draw_box_drawings_up_single_and_horizontal_double(buf, width, height, stride, dpi); break; - case 0x2568: draw_box_drawings_up_double_and_horizontal_single(buf, width, height, stride, dpi); break; - case 0x2569: draw_box_drawings_double_up_and_horizontal(buf, width, height, stride, dpi); break; - case 0x256a: draw_box_drawings_vertical_single_and_horizontal_double(buf, width, height, stride, dpi); break; - case 0x256b: draw_box_drawings_vertical_double_and_horizontal_single(buf, width, height, stride, dpi); break; - case 0x256c: draw_box_drawings_double_vertical_and_horizontal(buf, width, height, stride, dpi); break; - case 0x256d ... 0x2570: draw_box_drawings_light_arc(wc, buf, width, height, stride, dpi); break; + case 0x2560: draw_box_drawings_double_vertical_and_right(buf); break; + case 0x2561: draw_box_drawings_vertical_single_and_left_double(buf); break; + case 0x2562: draw_box_drawings_vertical_double_and_left_single(buf); break; + case 0x2563: draw_box_drawings_double_vertical_and_left(buf); break; + case 0x2564: draw_box_drawings_down_single_and_horizontal_double(buf); break; + case 0x2565: draw_box_drawings_down_double_and_horizontal_single(buf); break; + case 0x2566: draw_box_drawings_double_down_and_horizontal(buf); break; + case 0x2567: draw_box_drawings_up_single_and_horizontal_double(buf); break; + case 0x2568: draw_box_drawings_up_double_and_horizontal_single(buf); break; + case 0x2569: draw_box_drawings_double_up_and_horizontal(buf); break; + case 0x256a: draw_box_drawings_vertical_single_and_horizontal_double(buf); break; + case 0x256b: draw_box_drawings_vertical_double_and_horizontal_single(buf); break; + case 0x256c: draw_box_drawings_double_vertical_and_horizontal(buf); break; + case 0x256d ... 0x2570: draw_box_drawings_light_arc(wc, buf); break; - case 0x2571: draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf, width, height, stride, dpi); break; - case 0x2572: draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf, width, height, stride, dpi); break; - case 0x2573: draw_box_drawings_light_diagonal_cross(buf, width, height, stride, dpi); break; - case 0x2574: draw_box_drawings_light_left(buf, width, height, stride, dpi); break; - case 0x2575: draw_box_drawings_light_up(buf, width, height, stride, dpi); break; - case 0x2576: draw_box_drawings_light_right(buf, width, height, stride, dpi); break; - case 0x2577: draw_box_drawings_light_down(buf, width, height, stride, dpi); break; - case 0x2578: draw_box_drawings_heavy_left(buf, width, height, stride, dpi); break; - case 0x2579: draw_box_drawings_heavy_up(buf, width, height, stride, dpi); break; - case 0x257a: draw_box_drawings_heavy_right(buf, width, height, stride, dpi); break; - case 0x257b: draw_box_drawings_heavy_down(buf, width, height, stride, dpi); break; - case 0x257c: draw_box_drawings_light_left_and_heavy_right(buf, width, height, stride, dpi); break; - case 0x257d: draw_box_drawings_light_up_and_heavy_down(buf, width, height, stride, dpi); break; - case 0x257e: draw_box_drawings_heavy_left_and_light_right(buf, width, height, stride, dpi); break; - case 0x257f: draw_box_drawings_heavy_up_and_light_down(buf, width, height, stride, dpi); break; + case 0x2571: draw_box_drawings_light_diagonal_upper_right_to_lower_left(buf); break; + case 0x2572: draw_box_drawings_light_diagonal_upper_left_to_lower_right(buf); break; + case 0x2573: draw_box_drawings_light_diagonal_cross(buf); break; + case 0x2574: draw_box_drawings_light_left(buf); break; + case 0x2575: draw_box_drawings_light_up(buf); break; + case 0x2576: draw_box_drawings_light_right(buf); break; + case 0x2577: draw_box_drawings_light_down(buf); break; + case 0x2578: draw_box_drawings_heavy_left(buf); break; + case 0x2579: draw_box_drawings_heavy_up(buf); break; + case 0x257a: draw_box_drawings_heavy_right(buf); break; + case 0x257b: draw_box_drawings_heavy_down(buf); break; + case 0x257c: draw_box_drawings_light_left_and_heavy_right(buf); break; + case 0x257d: draw_box_drawings_light_up_and_heavy_down(buf); break; + case 0x257e: draw_box_drawings_heavy_left_and_light_right(buf); break; + case 0x257f: draw_box_drawings_heavy_up_and_light_down(buf); break; - case 0x2580: draw_upper_half_block(buf, width, height, stride, dpi); break; - case 0x2581: draw_lower_one_eighth_block(buf, width, height, stride, dpi); break; - case 0x2582: draw_lower_one_quarter_block(buf, width, height, stride, dpi); break; - case 0x2583: draw_lower_three_eighths_block(buf, width, height, stride, dpi); break; - case 0x2584: draw_lower_half_block(buf, width, height, stride, dpi); break; - case 0x2585: draw_lower_five_eighths_block(buf, width, height, stride, dpi); break; - case 0x2586: draw_lower_three_quarters_block(buf, width, height, stride, dpi); break; - case 0x2587: draw_lower_seven_eighths_block(buf, width, height, stride, dpi); break; - case 0x2588: draw_full_block(buf, width, height, stride, dpi); break; - case 0x2589: draw_left_seven_eighths_block(buf, width, height, stride, dpi); break; - case 0x258a: draw_left_three_quarters_block(buf, width, height, stride, dpi); break; - case 0x258b: draw_left_five_eighths_block(buf, width, height, stride, dpi); break; - case 0x258c: draw_left_half_block(buf, width, height, stride, dpi); break; - case 0x258d: draw_left_three_eighths_block(buf, width, height, stride, dpi); break; - case 0x258e: draw_left_one_quarter_block(buf, width, height, stride, dpi); break; - case 0x258f: draw_left_one_eighth_block(buf, width, height, stride, dpi); break; + case 0x2580: draw_upper_half_block(buf); break; + case 0x2581: draw_lower_one_eighth_block(buf); break; + case 0x2582: draw_lower_one_quarter_block(buf); break; + case 0x2583: draw_lower_three_eighths_block(buf); break; + case 0x2584: draw_lower_half_block(buf); break; + case 0x2585: draw_lower_five_eighths_block(buf); break; + case 0x2586: draw_lower_three_quarters_block(buf); break; + case 0x2587: draw_lower_seven_eighths_block(buf); break; + case 0x2588: draw_full_block(buf); break; + case 0x2589: draw_left_seven_eighths_block(buf); break; + case 0x258a: draw_left_three_quarters_block(buf); break; + case 0x258b: draw_left_five_eighths_block(buf); break; + case 0x258c: draw_left_half_block(buf); break; + case 0x258d: draw_left_three_eighths_block(buf); break; + case 0x258e: draw_left_one_quarter_block(buf); break; + case 0x258f: draw_left_one_eighth_block(buf); break; - case 0x2590: draw_right_half_block(buf, width, height, stride, dpi); break; - case 0x2591: draw_light_shade(buf, width, height, stride, dpi); break; - case 0x2592: draw_medium_shade(buf, width, height, stride, dpi); break; - case 0x2593: draw_dark_shade(buf, width, height, stride, dpi); break; - case 0x2594: draw_upper_one_eighth_block(buf, width, height, stride, dpi); break; - case 0x2595: draw_right_one_eighth_block(buf, width, height, stride, dpi); break; - case 0x2596: draw_quadrant_lower_left(buf, width, height, stride, dpi); break; - case 0x2597: draw_quadrant_lower_right(buf, width, height, stride, dpi); break; - case 0x2598: draw_quadrant_upper_left(buf, width, height, stride, dpi); break; - case 0x2599: draw_quadrant_upper_left_and_lower_left_and_lower_right(buf, width, height, stride, dpi); break; - case 0x259a: draw_quadrant_upper_left_and_lower_right(buf, width, height, stride, dpi); break; - case 0x259b: draw_quadrant_upper_left_and_upper_right_and_lower_left(buf, width, height, stride, dpi); break; - case 0x259c: draw_quadrant_upper_left_and_upper_right_and_lower_right(buf, width, height, stride, dpi); break; - 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 0x2590: draw_right_half_block(buf); break; + case 0x2591: draw_light_shade(buf); break; + case 0x2592: draw_medium_shade(buf); break; + case 0x2593: draw_dark_shade(buf); break; + case 0x2594: draw_upper_one_eighth_block(buf); break; + case 0x2595: draw_right_one_eighth_block(buf); break; + case 0x2596: draw_quadrant_lower_left(buf); break; + case 0x2597: draw_quadrant_lower_right(buf); break; + case 0x2598: draw_quadrant_upper_left(buf); break; + case 0x2599: draw_quadrant_upper_left_and_lower_left_and_lower_right(buf); break; + case 0x259a: draw_quadrant_upper_left_and_lower_right(buf); break; + case 0x259b: draw_quadrant_upper_left_and_upper_right_and_lower_left(buf); break; + case 0x259c: draw_quadrant_upper_left_and_upper_right_and_lower_right(buf); break; + case 0x259d: draw_quadrant_upper_right(buf); break; + case 0x259e: draw_quadrant_upper_right_and_lower_left(buf); break; + case 0x259f: draw_quadrant_upper_right_and_lower_left_and_lower_right(buf); break; - case 0x1fb00 ... 0x1fb3b: draw_sextant(wc, buf, width, height, stride, dpi); break; + case 0x1fb00 ... 0x1fb3b: draw_sextant(wc, buf); break; } #if defined(__GNUC__) @@ -2018,7 +2021,14 @@ box_drawing(const struct terminal *term, wchar_t wc) abort(); } - draw_glyph(wc, data, width, height, stride, term->font_dpi); + struct buf buf = { + .data = data, + .width = width, + .height = height, + .stride = stride, + .dpi = term->font_dpi, + }; + draw_glyph(wc, &buf); struct fcft_glyph *glyph = xmalloc(sizeof(*glyph)); *glyph = (struct fcft_glyph){ From f7669c1e2419b6e0152dc928f29683dde5a36ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 21:56:53 +0100 Subject: [PATCH 49/62] box-drawing: quadrants: convert quad_*() macros to functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reduces the size of the foot binary by ~4K; all the quad macros called ceil() and floor() twice per macro, which caused many float -> int -> float conversions in the expanded code. By using functions instead, there’s no expansion - the conversion only happens in one (well, four) places. --- box-drawing.c | 69 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 87da54d6..13bc0eda 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -114,11 +114,6 @@ _rect(struct buf *buf, int x1, int y1, int x2, int y2) #define vline_middle_up(thick) _vline_middle_up(thick, thick) #define vline_middle_down(thick) _vline_middle_down(thick, thick) -#define quad_upper_left() rect(0, 0, ceil(buf->width / 2.), ceil(buf->height / 2.)) -#define quad_upper_right() rect(floor(buf->width / 2.), 0, buf->width, ceil(buf->height / 2.)) -#define quad_lower_left() rect(0, floor(buf->height / 2.), ceil(buf->width / 2.), buf->height) -#define quad_lower_right() rect(floor(buf->width / 2.), floor(buf->height / 2.), buf->width, buf->height) - static void draw_box_drawings_light_horizontal(struct buf *buf) { @@ -1627,74 +1622,98 @@ draw_right_one_eighth_block(struct buf *buf) rect(buf->width - round(buf->width / 8.), 0, buf->width, buf->height); } +static void +quad_upper_left(struct buf *buf) +{ + rect(0, 0, ceil(buf->width / 2.), ceil(buf->height / 2.)); +} + +static void +quad_upper_right(struct buf *buf) +{ + rect(floor(buf->width / 2.), 0, buf->width, ceil(buf->height / 2.)); +} + +static void +quad_lower_left(struct buf *buf) +{ + rect(0, floor(buf->height / 2.), ceil(buf->width / 2.), buf->height); +} + +static void +quad_lower_right(struct buf *buf) +{ + rect(floor(buf->width / 2.), floor(buf->height / 2.), buf->width, buf->height); +} + static void draw_quadrant_lower_left(struct buf *buf) { - quad_lower_left(); + quad_lower_left(buf); } static void draw_quadrant_lower_right(struct buf *buf) { - quad_lower_right(); + quad_lower_right(buf); } static void draw_quadrant_upper_left(struct buf *buf) { - quad_upper_left(); + quad_upper_left(buf); } static void draw_quadrant_upper_left_and_lower_left_and_lower_right(struct buf *buf) { - quad_upper_left(); - quad_lower_left(); - quad_lower_right(); + quad_upper_left(buf); + quad_lower_left(buf); + quad_lower_right(buf); } static void draw_quadrant_upper_left_and_lower_right(struct buf *buf) { - quad_upper_left(); - quad_lower_right(); + quad_upper_left(buf); + quad_lower_right(buf); } static void draw_quadrant_upper_left_and_upper_right_and_lower_left(struct buf *buf) { - quad_upper_left(); - quad_upper_right(); - quad_lower_left(); + quad_upper_left(buf); + quad_upper_right(buf); + quad_lower_left(buf); } static void draw_quadrant_upper_left_and_upper_right_and_lower_right(struct buf *buf) { - quad_upper_left(); - quad_upper_right(); - quad_lower_right(); + quad_upper_left(buf); + quad_upper_right(buf); + quad_lower_right(buf); } static void draw_quadrant_upper_right(struct buf *buf) { - quad_upper_right(); + quad_upper_right(buf); } static void draw_quadrant_upper_right_and_lower_left(struct buf *buf) { - quad_upper_right(); - quad_lower_left(); + quad_upper_right(buf); + quad_lower_left(buf); } static void draw_quadrant_upper_right_and_lower_left_and_lower_right(struct buf *buf) { - quad_upper_right(); - quad_lower_left(); - quad_lower_right(); + quad_upper_right(buf); + quad_lower_left(buf); + quad_lower_right(buf); } #define sextant_upper_left() rect(0, 0, round(buf->width / 2.), round(buf->height / 3.)) From d1993f1f917b342e6bcfa8130aaf06ec48f9b64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 22:01:09 +0100 Subject: [PATCH 50/62] box-drawing: sextants: convert sextant_*() macros to functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While this doesn’t really reduce foot’s size, it is cleaner --- box-drawing.c | 53 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 13bc0eda..e0f64fb6 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1716,12 +1716,41 @@ draw_quadrant_upper_right_and_lower_left_and_lower_right(struct buf *buf) quad_lower_right(buf); } -#define sextant_upper_left() rect(0, 0, round(buf->width / 2.), round(buf->height / 3.)) -#define sextant_middle_left() rect(0, buf->height / 3, round(buf->width / 2.), round(2. * buf->height / 3.)) -#define sextant_lower_left() rect(0, 2 * buf->height / 3, round(buf->width / 2.), buf->height) -#define sextant_upper_right() rect(buf->width / 2, 0, buf->width, round(buf->height / 3.)) -#define sextant_middle_right() rect(buf->width / 2, buf->height / 3, buf->width, round(2. * buf->height / 3.)) -#define sextant_lower_right() rect(buf->width / 2, 2 * buf->height / 3, buf->width, buf->height) +static void +sextant_upper_left(struct buf *buf) +{ + rect(0, 0, round(buf->width / 2.), round(buf->height / 3.)); +} + +static void +sextant_middle_left(struct buf *buf) +{ + rect(0, buf->height / 3, round(buf->width / 2.), round(2. * buf->height / 3.)); +} + +static void +sextant_lower_left(struct buf *buf) +{ + rect(0, 2 * buf->height / 3, round(buf->width / 2.), buf->height); +} + +static void +sextant_upper_right(struct buf *buf) +{ + rect(buf->width / 2, 0, buf->width, round(buf->height / 3.)); +} + +static void +sextant_middle_right(struct buf *buf) +{ + rect(buf->width / 2, buf->height / 3, buf->width, round(2. * buf->height / 3.)); +} + +static void +sextant_lower_right(struct buf *buf) +{ + rect(buf->width / 2, 2 * buf->height / 3, buf->width, buf->height); +} static void draw_sextant(wchar_t wc, struct buf *buf) @@ -1821,22 +1850,22 @@ draw_sextant(wchar_t wc, struct buf *buf) uint8_t encoded = matrix[idx]; if (encoded & UPPER_LEFT) - sextant_upper_left(); + sextant_upper_left(buf); if (encoded & MIDDLE_LEFT) - sextant_middle_left(); + sextant_middle_left(buf); if (encoded & LOWER_LEFT) - sextant_lower_left(); + sextant_lower_left(buf); if (encoded & UPPER_RIGHT) - sextant_upper_right(); + sextant_upper_right(buf); if (encoded & MIDDLE_RIGHT) - sextant_middle_right(); + sextant_middle_right(buf); if (encoded & LOWER_RIGHT) - sextant_lower_right(); + sextant_lower_right(buf); } static void From 068f93d22648c1e344b0e53c7ceaff0f31d3f6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 22:12:40 +0100 Subject: [PATCH 51/62] box-drawing: convert {h,v}line_middle_{left,right,up,down}() macros to functions This greatly reduces the size of the foot binary --- box-drawing.c | 109 ++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 53 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index e0f64fb6..f70b4d96 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -80,39 +80,42 @@ _rect(struct buf *buf, int x1, int y1, int x2, int y2) #define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2) +static void +_hline_middle_left(struct buf *buf, float _vthick, float _hthick) +{ + int vthick = thickness(_vthick); + int hthick = thickness(_hthick); + _hline(buf, 0, (buf->width + vthick) / 2, (buf->height - hthick) / 2, hthick); +} -#define _hline_middle_left(_vthick, _hthick) \ - do { \ - int vthick = thickness(_vthick); \ - int hthick = thickness(_hthick); \ - hline(0, (buf->width + vthick) / 2, (buf->height - hthick) / 2, hthick); \ - } while (0) +static void +_hline_middle_right(struct buf *buf, float _vthick, float _hthick) +{ + int vthick = thickness(_vthick); + int hthick = thickness(_hthick); + hline((buf->width - vthick) / 2, buf->width, (buf->height - hthick) / 2, hthick); +} -#define _hline_middle_right(_vthick, _hthick) \ - do { \ - int vthick = thickness(_vthick); \ - int hthick = thickness(_hthick); \ - hline((buf->width - vthick) / 2, buf->width, (buf->height - hthick) / 2, hthick); \ - } while (0) +static void +_vline_middle_up(struct buf *buf, float _vthick, float _hthick) +{ + int vthick = thickness(_vthick); + int hthick = thickness(_hthick); + vline(0, (buf->height + hthick) / 2, (buf->width - vthick) / 2, vthick); +} -#define _vline_middle_up(_vthick, _hthick) \ - do { \ - int vthick = thickness(_vthick); \ - int hthick = thickness(_hthick); \ - vline(0, (buf->height + hthick) / 2, (buf->width - vthick) / 2, vthick); \ - } while (0) +static void +_vline_middle_down(struct buf *buf, float _vthick, float _hthick) +{ + int vthick = thickness(_vthick); + int hthick = thickness(_hthick); + vline((buf->height - hthick) / 2, buf->height, (buf->width - vthick) / 2, vthick); +} -#define _vline_middle_down(_vthick, _hthick) \ - do { \ - int vthick = thickness(_vthick); \ - int hthick = thickness(_hthick); \ - vline((buf->height - hthick) / 2, buf->height, (buf->width - vthick) / 2, vthick); \ - } while (0) - -#define hline_middle_left(thick) _hline_middle_left(thick, thick) -#define hline_middle_right(thick) _hline_middle_right(thick, thick) -#define vline_middle_up(thick) _vline_middle_up(thick, thick) -#define vline_middle_down(thick) _vline_middle_down(thick, thick) +#define hline_middle_left(thick) _hline_middle_left(buf, thick, thick) +#define hline_middle_right(thick) _hline_middle_right(buf, thick, thick) +#define vline_middle_up(thick) _vline_middle_up(buf, thick, thick) +#define vline_middle_down(thick) _vline_middle_down(buf, thick, thick) static void draw_box_drawings_light_horizontal(struct buf *buf) @@ -318,7 +321,7 @@ draw_box_drawings_light_down_and_right(struct buf *buf) static void draw_box_drawings_down_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -326,7 +329,7 @@ static void draw_box_drawings_down_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void @@ -346,7 +349,7 @@ draw_box_drawings_light_down_and_left(struct buf *buf) static void draw_box_drawings_down_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -354,7 +357,7 @@ static void draw_box_drawings_down_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void @@ -374,7 +377,7 @@ draw_box_drawings_light_up_and_right(struct buf *buf) static void draw_box_drawings_up_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -382,7 +385,7 @@ static void draw_box_drawings_up_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); } static void @@ -402,7 +405,7 @@ draw_box_drawings_light_up_and_left(struct buf *buf) static void draw_box_drawings_up_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -410,7 +413,7 @@ static void draw_box_drawings_up_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); } static void @@ -431,7 +434,7 @@ draw_box_drawings_light_vertical_and_right(struct buf *buf) static void draw_box_drawings_vertical_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); vline_middle_down(LIGHT); } @@ -440,7 +443,7 @@ static void draw_box_drawings_up_heavy_and_right_down_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -449,7 +452,7 @@ draw_box_drawings_down_heavy_and_right_up_light(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void @@ -495,7 +498,7 @@ draw_box_drawings_light_vertical_and_left(struct buf *buf) static void draw_box_drawings_vertical_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); vline_middle_down(LIGHT); } @@ -504,7 +507,7 @@ static void draw_box_drawings_up_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -513,7 +516,7 @@ draw_box_drawings_down_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void @@ -559,7 +562,7 @@ draw_box_drawings_light_down_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_down_light(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle_down(LIGHT); } @@ -568,7 +571,7 @@ static void draw_box_drawings_right_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -585,7 +588,7 @@ draw_box_drawings_down_heavy_and_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void @@ -623,7 +626,7 @@ draw_box_drawings_light_up_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_up_light(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle_up(LIGHT); } @@ -632,7 +635,7 @@ static void draw_box_drawings_right_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -649,7 +652,7 @@ draw_box_drawings_up_heavy_and_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); } static void @@ -688,7 +691,7 @@ draw_box_drawings_light_vertical_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_vertical_light(struct buf *buf) { - _hline_middle_left(LIGHT, HEAVY); + _hline_middle_left(buf, LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle_up(LIGHT); vline_middle_down(LIGHT); @@ -698,7 +701,7 @@ static void draw_box_drawings_right_heavy_and_left_vertical_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(LIGHT, HEAVY); + _hline_middle_right(buf, LIGHT, HEAVY); vline_middle_up(LIGHT); vline_middle_down(LIGHT); } @@ -717,7 +720,7 @@ draw_box_drawings_up_heavy_and_down_horizontal_light(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(LIGHT); - _vline_middle_up(HEAVY, LIGHT); + _vline_middle_up(buf, HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -727,7 +730,7 @@ draw_box_drawings_down_heavy_and_up_horizontal_light(struct buf *buf) hline_middle_left(LIGHT); hline_middle_right(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(HEAVY, LIGHT); + _vline_middle_down(buf, HEAVY, LIGHT); } static void From fc79dbb5a3b98d9946db5882668c57dda97c4d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 22:24:52 +0100 Subject: [PATCH 52/62] box-drawing: dedicated functions to draw a full horizontal/vertical line --- box-drawing.c | 148 ++++++++++++++++++++------------------------------ 1 file changed, 60 insertions(+), 88 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index f70b4d96..64157de7 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -80,6 +80,13 @@ _rect(struct buf *buf, int x1, int y1, int x2, int y2) #define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2) +static void +_hline_middle(struct buf *buf, float _thick) +{ + int thick = thickness(_thick); + hline(0, buf->width, (buf->height - thick) / 2, thick); +} + static void _hline_middle_left(struct buf *buf, float _vthick, float _hthick) { @@ -96,6 +103,13 @@ _hline_middle_right(struct buf *buf, float _vthick, float _hthick) hline((buf->width - vthick) / 2, buf->width, (buf->height - hthick) / 2, hthick); } +static void +_vline_middle(struct buf *buf, float _thick) +{ + int thick = thickness(_thick); + vline(0, buf->height, (buf->width - thick) / 2, thick); +} + static void _vline_middle_up(struct buf *buf, float _vthick, float _hthick) { @@ -112,37 +126,35 @@ _vline_middle_down(struct buf *buf, float _vthick, float _hthick) vline((buf->height - hthick) / 2, buf->height, (buf->width - vthick) / 2, vthick); } +#define hline_middle(thick) _hline_middle(buf, thick) #define hline_middle_left(thick) _hline_middle_left(buf, thick, thick) #define hline_middle_right(thick) _hline_middle_right(buf, thick, thick) +#define vline_middle(thick) _vline_middle(buf, thick) #define vline_middle_up(thick) _vline_middle_up(buf, thick, thick) #define vline_middle_down(thick) _vline_middle_down(buf, thick, thick) static void draw_box_drawings_light_horizontal(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); } static void draw_box_drawings_heavy_horizontal(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); } static void draw_box_drawings_light_vertical(struct buf *buf) { - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void draw_box_drawings_heavy_vertical(struct buf *buf) { - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void @@ -161,8 +173,7 @@ draw_box_drawings_dash_horizontal(struct buf *buf, int count, int thick, int gap } if (dash_width <= 0) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); return; } @@ -220,8 +231,7 @@ draw_box_drawings_dash_vertical(struct buf *buf, int count, int thick, int gap) } if (dash_height <= 0) { - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); return; } @@ -427,16 +437,14 @@ static void draw_box_drawings_light_vertical_and_right(struct buf *buf) { hline_middle_right(LIGHT); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void draw_box_drawings_vertical_light_and_right_heavy(struct buf *buf) { _hline_middle_right(buf, LIGHT, HEAVY); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void @@ -459,8 +467,7 @@ static void draw_box_drawings_vertical_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void @@ -483,24 +490,21 @@ static void draw_box_drawings_heavy_vertical_and_right(struct buf *buf) { hline_middle_right(HEAVY); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void draw_box_drawings_light_vertical_and_left(struct buf *buf) { hline_middle_left(LIGHT); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void draw_box_drawings_vertical_light_and_left_heavy(struct buf *buf) { _hline_middle_left(buf, LIGHT, HEAVY); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void @@ -523,8 +527,7 @@ static void draw_box_drawings_vertical_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void @@ -547,15 +550,13 @@ static void draw_box_drawings_heavy_vertical_and_left(struct buf *buf) { hline_middle_left(HEAVY); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void draw_box_drawings_light_down_and_horizontal(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline_middle_down(LIGHT); } @@ -578,16 +579,14 @@ draw_box_drawings_right_heavy_and_left_down_light(struct buf *buf) static void draw_box_drawings_down_light_and_horizontal_heavy(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_down(LIGHT); } static void draw_box_drawings_down_heavy_and_horizontal_light(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); _vline_middle_down(buf, HEAVY, LIGHT); } @@ -610,16 +609,14 @@ draw_box_drawings_left_light_and_right_down_heavy(struct buf *buf) static void draw_box_drawings_heavy_down_and_horizontal(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_down(HEAVY); } static void draw_box_drawings_light_up_and_horizontal(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline_middle_up(LIGHT); } @@ -642,16 +639,14 @@ draw_box_drawings_right_heavy_and_left_up_light(struct buf *buf) static void draw_box_drawings_up_light_and_horizontal_heavy(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_up(LIGHT); } static void draw_box_drawings_up_heavy_and_horizontal_light(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); _vline_middle_up(buf, HEAVY, LIGHT); } @@ -674,18 +669,15 @@ draw_box_drawings_left_light_and_right_up_heavy(struct buf *buf) static void draw_box_drawings_heavy_up_and_horizontal(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_up(HEAVY); } static void draw_box_drawings_light_vertical_and_horizontal(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + hline_middle(LIGHT); + vline_middle(LIGHT); } static void @@ -693,8 +685,7 @@ draw_box_drawings_left_heavy_and_right_vertical_light(struct buf *buf) { _hline_middle_left(buf, LIGHT, HEAVY); hline_middle_right(LIGHT); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void @@ -702,24 +693,20 @@ draw_box_drawings_right_heavy_and_left_vertical_light(struct buf *buf) { hline_middle_left(LIGHT); _hline_middle_right(buf, LIGHT, HEAVY); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); } static void draw_box_drawings_vertical_light_and_horizontal_heavy(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + hline_middle(HEAVY); + vline_middle(LIGHT); } static void draw_box_drawings_up_heavy_and_down_horizontal_light(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); _vline_middle_up(buf, HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -727,8 +714,7 @@ draw_box_drawings_up_heavy_and_down_horizontal_light(struct buf *buf) static void draw_box_drawings_down_heavy_and_up_horizontal_light(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline_middle_up(LIGHT); _vline_middle_down(buf, HEAVY, LIGHT); } @@ -736,10 +722,8 @@ draw_box_drawings_down_heavy_and_up_horizontal_light(struct buf *buf) static void draw_box_drawings_vertical_heavy_and_horizontal_light(struct buf *buf) { - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + hline_middle(LIGHT); + vline_middle(HEAVY); } static void @@ -781,8 +765,7 @@ draw_box_drawings_right_down_heavy_and_left_up_light(struct buf *buf) static void draw_box_drawings_down_light_and_up_horizontal_heavy(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_up(HEAVY); vline_middle_down(LIGHT); } @@ -790,8 +773,7 @@ draw_box_drawings_down_light_and_up_horizontal_heavy(struct buf *buf) static void draw_box_drawings_up_light_and_down_horizontal_heavy(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); + hline_middle(HEAVY); vline_middle_up(LIGHT); vline_middle_down(HEAVY); } @@ -801,8 +783,7 @@ draw_box_drawings_right_light_and_left_vertical_heavy(struct buf *buf) { hline_middle_left(HEAVY); hline_middle_right(LIGHT); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void @@ -810,17 +791,14 @@ draw_box_drawings_left_light_and_right_vertical_heavy(struct buf *buf) { hline_middle_left(LIGHT); hline_middle_right(HEAVY); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + vline_middle(HEAVY); } static void draw_box_drawings_heavy_vertical_and_horizontal(struct buf *buf) { - hline_middle_left(HEAVY); - hline_middle_right(HEAVY); - vline_middle_up(HEAVY); - vline_middle_down(HEAVY); + hline_middle(HEAVY); + vline_middle(HEAVY); } static void @@ -1034,8 +1012,7 @@ draw_box_drawings_vertical_single_and_right_double(struct buf *buf) int hmid = (buf->height - thick * 3) / 2; int vmid = (buf->width - thick) / 2; - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); hline(vmid, buf->width, hmid, thick); hline(vmid, buf->width, hmid + 2 * thick, thick); @@ -1075,8 +1052,7 @@ draw_box_drawings_vertical_single_and_left_double(struct buf *buf) int hmid = (buf->height - thick * 3) / 2; int vmid = (buf->width + thick) / 2; - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); hline(0, vmid, hmid, thick); hline(0, vmid, hmid + 2 * thick, thick); @@ -1128,8 +1104,7 @@ draw_box_drawings_down_double_and_horizontal_single(struct buf *buf) int hmid = (buf->height - thick) / 2; int vmid = (buf->width - thick * 3) / 2; - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline(hmid, buf->height, vmid, thick); vline(hmid, buf->height, vmid + 2 * thick, thick); @@ -1170,8 +1145,7 @@ draw_box_drawings_up_double_and_horizontal_single(struct buf *buf) int hmid = (buf->height - thick) / 2; int vmid = (buf->width - thick * 3) / 2; - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline(0, hmid, vmid, thick); vline(0, hmid, vmid + 2 * thick, thick); @@ -1198,8 +1172,7 @@ draw_box_drawings_vertical_single_and_horizontal_double(struct buf *buf) int thick = thickness(LIGHT); int hmid = (buf->height - thick * 3) / 2; - vline_middle_up(LIGHT); - vline_middle_down(LIGHT); + vline_middle(LIGHT); hline(0, buf->width, hmid, thick); hline(0, buf->width, hmid + 2 * thick, thick); @@ -1211,8 +1184,7 @@ draw_box_drawings_vertical_double_and_horizontal_single(struct buf *buf) int thick = thickness(LIGHT); int vmid = (buf->width - thick * 3) / 2; - hline_middle_left(LIGHT); - hline_middle_right(LIGHT); + hline_middle(LIGHT); vline(0, buf->height, vmid, thick); vline(0, buf->height, vmid + 2 * thick, thick); From 7d0fb3cccd2b43c459bdf08a69254e974c361169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 22:29:12 +0100 Subject: [PATCH 53/62] macros: add NOINLINE (__attribute__((noinline))) --- macros.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/macros.h b/macros.h index 4d63404c..d4621bd5 100644 --- a/macros.h +++ b/macros.h @@ -26,6 +26,12 @@ #define UNUSED #endif +#if HAS_ATTRIBUTE(noinline) + #define NOINLINE __attribute__((noinline)) +#else + #define NOINLINE +#endif + #if HAS_ATTRIBUTE(const) #define CONST __attribute__((__const__)) #else From a20c6bd66724b413ef0bc1fa539753af99c5b01e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 22:29:26 +0100 Subject: [PATCH 54/62] box-drawing: do not inline any of the utility functions --- box-drawing.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 64157de7..ebbdfede 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -32,7 +32,7 @@ _thickness(struct buf *buf, float pts) } #define thickness(pts) _thickness(buf, pts) -static void __attribute__((noinline)) +static void NOINLINE _hline(struct buf *buf, int x1, int x2, int y, int thick) { x1 = min(max(x1, 0), buf->width); @@ -49,7 +49,7 @@ _hline(struct buf *buf, int x1, int x2, int y, int thick) #define hline(x1, x2, y, thick) _hline(buf, x1, x2, y, thick) -static void __attribute__((noinline)) +static void NOINLINE _vline(struct buf *buf, int y1, int y2, int x, int thick) { y1 = min(max(y1, 0), buf->height); @@ -66,7 +66,7 @@ _vline(struct buf *buf, int y1, int y2, int x, int thick) #define vline(y1, y2, x, thick) _vline(buf, y1, y2, x, thick) -static void __attribute__((noinline)) +static void NOINLINE _rect(struct buf *buf, int x1, int y1, int x2, int y2) { for (size_t row = max(y1, 0); row < min(y2, buf->height); row++) { @@ -80,14 +80,14 @@ _rect(struct buf *buf, int x1, int y1, int x2, int y2) #define rect(x1, y1, x2, y2) _rect(buf, x1, y1, x2, y2) -static void +static void NOINLINE _hline_middle(struct buf *buf, float _thick) { int thick = thickness(_thick); hline(0, buf->width, (buf->height - thick) / 2, thick); } -static void +static void NOINLINE _hline_middle_left(struct buf *buf, float _vthick, float _hthick) { int vthick = thickness(_vthick); @@ -95,7 +95,7 @@ _hline_middle_left(struct buf *buf, float _vthick, float _hthick) _hline(buf, 0, (buf->width + vthick) / 2, (buf->height - hthick) / 2, hthick); } -static void +static void NOINLINE _hline_middle_right(struct buf *buf, float _vthick, float _hthick) { int vthick = thickness(_vthick); @@ -103,14 +103,14 @@ _hline_middle_right(struct buf *buf, float _vthick, float _hthick) hline((buf->width - vthick) / 2, buf->width, (buf->height - hthick) / 2, hthick); } -static void +static void NOINLINE _vline_middle(struct buf *buf, float _thick) { int thick = thickness(_thick); vline(0, buf->height, (buf->width - thick) / 2, thick); } -static void +static void NOINLINE _vline_middle_up(struct buf *buf, float _vthick, float _hthick) { int vthick = thickness(_vthick); @@ -118,7 +118,7 @@ _vline_middle_up(struct buf *buf, float _vthick, float _hthick) vline(0, (buf->height + hthick) / 2, (buf->width - vthick) / 2, vthick); } -static void +static void NOINLINE _vline_middle_down(struct buf *buf, float _vthick, float _hthick) { int vthick = thickness(_vthick); @@ -1597,37 +1597,37 @@ draw_right_one_eighth_block(struct buf *buf) rect(buf->width - round(buf->width / 8.), 0, buf->width, buf->height); } -static void +static void NOINLINE quad_upper_left(struct buf *buf) { rect(0, 0, ceil(buf->width / 2.), ceil(buf->height / 2.)); } -static void +static void NOINLINE quad_upper_right(struct buf *buf) { rect(floor(buf->width / 2.), 0, buf->width, ceil(buf->height / 2.)); } -static void +static void NOINLINE quad_lower_left(struct buf *buf) { rect(0, floor(buf->height / 2.), ceil(buf->width / 2.), buf->height); } -static void +static void NOINLINE quad_lower_right(struct buf *buf) { rect(floor(buf->width / 2.), floor(buf->height / 2.), buf->width, buf->height); } -static void +static void NOINLINE draw_quadrant_lower_left(struct buf *buf) { quad_lower_left(buf); } -static void +static void NOINLINE draw_quadrant_lower_right(struct buf *buf) { quad_lower_right(buf); @@ -1691,37 +1691,37 @@ draw_quadrant_upper_right_and_lower_left_and_lower_right(struct buf *buf) quad_lower_right(buf); } -static void +static void NOINLINE sextant_upper_left(struct buf *buf) { rect(0, 0, round(buf->width / 2.), round(buf->height / 3.)); } -static void +static void NOINLINE sextant_middle_left(struct buf *buf) { rect(0, buf->height / 3, round(buf->width / 2.), round(2. * buf->height / 3.)); } -static void +static void NOINLINE sextant_lower_left(struct buf *buf) { rect(0, 2 * buf->height / 3, round(buf->width / 2.), buf->height); } -static void +static void NOINLINE sextant_upper_right(struct buf *buf) { rect(buf->width / 2, 0, buf->width, round(buf->height / 3.)); } -static void +static void NOINLINE sextant_middle_right(struct buf *buf) { rect(buf->width / 2, buf->height / 3, buf->width, round(2. * buf->height / 3.)); } -static void +static void NOINLINE sextant_lower_right(struct buf *buf) { rect(buf->width / 2, 2 * buf->height / 3, buf->width, buf->height); From 128883fa05336fa16d5918d9308fdc45616d7daf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Fri, 1 Jan 2021 23:35:55 +0100 Subject: [PATCH 55/62] box-drawing: guard GCC pragma with #if defined(__GNUC__) --- box-drawing.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/box-drawing.c b/box-drawing.c index ebbdfede..30baf6ee 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -15,7 +15,9 @@ #define LIGHT 1.0 #define HEAVY 2.0 -#pragma GCC optimize("Os") +#if defined(__GNUC__) + #pragma GCC optimize("Os") +#endif struct buf { uint8_t *data; From 87dcdc2b3b8d4586a5b6ef6f4b5804561b07cc50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 00:52:02 +0100 Subject: [PATCH 56/62] box-drawing: LIGHT ARC: test using a circle equation instead of a bezier curve --- box-drawing.c | 108 ++++++++++++++++---------------------------------- 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 30baf6ee..660b5e2b 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1210,22 +1210,6 @@ draw_box_drawings_double_vertical_and_horizontal(struct buf *buf) vline(hmid + 2 * thick, buf->height, vmid + 2 * thick, thick); } -#define cubic_bezier_x(t) __extension__ \ - ({ \ - double tm1 = 1 - t; \ - double tm1_3 = tm1 * tm1 * tm1; \ - double t_3 = t * t * t; \ - tm1_3 * start_x + 3 * t * tm1 * (tm1 * c1_x + t * c2_x) + t_3 * end_x; \ - }) - -#define cubic_bezier_y(t) __extension__ \ - ({ \ - double tm1 = 1 - t; \ - double tm1_3 = tm1 * tm1 * tm1; \ - double t_3 = t * t * t; \ - tm1_3 * start_y + 3 * t * tm1 * (tm1 * c1_y + t * c2_y) + t_3 * end_y; \ - }) - static void draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) { @@ -1233,74 +1217,52 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) int delta = thick / 2; int extra = thick % 2; + /* x^2 / a^2 + y^2 / b^2 == 1 */ + int hw = (buf->width - thick) / 2; int hh = (buf->height - thick) / 2; - int start_x, start_y, end_x, end_y, c1_x, c1_y, c2_x, c2_y; - if (wc == L'╭') { - start_x = hw; - start_y = 2 * hh; + double a = hw; + double b = hh; - end_x = 2 * hw; - end_y = hh; + double a2 = a * a; + double b2 = b * b; - c1_x = hw; - c1_y = 3 * buf->height / 4; + int num_samples = buf->height * 16; + for (int i = 0; i < num_samples; i++) { + double y = i / 16.; + double x = sqrt(a2 * (1. - y * y / b2)); + int row = round(y); + int col = round(x); - c2_x = hw; - c2_y = hh; - } else if (wc == L'╮') { - start_x = hw; - start_y = 2 * hh; + if (col < 0) + continue; - end_x = 0; - end_y = hh; + switch (wc) { + case L'╭': + row = buf->height - row - 1 - (1 - buf->height % 2); + col = buf->width - col - 1 - (1 - buf->width % 2); + break; - c1_x = hw; - c1_y = 3 * buf->height / 4; + case L'╮': + row = buf->height - row - 1 - (1 - buf->height % 2); + break; - c2_x = hw; - c2_y = hh; - } else if (wc == L'╯') { - start_x = hw; - start_y = 0; + case L'╰': + col = buf->width - col - 1 - (1 - buf->width % 2); + break; + } - end_x = 0; - end_y = hh; + for (int r = row - delta; r < row + delta + extra; r++) { + if (r < 0 || r >= buf->height) + continue; - c1_x = hw; - c1_y = buf->height / 4; - - c2_x = hw; - c2_y = hh; - } else { - assert(wc == L'╰'); - - start_x = hw; - start_y = 0; - - end_x = 2 * hw; - end_y = hh; - - c1_x = hw; - c1_y = buf->height / 4; - - c2_x = hw; - c2_y = hh; - } - - int num_samples = buf->height * 4; - - for (size_t i = 0; i < num_samples + 1; i++) { - double t = (double)i / num_samples; - int p_x = round(cubic_bezier_x(t)); - int p_y = round(cubic_bezier_y(t)); - - for (int y = max(p_y - delta, 0); y < min(p_y + delta + extra, buf->height); y++) { - for (int x = max(p_x - delta, 0); x < min(p_x + delta + extra, buf->width); x++) { - size_t ofs = x / 8; - size_t bit_no = x % 8; - buf->data[y * buf->stride + ofs] |= 1 << bit_no; + for (int c = col - delta; c < col + delta + extra; c++) { + if (c >= 0 && c < buf->width) { + size_t idx = c / 8; + size_t bit_no = c % 8; + buf->data[r * buf->stride + idx] |= 1 << bit_no; + } } } } From d8e40cf5d4d090955a6fe1e624a9b43e0f65bcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 02:26:12 +0100 Subject: [PATCH 57/62] box-drawing: LIGHT ARC: fix alignment of arcs when thickness is > 1px --- box-drawing.c | 87 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 660b5e2b..8b7c35f5 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1214,16 +1214,9 @@ static void draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) { int thick = thickness(LIGHT); - int delta = thick / 2; - int extra = thick % 2; - /* x^2 / a^2 + y^2 / b^2 == 1 */ - - int hw = (buf->width - thick) / 2; - int hh = (buf->height - thick) / 2; - - double a = hw; - double b = hh; + double a = (buf->width - thick) / 2; + double b = (buf->height - thick) / 2; double a2 = a * a; double b2 = b * b; @@ -1232,32 +1225,61 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) for (int i = 0; i < num_samples; i++) { double y = i / 16.; double x = sqrt(a2 * (1. - y * y / b2)); - int row = round(y); - int col = round(x); + + const int row = round(y); + const int col = round(x); if (col < 0) continue; + int row_start = 0; + int row_end = 0; + int col_start = 0; + int col_end = 0; + + /* + * At this point, row/col is only correct for ╯. For the other + * arcs, we need to mirror the arc around either the x-, y- or + * both axis. + */ switch (wc) { case L'╭': - row = buf->height - row - 1 - (1 - buf->height % 2); - col = buf->width - col - 1 - (1 - buf->width % 2); + row_end = buf->height - row - (thick % 2 ? 1 - buf->height % 2 : buf->height % 2); + row_start = row_end - thick; + col_end = buf->width - col - (thick % 2 ? 1 - buf->width % 2 : buf->width % 2); + col_start = col_end - thick; break; case L'╮': - row = buf->height - row - 1 - (1 - buf->height % 2); + row_end = buf->height - row - (thick % 2 ? 1 - buf->height % 2 : buf->height % 2); + row_start = row_end - thick; + col_start = col; + col_end = col_start + thick; break; case L'╰': - col = buf->width - col - 1 - (1 - buf->width % 2); + row_start = row; + row_end = row_start + thick; + col_end = buf->width - col - (thick % 2 ? 1 - buf->width % 2 : buf->width % 2); + col_start = col_end - thick; + break; + + case L'╯': + row_start = row; + row_end = row_start + thick; + col_start = col; + col_end = col_start + thick; break; } - for (int r = row - delta; r < row + delta + extra; r++) { + assert(row_end > row_start); + assert(col_end > col_start); + + for (int r = row_start; r < row_end; r++) { if (r < 0 || r >= buf->height) continue; - for (int c = col - delta; c < col + delta + extra; c++) { + for (int c = col_start; c < col_end; c++) { if (c >= 0 && c < buf->width) { size_t idx = c / 8; size_t bit_no = c % 8; @@ -1267,23 +1289,30 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) } } + /* + * Since a cell may not be completely symmetrical around its y- + * and x-axis, the mirroring done above may result in the last + * col/row of the arc not being filled in. This code ensures they + * are. + */ + if (wc == L'╭' || wc == L'╰') { - for (int x = 2 * hw; x < buf->width; x++) { - for (int y = max(hh - delta, 0); y < min(hh + delta + extra, buf->height); y++) { - size_t ofs = x / 8; - size_t bit_no = x % 8; - buf->data[y * buf->stride + ofs] |= 1 << bit_no; - } + for (int y = 0; y < thick; y++) { + int row = (buf->height - thick) / 2 + y; + int col = buf->width - 1; + size_t ofs = col / 8; + size_t bit_no = col % 8; + buf->data[row * buf->stride + ofs] |= 1 << bit_no; } } if (wc == L'╭' || wc == L'╮') { - for (int y = 2 * hh; y < buf->height; y++) { - for (int x = max(hw - delta, 0); x < min(hw + delta + extra, buf->width); x++) { - size_t ofs = x / 8; - size_t bit_no = x % 8; - buf->data[y * buf->stride + ofs] |= 1 << bit_no; - } + for (int x = 0; x < thick; x++) { + int row = buf->height - 1; + int col = (buf->width - thick) / 2 + x; + size_t ofs = col / 8; + size_t bit_no = col % 8; + buf->data[row * buf->stride + ofs] |= 1 << bit_no; } } } From 66497cfd4d9e6c28d0d5678da51812e76b482da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 12:08:32 +0100 Subject: [PATCH 58/62] box-drawing: LIGHT ARC: use min/max instead of checking range inside loop --- box-drawing.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 8b7c35f5..31e33528 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1275,16 +1275,11 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) assert(row_end > row_start); assert(col_end > col_start); - for (int r = row_start; r < row_end; r++) { - if (r < 0 || r >= buf->height) - continue; - - for (int c = col_start; c < col_end; c++) { - if (c >= 0 && c < buf->width) { - size_t idx = c / 8; - size_t bit_no = c % 8; - buf->data[r * buf->stride + idx] |= 1 << bit_no; - } + for (int r = max(row_start, 0); r < min(row_end, buf->height); r++) { + for (int c = max(col_start, 0); c < min(col_end, buf->width); c++) { + size_t idx = c / 8; + size_t bit_no = c % 8; + buf->data[r * buf->stride + idx] |= 1 << bit_no; } } } From 5a5134e9bd6ec4d32d55616dffad424626fa3384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 12:09:00 +0100 Subject: [PATCH 59/62] box-drawing: LIGHT ARC: simpler way to adjust for asymmetrical arc when mirroring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When mirroring an arc, we need to adjust the mirrored position if the arc’s position in the cell is asymmetrical. This happens when *either* the line is odd sized, *or* the cell is. But not when both are. Thus, we can simply do a ‘thickness % 2 ^ width % 2’ when adjusting the position. Describe this in a comment. --- box-drawing.c | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 31e33528..ba5110ff 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1241,17 +1241,44 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) * At this point, row/col is only correct for ╯. For the other * arcs, we need to mirror the arc around either the x-, y- or * both axis. + * + * When doing so, we need to adjust for assymetrical cell + * dimensions. + * + * The amazing box drawing art below represents the lower part + * of a cell, with the beginning of a vertical line in the + * middle. Each column represents one pixel. + * + * + * Even cell Odd cell + * + * │ │ │ │ + * Even line │ ┆ ┆ │ │ ┆ ┆ │ + * │ ┆ ┆ │ │ ┆ ┆ │ + * └─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ + * + * + * │ │ │ │ + * Odd line │ ┆ ┆ │ │ ┆ ┆ │ + * │ ┆ ┆ │ │ ┆ ┆ │ + * └─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ + * + * As can be seen(?), the resulting line is assymetrical when + * *either* the cell is odd sized, *or* the line is odd + * sized. But not when both are. + * + * Hence the ‘thick % 2 ^ width % 2’ in the expressions below. */ switch (wc) { case L'╭': - row_end = buf->height - row - (thick % 2 ? 1 - buf->height % 2 : buf->height % 2); + row_end = buf->height - row - (thick % 2 ^ buf->height % 2); row_start = row_end - thick; - col_end = buf->width - col - (thick % 2 ? 1 - buf->width % 2 : buf->width % 2); + col_end = buf->width - col - (thick % 2 ^ buf->width % 2); col_start = col_end - thick; break; case L'╮': - row_end = buf->height - row - (thick % 2 ? 1 - buf->height % 2 : buf->height % 2); + row_end = buf->height - row - (thick % 2 ^ buf->height % 2); row_start = row_end - thick; col_start = col; col_end = col_start + thick; @@ -1260,7 +1287,7 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) case L'╰': row_start = row; row_end = row_start + thick; - col_end = buf->width - col - (thick % 2 ? 1 - buf->width % 2 : buf->width % 2); + col_end = buf->width - col - (thick % 2 ^ buf->width % 2); col_start = col_end - thick; break; From e353edaf41f1cd7746f41646dd43654aa291bf9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 12:28:03 +0100 Subject: [PATCH 60/62] box-drawing: add macros for {h,v}line_middle_mixed() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mixed here refers to mixed thickness - the lines thickness doesn’t match the thickness of an abstract, orthogonal line going through the middle of the cell. --- box-drawing.c | 52 +++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index ba5110ff..07729326 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -131,9 +131,13 @@ _vline_middle_down(struct buf *buf, float _vthick, float _hthick) #define hline_middle(thick) _hline_middle(buf, thick) #define hline_middle_left(thick) _hline_middle_left(buf, thick, thick) #define hline_middle_right(thick) _hline_middle_right(buf, thick, thick) +#define hline_middle_left_mixed(vthick, hthick) _hline_middle_left(buf, vthick, hthick) +#define hline_middle_right_mixed(vthick, hthick) _hline_middle_right(buf, vthick, hthick) #define vline_middle(thick) _vline_middle(buf, thick) #define vline_middle_up(thick) _vline_middle_up(buf, thick, thick) #define vline_middle_down(thick) _vline_middle_down(buf, thick, thick) +#define vline_middle_up_mixed(vthick, hthick) _vline_middle_up(buf, vthick, hthick) +#define vline_middle_down_mixed(vthick, hthick) _vline_middle_down(buf, vthick, hthick) static void draw_box_drawings_light_horizontal(struct buf *buf) @@ -333,7 +337,7 @@ draw_box_drawings_light_down_and_right(struct buf *buf) static void draw_box_drawings_down_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -341,7 +345,7 @@ static void draw_box_drawings_down_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void @@ -361,7 +365,7 @@ draw_box_drawings_light_down_and_left(struct buf *buf) static void draw_box_drawings_down_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -369,7 +373,7 @@ static void draw_box_drawings_down_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void @@ -389,7 +393,7 @@ draw_box_drawings_light_up_and_right(struct buf *buf) static void draw_box_drawings_up_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -397,7 +401,7 @@ static void draw_box_drawings_up_heavy_and_right_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); } static void @@ -417,7 +421,7 @@ draw_box_drawings_light_up_and_left(struct buf *buf) static void draw_box_drawings_up_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -425,7 +429,7 @@ static void draw_box_drawings_up_heavy_and_left_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); } static void @@ -445,7 +449,7 @@ draw_box_drawings_light_vertical_and_right(struct buf *buf) static void draw_box_drawings_vertical_light_and_right_heavy(struct buf *buf) { - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle(LIGHT); } @@ -453,7 +457,7 @@ static void draw_box_drawings_up_heavy_and_right_down_light(struct buf *buf) { hline_middle_right(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -462,7 +466,7 @@ draw_box_drawings_down_heavy_and_right_up_light(struct buf *buf) { hline_middle_right(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void @@ -505,7 +509,7 @@ draw_box_drawings_light_vertical_and_left(struct buf *buf) static void draw_box_drawings_vertical_light_and_left_heavy(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); vline_middle(LIGHT); } @@ -513,7 +517,7 @@ static void draw_box_drawings_up_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -522,7 +526,7 @@ draw_box_drawings_down_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void @@ -565,7 +569,7 @@ draw_box_drawings_light_down_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_down_light(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle_down(LIGHT); } @@ -574,7 +578,7 @@ static void draw_box_drawings_right_heavy_and_left_down_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle_down(LIGHT); } @@ -589,7 +593,7 @@ static void draw_box_drawings_down_heavy_and_horizontal_light(struct buf *buf) { hline_middle(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void @@ -625,7 +629,7 @@ draw_box_drawings_light_up_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_up_light(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle_up(LIGHT); } @@ -634,7 +638,7 @@ static void draw_box_drawings_right_heavy_and_left_up_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle_up(LIGHT); } @@ -649,7 +653,7 @@ static void draw_box_drawings_up_heavy_and_horizontal_light(struct buf *buf) { hline_middle(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); } static void @@ -685,7 +689,7 @@ draw_box_drawings_light_vertical_and_horizontal(struct buf *buf) static void draw_box_drawings_left_heavy_and_right_vertical_light(struct buf *buf) { - _hline_middle_left(buf, LIGHT, HEAVY); + hline_middle_left_mixed(LIGHT, HEAVY); hline_middle_right(LIGHT); vline_middle(LIGHT); } @@ -694,7 +698,7 @@ static void draw_box_drawings_right_heavy_and_left_vertical_light(struct buf *buf) { hline_middle_left(LIGHT); - _hline_middle_right(buf, LIGHT, HEAVY); + hline_middle_right_mixed(LIGHT, HEAVY); vline_middle(LIGHT); } @@ -709,7 +713,7 @@ static void draw_box_drawings_up_heavy_and_down_horizontal_light(struct buf *buf) { hline_middle(LIGHT); - _vline_middle_up(buf, HEAVY, LIGHT); + vline_middle_up_mixed(HEAVY, LIGHT); vline_middle_down(LIGHT); } @@ -718,7 +722,7 @@ draw_box_drawings_down_heavy_and_up_horizontal_light(struct buf *buf) { hline_middle(LIGHT); vline_middle_up(LIGHT); - _vline_middle_down(buf, HEAVY, LIGHT); + vline_middle_down_mixed(HEAVY, LIGHT); } static void From c7a611fdf3f0ecf2ebaa2d186d821658c820aabd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 12:35:53 +0100 Subject: [PATCH 61/62] box-drawing: codespell: assymetrical -> asymmetrical --- box-drawing.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 07729326..35ecf1c8 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -1246,7 +1246,7 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) * arcs, we need to mirror the arc around either the x-, y- or * both axis. * - * When doing so, we need to adjust for assymetrical cell + * When doing so, we need to adjust for asymmetrical cell * dimensions. * * The amazing box drawing art below represents the lower part @@ -1267,7 +1267,7 @@ draw_box_drawings_light_arc(wchar_t wc, struct buf *buf) * │ ┆ ┆ │ │ ┆ ┆ │ * └─┴─┴─┴─┘ └─┴─┴─┴─┴─┘ * - * As can be seen(?), the resulting line is assymetrical when + * As can be seen(?), the resulting line is asymmetrical when * *either* the cell is odd sized, *or* the line is odd * sized. But not when both are. * From 0861e8d3778b2d1cc19e99c968abbc72778dcae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Sat, 2 Jan 2021 17:47:47 +0100 Subject: [PATCH 62/62] =?UTF-8?q?box-drawing:=20drop=20=E2=80=98pragma=20G?= =?UTF-8?q?CC=20optimize(=E2=80=9COs=E2=80=9D)=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “The optimize attribute should be used for debugging purposes only. It is not suitable in production code.” Luckily, it seems it really isn’t needed anymore; with all the other size optimizations that has been done since this was introduced, there is no longer any difference with or without this pragma. --- box-drawing.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 35ecf1c8..e655bfdc 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -15,10 +15,6 @@ #define LIGHT 1.0 #define HEAVY 2.0 -#if defined(__GNUC__) - #pragma GCC optimize("Os") -#endif - struct buf { uint8_t *data; int width;