summaryrefslogtreecommitdiff
path: root/scene/gui
diff options
context:
space:
mode:
authorGen <z.rz2323721@gmail.com>2015-05-01 18:47:34 +0800
committerGen <z.rz2323721@gmail.com>2015-05-01 18:47:34 +0800
commit0bc5b7a1464b442a9e54cd05c9720d1d53693ee1 (patch)
treee6ce607f91dae49311a93a01cb2bd8d4ca31a9fb /scene/gui
parentc322eddffb6ac9abc709cfdc7bdc4466bdb7b80a (diff)
Optimize the code.
Diffstat (limited to 'scene/gui')
-rw-r--r--scene/gui/label.cpp97
1 files changed, 31 insertions, 66 deletions
diff --git a/scene/gui/label.cpp b/scene/gui/label.cpp
index 38e7435aeb..1751d335ee 100644
--- a/scene/gui/label.cpp
+++ b/scene/gui/label.cpp
@@ -360,11 +360,10 @@ void Label::regenerate_word_cache() {
int width=autowrap?get_size().width:get_longest_line_width();
Ref<Font> font = get_font("font");
-
+
int current_word_size=0;
int word_pos=0;
int line_width=0;
- int last_width=0;
int space_count=0;
int space_width=font->get_char_size(' ').width;
line_count=1;
@@ -375,14 +374,16 @@ void Label::regenerate_word_cache() {
for (int i=0;i<text.size()+1;i++) {
CharType current=i<text.length()?text[i]:' '; //always a space at the end, so the algo works
-
+
if (uppercase)
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;
-
+ int char_width;
+
if (current<33) {
-
+
if (current_word_size>0) {
WordCache *wc = memnew( WordCache );
if (word_cache) {
@@ -391,16 +392,16 @@ void Label::regenerate_word_cache() {
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=='\n') {
insert_newline=true;
@@ -419,73 +420,39 @@ void Label::regenerate_word_cache() {
}
- }else if ((current < 65||current >90) && (current<97||current>122) && (current<48||current>57)) {
- 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;
- wc->char_pos=word_pos;
- wc->word_len=i-word_pos;
- wc->space_count = space_count;
- current_word_size=0;
- space_count=0;
- }
- float current_width = font->get_char_size(current).width;
- if ((autowrap && line_width+current_width>=width && last_width<width)) {
-
- WordCache *wc = memnew( WordCache );
- if (word_cache) {
- last->next=wc;
- } else {
- word_cache=wc;
- }
- last=wc;
-
- wc->pixel_width=0;
- wc->char_pos=WordCache::CHAR_WRAPLINE;
-
- line_width=0;
- line_count++;
-
-
- }
- WordCache *wc = memnew( WordCache );
- if (word_cache) {
- last->next=wc;
- } else {
- word_cache=wc;
- }
- last=wc;
-
- wc->pixel_width=current_width;
- wc->char_pos=i;
- wc->word_len=1;
- wc->space_count=space_count;
- current_word_size=0;
- space_count=0;
- total_char_cache++;
- line_width+=wc->pixel_width;
} else {
// latin characters
if (current_word_size==0) {
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;
line_width+=char_width;
total_char_cache++;
}
- if ((autowrap && line_width>=width && last && last->char_pos >= 0) || 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 );
if (word_cache) {
@@ -500,12 +467,10 @@ void Label::regenerate_word_cache() {
line_width=current_word_size;
line_count++;
-
+ space_count=0;
}
- last_width=line_width;
-
}
//total_char_cache -= line_count + 1; // do not count new lines (including the first one)