forked from bartvdbraak/blender
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:
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user