#!/usr/bin/env python3 # # Copyright 2014 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Modify an emoji font to map legacy PUA characters to standard ligatures.""" __author__ = 'roozbeh@google.com (Roozbeh Pournader)' import sys from fontTools import ttLib from nototools import font_data import add_emoji_gsub def get_glyph_name_from_gsub(char_seq, font): """Find the glyph name for ligature of a given character sequence from GSUB. """ cmap = font_data.get_cmap(font) # FIXME: So many assumptions are made here. try: first_glyph = cmap[char_seq[0]] rest_of_glyphs = [cmap[ch] for ch in char_seq[1:]] except KeyError: return None for lookup in font['GSUB'].table.LookupList.Lookup: ligatures = lookup.SubTable[0].ligatures try: for ligature in ligatures[first_glyph]: if ligature.Component == rest_of_glyphs: return ligature.LigGlyph except KeyError: continue return None def add_pua_cmap(source_file, target_file): """Add PUA characters to the cmap of the first font and save as second.""" font = ttLib.TTFont(source_file) cmap = font_data.get_cmap(font) for pua, (ch1, ch2) in (list(add_emoji_gsub.EMOJI_KEYCAPS.items()) + list(add_emoji_gsub.EMOJI_FLAGS.items())): if pua not in cmap: glyph_name = get_glyph_name_from_gsub([ch1, ch2], font) if glyph_name is not None: cmap[pua] = glyph_name font.save(target_file) def main(argv): """Save the first font given to the second font.""" add_pua_cmap(argv[1], argv[2]) if __name__ == '__main__': main(sys.argv)