Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenfont/intern/blf_font.c')
-rw-r--r--source/blender/blenfont/intern/blf_font.c118
1 files changed, 73 insertions, 45 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index fb6505fe935..8a71c3de86b 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -97,17 +97,58 @@ void blf_font_size(FontBLF *font, int size, int dpi)
}
}
+static void blf_font_ensure_ascii_table(FontBLF *font)
+{
+ /* build ascii on demand */
+ if(font->glyph_cache->glyph_ascii_table['0']==NULL) {
+ GlyphBLF **glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
+ GlyphBLF *g;
+ unsigned int i;
+ for(i=0; i<256; i++) {
+ g= blf_glyph_search(font->glyph_cache, i);
+ if (!g) {
+ FT_UInt glyph_index= FT_Get_Char_Index(font->face, i);
+ g= blf_glyph_add(font, glyph_index, i);
+ }
+ glyph_ascii_table[i]= g;
+ }
+ }
+}
+
+/* Fast path for runs of ASCII characters. Given that common UTF-8
+ * input will consist of an overwhelming majority of ASCII
+ * characters.
+ */
+
+/* Note,
+ * blf_font_ensure_ascii_table(font); must be called before this macro */
+
+#define BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table) \
+ if(((c)= (str)[i]) < 0x80) { \
+ g= glyph_ascii_table[c]; \
+ i++; \
+ } \
+ else if ((c= blf_utf8_next((unsigned char *)(str), &(i)))) { \
+ if ((g= blf_glyph_search((font)->glyph_cache, c)) == NULL) { \
+ g= blf_glyph_add(font, FT_Get_Char_Index((font)->face, c), c); \
+ } \
+ } \
+
+
+
void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
{
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
i= 0;
pen_x= 0;
@@ -115,17 +156,15 @@ void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
+ blf_font_ensure_ascii_table(font);
+
while (str[i] && i < len) {
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -157,32 +196,23 @@ void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
char c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
pen_x= 0;
pen_y= 0;
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
- /* build ascii on demand */
- if(font->glyph_ascii_table['0']==NULL) {
- for(i=0; i<256; i++) {
- g= blf_glyph_search(font->glyph_cache, i);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, i);
- g= blf_glyph_add(font, glyph_index, i);
- }
- font->glyph_ascii_table[i]= g;
- }
- }
-
+ blf_font_ensure_ascii_table(font);
+
while ((c= *(str++)) && len--) {
- g= font->glyph_ascii_table[c];
+ g= font->glyph_cache->glyph_ascii_table[c];
/* if we don't found a glyph, skip it. */
if (!g)
@@ -216,13 +246,15 @@ void blf_font_buffer(FontBLF *font, const char *str)
unsigned char b_col_char[4];
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
float a, *fbuf;
int pen_x, y, x;
- int i, has_kerning, st, chx, chy;
+ int has_kerning, st, chx, chy;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache || (!font->b_fbuf && !font->b_cbuf))
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
i= 0;
pen_x= (int)font->pos[0];
@@ -234,18 +266,16 @@ void blf_font_buffer(FontBLF *font, const char *str)
b_col_char[2]= font->b_col[2] * 255;
b_col_char[3]= font->b_col[3] * 255;
+ blf_font_ensure_ascii_table(font);
+
while (str[i]) {
int pen_y;
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -363,13 +393,15 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
unsigned int c;
GlyphBLF *g, *g_prev;
FT_Vector delta;
- FT_UInt glyph_index;
rctf gbox;
int pen_x, pen_y;
- int i, has_kerning, st;
+ int has_kerning, st;
+ unsigned int i;
+ GlyphBLF **glyph_ascii_table;
if (!font->glyph_cache)
return;
+ glyph_ascii_table= font->glyph_cache->glyph_ascii_table;
box->xmin= 32000.0f;
box->xmax= -32000.0f;
@@ -382,17 +414,15 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
has_kerning= FT_HAS_KERNING(font->face);
g_prev= NULL;
+ blf_font_ensure_ascii_table(font);
+
while (str[i]) {
- c= blf_utf8_next((unsigned char *)str, &i);
+
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
+
if (c == 0)
break;
- g= blf_glyph_search(font->glyph_cache, c);
- if (!g) {
- glyph_index= FT_Get_Char_Index(font->face, c);
- g= blf_glyph_add(font, glyph_index, c);
- }
-
/* if we don't found a glyph, skip it. */
if (!g)
continue;
@@ -534,7 +564,7 @@ void blf_font_free(FontBLF *font)
static void blf_font_fill(FontBLF *font)
{
- int i;
+ unsigned int i;
font->aspect[0]= 1.0f;
font->aspect[1]= 1.0f;
@@ -568,8 +598,6 @@ static void blf_font_fill(FontBLF *font)
font->b_col[2]= 0;
font->b_col[3]= 0;
font->ft_lib= ft_lib;
-
- memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
}
FontBLF *blf_font_new(const char *name, const char *filename)