diff options
Diffstat (limited to 'scripts/touchup_for_web.py')
-rwxr-xr-x | scripts/touchup_for_web.py | 73 |
1 files changed, 63 insertions, 10 deletions
diff --git a/scripts/touchup_for_web.py b/scripts/touchup_for_web.py index 7879d9e..108807a 100755 --- a/scripts/touchup_for_web.py +++ b/scripts/touchup_for_web.py @@ -24,9 +24,14 @@ from nototools import font_data import temporary_touchups -def apply_web_specific_fixes(font, family_name): +def apply_web_specific_fixes(font, unhinted, family_name): """Apply fixes needed for web fonts.""" - # Set OS/2 table values to old values + + # set vertical metrics to old values + hhea = font['hhea'] + hhea.ascent = 1900 + hhea.descent = -500 + os2 = font['OS/2'] os2.sTypoAscender = 1536 os2.sTypoDescender = -512 @@ -34,6 +39,12 @@ def apply_web_specific_fixes(font, family_name): os2.usWinAscent = 1946 os2.usWinDescent = 512 + # correct anything else needed for both web and Chrome OS + apply_web_cros_common_fixes(font, unhinted, family_name) + + +def apply_web_cros_common_fixes(font, unhinted, family_name): + """Apply fixes needed for web and CrOS targets""" subfamily_name = font_data.get_name_records(font)[2].encode('ASCII') assert(subfamily_name in ['Thin', 'Thin Italic', @@ -45,7 +56,9 @@ def apply_web_specific_fixes(font, family_name): if 'Condensed' in font_data.get_name_records(font)[1]: family_name += ' Condensed' - full_name = family_name + ' ' + subfamily_name + full_name = family_name + if subfamily_name != 'Regular': + full_name += ' ' + subfamily_name # Family, subfamily names font_data.set_name_record(font, 16, family_name) @@ -54,8 +67,15 @@ def apply_web_specific_fixes(font, family_name): font_data.set_name_record(font, 1, family_name) else: weight = subfamily_name.split()[0] - font_data.set_name_record(font, 1, '%s %s' % (family_name, weight)) - font_data.set_name_record(font, 2, style_map[macStyle]) + new_family_name = family_name + if weight != 'Regular': + new_family_name += ' ' + weight + font_data.set_name_record(font, 1, new_family_name) + + # all weights outside regular and bold should only have subfamily + # "Regular" or "Italic" + italic = subfamily_name.endswith('Italic') + font_data.set_name_record(font, 2, style_map[italic << 1]) # Unique identifier and full name font_data.set_name_record(font, 3, full_name) @@ -66,18 +86,51 @@ def apply_web_specific_fixes(font, family_name): font_data.set_name_record( font, 6, (family_name+'-'+subfamily_name).replace(' ', '')) + # Copyright message + font_data.set_name_record( + font, 0, 'Copyright 2011 Google Inc. All Rights Reserved.') + + # hotpatch glyphs by swapping + # https://github.com/google/roboto/issues/18 + glyf = font['glyf'] + glyf['chi'], glyf['chi.alt'] = glyf['chi.alt'], glyf['chi'] -def correct_font(source_font_name, target_font_name, family_name): + # make glyph orders consistent for feature copying + # https://github.com/google/roboto/issues/71 + glyph_order = font.getGlyphOrder() + for i, glyph_name in enumerate(glyph_order): + if glyph_name.endswith('.lnum'): + new_name = glyph_name.replace('.lnum', '.pnum') + glyph_order[i] = new_name + font['glyf'][new_name] = font['glyf'][glyph_name] + + # append old name to glyph order so del succeeds + glyph_order.append(glyph_name) + del font['glyf'][glyph_name] + + # copy features from unhinted + # https://github.com/google/roboto/pull/163 + for table in ['GDEF', 'GPOS', 'GSUB']: + font[table] = unhinted[table] + + +def correct_font(source_name, unhinted_name, target_font_name, family_name): """Corrects metrics and other meta information.""" - font = ttLib.TTFont(source_font_name) - temporary_touchups.apply_temporary_fixes(font) - apply_web_specific_fixes(font, family_name) + + font = ttLib.TTFont(source_name) + unhinted = ttLib.TTFont(unhinted_name) + + # apply web-specific fixes before shared, so that sub/family names are + # correct for black weights and their bold bits will be set + apply_web_specific_fixes(font, unhinted, family_name) + temporary_touchups.apply_temporary_fixes(font, is_for_web=True) + temporary_touchups.update_version_and_revision(font) font.save(target_font_name) def main(argv): """Correct the font specified in the command line.""" - correct_font(argv[1], argv[2], argv[3]) + correct_font(*argv[1:]) if __name__ == "__main__": |