[merge] Move more code to merge.cmap

This commit is contained in:
Behdad Esfahbod 2021-12-16 10:22:28 -07:00
parent 3bb1c5b58f
commit 8ee5f26731
3 changed files with 21 additions and 20 deletions

View File

@ -68,7 +68,7 @@ class Merger(object):
#
fonts = [ttLib.TTFont(fontfile) for fontfile in fontfiles]
glyphOrders = [font.getGlyphOrder() for font in fonts]
megaGlyphOrder = self._mergeGlyphOrders(glyphOrders)
megaGlyphOrder = computeMegaGlyphOrder(self, glyphOrders)
# Take first input file sfntVersion
sfntVersion = fonts[0].sfntVersion
@ -99,7 +99,7 @@ class Merger(object):
self.fonts = fonts
self.duplicateGlyphsPerFont = [{} for _ in fonts]
compute_mega_cmap(self, [font['cmap'] for font in fonts])
computeMegaCmap(self, [font['cmap'] for font in fonts])
allTags = reduce(set.union, (list(font.keys()) for font in fonts), set())
allTags.remove('GlyphOrder')
@ -129,22 +129,6 @@ class Merger(object):
return mega
def _mergeGlyphOrders(self, glyphOrders):
"""Modifies passed-in glyphOrders to reflect new glyph names.
Returns glyphOrder for the merged font."""
mega = {}
for glyphOrder in glyphOrders:
for i,glyphName in enumerate(glyphOrder):
if glyphName in mega:
n = mega[glyphName]
while (glyphName + "#" + repr(n)) in mega:
n += 1
mega[glyphName] = n
glyphName += "#" + repr(n)
glyphOrder[i] = glyphName
mega[glyphName] = 1
return list(mega.keys())
def _renameCFFCharStrings(self, glyphOrder, cffTable):
"""Rename topDictIndex charStrings based on glyphOrder."""
td = cffTable.cff.topDictIndex[0]

View File

@ -279,7 +279,7 @@ def merge(self, m, tables):
# TODO Handle format=14.
if not hasattr(m, 'cmap'):
compute_mega_cmap(m, tables)
computeMegaCmap(m, tables)
cmap = m.cmap
cmapBmpOnly = {uni: gid for uni,gid in cmap.items() if uni <= 0xFFFF}

View File

@ -10,6 +10,23 @@ import logging
log = logging.getLogger("fontTools.merge")
def computeMegaGlyphOrder(merger, glyphOrders):
"""Modifies passed-in glyphOrders to reflect new glyph names.
Returns glyphOrder for the merged font."""
mega = {}
for glyphOrder in glyphOrders:
for i,glyphName in enumerate(glyphOrder):
if glyphName in mega:
n = mega[glyphName]
while (glyphName + "#" + repr(n)) in mega:
n += 1
mega[glyphName] = n
glyphName += "#" + repr(n)
glyphOrder[i] = glyphName
mega[glyphName] = 1
return list(mega.keys())
def _glyphsAreSame(glyphSet1, glyphSet2, glyph1, glyph2,
advanceTolerance=.05,
advanceToleranceEmpty=.20):
@ -40,7 +57,7 @@ class CmapUnicodePlatEncodings:
FullRepertoire = {(12, 3, 10), (12, 0, 4), (12, 0, 6)}
def compute_mega_cmap(merger, tables):
def computeMegaCmap(merger, tables):
# TODO Handle format=14.
# Only merge format 4 and 12 Unicode subtables, ignores all other subtables
# If there is a format 12 table for a font, ignore the format 4 table of it