diff options
Diffstat (limited to 'source/blender/blenfont/intern/blf_glyph.c')
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 0d694c28b2b..c36496fb542 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -36,10 +36,12 @@ #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_OUTLINE_H +#include FT_BITMAP_H #include "MEM_guardedalloc.h" #include "DNA_vec_types.h" +#include "DNA_userdef_types.h" #include "BLI_blenlib.h" @@ -49,6 +51,7 @@ #include "blf_internal_types.h" #include "blf_internal.h" +FT_Library global_ft_lib; GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi) { @@ -113,6 +116,23 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) return(gc); } +void blf_glyph_cache_clear(FontBLF *font) +{ + GlyphCacheBLF *gc; + GlyphBLF *g; + int i; + + for(gc=font->cache.first; gc; gc=gc->next) { + for (i= 0; i < 257; i++) { + while (gc->bucket[i].first) { + g= gc->bucket[i].first; + BLI_remlink(&(gc->bucket[i]), g); + blf_glyph_free(g); + } + } + } +} + void blf_glyph_cache_free(GlyphCacheBLF *gc) { GlyphBLF *g; @@ -190,7 +210,8 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c) FT_GlyphSlot slot; GlyphBLF *g; FT_Error err; - FT_Bitmap bitmap; + FT_Bitmap bitmap, tempbitmap; + int sharp = (U.text_render & USER_TEXT_DISABLE_AA); FT_BBox bbox; unsigned int key; @@ -198,14 +219,29 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c) if (g) return(g); - err= FT_Load_Glyph(font->face, index, FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP); + if (sharp) + err = FT_Load_Glyph(font->face, index, FT_LOAD_TARGET_MONO); + else + err = FT_Load_Glyph(font->face, index, FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP); /* Sure about NO_* flags? */ if (err) return(NULL); /* get the glyph. */ slot= font->face->glyph; - err= FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); + if (sharp) { + err = FT_Render_Glyph(slot, FT_RENDER_MODE_MONO); + + /* Convert result from 1 bit per pixel to 8 bit per pixel */ + /* Accum errors for later, fine if not interested beyond "ok vs any error" */ + FT_Bitmap_New(&tempbitmap); + err += FT_Bitmap_Convert(global_ft_lib, &slot->bitmap, &tempbitmap, 1); /* Does Blender use Pitch 1 always? It works so far */ + err += FT_Bitmap_Copy(global_ft_lib, &tempbitmap, &slot->bitmap); + err += FT_Bitmap_Done(global_ft_lib, &tempbitmap); + } else { + err = FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL); + } + if (err || slot->format != FT_GLYPH_FORMAT_BITMAP) return(NULL); @@ -228,6 +264,14 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c) g->height= bitmap.rows; if (g->width && g->height) { + if (sharp) { + /* Font buffer uses only 0 or 1 values, Blender expects full 0..255 range */ + int i; + for (i=0; i < (g->width * g->height); i++) { + bitmap.buffer[i] = 255 * bitmap.buffer[i]; + } + } + g->bitmap= (unsigned char *)MEM_mallocN(g->width * g->height, "glyph bitmap"); memcpy((void *)g->bitmap, (void *)bitmap.buffer, g->width * g->height); } |