From 36ecd0baede55c46d910b03273dff93a5db181ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Thu, 5 Aug 2021 18:21:06 +0200 Subject: [PATCH] box-drawing: wedges: fix alignment of inverted wedges MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We render the inverted wedges by first rendering a non-inverted triangle, and then inverting it with PIXMAN_OP_OUT. In cases where truncating and round():ing the triangle points have different results, the final, inverted wedge ends up being unaligned with the corresponding sixel(s). This patch fixes that by handling the pre-inverted triangles specifically. I.e. we donโ€™t re-use the same triangle coordinates as the corresponding non-inverted triangle. --- box-drawing.c | 142 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 109 insertions(+), 33 deletions(-) diff --git a/box-drawing.c b/box-drawing.c index 686d5b77..85a2d4be 100644 --- a/box-drawing.c +++ b/box-drawing.c @@ -2151,144 +2151,232 @@ draw_wedge_triangle(struct buf *buf, wchar_t wc) p1_y = 2 * height / 3; p2_y = p3_y = height; break; + case 0x1fb52: /* ๐Ÿญ’ */ + p1_x = p2_x = 0; p3_x = round(width_f / 2.); + p1_y = round(2. * height_f / 3.); p2_y = p3_y = height; + break; + case 0x1fb3d: /* ๐Ÿฌฝ */ p1_x = p2_x = 0; p3_x = width; p1_y = 2 * height / 3; p2_y = p3_y = height; break; + case 0x1fb53: /* ๐Ÿญ“ */ + p1_x = p2_x = 0; p3_x = width; + p1_y = round(2. * height_f / 3.); p2_y = p3_y = height; + break; + case 0x1fb3e: /* ๐Ÿฌพ */ p1_x = p2_x = 0; p3_x = round(width_f / 2.); p1_y = height / 3; p2_y = p3_y = height; break; + case 0x1fb54: /* ๐Ÿญ” */ + p1_x = p2_x = 0; p3_x = round(width_f / 2.); + p1_y = round(height_f / 3.); p2_y = p3_y = height; + break; + case 0x1fb3f: /* ๐Ÿฌฟ */ p1_x = p2_x = 0; p3_x = width; p1_y = height / 3; p2_y = p3_y = height; break; + case 0x1fb55: /* ๐Ÿญ• */ + p1_x = p2_x = 0; p3_x = width; + p1_y = round(height_f / 3.); p2_y = p3_y = height; + break; + case 0x1fb40: /* ๐Ÿญ€ */ + case 0x1fb56: /* ๐Ÿญ– */ p1_x = p2_x = 0; p3_x = round(width_f / 2.); p1_y = 0; p2_y = p3_y = height; break; - case 0x1fb47: /* ๐Ÿญ‡ */ + case 0x1fb47: /* ๐Ÿญ‡ */ p1_x = p2_x = width; p3_x = width / 2; p1_y = 2 * height / 3; p2_y = p3_y = height; break; - case 0x1fb48: /* ๐Ÿญˆ */ + case 0x1fb5d: /* ๐Ÿญ */ + p1_x = p2_x = width; p3_x = width / 2; + p1_y = round(2. * height_f / 3.); p2_y = p3_y = height; + break; + + case 0x1fb48: /* ๐Ÿญˆ */ p1_x = p2_x = width; p3_x = 0; p1_y = 2 * height / 3; p2_y = p3_y = height; break; - case 0x1fb49: /* ๐Ÿญ‰ */ + case 0x1fb5e: /* ๐Ÿญž */ + p1_x = p2_x = width; p3_x = 0; + p1_y = round(2. * height_f / 3.); p2_y = p3_y = height; + break; + + case 0x1fb49: /* ๐Ÿญ‰ */ p1_x = p2_x = width; p3_x = width / 2; p1_y = height / 3; p2_y = p3_y = height; break; - case 0x1fb4a: /* ๐ŸญŠ */ + case 0x1fb5f: /* ๐ŸญŸ */ + p1_x = p2_x = width; p3_x = width / 2; + p1_y = round(height_f / 3.); p2_y = p3_y = height; + break; + + case 0x1fb4a: /* ๐ŸญŠ */ p1_x = p2_x = width; p3_x = 0; p1_y = height / 3; p2_y = p3_y = height; break; - case 0x1fb4b: /* ๐Ÿญ‹ */ + case 0x1fb60: /* ๐Ÿญ  */ + p1_x = p2_x = width; p3_x = 0; + p1_y = round(height_f / 3.); p2_y = p3_y = height; + break; + + case 0x1fb4b: /* ๐Ÿญ‹ */ + case 0x1fb61: /* ๐Ÿญก */ p1_x = p2_x = width; p3_x = width / 2; p1_y = 0; p2_y = p3_y = height; break; - case 0x1fb57: /* ๐Ÿญ— */ + case 0x1fb57: /* ๐Ÿญ— */ p1_x = p2_x = 0; p3_x = round(width_f / 2.); p1_y = p3_y = 0; p2_y = round(height_f / 3.); break; - case 0x1fb58: /* ๐Ÿญ˜ */ + case 0x1fb41: /* ๐Ÿญ */ + p1_x = p2_x = 0; p3_x = round(width_f / 2.); + p1_y = p3_y = 0; p2_y = height / 3; + break; + + case 0x1fb58: /* ๐Ÿญ˜ */ p1_x = p2_x = 0; p3_x = width; p1_y = p3_y = 0; p2_y = round(height_f / 3.); break; - case 0x1fb59: /* ๐Ÿญ™ */ + case 0x1fb42: /* ๐Ÿญ‚ */ + p1_x = p2_x = 0; p3_x = width; + p1_y = p3_y = 0; p2_y = height / 3; + break; + + case 0x1fb59: /* ๐Ÿญ™ */ p1_x = p2_x = 0; p3_x = round(width_f / 2.); p1_y = p3_y = 0; p2_y = round(2. * height_f / 3.); break; - case 0x1fb5a: /* ๐Ÿญš */ + case 0x1fb43: /* ๐Ÿญƒ */ + p1_x = p2_x = 0; p3_x = round(width_f / 2.); + p1_y = p3_y = 0; p2_y = 2 * height / 3; + break; + + case 0x1fb5a: /* ๐Ÿญš */ p1_x = p2_x = 0; p3_x = width; p1_y = p3_y = 0; p2_y = round(2. * height_f / 3.); break; - case 0x1fb5b: /* ๐Ÿญ› */ + case 0x1fb44: /* ๐Ÿญ„ */ + p1_x = p2_x = 0; p3_x = width; + p1_y = p3_y = 0; p2_y = 2 * height / 3; + break; + + case 0x1fb5b: /* ๐Ÿญ› */ + case 0x1fb45: /* ๐Ÿญ… */ p1_x = p2_x = 0; p3_x = round(width_f / 2.); p1_y = p3_y = 0; p2_y = height; break; - case 0x1fb62: /* ๐Ÿญข */ + case 0x1fb62: /* ๐Ÿญข */ p1_x = p2_x = width; p3_x = width / 2; p1_y = p3_y = 0; p2_y = round(height_f / 3.); break; + case 0x1fb4c: /* ๐ŸญŒ */ + p1_x = p2_x = width; p3_x = width / 2; + p1_y = p3_y = 0; p2_y = height / 3; + break; + case 0x1fb63: /* ๐Ÿญฃ */ p1_x = p2_x = width; p3_x = 0; p1_y = p3_y = 0; p2_y = round(height_f / 3.); break; - case 0x1fb64: /* ๐Ÿญค */ + case 0x1fb4d: /* ๐Ÿญ */ + p1_x = p2_x = width; p3_x = 0; + p1_y = p3_y = 0; p2_y = height / 3; + break; + + case 0x1fb64: /* ๐Ÿญค */ p1_x = p2_x = width; p3_x = width / 2; p1_y = p3_y = 0; p2_y = round(2. * height_f / 3.); break; - case 0x1fb65: /* ๐Ÿญฅ */ + case 0x1fb4e: /* ๐ŸญŽ */ + p1_x = p2_x = width; p3_x = width / 2; + p1_y = p3_y = 0; p2_y = 2 * height / 3; + break; + + case 0x1fb65: /* ๐Ÿญฅ */ p1_x = p2_x = width; p3_x = 0; p1_y = p3_y = 0; p2_y = round(2. * height_f / 3.); break; + case 0x1fb4f: /* ๐Ÿญ */ + p1_x = p2_x = width; p3_x = 0; + p1_y = p3_y = 0; p2_y = 2 * height / 3; + break; + case 0x1fb66: /* ๐Ÿญฆ */ + case 0x1fb50: /* ๐Ÿญ */ p1_x = p2_x = width; p3_x = width / 2; p1_y = p3_y = 0; p2_y = height; break; - case 0x1fb46: /* ๐Ÿญ† */ + case 0x1fb46: /* ๐Ÿญ† */ p1_x = 0; p1_y = round(2. * height_f / 3.); p2_x = width; p2_y = height / 3; p3_x = width; p3_y = p1_y; break; - case 0x1fb51: /* ๐Ÿญ‘ */ + case 0x1fb51: /* ๐Ÿญ‘ */ p1_x = 0; p1_y = height / 3; p2_x = 0; p2_y = round(2. * height_f / 3.); p3_x = width; p3_y = p2_y; break; - case 0x1fb5c: /* ๐Ÿญœ */ + case 0x1fb5c: /* ๐Ÿญœ */ p1_x = 0; p1_y = height / 3; p2_x = 0; p2_y = round(2. * height_f / 3.); p3_x = width; p3_y = p1_y; break; - case 0x1fb67: /* ๐Ÿญง */ + case 0x1fb67: /* ๐Ÿญง */ p1_x = 0; p1_y = height / 3; p2_x = width; p2_y = p1_y; p3_x = width; p3_y = round(2. * height_f / 3.); break; - case 0x1fb6c: /* ๐Ÿญฌ */ + case 0x1fb6c: /* ๐Ÿญฌ */ + case 0x1fb68: /* ๐Ÿญจ */ p1_x = 0; p1_y = 0; p2_x = round(width_f / 2.); p2_y = round(height_f / 2.); p3_x = 0; p3_y = height; break; - case 0x1fb6d: /* ๐Ÿญญ */ + case 0x1fb6d: /* ๐Ÿญญ */ + case 0x1fb69: /* ๐Ÿญฉ */ p1_x = 0; p1_y = 0; p2_x = width / 2; p2_y = round(height_f / 2.); p3_x = width; p3_y = 0; break; - case 0x1fb6e: /* ๐Ÿญฎ */ + case 0x1fb6e: /* ๐Ÿญฎ */ + case 0x1fb6a: /* ๐Ÿญช */ p1_x = width; p1_y = 0; p2_x = width / 2; p2_y = round(height_f / 2.); p3_x = width; p3_y = height; break; - case 0x1fb6f: /* ๐Ÿญฏ */ + case 0x1fb6f: /* ๐Ÿญฏ */ + case 0x1fb6b: /* ๐Ÿญซ */ p1_x = 0; p1_y = height; p2_x = width / 2; p2_y = round(height_f / 2.); p3_x = width; p3_y = height; @@ -2314,18 +2402,6 @@ draw_wedge_triangle(struct buf *buf, wchar_t wc) static void draw_wedge_triangle_inverted(struct buf *buf, wchar_t wc) { - IGNORE_WARNING("-Wpedantic"); - - switch (wc) { - case 0x1fb41 ... 0x1fb45: wc = wc - 0x1fb41 + 0x1fb57; break; - case 0x1fb4c ... 0x1fb50: wc = wc - 0x1fb4c + 0x1fb62; break; - case 0x1fb52 ... 0x1fb56: wc = wc - 0x1fb52 + 0x1fb3c; break; - case 0x1fb5d ... 0x1fb61: wc = wc - 0x1fb5d + 0x1fb47; break; - case 0x1fb68 ... 0x1fb6b: wc = wc - 0x1fb68 + 0x1fb6c; break; - } - - UNIGNORE_WARNINGS; - draw_wedge_triangle(buf, wc); pixman_image_t *src = pixman_image_create_solid_fill(&white);