Index: third_party/harfbuzz-ng/src/hb-ft.cc |
diff --git a/third_party/harfbuzz-ng/src/hb-ft.cc b/third_party/harfbuzz-ng/src/hb-ft.cc |
index 2cad8c2649572c64c460ceca9158dead2656dc1c..eaa1311d445fb2d033267efbe2800d0395d9f4d6 100644 |
--- a/third_party/harfbuzz-ng/src/hb-ft.cc |
+++ b/third_party/harfbuzz-ng/src/hb-ft.cc |
@@ -70,11 +70,12 @@ struct hb_ft_font_t |
{ |
FT_Face ft_face; |
int load_flags; |
+ bool symbol; /* Whether selected cmap is symbol cmap. */ |
bool unref; /* Whether to destroy ft_face when done. */ |
}; |
static hb_ft_font_t * |
-_hb_ft_font_create (FT_Face ft_face, bool unref) |
+_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) |
{ |
hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t)); |
@@ -82,6 +83,7 @@ _hb_ft_font_create (FT_Face ft_face, bool unref) |
return NULL; |
ft_font->ft_face = ft_face; |
+ ft_font->symbol = symbol; |
ft_font->unref = unref; |
ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; |
@@ -90,10 +92,16 @@ _hb_ft_font_create (FT_Face ft_face, bool unref) |
} |
static void |
+_hb_ft_face_destroy (FT_Face ft_face) |
+{ |
+ FT_Done_Face (ft_face); |
+} |
+ |
+static void |
_hb_ft_font_destroy (hb_ft_font_t *ft_font) |
{ |
if (ft_font->unref) |
- FT_Done_Face (ft_font->ft_face); |
+ _hb_ft_face_destroy (ft_font->ft_face); |
free (ft_font); |
} |
@@ -165,7 +173,21 @@ hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED, |
unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode); |
if (unlikely (!g)) |
- return false; |
+ { |
+ if (unlikely (ft_font->symbol) && unicode <= 0x00FFu) |
+ { |
+ /* For symbol-encoded OpenType fonts, we duplicate the |
+ * U+F000..F0FF range at U+0000..U+00FF. That's what |
+ * Windows seems to do, and that's hinted about at: |
+ * http://www.microsoft.com/typography/otspec/recom.htm |
+ * under "Non-Standard (Symbol) Fonts". */ |
+ g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode); |
+ if (!g) |
+ return false; |
+ } |
+ else |
+ return false; |
+ } |
*glyph = g; |
return true; |
@@ -444,9 +466,11 @@ retry: |
#endif |
}; |
+ bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL; |
+ |
hb_font_set_funcs (font, |
funcs, |
- _hb_ft_font_create (ft_face, unref), |
+ _hb_ft_font_create (ft_face, symbol, unref), |
(hb_destroy_func_t) _hb_ft_font_destroy); |
} |
@@ -526,7 +550,7 @@ hb_face_t * |
hb_ft_face_create_referenced (FT_Face ft_face) |
{ |
FT_Reference_Face (ft_face); |
- return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face); |
+ return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); |
} |
static void |
@@ -606,7 +630,7 @@ hb_font_t * |
hb_ft_font_create_referenced (FT_Face ft_face) |
{ |
FT_Reference_Face (ft_face); |
- return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face); |
+ return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); |
} |
@@ -675,7 +699,8 @@ hb_ft_font_set_funcs (hb_font_t *font) |
return; |
} |
- FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE); |
+ if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE)) |
+ FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL); |
FT_Set_Char_Size (ft_face, |
abs (font->x_scale), abs (font->y_scale), |