X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fopen-type-font.cc;h=730d6cef3580cef522f924b503b4ee9c51f85d55;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=e4fb5d5d988a585266884076bc40c727dc943ef3;hpb=fa2596b6ec273e7d82907f97acf0c65559b3c1b4;p=lilypond.git diff --git a/lily/open-type-font.cc b/lily/open-type-font.cc index e4fb5d5d98..730d6cef35 100644 --- a/lily/open-type-font.cc +++ b/lily/open-type-font.cc @@ -185,8 +185,53 @@ get_postscript_name (FT_Face face) ret = cffname; else { - warning (_f ("cannot get font %s CFF name", face_ps_name.c_str ())); - ret = face_ps_name; + // FreeType 2.6 and 2.6.1 cannot get PS name from pure-CFF. + // (FreeType 2.5.5 and earlier does not have this issue. + // FreeType 2.6.2+ has this bug fixed.) + // So we need direct parsing of the 'CFF' table, in this case. + + debug_output (_f ("Directly parsing 'CFF' table of font %s.", + face_ps_name.c_str ())); + + // See Adobe technote '5176.CFF.pdf', sections 2 and 5-7. + size_t hdrsize = static_cast(cff_table.at(2)); + string::iterator it = cff_table.begin () + hdrsize; + + unsigned int name_index_count; + name_index_count = static_cast(*it++) << 8; + name_index_count |= static_cast(*it++); + + size_t offsize = static_cast(*it++); + + if (name_index_count && 1 <= offsize && offsize <= 4) + { + // We get the first name in the CFF's name index + // because this CFF (derived from OTF and OTC) + // has only one name. + size_t off1 = 0, off2 = 0; + for (size_t t = 0; t < offsize; t++) + off1 = ( off1 << 8 ) | static_cast(*it++); + if (off1) + { + for (size_t t = 0; t < offsize; t++) + off2 = ( off2 << 8 ) | static_cast(*it++); + } + if (off1 && off1 < off2) + { + ret.assign (&cff_table.at(hdrsize + 3 + + offsize * (name_index_count + 1) + + off1 - 1), + &cff_table.at(hdrsize + 3 + + offsize * (name_index_count + 1) + + off2 - 1)); + } + } + + if (ret.empty ()) + { + warning (_f ("cannot get font %s CFF name", face_ps_name.c_str ())); + ret = face_ps_name; + } } debug_output (_f ("Replace font name from %s to %s.", @@ -206,13 +251,17 @@ Open_type_font::make_otf (const string &str) return otf->self_scm (); } -Open_type_font::Open_type_font (FT_Face face) +Preinit_Open_type_font::Preinit_Open_type_font () { - face_ = face; lily_character_table_ = SCM_EOL; lily_global_table_ = SCM_EOL; lily_subfonts_ = SCM_EOL; lily_index_to_bbox_table_ = SCM_EOL; +} + +Open_type_font::Open_type_font (FT_Face face) +{ + face_ = face; lily_character_table_ = alist_to_hashq (load_scheme_table ("LILC", face_)); lily_global_table_ = alist_to_hashq (load_scheme_table ("LILY", face_)); @@ -220,6 +269,8 @@ Open_type_font::Open_type_font (FT_Face face) index_to_charcode_map_ = make_index_to_charcode_map (face_); lily_index_to_bbox_table_ = scm_c_make_hash_table (257); + + postscript_name_ = get_postscript_name (face_); } void @@ -399,7 +450,7 @@ Open_type_font::get_global_table () const string Open_type_font::font_name () const { - return FT_Get_Postscript_Name (face_); + return postscript_name_; } SCM