from .interpolatableHelpers import * import logging log = logging.getLogger("fontTools.varLib.interpolatable") def test_contour_order(glyph0, glyph1): # We try matching both the StatisticsControlPen vector # and the StatisticsPen vector. # # If either method found a identity matching, accept it. # This is crucial for fonts like Kablammo[MORF].ttf and # Nabla[EDPT,EHLT].ttf, since they really confuse the # StatisticsPen vector because of their area=0 contours. n = len(glyph0.controlVectors) matching = None matching_cost = 0 identity_cost = 0 done = n <= 1 if not done: m0Control = glyph0.controlVectors m1Control = glyph1.controlVectors ( matching_control, matching_cost_control, identity_cost_control, ) = matching_for_vectors(m0Control, m1Control) done = matching_cost_control == identity_cost_control if not done: m0Green = glyph0.greenVectors m1Green = glyph1.greenVectors ( matching_green, matching_cost_green, identity_cost_green, ) = matching_for_vectors(m0Green, m1Green) done = matching_cost_green == identity_cost_green if not done: # See if reversing contours in one master helps. # That's a common problem. Then the wrong_start_point # test will fix them. # # Reverse the sign of the area (0); the rest stay the same. if not done: m1ControlReversed = [(-m[0],) + m[1:] for m in m1Control] ( matching_control_reversed, matching_cost_control_reversed, identity_cost_control_reversed, ) = matching_for_vectors(m0Control, m1ControlReversed) done = matching_cost_control_reversed == identity_cost_control_reversed if not done: m1GreenReversed = [(-m[0],) + m[1:] for m in m1Green] ( matching_control_reversed, matching_cost_control_reversed, identity_cost_control_reversed, ) = matching_for_vectors(m0Control, m1ControlReversed) done = matching_cost_control_reversed == identity_cost_control_reversed if not done: # Otherwise, use the worst of the two matchings. if ( matching_cost_control / identity_cost_control < matching_cost_green / identity_cost_green ): matching = matching_control matching_cost = matching_cost_control identity_cost = identity_cost_control else: matching = matching_green matching_cost = matching_cost_green identity_cost = identity_cost_green this_tolerance = matching_cost / identity_cost if identity_cost else 1 log.debug( "test-contour-order: tolerance %g", this_tolerance, ) return this_tolerance, matching