commit a6128237108e74682b8ca427a01dd6762cb95891
parent ffa1263fd4b66ae32adb6a2fd0274f226022d9f8
Author: lumidify <nobody@lumidify.org>
Date:   Sun, 17 May 2020 19:39:39 +0200
Change cur->len to cur->num_glyphs; allow to disallow wrapping
Diffstat:
| M | text_buffer.c |  |  | 54 | ++++++++++++++++++++++++++++++------------------------ | 
1 file changed, 30 insertions(+), 24 deletions(-)
diff --git a/text_buffer.c b/text_buffer.c
@@ -54,7 +54,6 @@ ltk_soft_line_destroy(struct ltk_soft_line *sl) {
 
 struct ltk_array_line *
 ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
-	/* FIXME: if max_width == -1, don't wrap */
 	struct ltk_array_line *soft_lines = ltk_array_create_line(1);
 	int par_is_rtl = tl->dir == HB_DIRECTION_RTL;
 
@@ -62,39 +61,45 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
 	LtkGlyph *glyph;
 	struct ltk_soft_line *sl = malloc(sizeof(struct ltk_soft_line));
 	if (!sl) goto error;
-	sl->glyph_index = cur->dir == HB_DIRECTION_RTL ? cur->len - 1 : 0;
+	sl->glyph_index = cur->dir == HB_DIRECTION_RTL ? cur->num_glyphs - 1 : 0;
 	sl->run = cur;
 	sl->len = 0;
 	sl->w = 0;
 	ltk_array_append_line(soft_lines, sl);
+	if (max_width == -1) {
+		cur = tl->first_run;
+		while (cur) {
+			sl->len += cur->num_glyphs;
+			sl->w += cur->w;
+			cur = cur->next;
+		}
+		return soft_lines;
+	}
 	int last_linebreak = par_is_rtl ? tl->w : 0;
 	int cur_start = 0;
 	/* FIXME: also calculate max height of each line */
 	while (cur) {
 		if (sl->w + cur->w <= max_width) {
 			sl->w += cur->w;
-			sl->len += cur->len;
+			sl->len += cur->num_glyphs;
 			cur = par_is_rtl ? cur->last : cur->next;
 			continue;
 		}
 		if (cur->dir == HB_DIRECTION_RTL) {
-			cur_start = cur->glyphs[cur->len - 1].x_abs + cur->glyphs[cur->len - 1].x_advance;
-			int i = cur->len - 1;
+			cur_start = cur->glyphs[cur->num_glyphs - 1].x_abs + cur->glyphs[cur->num_glyphs - 1].x_advance;
+			int i = cur->num_glyphs - 1;
 			while (i >= 0) {
 				glyph = &cur->glyphs[i];
 				int cur_w = sl->w + cur_start - glyph->x_abs;
 				if (cur_w > max_width) {
 					/* FIXME: fix behavior when line isn't wide enough for single char */
-					for (int j = i; j < cur->len; j++) {
-						if (cur->glyphs[j].cluster != glyph->cluster || j == cur->len - 1) {
-							int new_index;
-							if (j == cur->len - 1 &&
+					for (int j = i; j < cur->num_glyphs; j++) {
+						if (cur->glyphs[j].cluster != glyph->cluster || j == cur->num_glyphs - 1) {
+							if (j == cur->num_glyphs - 1 &&
 							    cur->glyphs[j].cluster == glyph->cluster) {
-								new_index = j;
 								i = j;
 								last_linebreak = cur_start;
 							} else {
-								new_index = j - 1;
 								i = j - 1;
 								last_linebreak = cur->glyphs[j].x_abs;
 								sl->len++;
@@ -103,7 +108,7 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
 							cur_start = last_linebreak;
 							sl = malloc(sizeof(struct ltk_soft_line));
 							if (!sl) goto error;
-							sl->glyph_index = new_index;
+							sl->glyph_index = i;
 							sl->run = cur;
 							sl->len = 0;
 							sl->w = 0;
@@ -125,19 +130,16 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
 		} else {
 			cur_start = cur->glyphs[0].x_abs;
 			int i = 0;
-			while (i < cur->len) {
+			while (i < cur->num_glyphs) {
 				glyph = &cur->glyphs[i];
 				int cur_w = sl->w + glyph->x_abs + glyph->info->w - cur_start;
 				if (cur_w > max_width) {
 					for (int j = i; j >= 0; j--) {
 						if (cur->glyphs[j].cluster != glyph->cluster || j == 0) {
-							int new_index;
 							if (j == 0 && cur->glyphs[j].cluster == glyph->cluster) {
-								new_index = j;
 								i = j;
 								last_linebreak = cur_start;
 							} else {
-								new_index = j + 1;
 								i = j + 1;
 								last_linebreak = cur->glyphs[j + 1].x_abs;
 								sl->len++;
@@ -146,7 +148,7 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
 							cur_start = last_linebreak;
 							sl = malloc(sizeof(struct ltk_soft_line));
 							if (!sl) goto error;
-							sl->glyph_index = new_index;
+							sl->glyph_index = i;
 							sl->run = cur;
 							sl->len = 0;
 							sl->w = 0;
@@ -163,7 +165,7 @@ ltk_text_line_wrap(struct ltk_text_line *tl, int max_width) {
 
 			}
 			if (sl->run == cur)
-				sl->w = cur->glyphs[cur->len - 1].x_abs + cur->glyphs[cur->len - 1].x_advance - last_linebreak;
+				sl->w = cur->glyphs[cur->num_glyphs - 1].x_abs + cur->glyphs[cur->num_glyphs - 1].x_advance - last_linebreak;
 			else
 				sl->w += cur->w;
 		}
@@ -246,7 +248,7 @@ ltk_render_text_line_new(
 			   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->len - 1;
+				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) {
@@ -272,12 +274,12 @@ ltk_render_text_line_new(
 				start_index = cur == sl->run ? sl->glyph_index : 0;
 				int local_border = cur->glyphs[start_index].x_abs;
 				int end_index;
-				if (cur->len - start_index < sl->len - cur_len) {
-					end_index = cur->len - 1;
+				if (cur->num_glyphs - start_index < sl->len - cur_len) {
+					end_index = cur->num_glyphs - 1;
 				} else {
 					end_index = start_index + sl->len - cur_len - 1;
 				}
-				for (int i = start_index; i < cur->len && cur_len < sl->len; i++) {
+				for (int i = start_index; i < cur->num_glyphs && cur_len < sl->len; i++) {
 					cur_len++;
 					int x;
 					if (par_is_rtl) {
@@ -288,9 +290,9 @@ ltk_render_text_line_new(
 					ltk_draw_glyph(&cur->glyphs[i], sl->img, x, cur->glyphs[i].y_abs, fg);
 				}
 				if (par_is_rtl)
-					cur_border -= cur->glyphs[cur->len - 1].x_abs + cur->glyphs[cur->len - 1].x_advance - local_border;
+					cur_border -= cur->glyphs[cur->num_glyphs - 1].x_abs + cur->glyphs[cur->num_glyphs - 1].x_advance - local_border;
 				else
-					cur_border += cur->glyphs[cur->len - 1].x_abs + cur->glyphs[cur->len - 1].x_advance - local_border;
+					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;
 		}
@@ -299,6 +301,10 @@ ltk_render_text_line_new(
 	return soft_lines;
 }
 
+size_t
+ltk_soft_line_get_index_from_pos(int x, struct ltk_soft_line *sl) {
+}
+
 /* Begin stuff stolen from raqm */
 
 /* Special paired characters for script detection */