ltkx

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

commit 86a8baae96e3e352e7486bb8f61584be42339e15
parent a6128237108e74682b8ca427a01dd6762cb95891
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
to the location a user clicked.

Diffstat:
Mtext_buffer.c | 60+++++++++++++++++++++++++++++-------------------------------
1 file changed, 29 insertions(+), 31 deletions(-)

diff --git a/text_buffer.c b/text_buffer.c @@ -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++) { @@ -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; }