ltkx

GUI toolkit for X11 (WIP)
git clone git://lumidify.org/ltkx.git
Log | Files | Refs | README | LICENSE

commit 42f4ff374b3ba05c9e35e1682f49b3601b7a21ee
parent 9b657a99a613ff192509fb82020a9ab8e354aa62
Author: lumidify <nobody@lumidify.org>
Date:   Sat, 28 Mar 2020 19:50:09 +0100

*Possibly* make one little part work with vertical scripts

Diffstat:
Mtext-hb.c | 41+++++++++++++----------------------------
1 file changed, 13 insertions(+), 28 deletions(-)

diff --git a/text-hb.c b/text-hb.c @@ -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) { @@ -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; @@ -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; @@ -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); @@ -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; @@ -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;