diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenfont/intern/blf_font.c | 127 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_glyph.c | 10 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_internal.h | 10 | ||||
-rw-r--r-- | source/blender/blenfont/intern/blf_internal_types.h | 2 |
4 files changed, 28 insertions, 121 deletions
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c index 10e65cd6827..5f904d86b03 100644 --- a/source/blender/blenfont/intern/blf_font.c +++ b/source/blender/blenfont/intern/blf_font.c @@ -17,7 +17,6 @@ #include <ft2build.h> #include FT_FREETYPE_H -#include FT_CACHE_H /* FreeType Cache. */ #include FT_GLYPH_H #include FT_MULTIPLE_MASTERS_H /* Variable font support. */ #include FT_TRUETYPE_IDS_H /* Codepoint coverage constants. */ @@ -56,8 +55,6 @@ BatchBLF g_batch; /* freetype2 handle ONLY for this file! */ static FT_Library ft_lib = NULL; -static FTC_Manager ftc_manager = NULL; -static FTC_CMapCache ftc_charmap_cache = NULL; static SpinLock ft_lib_mutex; static SpinLock blf_glyph_cache_mutex; @@ -69,58 +66,11 @@ static ft_pix blf_font_height_max_ft_pix(struct FontBLF *font); static ft_pix blf_font_width_max_ft_pix(struct FontBLF *font); /* -------------------------------------------------------------------- */ -/** \name FreeType Caching - * \{ */ - -/* Called when a face is removed. FreeType will call FT_Done_Face itself. */ -static void blf_face_finalizer(void *object) -{ - FT_Face face = object; - FontBLF *font = (FontBLF *)face->generic.data; - font->face = NULL; -} - -/* Called in response to FTC_Manager_LookupFace. Add a face to our font. */ -static FT_Error blf_cache_face_requester(FTC_FaceID faceID, - FT_Library lib, - FT_Pointer UNUSED(reqData), - FT_Face *face) -{ - FontBLF *font = (FontBLF *)faceID; - int err = FT_Err_Cannot_Open_Resource; - - BLI_spin_lock(font->ft_lib_mutex); - - if (font->filepath) { - err = FT_New_Face(lib, font->filepath, 0, face); - } - else if (font->mem) { - err = FT_New_Memory_Face(lib, font->mem, (FT_Long)font->mem_size, 0, face); - } - BLI_spin_unlock(font->ft_lib_mutex); - - if (err == FT_Err_Ok) { - font->face = *face; - font->face->generic.data = font; - font->face->generic.finalizer = blf_face_finalizer; - } - - return err; -} - -/* Called when FreeType is removing a font size. */ -static void blf_size_finalizer(void *object) -{ - FT_Size size = object; - FontBLF *font = (FontBLF *)size->generic.data; - font->ft_size = NULL; -} - -/* Use cache, not blf_get_char_index, to return glyph id from charcode. */ +/* Return glyph id from charcode. */ uint blf_get_char_index(struct FontBLF *font, uint charcode) { - return FTC_CMapCache_Lookup(ftc_charmap_cache, font, -1, charcode); + return FT_Get_Char_Index(font->face, charcode); } /* -------------------------------------------------------------------- */ @@ -130,9 +80,6 @@ uint blf_get_char_index(struct FontBLF *font, uint charcode) /* Convert a FreeType 26.6 value representing an unscaled design size to fractional pixels. */ static ft_pix blf_unscaled_F26Dot6_to_pixels(FontBLF *font, FT_Pos value) { - /* Make sure we have a valid font->ft_size. */ - blf_ensure_size(font); - /* Scale value by font size using integer-optimized multiplication. */ FT_Long scaled = FT_MulFix(value, font->ft_size->metrics.x_scale); @@ -1168,7 +1115,6 @@ int blf_font_count_missing_chars(FontBLF *font, static ft_pix blf_font_height_max_ft_pix(FontBLF *font) { - blf_ensure_size(font); /* Metrics.height is rounded to pixel. Force minimum of one pixel. */ return MAX2((ft_pix)font->ft_size->metrics.height, ft_pix_from_int(1)); } @@ -1180,7 +1126,6 @@ int blf_font_height_max(FontBLF *font) static ft_pix blf_font_width_max_ft_pix(FontBLF *font) { - blf_ensure_size(font); /* Metrics.max_advance is rounded to pixel. Force minimum of one pixel. */ return MAX2((ft_pix)font->ft_size->metrics.max_advance, ft_pix_from_int(1)); } @@ -1192,13 +1137,11 @@ int blf_font_width_max(FontBLF *font) int blf_font_descender(FontBLF *font) { - blf_ensure_size(font); return ft_pix_to_int((ft_pix)font->ft_size->metrics.descender); } int blf_font_ascender(FontBLF *font) { - blf_ensure_size(font); return ft_pix_to_int((ft_pix)font->ft_size->metrics.ascender); } @@ -1222,27 +1165,12 @@ int blf_font_init(void) BLI_spin_init(&ft_lib_mutex); BLI_spin_init(&blf_glyph_cache_mutex); int err = FT_Init_FreeType(&ft_lib); - if (err == FT_Err_Ok) { - err = FTC_Manager_New(ft_lib, - BLF_CACHE_MAX_FACES, - BLF_CACHE_MAX_SIZES, - BLF_CACHE_BYTES, - blf_cache_face_requester, - NULL, - &ftc_manager); - if (err == FT_Err_Ok) { - err = FTC_CMapCache_New(ftc_manager, &ftc_charmap_cache); - } - } return err; } void blf_font_exit(void) { BLI_spin_end(&ft_lib_mutex); - if (ftc_manager) { - FTC_Manager_Done(ftc_manager); - } if (ft_lib) { FT_Done_FreeType(ft_lib); } @@ -1324,7 +1252,12 @@ bool blf_ensure_face(FontBLF *font) FT_Error err; - err = FTC_Manager_LookupFace(ftc_manager, font, &font->face); + if (font->filepath) { + err = FT_New_Face(ft_lib, font->filepath, 0, &font->face); + } + if (font->mem) { + err = FT_New_Memory_Face(ft_lib, font->mem, (FT_Long)font->mem_size, 0, &font->face); + } if (err) { if (ELEM(err, FT_Err_Unknown_File_Format, FT_Err_Unimplemented_Feature)) { @@ -1364,6 +1297,7 @@ bool blf_ensure_face(FontBLF *font) } } + font->ft_size = font->face->size; font->face_flags = font->face->face_flags; if (FT_HAS_MULTIPLE_MASTERS(font)) { @@ -1516,7 +1450,7 @@ void blf_font_free(FontBLF *font) } if (font->face) { - FTC_Manager_RemoveFaceID(ftc_manager, font); + FT_Done_Face(font->face); font->face = NULL; } if (font->filepath) { @@ -1534,30 +1468,6 @@ void blf_font_free(FontBLF *font) /** \name Font Configure * \{ */ -bool blf_ensure_size(FontBLF *font) -{ - if (font->ft_size) { - return true; - } - - FTC_ScalerRec scaler = {0}; - scaler.face_id = font; - scaler.width = 0; - scaler.height = round_fl_to_uint(font->size * 64.0f); - scaler.pixel = 0; - scaler.x_res = font->dpi; - scaler.y_res = font->dpi; - - if (FTC_Manager_LookupSize(ftc_manager, &scaler, &font->ft_size) == FT_Err_Ok) { - font->ft_size->generic.data = (void *)font; - font->ft_size->generic.finalizer = blf_size_finalizer; - return true; - } - - BLI_assert_unreachable(); - return false; -} - bool blf_font_size(FontBLF *font, float size, unsigned int dpi) { if (!blf_ensure_face(font)) { @@ -1567,11 +1477,20 @@ bool blf_font_size(FontBLF *font, float size, unsigned int dpi) /* FreeType uses fixed-point integers in 64ths. */ FT_UInt ft_size = round_fl_to_uint(size * 64.0f); /* Adjust our new size to be on even 64ths. */ - font->size = (float)ft_size / 64.0f; - font->dpi = dpi; - font->ft_size = NULL; + size = (float)ft_size / 64.0f; + + if (font->size != size || font->dpi != dpi) { + if (FT_Set_Char_Size(font->face, 0, ft_size, dpi, dpi) == FT_Err_Ok) { + font->size = size; + font->dpi = dpi; + } + else { + printf("The current font does not support the size, %f and DPI, %u\n", size, dpi); + return false; + } + } - return blf_ensure_size(font); + return true; } /** \} */ diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c index 3b73224152f..9cdca81af28 100644 --- a/source/blender/blenfont/intern/blf_glyph.c +++ b/source/blender/blenfont/intern/blf_glyph.c @@ -103,7 +103,6 @@ static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font) } else { /* Font does not have a face or does not contain "0" so use CSS fallback of 1/2 of em. */ - blf_ensure_size(font); gc->fixed_width = (int)((font->ft_size->metrics.height / 2) >> 6); } if (gc->fixed_width < 1) { @@ -788,8 +787,8 @@ static bool blf_glyph_transform_weight(FT_GlyphSlot glyph, float factor, bool mo { if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) { /* Fake bold if the font does not have this variable axis. */ - const FontBLF *font = (FontBLF *)glyph->face->generic.data; - const FT_Pos average_width = font->ft_size->metrics.height; + const FT_Pos average_width = FT_MulFix(glyph->face->units_per_EM, + glyph->face->size->metrics.x_scale); FT_Pos change = (FT_Pos)((float)average_width * factor * 0.1f); FT_Outline_EmboldenXY(&glyph->outline, change, change / 2); if (monospaced) { @@ -848,8 +847,7 @@ static bool blf_glyph_transform_width(FT_GlyphSlot glyph, float factor) static bool blf_glyph_transform_spacing(FT_GlyphSlot glyph, float factor) { if (glyph->advance.x > 0) { - const FontBLF *font = (FontBLF *)glyph->face->generic.data; - const long int size = font->ft_size->metrics.height; + const long int size = glyph->face->size->metrics.height; glyph->advance.x += (FT_Pos)(factor * (float)size / 6.0f); return true; } @@ -901,8 +899,6 @@ static FT_GlyphSlot blf_glyph_render(FontBLF *settings_font, blf_font_size(glyph_font, settings_font->size, settings_font->dpi); } - blf_ensure_size(glyph_font); - /* We need to keep track if changes are still needed. */ bool weight_done = false; bool slant_done = false; diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h index b7dea9d5ef5..221e656f096 100644 --- a/source/blender/blenfont/intern/blf_internal.h +++ b/source/blender/blenfont/intern/blf_internal.h @@ -16,14 +16,7 @@ struct rcti; /* Max number of FontBLFs in memory. Take care that every font has a glyph cache per size/dpi, * so we don't need load the same font with different size, just load one and call BLF_size. */ -#define BLF_MAX_FONT 64 - -/* Maximum number of opened FT_Face objects managed by cache. 0 is default of 2. */ -#define BLF_CACHE_MAX_FACES 0 -/* Maximum number of opened FT_Size objects managed by cache. 0 is default of 4 */ -#define BLF_CACHE_MAX_SIZES 0 -/* Maximum number of bytes to use for cached data nodes. 0 is default of 200,000. */ -#define BLF_CACHE_BYTES 0 +#define BLF_MAX_FONT 32 extern struct FontBLF *global_font[BLF_MAX_FONT]; @@ -49,7 +42,6 @@ bool blf_font_id_is_valid(int fontid); uint blf_get_char_index(struct FontBLF *font, uint charcode); bool blf_ensure_face(struct FontBLF *font); -bool blf_ensure_size(struct FontBLF *font); void blf_draw_buffer__start(struct FontBLF *font); void blf_draw_buffer__end(void); diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h index 007b717ab93..3064630de1b 100644 --- a/source/blender/blenfont/intern/blf_internal_types.h +++ b/source/blender/blenfont/intern/blf_internal_types.h @@ -329,7 +329,7 @@ typedef struct FontBLF { /* freetype2 face. */ FT_Face face; - /* FreeType size is separated from face when using their caching subsystem. */ + /* Point to face->size or to cache's size. */ FT_Size ft_size; /* Copy of the font->face->face_flags, in case we don't have a face loaded. */ |