|
@@ -549,8 +549,12 @@ void TextServer::_bind_methods() {
|
|
BIND_BITFIELD_FLAG(BREAK_WORD_BOUND);
|
|
BIND_BITFIELD_FLAG(BREAK_WORD_BOUND);
|
|
BIND_BITFIELD_FLAG(BREAK_GRAPHEME_BOUND);
|
|
BIND_BITFIELD_FLAG(BREAK_GRAPHEME_BOUND);
|
|
BIND_BITFIELD_FLAG(BREAK_ADAPTIVE);
|
|
BIND_BITFIELD_FLAG(BREAK_ADAPTIVE);
|
|
|
|
+#ifndef DISABLE_DEPRECATED
|
|
BIND_BITFIELD_FLAG(BREAK_TRIM_EDGE_SPACES);
|
|
BIND_BITFIELD_FLAG(BREAK_TRIM_EDGE_SPACES);
|
|
|
|
+#endif
|
|
BIND_BITFIELD_FLAG(BREAK_TRIM_INDENT);
|
|
BIND_BITFIELD_FLAG(BREAK_TRIM_INDENT);
|
|
|
|
+ BIND_BITFIELD_FLAG(BREAK_TRIM_START_EDGE_SPACES);
|
|
|
|
+ BIND_BITFIELD_FLAG(BREAK_TRIM_END_EDGE_SPACES);
|
|
|
|
|
|
/* VisibleCharactersBehavior */
|
|
/* VisibleCharactersBehavior */
|
|
BIND_ENUM_CONSTANT(VC_CHARS_BEFORE_SHAPING);
|
|
BIND_ENUM_CONSTANT(VC_CHARS_BEFORE_SHAPING);
|
|
@@ -808,6 +812,12 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
|
|
int prev_chunk = -1;
|
|
int prev_chunk = -1;
|
|
bool trim_next = false;
|
|
bool trim_next = false;
|
|
|
|
|
|
|
|
+#ifndef DISABLE_DEPRECATED
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
+ p_break_flags = p_break_flags | BREAK_TRIM_START_EDGE_SPACES | BREAK_TRIM_END_EDGE_SPACES;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
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);
|
|
|
|
|
|
@@ -848,13 +858,13 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
|
|
}
|
|
}
|
|
if ((l_width > 0) && (width + adv > l_width) && (last_safe_break >= 0)) {
|
|
if ((l_width > 0) && (width + adv > l_width) && (last_safe_break >= 0)) {
|
|
int cur_safe_brk = last_safe_break;
|
|
int cur_safe_brk = last_safe_break;
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) || p_break_flags.has_flag(BREAK_TRIM_END_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_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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 (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) && trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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 (p_break_flags.has_flag(BREAK_TRIM_END_EDGE_SPACES) && (start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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;
|
|
}
|
|
}
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
@@ -892,13 +902,13 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
|
|
if (p_break_flags.has_flag(BREAK_MANDATORY)) {
|
|
if (p_break_flags.has_flag(BREAK_MANDATORY)) {
|
|
if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) {
|
|
if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) {
|
|
int cur_safe_brk = i;
|
|
int cur_safe_brk = i;
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) || p_break_flags.has_flag(BREAK_TRIM_END_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 (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) && 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 (p_break_flags.has_flag(BREAK_TRIM_END_EDGE_SPACES) && (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;
|
|
}
|
|
}
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
@@ -953,7 +963,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks_adv(const RID &p_shaped
|
|
|
|
|
|
if (l_size > 0) {
|
|
if (l_size > 0) {
|
|
if (lines.size() == 0 || (lines[lines.size() - 1] < range.y && prev_safe_break < l_size)) {
|
|
if (lines.size() == 0 || (lines[lines.size() - 1] < range.y && prev_safe_break < l_size)) {
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_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;
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
int end_pos = l_size - 1;
|
|
int end_pos = l_size - 1;
|
|
@@ -991,6 +1001,12 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
|
|
int word_count = 0;
|
|
int word_count = 0;
|
|
bool trim_next = false;
|
|
bool trim_next = false;
|
|
|
|
|
|
|
|
+#ifndef DISABLE_DEPRECATED
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
+ p_break_flags = p_break_flags | BREAK_TRIM_START_EDGE_SPACES | BREAK_TRIM_END_EDGE_SPACES;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped);
|
|
TextServer::Orientation orientation = shaped_text_get_orientation(p_shaped);
|
|
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);
|
|
@@ -1025,13 +1041,13 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
|
|
}
|
|
}
|
|
if ((l_width > 0) && (width + adv > l_width) && (last_safe_break >= 0)) {
|
|
if ((l_width > 0) && (width + adv > l_width) && (last_safe_break >= 0)) {
|
|
int cur_safe_brk = last_safe_break;
|
|
int cur_safe_brk = last_safe_break;
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) || p_break_flags.has_flag(BREAK_TRIM_END_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_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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 (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) && trim_next && (start_pos < end_pos) && ((l_gl[start_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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 (p_break_flags.has_flag(BREAK_TRIM_END_EDGE_SPACES) && (start_pos < end_pos) && ((l_gl[end_pos].flags & GRAPHEME_IS_SOFT_HYPHEN) != GRAPHEME_IS_SOFT_HYPHEN) && ((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;
|
|
}
|
|
}
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
@@ -1068,13 +1084,13 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
|
|
if (p_break_flags.has_flag(BREAK_MANDATORY)) {
|
|
if (p_break_flags.has_flag(BREAK_MANDATORY)) {
|
|
if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) {
|
|
if ((l_gl[i].flags & GRAPHEME_IS_BREAK_HARD) == GRAPHEME_IS_BREAK_HARD) {
|
|
int cur_safe_brk = i;
|
|
int cur_safe_brk = i;
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) || p_break_flags.has_flag(BREAK_TRIM_END_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 (p_break_flags.has_flag(BREAK_TRIM_START_EDGE_SPACES) && 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 (p_break_flags.has_flag(BREAK_TRIM_END_EDGE_SPACES) && (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 = true;
|
|
trim_next = true;
|
|
@@ -1134,7 +1150,7 @@ PackedInt32Array TextServer::shaped_text_get_line_breaks(const RID &p_shaped, do
|
|
|
|
|
|
if (l_size > 0) {
|
|
if (l_size > 0) {
|
|
if (lines.size() == 0 || (lines[lines.size() - 1] < range.y && prev_safe_break < l_size)) {
|
|
if (lines.size() == 0 || (lines[lines.size() - 1] < range.y && prev_safe_break < l_size)) {
|
|
- if (p_break_flags.has_flag(BREAK_TRIM_EDGE_SPACES)) {
|
|
|
|
|
|
+ if (p_break_flags.has_flag(BREAK_TRIM_START_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;
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
if (last_end <= l_gl[start_pos].start) {
|
|
int end_pos = l_size - 1;
|
|
int end_pos = l_size - 1;
|