diff --git a/src/font.c b/src/font.c index 0c9e752e08..2031cc8eca 100644 --- a/src/font.c +++ b/src/font.c @@ -665,6 +665,7 @@ font_prop_validate_otf (Lisp_Object prop, Lisp_Object val) /* The order of the above entries must match with enum font_property_index. */ { SYMBOL_INDEX (QClang), font_prop_validate_symbol }, + { SYMBOL_INDEX (QCpostscriptname), font_prop_validate_symbol }, { SYMBOL_INDEX (QCscript), font_prop_validate_symbol }, { SYMBOL_INDEX (QCotf), font_prop_validate_otf } }; @@ -4129,6 +4130,10 @@ DEFUN ("font-get", Ffont_get, Sfont_get, 2, 2, 0, if (fontp->driver->combining_capability) val = fontp->driver->combining_capability (fontp); } + else if (EQ (key, QCpostscriptname)) { + if (fontp->driver->postscriptname) + val = fontp->driver->postscriptname (fontp); + } } else val = Fcdr (val); @@ -5376,6 +5381,7 @@ syms_of_font (void) DEFSYM (QCavgwidth, ":avgwidth"); DEFSYM (QCfont_entity, ":font-entity"); DEFSYM (QCcombining_capability, ":combining-capability"); + DEFSYM (QCpostscriptname, ":postscriptname"); /* Symbols representing values of font spacing property. */ DEFSYM (Qc, "c"); diff --git a/src/font.h b/src/font.h index 8614e7fa10..5e15ef4457 100644 --- a/src/font.h +++ b/src/font.h @@ -692,6 +692,7 @@ #define FONT_INVALID_CODE 0xFFFFFFFF GSUB and GPOS are lists of the form ((SCRIPT (LANGSYS FEATURE ...) ...) ...) */ Lisp_Object (*otf_capability) (struct font *font); + Lisp_Object (*postscriptname) (struct font *font); /* Optional. Apply FONT's OTF-FEATURES to the glyph string. @@ -893,6 +894,7 @@ valid_font_driver (struct font_driver const *d) #ifdef HAVE_HARFBUZZ extern Lisp_Object hbfont_otf_capability (struct font *); +extern Lisp_Object hbfont_postscriptname (struct font *); extern Lisp_Object hbfont_shape (Lisp_Object, Lisp_Object); extern Lisp_Object hbfont_combining_capability (struct font *); #endif diff --git a/src/ftcrfont.c b/src/ftcrfont.c index a0e18e13cf..365671b036 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c @@ -621,6 +621,7 @@ syms_of_ftcrfont_for_pdumper (void) ftcrhbfont_driver.list = ftcrhbfont_list; ftcrhbfont_driver.match = ftcrhbfont_match; ftcrhbfont_driver.otf_capability = hbfont_otf_capability; + ftcrhbfont_driver.postscriptname = hbfont_postscriptname; ftcrhbfont_driver.shape = hbfont_shape; ftcrhbfont_driver.combining_capability = hbfont_combining_capability; ftcrhbfont_driver.begin_hb_font = ftcrhbfont_begin_hb_font; diff --git a/src/hbfont.c b/src/hbfont.c index 576c5fe7f6..7587d933cc 100644 --- a/src/hbfont.c +++ b/src/hbfont.c @@ -212,6 +212,31 @@ hbfont_otf_features (hb_face_t *face, hb_tag_t table_tag) return scripts; } +Lisp_Object +hbfont_postscriptname (struct font *font) +{ + double position_unit; + hb_font_t *hb_font + = font->driver->begin_hb_font + ? font->driver->begin_hb_font (font, &position_unit) + : NULL; + if (!hb_font) + return Qnil; + + hb_face_t *face = hb_font_get_face (hb_font); + + // Postscript name + unsigned int text_size = 127; + char *text = xmalloc (text_size * sizeof (char)); + hb_ot_name_get_utf8 (face, 6, NULL, &text_size, text); + Lisp_Object psname = make_unibyte_string (text, text_size); + + if (font->driver->end_hb_font) + font->driver->end_hb_font (font, hb_font); + + return psname; +} + Lisp_Object hbfont_otf_capability (struct font *font) {