optimization for text drawing:

- dont set the color for each character, check if it changes from the previous one.
- dont memcpy text into a null terminated string to draw, instead rely on the length argument to BLF_draw().
This commit is contained in:
Campbell Barton 2012-12-30 15:40:49 +00:00
parent 3de85a8797
commit e54b95d1c9

@ -77,26 +77,17 @@ static int text_font_draw(SpaceText *UNUSED(st), int x, int y, const char *str)
static int text_font_draw_character(SpaceText *st, int x, int y, char c) static int text_font_draw_character(SpaceText *st, int x, int y, char c)
{ {
char str[2];
str[0] = c;
str[1] = '\0';
BLF_position(mono, x, y, 0); BLF_position(mono, x, y, 0);
BLF_draw(mono, str, 1); BLF_draw(mono, &c, 1);
return st->cwidth; return st->cwidth;
} }
static int text_font_draw_character_utf8(SpaceText *st, int x, int y, const char *c) static int text_font_draw_character_utf8(SpaceText *st, int x, int y, const char *c)
{ {
char str[BLI_UTF8_MAX + 1]; const size_t len = BLI_str_utf8_size_safe(c);
size_t len = BLI_str_utf8_size_safe(c);
memcpy(str, c, len);
str[len] = '\0';
BLF_position(mono, x, y, 0); BLF_position(mono, x, y, 0);
BLF_draw(mono, str, len); BLF_draw(mono, c, len);
return st->cwidth; return st->cwidth;
} }
@ -365,6 +356,7 @@ static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w
FlattenString fs; FlattenString fs;
int basex, i, a, start, end, max, lines; /* view */ int basex, i, a, start, end, max, lines; /* view */
int mi, ma, mstart, mend; /* mem */ int mi, ma, mstart, mend; /* mem */
char fmt_prev = 0xff;
flatten_string(st, &fs, str); flatten_string(st, &fs, str);
str = fs.buf; str = fs.buf;
@ -388,7 +380,9 @@ static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w
/* Draw the visible portion of text on the overshot line */ /* Draw the visible portion of text on the overshot line */
for (a = start, ma = mstart; a < end; a++, ma += BLI_str_utf8_size_safe(str + ma)) { for (a = start, ma = mstart; a < end; a++, ma += BLI_str_utf8_size_safe(str + ma)) {
if (st->showsyntax && format) format_draw_color(format[a]); if (st->showsyntax && format) {
if (fmt_prev != format[a]) format_draw_color(fmt_prev = format[a]);
}
x += text_font_draw_character_utf8(st, x, y, str + ma); x += text_font_draw_character_utf8(st, x, y, str + ma);
} }
y -= st->lheight_dpi + TXT_LINE_SPACING; y -= st->lheight_dpi + TXT_LINE_SPACING;
@ -406,8 +400,9 @@ static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w
/* Draw the remaining text */ /* Draw the remaining text */
for (a = start, ma = mstart; str[ma] && y > 0; a++, ma += BLI_str_utf8_size_safe(str + ma)) { for (a = start, ma = mstart; str[ma] && y > 0; a++, ma += BLI_str_utf8_size_safe(str + ma)) {
if (st->showsyntax && format) if (st->showsyntax && format) {
format_draw_color(format[a]); if (fmt_prev != format[a]) format_draw_color(fmt_prev = format[a]);
}
x += text_font_draw_character_utf8(st, x, y, str + ma); x += text_font_draw_character_utf8(st, x, y, str + ma);
} }
@ -438,15 +433,18 @@ static int text_draw(SpaceText *st, char *str, int cshift, int maxwidth, int dra
if (st->showsyntax && format) { if (st->showsyntax && format) {
int a, str_shift = 0; int a, str_shift = 0;
char fmt_prev = 0xff;
format = format + cshift; format = format + cshift;
for (a = 0; a < amount; a++) { for (a = 0; a < amount; a++) {
format_draw_color(format[a]); if (format[a] != fmt_prev) format_draw_color(fmt_prev = format[a]);
x += text_font_draw_character_utf8(st, x, y, in + str_shift); x += text_font_draw_character_utf8(st, x, y, in + str_shift);
str_shift += BLI_str_utf8_size_safe(in + str_shift); str_shift += BLI_str_utf8_size_safe(in + str_shift);
} }
} }
else text_font_draw(st, x, y, in); else {
text_font_draw(st, x, y, in);
}
} }
else { else {
while (w-- && *acc++ < maxwidth) while (w-- && *acc++ < maxwidth)