[vte/wip/l2-21235: 5/7] minifont: Implement block octants




commit ee9ff3be2e69ded81b79fbba8f149c143f688367
Author: Christian Persch <chpe src gnome org>
Date:   Thu Apr 7 16:44:09 2022 +0200

    minifont: Implement block octants

 src/minifont.cc | 310 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/minifont.hh |   2 +-
 2 files changed, 311 insertions(+), 1 deletion(-)
---
diff --git a/src/minifont.cc b/src/minifont.cc
index fb106430..24a3616b 100644
--- a/src/minifont.cc
+++ b/src/minifont.cc
@@ -162,6 +162,53 @@ sextant(cairo_t* cr,
         cairo_fill(cr);
 }
 
+inline void
+octant(cairo_t* cr,
+       uint8_t value,
+       int x,
+       int y,
+       int width,
+       int height) noexcept
+{
+        if (width < 2 || height < 4)
+                [[unlikely]] return; // nothing to draw
+
+        auto const width_half = width / 2;
+        auto const height_quarter = height / 4;
+        auto const extra_height = height % 4;
+
+        auto row = [&](uint8_t v,
+                       int y0,
+                       int h) noexcept
+        {
+                if (v & 0b01u)
+                        cairo_rectangle(cr, x, y0, width_half, h);
+                if (v & 0b10u)
+                        cairo_rectangle(cr, x + width_half, y0, width - width_half, h);
+        };
+
+        cairo_set_line_width(cr, 0);
+
+        // If height isn't divisibly by 4, distribute the extra pixels to
+        // the 3rd row first, then the 2nd, then the 4th.
+        // FIXME: make sure this connects correctly with the one-eights
+        // as well as the quarter blocks.
+
+        int const heights[4] = {
+                height_quarter,
+                height_quarter + (extra_height > 2 ? 1 : 0),
+                height_quarter + (extra_height ? 1 : 0),
+                height_quarter + (extra_height > 1 ? 1 : 0)
+        };
+        for (auto i = 0; i < 4; ++i) {
+                row(value, y, heights[i]);
+                value >>= 2;
+                y += heights[i];
+        }
+
+        cairo_fill(cr);
+}
+
 static void
 polygon(cairo_t* cr,
         double x,
@@ -1325,6 +1372,269 @@ Minifont::draw_graphic(DrawingContext const& context,
                 break;
         }
 
+        case 0x1cd00 ... 0x1cde5: { /* block octant-* */
+                static constinit uint8_t const octant_value [] = {
+                        0b0000'0100, /* U+1CD00 BLOCK OCTANT-3       */
+                        0b0000'0110, /* U+1CD01 BLOCK OCTANT-23      */
+                        0b0000'0111, /* U+1CD02 BLOCK OCTANT-123     */
+                        0b0000'1000, /* U+1CD03 BLOCK OCTANT-4       */
+                        0b0000'1001, /* U+1CD04 BLOCK OCTANT-14      */
+                        0b0000'1011, /* U+1CD05 BLOCK OCTANT-124     */
+                        0b0000'1100, /* U+1CD06 BLOCK OCTANT-34      */
+                        0b0000'1101, /* U+1CD07 BLOCK OCTANT-134     */
+                        0b0000'1110, /* U+1CD08 BLOCK OCTANT-234     */
+                        0b0001'0000, /* U+1CD09 BLOCK OCTANT-5       */
+                        0b0001'0001, /* U+1CD0A BLOCK OCTANT-15      */
+                        0b0001'0010, /* U+1CD0B BLOCK OCTANT-25      */
+                        0b0001'0011, /* U+1CD0C BLOCK OCTANT-125     */
+                        0b0001'0101, /* U+1CD0D BLOCK OCTANT-135     */
+                        0b0001'0110, /* U+1CD0E BLOCK OCTANT-235     */
+                        0b0001'0111, /* U+1CD0F BLOCK OCTANT-1235    */
+                        0b0001'1000, /* U+1CD10 BLOCK OCTANT-45      */
+                        0b0001'1001, /* U+1CD11 BLOCK OCTANT-145     */
+                        0b0001'1010, /* U+1CD12 BLOCK OCTANT-245     */
+                        0b0001'1011, /* U+1CD13 BLOCK OCTANT-1245    */
+                        0b0001'1100, /* U+1CD14 BLOCK OCTANT-345     */
+                        0b0001'1101, /* U+1CD15 BLOCK OCTANT-1345    */
+                        0b0001'1110, /* U+1CD16 BLOCK OCTANT-2345    */
+                        0b0001'1111, /* U+1CD17 BLOCK OCTANT-12345   */
+                        0b0010'0000, /* U+1CD18 BLOCK OCTANT-6       */
+                        0b0010'0001, /* U+1CD19 BLOCK OCTANT-16      */
+                        0b0010'0010, /* U+1CD1A BLOCK OCTANT-26      */
+                        0b0010'0011, /* U+1CD1B BLOCK OCTANT-126     */
+                        0b0010'0100, /* U+1CD1C BLOCK OCTANT-36      */
+                        0b0010'0101, /* U+1CD1D BLOCK OCTANT-136     */
+                        0b0010'0110, /* U+1CD1E BLOCK OCTANT-236     */
+                        0b0010'0111, /* U+1CD1F BLOCK OCTANT-1236    */
+                        0b0010'1001, /* U+1CD20 BLOCK OCTANT-146     */
+                        0b0010'1010, /* U+1CD21 BLOCK OCTANT-246     */
+                        0b0010'1011, /* U+1CD22 BLOCK OCTANT-1246    */
+                        0b0010'1100, /* U+1CD23 BLOCK OCTANT-346     */
+                        0b0010'1101, /* U+1CD24 BLOCK OCTANT-1346    */
+                        0b0010'1110, /* U+1CD25 BLOCK OCTANT-2346    */
+                        0b0010'1111, /* U+1CD26 BLOCK OCTANT-12346   */
+                        0b0011'0000, /* U+1CD27 BLOCK OCTANT-56      */
+                        0b0011'0001, /* U+1CD28 BLOCK OCTANT-156     */
+                        0b0011'0010, /* U+1CD29 BLOCK OCTANT-256     */
+                        0b0011'0011, /* U+1CD2A BLOCK OCTANT-1256    */
+                        0b0011'0100, /* U+1CD2B BLOCK OCTANT-356     */
+                        0b0011'0101, /* U+1CD2C BLOCK OCTANT-1356    */
+                        0b0011'0110, /* U+1CD2D BLOCK OCTANT-2356    */
+                        0b0011'0111, /* U+1CD2E BLOCK OCTANT-12356   */
+                        0b0011'1000, /* U+1CD2F BLOCK OCTANT-456     */
+                        0b0011'1001, /* U+1CD30 BLOCK OCTANT-1456    */
+                        0b0011'1010, /* U+1CD31 BLOCK OCTANT-2456    */
+                        0b0011'1011, /* U+1CD32 BLOCK OCTANT-12456   */
+                        0b0011'1100, /* U+1CD33 BLOCK OCTANT-3456    */
+                        0b0011'1101, /* U+1CD34 BLOCK OCTANT-13456   */
+                        0b0011'1110, /* U+1CD35 BLOCK OCTANT-23456   */
+                        0b0100'0001, /* U+1CD36 BLOCK OCTANT-17      */
+                        0b0100'0010, /* U+1CD37 BLOCK OCTANT-27      */
+                        0b0100'0011, /* U+1CD38 BLOCK OCTANT-127     */
+                        0b0100'0100, /* U+1CD39 BLOCK OCTANT-37      */
+                        0b0100'0101, /* U+1CD3A BLOCK OCTANT-137     */
+                        0b0100'0110, /* U+1CD3B BLOCK OCTANT-237     */
+                        0b0100'0111, /* U+1CD3C BLOCK OCTANT-1237    */
+                        0b0100'1000, /* U+1CD3D BLOCK OCTANT-47      */
+                        0b0100'1001, /* U+1CD3E BLOCK OCTANT-147     */
+                        0b0100'1010, /* U+1CD3F BLOCK OCTANT-247     */
+                        0b0100'1011, /* U+1CD40 BLOCK OCTANT-1247    */
+                        0b0100'1100, /* U+1CD41 BLOCK OCTANT-347     */
+                        0b0100'1101, /* U+1CD42 BLOCK OCTANT-1347    */
+                        0b0100'1110, /* U+1CD43 BLOCK OCTANT-2347    */
+                        0b0100'1111, /* U+1CD44 BLOCK OCTANT-12347   */
+                        0b0101'0001, /* U+1CD45 BLOCK OCTANT-157     */
+                        0b0101'0010, /* U+1CD46 BLOCK OCTANT-257     */
+                        0b0101'0011, /* U+1CD47 BLOCK OCTANT-1257    */
+                        0b0101'0100, /* U+1CD48 BLOCK OCTANT-357     */
+                        0b0101'0110, /* U+1CD49 BLOCK OCTANT-2357    */
+                        0b0101'0111, /* U+1CD4A BLOCK OCTANT-12357   */
+                        0b0101'1000, /* U+1CD4B BLOCK OCTANT-457     */
+                        0b0101'1001, /* U+1CD4C BLOCK OCTANT-1457    */
+                        0b0101'1011, /* U+1CD4D BLOCK OCTANT-12457   */
+                        0b0101'1100, /* U+1CD4E BLOCK OCTANT-3457    */
+                        0b0101'1101, /* U+1CD4F BLOCK OCTANT-13457   */
+                        0b0101'1110, /* U+1CD50 BLOCK OCTANT-23457   */
+                        0b0110'0000, /* U+1CD51 BLOCK OCTANT-67      */
+                        0b0110'0001, /* U+1CD52 BLOCK OCTANT-167     */
+                        0b0110'0010, /* U+1CD53 BLOCK OCTANT-267     */
+                        0b0110'0011, /* U+1CD54 BLOCK OCTANT-1267    */
+                        0b0110'0100, /* U+1CD55 BLOCK OCTANT-367     */
+                        0b0110'0101, /* U+1CD56 BLOCK OCTANT-1367    */
+                        0b0110'0110, /* U+1CD57 BLOCK OCTANT-2367    */
+                        0b0110'0111, /* U+1CD58 BLOCK OCTANT-12367   */
+                        0b0110'1000, /* U+1CD59 BLOCK OCTANT-467     */
+                        0b0110'1001, /* U+1CD5A BLOCK OCTANT-1467    */
+                        0b0110'1010, /* U+1CD5B BLOCK OCTANT-2467    */
+                        0b0110'1011, /* U+1CD5C BLOCK OCTANT-12467   */
+                        0b0110'1100, /* U+1CD5D BLOCK OCTANT-3467    */
+                        0b0110'1101, /* U+1CD5E BLOCK OCTANT-13467   */
+                        0b0110'1110, /* U+1CD5F BLOCK OCTANT-23467   */
+                        0b0110'1111, /* U+1CD60 BLOCK OCTANT-123467  */
+                        0b0111'0000, /* U+1CD61 BLOCK OCTANT-567     */
+                        0b0111'0001, /* U+1CD62 BLOCK OCTANT-1567    */
+                        0b0111'0010, /* U+1CD63 BLOCK OCTANT-2567    */
+                        0b0111'0011, /* U+1CD64 BLOCK OCTANT-12567   */
+                        0b0111'0100, /* U+1CD65 BLOCK OCTANT-3567    */
+                        0b0111'0101, /* U+1CD66 BLOCK OCTANT-13567   */
+                        0b0111'0110, /* U+1CD67 BLOCK OCTANT-23567   */
+                        0b0111'0111, /* U+1CD68 BLOCK OCTANT-123567  */
+                        0b0111'1000, /* U+1CD69 BLOCK OCTANT-4567    */
+                        0b0111'1001, /* U+1CD6A BLOCK OCTANT-14567   */
+                        0b0111'1010, /* U+1CD6B BLOCK OCTANT-24567   */
+                        0b0111'1011, /* U+1CD6C BLOCK OCTANT-124567  */
+                        0b0111'1100, /* U+1CD6D BLOCK OCTANT-34567   */
+                        0b0111'1101, /* U+1CD6E BLOCK OCTANT-134567  */
+                        0b0111'1110, /* U+1CD6F BLOCK OCTANT-234567  */
+                        0b0111'1111, /* U+1CD70 BLOCK OCTANT-1234567 */
+                        0b1000'0001, /* U+1CD71 BLOCK OCTANT-18      */
+                        0b1000'0010, /* U+1CD72 BLOCK OCTANT-28      */
+                        0b1000'0011, /* U+1CD73 BLOCK OCTANT-128     */
+                        0b1000'0100, /* U+1CD74 BLOCK OCTANT-38      */
+                        0b1000'0101, /* U+1CD75 BLOCK OCTANT-138     */
+                        0b1000'0110, /* U+1CD76 BLOCK OCTANT-238     */
+                        0b1000'0111, /* U+1CD77 BLOCK OCTANT-1238    */
+                        0b1000'1000, /* U+1CD78 BLOCK OCTANT-48      */
+                        0b1000'1001, /* U+1CD79 BLOCK OCTANT-148     */
+                        0b1000'1010, /* U+1CD7A BLOCK OCTANT-248     */
+                        0b1000'1011, /* U+1CD7B BLOCK OCTANT-1248    */
+                        0b1000'1100, /* U+1CD7C BLOCK OCTANT-348     */
+                        0b1000'1101, /* U+1CD7D BLOCK OCTANT-1348    */
+                        0b1000'1110, /* U+1CD7E BLOCK OCTANT-2348    */
+                        0b1000'1111, /* U+1CD7F BLOCK OCTANT-12348   */
+                        0b1001'0000, /* U+1CD80 BLOCK OCTANT-58      */
+                        0b1001'0001, /* U+1CD81 BLOCK OCTANT-158     */
+                        0b1001'0010, /* U+1CD82 BLOCK OCTANT-258     */
+                        0b1001'0011, /* U+1CD83 BLOCK OCTANT-1258    */
+                        0b1001'0100, /* U+1CD84 BLOCK OCTANT-358     */
+                        0b1001'0101, /* U+1CD85 BLOCK OCTANT-1358    */
+                        0b1001'0110, /* U+1CD86 BLOCK OCTANT-2358    */
+                        0b1001'0111, /* U+1CD87 BLOCK OCTANT-12358   */
+                        0b1001'1000, /* U+1CD88 BLOCK OCTANT-458     */
+                        0b1001'1001, /* U+1CD89 BLOCK OCTANT-1458    */
+                        0b1001'1010, /* U+1CD8A BLOCK OCTANT-2458    */
+                        0b1001'1011, /* U+1CD8B BLOCK OCTANT-12458   */
+                        0b1001'1100, /* U+1CD8C BLOCK OCTANT-3458    */
+                        0b1001'1101, /* U+1CD8D BLOCK OCTANT-13458   */
+                        0b1001'1110, /* U+1CD8E BLOCK OCTANT-23458   */
+                        0b1001'1111, /* U+1CD8F BLOCK OCTANT-123458  */
+                        0b1010'0001, /* U+1CD90 BLOCK OCTANT-168     */
+                        0b1010'0010, /* U+1CD91 BLOCK OCTANT-268     */
+                        0b1010'0011, /* U+1CD92 BLOCK OCTANT-1268    */
+                        0b1010'0100, /* U+1CD93 BLOCK OCTANT-368     */
+                        0b1010'0110, /* U+1CD94 BLOCK OCTANT-2368    */
+                        0b1010'0111, /* U+1CD95 BLOCK OCTANT-12368   */
+                        0b1010'1000, /* U+1CD96 BLOCK OCTANT-468     */
+                        0b1010'1001, /* U+1CD97 BLOCK OCTANT-1468    */
+                        0b1010'1011, /* U+1CD98 BLOCK OCTANT-12468   */
+                        0b1010'1100, /* U+1CD99 BLOCK OCTANT-3468    */
+                        0b1010'1101, /* U+1CD9A BLOCK OCTANT-13468   */
+                        0b1010'1110, /* U+1CD9B BLOCK OCTANT-23468   */
+                        0b1011'0000, /* U+1CD9C BLOCK OCTANT-568     */
+                        0b1011'0001, /* U+1CD9D BLOCK OCTANT-1568    */
+                        0b1011'0010, /* U+1CD9E BLOCK OCTANT-2568    */
+                        0b1011'0011, /* U+1CD9F BLOCK OCTANT-12568   */
+                        0b1011'0100, /* U+1CDA0 BLOCK OCTANT-3568    */
+                        0b1011'0101, /* U+1CDA1 BLOCK OCTANT-13568   */
+                        0b1011'0110, /* U+1CDA2 BLOCK OCTANT-23568   */
+                        0b1011'0111, /* U+1CDA3 BLOCK OCTANT-123568  */
+                        0b1011'1000, /* U+1CDA4 BLOCK OCTANT-4568    */
+                        0b1011'1001, /* U+1CDA5 BLOCK OCTANT-14568   */
+                        0b1011'1010, /* U+1CDA6 BLOCK OCTANT-24568   */
+                        0b1011'1011, /* U+1CDA7 BLOCK OCTANT-124568  */
+                        0b1011'1100, /* U+1CDA8 BLOCK OCTANT-34568   */
+                        0b1011'1101, /* U+1CDA9 BLOCK OCTANT-134568  */
+                        0b1011'1110, /* U+1CDAA BLOCK OCTANT-234568  */
+                        0b1011'1111, /* U+1CDAB BLOCK OCTANT-1234568 */
+                        0b1100'0001, /* U+1CDAC BLOCK OCTANT-178     */
+                        0b1100'0010, /* U+1CDAD BLOCK OCTANT-278     */
+                        0b1100'0011, /* U+1CDAE BLOCK OCTANT-1278    */
+                        0b1100'0100, /* U+1CDAF BLOCK OCTANT-378     */
+                        0b1100'0101, /* U+1CDB0 BLOCK OCTANT-1378    */
+                        0b1100'0110, /* U+1CDB1 BLOCK OCTANT-2378    */
+                        0b1100'0111, /* U+1CDB2 BLOCK OCTANT-12378   */
+                        0b1100'1000, /* U+1CDB3 BLOCK OCTANT-478     */
+                        0b1100'1001, /* U+1CDB4 BLOCK OCTANT-1478    */
+                        0b1100'1010, /* U+1CDB5 BLOCK OCTANT-2478    */
+                        0b1100'1011, /* U+1CDB6 BLOCK OCTANT-12478   */
+                        0b1100'1100, /* U+1CDB7 BLOCK OCTANT-3478    */
+                        0b1100'1101, /* U+1CDB8 BLOCK OCTANT-13478   */
+                        0b1100'1110, /* U+1CDB9 BLOCK OCTANT-23478   */
+                        0b1100'1111, /* U+1CDBA BLOCK OCTANT-123478  */
+                        0b1101'0000, /* U+1CDBB BLOCK OCTANT-578     */
+                        0b1101'0001, /* U+1CDBC BLOCK OCTANT-1578    */
+                        0b1101'0010, /* U+1CDBD BLOCK OCTANT-2578    */
+                        0b1101'0011, /* U+1CDBE BLOCK OCTANT-12578   */
+                        0b1101'0100, /* U+1CDBF BLOCK OCTANT-3578    */
+                        0b1101'0101, /* U+1CDC0 BLOCK OCTANT-13578   */
+                        0b1101'0110, /* U+1CDC1 BLOCK OCTANT-23578   */
+                        0b1101'0111, /* U+1CDC2 BLOCK OCTANT-123578  */
+                        0b1101'1000, /* U+1CDC3 BLOCK OCTANT-4578    */
+                        0b1101'1001, /* U+1CDC4 BLOCK OCTANT-14578   */
+                        0b1101'1010, /* U+1CDC5 BLOCK OCTANT-24578   */
+                        0b1101'1011, /* U+1CDC6 BLOCK OCTANT-124578  */
+                        0b1101'1100, /* U+1CDC7 BLOCK OCTANT-34578   */
+                        0b1101'1101, /* U+1CDC8 BLOCK OCTANT-134578  */
+                        0b1101'1110, /* U+1CDC9 BLOCK OCTANT-234578  */
+                        0b1101'1111, /* U+1CDCA BLOCK OCTANT-1234578 */
+                        0b1110'0000, /* U+1CDCB BLOCK OCTANT-678     */
+                        0b1110'0001, /* U+1CDCC BLOCK OCTANT-1678    */
+                        0b1110'0010, /* U+1CDCD BLOCK OCTANT-2678    */
+                        0b1110'0011, /* U+1CDCE BLOCK OCTANT-12678   */
+                        0b1110'0100, /* U+1CDCF BLOCK OCTANT-3678    */
+                        0b1110'0101, /* U+1CDD0 BLOCK OCTANT-13678   */
+                        0b1110'0110, /* U+1CDD1 BLOCK OCTANT-23678   */
+                        0b1110'0111, /* U+1CDD2 BLOCK OCTANT-123678  */
+                        0b1110'1000, /* U+1CDD3 BLOCK OCTANT-4678    */
+                        0b1110'1001, /* U+1CDD4 BLOCK OCTANT-14678   */
+                        0b1110'1010, /* U+1CDD5 BLOCK OCTANT-24678   */
+                        0b1110'1011, /* U+1CDD6 BLOCK OCTANT-124678  */
+                        0b1110'1100, /* U+1CDD7 BLOCK OCTANT-34678   */
+                        0b1110'1101, /* U+1CDD8 BLOCK OCTANT-134678  */
+                        0b1110'1110, /* U+1CDD9 BLOCK OCTANT-234678  */
+                        0b1110'1111, /* U+1CDDA BLOCK OCTANT-1234678 */
+                        0b1111'0001, /* U+1CDDB BLOCK OCTANT-15678   */
+                        0b1111'0010, /* U+1CDDC BLOCK OCTANT-25678   */
+                        0b1111'0011, /* U+1CDDD BLOCK OCTANT-125678  */
+                        0b1111'0100, /* U+1CDDE BLOCK OCTANT-35678   */
+                        0b1111'0110, /* U+1CDDF BLOCK OCTANT-235678  */
+                        0b1111'0111, /* U+1CDE0 BLOCK OCTANT-1235678 */
+                        0b1111'1000, /* U+1CDE1 BLOCK OCTANT-45678   */
+                        0b1111'1001, /* U+1CDE2 BLOCK OCTANT-145678  */
+                        0b1111'1011, /* U+1CDE3 BLOCK OCTANT-1245678 */
+                        0b1111'1101, /* U+1CDE4 BLOCK OCTANT-1345678 */
+                        0b1111'1110, /* U+1CDE5 BLOCK OCTANT-2345678 */
+                };
+                octant(cr, octant_value[c - 0x1cd00], x, y, width, height);
+                break;
+        }
+
+        case 0x1cea0: /* U+1CEA0 RIGHT HALF LOWER ONE QUARTER BLOCK */
+                octant(cr, 0b1000'0000, x, y, width, height);
+                break;
+
+        case 0x1cea3: /* U+1CEA3 LEFT HALF LOWER ONE QUARTER BLOCK */
+                octant(cr, 0b0100'0000, x, y, width, height);
+                break;
+
+        case 0x1cea8: /* U+1CEA8 LEFT HALF UPPER ONE QUARTER BLOCK */
+                octant(cr, 0b0000'0001, x, y, width, height);
+                break;
+
+        case 0x1ceab: /* U+1CEAB RIGHT HALF UPPER ONE QUARTER BLOCK */
+                octant(cr, 0b0000'0010, x, y, width, height);
+                break;
+
+        case 0x1fbe6 ... 0x1fbe7: {
+                static constinit uint8_t const octant_value[] = {
+                        0b0001'0100, /* U+1FBE6 MIDDLE LEFT ONE QUARTER BLOCK */
+                        0b0010'1000, /* U+1FBE7 MIDDLE RIGHT ONE QUARTER BLOCK */
+                };
+                octant(cr, octant_value[c - 0x1fbe6], x, y, width, height);
+                break;
+        }
+
+
         default:
                 cairo_set_source_rgba (cr, 1., 0., 1., 1.);
                 cairo_rectangle(cr, x, y, width, height);
diff --git a/src/minifont.hh b/src/minifont.hh
index b539073f..cb32f545 100644
--- a/src/minifont.hh
+++ b/src/minifont.hh
@@ -39,7 +39,7 @@ public:
                 /* Box Drawing & Block Elements */
                 return ((c >=  0x2500 && c <=  0x259f) ||
                         (c >=  0x25e2 && c <=  0x25e5) ||
-                        (c >= 0x1fb00 && c <= 0x1fbef) ||
+                        (c >= 0x1fb00 && c <= 0x1fbebf) ||
                         (c >= 0x1cc00 && c <= 0x1ceaf));
         }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]