@@ -625,14 +625,17 @@ smart_font_rep::smart_font_rep (string name, font base_fn, font err_fn,
625625 fn[SUBFONT_MAIN ] = adjust_subfont (base_fn);
626626 fn[SUBFONT_ERROR ]= adjust_subfont (err_fn);
627627 this ->copy_math_pars (base_fn);
628+ family_tokens = trimmed_tokenize (family, " ," );
629+ given_font = logical_font (family, variant, series, rshape);
630+ italic_prime_cached= false ;
628631 if (shape == " mathitalic" || shape == " mathupright" || shape == " mathshape" ) {
629632 if (is_math_family (mfam)) {
630633 rshape= " right" ;
631634 if (shape == " mathupright" ) this ->copy_math_pars (base_fn);
632635 else {
633636 tree key= tuple (" math" , mfam, variant, series, rshape);
634637 int nr = sm->add_font (key, REWRITE_MATH );
635- initialize_font (nr);
638+ maybe_initialize_font (nr);
636639 this ->copy_math_pars (fn[nr]);
637640 fn[SUBFONT_MAIN ]= fn[nr];
638641 }
@@ -645,7 +648,7 @@ smart_font_rep::smart_font_rep (string name, font base_fn, font err_fn,
645648 if (math_kind == 2 ) this ->copy_math_pars (base_fn);
646649 else {
647650 italic_nr= sm->add_font (tuple (" fast-italic" ), REWRITE_NONE );
648- initialize_font (italic_nr);
651+ maybe_initialize_font (italic_nr);
649652 this ->copy_math_pars (fn[italic_nr]);
650653 }
651654 (void ) sm->add_font (tuple (" special" ), REWRITE_SPECIAL );
@@ -836,7 +839,7 @@ smart_font_rep::advance (string s, int& pos, string& r, int& nr) {
836839 }
837840
838841 if (count == 1 && nr != -1 && fn_index == nr) {
839- if ( N (fn) <= nr || is_nil (fn[nr])) initialize_font (nr);
842+ maybe_initialize_font (nr);
840843 if (!fn[nr]->supports (s (start, end))) break ;
841844 pos= end;
842845 }
@@ -851,7 +854,7 @@ smart_font_rep::advance (string s, int& pos, string& r, int& nr) {
851854 }
852855 r= s (start, pos);
853856 if (nr < 0 ) return ;
854- if ( N (fn) <= nr || is_nil (fn[nr])) initialize_font (nr);
857+ maybe_initialize_font (nr);
855858 if (sm->fn_rewr [nr] != REWRITE_NONE ) r= rewrite (r, sm->fn_rewr [nr]);
856859 }
857860 if (DEBUG_VERBOSE ) {
@@ -911,10 +914,9 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
911914 }
912915 array<string> a= trimmed_tokenize (fam, " =" );
913916 if (N (a) >= 2 ) {
914- array<string> given= logical_font (family, variant, series, rshape);
915- fam = a[1 ];
916- array<string> b = tokenize (a[0 ], " " );
917- bool ok = is_wanted (c, fam, b, given);
917+ fam = a[1 ];
918+ array<string> b = tokenize (a[0 ], " " );
919+ bool ok= is_wanted (c, fam, b, given_font);
918920 if (!ok) {
919921 return -1 ;
920922 }
@@ -930,7 +932,7 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
930932 if (cfn->supports (c)) {
931933 tree key= tuple (" subfont" , fam);
932934 int nr = sm->add_font (key, REWRITE_NONE );
933- initialize_font (nr);
935+ maybe_initialize_font (nr);
934936 return sm->add_char (key, c);
935937 }
936938 }
@@ -957,41 +959,41 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
957959 if (cfn->supports (c) || c == " <#200B>" ) {
958960 tree key= tuple (fam, variant, series, rshape, " 1" );
959961 int nr = sm->add_font (key, REWRITE_NONE );
960- initialize_font (nr);
962+ maybe_initialize_font (nr);
961963 return sm->add_char (key, c);
962964 }
963965 }
964966
965967 if (fam == " roman" && range == " greek" ) {
966968 tree key= tuple (" greek" , fam, variant, series, rshape);
967969 int nr = sm->add_font (key, REWRITE_NONE );
968- initialize_font (nr);
970+ maybe_initialize_font (nr);
969971 return sm->add_char (key, c);
970972 }
971973 if (fam == " roman" && range == " latin" ) {
972974 tree key= tuple (" latin" , fam, variant, series, rshape);
973975 int nr = sm->add_font (key, REWRITE_NONE );
974- initialize_font (nr);
976+ maybe_initialize_font (nr);
975977 return sm->add_char (key, c);
976978 }
977979 if (is_math_family (fam)) {
978980 tree key= tuple (" math" , fam, variant, series, rshape);
979981 int nr = sm->add_font (key, REWRITE_MATH );
980- initialize_font (nr);
982+ maybe_initialize_font (nr);
981983 if (fn[nr]->supports (rewrite (c, REWRITE_MATH )))
982984 return sm->add_char (key, c);
983985 }
984986 if ((fam == " roman" || fam == " cyrillic" ) && N (c) > 1 ) {
985987 tree key= tuple (" cyrillic" , fam, variant, series, rshape);
986988 int nr = sm->add_font (key, REWRITE_CYRILLIC );
987- initialize_font (nr);
989+ maybe_initialize_font (nr);
988990 if (fn[nr]->supports (rewrite (c, REWRITE_CYRILLIC )))
989991 return sm->add_char (key, c);
990992 }
991993 if (c == " <#3000>" ) {
992994 tree key= tuple (" ignore" );
993995 int nr = sm->add_font (key, REWRITE_IGNORE );
994- initialize_font (nr);
996+ maybe_initialize_font (nr);
995997 return sm->add_char (key, c);
996998 }
997999 if (N (c) == 7 && starts (c, " <bbb-" ) && !occurs (" TeX Gyre" , mfam)) {
@@ -1009,14 +1011,14 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
10091011 vw = max (vw, 0.25 * lw);
10101012 tree key = tuple (" poor-bbb" , as_string (hw), as_string (vw));
10111013 int nr = sm->add_font (key, REWRITE_POOR_BBB );
1012- initialize_font (nr);
1014+ maybe_initialize_font (nr);
10131015 return sm->add_char (key, c);
10141016 }
10151017 }
10161018 if (starts (c, " <it-" ) && ends (c, " >" )) {
10171019 tree key= tuple (" it" );
10181020 int nr = sm->add_font (key, REWRITE_ITALIC );
1019- initialize_font (nr);
1021+ maybe_initialize_font (nr);
10201022 return sm->add_char (key, c);
10211023 }
10221024 if (fam == mfam && !is_italic_font (mfam)) {
@@ -1025,7 +1027,7 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
10251027 if (virtually_defined (c, emu_names[i])) {
10261028 tree key= tuple (" emulate" , emu_names[i]);
10271029 int nr = sm->add_font (key, REWRITE_NONE );
1028- initialize_font (nr);
1030+ maybe_initialize_font (nr);
10291031 if (fn[nr]->supports (c)) return sm->add_char (key, c);
10301032 }
10311033 }
@@ -1045,7 +1047,7 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
10451047 if (cfn->supports (c) || c == " <#200B>" ) {
10461048 tree key= tuple (fam, v, series, rshape, as_string (a));
10471049 int nr = sm->add_font (key, REWRITE_NONE );
1048- initialize_font (nr);
1050+ maybe_initialize_font (nr);
10491051 return sm->add_char (key, c);
10501052 }
10511053 }
@@ -1056,12 +1058,18 @@ smart_font_rep::resolve (string c, string fam, int attempt) {
10561058bool
10571059smart_font_rep::is_italic_prime (string c) {
10581060 if (c != " '" && c != " `" ) return false ;
1059- array<string> a= trimmed_tokenize (family, " , " ) ;
1060- string s= " <#2B9>" ;
1061+ if (italic_prime_cached) return italic_prime_result ;
1062+ string s= " <#2B9>" ;
10611063 if (c == " `" ) s= " <backprime>" ;
1062- for (int i= 0 ; i < N (a); i++)
1063- if (resolve (s, a[i], 1 ) >= 0 ) return false ;
1064- return true ;
1064+ bool result= true ;
1065+ for (int i= 0 ; i < N (family_tokens); i++)
1066+ if (resolve (s, family_tokens[i], 1 ) >= 0 ) {
1067+ result= false ;
1068+ break ;
1069+ }
1070+ italic_prime_cached= true ;
1071+ italic_prime_result= result;
1072+ return result;
10651073}
10661074
10671075extern bool has_poor_rubber;
@@ -1079,7 +1087,7 @@ smart_font_rep::resolve_rubber (string c, string fam, int attempt) {
10791087 if (goal == " ." || goal == " <nobracket>" ) {
10801088 tree key= tuple (" ignore" );
10811089 int nr = sm->add_font (key, REWRITE_IGNORE );
1082- initialize_font (nr);
1090+ maybe_initialize_font (nr);
10831091 return sm->add_char (key, c);
10841092 }
10851093 if (has_poor_rubber) {
@@ -1101,7 +1109,7 @@ smart_font_rep::resolve_rubber (string c, string fam, int attempt) {
11011109 if (bnr >= 0 && bnr < N (fn) && !is_nil (fn[bnr])) {
11021110 tree key= tuple (" rubber" , as_string (bnr));
11031111 int nr = sm->add_font (key, REWRITE_NONE );
1104- initialize_font (nr);
1112+ maybe_initialize_font (nr);
11051113 // cout << fn[nr]->res_name << " supports " << c << "? "
11061114 // << fn[nr]->supports (c) << LF;
11071115 if (fn[nr]->supports (c)) return sm->add_char (key, c);
@@ -1138,7 +1146,7 @@ smart_font_rep::resolve (string c) {
11381146 debug_fonts << " Main subfont of " << cork_to_utf8 (c) << " is "
11391147 << fn[SUBFONT_MAIN ]->res_name << LF ;
11401148 }
1141- array<string> a= trimmed_tokenize (family, " , " ) ;
1149+ array<string> a= family_tokens ;
11421150
11431151 // Special handling for emoji characters - bypass font-family restrictions
11441152 string range= get_unicode_range (c);
@@ -1167,7 +1175,7 @@ smart_font_rep::resolve (string c) {
11671175 if (!is_nil (cfn) && cfn->supports (c)) {
11681176 tree key= tuple (" emoji-font" , parts[1 ]);
11691177 int nr = sm->add_font (key, REWRITE_NONE );
1170- initialize_font (nr);
1178+ maybe_initialize_font (nr);
11711179 return sm->add_char (key, c);
11721180 }
11731181 }
@@ -1179,22 +1187,22 @@ smart_font_rep::resolve (string c) {
11791187 if (upc != " " && fn[SUBFONT_MAIN ]->supports (upc)) {
11801188 tree key= tuple (" up" );
11811189 int nr = sm->add_font (key, REWRITE_UPRIGHT );
1182- initialize_font (nr);
1190+ maybe_initialize_font (nr);
11831191 return sm->add_char (key, c);
11841192 }
11851193 string ugc= substitute_upright_greek (c);
11861194 if (ugc != " " && fn[SUBFONT_MAIN ]->supports (ugc)) {
11871195 tree key= tuple (" upright-greek" );
11881196 int nr = sm->add_font (key, REWRITE_UPRIGHT_GREEK );
1189- initialize_font (nr);
1197+ maybe_initialize_font (nr);
11901198 return sm->add_char (key, c);
11911199 }
11921200 if (is_greek (c) && use_italic_greek (a) && shape != " mathupright" ) {
11931201 string gc= substitute_italic_greek (c);
11941202 if (gc != " " && fn[SUBFONT_MAIN ]->supports (gc)) {
11951203 tree key= tuple (" italic-greek" );
11961204 int nr = sm->add_font (key, REWRITE_ITALIC_GREEK );
1197- initialize_font (nr);
1205+ maybe_initialize_font (nr);
11981206 return sm->add_char (key, c);
11991207 }
12001208 // cout << "Found " << c << " in greek\n";
@@ -1371,7 +1379,7 @@ smart_font_rep::initialize_font (int nr) {
13711379 fn[nr] = poor_bbb_font (sfn, pw, ph, 1.5 * pw);
13721380 }
13731381 else if (a[0 ] == " rubber" && N (a) == 2 && is_int (a[1 ])) {
1374- initialize_font (as_int (a[1 ]));
1382+ maybe_initialize_font (as_int (a[1 ]));
13751383 fn[nr]= adjust_subfont (rubber_font (fn[as_int (a[1 ])]));
13761384 // fn[nr]= adjust_subfont (rubber_unicode_font (fn[as_int (a[1])]));
13771385 }
@@ -1388,6 +1396,11 @@ smart_font_rep::initialize_font (int nr) {
13881396 }
13891397}
13901398
1399+ void
1400+ smart_font_rep::maybe_initialize_font (int nr) {
1401+ if (N (fn) <= nr || is_nil (fn[nr])) initialize_font (nr);
1402+ }
1403+
13911404static int
13921405get_ex (string family, string variant, string series, string shape,
13931406 int attempt) {
0 commit comments