URI: 
       t*Possibly* make one little part work with vertical scripts - ltkx - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltkx.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 42f4ff374b3ba05c9e35e1682f49b3601b7a21ee
   DIR parent 9b657a99a613ff192509fb82020a9ab8e354aa62
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sat, 28 Mar 2020 19:50:09 +0100
       
       *Possibly* make one little part work with vertical scripts
       
       Diffstat:
         M text-hb.c                           |      41 ++++++++++---------------------
       
       1 file changed, 13 insertions(+), 28 deletions(-)
       ---
   DIR diff --git a/text-hb.c b/text-hb.c
       t@@ -314,7 +314,6 @@ ltk_get_font(LtkTextManager *tm, char *path)
        
        /* FIXME: allow to either use fribidi for basic shaping and don't use harfbuzz then,
                  or just use harfbuzz (then fribidi doesn't need to do any shaping) */
       -/* FIXME: take baseline into account; save script in LtkTextSegment */
        LtkTextLine *
        ltk_create_text_line(LtkTextManager *tm, char *text, uint16_t fontid, uint16_t size)
        {
       t@@ -355,20 +354,8 @@ ltk_create_text_line(LtkTextManager *tm, char *text, uint16_t fontid, uint16_t s
                for (int p = 0; p < ulen; p++) {
                        gid = stbtt_FindGlyphIndex(&font->info, vis_str[p]);
                        cur_script = hb_unicode_script(ufuncs, vis_str[p]);
       -                /*
       -                   Okay, so get this: If I don't ignore HB_SCRIPT_COMMON (as in the lower line), "I'm a button" is split into
       -                   individual characters (I guess because apostrophe and space are common characters). However, it all seems
       -                   to display at least decently. If I do ignore HB_SCRIPT_COMMON, it should technically work better since the
       -                   normal text is kept in one piece. But alas, it is not so! Because spaces don't cause the text to be split
       -                   anymore, the "blablabla " in the mixed script text is kept together (with the space at the end), which
       -                   *for some bizarre reason* causes HarfBuzz to display it RTL as "albalbalb". WHAT IS HAPPENING HERE?
       -
       -                   Update: Yeah, I was just being stupid - I was passing cur_script instead of last_script to
       -                           ltk_create_text_segment, so that was messing it up...
       -                           I have to leave that comment there for at least one commit, though.
       -                */
       +                // FIXME: handle inherited and common scripts at beginning of string
                        if (!gid || (last_script != cur_script && cur_script != HB_SCRIPT_INHERITED && cur_script != HB_SCRIPT_COMMON)) {
       -                //if (!gid || (last_script != cur_script && cur_script != HB_SCRIPT_INHERITED && cur_script)) {
                                /* This is extremely efficient... */
                                FcPattern *pat = FcPatternDuplicate(tm->fcpattern);
                                FcPattern *match;
       t@@ -420,6 +407,10 @@ ltk_create_text_line(LtkTextManager *tm, char *text, uint16_t fontid, uint16_t s
                tl->y_min = tl->x_min = INT_MAX;
                tl->w = tl->h = 0;
                while (ts) {
       +                if (HB_DIRECTION_IS_HORIZONTAL(ts->dir) != is_hor) {
       +                        fprintf(stderr, "WARNING: mixed horizontal/vertical text is not supported; ignoring\n");
       +                        continue;
       +                }
                        if (is_hor) {
                                if (tl->y_max < ts->y_max) {
                                        tl->y_max = ts->y_max;
       t@@ -506,10 +497,7 @@ ltk_create_text_segment(LtkTextManager *tm, uint32_t *text, unsigned int len, ui
                hb_direction_t dir = hb_script_get_horizontal_direction(script);
                hb_buffer_set_direction(buf, dir);
                hb_buffer_set_script(buf, script);
       -        //hb_buffer_set_direction(buf, HB_DIRECTION_LTR);
       -        //hb_buffer_set_flags(buf, HB_BUFFER_FLAG_BOT | HB_BUFFER_FLAG_EOT);
                hb_buffer_add_codepoints(buf, ts->str, len, 0, len);
       -        //hb_buffer_guess_segment_properties(buf);
                hb_shape(font->hb, buf, NULL, 0);
                ts->dir = hb_buffer_get_direction(buf);
                ginf = hb_buffer_get_glyph_infos(buf, &text_len);
       t@@ -550,10 +538,14 @@ ltk_create_text_segment(LtkTextManager *tm, uint32_t *text, unsigned int len, ui
                           for horizontal scripts, I still need to use the glyph height since
                           y_advance doesn't really do much there. I dunno, at least *something*
                           works now... */
       -                //x2_abs = x1_abs + glyph->info->w;
       -                y2_abs = y1_abs + glyph->info->h;
       -                x2_abs = x1_abs + glyph->x_advance;
       -                //y2_abs = y1_abs - glyph->y_advance;
       +                /* FIXME: THIS PROBABLY DOESN'T REALLY WORK */
       +                if (HB_DIRECTION_IS_HORIZONTAL(dir)) {
       +                        x2_abs = x1_abs + glyph->x_advance;
       +                        y2_abs = y1_abs + glyph->info->h;
       +                } else {
       +                        x2_abs = x1_abs + glyph->info->w;
       +                        y2_abs = y1_abs - glyph->y_advance;
       +                }
                        glyph->x_abs = x1_abs;
                        glyph->y_abs = y1_abs;
                        if (x1_abs < x_min) x_min = x1_abs;
       t@@ -563,15 +555,8 @@ ltk_create_text_segment(LtkTextManager *tm, uint32_t *text, unsigned int len, ui
                        x_abs += glyph->x_advance;
                        y_abs -= glyph->y_advance;
                }
       -        /* FIXME: what was this supposed to do?
       -           I think it was supposed to be the start drawing position, but why would this not be 0?
       -           I'm guessing it had something to do with the fact that I need to calculate where the
       -           actual top left corner of the glyph is since harfbuzz gives me the origin - maybe I
       -           should just store that position directly in LtkGlyph? Is there any need to advance, etc.
       -           later on after I've positioned the glyphs? Well, I guess I'll figure that out eventually... */
                ts->start_x = -x_min;
                ts->start_y = -y_min;
       -        // FIXME: need to somehow save advance so spaces aren't lost
                ts->w = x_max - x_min;
                ts->h = y_max - y_min;
                ts->x_min = x_min;