summaryrefslogtreecommitdiffstats
path: root/servers/text_server.cpp
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2023-05-26 16:18:26 +0300
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2023-05-26 16:18:26 +0300
commit8a4a883854d24f864ab39be1a152f58d754db91e (patch)
tree0a180d9ad863bbfbdb8c60482e97cf97cffe7dc2 /servers/text_server.cpp
parentd984ad64d440320e40e85dbcb79b8e9240f75493 (diff)
downloadredot-engine-8a4a883854d24f864ab39be1a152f58d754db91e.tar.gz
[TextServer] Prevent duplicate line breaks on virtual spaces when line width is significantly smaller than character width.
Diffstat (limited to 'servers/text_server.cpp')
-rw-r--r--servers/text_server.cpp58
1 files changed, 42 insertions, 16 deletions
diff --git a/servers/text_server.cpp b/servers/text_server.cpp
index 929cbc9ec6..329344d4c4 100644
--- a/servers/text_server.cpp
+++ b/servers/text_server.cpp
@@ -714,6 +714,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
real_t width = 0.f;
int line_start = MAX(p_start, range.x);
+ int last_end = line_start;
int prev_safe_break = 0;
int last_safe_break = -1;
int word_count = 0;
@@ -739,12 +740,18 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
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[end_pos].end);
+ if (last_end <= l_gl[start_pos].start) {
+ lines.push_back(l_gl[start_pos].start);
+ lines.push_back(l_gl[end_pos].end);
+ last_end = l_gl[end_pos].end;
+ }
trim_next = true;
} else {
- lines.push_back(line_start);
- lines.push_back(l_gl[last_safe_break].end);
+ if (last_end <= line_start) {
+ lines.push_back(line_start);
+ lines.push_back(l_gl[last_safe_break].end);
+ last_end = l_gl[last_safe_break].end;
+ }
}
line_start = l_gl[last_safe_break].end;
prev_safe_break = last_safe_break + 1;
@@ -772,12 +779,18 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
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[end_pos].end);
+ if (last_end <= l_gl[start_pos].start) {
+ lines.push_back(l_gl[start_pos].start);
+ lines.push_back(l_gl[end_pos].end);
+ last_end = l_gl[end_pos].end;
+ }
trim_next = false;
} else {
- lines.push_back(line_start);
- lines.push_back(l_gl[i].end);
+ if (last_end <= line_start) {
+ lines.push_back(line_start);
+ lines.push_back(l_gl[i].end);
+ last_end = l_gl[i].end;
+ }
}
line_start = l_gl[i].end;
prev_safe_break = i + 1;
@@ -833,6 +846,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
double width = 0.f;
int line_start = MAX(p_start, range.x);
+ int last_end = line_start;
int prev_safe_break = 0;
int last_safe_break = -1;
int word_count = 0;
@@ -857,12 +871,18 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
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[end_pos].end);
+ if (last_end <= l_gl[start_pos].start) {
+ lines.push_back(l_gl[start_pos].start);
+ lines.push_back(l_gl[end_pos].end);
+ last_end = l_gl[end_pos].end;
+ }
trim_next = true;
} else {
- lines.push_back(line_start);
- lines.push_back(l_gl[last_safe_break].end);
+ if (last_end <= line_start) {
+ lines.push_back(line_start);
+ lines.push_back(l_gl[last_safe_break].end);
+ last_end = l_gl[last_safe_break].end;
+ }
}
line_start = l_gl[last_safe_break].end;
prev_safe_break = last_safe_break + 1;
@@ -884,11 +904,17 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
end_pos -= l_gl[end_pos].count;
}
trim_next = false;
- lines.push_back(l_gl[start_pos].start);
- lines.push_back(l_gl[end_pos].end);
+ if (last_end <= l_gl[start_pos].start) {
+ lines.push_back(l_gl[start_pos].start);
+ lines.push_back(l_gl[end_pos].end);
+ last_end = l_gl[end_pos].end;
+ }
} else {
- lines.push_back(line_start);
- lines.push_back(l_gl[i].end);
+ if (last_end <= line_start) {
+ lines.push_back(line_start);
+ lines.push_back(l_gl[i].end);
+ last_end = l_gl[i].end;
+ }
}
line_start = l_gl[i].end;
prev_safe_break = i + 1;