URI: 
       tDraw glyphs in correct order - 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 86a8baae96e3e352e7486bb8f61584be42339e15
   DIR parent a6128237108e74682b8ca427a01dd6762cb95891
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Sun, 17 May 2020 20:02:34 +0200
       
       Draw glyphs in correct order
       
       This will be needed for efficiently determining which glyph corresponds
       tto the location a user clicked.
       
       Diffstat:
         M text_buffer.c                       |      60 +++++++++++++++----------------
       
       1 file changed, 29 insertions(+), 31 deletions(-)
       ---
   DIR diff --git a/text_buffer.c b/text_buffer.c
       t@@ -200,6 +200,7 @@ ltk_create_ximage(Display *dpy, int w, int h, int depth, XColor bg) {
        /* based on http://codemadness.org/git/dwm-font/file/drw.c.html#l315 */
        void
        ltk_draw_glyph(LtkGlyph *glyph, XImage *img, int x, int y, XColor fg) {
       +        printf("%d,%d\n", x, y);
                double a;
                int b;
                for (int i = 0; i < glyph->info->h; i++) {
       t@@ -244,55 +245,52 @@ ltk_render_text_line_new(
                        int cur_border = par_is_rtl ? sl->w : 0;
                        while (cur && cur_len < sl->len) {
                                int start_index;
       -                        /* FIXME: the borders here aren't correct since they are
       -                           x_abs + glyph->info->w, which may not be the same thing
       -                           as the actual x_abs of the bordering glyph */
                                if (cur->dir == HB_DIRECTION_RTL) {
                                        start_index = cur == sl->run ? sl->glyph_index : cur->num_glyphs - 1;
                                        int local_border = cur->glyphs[start_index].x_abs + cur->glyphs[start_index].x_advance;
                                        int end_index;
       -                                if (start_index + 1 < sl->len - cur_len) {
       +                                if (start_index + 1 < sl->len - cur_len)
                                                end_index = 0;
       -                                } else {
       +                                else
                                                end_index = start_index - (sl->len - cur_len) + 1;
       -                                }
       -                                for (int i = start_index; i >= 0 && cur_len < sl->len; i--) {
       -                                        cur_len++;
       -                                        int x;
       -                                        if (par_is_rtl) {
       -                                                x = cur_border - (local_border - cur->glyphs[i].x_abs);
       -                                        } else {
       -                                                x = cur_border + (cur->glyphs[i].x_abs - cur->glyphs[end_index].x_abs);
       +                                if (par_is_rtl) {
       +                                        for (int i = start_index; i >= 0 && cur_len < sl->len; i--) {
       +                                                cur_len++;
       +                                                int x = cur_border - (local_border - cur->glyphs[i].x_abs);
       +                                                ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
                                                }
       -                                        ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
       -                                }
       -                                if (par_is_rtl)
                                                cur_border -= local_border - cur->glyphs[0].x_abs;
       -                                else
       +                                } else {
       +                                        for (int i = end_index; i < cur->num_glyphs && cur_len < sl->len; i++) {
       +                                                cur_len++;
       +                                                int x = cur_border + (cur->glyphs[i].x_abs - cur->glyphs[end_index].x_abs);
       +                                                ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
       +                                        }
                                                cur_border += local_border - cur->glyphs[0].x_abs;
       +                                }
                                } else {
                                        start_index = cur == sl->run ? sl->glyph_index : 0;
                                        int local_border = cur->glyphs[start_index].x_abs;
                                        int end_index;
       -                                if (cur->num_glyphs - start_index < sl->len - cur_len) {
       +                                if (cur->num_glyphs - start_index < sl->len - cur_len)
                                                end_index = cur->num_glyphs - 1;
       -                                } else {
       +                                else
                                                end_index = start_index + sl->len - cur_len - 1;
       -                                }
       -                                for (int i = start_index; i < cur->num_glyphs && cur_len < sl->len; i++) {
       -                                        cur_len++;
       -                                        int x;
       -                                        if (par_is_rtl) {
       -                                                x = cur_border - (cur->glyphs[end_index].x_abs + cur->glyphs[end_index].x_advance - cur->glyphs[i].x_abs);
       -                                        } else {
       -                                                x = cur_border + (cur->glyphs[i].x_abs - local_border);
       +                                if (par_is_rtl) {
       +                                        for (int i = end_index; i >= 0 && cur_len < sl->len; i--) {
       +                                                cur_len++;
       +                                                int x = cur_border - (cur->glyphs[end_index].x_abs + cur->glyphs[end_index].x_advance - cur->glyphs[i].x_abs);
       +                                                ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
                                                }
       -                                        ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
       -                                }
       -                                if (par_is_rtl)
                                                cur_border -= cur->glyphs[cur->num_glyphs - 1].x_abs + cur->glyphs[cur->num_glyphs - 1].x_advance - local_border;
       -                                else
       +                                } else {
       +                                        for (int i = start_index; i < cur->num_glyphs && cur_len < sl->len; i++) {
       +                                                cur_len++;
       +                                                int x = cur_border + (cur->glyphs[i].x_abs - local_border);
       +                                                ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
       +                                        }
                                                cur_border += cur->glyphs[cur->num_glyphs - 1].x_abs + cur->glyphs[cur->num_glyphs - 1].x_advance - local_border;
       +                                }
                                }
                                cur = par_is_rtl ? cur->last : cur->next;
                        }