[Bf-blender-cvs] [c4b73847d31] master: BLF: Remove Thread Locking For Font Metrics

Harley Acheson noreply at git.blender.org
Tue Nov 2 22:28:33 CET 2021


Commit: c4b73847d31add1a433acba8423982b288c8e7d9
Author: Harley Acheson
Date:   Tue Nov 2 14:27:29 2021 -0700
Branches: master
https://developer.blender.org/rBc4b73847d31add1a433acba8423982b288c8e7d9

BLF: Remove Thread Locking For Font Metrics

This patch removes the need to lock the thread just to get to some
generic (not glyph-specific) font metrics.

See D12976 for more details.

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

Reviewed by Campbell Barton

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

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
M	source/blender/blenfont/intern/blf_thumbs.c

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

diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 90c8d6357de..a2c778fcf16 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -34,6 +34,7 @@
 
 #include FT_FREETYPE_H
 #include FT_GLYPH_H
+#include FT_ADVANCES_H /* For FT_Get_Advance */
 
 #include "MEM_guardedalloc.h"
 
@@ -824,22 +825,7 @@ float blf_font_height(FontBLF *font,
 
 float blf_font_fixed_width(FontBLF *font)
 {
-  const unsigned int c = ' ';
-
-  GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-  GlyphBLF *g = blf_glyph_search(gc, c);
-  if (!g) {
-    g = blf_glyph_ensure(font, gc, FT_Get_Char_Index(font->face, c));
-
-    /* if we don't find the glyph. */
-    if (!g) {
-      blf_glyph_cache_release(font);
-      return 0.0f;
-    }
-  }
-
-  blf_glyph_cache_release(font);
-  return g->advance;
+  return (float)font->fixed_width;
 }
 
 static void blf_font_boundbox_foreach_glyph_ex(FontBLF *font,
@@ -991,7 +977,7 @@ static void blf_font_wrap_apply(FontBLF *font,
       wrap.start = wrap.last[0];
       i = wrap.last[1];
       pen_x = 0;
-      pen_y -= gc->glyph_height_max;
+      pen_y -= blf_font_height_max(font);
       g_prev = NULL;
       lines += 1;
       continue;
@@ -1114,45 +1100,41 @@ int blf_font_count_missing_chars(FontBLF *font,
 int blf_font_height_max(FontBLF *font)
 {
   int height_max;
-
-  GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-  height_max = gc->glyph_height_max;
-
-  blf_glyph_cache_release(font);
-  return height_max;
+  if (FT_IS_SCALABLE(font->face)) {
+    height_max = (int)((float)(font->face->ascender - font->face->descender) *
+                       (((float)font->face->size->metrics.y_ppem) /
+                        ((float)font->face->units_per_EM)));
+  }
+  else {
+    height_max = (int)(((float)font->face->size->metrics.height) / 64.0f);
+  }
+  /* can happen with size 1 fonts */
+  return MAX2(height_max, 1);
 }
 
 int blf_font_width_max(FontBLF *font)
 {
   int width_max;
-
-  GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-  width_max = gc->glyph_width_max;
-
-  blf_glyph_cache_release(font);
-  return width_max;
+  if (FT_IS_SCALABLE(font->face)) {
+    width_max = (int)((float)(font->face->bbox.xMax - font->face->bbox.xMin) *
+                      (((float)font->face->size->metrics.x_ppem) /
+                       ((float)font->face->units_per_EM)));
+  }
+  else {
+    width_max = (int)(((float)font->face->size->metrics.max_advance) / 64.0f);
+  }
+  /* can happen with size 1 fonts */
+  return MAX2(width_max, 1);
 }
 
 float blf_font_descender(FontBLF *font)
 {
-  float descender;
-
-  GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-  descender = gc->descender;
-
-  blf_glyph_cache_release(font);
-  return descender;
+  return ((float)font->face->size->metrics.descender) / 64.0f;
 }
 
 float blf_font_ascender(FontBLF *font)
 {
-  float ascender;
-
-  GlyphCacheBLF *gc = blf_glyph_cache_acquire(font);
-  ascender = gc->ascender;
-
-  blf_glyph_cache_release(font);
-  return ascender;
+  return ((float)font->face->size->metrics.ascender) / 64.0f;
 }
 
 char *blf_display_name(FontBLF *font)
@@ -1383,6 +1365,22 @@ void blf_font_size(FontBLF *font, unsigned int size, unsigned int dpi)
   }
 
   blf_glyph_cache_release(font);
+
+  /* Set fixed-width size for monospaced output. */
+  FT_UInt gindex = FT_Get_Char_Index(font->face, U'0');
+  if (gindex) {
+    FT_Fixed advance = 0;
+    FT_Get_Advance(font->face, gindex, FT_LOAD_NO_HINTING, &advance);
+    /* Use CSS 'ch unit' width, advance of zero character. */
+    font->fixed_width = (int)(advance >> 16);
+  }
+  else {
+    /* Font does not contain "0" so use CSS fallback of 1/2 of em. */
+    font->fixed_width = (int)((font->face->size->metrics.height / 2) >> 6);
+  }
+  if (font->fixed_width < 1) {
+    font->fixed_width = 1;
+  }
 }
 
 /** \} */
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index 9170a1c0ac4..c4ffb3f87f1 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -86,27 +86,6 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
   memset(gc->glyph_ascii_table, 0, sizeof(gc->glyph_ascii_table));
   memset(gc->bucket, 0, sizeof(gc->bucket));
 
-  gc->ascender = ((float)font->face->size->metrics.ascender) / 64.0f;
-  gc->descender = ((float)font->face->size->metrics.descender) / 64.0f;
-
-  if (FT_IS_SCALABLE(font->face)) {
-    gc->glyph_width_max = (int)((float)(font->face->bbox.xMax - font->face->bbox.xMin) *
-                                (((float)font->face->size->metrics.x_ppem) /
-                                 ((float)font->face->units_per_EM)));
-
-    gc->glyph_height_max = (int)((float)(font->face->bbox.yMax - font->face->bbox.yMin) *
-                                 (((float)font->face->size->metrics.y_ppem) /
-                                  ((float)font->face->units_per_EM)));
-  }
-  else {
-    gc->glyph_width_max = (int)(((float)font->face->size->metrics.max_advance) / 64.0f);
-    gc->glyph_height_max = (int)(((float)font->face->size->metrics.height) / 64.0f);
-  }
-
-  /* can happen with size 1 fonts */
-  CLAMP_MIN(gc->glyph_width_max, 1);
-  CLAMP_MIN(gc->glyph_height_max, 1);
-
   BLI_addhead(&font->cache, gc);
   return gc;
 }
@@ -159,7 +138,7 @@ void blf_glyph_cache_free(GlyphCacheBLF *gc)
   MEM_freeN(gc);
 }
 
-GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
+static GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, unsigned int c)
 {
   GlyphBLF *p;
   unsigned int key;
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index ba871ea2496..a715d5df692 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -139,7 +139,6 @@ void blf_glyph_cache_release(struct FontBLF *font);
 void blf_glyph_cache_clear(struct FontBLF *font);
 void blf_glyph_cache_free(struct GlyphCacheBLF *gc);
 
-struct GlyphBLF *blf_glyph_search(struct GlyphCacheBLF *gc, unsigned int c);
 struct GlyphBLF *blf_glyph_ensure(struct FontBLF *font, struct GlyphCacheBLF *gc, uint charcode);
 
 void blf_glyph_free(struct GlyphBLF *g);
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index e90f82da7f3..aae666fa182 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -86,13 +86,6 @@ typedef struct GlyphCacheBLF {
   int bitmap_len_landed;
   int bitmap_len_alloc;
 
-  /* and the bigger glyph in the font. */
-  int glyph_width_max;
-  int glyph_height_max;
-
-  /* ascender and descender value. */
-  float ascender;
-  float descender;
 } GlyphCacheBLF;
 
 typedef struct GlyphBLF {
@@ -214,6 +207,9 @@ typedef struct FontBLF {
   /* font size. */
   unsigned int size;
 
+  /* Column width when printing monospaced. */
+  int fixed_width;
+
   /* max texture size. */
   int tex_size_max;
 
diff --git a/source/blender/blenfont/intern/blf_thumbs.c b/source/blender/blenfont/intern/blf_thumbs.c
index 3153a55b697..12a83f7634e 100644
--- a/source/blender/blenfont/intern/blf_thumbs.c
+++ b/source/blender/blenfont/intern/blf_thumbs.c
@@ -106,7 +106,7 @@ void BLF_thumb_preview(const char *filename,
     font_size_curr -= (font_size_curr / font_shrink);
     font_shrink += 1;
 
-    font->pos[1] -= gc->ascender * 1.1f;
+    font->pos[1] -= blf_font_ascender(font) * 1.1f;
 
     /* We fallback to default english strings in case not enough chars are available in current
      * font for given translated string (useful in non-latin i18n context, like Chinese,



More information about the Bf-blender-cvs mailing list