[CFFToCFF2] Fix for non-FDArray fonts and subroutines
This commit is contained in:
parent
369a21353a
commit
6a812ce925
@ -43,7 +43,15 @@ def _convertCFFToCFF2(cff, otFont):
|
||||
fdArray = topDict.FDArray if hasattr(topDict, "FDArray") else None
|
||||
charStrings = topDict.CharStrings
|
||||
globalSubrs = cff.GlobalSubrs
|
||||
localSubrs = [getattr(fd.Private, "Subrs", []) for fd in fdArray] if fdArray else []
|
||||
localSubrs = (
|
||||
[getattr(fd.Private, "Subrs", []) for fd in fdArray]
|
||||
if fdArray
|
||||
else (
|
||||
[topDict.Private.Subrs]
|
||||
if hasattr(topDict, "Private") and hasattr(topDict.Private, "Subrs")
|
||||
else []
|
||||
)
|
||||
)
|
||||
|
||||
for glyphName in charStrings.keys():
|
||||
cs, fdIndex = charStrings.getItemAndSelector(glyphName)
|
||||
@ -70,13 +78,21 @@ def _convertCFFToCFF2(cff, otFont):
|
||||
for glyphName in charStrings.keys():
|
||||
cs, fdIndex = charStrings.getItemAndSelector(glyphName)
|
||||
program = cs.program
|
||||
if fdIndex == None:
|
||||
fdIndex = 0
|
||||
|
||||
thisLocalSubrs = (
|
||||
localSubrs[fdIndex]
|
||||
if fdIndex
|
||||
else (
|
||||
getattr(topDict.Private, "Subrs", [])
|
||||
if hasattr(topDict, "Private")
|
||||
else []
|
||||
)
|
||||
)
|
||||
|
||||
# Intentionally use custom type for nominalWidthX, such that any
|
||||
# CharString that has an explicit width encoded will throw back to us.
|
||||
extractor = T2WidthExtractor(
|
||||
localSubrs[fdIndex] if localSubrs else [],
|
||||
thisLocalSubrs,
|
||||
globalSubrs,
|
||||
nominalWidthXError,
|
||||
0,
|
||||
@ -94,7 +110,7 @@ def _convertCFFToCFF2(cff, otFont):
|
||||
op = program.pop(0)
|
||||
bias = extractor.localBias if op == "callsubr" else extractor.globalBias
|
||||
subrNumber += bias
|
||||
subrSet = localSubrs[fdIndex] if op == "callsubr" else globalSubrs
|
||||
subrSet = thisLocalSubrs if op == "callsubr" else globalSubrs
|
||||
subrProgram = subrSet[subrNumber].program
|
||||
program[:0] = subrProgram
|
||||
# Now pop the actual width
|
||||
|
Loading…
x
Reference in New Issue
Block a user