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:
authorCampbell Barton <ideasman42@gmail.com>2011-09-12 13:12:34 +0400
committerCampbell Barton <ideasman42@gmail.com>2011-09-12 13:12:34 +0400
commit156e96762b64eae7bc10d1ef58130107777ddb11 (patch)
tree6dddc1e70408967a2c5e43489e82155eb781e426 /source/blender/blenfont
parentd9894af95085fb9f1d3baafc3a76fc6ba6081cfd (diff)
fix for changing font sizes with recent utf8 speedup
Diffstat (limited to 'source/blender/blenfont')
-rw-r--r--source/blender/blenfont/intern/blf_font.c27
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c11
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h6
3 files changed, 25 insertions, 19 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 52aace1d3d7..8a71c3de86b 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -100,7 +100,8 @@ 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_ascii_table['0']==NULL) {
+ 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++) {
@@ -109,7 +110,7 @@ static void blf_font_ensure_ascii_table(FontBLF *font)
FT_UInt glyph_index= FT_Get_Char_Index(font->face, i);
g= blf_glyph_add(font, glyph_index, i);
}
- font->glyph_ascii_table[i]= g;
+ glyph_ascii_table[i]= g;
}
}
}
@@ -122,9 +123,9 @@ static void blf_font_ensure_ascii_table(FontBLF *font)
/* Note,
* blf_font_ensure_ascii_table(font); must be called before this macro */
-#define BLF_UTF8_NEXT_FAST(font, g, str, i, c) \
+#define BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table) \
if(((c)= (str)[i]) < 0x80) { \
- g= (font)->glyph_ascii_table[c]; \
+ g= glyph_ascii_table[c]; \
i++; \
} \
else if ((c= blf_utf8_next((unsigned char *)(str), &(i)))) { \
@@ -143,9 +144,11 @@ void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
int pen_x, pen_y;
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;
@@ -157,7 +160,7 @@ void blf_font_draw(FontBLF *font, const char *str, unsigned int len)
while (str[i] && i < len) {
- BLF_UTF8_NEXT_FAST(font, g, str, i, c);
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
if (c == 0)
break;
@@ -195,9 +198,11 @@ void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
FT_Vector delta;
int pen_x, pen_y;
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;
@@ -207,7 +212,7 @@ void blf_font_draw_ascii(FontBLF *font, const char *str, unsigned int len)
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)
@@ -245,9 +250,11 @@ void blf_font_buffer(FontBLF *font, const char *str)
int pen_x, y, x;
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];
@@ -264,7 +271,7 @@ void blf_font_buffer(FontBLF *font, const char *str)
while (str[i]) {
int pen_y;
- BLF_UTF8_NEXT_FAST(font, g, str, i, c);
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
if (c == 0)
break;
@@ -390,9 +397,11 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
int pen_x, pen_y;
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;
@@ -409,7 +418,7 @@ void blf_font_boundbox(FontBLF *font, const char *str, rctf *box)
while (str[i]) {
- BLF_UTF8_NEXT_FAST(font, g, str, i, c);
+ BLF_UTF8_NEXT_FAST(font, g, str, i, c, glyph_ascii_table);
if (c == 0)
break;
@@ -589,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)
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index e165012f43e..9b39cb65cba 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -74,7 +74,6 @@ GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
{
GlyphCacheBLF *gc;
- int i;
gc= (GlyphCacheBLF *)MEM_mallocN(sizeof(GlyphCacheBLF), "blf_glyph_cache_new");
gc->next= NULL;
@@ -82,10 +81,8 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
gc->size= font->size;
gc->dpi= font->dpi;
- for (i= 0; i < 257; i++) {
- gc->bucket[i].first= NULL;
- gc->bucket[i].last= NULL;
- }
+ memset(gc->glyph_ascii_table, 0, sizeof(gc->glyph_ascii_table));
+ memset(gc->bucket, 0, sizeof(gc->bucket));
gc->textures= (GLuint *)malloc(sizeof(GLuint)*256);
gc->ntex= 256;
@@ -136,7 +133,9 @@ void blf_glyph_cache_clear(FontBLF *font)
}
}
- memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
+ if(font->glyph_cache) {
+ memset(font->glyph_cache->glyph_ascii_table, 0, sizeof(font->glyph_cache->glyph_ascii_table));
+ }
}
void blf_glyph_cache_free(GlyphCacheBLF *gc)
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index c4e192626e8..9840e6446ef 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -46,6 +46,9 @@ typedef struct GlyphCacheBLF {
/* and the glyphs. */
ListBase bucket[257];
+ /* fast ascii lookup */
+ struct GlyphBLF *glyph_ascii_table[256];
+
/* texture array, to draw the glyphs. */
GLuint *textures;
@@ -184,9 +187,6 @@ typedef struct FontBLF {
/* current glyph cache, size and dpi. */
GlyphCacheBLF *glyph_cache;
-
- /* fast ascii lookip */
- GlyphBLF *glyph_ascii_table[256];
/* freetype2 lib handle. */
FT_Library ft_lib;