[CFF2ToCFF] Clean up dicts and privates

This commit is contained in:
Behdad Esfahbod 2024-05-24 16:53:51 -06:00
parent 1076f2c558
commit 9943a109e8

View File

@ -2,7 +2,13 @@
from fontTools.ttLib import TTFont, newTable from fontTools.ttLib import TTFont, newTable
from fontTools.misc.cliTools import makeOutputFileName from fontTools.misc.cliTools import makeOutputFileName
from fontTools.cffLib import TopDictIndex, buildOrder, topDictOperators from fontTools.cffLib import (
TopDictIndex,
buildOrder,
buildDefaults,
topDictOperators,
privateDictOperators,
)
from .width import optimizeWidths from .width import optimizeWidths
from collections import defaultdict from collections import defaultdict
import logging import logging
@ -38,10 +44,30 @@ def _convertCFF2ToCFF(cff, otFont):
opOrder = buildOrder(topDictOperators) opOrder = buildOrder(topDictOperators)
topDict.order = opOrder topDict.order = opOrder
for key in topDict.rawDict.keys():
if key not in opOrder:
del topDict.rawDict[key]
if hasattr(topDict, key):
delattr(topDict, key)
fdArray = topDict.FDArray fdArray = topDict.FDArray
charStrings = topDict.CharStrings charStrings = topDict.CharStrings
defaults = buildDefaults(privateDictOperators)
order = buildOrder(privateDictOperators)
for fd in fdArray:
fd.setCFF2(False)
privateDict = fd.Private
privateDict.order = order
for key in order:
if key not in privateDict.rawDict and key in defaults:
privateDict.rawDict[key] = defaults[key]
for key in privateDict.rawDict.keys():
if key not in order:
del privateDict.rawDict[key]
if hasattr(privateDict, key):
delattr(privateDict, key)
for cs in charStrings.values(): for cs in charStrings.values():
cs.decompile() cs.decompile()
cs.program.append("endchar") cs.program.append("endchar")