fonttools/Tests/misc/psCharStrings_test.py

75 lines
3.0 KiB
Python

from __future__ import print_function, division, absolute_import
from fontTools.cffLib import PrivateDict
from fontTools.cffLib.specializer import stringToProgram
from fontTools.misc.psCharStrings import T2CharString, encodeFloat
import unittest
class T2CharStringTest(unittest.TestCase):
@classmethod
def stringToT2CharString(cls, string):
return T2CharString(program=stringToProgram(string), private=PrivateDict())
def test_calcBounds_empty(self):
cs = self.stringToT2CharString("endchar")
bounds = cs.calcBounds(None)
self.assertEqual(bounds, None)
def test_calcBounds_line(self):
cs = self.stringToT2CharString("100 100 rmoveto 40 10 rlineto -20 50 rlineto endchar")
bounds = cs.calcBounds(None)
self.assertEqual(bounds, (100, 100, 140, 160))
def test_calcBounds_curve(self):
cs = self.stringToT2CharString("100 100 rmoveto -50 -150 200 0 -50 150 rrcurveto endchar")
bounds = cs.calcBounds(None)
self.assertEqual(bounds, (91.90524980688875, -12.5, 208.09475019311125, 100))
def test_charstring_bytecode_optimization(self):
cs = self.stringToT2CharString(
"100.0 100 rmoveto -50.0 -150 200.5 0.0 -50 150 rrcurveto endchar")
cs.isCFF2 = False
cs.private._isCFF2 = False
cs.compile()
cs.decompile()
self.assertEqual(
cs.program, [100, 100, 'rmoveto', -50, -150, 200.5, 0, -50, 150,
'rrcurveto', 'endchar'])
cs2 = self.stringToT2CharString(
"100.0 rmoveto -50.0 -150 200.5 0.0 -50 150 rrcurveto")
cs2.isCFF2 = True
cs2.private._isCFF2 = True
cs2.compile(isCFF2=True)
cs2.decompile()
self.assertEqual(
cs2.program, [100, 'rmoveto', -50, -150, 200.5, 0, -50, 150,
'rrcurveto'])
def test_encodeFloat(self):
def hexenc(s):
return ' '.join('%02x' % x for x in s)
testNums = [
# value expected hex encoded result
(-9.399999999999999, '1e e9 a3 99 99 99 99 99 99 99 ff'),
(9.399999999999999999, '1e 9a 4f'), # 9.4
(456.8, '1e 45 6a 8f'), # 456.8
(0, '1e 0f'), # 0
(-0.0, '1e ea 0f'), # 0
(1, '1e 1f'), # 1
(-1, '1e e1 ff'), # -1
(98765.37e2, '1e 98 76 53 7a 0f'), # 9876537
(1234567890, '1e 12 34 56 78 90 ff'), # 1234567890
(9.876537e-24, '1e 9a 87 65 37 c2 4f'), # 9.876537e-24
(9.876537e+24, '1e 9a 87 65 37 b2 4f'), # 9.876537e+24
]
for n in testNums:
r = encodeFloat(n[0])
self.assertEqual(hexenc(r), n[1])
if __name__ == "__main__":
import sys
sys.exit(unittest.main())