[Bf-blender-cvs] [d3c653c6d92] master: BLF: Revert FreeType Cache

Harley Acheson noreply at git.blender.org
Tue Aug 9 05:33:53 CEST 2022


Commit: d3c653c6d927728b565b86252d96c6be2805d06d
Author: Harley Acheson
Date:   Mon Aug 8 20:31:55 2022 -0700
Branches: master
https://developer.blender.org/rBd3c653c6d927728b565b86252d96c6be2805d06d

BLF: Revert FreeType Cache

Remove the FreeType cache implementation. Not multithreading correctly.

Original commit: 9d77b5a0ed7b

See D15647 for more details.

Differential Revision: https://developer.blender.org/D15647

Own Code.

===================================================================

M	source/blender/blenfont/intern/blf_font.c
M	source/blender/blenfont/intern/blf_glyph.c
M	source/blender/blenfont/intern/blf_internal.h
M	source/blender/blenfont/intern/blf_internal_types.h

===================================================================

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 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list