Browse Source

[TextServer] Fix excessive space trimming.

bruvzg 3 years ago
parent
commit
f131b69032
1 changed files with 18 additions and 25 deletions
  1. 18 25
      servers/text_server.cpp

+ 18 - 25
servers/text_server.cpp

@@ -683,7 +683,9 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 	int line_start = MAX(p_start, range.x);
 	int line_start = MAX(p_start, range.x);
 	int prev_safe_break = 0;
 	int prev_safe_break = 0;
 	int last_safe_break = -1;
 	int last_safe_break = -1;
+	int word_count = 0;
 	int chunk = 0;
 	int chunk = 0;
+	bool trim_next = false;
 
 
 	int l_size = shaped_text_get_glyph_count(p_shaped);
 	int l_size = shaped_text_get_glyph_count(p_shaped);
 	const Glyph *l_gl = const_cast<TextServer *>(this)->shaped_text_sort_logical(p_shaped);
 	const Glyph *l_gl = const_cast<TextServer *>(this)->shaped_text_sort_logical(p_shaped);
@@ -698,8 +700,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 				if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 				if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 					int start_pos = prev_safe_break;
 					int start_pos = prev_safe_break;
 					int end_pos = last_safe_break;
 					int end_pos = last_safe_break;
-
-					while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+					while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 						start_pos += l_gl[start_pos].count;
 						start_pos += l_gl[start_pos].count;
 					}
 					}
 					while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 					while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
@@ -707,6 +708,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 					}
 					}
 					lines.push_back(l_gl[start_pos].start);
 					lines.push_back(l_gl[start_pos].start);
 					lines.push_back(l_gl[end_pos].end);
 					lines.push_back(l_gl[end_pos].end);
+					trim_next = true;
 				} else {
 				} else {
 					lines.push_back(line_start);
 					lines.push_back(line_start);
 					lines.push_back(l_gl[last_safe_break].end);
 					lines.push_back(l_gl[last_safe_break].end);
@@ -716,6 +718,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 				i = last_safe_break;
 				i = last_safe_break;
 				last_safe_break = -1;
 				last_safe_break = -1;
 				width = 0;
 				width = 0;
+				word_count = 0;
 				chunk++;
 				chunk++;
 				if (chunk >= p_width.size()) {
 				if (chunk >= p_width.size()) {
 					chunk = 0;
 					chunk = 0;
@@ -730,8 +733,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 					if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 					if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 						int start_pos = prev_safe_break;
 						int start_pos = prev_safe_break;
 						int end_pos = i;
 						int end_pos = i;
-
-						while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+						while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 							start_pos += l_gl[start_pos].count;
 							start_pos += l_gl[start_pos].count;
 						}
 						}
 						while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 						while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
@@ -739,6 +741,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 						}
 						}
 						lines.push_back(l_gl[start_pos].start);
 						lines.push_back(l_gl[start_pos].start);
 						lines.push_back(l_gl[end_pos].end);
 						lines.push_back(l_gl[end_pos].end);
+						trim_next = false;
 					} else {
 					} else {
 						lines.push_back(line_start);
 						lines.push_back(line_start);
 						lines.push_back(l_gl[i].end);
 						lines.push_back(l_gl[i].end);
@@ -757,9 +760,10 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 			if (p_break_flags.has_flag(BREAK_WORD_BOUND)) {
 			if (p_break_flags.has_flag(BREAK_WORD_BOUND)) {
 				if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
 				if ((l_gl[i].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT) {
 					last_safe_break = i;
 					last_safe_break = i;
+					word_count++;
 				}
 				}
 			}
 			}
-			if (p_break_flags.has_flag(BREAK_GRAPHEME_BOUND)) {
+			if (p_break_flags.has_flag(BREAK_GRAPHEME_BOUND) && word_count == 0) {
 				last_safe_break = i;
 				last_safe_break = i;
 			}
 			}
 		}
 		}
@@ -771,19 +775,14 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
 			if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 			if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 				int start_pos = (prev_safe_break < l_size) ? prev_safe_break : l_size - 1;
 				int start_pos = (prev_safe_break < l_size) ? prev_safe_break : l_size - 1;
 				int end_pos = l_size - 1;
 				int end_pos = l_size - 1;
-
-				while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+				while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 					start_pos += l_gl[start_pos].count;
 					start_pos += l_gl[start_pos].count;
 				}
 				}
-				while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
-					end_pos -= l_gl[end_pos].count;
-				}
 				lines.push_back(l_gl[start_pos].start);
 				lines.push_back(l_gl[start_pos].start);
-				lines.push_back(l_gl[end_pos].end);
 			} else {
 			} else {
 				lines.push_back(line_start);
 				lines.push_back(line_start);
-				lines.push_back(range.y);
 			}
 			}
+			lines.push_back(range.y);
 		}
 		}
 	} else {
 	} else {
 		lines.push_back(0);
 		lines.push_back(0);
@@ -804,6 +803,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
 	int prev_safe_break = 0;
 	int prev_safe_break = 0;
 	int last_safe_break = -1;
 	int last_safe_break = -1;
 	int word_count = 0;
 	int word_count = 0;
+	bool trim_next = false;
 
 
 	int l_size = shaped_text_get_glyph_count(p_shaped);
 	int l_size = shaped_text_get_glyph_count(p_shaped);
 	const Glyph *l_gl = const_cast<TextServer *>(this)->shaped_text_sort_logical(p_shaped);
 	const Glyph *l_gl = const_cast<TextServer *>(this)->shaped_text_sort_logical(p_shaped);
@@ -818,16 +818,15 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
 				if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 				if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 					int start_pos = prev_safe_break;
 					int start_pos = prev_safe_break;
 					int end_pos = last_safe_break;
 					int end_pos = last_safe_break;
-
-					while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+					while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 						start_pos += l_gl[start_pos].count;
 						start_pos += l_gl[start_pos].count;
 					}
 					}
 					while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 					while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 						end_pos -= l_gl[end_pos].count;
 						end_pos -= l_gl[end_pos].count;
 					}
 					}
-					//printf("%s", vformat("BRK TRIM(W): %d..%d -> %d..%d\n", line_start, l_gl[last_safe_break].end, l_gl[start_pos].start, l_gl[end_pos].end).utf8().get_data());
 					lines.push_back(l_gl[start_pos].start);
 					lines.push_back(l_gl[start_pos].start);
 					lines.push_back(l_gl[end_pos].end);
 					lines.push_back(l_gl[end_pos].end);
+					trim_next = true;
 				} else {
 				} else {
 					lines.push_back(line_start);
 					lines.push_back(line_start);
 					lines.push_back(l_gl[last_safe_break].end);
 					lines.push_back(l_gl[last_safe_break].end);
@@ -845,16 +844,15 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
 					if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 					if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 						int start_pos = prev_safe_break;
 						int start_pos = prev_safe_break;
 						int end_pos = i;
 						int end_pos = i;
-
-						while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+						while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 							start_pos += l_gl[start_pos].count;
 							start_pos += l_gl[start_pos].count;
 						}
 						}
 						while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 						while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 							end_pos -= l_gl[end_pos].count;
 							end_pos -= l_gl[end_pos].count;
 						}
 						}
+						trim_next = false;
 						lines.push_back(l_gl[start_pos].start);
 						lines.push_back(l_gl[start_pos].start);
 						lines.push_back(l_gl[end_pos].end);
 						lines.push_back(l_gl[end_pos].end);
-						//printf("%s", vformat("BRK TRIM(M): %d..%d -> %d..%d\n", line_start, l_gl[i].end, l_gl[start_pos].start, l_gl[end_pos].end).utf8().get_data());
 					} else {
 					} else {
 						lines.push_back(line_start);
 						lines.push_back(line_start);
 						lines.push_back(l_gl[i].end);
 						lines.push_back(l_gl[i].end);
@@ -887,19 +885,14 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
 			if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 			if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
 				int start_pos = (prev_safe_break < l_size) ? prev_safe_break : l_size - 1;
 				int start_pos = (prev_safe_break < l_size) ? prev_safe_break : l_size - 1;
 				int end_pos = l_size - 1;
 				int end_pos = l_size - 1;
-
-				while ((start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
+				while (trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[start_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
 					start_pos += l_gl[start_pos].count;
 					start_pos += l_gl[start_pos].count;
 				}
 				}
-				while ((start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SPACE) == GRAPHEME_IS_SPACE || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD || (l_gl[end_pos].flags & GRAPHEME_IS_BREAK_SOFT) == GRAPHEME_IS_BREAK_SOFT)) {
-					end_pos -= l_gl[end_pos].count;
-				}
 				lines.push_back(l_gl[start_pos].start);
 				lines.push_back(l_gl[start_pos].start);
-				lines.push_back(l_gl[end_pos].end);
 			} else {
 			} else {
 				lines.push_back(line_start);
 				lines.push_back(line_start);
-				lines.push_back(range.y);
 			}
 			}
+			lines.push_back(range.y);
 		}
 		}
 	} else {
 	} else {
 		lines.push_back(0);
 		lines.push_back(0);