--- a/fontTools/misc/psCharStrings.py +++ b/fontTools/misc/psCharStrings.py @@ -223,9 +223,16 @@ else: return b"\xff" + pack(">l", value) # encode the entire fixed point value + +realZeroBytes = bytechr(30) + bytechr(0xf) + def encodeFloat(f): # For CFF only, used in cffLib - s = str(f).upper() + if f == 0.0: # 0.0 == +0.0 == -0.0 + return realZeroBytes + # Note: 14 decimal digits seems to be the limitation for CFF real numbers + # in macOS. However, we use 8 here to match the implementation of AFDKO. + s = "%.8G" % f if s[:2] == "0.": s = s[1:] elif s[:3] == "-0.": @@ -234,9 +241,13 @@ while s: c = s[0] s = s[1:] - if c == "E" and s[:1] == "-": - s = s[1:] - c = "E-" + if c == "E": + c2 = s[:1] + if c2 == "-": + s = s[1:] + c = "E-" + elif c2 == "+": + s = s[1:] nibbles.append(realNibblesDict[c]) nibbles.append(0xf) if len(nibbles) % 2: