diff --git a/setup.py b/setup.py index 3025ce5..8e98c72 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,4 @@ -from setuptools import setup +from setuptools import setup, find_packages from os import path from zttf import __version__ @@ -32,5 +32,6 @@ setup( 'Programming Language :: Python :: 3.4', ], keywords='fonts truetype ttf', - packages=['zttf'] -) \ No newline at end of file + packages=find_packages(exclude=['tests']), + test_suite='tests' +) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e54fe25 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ +__author__ = 'david' diff --git a/tests/utils_test.py b/tests/utils_test.py new file mode 100644 index 0000000..a1c506b --- /dev/null +++ b/tests/utils_test.py @@ -0,0 +1,23 @@ +import unittest + +from zttf.utils import fixed_version, binary_search_parameters + + +class TestUtils(unittest.TestCase): + def test_fixed_version(self): + cases = [ + (0x00005000, 0.5), + (0x00010000, 1.0), + (0x00035000, 3.5), + (0x00105000, 10.5) + ] + for case in cases: + self.assertEqual(fixed_version(case[0]), case[1]) + + def test_binary_parameters(self): + cases = { + 39: (5, 64, 14), + 10: (3, 16, 4) + } + for n, result in cases.items(): + self.assertEqual(binary_search_parameters(n), result) diff --git a/zttf/utils.py b/zttf/utils.py index aa73753..b878a13 100644 --- a/zttf/utils.py +++ b/zttf/utils.py @@ -91,26 +91,22 @@ def fixed_version(num): :param num: fixed 16:16 floating point number as a 32-bit unsigned integer :return: version number (float) """ - if num == 0x00005000: - return 0.5 - elif num == 0x00010000: - return 1.0 - elif num == 0x00020000: - return 2.0 - elif num == 0x00025000: - return 2.5 - elif num == 0x00030000: - return 3.0 - return num + return float("{:04x}.{:04x}".format(num >> 16, num & 0x0000ffff)) def binary_search_parameters(length): - search_range = 1 - entry_selector = 0 + """ The TTF specification has several places that require binary search + parameters. For an example look at the CMAP Format 4 table. + :param length: The range over which the search will be performed. + :return: The 3 parameters required. + """ + search_range = 2 + entry_selector = 1 while search_range * 2 <= length: search_range *= 2 entry_selector += 1 - return entry_selector, search_range, length - search_range + search_range *= 2 + return entry_selector, search_range, 2 * length - search_range class Range: