Skip to content

Commit

Permalink
Merge pull request #60294 from timothyqiu/label-cjk-wrap
Browse files Browse the repository at this point in the history
[3.x] Fix `Label` autowrap for CJK text
  • Loading branch information
akien-mga authored Apr 25, 2022
2 parents 71d50af + d43b403 commit 40ad013
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions scene/gui/label.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ void Label::regenerate_word_cache() {
int line_spacing = get_constant("line_spacing");
line_count = 1;
total_char_cache = 0;
bool was_separatable = false;

WordCache *last = nullptr;

Expand All @@ -411,8 +412,11 @@ void Label::regenerate_word_cache() {
bool insert_newline = false;
real_t char_width = 0;

if (current < 33) {
if (current_word_size > 0) {
bool separation_changed = i > 0 && was_separatable != separatable;
was_separatable = separatable;

if (current < 33) { // Control characters and space.
if (current_word_size > 0) { // These characters always create a word-break.
WordCache *wc = memnew(WordCache);
if (word_cache) {
last->next = wc;
Expand All @@ -428,7 +432,7 @@ void Label::regenerate_word_cache() {
current_word_size = 0;
space_count = 0;
} else if ((i == xl_text.length() || current == '\n') && last != nullptr && space_count != 0) {
//in case there are trailing white spaces we add a placeholder word cache with just the spaces
// In case there are trailing white spaces we add a placeholder word cache with just the spaces.
WordCache *wc = memnew(WordCache);
if (word_cache) {
last->next = wc;
Expand Down Expand Up @@ -466,8 +470,24 @@ void Label::regenerate_word_cache() {
}
}

} else {
// latin characters
} else { // Characters with graphical representation.
// Word-break on CJK & non-CJK edge.
if (separation_changed && current_word_size > 0) {
WordCache *wc = memnew(WordCache);
if (word_cache) {
last->next = wc;
} else {
word_cache = wc;
}
last = wc;

wc->pixel_width = current_word_size;
wc->char_pos = word_pos;
wc->word_len = i - word_pos;
wc->space_count = space_count;
current_word_size = 0;
space_count = 0;
}
if (current_word_size == 0) {
word_pos = i;
}
Expand Down

0 comments on commit 40ad013

Please sign in to comment.