ltkx

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

commit 5fd0eb1d2fa742e6ea257992acb0edee773b6f24
parent 30f6302a0a754c310140abbb88f467492586be68
Author: lumidify <nobody@lumidify.org>
Date:   Thu, 14 May 2020 17:37:12 +0200

Fix font cache

Diffstat:
Marray.h | 1-
Mtest1.c | 15++++++++-------
Mtext-common.c | 3++-
Mtext_buffer.c | 54++++++++++++++++++++++++++----------------------------
Mtext_buffer.h | 6++++++
Mtext_edit.c | 3---
6 files changed, 42 insertions(+), 40 deletions(-)

diff --git a/array.h b/array.h @@ -133,7 +133,6 @@ ltk_array_resize_##name(struct ltk_array_##name *ar, size_t len) { \ \ void \ ltk_array_destroy_##name(struct ltk_array_##name *ar) { \ - printf("%p %p %d\n", ar->buf, ar, ar->buf_size); \ free(ar->buf); \ ar->buf = NULL; \ free(ar); \ diff --git a/test1.c b/test1.c @@ -25,18 +25,19 @@ int main(int argc, char *argv[]) ltk_set_column_weight(grid1, 0, 1); ltk_set_column_weight(grid1, 1, 1); /* Test callback functions */ - //LtkButton *button1 = ltk_create_button(window1, "I'm a button!", &bob1); - //ltk_grid_widget(button1, grid1, 0, 0, 1, 1, LTK_STICKY_LEFT | LTK_STICKY_RIGHT); + LtkButton *button1 = ltk_create_button(window1, "I'm a button!", &bob1); + ltk_grid_widget(button1, grid1, 0, 0, 1, 1, LTK_STICKY_LEFT | LTK_STICKY_RIGHT); /* Test manual callback functions */ - //LtkButton *button2 = ltk_create_button(window1, "I'm a button!", NULL); - //button2->widget.mouse_release = &bob2; - //ltk_grid_widget(button2, grid1, 0, 1, 1, 1, LTK_STICKY_TOP | LTK_STICKY_BOTTOM); + LtkButton *button2 = ltk_create_button(window1, "I'm a button!", NULL); + button2->widget.mouse_release = &bob2; + ltk_grid_widget(button2, grid1, 0, 1, 1, 1, LTK_STICKY_TOP | LTK_STICKY_BOTTOM); //LtkButton *button3 = ltk_create_button(window1, "I'm a button!", NULL); //ltk_grid_widget(button3, grid1, 1, 0, 1, 1, LTK_STICKY_TOP | LTK_STICKY_BOTTOM | LTK_STICKY_RIGHT); //LtkButton *button4 = ltk_create_button(window1, "I'm a button!", NULL); - //LtkButton *button4 = ltk_create_button(window1, "ہمارے بارے میں blablabla", NULL); + LtkButton *button4 = ltk_create_button(window1, "ہمارے بارے میں blablabla", NULL); //LtkButton *button4 = ltk_create_button(window1, "پَیدایش", NULL); LtkTextEdit *edit = ltk_create_text_edit(window1, "ہمارے بارے میں blablabla"); - ltk_grid_widget(edit, grid1, 1, 1, 1, 1, LTK_STICKY_LEFT | LTK_STICKY_BOTTOM); + ltk_grid_widget(button4, grid1, 1, 0, 1, 1, LTK_STICKY_TOP | LTK_STICKY_BOTTOM | LTK_STICKY_RIGHT); + ltk_grid_widget(edit, grid1, 1, 1, 1, 1, LTK_STICKY_LEFT | LTK_STICKY_BOTTOM | LTK_STICKY_TOP | LTK_STICKY_RIGHT); ltk_mainloop(); } diff --git a/text-common.c b/text-common.c @@ -120,7 +120,8 @@ ltk_init_text(char *font_name) tm->font_paths = kh_init(fontid); tm->font_cache = kh_init(fontstruct); tm->glyph_cache = kh_init(glyphcache); - tm->font_id_cur = 0; + /* FIXME: THIS REALLY SHOULD NOT BE UINT16_T! IT GETS MESSY WITH BIT-SHIFTING */ + tm->font_id_cur = 1; ltk_load_default_font(tm, font_name); return tm; diff --git a/text_buffer.c b/text_buffer.c @@ -64,12 +64,12 @@ ltk_render_text_line_new( int cur_y = 0; int cur_x = par_is_rtl ? max_width : 0; ltk_array_clear_int(tl->wrap_indeces); - ltk_array_append_int(tl->wrap_indeces, 0); + ltk_array_append_uint32(tl->wrap_indeces, 0); /* FIXME: wrap bidi text properly */ /* FIXME: THIS IS UGLY */ - struct ltk_text_run *cur = tl->first_run; - do { + struct ltk_text_run *cur = par_is_rtl ? tl->last_run : tl->first_run; + while (cur) { if (par_is_rtl) { for (int i = cur->num_glyphs - 1; i >= 0; i--) { cur_x -= cur->glyphs[i].x_advance; @@ -85,7 +85,7 @@ ltk_render_text_line_new( } i = j; /* FIXME: handle case that this is the same as the last index */ - ltk_array_append_int(tl->wrap_indeces, cur->glyphs[i].cluster); + ltk_array_append_uint32(tl->wrap_indeces, cur->glyphs[i].cluster); cur_x = max_width; } } @@ -104,21 +104,20 @@ ltk_render_text_line_new( } i = j; /* FIXME: handle case that this is the same as the last index */ - ltk_array_append_int(tl->wrap_indeces, cur->glyphs[i].cluster); + ltk_array_append_uint32(tl->wrap_indeces, cur->glyphs[i].cluster); cur_x = 0; } } } - } while (cur = cur->next); + cur = par_is_rtl ? cur->last : cur->next; + } XWindowAttributes attrs; XGetWindowAttributes(dpy, window, &attrs); int depth = attrs.depth; - printf("%d --- %d\n", max_width, tl->h * tl->wrap_indeces->len); img = XCreateImage(dpy, CopyFromParent, depth, ZPixmap, 0, NULL, max_width, tl->h * tl->wrap_indeces->len, 32, 0); img->data = calloc(img->bytes_per_line, img->height); XInitImage(img); - printf("%d +++ %d\n", img->width, img->height); int b; for (int i = 0; i < tl->h * tl->wrap_indeces->len; i++) { @@ -131,7 +130,7 @@ ltk_render_text_line_new( } } - cur = tl->first_run; + cur = par_is_rtl ? tl->last_run : tl->first_run; int x, y; double a; int cur_line_x = 0; @@ -142,20 +141,21 @@ ltk_render_text_line_new( loop in case tl->first_run is NULL, but I should probably decide what to do in that case */ int index; + cur_x = max_width; while (cur) { for (int k = 0; k < cur->num_glyphs; k++) { - index = par_is_rtl ? cur->num_glyphs - k - 1 : k; - glyph = &cur->glyphs[k]; - if (cur_line < tl->wrap_indeces->len - 1 && - ((!par_is_rtl && glyph->cluster >= tl->wrap_indeces->buf[cur_line + 1]) || - (par_is_rtl && glyph->cluster <= tl->wrap_indeces->buf[cur_line + 1]))) { + index = HB_DIRECTION_IS_BACKWARD(cur->dir) ? cur->num_glyphs - k - 1 : k; + glyph = &cur->glyphs[index]; + cur_x -= glyph->x_advance; + if (cur_x < 0) { + cur_x = max_width - glyph->x_advance; cur_line++; cur_line_x += glyph->x_abs - cur_line_x; + x = max_width - (glyph->x_abs - cur_line_x) - glyph->info->w; } - x = par_is_rtl ? max_width - (glyph->x_abs - cur_line_x) - glyph->info->w: glyph->x_abs - cur_line_x; + //x = par_is_rtl ? max_width - (glyph->x_abs - cur_line_x) - glyph->info->w : glyph->x_abs - cur_line_x; + x = cur_x; y = glyph->y_abs + tl->h * cur_line; - printf("%d,%d\n", x, y); - fflush(stdout); if (x < 0) x = 0; if (x > max_width - glyph->info->w) @@ -174,7 +174,7 @@ ltk_render_text_line_new( } } } - cur = cur->next; + cur = par_is_rtl ? cur->last : cur->next; } return img; } @@ -320,6 +320,7 @@ ltk_text_run_create(size_t start_index, size_t len, hb_script_t script, hb_direc run->script = script; run->dir = dir; run->next = NULL; + run->last = NULL; return run; } @@ -355,15 +356,14 @@ ltk_text_line_itemize(struct ltk_text_line *tl) { if (!first_run) { first_run = new; } else { - if (par_is_rtl) - new->next = cur_run; - else - cur_run->next = new; + cur_run->next = new; + new->last = cur_run; } cur_run = new; start_index = end_index; } - tl->first_run = par_is_rtl ? cur_run : first_run; + tl->first_run = first_run; + tl->last_run = cur_run; } static void @@ -462,7 +462,6 @@ ltk_text_line_shape(LtkTextManager *tm, struct ltk_text_line *tl) { FcPattern *pat = FcPatternDuplicate(tm->fcpattern); FcPattern *match; FcResult result; - printf("%p\n", pat); FcPatternAddBool(pat, FC_SCALABLE, 1); FcConfigSubstitute(NULL, pat, FcMatchPattern); FcDefaultSubstitute(pat); @@ -501,7 +500,7 @@ ltk_text_line_shape(LtkTextManager *tm, struct ltk_text_line *tl) { for (int i = 0; i < run->len; i++) { glyph = &run->glyphs[i]; glyph->x_abs = cur_x + glyph->info->xoff + glyph->x_offset; - glyph->y_abs = cur_y - glyph->info->yoff - glyph->y_offset; + glyph->y_abs = cur_y + glyph->info->yoff - glyph->y_offset; cur_x += glyph->x_advance; cur_y -= glyph->y_advance; } @@ -549,7 +548,6 @@ ltk_text_line_destroy_runs(struct ltk_text_run *runs) { static void ltk_text_line_recalculate(LtkTextManager *tm, struct ltk_text_line *tl) { - printf("%d,%d,%d,%d,%d\n", tl->log_buf->buf_size, tl->vis_buf->buf_size, tl->log2vis->buf_size, tl->vis2log->buf_size, tl->bidi_levels->buf_size); fribidi_log2vis( tl->log_buf->buf, tl->log_buf->len, &tl->dir, tl->vis_buf->buf, tl->log2vis->buf, tl->vis2log->buf, tl->bidi_levels->buf @@ -608,7 +606,7 @@ ltk_text_line_create(void) { line->vis2log = ltk_array_create_int(4); line->scripts = ltk_array_create_script(4); line->bidi_levels = ltk_array_create_level(4); - line->wrap_indeces = ltk_array_create_int(1); + line->wrap_indeces = ltk_array_create_uint32(1); line->first_run = NULL; line->cur_run = NULL; line->next = NULL; @@ -644,7 +642,7 @@ ltk_text_line_destroy(struct ltk_text_line *tl) { ltk_array_destroy_int(tl->log2vis); ltk_array_destroy_int(tl->vis2log); ltk_array_destroy_level(tl->bidi_levels); - ltk_array_destroy_int(tl->wrap_indeces); + ltk_array_destroy_uint32(tl->wrap_indeces); ltk_text_line_destroy_runs(tl->first_run); free(tl); } diff --git a/text_buffer.h b/text_buffer.h @@ -42,6 +42,7 @@ struct ltk_text_run { LtkGlyph *glyphs; unsigned int num_glyphs; struct ltk_text_run *next; + struct ltk_text_run *last; size_t start_index; size_t len; /* FIXME: THIS IS NOT THE NUMBER OF GLYPHS; IT IS THE ACTUAL NUMBER OF CHARACTERS REPRESENTED BY THIS RUN */ int start_x; @@ -54,6 +55,11 @@ struct ltk_text_run { hb_direction_t dir; }; +struct ltk_line_break { + size_t index; + struct ltk_text_run *run; +}; + struct ltk_text_line { struct ltk_array_uint32 *log_buf; /* buffer of the logical text */ struct ltk_array_script *scripts; diff --git a/text_edit.c b/text_edit.c @@ -46,9 +46,6 @@ ltk_draw_text_edit(LtkTextEdit *te) { LtkWindow *window = te->widget.window; if (!te->img) te->img = ltk_render_text_line_new(te->tl, rect.w, ltk_global->display, window->xwindow, window->gc, ltk_global->colormap, fg, bg); - printf("%p\n", te->img); - fflush(stdout); - printf("%d,%d;%d,%d;%d,%d\n", rect.x, rect.y, rect.w, rect.h, te->img->width, te->img->height); XPutImage(ltk_global->display, window->xwindow, window->gc, te->img, 0, 0, rect.x, rect.y, te->img->width, te->img->height); }