fix for changing font sizes with recent utf8 speedup
authorCampbell Barton <ideasman42@gmail.com>
Mon, 12 Sep 2011 09:12:34 +0000 (09:12 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 12 Sep 2011 09:12:34 +0000 (09:12 +0000)
source/blender/blenfont/intern/blf_font.c
source/blender/blenfont/intern/blf_glyph.c
source/blender/blenfont/intern/blf_internal_types.h

index 52aace1d3d7af74488a3142e392caa899015d621..8a71c3de86b0481330bcbbfb730e9c4fc473a401 100644 (file)
@@ -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)
index e165012f43e2c304dde9b7c309430b77b3e92cbf..9b39cb65cba607058c1f3f78beadef10924b0090 100644 (file)
@@ -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)
index c4e192626e870f08b56166f062c42e6dc90166b1..9840e6446ef1c53be327d7adaf62dafefabf22ef 100644 (file)
@@ -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;