commit
d6d29f6d79
2 changed files with 58 additions and 33 deletions
|
@ -136,10 +136,9 @@ void Label::_notification(int p_what) {
|
||||||
if (!wc)
|
if (!wc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
int c = 0;
|
||||||
int line=0;
|
int line=0;
|
||||||
while(wc) {
|
while(wc) {
|
||||||
|
|
||||||
/* handle lines not meant to be drawn quickly */
|
/* handle lines not meant to be drawn quickly */
|
||||||
if (line>line_to)
|
if (line>line_to)
|
||||||
break;
|
break;
|
||||||
|
@ -170,8 +169,8 @@ void Label::_notification(int p_what) {
|
||||||
while(to && to->char_pos>=0) {
|
while(to && to->char_pos>=0) {
|
||||||
|
|
||||||
taken+=to->pixel_width;
|
taken+=to->pixel_width;
|
||||||
if (to!=from) {
|
if (to!=from && to->space_count) {
|
||||||
spaces++;
|
spaces+=to->space_count;
|
||||||
}
|
}
|
||||||
to=to->next;
|
to=to->next;
|
||||||
}
|
}
|
||||||
|
@ -212,9 +211,9 @@ void Label::_notification(int p_what) {
|
||||||
ERR_PRINT("BUG");
|
ERR_PRINT("BUG");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (from!=wc) {
|
if (from->space_count) {
|
||||||
/* spacing */
|
/* spacing */
|
||||||
x_ofs+=space_w;
|
x_ofs+=space_w*from->space_count;
|
||||||
if (can_fill && align==ALIGN_FILL && spaces) {
|
if (can_fill && align==ALIGN_FILL && spaces) {
|
||||||
|
|
||||||
x_ofs+=int((size.width-(taken+space_w*spaces))/spaces);
|
x_ofs+=int((size.width-(taken+space_w*spaces))/spaces);
|
||||||
|
@ -365,7 +364,8 @@ void Label::regenerate_word_cache() {
|
||||||
int current_word_size=0;
|
int current_word_size=0;
|
||||||
int word_pos=0;
|
int word_pos=0;
|
||||||
int line_width=0;
|
int line_width=0;
|
||||||
int last_width=0;
|
int space_count=0;
|
||||||
|
int space_width=font->get_char_size(' ').width;
|
||||||
line_count=1;
|
line_count=1;
|
||||||
total_char_cache=0;
|
total_char_cache=0;
|
||||||
|
|
||||||
|
@ -378,12 +378,13 @@ void Label::regenerate_word_cache() {
|
||||||
if (uppercase)
|
if (uppercase)
|
||||||
current=String::char_uppercase(current);
|
current=String::char_uppercase(current);
|
||||||
|
|
||||||
|
bool not_latin = current>=33 && (current < 65||current >90) && (current<97||current>122) && (current<48||current>57);
|
||||||
bool insert_newline=false;
|
bool insert_newline=false;
|
||||||
|
int char_width;
|
||||||
|
|
||||||
if (current<33) {
|
if (current<33) {
|
||||||
|
|
||||||
if (current_word_size>0) {
|
if (current_word_size>0) {
|
||||||
|
|
||||||
WordCache *wc = memnew( WordCache );
|
WordCache *wc = memnew( WordCache );
|
||||||
if (word_cache) {
|
if (word_cache) {
|
||||||
last->next=wc;
|
last->next=wc;
|
||||||
|
@ -395,7 +396,9 @@ void Label::regenerate_word_cache() {
|
||||||
wc->pixel_width=current_word_size;
|
wc->pixel_width=current_word_size;
|
||||||
wc->char_pos=word_pos;
|
wc->char_pos=word_pos;
|
||||||
wc->word_len=i-word_pos;
|
wc->word_len=i-word_pos;
|
||||||
|
wc->space_count = space_count;
|
||||||
current_word_size=0;
|
current_word_size=0;
|
||||||
|
space_count=0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,25 +411,48 @@ void Label::regenerate_word_cache() {
|
||||||
|
|
||||||
if (i<text.length() && text[i] == ' ') {
|
if (i<text.length() && text[i] == ' ') {
|
||||||
total_char_cache--; // do not count spaces
|
total_char_cache--; // do not count spaces
|
||||||
|
if (line_width > 0 || last==NULL || last->char_pos!=WordCache::CHAR_WRAPLINE) {
|
||||||
|
space_count++;
|
||||||
|
line_width+=space_width;
|
||||||
|
}else {
|
||||||
|
space_count=0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
// latin characters
|
||||||
if (current_word_size==0) {
|
if (current_word_size==0) {
|
||||||
if (line_width>0) // add a space before the new word if a word existed before
|
|
||||||
line_width+=font->get_char_size(' ').width;
|
|
||||||
word_pos=i;
|
word_pos=i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int char_width=font->get_char_size(current).width;
|
char_width=font->get_char_size(current).width;
|
||||||
current_word_size+=char_width;
|
current_word_size+=char_width;
|
||||||
line_width+=char_width;
|
line_width+=char_width;
|
||||||
total_char_cache++;
|
total_char_cache++;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((autowrap && line_width>=width && last_width<width) || insert_newline) {
|
if ((autowrap && line_width>=width && (last && last->char_pos >= 0 || not_latin)) || insert_newline) {
|
||||||
|
if (not_latin) {
|
||||||
|
if (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-char_width;
|
||||||
|
wc->char_pos=word_pos;
|
||||||
|
wc->word_len=i-word_pos;
|
||||||
|
wc->space_count = space_count;
|
||||||
|
current_word_size=char_width;
|
||||||
|
space_count=0;
|
||||||
|
word_pos=i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WordCache *wc = memnew( WordCache );
|
WordCache *wc = memnew( WordCache );
|
||||||
if (word_cache) {
|
if (word_cache) {
|
||||||
|
@ -441,12 +467,10 @@ void Label::regenerate_word_cache() {
|
||||||
|
|
||||||
line_width=current_word_size;
|
line_width=current_word_size;
|
||||||
line_count++;
|
line_count++;
|
||||||
|
space_count=0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
last_width=line_width;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//total_char_cache -= line_count + 1; // do not count new lines (including the first one)
|
//total_char_cache -= line_count + 1; // do not count new lines (including the first one)
|
||||||
|
|
|
@ -75,8 +75,9 @@ private:
|
||||||
int char_pos; // if -1, then newline
|
int char_pos; // if -1, then newline
|
||||||
int word_len;
|
int word_len;
|
||||||
int pixel_width;
|
int pixel_width;
|
||||||
|
int space_count;
|
||||||
WordCache *next;
|
WordCache *next;
|
||||||
WordCache() { char_pos=0; word_len=0; pixel_width=0; next=0; }
|
WordCache() { char_pos=0; word_len=0; pixel_width=0; next=0; space_count=0;}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool word_cache_dirty;
|
bool word_cache_dirty;
|
||||||
|
|
Loading…
Reference in a new issue