Skip to content

Commit

Permalink
name-parser: Fill short and long name as TypoFamily
Browse files Browse the repository at this point in the history
[why]
This sets out to circumvent a problem with VisualStudio 2022. That
application seems to have problems with fonts when the ID16 is not a
prefix in ID1.

We have this when --makegroups >= 4, because

ID1  has the short name suffix 'NF'
ID16 has the long suffix 'Nerd Font'

These fonts can be selected in VisualStudio 2022, and the preview works
ok, but once active some replacement default font is used instead.

The problem vanishes if ID16 and ID1 have the same stem, or rather ID1
has someting added on top of ID16; but ID16 is a substring of ID1.

See more discussions in #1442

[how]
Write both forms in ID16 fields, 'NF' and 'Nerd Font' suffixes. This
works as long as the application considers all languages equal.

Signed-off-by: Fini Jastrow <ulf.fini.jastrow@desy.de>
  • Loading branch information
Finii committed Nov 27, 2023
1 parent ef669f8 commit 5cffe3f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
21 changes: 18 additions & 3 deletions bin/scripts/name_parser/FontnameParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,9 +180,18 @@ def psname(self):
sub = FontnameTools.postscript_char_filter(sub)
return self._make_ps_name(fam + sub, False)

def preferred_family(self):
def preferred_family(self, short_alternative = False):
"""Get the SFNT Preferred Familyname (ID 16)"""
# When short_alternative we get the short named alternative needed for some Windows applications
(name, rest) = self._shortened_name()
if short_alternative:
other = self.other_token
if self.use_short_families[1]:
[ other ] = FontnameTools.short_styles([ other ], self.use_short_families[2])
pfn = FontnameTools.concat(name, rest, other, self.short_family_suff)
if pfn == self.preferred_family(False):
return ''
return pfn
pfn = FontnameTools.concat(name, rest, self.other_token, self.family_suff)
if self.suppress_preferred_if_identical and pfn == self.family():
# Do not set if identical to ID 1
Expand Down Expand Up @@ -231,7 +240,7 @@ def subfamily(self):

def ps_familyname(self):
"""Get the PS Familyname"""
fam = self.preferred_family()
fam = self.preferred_family(False)
if len(fam) < 1:
fam = self.family()
return self._make_ps_name(fam, True)
Expand Down Expand Up @@ -350,12 +359,18 @@ def rename_font(self, font):
sfnt_list += [( 'English (US)', 'Fullname', self.checklen(63, 'Fullname (ID 4)', self.fullname()) )] # 4
sfnt_list += [( 'English (US)', 'PostScriptName', self.checklen(63, 'PSN (ID 6)', self.psname()) )] # 6

p_fam = self.preferred_family()
p_fam = self.preferred_family(False)
if len(p_fam):
sfnt_list += [( 'English (US)', 'Preferred Family', self.checklen(31, 'PrefFamily (ID 16)', p_fam) )] # 16
p_fam = self.preferred_family(True)
if len(p_fam):
sfnt_list += [( 'English (British)', 'Preferred Family', self.checklen(31, 'PrefFamily (ID 16)', p_fam) )]
p_sty = self.preferred_styles()
if len(p_sty):
sfnt_list += [( 'English (US)', 'Preferred Styles', self.checklen(31, 'PrefStyles (ID 17)', p_sty) )] # 17
if len(p_fam):
# Set only if ID16 for British has been set
sfnt_list += [( 'English (British)', 'Preferred Styles', self.checklen(31, 'PrefStyles (ID 17)', p_sty) )]

font.sfnt_names = tuple(sfnt_list)

Expand Down
3 changes: 2 additions & 1 deletion font-patcher
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,8 @@ def get_old_average_x_width(font):

def create_filename(fonts):
""" Determine filename from font object(s) """
sfnt = { k: v for l, k, v in fonts[0].sfnt_names }
# Only consider the standard (i.e. English-US) names
sfnt = { k: v for l, k, v in fonts[0].sfnt_names if l == 'English (US)' }
sfnt_pfam = sfnt.get('Preferred Family', sfnt['Family'])
sfnt_psubfam = sfnt.get('Preferred Styles', sfnt['SubFamily'])
if len(fonts) > 1:
Expand Down

0 comments on commit 5cffe3f

Please sign in to comment.