macOS: Fix automatic detection of bold/italic faces for fonts that use the family name as the full face name of the regular font not working
Fixes #3861
This commit is contained in:
parent
aa8156a7fd
commit
41c0343d33
@ -60,6 +60,10 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
|
|||||||
|
|
||||||
- Allow leading or trailing spaces in :opt:`tab_activity_symbol`
|
- Allow leading or trailing spaces in :opt:`tab_activity_symbol`
|
||||||
|
|
||||||
|
- macOS: Fix automatic detection of bold/italic faces for fonts that
|
||||||
|
use the family name as the full face name of the regular font not working
|
||||||
|
(:iss:`3861`)
|
||||||
|
|
||||||
|
|
||||||
0.21.2 [2021-06-28]
|
0.21.2 [2021-06-28]
|
||||||
----------------------
|
----------------------
|
||||||
|
|||||||
@ -56,7 +56,7 @@ def find_font_features(postscript_name: str) -> Tuple[FontFeature, ...]:
|
|||||||
return ()
|
return ()
|
||||||
|
|
||||||
|
|
||||||
def find_best_match(family: str, bold: bool = False, italic: bool = False) -> CoreTextFont:
|
def find_best_match(family: str, bold: bool = False, italic: bool = False, ignore_face: Optional[CoreTextFont] = None) -> CoreTextFont:
|
||||||
q = re.sub(r'\s+', ' ', family.lower())
|
q = re.sub(r'\s+', ' ', family.lower())
|
||||||
font_map = all_fonts_map()
|
font_map = all_fonts_map()
|
||||||
|
|
||||||
@ -75,7 +75,9 @@ def find_best_match(family: str, bold: bool = False, italic: bool = False) -> Co
|
|||||||
for selector in ('ps_map', 'full_map'):
|
for selector in ('ps_map', 'full_map'):
|
||||||
candidates = font_map[selector].get(q)
|
candidates = font_map[selector].get(q)
|
||||||
if candidates:
|
if candidates:
|
||||||
return sorted(candidates, key=score)[-1]
|
possible = sorted(candidates, key=score)[-1]
|
||||||
|
if possible != ignore_face:
|
||||||
|
return possible
|
||||||
|
|
||||||
# Let CoreText choose the font if the family exists, otherwise
|
# Let CoreText choose the font if the family exists, otherwise
|
||||||
# fallback to Menlo
|
# fallback to Menlo
|
||||||
@ -96,12 +98,14 @@ def resolve_family(f: str, main_family: str, bold: bool = False, italic: bool =
|
|||||||
|
|
||||||
def get_font_files(opts: Options) -> Dict[str, CoreTextFont]:
|
def get_font_files(opts: Options) -> Dict[str, CoreTextFont]:
|
||||||
ans: Dict[str, CoreTextFont] = {}
|
ans: Dict[str, CoreTextFont] = {}
|
||||||
for (bold, italic), attr in attr_map.items():
|
for (bold, italic) in sorted(attr_map):
|
||||||
face = find_best_match(resolve_family(getattr(opts, attr), opts.font_family, bold, italic), bold, italic)
|
attr = attr_map[(bold, italic)]
|
||||||
key = {(False, False): 'medium',
|
key = {(False, False): 'medium',
|
||||||
(True, False): 'bold',
|
(True, False): 'bold',
|
||||||
(False, True): 'italic',
|
(False, True): 'italic',
|
||||||
(True, True): 'bi'}[(bold, italic)]
|
(True, True): 'bi'}[(bold, italic)]
|
||||||
|
ignore_face = None if key == 'medium' else ans['medium']
|
||||||
|
face = find_best_match(resolve_family(getattr(opts, attr), opts.font_family, bold, italic), bold, italic, ignore_face=ignore_face)
|
||||||
ans[key] = face
|
ans[key] = face
|
||||||
if key == 'medium':
|
if key == 'medium':
|
||||||
setattr(get_font_files, 'medium_family', face['family'])
|
setattr(get_font_files, 'medium_family', face['family'])
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user