[TextServer] Fix excessive space trimming.
This commit is contained in:
parent
8c7be63588
commit
f131b69032
|
@ -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 (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)) {
|
||||||
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)) {
|
|
||||||
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 (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)) {
|
||||||
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)) {
|
|
||||||
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 (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)) {
|
||||||
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)) {
|
|
||||||
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 (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)) {
|
||||||
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)) {
|
|
||||||
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 (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)) {
|
||||||
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)) {
|
|
||||||
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 (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)) {
|
||||||
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)) {
|
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue