From b5ddc99fb9b36ff4325c932503b3b657a81e59dd Mon Sep 17 00:00:00 2001 From: Simon Cozens Date: Mon, 27 Nov 2023 17:27:28 +0000 Subject: [PATCH 01/88] linelike intersections (#3353) * Replace linelike intersections with line-curve/line-line tests, fixes #3352 * Tests for #3352 --- Lib/fontTools/misc/bezierTools.py | 16 ++++++++++++++++ Tests/misc/bezierTools_test.py | 8 ++++++++ 2 files changed, 24 insertions(+) diff --git a/Lib/fontTools/misc/bezierTools.py b/Lib/fontTools/misc/bezierTools.py index 21ab0a5d0..a1a707b09 100644 --- a/Lib/fontTools/misc/bezierTools.py +++ b/Lib/fontTools/misc/bezierTools.py @@ -1370,6 +1370,11 @@ def _curve_curve_intersections_t( return unique_values +def _is_linelike(segment): + maybeline = _alignment_transformation(segment).transformPoints(segment) + return all(math.isclose(p[1], 0.0) for p in maybeline) + + def curveCurveIntersections(curve1, curve2): """Finds intersections between a curve and a curve. @@ -1391,6 +1396,17 @@ def curveCurveIntersections(curve1, curve2): >>> intersections[0].pt (81.7831487395506, 109.88904552375288) """ + if _is_linelike(curve1): + line1 = curve1[0], curve1[-1] + if _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return lineLineIntersections(*line1, *line2) + else: + return curveLineIntersections(curve2, line1) + elif _is_linelike(curve2): + line2 = curve2[0], curve2[-1] + return curveLineIntersections(curve1, line2) + intersection_ts = _curve_curve_intersections_t(curve1, curve2) return [ Intersection(pt=segmentPointAtT(curve1, ts[0]), t1=ts[0], t2=ts[1]) diff --git a/Tests/misc/bezierTools_test.py b/Tests/misc/bezierTools_test.py index 8a3e2ecda..ce8a9e17e 100644 --- a/Tests/misc/bezierTools_test.py +++ b/Tests/misc/bezierTools_test.py @@ -4,6 +4,7 @@ from fontTools.misc.bezierTools import ( calcQuadraticArcLength, calcCubicBounds, curveLineIntersections, + curveCurveIntersections, segmentPointAtT, splitLine, splitQuadratic, @@ -189,3 +190,10 @@ def test_calcQuadraticArcLength(): assert calcQuadraticArcLength( (210, 333), (289, 333), (326.5, 290.5) ) == pytest.approx(127.9225) + + +def test_intersections_linelike(): + seg1 = [(0.0, 0.0), (0.0, 0.25), (0.0, 0.75), (0.0, 1.0)] + seg2 = [(0.0, 0.5), (0.25, 0.5), (0.75, 0.5), (1.0, 0.5)] + pt = curveCurveIntersections(seg1, seg2)[0][0] + assert pt == (0.0, 0.5) From 5738b4638a30d424857da468e926d57f7ac60879 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 12:57:57 -0700 Subject: [PATCH 02/88] [interpolatable] Remove fixing countour start order for kinks This was broken if multiple master-pairs tried to do the same. Just leave it. --- Lib/fontTools/varLib/interpolatable.py | 7 ------- Lib/fontTools/varLib/interpolatablePlot.py | 16 ---------------- 2 files changed, 23 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index cd31abe72..7a1b1a6d8 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -737,13 +737,6 @@ def test_gen( okay = True if not okay: - # Adjust contour points for further operations. - points = allContourPoints[m1idx][ix] - # Rotate them - points = points[proposed_point:] + points[:proposed_point] - if reverse: - points = points[::-1] - allContourPoints[m1idx][ix] = points yield ( glyph_name, { diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index a094fa9b4..f3474ada1 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -950,22 +950,6 @@ class InterpolatablePlot: converter ) - if which == 1 or midway: - wrong_start_point_problem = [ - pt - for pt in problems - if pt["type"] == "wrong_start_point" - and pt.get("contour") == idx - ] - if wrong_start_point_problem: - proposed_start = wrong_start_point_problem[0]["value_2"] - points.value = ( - points.value[proposed_start:] - + points.value[:proposed_start] - ) - if wrong_start_point_problem[0]["reversed"]: - points.value = points.value[::-1] - targetPoint = points.value[problem["value"]][0] cr.save() cr.translate(*targetPoint) From 6ae29fe38636c2d6bcc4d2d5ea5d28d2098a943b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 20:21:16 -0700 Subject: [PATCH 03/88] Interpolatable structure area (#3356) [interpolatable] Add an "underweight" check Remove the old, black-magic, "wrong_structure" test. See https://github.com/fonttools/fonttools/pull/3356 for commit trail. --- Lib/fontTools/varLib/interpolatable.py | 138 +++++---- Lib/fontTools/varLib/interpolatablePlot.py | 326 +++++++++++---------- 2 files changed, 267 insertions(+), 197 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 7a1b1a6d8..cd3e66f40 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -322,6 +322,23 @@ def _find_parents_and_order(glyphsets, locations): return parents, order +def lerp_recordings(recording1, recording2, factor=0.5): + pen = RecordingPen() + value = pen.value + for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): + if op1 != op2: + raise ValueError("Mismatched operations: %s, %s" % (op1, op2)) + if op1 == "addComponent": + mid_args = args1 # XXX Interpolate transformation? + else: + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + value.append((op1, mid_args)) + return pen + + def test_gen( glyphsets, glyphs=None, @@ -368,6 +385,7 @@ def test_gen( allNodeTypes = [] allContourIsomorphisms = [] allContourPoints = [] + allContourPens = [] allGlyphs = [glyphset[glyph_name] for glyphset in glyphsets] if len([1 for glyph in allGlyphs if glyph is not None]) <= 1: continue @@ -385,6 +403,7 @@ def test_gen( allGreenVectors.append(None) allContourIsomorphisms.append(None) allContourPoints.append(None) + allContourPens.append(None) continue perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) @@ -405,6 +424,7 @@ def test_gen( allGreenVectors.append(contourGreenVectors) allContourIsomorphisms.append(contourIsomorphisms) allContourPoints.append(contourPoints) + allContourPens.append(contourPens) for ix, contour in enumerate(contourPens): contourOps = tuple(op for op, arg in contour.value) nodeTypes.append(contourOps) @@ -598,8 +618,13 @@ def test_gen( identity_cost = identity_cost_green if matching_cost < identity_cost * tolerance: - # print(matching_cost_control / identity_cost_control, matching_cost_green / identity_cost_green) - + log.debug( + "matching_control_ratio %g; matching_green_ratio %g.", + matching_cost_control / identity_cost_control, + matching_cost_green / identity_cost_green, + ) + this_tolerance = matching_cost / identity_cost + log.debug("tolerance", this_tolerance) yield ( glyph_name, { @@ -610,21 +635,35 @@ def test_gen( "master_2_idx": m1idx, "value_1": list(range(n)), "value_2": matching, - "tolerance": matching_cost / identity_cost, + "tolerance": this_tolerance, }, ) matchings[m1idx] = matching # - # "wrong_start_point" check + # "wrong_start_point" / weight check # m1 = allContourIsomorphisms[m1idx] m0 = allContourIsomorphisms[m0idx] + m1Vectors = allGreenVectors[m1idx] + m0Vectors = allGreenVectors[m0idx] + recording0 = allContourPens[m0idx] + recording1 = allContourPens[m1idx] # If contour-order is wrong, adjust it if matchings[m1idx] is not None and m1: # m1 is empty for composite glyphs m1 = [m1[i] for i in matchings[m1idx]] + m1Vectors = [m1Vectors[i] for i in matchings[m1idx]] + recording1 = [recording1[i] for i in matchings[m1idx]] + + midRecording = [] + for c0, c1 in zip(recording0, recording1): + try: + midRecording.append(lerp_recordings(c0, c1)) + except ValueError: + # Mismatch because of the reordering above + midRecording.append(None) for ix, (contour0, contour1) in enumerate(zip(m0, m1)): if len(contour0) == 0 or len(contour0) != len(contour1): @@ -667,13 +706,10 @@ def test_gen( ): # Try harder - m0Vectors = allGreenVectors[m0idx][ix] - m1Vectors = allGreenVectors[m1idx][ix] - # Recover the covariance matrix from the GreenVectors. # This is a 2x2 matrix. transforms = [] - for vector in (m0Vectors, m1Vectors): + for vector in (m0Vectors[ix], m1Vectors[ix]): meanX = vector[1] meanY = vector[2] stddevX = vector[3] / 2 @@ -753,55 +789,47 @@ def test_gen( }, ) else: - # If first_cost is Too Largeā„¢, do further inspection. - # This can happen specially in the case of TrueType - # fonts, where the original contour had wrong start point, - # but because of the cubic->quadratic conversion, we don't - # have many isomorphisms to work with. + # Weight check. + # + # If contour could be mid-interpolated, and the two + # contours have the same area sign, proceeed. + # + # The sign difference can happen if it's a werido + # self-intersecting contour; ignore it. + contour = midRecording[ix] + if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): + size0 = m0Vectors[ix][0] * m0Vectors[ix][0] + size1 = m1Vectors[ix][0] * m1Vectors[ix][0] - # The threshold here is all black magic. It's just here to - # speed things up so we don't end up doing a full matching - # on every contour that is correct. - threshold = ( - len(c0[0]) * (allControlVectors[m0idx][ix][0] * 0.5) ** 2 / 4 - ) # Magic only - c1 = contour1[min_cost_idx] + midStats = StatisticsPen(glyphset=glyphset) + contour.replay(midStats) + midVector = _contour_vector_from_stats(midStats) + midSize = midVector[0] * midVector[0] - # If point counts are different it's because of the contour - # reordering above. We can in theory still try, but our - # bipartite-matching implementations currently assume - # equal number of vertices on both sides. I'm lazy to update - # all three different implementations! - - if len(c0[0]) == len(c1[0]) and first_cost > threshold: - # Do a quick(!) matching between the points. If it's way off, - # flag it. This can happen specially in the case of TrueType - # fonts, where the original contour had wrong start point, but - # because of the cubic->quadratic conversion, we don't have many - # isomorphisms. - points0 = c0[0][::_NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR] - points1 = c1[0][::_NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR] - - graph = [ - [_hypot2_complex(p0 - p1) for p1 in points1] - for p0 in points0 - ] - matching, matching_cost = min_cost_perfect_bipartite_matching( - graph - ) - identity_cost = sum(graph[i][i] for i in range(len(graph))) - - if matching_cost < identity_cost / 5: # Heuristic - # print(matching_cost, identity_cost, matching) + geomAvg = (size0 * size1) ** 0.5 + if not (geomAvg * tolerance <= midSize + 1e-5): + try: + this_tolerance = midSize / geomAvg + except ZeroDivisionError: + this_tolerance = 0 + log.debug( + "average size %g; actual size %g; master sizes: %g, %g", + geomAvg, + midSize, + size0, + size1, + ) + log.debug("tolerance %g", this_tolerance) yield ( glyph_name, { - "type": "wrong_structure", + "type": "underweight", "contour": ix, "master_1": names[m0idx], "master_2": names[m1idx], "master_1_idx": m0idx, "master_2_idx": m1idx, + "tolerance": this_tolerance, }, ) @@ -919,7 +947,14 @@ def test_gen( this_tolerance = t / (abs(sin_mid) * kinkiness) - # print(deviation, deviation_ratio, sin_mid, r_diff, this_tolerance) + log.debug( + "deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g", + deviation, + deviation_ratio, + sin_mid, + r_diff, + ) + log.debug("tolerance %g", this_tolerance) yield ( glyph_name, { @@ -1044,12 +1079,15 @@ def main(args=None): help="Name of the master to use in the report. If not provided, all are used.", ) parser.add_argument("-v", "--verbose", action="store_true", help="Run verbosely.") + parser.add_argument("--debug", action="store_true", help="Run with debug output.") args = parser.parse_args(args) from fontTools import configLogger configLogger(level=("INFO" if args.verbose else "ERROR")) + if args.debug: + configLogger(level="DEBUG") glyphs = args.glyphs.split() if args.glyphs else None @@ -1352,9 +1390,9 @@ def main(args=None): ), file=f, ) - elif p["type"] == "wrong_structure": + elif p["type"] == "underweight": print( - " Contour %d structures differ: %s, %s" + " Contour %d interpolation is underweight: %s, %s" % ( p["contour"], p["master_1"], diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index f3474ada1..34e07112b 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -97,6 +97,7 @@ class InterpolatablePlot: kink_circle_color = (1, 0, 1, 0.5) contour_colors = ((1, 0, 0), (0, 0, 1), (0, 1, 0), (1, 1, 0), (1, 0, 1), (0, 1, 1)) contour_alpha = 0.5 + weight_issue_contour_color = (0, 0, 0, 0.5) no_issues_label = "Your font's good! Have a cupcake..." no_issues_label_color = (0, 0.5, 0) cupcake_color = (0.3, 0, 0.3) @@ -242,6 +243,17 @@ class InterpolatablePlot: ) y -= self.pad + self.line_height + self.draw_label("Underweight contours", x=xxx, y=y, width=width) + cr.rectangle(xx - self.pad * 0.7, y, 1.5 * self.pad, self.line_height) + cr.set_source_rgb(*self.fill_color) + cr.fill_preserve() + cr.set_source_rgb(*self.stroke_color) + cr.set_line_width(self.stroke_width) + cr.stroke_preserve() + cr.set_source_rgba(*self.weight_issue_contour_color) + cr.fill() + y -= self.pad + self.line_height + self.draw_label( "Colored contours: contours with the wrong order", x=xxx, y=y, width=width ) @@ -465,8 +477,8 @@ class InterpolatablePlot: "nothing", "wrong_start_point", "contour_order", - "wrong_structure", "kink", + "underweight", ) for pt in problem_types ): @@ -489,7 +501,8 @@ class InterpolatablePlot: self.draw_glyph( midway_glyphset, glyphname, - [{"type": "midway"}] + [p for p in problems if p["type"] == "kink"], + [{"type": "midway"}] + + [p for p in problems if p["type"] in ("kink", "underweight")], None, x=x, y=y, @@ -498,171 +511,181 @@ class InterpolatablePlot: y += self.height + self.pad + if any( + pt + in ( + "nothing", + "wrong_start_point", + "contour_order", + "kink", + ) + for pt in problem_types + ): # Draw the proposed fix self.draw_label("proposed fix", x=x, y=y, color=self.head_color, align=0.5) y += self.line_height + self.pad - if problem_type in ("wrong_structure"): - self.draw_shrug(x=x, y=y) - else: - overriding1 = OverridingDict(glyphset1) - overriding2 = OverridingDict(glyphset2) - perContourPen1 = PerContourOrComponentPen( - RecordingPen, glyphset=overriding1 - ) - perContourPen2 = PerContourOrComponentPen( - RecordingPen, glyphset=overriding2 - ) - glyphset1[glyphname].draw(perContourPen1) - glyphset2[glyphname].draw(perContourPen2) + overriding1 = OverridingDict(glyphset1) + overriding2 = OverridingDict(glyphset2) + perContourPen1 = PerContourOrComponentPen( + RecordingPen, glyphset=overriding1 + ) + perContourPen2 = PerContourOrComponentPen( + RecordingPen, glyphset=overriding2 + ) + glyphset1[glyphname].draw(perContourPen1) + glyphset2[glyphname].draw(perContourPen2) - for problem in problems: - if problem["type"] == "contour_order": - fixed_contours = [ - perContourPen2.value[i] for i in problems[0]["value_2"] - ] - perContourPen2.value = fixed_contours + for problem in problems: + if problem["type"] == "contour_order": + fixed_contours = [ + perContourPen2.value[i] for i in problems[0]["value_2"] + ] + perContourPen2.value = fixed_contours - for problem in problems: - if problem["type"] == "wrong_start_point": - # Save the wrong contours - wrongContour1 = perContourPen1.value[problem["contour"]] - wrongContour2 = perContourPen2.value[problem["contour"]] + for problem in problems: + if problem["type"] == "wrong_start_point": + # Save the wrong contours + wrongContour1 = perContourPen1.value[problem["contour"]] + wrongContour2 = perContourPen2.value[problem["contour"]] - # Convert the wrong contours to point pens - points1 = RecordingPointPen() - converter = SegmentToPointPen(points1, False) - wrongContour1.replay(converter) - points2 = RecordingPointPen() - converter = SegmentToPointPen(points2, False) - wrongContour2.replay(converter) + # Convert the wrong contours to point pens + points1 = RecordingPointPen() + converter = SegmentToPointPen(points1, False) + wrongContour1.replay(converter) + points2 = RecordingPointPen() + converter = SegmentToPointPen(points2, False) + wrongContour2.replay(converter) - proposed_start = problem["value_2"] + proposed_start = problem["value_2"] - # See if we need reversing; fragile but worth a try - if problem["reversed"]: - new_points2 = RecordingPointPen() - reversedPen = ReverseContourPointPen(new_points2) - points2.replay(reversedPen) - points2 = new_points2 - proposed_start = len(points2.value) - 2 - proposed_start + # See if we need reversing; fragile but worth a try + if problem["reversed"]: + new_points2 = RecordingPointPen() + reversedPen = ReverseContourPointPen(new_points2) + points2.replay(reversedPen) + points2 = new_points2 + proposed_start = len(points2.value) - 2 - proposed_start - # Rotate points2 so that the first point is the same as in points1 - beginPath = points2.value[:1] - endPath = points2.value[-1:] - pts = points2.value[1:-1] - pts = pts[proposed_start:] + pts[:proposed_start] - points2.value = beginPath + pts + endPath + # Rotate points2 so that the first point is the same as in points1 + beginPath = points2.value[:1] + endPath = points2.value[-1:] + pts = points2.value[1:-1] + pts = pts[proposed_start:] + pts[:proposed_start] + points2.value = beginPath + pts + endPath - # Convert the point pens back to segment pens - segment1 = RecordingPen() - converter = PointToSegmentPen(segment1, True) - points1.replay(converter) - segment2 = RecordingPen() - converter = PointToSegmentPen(segment2, True) - points2.replay(converter) + # Convert the point pens back to segment pens + segment1 = RecordingPen() + converter = PointToSegmentPen(segment1, True) + points1.replay(converter) + segment2 = RecordingPen() + converter = PointToSegmentPen(segment2, True) + points2.replay(converter) - # Replace the wrong contours - wrongContour1.value = segment1.value - wrongContour2.value = segment2.value - perContourPen1.value[problem["contour"]] = wrongContour1 - perContourPen2.value[problem["contour"]] = wrongContour2 + # Replace the wrong contours + wrongContour1.value = segment1.value + wrongContour2.value = segment2.value + perContourPen1.value[problem["contour"]] = wrongContour1 + perContourPen2.value[problem["contour"]] = wrongContour2 - for problem in problems: - # If we have a kink, try to fix it. - if problem["type"] == "kink": - # Save the wrong contours - wrongContour1 = perContourPen1.value[problem["contour"]] - wrongContour2 = perContourPen2.value[problem["contour"]] + for problem in problems: + # If we have a kink, try to fix it. + if problem["type"] == "kink": + # Save the wrong contours + wrongContour1 = perContourPen1.value[problem["contour"]] + wrongContour2 = perContourPen2.value[problem["contour"]] - # Convert the wrong contours to point pens - points1 = RecordingPointPen() - converter = SegmentToPointPen(points1, False) - wrongContour1.replay(converter) - points2 = RecordingPointPen() - converter = SegmentToPointPen(points2, False) - wrongContour2.replay(converter) + # Convert the wrong contours to point pens + points1 = RecordingPointPen() + converter = SegmentToPointPen(points1, False) + wrongContour1.replay(converter) + points2 = RecordingPointPen() + converter = SegmentToPointPen(points2, False) + wrongContour2.replay(converter) - i = problem["value"] + i = problem["value"] - # Position points to be around the same ratio - # beginPath / endPath dance - j = i + 1 - pt0 = points1.value[j][1][0] - pt1 = points2.value[j][1][0] - j_prev = (i - 1) % (len(points1.value) - 2) + 1 - pt0_prev = points1.value[j_prev][1][0] - pt1_prev = points2.value[j_prev][1][0] - j_next = (i + 1) % (len(points1.value) - 2) + 1 - pt0_next = points1.value[j_next][1][0] - pt1_next = points2.value[j_next][1][0] + # Position points to be around the same ratio + # beginPath / endPath dance + j = i + 1 + pt0 = points1.value[j][1][0] + pt1 = points2.value[j][1][0] + j_prev = (i - 1) % (len(points1.value) - 2) + 1 + pt0_prev = points1.value[j_prev][1][0] + pt1_prev = points2.value[j_prev][1][0] + j_next = (i + 1) % (len(points1.value) - 2) + 1 + pt0_next = points1.value[j_next][1][0] + pt1_next = points2.value[j_next][1][0] - pt0 = complex(*pt0) - pt1 = complex(*pt1) - pt0_prev = complex(*pt0_prev) - pt1_prev = complex(*pt1_prev) - pt0_next = complex(*pt0_next) - pt1_next = complex(*pt1_next) + pt0 = complex(*pt0) + pt1 = complex(*pt1) + pt0_prev = complex(*pt0_prev) + pt1_prev = complex(*pt1_prev) + pt0_next = complex(*pt0_next) + pt1_next = complex(*pt1_next) - # Find the ratio of the distance between the points - r0 = abs(pt0 - pt0_prev) / abs(pt0_next - pt0_prev) - r1 = abs(pt1 - pt1_prev) / abs(pt1_next - pt1_prev) - r_mid = (r0 + r1) / 2 + # Find the ratio of the distance between the points + r0 = abs(pt0 - pt0_prev) / abs(pt0_next - pt0_prev) + r1 = abs(pt1 - pt1_prev) / abs(pt1_next - pt1_prev) + r_mid = (r0 + r1) / 2 - pt0 = pt0_prev + r_mid * (pt0_next - pt0_prev) - pt1 = pt1_prev + r_mid * (pt1_next - pt1_prev) + pt0 = pt0_prev + r_mid * (pt0_next - pt0_prev) + pt1 = pt1_prev + r_mid * (pt1_next - pt1_prev) - points1.value[j] = ( - points1.value[j][0], - (((pt0.real, pt0.imag),) + points1.value[j][1][1:]), - points1.value[j][2], - ) - points2.value[j] = ( - points2.value[j][0], - (((pt1.real, pt1.imag),) + points2.value[j][1][1:]), - points2.value[j][2], - ) - - # Convert the point pens back to segment pens - segment1 = RecordingPen() - converter = PointToSegmentPen(segment1, True) - points1.replay(converter) - segment2 = RecordingPen() - converter = PointToSegmentPen(segment2, True) - points2.replay(converter) - - # Replace the wrong contours - wrongContour1.value = segment1.value - wrongContour2.value = segment2.value - - # Assemble - fixed1 = RecordingPen() - fixed2 = RecordingPen() - for contour in perContourPen1.value: - fixed1.value.extend(contour.value) - for contour in perContourPen2.value: - fixed2.value.extend(contour.value) - fixed1.draw = fixed1.replay - fixed2.draw = fixed2.replay - - overriding1[glyphname] = fixed1 - overriding2[glyphname] = fixed2 - - try: - midway_glyphset = LerpGlyphSet(overriding1, overriding2) - self.draw_glyph( - midway_glyphset, - glyphname, - {"type": "fixed"}, - None, - x=x, - y=y, - scale=min(scales), + points1.value[j] = ( + points1.value[j][0], + (((pt0.real, pt0.imag),) + points1.value[j][1][1:]), + points1.value[j][2], ) - except ValueError: - self.draw_shrug(x=x, y=y) - y += self.height + self.pad + points2.value[j] = ( + points2.value[j][0], + (((pt1.real, pt1.imag),) + points2.value[j][1][1:]), + points2.value[j][2], + ) + + # Convert the point pens back to segment pens + segment1 = RecordingPen() + converter = PointToSegmentPen(segment1, True) + points1.replay(converter) + segment2 = RecordingPen() + converter = PointToSegmentPen(segment2, True) + points2.replay(converter) + + # Replace the wrong contours + wrongContour1.value = segment1.value + wrongContour2.value = segment2.value + + # Assemble + fixed1 = RecordingPen() + fixed2 = RecordingPen() + for contour in perContourPen1.value: + fixed1.value.extend(contour.value) + for contour in perContourPen2.value: + fixed2.value.extend(contour.value) + fixed1.draw = fixed1.replay + fixed2.draw = fixed2.replay + + overriding1[glyphname] = fixed1 + overriding2[glyphname] = fixed2 + + try: + midway_glyphset = LerpGlyphSet(overriding1, overriding2) + self.draw_glyph( + midway_glyphset, + glyphname, + {"type": "fixed"}, + None, + x=x, + y=y, + scale=min(scales), + ) + except ValueError: + self.draw_shrug(x=x, y=y) + y += self.height + self.pad + + else: + self.draw_shrug(x=x, y=y) if show_page_number: self.draw_label( @@ -787,13 +810,22 @@ class InterpolatablePlot: cr.new_path() + if "underweight" in problem_types: + perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) + recording.replay(perContourPen) + for problem in problems: + if problem["type"] == "underweight": + contour = perContourPen.value[problem["contour"]] + contour.replay(CairoPen(glyphset, cr)) + cr.set_source_rgba(*self.weight_issue_contour_color) + cr.fill() + if any( t in problem_types for t in { "nothing", "node_count", "node_incompatibility", - "wrong_structure", } ): cr.set_line_cap(cairo.LINE_CAP_ROUND) @@ -863,7 +895,7 @@ class InterpolatablePlot: cr.fill() for problem in problems: - if problem["type"] in ("nothing", "wrong_start_point", "wrong_structure"): + if problem["type"] in ("nothing", "wrong_start_point"): idx = problem.get("contour") # Draw suggested point From 4ff5916bf63ec41472bbf2bb22dac3b4438cb671 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 20:29:52 -0700 Subject: [PATCH 04/88] [interpolatablePlot] Tweak color opacities a bit --- Lib/fontTools/varLib/interpolatablePlot.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 34e07112b..9444aea5f 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -79,25 +79,25 @@ class InterpolatablePlot: fill_color = (0.8, 0.8, 0.8) stroke_color = (0.1, 0.1, 0.1) stroke_width = 2 - oncurve_node_color = (0, 0.8, 0) + oncurve_node_color = (0, 0.8, 0, 0.7) oncurve_node_diameter = 10 - offcurve_node_color = (0, 0.5, 0) + offcurve_node_color = (0, 0.5, 0, 0.7) offcurve_node_diameter = 8 - handle_color = (0.2, 1, 0.2) + handle_color = (0.2, 1, 0.2, 0.5) handle_width = 1 - corrected_start_point_color = (0, 0.9, 0) + corrected_start_point_color = (0, 0.9, 0, 0.7) corrected_start_point_size = 15 - wrong_start_point_color = (1, 0, 0) - start_point_color = (0, 0, 1) + wrong_start_point_color = (1, 0, 0, 0.7) + start_point_color = (0, 0, 1, 0.7) start_arrow_length = 20 kink_point_size = 10 kink_point_color = (1, 0, 1, 0.7) kink_circle_size = 25 kink_circle_stroke_width = 1.5 - kink_circle_color = (1, 0, 1, 0.5) + kink_circle_color = (1, 0, 1, 0.7) contour_colors = ((1, 0, 0), (0, 0, 1), (0, 1, 0), (1, 1, 0), (1, 0, 1), (0, 1, 1)) contour_alpha = 0.5 - weight_issue_contour_color = (0, 0, 0, 0.5) + weight_issue_contour_color = (0, 0, 0, 0.4) no_issues_label = "Your font's good! Have a cupcake..." no_issues_label_color = (0, 0.5, 0) cupcake_color = (0.3, 0, 0.3) @@ -837,7 +837,7 @@ class InterpolatablePlot: x, y = args[-1] cr.move_to(x, y) cr.line_to(x, y) - cr.set_source_rgb(*self.oncurve_node_color) + cr.set_source_rgba(*self.oncurve_node_color) cr.set_line_width(self.oncurve_node_diameter / scale) cr.stroke() @@ -848,7 +848,7 @@ class InterpolatablePlot: for x, y in args[:-1]: cr.move_to(x, y) cr.line_to(x, y) - cr.set_source_rgb(*self.offcurve_node_color) + cr.set_source_rgba(*self.offcurve_node_color) cr.set_line_width(self.offcurve_node_diameter / scale) cr.stroke() @@ -873,7 +873,7 @@ class InterpolatablePlot: else: continue - cr.set_source_rgb(*self.handle_color) + cr.set_source_rgba(*self.handle_color) cr.set_line_width(self.handle_width / scale) cr.stroke() From abd34de8b7fce97f82f6d503334afc41d5e1194e Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Tue, 28 Nov 2023 11:41:21 +0000 Subject: [PATCH 05/88] [interpolatable] fix TypeError "not all arguments converted during string formatting" https://github.com/fonttools/fonttools/actions/runs/7018011691/job/19092495402?pr=3354#step:5:3503 --- Lib/fontTools/varLib/interpolatable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index cd3e66f40..06e680531 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -624,7 +624,7 @@ def test_gen( matching_cost_green / identity_cost_green, ) this_tolerance = matching_cost / identity_cost - log.debug("tolerance", this_tolerance) + log.debug("tolerance: %g", this_tolerance) yield ( glyph_name, { From 2b115eaae83dddb2638b079c7e88bda2e94cd6f9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 09:42:13 -0700 Subject: [PATCH 06/88] [interpolatablePlot] Remove redundant code --- Lib/fontTools/varLib/interpolatablePlot.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 9444aea5f..164d7ac03 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -1121,10 +1121,6 @@ class InterpolatablePostscriptLike(InterpolatablePlot): super().show_page() self.surface.show_page() - def __enter__(self): - self.surface = cairo.PSSurface(self.out, self.width, self.height) - return self - class InterpolatablePS(InterpolatablePostscriptLike): def __enter__(self): From 4c222bd04427721e1c209998cb6e465ae7f68cc8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 13:56:32 -0700 Subject: [PATCH 07/88] [interpolatable] Fix stddev --- Lib/fontTools/varLib/interpolatable.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 06e680531..ee47ac9a3 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -712,8 +712,8 @@ def test_gen( for vector in (m0Vectors[ix], m1Vectors[ix]): meanX = vector[1] meanY = vector[2] - stddevX = vector[3] / 2 - stddevY = vector[4] / 2 + stddevX = vector[3] * 0.5 + stddevY = vector[4] * 0.5 correlation = vector[5] / abs(vector[0]) # https://cookierobotics.com/007/ From 9b98eaf9d79b7f9c7684582028d737dc829cf9fd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 21:20:50 -0700 Subject: [PATCH 08/88] [interpolatablePlot] Add underweight emoticon --- Lib/fontTools/varLib/interpolatablePlot.py | 105 ++++++++++++--------- 1 file changed, 59 insertions(+), 46 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 164d7ac03..1d7203c2d 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -126,8 +126,13 @@ class InterpolatablePlot: \\\\ |||| |||| |||| // |||||||||||||||||||||||| """ - shrug_color = (0, 0.3, 0.3) + emoticon_color = (0, 0.3, 0.3) shrug = r"""\_(")_/""" + underweight = r""" + o +/|\ +/ \ +""" def __init__(self, out, glyphsets, names=None, **kwargs): self.out = out @@ -468,7 +473,7 @@ class InterpolatablePlot: self.draw_glyph(glyphset, glyphname, problems, which, x=x, y=y) ) else: - self.draw_shrug(x=x, y=y) + self.draw_emoticon(self.shrug, x=x, y=y) y += self.height + self.pad if any( @@ -681,11 +686,14 @@ class InterpolatablePlot: scale=min(scales), ) except ValueError: - self.draw_shrug(x=x, y=y) + self.draw_emoticon(self.shrug, x=x, y=y) y += self.height + self.pad else: - self.draw_shrug(x=x, y=y) + emoticon = self.shrug + if "underweight" in problem_types: + emoticon = self.underweight + self.draw_emoticon(emoticon, x=x, y=y) if show_page_number: self.draw_label( @@ -1047,6 +1055,44 @@ class InterpolatablePlot: cr.fill() cr.restore() + def draw_text(self, text, *, x=0, y=0, color=(0, 0, 0), width=None, height=None): + if width is None: + width = self.width + if height is None: + height = self.height + + text = text.splitlines() + cr = cairo.Context(self.surface) + cr.set_source_rgb(*color) + cr.set_font_size(self.line_height) + cr.select_font_face( + "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL + ) + text_width = 0 + text_height = 0 + font_extents = cr.font_extents() + font_line_height = font_extents[2] + font_ascent = font_extents[0] + for line in text: + extents = cr.text_extents(line) + text_width = max(text_width, extents.width) + text_height += font_line_height + if not text_width: + return + cr.translate(x, y) + scale = min(width / text_width, height / text_height) + # center + cr.translate( + (width - text_width * scale) / 2, (height - text_height * scale) / 2 + ) + cr.scale(scale, scale) + + cr.translate(0, font_ascent) + for line in text: + cr.move_to(0, 0) + cr.show_text(line) + cr.translate(0, font_line_height) + def draw_cupcake(self): self.set_size(self.total_width(), self.total_height()) @@ -1060,50 +1106,17 @@ class InterpolatablePlot: bold=True, ) - cupcake = self.cupcake.splitlines() - cr = cairo.Context(self.surface) - cr.set_source_rgb(*self.cupcake_color) - cr.set_font_size(self.line_height) - cr.select_font_face( - "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL + self.draw_text( + self.cupcake, + x=self.pad, + y=self.pad + self.line_height, + width=self.total_width() - 2 * self.pad, + height=self.total_height() - 2 * self.pad - self.line_height, + color=self.cupcake_color, ) - width = 0 - height = 0 - font_extents = cr.font_extents() - font_line_height = font_extents[2] - font_ascent = font_extents[0] - for line in cupcake: - extents = cr.text_extents(line) - width = max(width, extents.width) - height += font_line_height - if not width: - return - cr.scale( - (self.total_width() - 2 * self.pad) / width, - (self.total_height() - 2 * self.pad - self.line_height) / height, - ) - cr.translate(self.pad, self.pad + font_ascent + self.line_height) - for line in cupcake: - cr.move_to(0, 0) - cr.show_text(line) - cr.translate(0, font_line_height) - def draw_shrug(self, x=0, y=0): - cr = cairo.Context(self.surface) - cr.translate(x, y) - cr.set_source_rgb(*self.shrug_color) - cr.set_font_size(self.line_height) - cr.select_font_face( - "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL - ) - extents = cr.text_extents(self.shrug) - if not extents.width: - return - cr.translate(0, self.height * 0.6) - scale = self.width / extents.width - cr.scale(scale, scale) - cr.move_to(-extents.x_bearing, 0) - cr.show_text(self.shrug) + def draw_emoticon(self, emoticon, x=0, y=0): + self.draw_text(emoticon, x=x, y=y, color=self.emoticon_color) class InterpolatablePostscriptLike(InterpolatablePlot): From 8d9931a1e133ab6966ee45b577bdcf077540039f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 21:36:10 -0700 Subject: [PATCH 09/88] [interpolatable] Start adding "overweight" test --- Lib/fontTools/varLib/interpolatable.py | 78 ++++++++++++++-------- Lib/fontTools/varLib/interpolatablePlot.py | 14 +++- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index ee47ac9a3..859fcccbf 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -806,32 +806,48 @@ def test_gen( midVector = _contour_vector_from_stats(midStats) midSize = midVector[0] * midVector[0] - geomAvg = (size0 * size1) ** 0.5 - if not (geomAvg * tolerance <= midSize + 1e-5): - try: - this_tolerance = midSize / geomAvg - except ZeroDivisionError: - this_tolerance = 0 - log.debug( - "average size %g; actual size %g; master sizes: %g, %g", - geomAvg, - midSize, - size0, - size1, - ) - log.debug("tolerance %g", this_tolerance) - yield ( - glyph_name, - { - "type": "underweight", - "contour": ix, - "master_1": names[m0idx], - "master_2": names[m1idx], - "master_1_idx": m0idx, - "master_2_idx": m1idx, - "tolerance": this_tolerance, - }, - ) + for overweight, problem_type in enumerate(("underweight", "overweight")): + + if overweight: + try: + expectedSize = 1 / (((1 / size0) * (1 / size1)) ** 0.5) + except ZeroDivisionError: + continue + else: + expectedSize = (size0 * size1) ** 0.5 + + if ( + (not overweight and expectedSize * tolerance > midSize + 1e-5) + or + (overweight and 1e-5 + expectedSize < midSize * tolerance) + ): + try: + if overweight: + this_tolerance = expectedSize / midSize + else: + this_tolerance = midSize / expectedSize + except ZeroDivisionError: + this_tolerance = 0 + log.debug( + "actual size %g; threshold size %g, master sizes: %g, %g", + midSize, + expectedSize, + size0, + size1, + ) + log.debug("tolerance %g", this_tolerance) + yield ( + glyph_name, + { + "type": problem_type, + "contour": ix, + "master_1": names[m0idx], + "master_2": names[m1idx], + "master_1_idx": m0idx, + "master_2_idx": m1idx, + "tolerance": this_tolerance, + }, + ) # # "kink" detector @@ -1400,6 +1416,16 @@ def main(args=None): ), file=f, ) + elif p["type"] == "overweight": + print( + " Contour %d interpolation is overweight: %s, %s" + % ( + p["contour"], + p["master_1"], + p["master_2"], + ), + file=f, + ) elif p["type"] == "kink": print( " Contour %d has a kink at %s: %s, %s" diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 1d7203c2d..c492dea42 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -132,6 +132,11 @@ class InterpolatablePlot: o /|\ / \ +""" + overweight = r""" + o +/O\ +/ \ """ def __init__(self, out, glyphsets, names=None, **kwargs): @@ -484,6 +489,7 @@ class InterpolatablePlot: "contour_order", "kink", "underweight", + "overweight", ) for pt in problem_types ): @@ -507,7 +513,7 @@ class InterpolatablePlot: midway_glyphset, glyphname, [{"type": "midway"}] - + [p for p in problems if p["type"] in ("kink", "underweight")], + + [p for p in problems if p["type"] in ("kink", "underweight", "overweight")], None, x=x, y=y, @@ -693,6 +699,8 @@ class InterpolatablePlot: emoticon = self.shrug if "underweight" in problem_types: emoticon = self.underweight + elif "overweight" in problem_types: + emoticon = self.overweight self.draw_emoticon(emoticon, x=x, y=y) if show_page_number: @@ -818,11 +826,11 @@ class InterpolatablePlot: cr.new_path() - if "underweight" in problem_types: + if "underweight" in problem_types or "overweight" in problem_types: perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) recording.replay(perContourPen) for problem in problems: - if problem["type"] == "underweight": + if problem["type"] in ("underweight", "overweight"): contour = perContourPen.value[problem["contour"]] contour.replay(CairoPen(glyphset, cr)) cr.set_source_rgba(*self.weight_issue_contour_color) From 219f1ed2f58d47284593655146b83f6d0b3e277e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 22:12:57 -0700 Subject: [PATCH 10/88] . --- Lib/fontTools/varLib/interpolatable.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 859fcccbf..c4bc6af6e 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -801,6 +801,8 @@ def test_gen( size0 = m0Vectors[ix][0] * m0Vectors[ix][0] size1 = m1Vectors[ix][0] * m1Vectors[ix][0] + size0, size1 = sorted((size0, size1)) + midStats = StatisticsPen(glyphset=glyphset) contour.replay(midStats) midVector = _contour_vector_from_stats(midStats) @@ -809,10 +811,8 @@ def test_gen( for overweight, problem_type in enumerate(("underweight", "overweight")): if overweight: - try: - expectedSize = 1 / (((1 / size0) * (1 / size1)) ** 0.5) - except ZeroDivisionError: - continue + expectedSize = (size0 * size1) ** 0.5 + expectedSize += (size0 + size1) - expectedSize else: expectedSize = (size0 * size1) ** 0.5 From 4f914dbbc2bf278488c447da2ac862d07976e475 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 27 Nov 2023 23:11:01 -0700 Subject: [PATCH 11/88] [interpolatable] Calling it a night... --- Lib/fontTools/varLib/interpolatable.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index c4bc6af6e..41b710ccd 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -812,10 +812,18 @@ def test_gen( if overweight: expectedSize = (size0 * size1) ** 0.5 - expectedSize += (size0 + size1) - expectedSize + expectedSize = (size0 + size1) - expectedSize else: expectedSize = (size0 * size1) ** 0.5 + log.debug( + "%s: actual size %g; threshold size %g, master sizes: %g, %g", + problem_type, + midSize, + expectedSize, + size0, + size1, + ) if ( (not overweight and expectedSize * tolerance > midSize + 1e-5) or @@ -828,13 +836,6 @@ def test_gen( this_tolerance = midSize / expectedSize except ZeroDivisionError: this_tolerance = 0 - log.debug( - "actual size %g; threshold size %g, master sizes: %g, %g", - midSize, - expectedSize, - size0, - size1, - ) log.debug("tolerance %g", this_tolerance) yield ( glyph_name, From 447e8b865d81440fdb7a1313e214ea230b4fc597 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 10:09:23 -0700 Subject: [PATCH 12/88] black --- Lib/fontTools/varLib/interpolatable.py | 29 ++++++++++++++++++---- Lib/fontTools/varLib/interpolatablePlot.py | 6 ++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 41b710ccd..1b4164dea 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -808,8 +808,9 @@ def test_gen( midVector = _contour_vector_from_stats(midStats) midSize = midVector[0] * midVector[0] - for overweight, problem_type in enumerate(("underweight", "overweight")): - + for overweight, problem_type in enumerate( + ("underweight", "overweight") + ): if overweight: expectedSize = (size0 * size1) ** 0.5 expectedSize = (size0 + size1) - expectedSize @@ -825,9 +826,10 @@ def test_gen( size1, ) if ( - (not overweight and expectedSize * tolerance > midSize + 1e-5) - or - (overweight and 1e-5 + expectedSize < midSize * tolerance) + not overweight + and expectedSize * tolerance > midSize + 1e-5 + ) or ( + overweight and 1e-5 + expectedSize < midSize * tolerance ): try: if overweight: @@ -1061,6 +1063,11 @@ def main(args=None): action="store", help="Output report in PDF format", ) + parser.add_argument( + "--ps", + action="store", + help="Output report in PostScript format", + ) parser.add_argument( "--html", action="store", @@ -1463,6 +1470,18 @@ def main(args=None): if not problems and not args.quiet: pdf.draw_cupcake() + if args.ps: + log.info("Writing PS to %s", args.pdf) + from .interpolatablePlot import InterpolatablePS + + with InterpolatablePS(args.ps, glyphsets=glyphsets, names=names) as ps: + ps.add_title_page( + original_args_inputs, tolerance=tolerance, kinkiness=kinkiness + ) + ps.add_problems(problems) + if not problems and not args.quiet: + ps.draw_cupcake() + if args.html: log.info("Writing HTML to %s", args.html) from .interpolatablePlot import InterpolatableSVG diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index c492dea42..8d5d74879 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -513,7 +513,11 @@ class InterpolatablePlot: midway_glyphset, glyphname, [{"type": "midway"}] - + [p for p in problems if p["type"] in ("kink", "underweight", "overweight")], + + [ + p + for p in problems + if p["type"] in ("kink", "underweight", "overweight") + ], None, x=x, y=y, From a15a9a946fc8f3f138bede4e7a1b385f9136cc66 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 11:18:10 -0700 Subject: [PATCH 13/88] [interpolatablePlot] Tweak overweight Still far from working. --- Lib/fontTools/varLib/interpolatable.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 1b4164dea..2335e6623 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -812,8 +812,9 @@ def test_gen( ("underweight", "overweight") ): if overweight: - expectedSize = (size0 * size1) ** 0.5 - expectedSize = (size0 + size1) - expectedSize + #expectedSize = (size0 * size1) ** 0.5 + #expectedSize = (size0 + size1) - expectedSize + expectedSize = (size0 + size1) * .5 else: expectedSize = (size0 * size1) ** 0.5 From 41ed903d4553f664765120d5da76c93fb720e38a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 11:37:20 -0700 Subject: [PATCH 14/88] [interpolatable] One more try at overweight --- Lib/fontTools/varLib/interpolatable.py | 33 ++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 2335e6623..44e197050 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -9,6 +9,7 @@ $ fonttools varLib.interpolatable font1 font2 ... from fontTools.pens.basePen import AbstractPen, BasePen from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen from fontTools.pens.recordingPen import RecordingPen +from fontTools.pens.boundsPen import ControlBoundsPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen from fontTools.pens.momentsPen import OpenContourError from fontTools.varLib.models import piecewiseLinearMap, normalizeLocation @@ -798,23 +799,41 @@ def test_gen( # self-intersecting contour; ignore it. contour = midRecording[ix] if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): - size0 = m0Vectors[ix][0] * m0Vectors[ix][0] - size1 = m1Vectors[ix][0] * m1Vectors[ix][0] - - size0, size1 = sorted((size0, size1)) midStats = StatisticsPen(glyphset=glyphset) contour.replay(midStats) midVector = _contour_vector_from_stats(midStats) + + size0 = m0Vectors[ix][0] * m0Vectors[ix][0] + size1 = m1Vectors[ix][0] * m1Vectors[ix][0] midSize = midVector[0] * midVector[0] + bounds0Pen = ControlBoundsPen(glyphsets[m0idx]) + bounds1Pen = ControlBoundsPen(glyphsets[m1idx]) + recording0[ix].replay(bounds0Pen) + recording1[ix].replay(bounds1Pen) + bounds0 = bounds0Pen.bounds or (0, 0, 0, 0) + bounds1 = bounds1Pen.bounds or (0, 0, 0, 0) + width0, height0 = bounds0[2] - bounds0[0], bounds0[3] - bounds0[1] + width1, height1 = bounds1[2] - bounds1[0], bounds1[3] - bounds1[1] + + try: + size0 /= width0 * height0 + size1 /= width1 * height1 + midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 + except ZeroDivisionError: + continue + + size0, size1 = sorted((size0, size1)) + for overweight, problem_type in enumerate( ("underweight", "overweight") ): if overweight: - #expectedSize = (size0 * size1) ** 0.5 - #expectedSize = (size0 + size1) - expectedSize - expectedSize = (size0 + size1) * .5 + expectedSize = (size0 * size1) ** 0.5 + expectedSize = (size0 + size1) - expectedSize + + #expectedSize = (size0 + size1) * .5 else: expectedSize = (size0 * size1) ** 0.5 From 875d17c3f0813776cbd44dd4645bd098f2f071f1 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 12:06:23 -0700 Subject: [PATCH 15/88] [interpolatable] Another approach --- Lib/fontTools/varLib/interpolatable.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 44e197050..2a09757cf 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -798,9 +798,11 @@ def test_gen( # The sign difference can happen if it's a werido # self-intersecting contour; ignore it. contour = midRecording[ix] + from .interpolatablePlot import LerpGlyphSet if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): - midStats = StatisticsPen(glyphset=glyphset) + midGlyphset = LerpGlyphSet(glyphsets[m0idx], glyphsets[m1idx]) + midStats = StatisticsPen(glyphset=midGlyphset) contour.replay(midStats) midVector = _contour_vector_from_stats(midStats) @@ -810,17 +812,21 @@ def test_gen( bounds0Pen = ControlBoundsPen(glyphsets[m0idx]) bounds1Pen = ControlBoundsPen(glyphsets[m1idx]) + boundsMidPen = ControlBoundsPen(midGlyphset) recording0[ix].replay(bounds0Pen) recording1[ix].replay(bounds1Pen) + contour.replay(boundsMidPen) bounds0 = bounds0Pen.bounds or (0, 0, 0, 0) bounds1 = bounds1Pen.bounds or (0, 0, 0, 0) + boundsMid = boundsMidPen.bounds or (0, 0, 0, 0) width0, height0 = bounds0[2] - bounds0[0], bounds0[3] - bounds0[1] width1, height1 = bounds1[2] - bounds1[0], bounds1[3] - bounds1[1] + widthMid, heightMid = boundsMid[2] - boundsMid[0], boundsMid[3] - boundsMid[1] try: size0 /= width0 * height0 size1 /= width1 * height1 - midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 + midSize /= widthMid * heightMid except ZeroDivisionError: continue From 456097513c578558906ae9a5298d9286fd9029dc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 28 Nov 2023 12:13:30 -0700 Subject: [PATCH 16/88] [interpolatable] Revert back some --- Lib/fontTools/varLib/interpolatable.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 2a09757cf..cf3e6cf26 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -812,26 +812,20 @@ def test_gen( bounds0Pen = ControlBoundsPen(glyphsets[m0idx]) bounds1Pen = ControlBoundsPen(glyphsets[m1idx]) - boundsMidPen = ControlBoundsPen(midGlyphset) recording0[ix].replay(bounds0Pen) recording1[ix].replay(bounds1Pen) - contour.replay(boundsMidPen) bounds0 = bounds0Pen.bounds or (0, 0, 0, 0) bounds1 = bounds1Pen.bounds or (0, 0, 0, 0) - boundsMid = boundsMidPen.bounds or (0, 0, 0, 0) width0, height0 = bounds0[2] - bounds0[0], bounds0[3] - bounds0[1] width1, height1 = bounds1[2] - bounds1[0], bounds1[3] - bounds1[1] - widthMid, heightMid = boundsMid[2] - boundsMid[0], boundsMid[3] - boundsMid[1] try: size0 /= width0 * height0 size1 /= width1 * height1 - midSize /= widthMid * heightMid + midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 except ZeroDivisionError: continue - size0, size1 = sorted((size0, size1)) - for overweight, problem_type in enumerate( ("underweight", "overweight") ): From 9506c3732a651e78885729a8706c6c625a12b2be Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 14:03:36 -0700 Subject: [PATCH 17/88] [interpolatable] ... --- Lib/fontTools/varLib/interpolatable.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index cf3e6cf26..d2422343f 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -847,7 +847,7 @@ def test_gen( ) if ( not overweight - and expectedSize * tolerance > midSize + 1e-5 + and expectedSize * tolerance * tolerance > midSize + 1e-5 ) or ( overweight and 1e-5 + expectedSize < midSize * tolerance ): @@ -855,7 +855,7 @@ def test_gen( if overweight: this_tolerance = expectedSize / midSize else: - this_tolerance = midSize / expectedSize + this_tolerance = sqrt(midSize / expectedSize) except ZeroDivisionError: this_tolerance = 0 log.debug("tolerance %g", this_tolerance) From 8f021c5e11e186585e74c94ec50aa54510ebe885 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 18:03:50 -0500 Subject: [PATCH 18/88] ... --- Lib/fontTools/varLib/interpolatable.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index d2422343f..85bb18bb5 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -820,9 +820,10 @@ def test_gen( width1, height1 = bounds1[2] - bounds1[0], bounds1[3] - bounds1[1] try: - size0 /= width0 * height0 - size1 /= width1 * height1 - midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 + pass + #size0 /= width0 * height0 + #size1 /= width1 * height1 + #midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 except ZeroDivisionError: continue @@ -833,7 +834,7 @@ def test_gen( expectedSize = (size0 * size1) ** 0.5 expectedSize = (size0 + size1) - expectedSize - #expectedSize = (size0 + size1) * .5 + expectedSize = (size0 + size1) * .5 else: expectedSize = (size0 * size1) ** 0.5 @@ -845,17 +846,19 @@ def test_gen( size0, size1, ) + power = 1 / tolerance + t = tolerance ** power if ( not overweight - and expectedSize * tolerance * tolerance > midSize + 1e-5 + and expectedSize * t > midSize + 1e-5 ) or ( - overweight and 1e-5 + expectedSize < midSize * tolerance + overweight and 1e-5 + expectedSize < midSize * t ): try: if overweight: - this_tolerance = expectedSize / midSize + this_tolerance = (expectedSize / midSize) ** (1 / power) else: - this_tolerance = sqrt(midSize / expectedSize) + this_tolerance = (midSize / expectedSize) ** (1 / power) except ZeroDivisionError: this_tolerance = 0 log.debug("tolerance %g", this_tolerance) From e516d8af48bb6f3d50c9644018c60678f0c9ab74 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 22:49:53 -0500 Subject: [PATCH 19/88] Another deadend --- Lib/fontTools/varLib/interpolatable.py | 128 ++++++++++++++++++------- 1 file changed, 96 insertions(+), 32 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 85bb18bb5..13f070f40 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -6,9 +6,10 @@ Call as: $ fonttools varLib.interpolatable font1 font2 ... """ -from fontTools.pens.basePen import AbstractPen, BasePen +from fontTools.pens.basePen import AbstractPen, BasePen, DecomposingPen from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen -from fontTools.pens.recordingPen import RecordingPen +from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen +from fontTools.pens.transformPen import TransformPen from fontTools.pens.boundsPen import ControlBoundsPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen from fontTools.pens.momentsPen import OpenContourError @@ -323,6 +324,46 @@ def _find_parents_and_order(glyphsets, locations): return parents, order +def transform_from_stats(stats, inverse=False): + + # https://cookierobotics.com/007/ + a = stats.varianceX + b = stats.covariance + c = stats.varianceY + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = ( + atan2(lambda1 - a, b) + if b != 0 + else (pi * 0.5 if a < c else 0) + ) + trans = Transform() + + if lambda2 < 0: + # XXX This is a hack. + # The problem is that the covariance matrix is singular. + # This happens when the contour is a line, or a circle. + # In that case, the covariance matrix is not a good + # representation of the contour. + # We should probably detect this earlier and avoid + # computing the covariance matrix in the first place. + # But for now, we just avoid the division by zero. + lambda2 = 0 + + if inverse: + trans = trans.translate(-stats.meanX, -stats.meanY) + trans = trans.rotate(-theta) + trans = trans.scale(1 / sqrt(lambda1), 1 / sqrt(lambda2)) + else: + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + trans = trans.rotate(theta) + trans = trans.translate(stats.meanX, stats.meanY) + + return trans + + def lerp_recordings(recording1, recording2, factor=0.5): pen = RecordingPen() value = pen.value @@ -382,11 +423,13 @@ def test_gen( for glyph_name in glyphs: log.info("Testing glyph %s", glyph_name) allGreenVectors = [] + allGreenVectorsNormalized = [] allControlVectors = [] allNodeTypes = [] allContourIsomorphisms = [] allContourPoints = [] allContourPens = [] + allContourPensNormalized = [] allGlyphs = [glyphset[glyph_name] for glyphset in glyphsets] if len([1 for glyph in allGlyphs if glyph is not None]) <= 1: continue @@ -402,9 +445,11 @@ def test_gen( allNodeTypes.append(None) allControlVectors.append(None) allGreenVectors.append(None) + allGreenVectorsNormalized.append(None) allContourIsomorphisms.append(None) allContourPoints.append(None) allContourPens.append(None) + allContourPensNormalized.append(None) continue perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) @@ -414,18 +459,22 @@ def test_gen( glyph.draw(perContourPen) contourPens = perContourPen.value del perContourPen + contourPensNormalized = [] contourControlVectors = [] contourGreenVectors = [] + contourGreenVectorsNormalized = [] contourIsomorphisms = [] contourPoints = [] nodeTypes = [] allNodeTypes.append(nodeTypes) allControlVectors.append(contourControlVectors) allGreenVectors.append(contourGreenVectors) + allGreenVectorsNormalized.append(contourGreenVectorsNormalized) allContourIsomorphisms.append(contourIsomorphisms) allContourPoints.append(contourPoints) allContourPens.append(contourPens) + allContourPensNormalized.append(contourPensNormalized) for ix, contour in enumerate(contourPens): contourOps = tuple(op for op, arg in contour.value) nodeTypes.append(contourOps) @@ -449,6 +498,21 @@ def test_gen( contourGreenVectors.append(_contour_vector_from_stats(greenStats)) contourControlVectors.append(_contour_vector_from_stats(controlStats)) + + # Save a "normalized" version of the outlines + + try: + rpen = DecomposingRecordingPen(glyphset) + tpen = TransformPen(rpen, transform_from_stats(greenStats, inverse=True)) + contour.replay(tpen) + contourPensNormalized.append(rpen) + except ZeroDivisionError: + contourPensNormalized.append(None) + + greenStats = StatisticsPen(glyphset=glyphset) + rpen.replay(greenStats) + contourGreenVectorsNormalized.append(_contour_vector_from_stats(greenStats)) + # Check starting point if contourOps[0] == "addComponent": continue @@ -649,14 +713,20 @@ def test_gen( m0 = allContourIsomorphisms[m0idx] m1Vectors = allGreenVectors[m1idx] m0Vectors = allGreenVectors[m0idx] + m1VectorsNormalized = allGreenVectorsNormalized[m1idx] + m0VectorsNormalized = allGreenVectorsNormalized[m0idx] recording0 = allContourPens[m0idx] recording1 = allContourPens[m1idx] + recording0Normalized = allContourPensNormalized[m0idx] + recording1Normalized = allContourPensNormalized[m1idx] # If contour-order is wrong, adjust it if matchings[m1idx] is not None and m1: # m1 is empty for composite glyphs m1 = [m1[i] for i in matchings[m1idx]] m1Vectors = [m1Vectors[i] for i in matchings[m1idx]] + m1VectorsNormalized = [m1VectorsNormalized[i] for i in matchings[m1idx]] recording1 = [recording1[i] for i in matchings[m1idx]] + recording1Normalized = [recording1Normalized[i] for i in matchings[m1idx]] midRecording = [] for c0, c1 in zip(recording0, recording1): @@ -799,44 +869,38 @@ def test_gen( # self-intersecting contour; ignore it. contour = midRecording[ix] from .interpolatablePlot import LerpGlyphSet - if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): + if contour and (m0VectorsNormalized[ix][0] < 0) == (m1VectorsNormalized[ix][0] < 0): - midGlyphset = LerpGlyphSet(glyphsets[m0idx], glyphsets[m1idx]) - midStats = StatisticsPen(glyphset=midGlyphset) + midStats = StatisticsPen(glyphset=None) contour.replay(midStats) - midVector = _contour_vector_from_stats(midStats) - size0 = m0Vectors[ix][0] * m0Vectors[ix][0] - size1 = m1Vectors[ix][0] * m1Vectors[ix][0] - midSize = midVector[0] * midVector[0] + midStatsNormalized = StatisticsPen(glyphset=None) + tpen = TransformPen(midStatsNormalized, transform_from_stats(midStats, inverse=True)) + contour.replay(tpen) - bounds0Pen = ControlBoundsPen(glyphsets[m0idx]) - bounds1Pen = ControlBoundsPen(glyphsets[m1idx]) - recording0[ix].replay(bounds0Pen) - recording1[ix].replay(bounds1Pen) - bounds0 = bounds0Pen.bounds or (0, 0, 0, 0) - bounds1 = bounds1Pen.bounds or (0, 0, 0, 0) - width0, height0 = bounds0[2] - bounds0[0], bounds0[3] - bounds0[1] - width1, height1 = bounds1[2] - bounds1[0], bounds1[3] - bounds1[1] + midVectorNormalized = _contour_vector_from_stats(midStatsNormalized) - try: - pass - #size0 /= width0 * height0 - #size1 /= width1 * height1 - #midSize /= (width0 + width1) * .5 * (height0 + height1) * .5 - except ZeroDivisionError: - continue + size0 = m0VectorsNormalized[ix][0] * m0VectorsNormalized[ix][0] + size1 = m1VectorsNormalized[ix][0] * m1VectorsNormalized[ix][0] + midSize = midVectorNormalized[0] * midVectorNormalized[0] + + power = 2 + t = tolerance ** power for overweight, problem_type in enumerate( ("underweight", "overweight") ): if overweight: - expectedSize = (size0 * size1) ** 0.5 + expectedSize = sqrt(size0 * size1) expectedSize = (size0 + size1) - expectedSize + expectedSize = size1 + (midSize - size1) * t + 1e-1 - expectedSize = (size0 + size1) * .5 + #expectedSize = (size0 + size1) * .5 else: - expectedSize = (size0 * size1) ** 0.5 + #expectedSize = sqrt(size0 * size1) + expectedSize = sqrt(size0 * size1) + expectedSize = size0 + (midSize - size0) * t + 1e-1 + expectedSize = sqrt(size0 * size1 * t) + 1e-1 log.debug( "%s: actual size %g; threshold size %g, master sizes: %g, %g", @@ -846,13 +910,13 @@ def test_gen( size0, size1, ) - power = 1 / tolerance - t = tolerance ** power + + size0, size1 = sorted((size0, size1)) + if ( - not overweight - and expectedSize * t > midSize + 1e-5 + not overweight and expectedSize < midSize ) or ( - overweight and 1e-5 + expectedSize < midSize * t + overweight and 1e-5 + expectedSize < midSize ): try: if overweight: From e23fa9195c26cf4c00edf3c27dee8627a314c904 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 22:51:59 -0500 Subject: [PATCH 20/88] [interpolatablePlot] Copy from interpolatable-overweight branch --- Lib/fontTools/varLib/interpolatablePlot.py | 123 +++++++++++++-------- 1 file changed, 74 insertions(+), 49 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 164d7ac03..8d5d74879 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -126,8 +126,18 @@ class InterpolatablePlot: \\\\ |||| |||| |||| // |||||||||||||||||||||||| """ - shrug_color = (0, 0.3, 0.3) + emoticon_color = (0, 0.3, 0.3) shrug = r"""\_(")_/""" + underweight = r""" + o +/|\ +/ \ +""" + overweight = r""" + o +/O\ +/ \ +""" def __init__(self, out, glyphsets, names=None, **kwargs): self.out = out @@ -468,7 +478,7 @@ class InterpolatablePlot: self.draw_glyph(glyphset, glyphname, problems, which, x=x, y=y) ) else: - self.draw_shrug(x=x, y=y) + self.draw_emoticon(self.shrug, x=x, y=y) y += self.height + self.pad if any( @@ -479,6 +489,7 @@ class InterpolatablePlot: "contour_order", "kink", "underweight", + "overweight", ) for pt in problem_types ): @@ -502,7 +513,11 @@ class InterpolatablePlot: midway_glyphset, glyphname, [{"type": "midway"}] - + [p for p in problems if p["type"] in ("kink", "underweight")], + + [ + p + for p in problems + if p["type"] in ("kink", "underweight", "overweight") + ], None, x=x, y=y, @@ -681,11 +696,16 @@ class InterpolatablePlot: scale=min(scales), ) except ValueError: - self.draw_shrug(x=x, y=y) + self.draw_emoticon(self.shrug, x=x, y=y) y += self.height + self.pad else: - self.draw_shrug(x=x, y=y) + emoticon = self.shrug + if "underweight" in problem_types: + emoticon = self.underweight + elif "overweight" in problem_types: + emoticon = self.overweight + self.draw_emoticon(emoticon, x=x, y=y) if show_page_number: self.draw_label( @@ -810,11 +830,11 @@ class InterpolatablePlot: cr.new_path() - if "underweight" in problem_types: + if "underweight" in problem_types or "overweight" in problem_types: perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) recording.replay(perContourPen) for problem in problems: - if problem["type"] == "underweight": + if problem["type"] in ("underweight", "overweight"): contour = perContourPen.value[problem["contour"]] contour.replay(CairoPen(glyphset, cr)) cr.set_source_rgba(*self.weight_issue_contour_color) @@ -1047,6 +1067,44 @@ class InterpolatablePlot: cr.fill() cr.restore() + def draw_text(self, text, *, x=0, y=0, color=(0, 0, 0), width=None, height=None): + if width is None: + width = self.width + if height is None: + height = self.height + + text = text.splitlines() + cr = cairo.Context(self.surface) + cr.set_source_rgb(*color) + cr.set_font_size(self.line_height) + cr.select_font_face( + "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL + ) + text_width = 0 + text_height = 0 + font_extents = cr.font_extents() + font_line_height = font_extents[2] + font_ascent = font_extents[0] + for line in text: + extents = cr.text_extents(line) + text_width = max(text_width, extents.width) + text_height += font_line_height + if not text_width: + return + cr.translate(x, y) + scale = min(width / text_width, height / text_height) + # center + cr.translate( + (width - text_width * scale) / 2, (height - text_height * scale) / 2 + ) + cr.scale(scale, scale) + + cr.translate(0, font_ascent) + for line in text: + cr.move_to(0, 0) + cr.show_text(line) + cr.translate(0, font_line_height) + def draw_cupcake(self): self.set_size(self.total_width(), self.total_height()) @@ -1060,50 +1118,17 @@ class InterpolatablePlot: bold=True, ) - cupcake = self.cupcake.splitlines() - cr = cairo.Context(self.surface) - cr.set_source_rgb(*self.cupcake_color) - cr.set_font_size(self.line_height) - cr.select_font_face( - "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL + self.draw_text( + self.cupcake, + x=self.pad, + y=self.pad + self.line_height, + width=self.total_width() - 2 * self.pad, + height=self.total_height() - 2 * self.pad - self.line_height, + color=self.cupcake_color, ) - width = 0 - height = 0 - font_extents = cr.font_extents() - font_line_height = font_extents[2] - font_ascent = font_extents[0] - for line in cupcake: - extents = cr.text_extents(line) - width = max(width, extents.width) - height += font_line_height - if not width: - return - cr.scale( - (self.total_width() - 2 * self.pad) / width, - (self.total_height() - 2 * self.pad - self.line_height) / height, - ) - cr.translate(self.pad, self.pad + font_ascent + self.line_height) - for line in cupcake: - cr.move_to(0, 0) - cr.show_text(line) - cr.translate(0, font_line_height) - def draw_shrug(self, x=0, y=0): - cr = cairo.Context(self.surface) - cr.translate(x, y) - cr.set_source_rgb(*self.shrug_color) - cr.set_font_size(self.line_height) - cr.select_font_face( - "@cairo:monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL - ) - extents = cr.text_extents(self.shrug) - if not extents.width: - return - cr.translate(0, self.height * 0.6) - scale = self.width / extents.width - cr.scale(scale, scale) - cr.move_to(-extents.x_bearing, 0) - cr.show_text(self.shrug) + def draw_emoticon(self, emoticon, x=0, y=0): + self.draw_text(emoticon, x=x, y=y, color=self.emoticon_color) class InterpolatablePostscriptLike(InterpolatablePlot): From 13ef1ba2f08b6e6e127f3bf6c88309ff82ec92cc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 22:55:44 -0500 Subject: [PATCH 21/88] [interpolatable] Add (unused) transform_from_stats --- Lib/fontTools/varLib/interpolatable.py | 35 ++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index ee47ac9a3..bd9dcad47 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -322,6 +322,41 @@ def _find_parents_and_order(glyphsets, locations): return parents, order +def _transform_from_stats(stats, inverse=False): + # https://cookierobotics.com/007/ + a = stats.varianceX + b = stats.covariance + c = stats.varianceY + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) + trans = Transform() + + if lambda2 < 0: + # XXX This is a hack. + # The problem is that the covariance matrix is singular. + # This happens when the contour is a line, or a circle. + # In that case, the covariance matrix is not a good + # representation of the contour. + # We should probably detect this earlier and avoid + # computing the covariance matrix in the first place. + # But for now, we just avoid the division by zero. + lambda2 = 0 + + if inverse: + trans = trans.translate(-stats.meanX, -stats.meanY) + trans = trans.rotate(-theta) + trans = trans.scale(1 / sqrt(lambda1), 1 / sqrt(lambda2)) + else: + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + trans = trans.rotate(theta) + trans = trans.translate(stats.meanX, stats.meanY) + + return trans + + def lerp_recordings(recording1, recording2, factor=0.5): pen = RecordingPen() value = pen.value From 16a096f42aa377fe061f48d5fc3ce1fcb3fa87da Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 12:48:46 -0500 Subject: [PATCH 22/88] Disable overweight test --- Lib/fontTools/varLib/interpolatable.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 13f070f40..04ab2ed72 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -884,7 +884,7 @@ def test_gen( size1 = m1VectorsNormalized[ix][0] * m1VectorsNormalized[ix][0] midSize = midVectorNormalized[0] * midVectorNormalized[0] - power = 2 + power = 1 t = tolerance ** power for overweight, problem_type in enumerate( @@ -896,11 +896,12 @@ def test_gen( expectedSize = size1 + (midSize - size1) * t + 1e-1 #expectedSize = (size0 + size1) * .5 + continue else: #expectedSize = sqrt(size0 * size1) expectedSize = sqrt(size0 * size1) - expectedSize = size0 + (midSize - size0) * t + 1e-1 - expectedSize = sqrt(size0 * size1 * t) + 1e-1 + #expectedSize = size0 + (midSize - size0) * t + 1e-1 + #expectedSize = sqrt(size0 * size1 * t) + 1e-1 log.debug( "%s: actual size %g; threshold size %g, master sizes: %g, %g", From 182c6d24d42c5d9ae76fdb042528ee280bb5a297 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 29 Nov 2023 23:00:21 -0500 Subject: [PATCH 23/88] [interpolatable] Minor names var use repr --- Lib/fontTools/varLib/interpolatable.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index bd9dcad47..0f455d76c 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -393,8 +393,7 @@ def test_gen( kinkiness *= 0.01 assert 0 <= kinkiness - if names is None: - names = glyphsets + names = names or [repr(g) for g in glyphsets] if glyphs is None: # `glyphs = glyphsets[0].keys()` is faster, certainly, but doesn't allow for sparse TTFs/OTFs given out of order From 4581d93c2621532b61b2bd1f866c14d26b753b40 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 12:50:53 -0500 Subject: [PATCH 24/88] [interpolatable] A rename --- Lib/fontTools/varLib/interpolatable.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 04ab2ed72..d82ebffd4 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -324,7 +324,7 @@ def _find_parents_and_order(glyphsets, locations): return parents, order -def transform_from_stats(stats, inverse=False): +def _transform_from_stats(stats, inverse=False): # https://cookierobotics.com/007/ a = stats.varianceX @@ -503,7 +503,7 @@ def test_gen( try: rpen = DecomposingRecordingPen(glyphset) - tpen = TransformPen(rpen, transform_from_stats(greenStats, inverse=True)) + tpen = TransformPen(rpen, _transform_from_stats(greenStats, inverse=True)) contour.replay(tpen) contourPensNormalized.append(rpen) except ZeroDivisionError: @@ -875,7 +875,7 @@ def test_gen( contour.replay(midStats) midStatsNormalized = StatisticsPen(glyphset=None) - tpen = TransformPen(midStatsNormalized, transform_from_stats(midStats, inverse=True)) + tpen = TransformPen(midStatsNormalized, _transform_from_stats(midStats, inverse=True)) contour.replay(tpen) midVectorNormalized = _contour_vector_from_stats(midStatsNormalized) From 8ad4df935efedebef6924ca9c22ec7b9bc18332a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 13:05:35 -0500 Subject: [PATCH 25/88] [interpolatable] Bring back into shape of the main branch --- Lib/fontTools/varLib/interpolatable.py | 37 +++++++++++++------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index d82ebffd4..2ae3b685f 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -869,20 +869,24 @@ def test_gen( # self-intersecting contour; ignore it. contour = midRecording[ix] from .interpolatablePlot import LerpGlyphSet - if contour and (m0VectorsNormalized[ix][0] < 0) == (m1VectorsNormalized[ix][0] < 0): + normalized = False + if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): - midStats = StatisticsPen(glyphset=None) - contour.replay(midStats) + if normalized: + midStats = StatisticsPen(glyphset=None) + tpen = TransformPen(midStats, _transform_from_stats(midStats, inverse=True)) + contour.replay(tpen) + else: + midStats = StatisticsPen(glyphset=None) + contour.replay(midStats) - midStatsNormalized = StatisticsPen(glyphset=None) - tpen = TransformPen(midStatsNormalized, _transform_from_stats(midStats, inverse=True)) - contour.replay(tpen) + midVector = _contour_vector_from_stats(midStats) - midVectorNormalized = _contour_vector_from_stats(midStatsNormalized) - - size0 = m0VectorsNormalized[ix][0] * m0VectorsNormalized[ix][0] - size1 = m1VectorsNormalized[ix][0] * m1VectorsNormalized[ix][0] - midSize = midVectorNormalized[0] * midVectorNormalized[0] + m0Vec = m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] + m1Vec = m1Vectors[ix] if not normalized else m1VectorsNormalized[ix] + size0 = m0Vec[0] * m0Vec[0] + size1 = m1Vec[0] * m1Vec[0] + midSize = midVector[0] * midVector[0] power = 1 t = tolerance ** power @@ -893,15 +897,10 @@ def test_gen( if overweight: expectedSize = sqrt(size0 * size1) expectedSize = (size0 + size1) - expectedSize - expectedSize = size1 + (midSize - size1) * t + 1e-1 - - #expectedSize = (size0 + size1) * .5 + expectedSize = size1 + (midSize - size1) continue else: - #expectedSize = sqrt(size0 * size1) expectedSize = sqrt(size0 * size1) - #expectedSize = size0 + (midSize - size0) * t + 1e-1 - #expectedSize = sqrt(size0 * size1 * t) + 1e-1 log.debug( "%s: actual size %g; threshold size %g, master sizes: %g, %g", @@ -915,9 +914,9 @@ def test_gen( size0, size1 = sorted((size0, size1)) if ( - not overweight and expectedSize < midSize + not overweight and expectedSize * tolerance + 1e-5 > midSize ) or ( - overweight and 1e-5 + expectedSize < midSize + overweight and 1e-5 + expectedSize / tolerance < midSize ): try: if overweight: From 207a67e7d5a2d48072e57ddf2254c44dd5b3dd10 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 13:32:28 -0500 Subject: [PATCH 26/88] [interpolatable] Fix bots --- Lib/fontTools/varLib/interpolatable.py | 33 +++++++++++++++++++++- Lib/fontTools/varLib/interpolatablePlot.py | 33 +--------------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 5aa47fc38..4bab07451 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -359,6 +359,38 @@ def _transform_from_stats(stats, inverse=False): return trans +class LerpGlyphSet: + def __init__(self, glyphset1, glyphset2, factor=0.5): + self.glyphset1 = glyphset1 + self.glyphset2 = glyphset2 + self.factor = factor + + def __getitem__(self, glyphname): + return LerpGlyph(glyphname, self) + + +class LerpGlyph: + def __init__(self, glyphname, glyphset): + self.glyphset = glyphset + self.glyphname = glyphname + + def draw(self, pen): + recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) + self.glyphset.glyphset1[self.glyphname].draw(recording1) + recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) + self.glyphset.glyphset2[self.glyphname].draw(recording2) + + factor = self.glyphset.factor + for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): + if op1 != op2: + raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + getattr(pen, op1)(*mid_args) + + def lerp_recordings(recording1, recording2, factor=0.5): pen = RecordingPen() value = pen.value @@ -867,7 +899,6 @@ def test_gen( # The sign difference can happen if it's a werido # self-intersecting contour; ignore it. contour = midRecording[ix] - from .interpolatablePlot import LerpGlyphSet normalized = False if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 8d5d74879..63e886fef 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -14,6 +14,7 @@ from fontTools.pens.pointPen import ( from fontTools.varLib.interpolatable import ( PerContourOrComponentPen, SimpleRecordingPointPen, + LerpGlyphSet, ) from itertools import cycle from functools import wraps @@ -26,38 +27,6 @@ import logging log = logging.getLogger("fontTools.varLib.interpolatable") -class LerpGlyphSet: - def __init__(self, glyphset1, glyphset2, factor=0.5): - self.glyphset1 = glyphset1 - self.glyphset2 = glyphset2 - self.factor = factor - - def __getitem__(self, glyphname): - return LerpGlyph(glyphname, self) - - -class LerpGlyph: - def __init__(self, glyphname, glyphset): - self.glyphset = glyphset - self.glyphname = glyphname - - def draw(self, pen): - recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) - self.glyphset.glyphset1[self.glyphname].draw(recording1) - recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) - self.glyphset.glyphset2[self.glyphname].draw(recording2) - - factor = self.glyphset.factor - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - getattr(pen, op1)(*mid_args) - - class OverridingDict(dict): def __init__(self, parent_dict): self.parent_dict = parent_dict From e3887b724d7f6ed3933f74e53fc1a78d57271ab3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 15:58:18 -0500 Subject: [PATCH 27/88] [interpolatable] Fix epsilon handling --- Lib/fontTools/varLib/interpolatable.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 4bab07451..297623d08 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -951,7 +951,7 @@ def test_gen( if ( not overweight - and expectedSize * tolerance + 1e-5 > midSize + and expectedSize * tolerance > midSize + 1e-5 ) or ( overweight and 1e-5 + expectedSize / tolerance < midSize ): From 4994dfe909759a1a7ce96c2930aaa07151f72e24 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 16:07:42 -0500 Subject: [PATCH 28/88] [interpolatablePlot] Fix zero-point contours --- Lib/fontTools/varLib/interpolatablePlot.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 63e886fef..2772e1b95 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -923,7 +923,10 @@ class InterpolatablePlot: continue if first_pt is None: continue - second_pt = args[0] + if segment == "closePath": + second_pt = first_pt + else: + second_pt = args[0] if idx is None or i == idx: cr.save() From d9b9b3a1f66a4c2e97b9e3e4410185ddb20cba3d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 16:13:22 -0500 Subject: [PATCH 29/88] [interpolatablePlot] Tweak colors a bit --- Lib/fontTools/varLib/interpolatablePlot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 2772e1b95..545a49a25 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -52,7 +52,7 @@ class InterpolatablePlot: oncurve_node_diameter = 10 offcurve_node_color = (0, 0.5, 0, 0.7) offcurve_node_diameter = 8 - handle_color = (0.2, 1, 0.2, 0.5) + handle_color = (0, 0.5, 0, 0.7) handle_width = 1 corrected_start_point_color = (0, 0.9, 0, 0.7) corrected_start_point_size = 15 From 67a8706ed46a825fd014d221f8e6f21fd4c7f1f7 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 17:06:22 -0500 Subject: [PATCH 30/88] [interpolatable] Move some code into a helper file --- Lib/fontTools/varLib/interpolatable.py | 415 +----------------- Lib/fontTools/varLib/interpolatableHelpers.py | 384 ++++++++++++++++ Lib/fontTools/varLib/interpolatablePlot.py | 19 +- 3 files changed, 413 insertions(+), 405 deletions(-) create mode 100644 Lib/fontTools/varLib/interpolatableHelpers.py diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 297623d08..26127aff3 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -6,22 +6,19 @@ Call as: $ fonttools varLib.interpolatable font1 font2 ... """ -from fontTools.pens.basePen import AbstractPen, BasePen, DecomposingPen -from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen +from .interpolatableHelpers import * from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen from fontTools.pens.transformPen import TransformPen -from fontTools.pens.boundsPen import ControlBoundsPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen from fontTools.pens.momentsPen import OpenContourError from fontTools.varLib.models import piecewiseLinearMap, normalizeLocation from fontTools.misc.fixedTools import floatToFixedToStr from fontTools.misc.transform import Transform -from collections import defaultdict, deque +from collections import defaultdict from types import SimpleNamespace from functools import wraps from pprint import pformat -from math import sqrt, copysign, atan2, pi -import itertools +from math import sqrt, atan2, pi import logging log = logging.getLogger("fontTools.varLib.interpolatable") @@ -32,382 +29,6 @@ DEFAULT_KINKINESS_LENGTH = 0.002 # ratio of UPEM DEFAULT_UPEM = 1000 -def _rot_list(l, k): - """Rotate list by k items forward. Ie. item at position 0 will be - at position k in returned list. Negative k is allowed.""" - return l[-k:] + l[:-k] - - -class PerContourPen(BasePen): - def __init__(self, Pen, glyphset=None): - BasePen.__init__(self, glyphset) - self._glyphset = glyphset - self._Pen = Pen - self._pen = None - self.value = [] - - def _moveTo(self, p0): - self._newItem() - self._pen.moveTo(p0) - - def _lineTo(self, p1): - self._pen.lineTo(p1) - - def _qCurveToOne(self, p1, p2): - self._pen.qCurveTo(p1, p2) - - def _curveToOne(self, p1, p2, p3): - self._pen.curveTo(p1, p2, p3) - - def _closePath(self): - self._pen.closePath() - self._pen = None - - def _endPath(self): - self._pen.endPath() - self._pen = None - - def _newItem(self): - self._pen = pen = self._Pen() - self.value.append(pen) - - -class PerContourOrComponentPen(PerContourPen): - def addComponent(self, glyphName, transformation): - self._newItem() - self.value[-1].addComponent(glyphName, transformation) - - -class SimpleRecordingPointPen(AbstractPointPen): - def __init__(self): - self.value = [] - - def beginPath(self, identifier=None, **kwargs): - pass - - def endPath(self) -> None: - pass - - def addPoint(self, pt, segmentType=None): - self.value.append((pt, False if segmentType is None else True)) - - -def _vdiff_hypot2(v0, v1): - s = 0 - for x0, x1 in zip(v0, v1): - d = x1 - x0 - s += d * d - return s - - -def _vdiff_hypot2_complex(v0, v1): - s = 0 - for x0, x1 in zip(v0, v1): - d = x1 - x0 - s += d.real * d.real + d.imag * d.imag - # This does the same but seems to be slower: - # s += (d * d.conjugate()).real - return s - - -def _hypot2_complex(d): - return d.real * d.real + d.imag * d.imag - - -def _matching_cost(G, matching): - return sum(G[i][j] for i, j in enumerate(matching)) - - -def min_cost_perfect_bipartite_matching_scipy(G): - n = len(G) - rows, cols = linear_sum_assignment(G) - assert (rows == list(range(n))).all() - return list(cols), _matching_cost(G, cols) - - -def min_cost_perfect_bipartite_matching_munkres(G): - n = len(G) - cols = [None] * n - for row, col in Munkres().compute(G): - cols[row] = col - return cols, _matching_cost(G, cols) - - -def min_cost_perfect_bipartite_matching_bruteforce(G): - n = len(G) - - if n > 6: - raise Exception("Install Python module 'munkres' or 'scipy >= 0.17.0'") - - # Otherwise just brute-force - permutations = itertools.permutations(range(n)) - best = list(next(permutations)) - best_cost = _matching_cost(G, best) - for p in permutations: - cost = _matching_cost(G, p) - if cost < best_cost: - best, best_cost = list(p), cost - return best, best_cost - - -try: - from scipy.optimize import linear_sum_assignment - - min_cost_perfect_bipartite_matching = min_cost_perfect_bipartite_matching_scipy -except ImportError: - try: - from munkres import Munkres - - min_cost_perfect_bipartite_matching = ( - min_cost_perfect_bipartite_matching_munkres - ) - except ImportError: - min_cost_perfect_bipartite_matching = ( - min_cost_perfect_bipartite_matching_bruteforce - ) - - -def _contour_vector_from_stats(stats): - # Don't change the order of items here. - # It's okay to add to the end, but otherwise, other - # code depends on it. Search for "covariance". - size = sqrt(abs(stats.area)) - return ( - copysign((size), stats.area), - stats.meanX, - stats.meanY, - stats.stddevX * 2, - stats.stddevY * 2, - stats.correlation * size, - ) - - -def _matching_for_vectors(m0, m1): - n = len(m0) - - identity_matching = list(range(n)) - - costs = [[_vdiff_hypot2(v0, v1) for v1 in m1] for v0 in m0] - ( - matching, - matching_cost, - ) = min_cost_perfect_bipartite_matching(costs) - identity_cost = sum(costs[i][i] for i in range(n)) - return matching, matching_cost, identity_cost - - -def _points_characteristic_bits(points): - bits = 0 - for pt, b in reversed(points): - bits = (bits << 1) | b - return bits - - -_NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR = 4 - - -def _points_complex_vector(points): - vector = [] - if not points: - return vector - points = [complex(*pt) for pt, _ in points] - n = len(points) - assert _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR == 4 - points.extend(points[: _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR - 1]) - while len(points) < _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR: - points.extend(points[: _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR - 1]) - for i in range(n): - # The weights are magic numbers. - - # The point itself - p0 = points[i] - vector.append(p0) - - # The vector to the next point - p1 = points[i + 1] - d0 = p1 - p0 - vector.append(d0 * 3) - - # The turn vector - p2 = points[i + 2] - d1 = p2 - p1 - vector.append(d1 - d0) - - # The angle to the next point, as a cross product; - # Square root of, to match dimentionality of distance. - cross = d0.real * d1.imag - d0.imag * d1.real - cross = copysign(sqrt(abs(cross)), cross) - vector.append(cross * 4) - - return vector - - -def _add_isomorphisms(points, isomorphisms, reverse): - reference_bits = _points_characteristic_bits(points) - n = len(points) - - # if points[0][0] == points[-1][0]: - # abort - - if reverse: - points = points[::-1] - bits = _points_characteristic_bits(points) - else: - bits = reference_bits - - vector = _points_complex_vector(points) - - assert len(vector) % n == 0 - mult = len(vector) // n - mask = (1 << n) - 1 - - for i in range(n): - b = ((bits << (n - i)) & mask) | (bits >> i) - if b == reference_bits: - isomorphisms.append( - (_rot_list(vector, -i * mult), n - 1 - i if reverse else i, reverse) - ) - - -def _find_parents_and_order(glyphsets, locations): - parents = [None] + list(range(len(glyphsets) - 1)) - order = list(range(len(glyphsets))) - if locations: - # Order base master first - bases = (i for i, l in enumerate(locations) if all(v == 0 for v in l.values())) - if bases: - base = next(bases) - logging.info("Base master index %s, location %s", base, locations[base]) - else: - base = 0 - logging.warning("No base master location found") - - # Form a minimum spanning tree of the locations - try: - from scipy.sparse.csgraph import minimum_spanning_tree - - graph = [[0] * len(locations) for _ in range(len(locations))] - axes = set() - for l in locations: - axes.update(l.keys()) - axes = sorted(axes) - vectors = [tuple(l.get(k, 0) for k in axes) for l in locations] - for i, j in itertools.combinations(range(len(locations)), 2): - graph[i][j] = _vdiff_hypot2(vectors[i], vectors[j]) - - tree = minimum_spanning_tree(graph) - rows, cols = tree.nonzero() - graph = defaultdict(set) - for row, col in zip(rows, cols): - graph[row].add(col) - graph[col].add(row) - - # Traverse graph from the base and assign parents - parents = [None] * len(locations) - order = [] - visited = set() - queue = deque([base]) - while queue: - i = queue.popleft() - visited.add(i) - order.append(i) - for j in sorted(graph[i]): - if j not in visited: - parents[j] = i - queue.append(j) - - except ImportError: - pass - - log.info("Parents: %s", parents) - log.info("Order: %s", order) - return parents, order - - -def _transform_from_stats(stats, inverse=False): - # https://cookierobotics.com/007/ - a = stats.varianceX - b = stats.covariance - c = stats.varianceY - - delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 - lambda1 = (a + c) * 0.5 + delta # Major eigenvalue - lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue - theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) - trans = Transform() - - if lambda2 < 0: - # XXX This is a hack. - # The problem is that the covariance matrix is singular. - # This happens when the contour is a line, or a circle. - # In that case, the covariance matrix is not a good - # representation of the contour. - # We should probably detect this earlier and avoid - # computing the covariance matrix in the first place. - # But for now, we just avoid the division by zero. - lambda2 = 0 - - if inverse: - trans = trans.translate(-stats.meanX, -stats.meanY) - trans = trans.rotate(-theta) - trans = trans.scale(1 / sqrt(lambda1), 1 / sqrt(lambda2)) - else: - trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) - trans = trans.rotate(theta) - trans = trans.translate(stats.meanX, stats.meanY) - - return trans - - -class LerpGlyphSet: - def __init__(self, glyphset1, glyphset2, factor=0.5): - self.glyphset1 = glyphset1 - self.glyphset2 = glyphset2 - self.factor = factor - - def __getitem__(self, glyphname): - return LerpGlyph(glyphname, self) - - -class LerpGlyph: - def __init__(self, glyphname, glyphset): - self.glyphset = glyphset - self.glyphname = glyphname - - def draw(self, pen): - recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) - self.glyphset.glyphset1[self.glyphname].draw(recording1) - recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) - self.glyphset.glyphset2[self.glyphname].draw(recording2) - - factor = self.glyphset.factor - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - getattr(pen, op1)(*mid_args) - - -def lerp_recordings(recording1, recording2, factor=0.5): - pen = RecordingPen() - value = pen.value - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatched operations: %s, %s" % (op1, op2)) - if op1 == "addComponent": - mid_args = args1 # XXX Interpolate transformation? - else: - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - value.append((op1, mid_args)) - return pen - - def test_gen( glyphsets, glyphs=None, @@ -434,7 +55,7 @@ def test_gen( # ... risks the sparse master being the first one, and only processing a subset of the glyphs glyphs = {g for glyphset in glyphsets for g in glyphset.keys()} - parents, order = _find_parents_and_order(glyphsets, locations) + parents, order = find_parents_and_order(glyphsets, locations) def grand_parent(i, glyphname): if i is None: @@ -521,15 +142,15 @@ def test_gen( }, ) continue - contourGreenVectors.append(_contour_vector_from_stats(greenStats)) - contourControlVectors.append(_contour_vector_from_stats(controlStats)) + contourGreenVectors.append(contour_vector_from_stats(greenStats)) + contourControlVectors.append(contour_vector_from_stats(controlStats)) # Save a "normalized" version of the outlines try: rpen = DecomposingRecordingPen(glyphset) tpen = TransformPen( - rpen, _transform_from_stats(greenStats, inverse=True) + rpen, transform_from_stats(greenStats, inverse=True) ) contour.replay(tpen) contourPensNormalized.append(rpen) @@ -539,7 +160,7 @@ def test_gen( greenStats = StatisticsPen(glyphset=glyphset) rpen.replay(greenStats) contourGreenVectorsNormalized.append( - _contour_vector_from_stats(greenStats) + contour_vector_from_stats(greenStats) ) # Check starting point @@ -558,9 +179,9 @@ def test_gen( contourIsomorphisms.append(isomorphisms) # Add rotations - _add_isomorphisms(points.value, isomorphisms, False) + add_isomorphisms(points.value, isomorphisms, False) # Add mirrored rotations - _add_isomorphisms(points.value, isomorphisms, True) + add_isomorphisms(points.value, isomorphisms, True) contourPoints.append(points.value) @@ -658,7 +279,7 @@ def test_gen( matching_control, matching_cost_control, identity_cost_control, - ) = _matching_for_vectors(m0Control, m1Control) + ) = matching_for_vectors(m0Control, m1Control) done = matching_cost_control == identity_cost_control if not done: m1Green = allGreenVectors[m1idx] @@ -667,7 +288,7 @@ def test_gen( matching_green, matching_cost_green, identity_cost_green, - ) = _matching_for_vectors(m0Green, m1Green) + ) = matching_for_vectors(m0Green, m1Green) done = matching_cost_green == identity_cost_green if not done: @@ -682,7 +303,7 @@ def test_gen( matching_control_reversed, matching_cost_control_reversed, identity_cost_control_reversed, - ) = _matching_for_vectors(m0Control, m1ControlReversed) + ) = matching_for_vectors(m0Control, m1ControlReversed) done = ( matching_cost_control_reversed == identity_cost_control_reversed ) @@ -692,7 +313,7 @@ def test_gen( matching_control_reversed, matching_cost_control_reversed, identity_cost_control_reversed, - ) = _matching_for_vectors(m0Control, m1ControlReversed) + ) = matching_for_vectors(m0Control, m1ControlReversed) done = ( matching_cost_control_reversed == identity_cost_control_reversed ) @@ -775,7 +396,7 @@ def test_gen( c0 = contour0[0] # Next few lines duplicated below. - costs = [_vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] + costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] @@ -860,7 +481,7 @@ def test_gen( # Next few lines duplicate from above. costs = [ - _vdiff_hypot2_complex(new_c0[0], new_c1[0]) + vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 ] min_cost_idx, min_cost = min( @@ -905,14 +526,14 @@ def test_gen( if normalized: midStats = StatisticsPen(glyphset=None) tpen = TransformPen( - midStats, _transform_from_stats(midStats, inverse=True) + midStats, transform_from_stats(midStats, inverse=True) ) contour.replay(tpen) else: midStats = StatisticsPen(glyphset=None) contour.replay(midStats) - midVector = _contour_vector_from_stats(midStats) + midVector = contour_vector_from_stats(midStats) m0Vec = ( m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py new file mode 100644 index 000000000..d20a3d054 --- /dev/null +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -0,0 +1,384 @@ +from fontTools.pens.basePen import AbstractPen, BasePen, DecomposingPen +from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen +from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen +from fontTools.misc.transform import Transform +from collections import defaultdict, deque +from math import sqrt, copysign, atan2, pi +import itertools + +import logging + +log = logging.getLogger("fontTools.varLib.interpolatable") + +def rot_list(l, k): + """Rotate list by k items forward. Ie. item at position 0 will be + at position k in returned list. Negative k is allowed.""" + return l[-k:] + l[:-k] + + +class PerContourPen(BasePen): + def __init__(self, Pen, glyphset=None): + BasePen.__init__(self, glyphset) + self._glyphset = glyphset + self._Pen = Pen + self._pen = None + self.value = [] + + def _moveTo(self, p0): + self._newItem() + self._pen.moveTo(p0) + + def _lineTo(self, p1): + self._pen.lineTo(p1) + + def _qCurveToOne(self, p1, p2): + self._pen.qCurveTo(p1, p2) + + def _curveToOne(self, p1, p2, p3): + self._pen.curveTo(p1, p2, p3) + + def _closePath(self): + self._pen.closePath() + self._pen = None + + def _endPath(self): + self._pen.endPath() + self._pen = None + + def _newItem(self): + self._pen = pen = self._Pen() + self.value.append(pen) + + +class PerContourOrComponentPen(PerContourPen): + def addComponent(self, glyphName, transformation): + self._newItem() + self.value[-1].addComponent(glyphName, transformation) + + +class SimpleRecordingPointPen(AbstractPointPen): + def __init__(self): + self.value = [] + + def beginPath(self, identifier=None, **kwargs): + pass + + def endPath(self) -> None: + pass + + def addPoint(self, pt, segmentType=None): + self.value.append((pt, False if segmentType is None else True)) + + +def vdiff_hypot2(v0, v1): + s = 0 + for x0, x1 in zip(v0, v1): + d = x1 - x0 + s += d * d + return s + + +def vdiff_hypot2_complex(v0, v1): + s = 0 + for x0, x1 in zip(v0, v1): + d = x1 - x0 + s += d.real * d.real + d.imag * d.imag + # This does the same but seems to be slower: + # s += (d * d.conjugate()).real + return s + + +def matching_cost(G, matching): + return sum(G[i][j] for i, j in enumerate(matching)) + + +def min_cost_perfect_bipartite_matching_scipy(G): + n = len(G) + rows, cols = linear_sum_assignment(G) + assert (rows == list(range(n))).all() + return list(cols), matching_cost(G, cols) + + +def min_cost_perfect_bipartite_matching_munkres(G): + n = len(G) + cols = [None] * n + for row, col in Munkres().compute(G): + cols[row] = col + return cols, matching_cost(G, cols) + + +def min_cost_perfect_bipartite_matching_bruteforce(G): + n = len(G) + + if n > 6: + raise Exception("Install Python module 'munkres' or 'scipy >= 0.17.0'") + + # Otherwise just brute-force + permutations = itertools.permutations(range(n)) + best = list(next(permutations)) + best_cost = matching_cost(G, best) + for p in permutations: + cost = matching_cost(G, p) + if cost < best_cost: + best, best_cost = list(p), cost + return best, best_cost + + +try: + from scipy.optimize import linear_sum_assignment + + min_cost_perfect_bipartite_matching = min_cost_perfect_bipartite_matching_scipy +except ImportError: + try: + from munkres import Munkres + + min_cost_perfect_bipartite_matching = ( + min_cost_perfect_bipartite_matching_munkres + ) + except ImportError: + min_cost_perfect_bipartite_matching = ( + min_cost_perfect_bipartite_matching_bruteforce + ) + + +def contour_vector_from_stats(stats): + # Don't change the order of items here. + # It's okay to add to the end, but otherwise, other + # code depends on it. Search for "covariance". + size = sqrt(abs(stats.area)) + return ( + copysign((size), stats.area), + stats.meanX, + stats.meanY, + stats.stddevX * 2, + stats.stddevY * 2, + stats.correlation * size, + ) + + +def matching_for_vectors(m0, m1): + n = len(m0) + + identity_matching = list(range(n)) + + costs = [[vdiff_hypot2(v0, v1) for v1 in m1] for v0 in m0] + ( + matching, + matching_cost, + ) = min_cost_perfect_bipartite_matching(costs) + identity_cost = sum(costs[i][i] for i in range(n)) + return matching, matching_cost, identity_cost + + +def points_characteristic_bits(points): + bits = 0 + for pt, b in reversed(points): + bits = (bits << 1) | b + return bits + + +_NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR = 4 + + +def points_complex_vector(points): + vector = [] + if not points: + return vector + points = [complex(*pt) for pt, _ in points] + n = len(points) + assert _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR == 4 + points.extend(points[: _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR - 1]) + while len(points) < _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR: + points.extend(points[: _NUM_ITEMS_PER_POINTS_COMPLEX_VECTOR - 1]) + for i in range(n): + # The weights are magic numbers. + + # The point itself + p0 = points[i] + vector.append(p0) + + # The vector to the next point + p1 = points[i + 1] + d0 = p1 - p0 + vector.append(d0 * 3) + + # The turn vector + p2 = points[i + 2] + d1 = p2 - p1 + vector.append(d1 - d0) + + # The angle to the next point, as a cross product; + # Square root of, to match dimentionality of distance. + cross = d0.real * d1.imag - d0.imag * d1.real + cross = copysign(sqrt(abs(cross)), cross) + vector.append(cross * 4) + + return vector + + +def add_isomorphisms(points, isomorphisms, reverse): + reference_bits = points_characteristic_bits(points) + n = len(points) + + # if points[0][0] == points[-1][0]: + # abort + + if reverse: + points = points[::-1] + bits = points_characteristic_bits(points) + else: + bits = reference_bits + + vector = points_complex_vector(points) + + assert len(vector) % n == 0 + mult = len(vector) // n + mask = (1 << n) - 1 + + for i in range(n): + b = ((bits << (n - i)) & mask) | (bits >> i) + if b == reference_bits: + isomorphisms.append( + (rot_list(vector, -i * mult), n - 1 - i if reverse else i, reverse) + ) + + +def find_parents_and_order(glyphsets, locations): + parents = [None] + list(range(len(glyphsets) - 1)) + order = list(range(len(glyphsets))) + if locations: + # Order base master first + bases = (i for i, l in enumerate(locations) if all(v == 0 for v in l.values())) + if bases: + base = next(bases) + logging.info("Base master index %s, location %s", base, locations[base]) + else: + base = 0 + logging.warning("No base master location found") + + # Form a minimum spanning tree of the locations + try: + from scipy.sparse.csgraph import minimum_spanning_tree + + graph = [[0] * len(locations) for _ in range(len(locations))] + axes = set() + for l in locations: + axes.update(l.keys()) + axes = sorted(axes) + vectors = [tuple(l.get(k, 0) for k in axes) for l in locations] + for i, j in itertools.combinations(range(len(locations)), 2): + graph[i][j] = vdiff_hypot2(vectors[i], vectors[j]) + + tree = minimum_spanning_tree(graph) + rows, cols = tree.nonzero() + graph = defaultdict(set) + for row, col in zip(rows, cols): + graph[row].add(col) + graph[col].add(row) + + # Traverse graph from the base and assign parents + parents = [None] * len(locations) + order = [] + visited = set() + queue = deque([base]) + while queue: + i = queue.popleft() + visited.add(i) + order.append(i) + for j in sorted(graph[i]): + if j not in visited: + parents[j] = i + queue.append(j) + + except ImportError: + pass + + log.info("Parents: %s", parents) + log.info("Order: %s", order) + return parents, order + + +def transform_from_stats(stats, inverse=False): + # https://cookierobotics.com/007/ + a = stats.varianceX + b = stats.covariance + c = stats.varianceY + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) + trans = Transform() + + if lambda2 < 0: + # XXX This is a hack. + # The problem is that the covariance matrix is singular. + # This happens when the contour is a line, or a circle. + # In that case, the covariance matrix is not a good + # representation of the contour. + # We should probably detect this earlier and avoid + # computing the covariance matrix in the first place. + # But for now, we just avoid the division by zero. + lambda2 = 0 + + if inverse: + trans = trans.translate(-stats.meanX, -stats.meanY) + trans = trans.rotate(-theta) + trans = trans.scale(1 / sqrt(lambda1), 1 / sqrt(lambda2)) + else: + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + trans = trans.rotate(theta) + trans = trans.translate(stats.meanX, stats.meanY) + + return trans + + +class LerpGlyphSet: + def __init__(self, glyphset1, glyphset2, factor=0.5): + self.glyphset1 = glyphset1 + self.glyphset2 = glyphset2 + self.factor = factor + + def __getitem__(self, glyphname): + return LerpGlyph(glyphname, self) + + +class LerpGlyph: + def __init__(self, glyphname, glyphset): + self.glyphset = glyphset + self.glyphname = glyphname + + def draw(self, pen): + recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) + self.glyphset.glyphset1[self.glyphname].draw(recording1) + recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) + self.glyphset.glyphset2[self.glyphname].draw(recording2) + + factor = self.glyphset.factor + for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): + if op1 != op2: + raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + getattr(pen, op1)(*mid_args) + + +def lerp_recordings(recording1, recording2, factor=0.5): + pen = RecordingPen() + value = pen.value + for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): + if op1 != op2: + raise ValueError("Mismatched operations: %s, %s" % (op1, op2)) + if op1 == "addComponent": + mid_args = args1 # XXX Interpolate transformation? + else: + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + value.append((op1, mid_args)) + return pen + + diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 545a49a25..3f68e436a 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -226,9 +226,10 @@ class InterpolatablePlot: cr.rectangle(xx - self.pad * 0.7, y, 1.5 * self.pad, self.line_height) cr.set_source_rgb(*self.fill_color) cr.fill_preserve() - cr.set_source_rgb(*self.stroke_color) - cr.set_line_width(self.stroke_width) - cr.stroke_preserve() + if self.stroke_color: + cr.set_source_rgb(*self.stroke_color) + cr.set_line_width(self.stroke_width) + cr.stroke_preserve() cr.set_source_rgba(*self.weight_issue_contour_color) cr.fill() y -= self.pad + self.line_height @@ -237,11 +238,13 @@ class InterpolatablePlot: "Colored contours: contours with the wrong order", x=xxx, y=y, width=width ) cr.rectangle(xx - self.pad * 0.7, y, 1.5 * self.pad, self.line_height) - cr.set_source_rgb(*self.fill_color) - cr.fill_preserve() - cr.set_source_rgb(*self.stroke_color) - cr.set_line_width(self.stroke_width) - cr.stroke_preserve() + if self.fill_color: + cr.set_source_rgb(*self.fill_color) + cr.fill_preserve() + if self.stroke_color: + cr.set_source_rgb(*self.stroke_color) + cr.set_line_width(self.stroke_width) + cr.stroke_preserve() cr.set_source_rgba(*self.contour_colors[0], self.contour_alpha) cr.fill() y -= self.pad + self.line_height From 7993bad2c4d2cd5cf73362bf4e8041ce4d9c6a78 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 23:18:46 -0500 Subject: [PATCH 31/88] [interpolatable] Add a Glyph class --- Lib/fontTools/varLib/interpolatable.py | 273 +++++++++++++------------ 1 file changed, 147 insertions(+), 126 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 26127aff3..3088f6c5b 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -29,6 +29,114 @@ DEFAULT_KINKINESS_LENGTH = 0.002 # ratio of UPEM DEFAULT_UPEM = 1000 +class Glyph: + ITEMS = ( + "recordings", + "recordingsNormalized", + "greenStats", + "controlStats", + "greenVectors", + "greenVectorsNormalized", + "controlVectors", + "nodeTypes", + "isomorphisms", + "points", + "openContours", + ) + + def __init__(self, glyphname, glyphset): + self.name = glyphname + for item in self.ITEMS: + setattr(self, item, []) + self._populate(glyphset) + + def _fill_in(self, ix): + for item in self.ITEMS: + if len(getattr(self, item)) == ix: + getattr(self, item).append(None) + + def _populate(self, glyphset): + glyph = glyphset[self.name] + self.doesnt_exist = glyph is None + if self.doesnt_exist: + return + + perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) + try: + glyph.draw(perContourPen, outputImpliedClosingLine=True) + except TypeError: + glyph.draw(perContourPen) + self.recordings = perContourPen.value + del perContourPen + + for ix, contour in enumerate(self.recordings): + nodeTypes = [op for op, arg in contour.value] + self.nodeTypes.append(nodeTypes) + + greenStats = StatisticsPen(glyphset=glyphset) + controlStats = StatisticsControlPen(glyphset=glyphset) + try: + contour.replay(greenStats) + contour.replay(controlStats) + self.openContours.append(False) + except OpenContourError as e: + self.openContours.append(True) + self._fill_in(ix) + continue + self.greenStats.append(greenStats) + self.controlStats.append(controlStats) + self.greenVectors.append(contour_vector_from_stats(greenStats)) + self.controlVectors.append(contour_vector_from_stats(controlStats)) + + # Save a "normalized" version of the outlines + try: + rpen = DecomposingRecordingPen(glyphset) + tpen = TransformPen( + rpen, transform_from_stats(greenStats, inverse=True) + ) + contour.replay(tpen) + self.recordingsNormalized.append(rpen) + except ZeroDivisionError: + self.recordingsNormalized.append(None) + + greenStats = StatisticsPen(glyphset=glyphset) + rpen.replay(greenStats) + self.greenVectorsNormalized.append( + contour_vector_from_stats(greenStats) + ) + + # Check starting point + if nodeTypes[0] == "addComponent": + self._fill_in(ix) + continue + + assert nodeTypes[0] == "moveTo" + assert nodeTypes[-1] in ("closePath", "endPath") + points = SimpleRecordingPointPen() + converter = SegmentToPointPen(points, False) + contour.replay(converter) + # points.value is a list of pt,bool where bool is true if on-curve and false if off-curve; + # now check all rotations and mirror-rotations of the contour and build list of isomorphic + # possible starting points. + self.points.append(points.value) + + isomorphisms = [] + self.isomorphisms.append(isomorphisms) + + # Add rotations + add_isomorphisms(points.value, isomorphisms, False) + # Add mirrored rotations + add_isomorphisms(points.value, isomorphisms, True) + + + def draw(self, pen, countor_idx = None): + if countor_idx is None: + for contour in self.recordings: + contour.draw(pen) + else: + self.recordings[countor_idx].draw(pen) + + def test_gen( glyphsets, glyphs=None, @@ -69,139 +177,52 @@ def test_gen( for glyph_name in glyphs: log.info("Testing glyph %s", glyph_name) - allGreenVectors = [] - allGreenVectorsNormalized = [] - allControlVectors = [] - allNodeTypes = [] - allContourIsomorphisms = [] - allContourPoints = [] - allContourPens = [] - allContourPensNormalized = [] - allGlyphs = [glyphset[glyph_name] for glyphset in glyphsets] + allGlyphs = [Glyph(glyph_name, glyphset) for glyphset in glyphsets] if len([1 for glyph in allGlyphs if glyph is not None]) <= 1: continue for master_idx, (glyph, glyphset, name) in enumerate( zip(allGlyphs, glyphsets, names) ): - if glyph is None: + if glyph.doesnt_exist: if not ignore_missing: yield ( glyph_name, {"type": "missing", "master": name, "master_idx": master_idx}, ) - allNodeTypes.append(None) - allControlVectors.append(None) - allGreenVectors.append(None) - allGreenVectorsNormalized.append(None) - allContourIsomorphisms.append(None) - allContourPoints.append(None) - allContourPens.append(None) - allContourPensNormalized.append(None) continue - perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) - try: - glyph.draw(perContourPen, outputImpliedClosingLine=True) - except TypeError: - glyph.draw(perContourPen) - contourPens = perContourPen.value - del perContourPen - contourPensNormalized = [] - - contourControlVectors = [] - contourGreenVectors = [] - contourGreenVectorsNormalized = [] - contourIsomorphisms = [] - contourPoints = [] - nodeTypes = [] - allNodeTypes.append(nodeTypes) - allControlVectors.append(contourControlVectors) - allGreenVectors.append(contourGreenVectors) - allGreenVectorsNormalized.append(contourGreenVectorsNormalized) - allContourIsomorphisms.append(contourIsomorphisms) - allContourPoints.append(contourPoints) - allContourPens.append(contourPens) - allContourPensNormalized.append(contourPensNormalized) - for ix, contour in enumerate(contourPens): - contourOps = tuple(op for op, arg in contour.value) - nodeTypes.append(contourOps) - - greenStats = StatisticsPen(glyphset=glyphset) - controlStats = StatisticsControlPen(glyphset=glyphset) - try: - contour.replay(greenStats) - contour.replay(controlStats) - except OpenContourError as e: - yield ( - glyph_name, - { - "master": name, - "master_idx": master_idx, - "contour": ix, - "type": "open_path", - }, - ) + for ix, open in enumerate(glyph.openContours): + if not open: continue - contourGreenVectors.append(contour_vector_from_stats(greenStats)) - contourControlVectors.append(contour_vector_from_stats(controlStats)) - - # Save a "normalized" version of the outlines - - try: - rpen = DecomposingRecordingPen(glyphset) - tpen = TransformPen( - rpen, transform_from_stats(greenStats, inverse=True) - ) - contour.replay(tpen) - contourPensNormalized.append(rpen) - except ZeroDivisionError: - contourPensNormalized.append(None) - - greenStats = StatisticsPen(glyphset=glyphset) - rpen.replay(greenStats) - contourGreenVectorsNormalized.append( - contour_vector_from_stats(greenStats) + yield ( + glyph_name, + { + "master": name, + "master_idx": master_idx, + "contour": ix, + "type": "open_path", + }, ) - # Check starting point - if contourOps[0] == "addComponent": - continue - assert contourOps[0] == "moveTo" - assert contourOps[-1] in ("closePath", "endPath") - points = SimpleRecordingPointPen() - converter = SegmentToPointPen(points, False) - contour.replay(converter) - # points.value is a list of pt,bool where bool is true if on-curve and false if off-curve; - # now check all rotations and mirror-rotations of the contour and build list of isomorphic - # possible starting points. - - isomorphisms = [] - contourIsomorphisms.append(isomorphisms) - - # Add rotations - add_isomorphisms(points.value, isomorphisms, False) - # Add mirrored rotations - add_isomorphisms(points.value, isomorphisms, True) - - contourPoints.append(points.value) - - matchings = [None] * len(allControlVectors) + matchings = [None] * len(glyphsets) for m1idx in order: - if allNodeTypes[m1idx] is None: + glyph1 = allGlyphs[m1idx] + if glyph1 is None or not glyph1.nodeTypes: continue m0idx = grand_parent(m1idx, glyph_name) if m0idx is None: continue - if allNodeTypes[m0idx] is None: + glyph0 = allGlyphs[m0idx] + if glyph0 is None or not glyph0.nodeTypes: continue # # Basic compatibility checks # - m1 = allNodeTypes[m1idx] - m0 = allNodeTypes[m0idx] + m1 = glyph0.nodeTypes + m0 = glyph1.nodeTypes if len(m0) != len(m1): yield ( glyph_name, @@ -270,11 +291,11 @@ def test_gen( # and then checking if it is the identity vector. Only if # not, compute the StatisticsControlPen vector and check both. - n = len(allControlVectors[m0idx]) + n = len(glyph0.controlVectors) done = n <= 1 if not done: - m1Control = allControlVectors[m1idx] - m0Control = allControlVectors[m0idx] + m0Control = glyph0.controlVectors + m1Control = glyph1.controlVectors ( matching_control, matching_cost_control, @@ -282,8 +303,8 @@ def test_gen( ) = matching_for_vectors(m0Control, m1Control) done = matching_cost_control == identity_cost_control if not done: - m1Green = allGreenVectors[m1idx] - m0Green = allGreenVectors[m0idx] + m0Green = glyph0.greenVectors + m1Green = glyph1.greenVectors ( matching_green, matching_cost_green, @@ -359,16 +380,16 @@ def test_gen( # "wrong_start_point" / weight check # - m1 = allContourIsomorphisms[m1idx] - m0 = allContourIsomorphisms[m0idx] - m1Vectors = allGreenVectors[m1idx] - m0Vectors = allGreenVectors[m0idx] - m1VectorsNormalized = allGreenVectorsNormalized[m1idx] - m0VectorsNormalized = allGreenVectorsNormalized[m0idx] - recording0 = allContourPens[m0idx] - recording1 = allContourPens[m1idx] - recording0Normalized = allContourPensNormalized[m0idx] - recording1Normalized = allContourPensNormalized[m1idx] + m0 = glyph0.isomorphisms + m1 = glyph1.isomorphisms + m0Vectors = glyph0.greenVectors + m1Vectors = glyph1.greenVectors + m0VectorsNormalized = glyph0.greenVectorsNormalized + m1VectorsNormalized = glyph1.greenVectorsNormalized + recording0 = glyph0.recordings + recording1 = glyph1.recordings + recording0Normalized = glyph0.recordingsNormalized + recording1Normalized = glyph1.recordingsNormalized # If contour-order is wrong, adjust it if matchings[m1idx] is not None and m1: # m1 is empty for composite glyphs @@ -389,7 +410,7 @@ def test_gen( midRecording.append(None) for ix, (contour0, contour1) in enumerate(zip(m0, m1)): - if len(contour0) == 0 or len(contour0) != len(contour1): + if contour0 is None or contour1 is None or len(contour0) == 0 or len(contour0) != len(contour1): # We already reported this; or nothing to do; or not compatible # after reordering above. continue @@ -420,7 +441,7 @@ def test_gen( proposed_point = contour1[min_cost_idx][1] reverse = contour1[min_cost_idx][2] - num_points = len(allContourPoints[m1idx][ix]) + num_points = len(glyph1.points[ix]) leeway = 3 okay = False if not reverse and ( @@ -604,8 +625,8 @@ def test_gen( # # "kink" detector # - m1 = allContourPoints[m1idx] - m0 = allContourPoints[m0idx] + m0 = glyph0.points + m1 = glyph1.points # If contour-order is wrong, adjust it if matchings[m1idx] is not None and m1: # m1 is empty for composite glyphs @@ -617,7 +638,7 @@ def test_gen( ) for ix, (contour0, contour1) in enumerate(zip(m0, m1)): - if len(contour0) == 0 or len(contour0) != len(contour1): + if contour0 is None or contour1 is None or len(contour0) == 0 or len(contour0) != len(contour1): # We already reported this; or nothing to do; or not compatible # after reordering above. continue From c984acc070a7029c01de5f93fbeb5b8d07c946c6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 23:29:37 -0500 Subject: [PATCH 32/88] [interpolatable] Don't continue test if open contours --- Lib/fontTools/varLib/interpolatable.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 3088f6c5b..abbf0eeab 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -191,9 +191,11 @@ def test_gen( ) continue + has_open = False for ix, open in enumerate(glyph.openContours): if not open: continue + has_open = True yield ( glyph_name, { @@ -203,6 +205,8 @@ def test_gen( "type": "open_path", }, ) + if has_open: + continue matchings = [None] * len(glyphsets) From a97853871e0b74161b9361858b7c20b0ce3aaac0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 23:39:46 -0500 Subject: [PATCH 33/88] [interpolatable] Refactor one test --- Lib/fontTools/varLib/interpolatable.py | 122 ++++-------------- .../varLib/interpolatableTestContourOrder.py | 77 +++++++++++ 2 files changed, 103 insertions(+), 96 deletions(-) create mode 100644 Lib/fontTools/varLib/interpolatableTestContourOrder.py diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index abbf0eeab..8b4b467f0 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -7,6 +7,7 @@ $ fonttools varLib.interpolatable font1 font2 ... """ from .interpolatableHelpers import * +from .interpolatableTestContourOrder import test_contour_order from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen from fontTools.pens.transformPen import TransformPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen @@ -283,102 +284,31 @@ def test_gen( # "contour_order" check # - # 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. - # - # TODO: Optimize by only computing the StatisticsPen vector - # and then checking if it is the identity vector. Only if - # not, compute the StatisticsControlPen vector and check both. - - n = len(glyph0.controlVectors) - 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 - - if matching_cost < identity_cost * tolerance: - log.debug( - "matching_control_ratio %g; matching_green_ratio %g.", - matching_cost_control / identity_cost_control, - matching_cost_green / identity_cost_green, - ) - this_tolerance = matching_cost / identity_cost - log.debug("tolerance: %g", this_tolerance) - yield ( - glyph_name, - { - "type": "contour_order", - "master_1": names[m0idx], - "master_2": names[m1idx], - "master_1_idx": m0idx, - "master_2_idx": m1idx, - "value_1": list(range(n)), - "value_2": matching, - "tolerance": this_tolerance, - }, - ) - matchings[m1idx] = matching + matching, matching_cost, identity_cost = test_contour_order( + glyph0, glyph1 + ) + if matching_cost < identity_cost * tolerance: + log.debug( + "matching_control_ratio %g; matching_green_ratio %g.", + matching_cost_control / identity_cost_control, + matching_cost_green / identity_cost_green, + ) + this_tolerance = matching_cost / identity_cost + log.debug("tolerance: %g", this_tolerance) + yield ( + glyph_name, + { + "type": "contour_order", + "master_1": names[m0idx], + "master_2": names[m1idx], + "master_1_idx": m0idx, + "master_2_idx": m1idx, + "value_1": list(range(n)), + "value_2": matching, + "tolerance": this_tolerance, + }, + ) + matchings[m1idx] = matching # # "wrong_start_point" / weight check diff --git a/Lib/fontTools/varLib/interpolatableTestContourOrder.py b/Lib/fontTools/varLib/interpolatableTestContourOrder.py new file mode 100644 index 000000000..0f454ab78 --- /dev/null +++ b/Lib/fontTools/varLib/interpolatableTestContourOrder.py @@ -0,0 +1,77 @@ +from .interpolatableHelpers import * + +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 + + return matching, matching_cost, identity_cost From 7636a2ebde546204ee86ae63249171de0a18bb91 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 23:41:30 -0500 Subject: [PATCH 34/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatable.py | 32 +++++++++++-------- .../varLib/interpolatableTestContourOrder.py | 9 ++---- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 8b4b467f0..9751d4309 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -102,9 +102,7 @@ class Glyph: greenStats = StatisticsPen(glyphset=glyphset) rpen.replay(greenStats) - self.greenVectorsNormalized.append( - contour_vector_from_stats(greenStats) - ) + self.greenVectorsNormalized.append(contour_vector_from_stats(greenStats)) # Check starting point if nodeTypes[0] == "addComponent": @@ -129,8 +127,7 @@ class Glyph: # Add mirrored rotations add_isomorphisms(points.value, isomorphisms, True) - - def draw(self, pen, countor_idx = None): + def draw(self, pen, countor_idx=None): if countor_idx is None: for contour in self.recordings: contour.draw(pen) @@ -284,14 +281,11 @@ def test_gen( # "contour_order" check # - matching, matching_cost, identity_cost = test_contour_order( - glyph0, glyph1 - ) + matching, matching_cost, identity_cost = test_contour_order(glyph0, glyph1) if matching_cost < identity_cost * tolerance: log.debug( - "matching_control_ratio %g; matching_green_ratio %g.", - matching_cost_control / identity_cost_control, - matching_cost_green / identity_cost_green, + "matching_ratio %g", + matching_cost / identity_cost, ) this_tolerance = matching_cost / identity_cost log.debug("tolerance: %g", this_tolerance) @@ -303,7 +297,7 @@ def test_gen( "master_2": names[m1idx], "master_1_idx": m0idx, "master_2_idx": m1idx, - "value_1": list(range(n)), + "value_1": list(range(len(matching))), "value_2": matching, "tolerance": this_tolerance, }, @@ -344,7 +338,12 @@ def test_gen( midRecording.append(None) for ix, (contour0, contour1) in enumerate(zip(m0, m1)): - if contour0 is None or contour1 is None or len(contour0) == 0 or len(contour0) != len(contour1): + if ( + contour0 is None + or contour1 is None + or len(contour0) == 0 + or len(contour0) != len(contour1) + ): # We already reported this; or nothing to do; or not compatible # after reordering above. continue @@ -572,7 +571,12 @@ def test_gen( ) for ix, (contour0, contour1) in enumerate(zip(m0, m1)): - if contour0 is None or contour1 is None or len(contour0) == 0 or len(contour0) != len(contour1): + if ( + contour0 is None + or contour1 is None + or len(contour0) == 0 + or len(contour0) != len(contour1) + ): # We already reported this; or nothing to do; or not compatible # after reordering above. continue diff --git a/Lib/fontTools/varLib/interpolatableTestContourOrder.py b/Lib/fontTools/varLib/interpolatableTestContourOrder.py index 0f454ab78..d089e4357 100644 --- a/Lib/fontTools/varLib/interpolatableTestContourOrder.py +++ b/Lib/fontTools/varLib/interpolatableTestContourOrder.py @@ -1,5 +1,6 @@ from .interpolatableHelpers import * + def test_contour_order(glyph0, glyph1): # We try matching both the StatisticsControlPen vector # and the StatisticsPen vector. @@ -46,9 +47,7 @@ def test_contour_order(glyph0, glyph1): matching_cost_control_reversed, identity_cost_control_reversed, ) = matching_for_vectors(m0Control, m1ControlReversed) - done = ( - matching_cost_control_reversed == identity_cost_control_reversed - ) + done = matching_cost_control_reversed == identity_cost_control_reversed if not done: m1GreenReversed = [(-m[0],) + m[1:] for m in m1Green] ( @@ -56,9 +55,7 @@ def test_contour_order(glyph0, glyph1): matching_cost_control_reversed, identity_cost_control_reversed, ) = matching_for_vectors(m0Control, m1ControlReversed) - done = ( - matching_cost_control_reversed == identity_cost_control_reversed - ) + done = matching_cost_control_reversed == identity_cost_control_reversed if not done: # Otherwise, use the worst of the two matchings. From 8000927cbe4534ee577b55e2b2ea4bfa623d9144 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 30 Nov 2023 23:59:40 -0500 Subject: [PATCH 35/88] [interpolatable] Move another test to its own file --- Lib/fontTools/varLib/interpolatable.py | 115 ++---------------- .../varLib/interpolatableTestStartingPoint.py | 100 +++++++++++++++ 2 files changed, 112 insertions(+), 103 deletions(-) create mode 100644 Lib/fontTools/varLib/interpolatableTestStartingPoint.py diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 9751d4309..4e238c746 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -8,6 +8,7 @@ $ fonttools varLib.interpolatable font1 font2 ... from .interpolatableHelpers import * from .interpolatableTestContourOrder import test_contour_order +from .interpolatableTestStartingPoint import test_starting_point from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen from fontTools.pens.transformPen import TransformPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen @@ -308,8 +309,8 @@ def test_gen( # "wrong_start_point" / weight check # - m0 = glyph0.isomorphisms - m1 = glyph1.isomorphisms + m0Isomorphisms = glyph0.isomorphisms + m1Isomorphisms = glyph1.isomorphisms m0Vectors = glyph0.greenVectors m1Vectors = glyph1.greenVectors m0VectorsNormalized = glyph0.greenVectorsNormalized @@ -337,7 +338,9 @@ def test_gen( # Mismatch because of the reordering above midRecording.append(None) - for ix, (contour0, contour1) in enumerate(zip(m0, m1)): + for ix, (contour0, contour1) in enumerate( + zip(m0Isomorphisms, m1Isomorphisms) + ): if ( contour0 is None or contour1 is None @@ -348,108 +351,14 @@ def test_gen( # after reordering above. continue - c0 = contour0[0] - # Next few lines duplicated below. - costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] - min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) - first_cost = costs[0] + proposed_point, reverse, min_cost, first_cost = test_starting_point( + glyph0, glyph1, ix, tolerance + ) - if min_cost < first_cost * tolerance: + if proposed_point or reverse: this_tolerance = min_cost / first_cost - # c0 is the first isomorphism of the m0 master - # contour1 is list of all isomorphisms of the m1 master - # - # If the two shapes are both circle-ish and slightly - # rotated, we detect wrong start point. This is for - # example the case hundreds of times in - # RobotoSerif-Italic[GRAD,opsz,wdth,wght].ttf - # - # If the proposed point is only one off from the first - # point (and not reversed), try harder: - # - # Find the major eigenvector of the covariance matrix, - # and rotate the contours by that angle. Then find the - # closest point again. If it matches this time, let it - # pass. - - proposed_point = contour1[min_cost_idx][1] - reverse = contour1[min_cost_idx][2] - num_points = len(glyph1.points[ix]) - leeway = 3 - okay = False - if not reverse and ( - proposed_point <= leeway - or proposed_point >= num_points - leeway - ): - # Try harder - - # Recover the covariance matrix from the GreenVectors. - # This is a 2x2 matrix. - transforms = [] - for vector in (m0Vectors[ix], m1Vectors[ix]): - meanX = vector[1] - meanY = vector[2] - stddevX = vector[3] * 0.5 - stddevY = vector[4] * 0.5 - correlation = vector[5] / abs(vector[0]) - - # https://cookierobotics.com/007/ - a = stddevX * stddevX # VarianceX - c = stddevY * stddevY # VarianceY - b = correlation * stddevX * stddevY # Covariance - - delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 - lambda1 = (a + c) * 0.5 + delta # Major eigenvalue - lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue - theta = ( - atan2(lambda1 - a, b) - if b != 0 - else (pi * 0.5 if a < c else 0) - ) - trans = Transform() - # Don't translate here. We are working on the complex-vector - # that includes more than just the points. It's horrible what - # we are doing anyway... - # trans = trans.translate(meanX, meanY) - trans = trans.rotate(theta) - trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) - transforms.append(trans) - - trans = transforms[0] - new_c0 = ( - [ - complex(*trans.transformPoint((pt.real, pt.imag))) - for pt in c0[0] - ], - ) + c0[1:] - trans = transforms[1] - new_contour1 = [] - for c1 in contour1: - new_c1 = ( - [ - complex(*trans.transformPoint((pt.real, pt.imag))) - for pt in c1[0] - ], - ) + c1[1:] - new_contour1.append(new_c1) - - # Next few lines duplicate from above. - costs = [ - vdiff_hypot2_complex(new_c0[0], new_c1[0]) - for new_c1 in new_contour1 - ] - min_cost_idx, min_cost = min( - enumerate(costs), key=lambda x: x[1] - ) - first_cost = costs[0] - if min_cost < first_cost * tolerance: - pass - # this_tolerance = min_cost / first_cost - # proposed_point = new_contour1[min_cost_idx][1] - else: - okay = True - - if not okay: + log.debug("tolerance: %g", this_tolerance) + if min_cost < first_cost * tolerance: yield ( glyph_name, { diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py new file mode 100644 index 000000000..a6b241218 --- /dev/null +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -0,0 +1,100 @@ +from .interpolatableHelpers import * + + +def test_starting_point(glyph0, glyph1, ix, tolerance): + contour0 = glyph0.isomorphisms[ix] + contour1 = glyph1.isomorphisms[ix] + m0Vectors = glyph0.greenVectors + m1Vectors = glyph1.greenVectors + + starting_point = 0 + reverse = False + min_cost = first_cost = 1 + + c0 = contour0[0] + # Next few lines duplicated below. + costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] + min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) + first_cost = costs[0] + + if min_cost < first_cost * tolerance: + this_tolerance = min_cost / first_cost + # c0 is the first isomorphism of the m0 master + # contour1 is list of all isomorphisms of the m1 master + # + # If the two shapes are both circle-ish and slightly + # rotated, we detect wrong start point. This is for + # example the case hundreds of times in + # RobotoSerif-Italic[GRAD,opsz,wdth,wght].ttf + # + # If the proposed point is only one off from the first + # point (and not reversed), try harder: + # + # Find the major eigenvector of the covariance matrix, + # and rotate the contours by that angle. Then find the + # closest point again. If it matches this time, let it + # pass. + + proposed_point = contour1[min_cost_idx][1] + reverse = contour1[min_cost_idx][2] + num_points = len(glyph1.points[ix]) + leeway = 3 + if not reverse and ( + proposed_point <= leeway or proposed_point >= num_points - leeway + ): + # Try harder + + # Recover the covariance matrix from the GreenVectors. + # This is a 2x2 matrix. + transforms = [] + for vector in (m0Vectors[ix], m1Vectors[ix]): + meanX = vector[1] + meanY = vector[2] + stddevX = vector[3] * 0.5 + stddevY = vector[4] * 0.5 + correlation = vector[5] / abs(vector[0]) + + # https://cookierobotics.com/007/ + a = stddevX * stddevX # VarianceX + c = stddevY * stddevY # VarianceY + b = correlation * stddevX * stddevY # Covariance + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) + trans = Transform() + # Don't translate here. We are working on the complex-vector + # that includes more than just the points. It's horrible what + # we are doing anyway... + # trans = trans.translate(meanX, meanY) + trans = trans.rotate(theta) + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + transforms.append(trans) + + trans = transforms[0] + new_c0 = ( + [complex(*trans.transformPoint((pt.real, pt.imag))) for pt in c0[0]], + ) + c0[1:] + trans = transforms[1] + new_contour1 = [] + for c1 in contour1: + new_c1 = ( + [ + complex(*trans.transformPoint((pt.real, pt.imag))) + for pt in c1[0] + ], + ) + c1[1:] + new_contour1.append(new_c1) + + # Next few lines duplicate from above. + costs = [ + vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 + ] + min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) + first_cost = costs[0] + if min_cost < first_cost * tolerance: + this_tolerance = min_cost / first_cost + proposed_point = new_contour1[min_cost_idx][1] + + return starting_point, reverse, min_cost, first_cost From 97d571cd66753bea2f8a1080747b9818fdde7f5d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 00:14:15 -0500 Subject: [PATCH 36/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatable.py | 17 ++++++++--------- .../varLib/interpolatableTestStartingPoint.py | 10 ++++++---- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 4e238c746..fca21c459 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -321,14 +321,13 @@ def test_gen( recording1Normalized = glyph1.recordingsNormalized # If contour-order is wrong, adjust it - if matchings[m1idx] is not None and m1: # m1 is empty for composite glyphs - m1 = [m1[i] for i in matchings[m1idx]] - m1Vectors = [m1Vectors[i] for i in matchings[m1idx]] - m1VectorsNormalized = [m1VectorsNormalized[i] for i in matchings[m1idx]] - recording1 = [recording1[i] for i in matchings[m1idx]] - recording1Normalized = [ - recording1Normalized[i] for i in matchings[m1idx] - ] + matching = matchings[m1idx] + if matching is not None and m1: # m1 is empty for composite glyphs + m1 = [m1[i] for i in matching] + m1Vectors = [m1Vectors[i] for i in matching] + m1VectorsNormalized = [m1VectorsNormalized[i] for i in matching] + recording1 = [recording1[i] for i in matching] + recording1Normalized = [recording1Normalized[i] for i in matching] midRecording = [] for c0, c1 in zip(recording0, recording1): @@ -352,7 +351,7 @@ def test_gen( continue proposed_point, reverse, min_cost, first_cost = test_starting_point( - glyph0, glyph1, ix, tolerance + glyph0, glyph1, ix, tolerance, matching ) if proposed_point or reverse: diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index a6b241218..a23e781ec 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -1,11 +1,13 @@ from .interpolatableHelpers import * -def test_starting_point(glyph0, glyph1, ix, tolerance): +def test_starting_point(glyph0, glyph1, ix, tolerance, matching): + if matching is None: + matching = range(len(glyph0.isomorphisms)) contour0 = glyph0.isomorphisms[ix] - contour1 = glyph1.isomorphisms[ix] - m0Vectors = glyph0.greenVectors - m1Vectors = glyph1.greenVectors + contour1 = glyph1.isomorphisms[matching[ix]] + m0Vectors = glyph0.greenVectors[ix] + m1Vectors = glyph1.greenVectors[matching[ix]] starting_point = 0 reverse = False From 4764cb52af5797fe8e9f9a0d6b081a1a209b62f5 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 00:18:12 -0500 Subject: [PATCH 37/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index a23e781ec..a2234aef3 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -3,7 +3,7 @@ from .interpolatableHelpers import * def test_starting_point(glyph0, glyph1, ix, tolerance, matching): if matching is None: - matching = range(len(glyph0.isomorphisms)) + matching = list(range(len(glyph0.isomorphisms))) contour0 = glyph0.isomorphisms[ix] contour1 = glyph1.isomorphisms[matching[ix]] m0Vectors = glyph0.greenVectors[ix] From 5847d394fcd80b332089fdee3e5cda21c8372ef6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 00:21:23 -0500 Subject: [PATCH 38/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index a2234aef3..e630b2c95 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -6,8 +6,8 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): matching = list(range(len(glyph0.isomorphisms))) contour0 = glyph0.isomorphisms[ix] contour1 = glyph1.isomorphisms[matching[ix]] - m0Vectors = glyph0.greenVectors[ix] - m1Vectors = glyph1.greenVectors[matching[ix]] + m0Vectors = glyph0.greenVectors + m1Vectors = [glyph1.greenVectors[i] for i in matching] starting_point = 0 reverse = False From ee3d7c8f809ac4ee11525bfa5b4eb514e832ada7 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 1 Dec 2023 16:20:50 +0000 Subject: [PATCH 39/88] black --- Lib/fontTools/varLib/interpolatableHelpers.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index d20a3d054..513e5f740 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -10,6 +10,7 @@ import logging log = logging.getLogger("fontTools.varLib.interpolatable") + def rot_list(l, k): """Rotate list by k items forward. Ie. item at position 0 will be at position k in returned list. Negative k is allowed.""" @@ -380,5 +381,3 @@ def lerp_recordings(recording1, recording2, factor=0.5): ] value.append((op1, mid_args)) return pen - - From a2f6f2ffed74dbfa43b1634e6dec91b41394030f Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Thu, 30 Nov 2023 18:06:19 +0000 Subject: [PATCH 40/88] [featureVars] allow to assign same subst lookup to several feature tags this can be useful to maximise layout engine compatibility or simply to have same feature variations substitutions be accessible via mutliple feature tags for whatever reason. Fixes https://github.com/fonttools/fonttools/issues/2050 Fixes https://github.com/fonttools/fonttools/issues/3004 --- Lib/fontTools/varLib/__init__.py | 23 ++++++--- Lib/fontTools/varLib/featureVars.py | 77 ++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 31 deletions(-) diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index b130d5b2a..81b7cef7d 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -52,7 +52,8 @@ from .errors import VarLibError, VarLibValidationError log = logging.getLogger("fontTools.varLib") # This is a lib key for the designspace document. The value should be -# an OpenType feature tag, to be used as the FeatureVariations feature. +# a comma-separated list of OpenType feature tag(s), to be used as the +# FeatureVariations feature. # If present, the DesignSpace flag is ignored. FEAVAR_FEATURETAG_LIB_KEY = "com.github.fonttools.varLib.featureVarsFeatureTag" @@ -781,7 +782,9 @@ def _merge_OTL(font, model, master_fonts, axisTags): font["GPOS"].table.remap_device_varidxes(varidx_map) -def _add_GSUB_feature_variations(font, axes, internal_axis_supports, rules, featureTag): +def _add_GSUB_feature_variations( + font, axes, internal_axis_supports, rules, featureTags +): def normalize(name, value): return models.normalizeLocation({name: value}, internal_axis_supports)[name] @@ -812,7 +815,7 @@ def _add_GSUB_feature_variations(font, axes, internal_axis_supports, rules, feat conditional_subs.append((region, subs)) - addFeatureVariations(font, conditional_subs, featureTag) + addFeatureVariations(font, conditional_subs, featureTags) _DesignSpaceData = namedtuple( @@ -1204,11 +1207,9 @@ def build( if "cvar" not in exclude and "glyf" in vf: _merge_TTHinting(vf, model, master_fonts) if "GSUB" not in exclude and ds.rules: - featureTag = ds.lib.get( - FEAVAR_FEATURETAG_LIB_KEY, "rclt" if ds.rulesProcessingLast else "rvrn" - ) + featureTags = _feature_variations_tags(ds) _add_GSUB_feature_variations( - vf, ds.axes, ds.internal_axis_supports, ds.rules, featureTag + vf, ds.axes, ds.internal_axis_supports, ds.rules, featureTags ) if "CFF2" not in exclude and ("CFF " in vf or "CFF2" in vf): _add_CFF2(vf, model, master_fonts) @@ -1299,6 +1300,14 @@ class MasterFinder(object): return os.path.normpath(path) +def _feature_variations_tags(ds): + raw_tags = ds.lib.get( + FEAVAR_FEATURETAG_LIB_KEY, + "rclt" if ds.rulesProcessingLast else "rvrn", + ) + return sorted({t.strip() for t in raw_tags.split(",")}) + + def main(args=None): """Build variable fonts from a designspace file and masters""" from argparse import ArgumentParser diff --git a/Lib/fontTools/varLib/featureVars.py b/Lib/fontTools/varLib/featureVars.py index f0403d76e..de473d976 100644 --- a/Lib/fontTools/varLib/featureVars.py +++ b/Lib/fontTools/varLib/featureVars.py @@ -43,9 +43,18 @@ def addFeatureVariations(font, conditionalSubstitutions, featureTag="rvrn"): # ... ] # >>> addFeatureVariations(f, condSubst) # >>> f.save(dstPath) + + The `featureTag` parameter takes either a str or a iterable of str (the single str + is kept for backwards compatibility), and defines which feature(s) will be + associated with the feature variations. + Note, if this is "rvrn", then the substitution lookup will be inserted at the + beginning of the lookup list so that it is processed before others, otherwise + for any other feature tags it will be appended last. """ - processLast = featureTag != "rvrn" + # process first when "rvrn" is the only listed tag + featureTags = [featureTag] if isinstance(featureTag, str) else sorted(featureTag) + processLast = "rvrn" not in featureTags or len(featureTags) > 1 _checkSubstitutionGlyphsExist( glyphNames=set(font.getGlyphOrder()), @@ -75,7 +84,7 @@ def addFeatureVariations(font, conditionalSubstitutions, featureTag="rvrn"): (conditionSet, [lookupMap[s] for s in substitutions]) ) - addFeatureVariationsRaw(font, font["GSUB"].table, conditionsAndLookups, featureTag) + addFeatureVariationsRaw(font, font["GSUB"].table, conditionsAndLookups, featureTags) def _checkSubstitutionGlyphsExist(glyphNames, substitutions): @@ -324,13 +333,16 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag="r """Low level implementation of addFeatureVariations that directly models the possibilities of the FeatureVariations table.""" - processLast = featureTag != "rvrn" + featureTags = [featureTag] if isinstance(featureTag, str) else sorted(featureTag) + processLast = "rvrn" not in featureTags or len(featureTags) > 1 # - # if there is no feature: + # if a feature is not present: # make empty feature # sort features, get feature index # add feature to all scripts + # if a feature is present: + # reuse feature index # make lookups # add feature variations # @@ -339,31 +351,48 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag="r table.FeatureVariations = None # delete any existing FeatureVariations - varFeatureIndices = [] - for index, feature in enumerate(table.FeatureList.FeatureRecord): - if feature.FeatureTag == featureTag: - varFeatureIndices.append(index) + varFeatureIndices = set() - if not varFeatureIndices: - varFeature = buildFeatureRecord(featureTag, []) - table.FeatureList.FeatureRecord.append(varFeature) + existingTags = { + feature.FeatureTag + for feature in table.FeatureList.FeatureRecord + if feature.FeatureTag in featureTags + } + + newTags = set(featureTags) - existingTags + if newTags: + varFeatures = [] + for featureTag in sorted(newTags): + varFeature = buildFeatureRecord(featureTag, []) + table.FeatureList.FeatureRecord.append(varFeature) + varFeatures.append(varFeature) table.FeatureList.FeatureCount = len(table.FeatureList.FeatureRecord) sortFeatureList(table) - varFeatureIndex = table.FeatureList.FeatureRecord.index(varFeature) - for scriptRecord in table.ScriptList.ScriptRecord: - if scriptRecord.Script.DefaultLangSys is None: - raise VarLibError( - "Feature variations require that the script " - f"'{scriptRecord.ScriptTag}' defines a default language system." - ) - langSystems = [lsr.LangSys for lsr in scriptRecord.Script.LangSysRecord] - for langSys in [scriptRecord.Script.DefaultLangSys] + langSystems: - langSys.FeatureIndex.append(varFeatureIndex) - langSys.FeatureCount = len(langSys.FeatureIndex) + for varFeature in varFeatures: + varFeatureIndex = table.FeatureList.FeatureRecord.index(varFeature) - varFeatureIndices = [varFeatureIndex] + for scriptRecord in table.ScriptList.ScriptRecord: + if scriptRecord.Script.DefaultLangSys is None: + raise VarLibError( + "Feature variations require that the script " + f"'{scriptRecord.ScriptTag}' defines a default language system." + ) + langSystems = [lsr.LangSys for lsr in scriptRecord.Script.LangSysRecord] + for langSys in [scriptRecord.Script.DefaultLangSys] + langSystems: + langSys.FeatureIndex.append(varFeatureIndex) + langSys.FeatureCount = len(langSys.FeatureIndex) + varFeatureIndices.add(varFeatureIndex) + + if existingTags: + # indices may have changed if we inserted new features and sorted feature list + # so we must do this after the above + varFeatureIndices.update( + index + for index, feature in enumerate(table.FeatureList.FeatureRecord) + if feature.FeatureTag in existingTags + ) axisIndices = { axis.axisTag: axisIndex for axisIndex, axis in enumerate(font["fvar"].axes) @@ -380,7 +409,7 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag="r ct = buildConditionTable(axisIndices[axisTag], minValue, maxValue) conditionTable.append(ct) records = [] - for varFeatureIndex in varFeatureIndices: + for varFeatureIndex in sorted(varFeatureIndices): existingLookupIndices = table.FeatureList.FeatureRecord[ varFeatureIndex ].Feature.LookupListIndex From a2e05fb08471143bab9bfdacf0d72a7da69017f3 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 1 Dec 2023 16:49:14 +0000 Subject: [PATCH 41/88] [varLib_test] use multiple tags in FeatureVarsCustomTag.designspace --- .../data/FeatureVarsCustomTag.designspace | 2 +- .../test_results/FeatureVarsCustomTag.ttx | 48 ++++++++++++++++--- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Tests/varLib/data/FeatureVarsCustomTag.designspace b/Tests/varLib/data/FeatureVarsCustomTag.designspace index 45b06f30c..ef24ccfdf 100644 --- a/Tests/varLib/data/FeatureVarsCustomTag.designspace +++ b/Tests/varLib/data/FeatureVarsCustomTag.designspace @@ -71,7 +71,7 @@ com.github.fonttools.varLib.featureVarsFeatureTag - calt + rclt,calt diff --git a/Tests/varLib/data/test_results/FeatureVarsCustomTag.ttx b/Tests/varLib/data/test_results/FeatureVarsCustomTag.ttx index 3f9e1e080..5ad62a98b 100644 --- a/Tests/varLib/data/test_results/FeatureVarsCustomTag.ttx +++ b/Tests/varLib/data/test_results/FeatureVarsCustomTag.ttx @@ -33,21 +33,28 @@ - + + + + + + + @@ -95,7 +102,7 @@ - + @@ -104,6 +111,14 @@ + + + + + + + + @@ -122,7 +137,7 @@ - + @@ -130,6 +145,13 @@ + + + + + + + @@ -143,7 +165,7 @@ - + @@ -151,6 +173,13 @@ + + + + + + + @@ -164,7 +193,7 @@ - + @@ -172,6 +201,13 @@ + + + + + + + From c46478335ecb3df73f917e2346788d31a64bce2d Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 1 Dec 2023 16:49:56 +0000 Subject: [PATCH 42/88] [Doc/designspaceLib] mention 'featureVarsFeatureTag' takes multiple comma-separated tags now --- Doc/source/designspaceLib/xml.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/source/designspaceLib/xml.rst b/Doc/source/designspaceLib/xml.rst index 4e3492ef6..d10c38a00 100644 --- a/Doc/source/designspaceLib/xml.rst +++ b/Doc/source/designspaceLib/xml.rst @@ -438,8 +438,8 @@ glyphname pairs: the glyphs that need to be substituted. For a rule to be trigge See the following issues for more information: `fontTools#1371 `__ `fontTools#2050 `__ - - If you want to use a different feature altogether, e.g. ``calt``, - use the lib key ``com.github.fonttools.varLib.featureVarsFeatureTag`` + - If you want to use a different feature(s) altogether, e.g. ``calt``, + use the lib key ``com.github.fonttools.varLib.featureVarsFeatureTag``. .. code:: xml @@ -450,6 +450,9 @@ glyphname pairs: the glyphs that need to be substituted. For a rule to be trigge + This can also take a comma-separated list of feature tags, e.g. ``salt,ss01``, + if you wish the same rules to be applied with several features. + ```` element From 82021732aeac70ad76e1a1492267c633e62aef40 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 1 Dec 2023 18:49:29 +0000 Subject: [PATCH 43/88] [featureVars] expose method to addGSUBFeatureVariations to existing VF Fixes https://github.com/fonttools/fonttools/issues/3357 --- Lib/fontTools/varLib/__init__.py | 43 ++++++++++++++++++++++++++------ Tests/varLib/varLib_test.py | 34 ++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 8 deletions(-) diff --git a/Lib/fontTools/varLib/__init__.py b/Lib/fontTools/varLib/__init__.py index 81b7cef7d..46834f643 100644 --- a/Lib/fontTools/varLib/__init__.py +++ b/Lib/fontTools/varLib/__init__.py @@ -863,7 +863,7 @@ def _add_COLR(font, model, master_fonts, axisTags, colr_layer_reuse=True): colr.VarIndexMap = builder.buildDeltaSetIndexMap(varIdxes) -def load_designspace(designspace): +def load_designspace(designspace, log_enabled=True): # TODO: remove this and always assume 'designspace' is a DesignSpaceDocument, # never a file path, as that's already handled by caller if hasattr(designspace, "sources"): # Assume a DesignspaceDocument @@ -911,10 +911,11 @@ def load_designspace(designspace): axis.labelNames["en"] = tostr(axis_name) axes[axis_name] = axis - log.info("Axes:\n%s", pformat([axis.asdict() for axis in axes.values()])) + if log_enabled: + log.info("Axes:\n%s", pformat([axis.asdict() for axis in axes.values()])) axisMappings = ds.axisMappings - if axisMappings: + if axisMappings and log_enabled: log.info("Mappings:\n%s", pformat(axisMappings)) # Check all master and instance locations are valid and fill in defaults @@ -944,20 +945,23 @@ def load_designspace(designspace): # Normalize master locations internal_master_locs = [o.getFullDesignLocation(ds) for o in masters] - log.info("Internal master locations:\n%s", pformat(internal_master_locs)) + if log_enabled: + log.info("Internal master locations:\n%s", pformat(internal_master_locs)) # TODO This mapping should ideally be moved closer to logic in _add_fvar/avar internal_axis_supports = {} for axis in axes.values(): triple = (axis.minimum, axis.default, axis.maximum) internal_axis_supports[axis.name] = [axis.map_forward(v) for v in triple] - log.info("Internal axis supports:\n%s", pformat(internal_axis_supports)) + if log_enabled: + log.info("Internal axis supports:\n%s", pformat(internal_axis_supports)) normalized_master_locs = [ models.normalizeLocation(m, internal_axis_supports) for m in internal_master_locs ] - log.info("Normalized master locations:\n%s", pformat(normalized_master_locs)) + if log_enabled: + log.info("Normalized master locations:\n%s", pformat(normalized_master_locs)) # Find base master base_idx = None @@ -972,7 +976,8 @@ def load_designspace(designspace): raise VarLibValidationError( "Base master not found; no master at default location?" ) - log.info("Index of base master: %s", base_idx) + if log_enabled: + log.info("Index of base master: %s", base_idx) return _DesignSpaceData( axes, @@ -1308,6 +1313,30 @@ def _feature_variations_tags(ds): return sorted({t.strip() for t in raw_tags.split(",")}) +def addGSUBFeatureVariations(vf, designspace, featureTags=(), *, log_enabled=False): + """Add GSUB FeatureVariations table to variable font, based on DesignSpace rules. + + Args: + vf: A TTFont object representing the variable font. + designspace: A DesignSpaceDocument object. + featureTags: Optional feature tag(s) to use for the FeatureVariations records. + If unset, the key 'com.github.fonttools.varLib.featureVarsFeatureTag' is + looked up in the DS and used; otherwise the default is 'rclt' if + the attribute is set, else 'rvrn'. + See + log_enabled: If True, log info about DS axes and sources. Default is False, as + the same info may have already been logged as part of varLib.build. + """ + ds = load_designspace(designspace, log_enabled=log_enabled) + if not ds.rules: + return + if not featureTags: + featureTags = _feature_variations_tags(ds) + _add_GSUB_feature_variations( + vf, ds.axes, ds.internal_axis_supports, ds.rules, featureTags + ) + + def main(args=None): """Build variable fonts from a designspace file and masters""" from argparse import ArgumentParser diff --git a/Tests/varLib/varLib_test.py b/Tests/varLib/varLib_test.py index 87616ae2e..53acc1653 100644 --- a/Tests/varLib/varLib_test.py +++ b/Tests/varLib/varLib_test.py @@ -1,7 +1,13 @@ from fontTools.colorLib.builder import buildCOLR from fontTools.ttLib import TTFont, newTable from fontTools.ttLib.tables import otTables as ot -from fontTools.varLib import build, build_many, load_designspace, _add_COLR +from fontTools.varLib import ( + build, + build_many, + load_designspace, + _add_COLR, + addGSUBFeatureVariations, +) from fontTools.varLib.errors import VarLibValidationError import fontTools.varLib.errors as varLibErrors from fontTools.varLib.models import VariationModel @@ -1009,6 +1015,32 @@ Expected to see .ScriptCount==1, instead saw 0""", save_before_dump=True, ) + def test_varlib_addGSUBFeatureVariations(self): + ttx_dir = self.get_test_input("master_ttx_interpolatable_ttf") + + ds = DesignSpaceDocument.fromfile( + self.get_test_input("FeatureVars.designspace") + ) + for source in ds.sources: + ttx_dump = TTFont() + ttx_dump.importXML( + os.path.join( + ttx_dir, os.path.basename(source.filename).replace(".ufo", ".ttx") + ) + ) + source.font = ttx_dump + + varfont, _, _ = build(ds, exclude=["GSUB"]) + assert "GSUB" not in varfont + + addGSUBFeatureVariations(varfont, ds) + assert "GSUB" in varfont + + tables = ["fvar", "GSUB"] + expected_ttx_path = self.get_test_output("FeatureVars.ttx") + self.expect_ttx(varfont, expected_ttx_path, tables) + self.check_ttx_dump(varfont, expected_ttx_path, tables, ".ttf") + def test_load_masters_layerName_without_required_font(): ds = DesignSpaceDocument() From b8554fdad5bfcfaa2d99847057bfb37f0052b273 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 10:02:00 -0500 Subject: [PATCH 44/88] [interpolatablePlot] Draw \o/ if nothing wrong In --show-all mostly --- Lib/fontTools/varLib/interpolatablePlot.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index 3f68e436a..eef4a4716 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -107,6 +107,7 @@ class InterpolatablePlot: /O\ / \ """ + yay = r""" \o/ """ def __init__(self, out, glyphsets, names=None, **kwargs): self.out = out @@ -501,7 +502,6 @@ class InterpolatablePlot: if any( pt in ( - "nothing", "wrong_start_point", "contour_order", "kink", @@ -677,6 +677,8 @@ class InterpolatablePlot: emoticon = self.underweight elif "overweight" in problem_types: emoticon = self.overweight + elif "nothing" in problem_types: + emoticon = self.yay self.draw_emoticon(emoticon, x=x, y=y) if show_page_number: @@ -1062,7 +1064,7 @@ class InterpolatablePlot: font_ascent = font_extents[0] for line in text: extents = cr.text_extents(line) - text_width = max(text_width, extents.width) + text_width = max(text_width, extents.x_advance) text_height += font_line_height if not text_width: return From ee0936a7819aa371a35806673311d65462a10d5e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 18:15:02 -0500 Subject: [PATCH 45/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatable.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index fca21c459..2215b35c1 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -322,8 +322,8 @@ def test_gen( # If contour-order is wrong, adjust it matching = matchings[m1idx] - if matching is not None and m1: # m1 is empty for composite glyphs - m1 = [m1[i] for i in matching] + if matching is not None and m1Isomorphisms: # m1 is empty for composite glyphs + m1Isomorphisms = [m1Isomorphisms[i] for i in matching] m1Vectors = [m1Vectors[i] for i in matching] m1VectorsNormalized = [m1VectorsNormalized[i] for i in matching] recording1 = [recording1[i] for i in matching] From 2dc53dbc4d278365c44a829689499729eaade0aa Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 18:32:32 -0500 Subject: [PATCH 46/88] [interpolatable] Fixup --- Lib/fontTools/varLib/interpolatable.py | 4 +++- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 2215b35c1..f03e94620 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -322,7 +322,9 @@ def test_gen( # If contour-order is wrong, adjust it matching = matchings[m1idx] - if matching is not None and m1Isomorphisms: # m1 is empty for composite glyphs + if ( + matching is not None and m1Isomorphisms + ): # m1 is empty for composite glyphs m1Isomorphisms = [m1Isomorphisms[i] for i in matching] m1Vectors = [m1Vectors[i] for i in matching] m1VectorsNormalized = [m1VectorsNormalized[i] for i in matching] diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index e630b2c95..35e636541 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -9,7 +9,7 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): m0Vectors = glyph0.greenVectors m1Vectors = [glyph1.greenVectors[i] for i in matching] - starting_point = 0 + proposed_point = 0 reverse = False min_cost = first_cost = 1 @@ -99,4 +99,4 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): this_tolerance = min_cost / first_cost proposed_point = new_contour1[min_cost_idx][1] - return starting_point, reverse, min_cost, first_cost + return proposed_point, reverse, min_cost, first_cost From 8c505452aac18d4dba467746170f896c683d7773 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 18:43:09 -0500 Subject: [PATCH 47/88] [interpolatable] Fixup --- .../varLib/interpolatableTestStartingPoint.py | 81 +------------------ 1 file changed, 1 insertion(+), 80 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 35e636541..49b9a9efa 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -18,85 +18,6 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] - - if min_cost < first_cost * tolerance: - this_tolerance = min_cost / first_cost - # c0 is the first isomorphism of the m0 master - # contour1 is list of all isomorphisms of the m1 master - # - # If the two shapes are both circle-ish and slightly - # rotated, we detect wrong start point. This is for - # example the case hundreds of times in - # RobotoSerif-Italic[GRAD,opsz,wdth,wght].ttf - # - # If the proposed point is only one off from the first - # point (and not reversed), try harder: - # - # Find the major eigenvector of the covariance matrix, - # and rotate the contours by that angle. Then find the - # closest point again. If it matches this time, let it - # pass. - - proposed_point = contour1[min_cost_idx][1] - reverse = contour1[min_cost_idx][2] - num_points = len(glyph1.points[ix]) - leeway = 3 - if not reverse and ( - proposed_point <= leeway or proposed_point >= num_points - leeway - ): - # Try harder - - # Recover the covariance matrix from the GreenVectors. - # This is a 2x2 matrix. - transforms = [] - for vector in (m0Vectors[ix], m1Vectors[ix]): - meanX = vector[1] - meanY = vector[2] - stddevX = vector[3] * 0.5 - stddevY = vector[4] * 0.5 - correlation = vector[5] / abs(vector[0]) - - # https://cookierobotics.com/007/ - a = stddevX * stddevX # VarianceX - c = stddevY * stddevY # VarianceY - b = correlation * stddevX * stddevY # Covariance - - delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 - lambda1 = (a + c) * 0.5 + delta # Major eigenvalue - lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue - theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) - trans = Transform() - # Don't translate here. We are working on the complex-vector - # that includes more than just the points. It's horrible what - # we are doing anyway... - # trans = trans.translate(meanX, meanY) - trans = trans.rotate(theta) - trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) - transforms.append(trans) - - trans = transforms[0] - new_c0 = ( - [complex(*trans.transformPoint((pt.real, pt.imag))) for pt in c0[0]], - ) + c0[1:] - trans = transforms[1] - new_contour1 = [] - for c1 in contour1: - new_c1 = ( - [ - complex(*trans.transformPoint((pt.real, pt.imag))) - for pt in c1[0] - ], - ) + c1[1:] - new_contour1.append(new_c1) - - # Next few lines duplicate from above. - costs = [ - vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 - ] - min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) - first_cost = costs[0] - if min_cost < first_cost * tolerance: - this_tolerance = min_cost / first_cost - proposed_point = new_contour1[min_cost_idx][1] + proposed_point = contour1[min_cost_idx][1] return proposed_point, reverse, min_cost, first_cost From cc8cb0e1ee37474038c02ab5cbe173f367edc78d Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 22:45:27 -0500 Subject: [PATCH 48/88] Revert "[interpolatable] Fixup" This reverts commit 8c505452aac18d4dba467746170f896c683d7773. --- .../varLib/interpolatableTestStartingPoint.py | 81 ++++++++++++++++++- 1 file changed, 80 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 49b9a9efa..35e636541 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -18,6 +18,85 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] - proposed_point = contour1[min_cost_idx][1] + + if min_cost < first_cost * tolerance: + this_tolerance = min_cost / first_cost + # c0 is the first isomorphism of the m0 master + # contour1 is list of all isomorphisms of the m1 master + # + # If the two shapes are both circle-ish and slightly + # rotated, we detect wrong start point. This is for + # example the case hundreds of times in + # RobotoSerif-Italic[GRAD,opsz,wdth,wght].ttf + # + # If the proposed point is only one off from the first + # point (and not reversed), try harder: + # + # Find the major eigenvector of the covariance matrix, + # and rotate the contours by that angle. Then find the + # closest point again. If it matches this time, let it + # pass. + + proposed_point = contour1[min_cost_idx][1] + reverse = contour1[min_cost_idx][2] + num_points = len(glyph1.points[ix]) + leeway = 3 + if not reverse and ( + proposed_point <= leeway or proposed_point >= num_points - leeway + ): + # Try harder + + # Recover the covariance matrix from the GreenVectors. + # This is a 2x2 matrix. + transforms = [] + for vector in (m0Vectors[ix], m1Vectors[ix]): + meanX = vector[1] + meanY = vector[2] + stddevX = vector[3] * 0.5 + stddevY = vector[4] * 0.5 + correlation = vector[5] / abs(vector[0]) + + # https://cookierobotics.com/007/ + a = stddevX * stddevX # VarianceX + c = stddevY * stddevY # VarianceY + b = correlation * stddevX * stddevY # Covariance + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) + trans = Transform() + # Don't translate here. We are working on the complex-vector + # that includes more than just the points. It's horrible what + # we are doing anyway... + # trans = trans.translate(meanX, meanY) + trans = trans.rotate(theta) + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + transforms.append(trans) + + trans = transforms[0] + new_c0 = ( + [complex(*trans.transformPoint((pt.real, pt.imag))) for pt in c0[0]], + ) + c0[1:] + trans = transforms[1] + new_contour1 = [] + for c1 in contour1: + new_c1 = ( + [ + complex(*trans.transformPoint((pt.real, pt.imag))) + for pt in c1[0] + ], + ) + c1[1:] + new_contour1.append(new_c1) + + # Next few lines duplicate from above. + costs = [ + vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 + ] + min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) + first_cost = costs[0] + if min_cost < first_cost * tolerance: + this_tolerance = min_cost / first_cost + proposed_point = new_contour1[min_cost_idx][1] return proposed_point, reverse, min_cost, first_cost From 1243f97cc7ae53e7b467050e16b785dd582afec2 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 22:46:54 -0500 Subject: [PATCH 49/88] Another try --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 35e636541..c4d2307e8 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -96,7 +96,8 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] if min_cost < first_cost * tolerance: - this_tolerance = min_cost / first_cost - proposed_point = new_contour1[min_cost_idx][1] + # Don't report this + min_cost = first_cost + proposed_point = 0 # new_contour1[min_cost_idx][1] return proposed_point, reverse, min_cost, first_cost From aa73b6b4d3b9cf13210343204262df94c969ad3c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 23:09:13 -0500 Subject: [PATCH 50/88] Fixup --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index c4d2307e8..4632df5e1 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -98,6 +98,7 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): if min_cost < first_cost * tolerance: # Don't report this min_cost = first_cost + reverse = False proposed_point = 0 # new_contour1[min_cost_idx][1] return proposed_point, reverse, min_cost, first_cost From e22584785c1a24aa9f1ce18dd9b1ec1c06d05ab8 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 23:19:50 -0500 Subject: [PATCH 51/88] Another try --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 4632df5e1..dcd7d00fa 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -98,7 +98,8 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): if min_cost < first_cost * tolerance: # Don't report this min_cost = first_cost - reverse = False - proposed_point = 0 # new_contour1[min_cost_idx][1] + # reverse = False + # proposed_point = 0 # new_contour1[min_cost_idx][1] + pass return proposed_point, reverse, min_cost, first_cost From 0db0b355ba57696aabe1446765dd41f49569fd21 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 1 Dec 2023 23:41:25 -0500 Subject: [PATCH 52/88] Fixup --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index dcd7d00fa..9f742a14f 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -97,7 +97,7 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): first_cost = costs[0] if min_cost < first_cost * tolerance: # Don't report this - min_cost = first_cost + # min_cost = first_cost # reverse = False # proposed_point = 0 # new_contour1[min_cost_idx][1] pass From 6358b47682052e4393e30945410fe8dc7c343d65 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 1 Dec 2023 19:02:16 +0000 Subject: [PATCH 53/88] [featureVars] don't overwrite FeatureVariations, append new records Currently, addFeatureVariationsRaw always deletes existing GSUB.FeatureVariations and overwrites them with the newly built records. It doesn't have to, though. If the features for which we are adding feature variations are not already "variable", we can simply append the DS-rules-generated records to the FeatureVariations. We raise an error if the existing FeatureVariations already reference the same feature tags used for the DS rules, as that could generate ambiguity/undefined logic. --- Lib/fontTools/varLib/featureVars.py | 33 ++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/featureVars.py b/Lib/fontTools/varLib/featureVars.py index de473d976..a6beb5c7d 100644 --- a/Lib/fontTools/varLib/featureVars.py +++ b/Lib/fontTools/varLib/featureVars.py @@ -69,6 +69,14 @@ def addFeatureVariations(font, conditionalSubstitutions, featureTag="rvrn"): ) if "GSUB" not in font: font["GSUB"] = buildGSUB() + else: + existingTags = _existingVariableFeatures(font["GSUB"].table).intersection( + featureTags + ) + if existingTags: + raise VarLibError( + f"FeatureVariations already exist for feature tag(s): {existingTags}" + ) # setup lookups lookupMap = buildSubstitutionLookups( @@ -87,6 +95,16 @@ def addFeatureVariations(font, conditionalSubstitutions, featureTag="rvrn"): addFeatureVariationsRaw(font, font["GSUB"].table, conditionsAndLookups, featureTags) +def _existingVariableFeatures(table): + existingFeatureVarsTags = set() + if hasattr(table, "FeatureVariations") and table.FeatureVariations is not None: + features = table.FeatureList.FeatureRecord + for fvr in table.FeatureVariations.FeatureVariationRecord: + for ftsr in fvr.FeatureTableSubstitution.SubstitutionRecord: + existingFeatureVarsTags.add(features[ftsr.FeatureIndex].FeatureTag) + return existingFeatureVarsTags + + def _checkSubstitutionGlyphsExist(glyphNames, substitutions): referencedGlyphNames = set() for _, substitution in substitutions: @@ -349,8 +367,6 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag="r if table.Version < 0x00010001: table.Version = 0x00010001 # allow table.FeatureVariations - table.FeatureVariations = None # delete any existing FeatureVariations - varFeatureIndices = set() existingTags = { @@ -428,7 +444,18 @@ def addFeatureVariationsRaw(font, table, conditionalSubstitutions, featureTag="r buildFeatureVariationRecord(conditionTable, records) ) - table.FeatureVariations = buildFeatureVariations(featureVariationRecords) + if hasattr(table, "FeatureVariations") and table.FeatureVariations is not None: + if table.FeatureVariations.Version != 0x00010000: + raise VarLibError( + "Unsupported FeatureVariations table version: " + f"0x{table.FeatureVariations.Version:08x} (expected 0x00010000)." + ) + table.FeatureVariations.FeatureVariationRecord.extend(featureVariationRecords) + table.FeatureVariations.FeatureVariationCount = len( + table.FeatureVariations.FeatureVariationRecord + ) + else: + table.FeatureVariations = buildFeatureVariations(featureVariationRecords) # From e538b9c02f9fb023b7daace11f1b7241e007d32a Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Sat, 2 Dec 2023 11:18:31 +0000 Subject: [PATCH 54/88] [featureVars_test] test appending records for new features --- Tests/varLib/featureVars_test.py | 134 ++++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 1 deletion(-) diff --git a/Tests/varLib/featureVars_test.py b/Tests/varLib/featureVars_test.py index 7a3a6650d..99f41e776 100644 --- a/Tests/varLib/featureVars_test.py +++ b/Tests/varLib/featureVars_test.py @@ -1,4 +1,136 @@ -from fontTools.varLib.featureVars import overlayFeatureVariations, overlayBox +from collections import OrderedDict +from fontTools.designspaceLib import AxisDescriptor +from fontTools.ttLib import TTFont, newTable +from fontTools import varLib +from fontTools.varLib.featureVars import ( + addFeatureVariations, + overlayFeatureVariations, + overlayBox, +) +import pytest + + +def makeVariableFont(glyphOrder, axes): + font = TTFont() + font.setGlyphOrder(glyphOrder) + font["name"] = newTable("name") + ds_axes = OrderedDict() + for axisTag, (minimum, default, maximum) in axes.items(): + axis = AxisDescriptor() + axis.name = axis.tag = axis.labelNames["en"] = axisTag + axis.minimum, axis.default, axis.maximum = minimum, default, maximum + ds_axes[axisTag] = axis + varLib._add_fvar(font, ds_axes, instances=()) + return font + + +@pytest.fixture +def varfont(): + return makeVariableFont( + [".notdef", "space", "A", "B", "A.alt", "B.alt"], + {"wght": (100, 400, 900)}, + ) + + +def test_addFeatureVariations(varfont): + assert "GSUB" not in varfont + + addFeatureVariations(varfont, [([{"wght": (0.5, 1.0)}], {"A": "A.alt"})]) + + assert "GSUB" in varfont + gsub = varfont["GSUB"].table + + assert len(gsub.ScriptList.ScriptRecord) == 1 + assert gsub.ScriptList.ScriptRecord[0].ScriptTag == "DFLT" + + assert len(gsub.FeatureList.FeatureRecord) == 1 + assert gsub.FeatureList.FeatureRecord[0].FeatureTag == "rvrn" + + assert len(gsub.LookupList.Lookup) == 1 + assert gsub.LookupList.Lookup[0].LookupType == 1 + assert len(gsub.LookupList.Lookup[0].SubTable) == 1 + assert gsub.LookupList.Lookup[0].SubTable[0].mapping == {"A": "A.alt"} + + assert gsub.FeatureVariations is not None + assert len(gsub.FeatureVariations.FeatureVariationRecord) == 1 + fvr = gsub.FeatureVariations.FeatureVariationRecord[0] + assert len(fvr.ConditionSet.ConditionTable) == 1 + cst = fvr.ConditionSet.ConditionTable[0] + assert cst.AxisIndex == 0 + assert cst.FilterRangeMinValue == 0.5 + assert cst.FilterRangeMaxValue == 1.0 + assert len(fvr.FeatureTableSubstitution.SubstitutionRecord) == 1 + ftsr = fvr.FeatureTableSubstitution.SubstitutionRecord[0] + assert ftsr.FeatureIndex == 0 + assert ftsr.Feature.LookupListIndex == [0] + + +def _substitution_features(gsub, rec_index): + fea_tags = [feature.FeatureTag for feature in gsub.FeatureList.FeatureRecord] + fea_indices = [ + gsub.FeatureVariations.FeatureVariationRecord[rec_index] + .FeatureTableSubstitution.SubstitutionRecord[i] + .FeatureIndex + for i in range( + len( + gsub.FeatureVariations.FeatureVariationRecord[ + rec_index + ].FeatureTableSubstitution.SubstitutionRecord + ) + ) + ] + return [(i, fea_tags[i]) for i in fea_indices] + + +def test_addFeatureVariations_existing_variable_feature(varfont): + assert "GSUB" not in varfont + + addFeatureVariations(varfont, [([{"wght": (0.5, 1.0)}], {"A": "A.alt"})]) + + gsub = varfont["GSUB"].table + assert len(gsub.FeatureList.FeatureRecord) == 1 + assert gsub.FeatureList.FeatureRecord[0].FeatureTag == "rvrn" + assert len(gsub.FeatureVariations.FeatureVariationRecord) == 1 + assert _substitution_features(gsub, rec_index=0) == [(0, "rvrn")] + + # can't add feature variations for an existing feature tag that already has some, + # in this case the default 'rvrn' + with pytest.raises( + varLib.VarLibError, + match=r"FeatureVariations already exist for feature tag\(s\): {'rvrn'}", + ): + addFeatureVariations(varfont, [([{"wght": (0.5, 1.0)}], {"A": "A.alt"})]) + + +def test_addFeatureVariations_new_feature(varfont): + assert "GSUB" not in varfont + + addFeatureVariations(varfont, [([{"wght": (0.5, 1.0)}], {"A": "A.alt"})]) + + gsub = varfont["GSUB"].table + assert len(gsub.FeatureList.FeatureRecord) == 1 + assert gsub.FeatureList.FeatureRecord[0].FeatureTag == "rvrn" + assert len(gsub.LookupList.Lookup) == 1 + assert len(gsub.FeatureVariations.FeatureVariationRecord) == 1 + assert _substitution_features(gsub, rec_index=0) == [(0, "rvrn")] + + # we can add feature variations for a feature tag that does not have + # any feature variations yet + addFeatureVariations( + varfont, [([{"wght": (-1.0, 0.0)}], {"B": "B.alt"})], featureTag="rclt" + ) + + assert len(gsub.FeatureList.FeatureRecord) == 2 + # Note 'rclt' is now first (index=0) in the feature list sorted by tag, and + # 'rvrn' is second (index=1) + assert gsub.FeatureList.FeatureRecord[0].FeatureTag == "rclt" + assert gsub.FeatureList.FeatureRecord[1].FeatureTag == "rvrn" + assert len(gsub.LookupList.Lookup) == 2 + assert len(gsub.FeatureVariations.FeatureVariationRecord) == 2 + # The new 'rclt' feature variation record is appended to the end; + # the feature index for 'rvrn' feature table substitution record is now 1 + assert _substitution_features(gsub, rec_index=0) == [(1, "rvrn")] + assert _substitution_features(gsub, rec_index=1) == [(0, "rclt")] def _test_linear(n): From a7b4cc3e3380a4f851c22ce00fa3076162126b47 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 2 Dec 2023 06:37:08 -0500 Subject: [PATCH 55/88] [NEWS] Update --- NEWS.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index ddbf2df28..9bd2564c5 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,3 +1,5 @@ +- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular, a new test for "underweight" glyphs. The new test reports quite a few falsse-positives though. Please send feedback. + 4.45.1 (released 2023-11-23) ---------------------------- From 641884d3e30adf43630598b3e0e100d99ae3ee0b Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Sat, 2 Dec 2023 12:08:12 +0000 Subject: [PATCH 56/88] Update NEWS.rst [skip ci] --- NEWS.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/NEWS.rst b/NEWS.rst index 9bd2564c5..11e3792e9 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,4 +1,15 @@ -- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular, a new test for "underweight" glyphs. The new test reports quite a few falsse-positives though. Please send feedback. +- [featureVars] Allow to register the same set of substitution rules to multiple features. + The ``addFeatureVariations`` function can now take a list of featureTags; similarly, the + lib key 'com.github.fonttools.varLib.featureVarsFeatureTag' can now take a + comma-separateed string of feature tags (e.g. "salt,ss01") instead of a single tag (#3360). +- [featureVars] Don't overwrite GSUB FeatureVariations, but append new records to it + for features which are not already there. But raise ``VarLibError`` if the feature tag + already has feature variations associated with it (#3363). +- [varLib] Added ``addGSUBFeatureVariations`` function to add GSUB Feature Variations + to an existing variable font from rules defined in a DesignSpace document (#3362). +- [varLib.interpolatable] Various bugfixes and rendering improvements. In particular, + a new test for "underweight" glyphs. The new test reports quite a few false-positives + though. Please send feedback. 4.45.1 (released 2023-11-23) ---------------------------- From d38c2d5f2cbac65c92ed8b516ded0d99334972f4 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Sat, 2 Dec 2023 12:09:14 +0000 Subject: [PATCH 57/88] Release 4.46.0 --- Lib/fontTools/__init__.py | 2 +- NEWS.rst | 3 +++ setup.cfg | 2 +- setup.py | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/__init__.py b/Lib/fontTools/__init__.py index d02080fb8..dfe589402 100644 --- a/Lib/fontTools/__init__.py +++ b/Lib/fontTools/__init__.py @@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger log = logging.getLogger(__name__) -version = __version__ = "4.45.2.dev0" +version = __version__ = "4.46.0" __all__ = ["version", "log", "configLogger"] diff --git a/NEWS.rst b/NEWS.rst index 11e3792e9..775bb5e85 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,3 +1,6 @@ +4.46.0 (released 2023-12-02) +---------------------------- + - [featureVars] Allow to register the same set of substitution rules to multiple features. The ``addFeatureVariations`` function can now take a list of featureTags; similarly, the lib key 'com.github.fonttools.varLib.featureVarsFeatureTag' can now take a diff --git a/setup.cfg b/setup.cfg index f38671aa9..f9caadf67 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.45.2.dev0 +current_version = 4.46.0 commit = True tag = False tag_name = {new_version} diff --git a/setup.py b/setup.py index 8f01dc74d..7a0b886fe 100755 --- a/setup.py +++ b/setup.py @@ -467,7 +467,7 @@ if ext_modules: setup_params = dict( name="fonttools", - version="4.45.2.dev0", + version="4.46.0", description="Tools to manipulate font files", author="Just van Rossum", author_email="just@letterror.com", From 7e92c6acf34eaa1771a6bdb3b23d88830740c8cd Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Sat, 2 Dec 2023 12:09:16 +0000 Subject: [PATCH 58/88] =?UTF-8?q?Bump=20version:=204.46.0=20=E2=86=92=204.?= =?UTF-8?q?46.1.dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/fontTools/__init__.py | 2 +- setup.cfg | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/__init__.py b/Lib/fontTools/__init__.py index dfe589402..51240777d 100644 --- a/Lib/fontTools/__init__.py +++ b/Lib/fontTools/__init__.py @@ -3,6 +3,6 @@ from fontTools.misc.loggingTools import configLogger log = logging.getLogger(__name__) -version = __version__ = "4.46.0" +version = __version__ = "4.46.1.dev0" __all__ = ["version", "log", "configLogger"] diff --git a/setup.cfg b/setup.cfg index f9caadf67..9b898a1ab 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 4.46.0 +current_version = 4.46.1.dev0 commit = True tag = False tag_name = {new_version} diff --git a/setup.py b/setup.py index 7a0b886fe..2e9b05616 100755 --- a/setup.py +++ b/setup.py @@ -467,7 +467,7 @@ if ext_modules: setup_params = dict( name="fonttools", - version="4.46.0", + version="4.46.1.dev0", description="Tools to manipulate font files", author="Just van Rossum", author_email="just@letterror.com", From 96c9bd236f8f663696964fcc6d1ac77103bd4145 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 2 Dec 2023 07:38:02 -0500 Subject: [PATCH 59/88] [interpolatable] Move tolerance calc into the test --- Lib/fontTools/varLib/interpolatable.py | 18 +++++------------- .../varLib/interpolatableTestContourOrder.py | 10 +++++++++- .../varLib/interpolatableTestStartingPoint.py | 7 ++++++- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index f03e94620..da5598112 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -282,14 +282,8 @@ def test_gen( # "contour_order" check # - matching, matching_cost, identity_cost = test_contour_order(glyph0, glyph1) - if matching_cost < identity_cost * tolerance: - log.debug( - "matching_ratio %g", - matching_cost / identity_cost, - ) - this_tolerance = matching_cost / identity_cost - log.debug("tolerance: %g", this_tolerance) + this_tolerance, matching = test_contour_order(glyph0, glyph1) + if this_tolerance < tolerance: yield ( glyph_name, { @@ -352,14 +346,12 @@ def test_gen( # after reordering above. continue - proposed_point, reverse, min_cost, first_cost = test_starting_point( + this_tolerance, proposed_point, reverse = test_starting_point( glyph0, glyph1, ix, tolerance, matching ) if proposed_point or reverse: - this_tolerance = min_cost / first_cost - log.debug("tolerance: %g", this_tolerance) - if min_cost < first_cost * tolerance: + if this_tolerance < tolerance: yield ( glyph_name, { @@ -381,7 +373,7 @@ def test_gen( # If contour could be mid-interpolated, and the two # contours have the same area sign, proceeed. # - # The sign difference can happen if it's a werido + # The sign difference can happen if it's a weirdo # self-intersecting contour; ignore it. contour = midRecording[ix] diff --git a/Lib/fontTools/varLib/interpolatableTestContourOrder.py b/Lib/fontTools/varLib/interpolatableTestContourOrder.py index d089e4357..9edb1afcb 100644 --- a/Lib/fontTools/varLib/interpolatableTestContourOrder.py +++ b/Lib/fontTools/varLib/interpolatableTestContourOrder.py @@ -1,4 +1,7 @@ from .interpolatableHelpers import * +import logging + +log = logging.getLogger("fontTools.varLib.interpolatable") def test_contour_order(glyph0, glyph1): @@ -71,4 +74,9 @@ def test_contour_order(glyph0, glyph1): matching_cost = matching_cost_green identity_cost = identity_cost_green - return matching, matching_cost, identity_cost + this_tolerance = matching_cost / identity_cost if identity_cost else 1 + log.debug( + "test-contour-order: tolerance %g", + this_tolerance, + ) + return this_tolerance, matching diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 9f742a14f..18a0db4f3 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -102,4 +102,9 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): # proposed_point = 0 # new_contour1[min_cost_idx][1] pass - return proposed_point, reverse, min_cost, first_cost + this_tolerance = min_cost / first_cost if first_cost else 1 + log.debug( + "test-starting-point: tolerance %g", + this_tolerance, + ) + return this_tolerance, proposed_point, reverse From 2e764bf1798601fe67d08723830d1f63e0e0216c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 2 Dec 2023 08:17:50 -0500 Subject: [PATCH 60/88] [interpolatable] Move code around --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 18a0db4f3..a84a65184 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -19,8 +19,10 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] + proposed_point = contour1[min_cost_idx][1] + reverse = contour1[min_cost_idx][2] + if min_cost < first_cost * tolerance: - this_tolerance = min_cost / first_cost # c0 is the first isomorphism of the m0 master # contour1 is list of all isomorphisms of the m1 master # @@ -37,8 +39,6 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): # closest point again. If it matches this time, let it # pass. - proposed_point = contour1[min_cost_idx][1] - reverse = contour1[min_cost_idx][2] num_points = len(glyph1.points[ix]) leeway = 3 if not reverse and ( From ef90c377d16f5ad3b7e29c0551ed5cb316d6618b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 2 Dec 2023 08:31:39 -0500 Subject: [PATCH 61/88] [interpolatable] Minor tweak --- Lib/fontTools/varLib/interpolatable.py | 33 +++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index da5598112..c8b9b2f88 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -350,23 +350,22 @@ def test_gen( glyph0, glyph1, ix, tolerance, matching ) - if proposed_point or reverse: - if this_tolerance < tolerance: - yield ( - glyph_name, - { - "type": "wrong_start_point", - "contour": ix, - "master_1": names[m0idx], - "master_2": names[m1idx], - "master_1_idx": m0idx, - "master_2_idx": m1idx, - "value_1": 0, - "value_2": proposed_point, - "reversed": reverse, - "tolerance": this_tolerance, - }, - ) + if this_tolerance < tolerance: + yield ( + glyph_name, + { + "type": "wrong_start_point", + "contour": ix, + "master_1": names[m0idx], + "master_2": names[m1idx], + "master_1_idx": m0idx, + "master_2_idx": m1idx, + "value_1": 0, + "value_2": proposed_point, + "reversed": reverse, + "tolerance": this_tolerance, + }, + ) else: # Weight check. # From 44300a8c3f0618d5d1f4621da1674d6885aa8da9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 3 Dec 2023 16:51:00 -0500 Subject: [PATCH 62/88] [interpolatable] Always do weight check even if start points differ Makes the output busier but I think it's good. --- Lib/fontTools/varLib/interpolatable.py | 162 ++++++++++++------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index c8b9b2f88..0c66532d7 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -366,96 +366,96 @@ def test_gen( "tolerance": this_tolerance, }, ) - else: - # Weight check. - # - # If contour could be mid-interpolated, and the two - # contours have the same area sign, proceeed. - # - # The sign difference can happen if it's a weirdo - # self-intersecting contour; ignore it. - contour = midRecording[ix] - normalized = False - if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): - if normalized: - midStats = StatisticsPen(glyphset=None) - tpen = TransformPen( - midStats, transform_from_stats(midStats, inverse=True) - ) - contour.replay(tpen) + # Weight check. + # + # If contour could be mid-interpolated, and the two + # contours have the same area sign, proceeed. + # + # The sign difference can happen if it's a weirdo + # self-intersecting contour; ignore it. + contour = midRecording[ix] + + normalized = False + if contour and (m0Vectors[ix][0] < 0) == (m1Vectors[ix][0] < 0): + if normalized: + midStats = StatisticsPen(glyphset=None) + tpen = TransformPen( + midStats, transform_from_stats(midStats, inverse=True) + ) + contour.replay(tpen) + else: + midStats = StatisticsPen(glyphset=None) + contour.replay(midStats) + + midVector = contour_vector_from_stats(midStats) + + m0Vec = ( + m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] + ) + m1Vec = ( + m1Vectors[ix] if not normalized else m1VectorsNormalized[ix] + ) + size0 = m0Vec[0] * m0Vec[0] + size1 = m1Vec[0] * m1Vec[0] + midSize = midVector[0] * midVector[0] + + power = 1 + t = tolerance**power + + for overweight, problem_type in enumerate( + ("underweight", "overweight") + ): + if overweight: + expectedSize = sqrt(size0 * size1) + expectedSize = (size0 + size1) - expectedSize + expectedSize = size1 + (midSize - size1) + continue else: - midStats = StatisticsPen(glyphset=None) - contour.replay(midStats) + expectedSize = sqrt(size0 * size1) - midVector = contour_vector_from_stats(midStats) - - m0Vec = ( - m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] + log.debug( + "%s: actual size %g; threshold size %g, master sizes: %g, %g", + problem_type, + midSize, + expectedSize, + size0, + size1, ) - m1Vec = ( - m1Vectors[ix] if not normalized else m1VectorsNormalized[ix] - ) - size0 = m0Vec[0] * m0Vec[0] - size1 = m1Vec[0] * m1Vec[0] - midSize = midVector[0] * midVector[0] - power = 1 - t = tolerance**power + size0, size1 = sorted((size0, size1)) - for overweight, problem_type in enumerate( - ("underweight", "overweight") + if ( + not overweight + and expectedSize * tolerance > midSize + 1e-5 + ) or ( + overweight and 1e-5 + expectedSize / tolerance < midSize ): - if overweight: - expectedSize = sqrt(size0 * size1) - expectedSize = (size0 + size1) - expectedSize - expectedSize = size1 + (midSize - size1) - continue - else: - expectedSize = sqrt(size0 * size1) - - log.debug( - "%s: actual size %g; threshold size %g, master sizes: %g, %g", - problem_type, - midSize, - expectedSize, - size0, - size1, + try: + if overweight: + this_tolerance = (expectedSize / midSize) ** ( + 1 / power + ) + else: + this_tolerance = (midSize / expectedSize) ** ( + 1 / power + ) + except ZeroDivisionError: + this_tolerance = 0 + log.debug("tolerance %g", this_tolerance) + yield ( + glyph_name, + { + "type": problem_type, + "contour": ix, + "master_1": names[m0idx], + "master_2": names[m1idx], + "master_1_idx": m0idx, + "master_2_idx": m1idx, + "tolerance": this_tolerance, + }, ) - size0, size1 = sorted((size0, size1)) - - if ( - not overweight - and expectedSize * tolerance > midSize + 1e-5 - ) or ( - overweight and 1e-5 + expectedSize / tolerance < midSize - ): - try: - if overweight: - this_tolerance = (expectedSize / midSize) ** ( - 1 / power - ) - else: - this_tolerance = (midSize / expectedSize) ** ( - 1 / power - ) - except ZeroDivisionError: - this_tolerance = 0 - log.debug("tolerance %g", this_tolerance) - yield ( - glyph_name, - { - "type": problem_type, - "contour": ix, - "master_1": names[m0idx], - "master_2": names[m1idx], - "master_1_idx": m0idx, - "master_2_idx": m1idx, - "tolerance": this_tolerance, - }, - ) - # # "kink" detector # From 1130fd799f3563ac751604abed098ef3ceea6b81 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sun, 3 Dec 2023 20:25:35 -0500 Subject: [PATCH 63/88] [interpolatable] Black --- Lib/fontTools/varLib/interpolatable.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 0c66532d7..ae2de2a19 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -390,12 +390,8 @@ def test_gen( midVector = contour_vector_from_stats(midStats) - m0Vec = ( - m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] - ) - m1Vec = ( - m1Vectors[ix] if not normalized else m1VectorsNormalized[ix] - ) + m0Vec = m0Vectors[ix] if not normalized else m0VectorsNormalized[ix] + m1Vec = m1Vectors[ix] if not normalized else m1VectorsNormalized[ix] size0 = m0Vec[0] * m0Vec[0] size1 = m1Vec[0] * m1Vec[0] midSize = midVector[0] * midVector[0] @@ -426,11 +422,8 @@ def test_gen( size0, size1 = sorted((size0, size1)) if ( - not overweight - and expectedSize * tolerance > midSize + 1e-5 - ) or ( - overweight and 1e-5 + expectedSize / tolerance < midSize - ): + not overweight and expectedSize * tolerance > midSize + 1e-5 + ) or (overweight and 1e-5 + expectedSize / tolerance < midSize): try: if overweight: this_tolerance = (expectedSize / midSize) ** ( From 170a0c79d100137611b85520ea5fc0eb7d943b2f Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 4 Dec 2023 15:54:04 +0000 Subject: [PATCH 64/88] Update sphinx_rtd_theme from 1.3.0 to 2.0.0 --- Doc/docs-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/docs-requirements.txt b/Doc/docs-requirements.txt index f8f93c157..ccf939b80 100644 --- a/Doc/docs-requirements.txt +++ b/Doc/docs-requirements.txt @@ -1,4 +1,4 @@ sphinx==7.2.6 -sphinx_rtd_theme==1.3.0 +sphinx_rtd_theme==2.0.0 reportlab==4.0.6 freetype-py==2.4.0 From 927b56b6a603b62a6e2d1eac0b7ebd88b470e22d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 4 Dec 2023 15:54:05 +0000 Subject: [PATCH 65/88] Update reportlab from 4.0.6 to 4.0.7 --- Doc/docs-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/docs-requirements.txt b/Doc/docs-requirements.txt index ccf939b80..3a8f79fcf 100644 --- a/Doc/docs-requirements.txt +++ b/Doc/docs-requirements.txt @@ -1,4 +1,4 @@ sphinx==7.2.6 sphinx_rtd_theme==2.0.0 -reportlab==4.0.6 +reportlab==4.0.7 freetype-py==2.4.0 From 9b2aaa235d2097b5074d27ac1eaef36d9809e19d Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 4 Dec 2023 15:54:05 +0000 Subject: [PATCH 66/88] Update black from 23.10.0 to 23.11.0 --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 69601f35c..c9cc23aa1 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -5,4 +5,4 @@ sphinx>=1.5.5 mypy>=0.782 # Pin black as each version could change formatting, breaking CI randomly. -black==23.10.0 +black==23.11.0 From 5fd83ee9e8126e1dba4b17d4977aeeeeba8e54cc Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 4 Dec 2023 15:54:05 +0000 Subject: [PATCH 67/88] Update scipy from 1.11.3 to 1.11.4 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 68a356006..34ee5b1f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ brotli==1.1.0; platform_python_implementation != "PyPy" brotlicffi==1.1.0.0; platform_python_implementation == "PyPy" unicodedata2==15.1.0; python_version <= '3.11' scipy==1.10.0; platform_python_implementation != "PyPy" and python_version <= '3.8' # pyup: ignore -scipy==1.11.3; platform_python_implementation != "PyPy" and python_version >= '3.9' +scipy==1.11.4; platform_python_implementation != "PyPy" and python_version >= '3.9' munkres==1.1.4; platform_python_implementation == "PyPy" zopfli==0.2.3 fs==2.4.16 From 65e251cce7602ef83063fe0b632dc246d68cade3 Mon Sep 17 00:00:00 2001 From: pyup-bot Date: Mon, 4 Dec 2023 15:54:06 +0000 Subject: [PATCH 68/88] Update glyphslib from 6.4.1 to 6.6.0 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 34ee5b1f2..f85e8138e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,6 @@ ufo2ft==2.33.4 pyobjc==10.0; sys_platform == "darwin" freetype-py==2.4.0 uharfbuzz==0.37.3 -glyphsLib==6.4.1 # this is only required to run Tests/varLib/interpolatable_test.py +glyphsLib==6.6.0 # this is only required to run Tests/varLib/interpolatable_test.py lxml==4.9.3 sympy==1.12 From 6025ec634e23efcd227290e1ca7bfffa9320cb44 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Mon, 4 Dec 2023 18:25:34 +0200 Subject: [PATCH 69/88] Black --- Lib/fontTools/afmLib.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/afmLib.py b/Lib/fontTools/afmLib.py index 935a1e8e0..e89646951 100644 --- a/Lib/fontTools/afmLib.py +++ b/Lib/fontTools/afmLib.py @@ -82,7 +82,10 @@ kernRE = re.compile( # regular expressions to parse composite info lines of the form: # Aacute 2 ; PCC A 0 0 ; PCC acute 182 211 ; compositeRE = re.compile( - r"([.A-Za-z0-9_]+)" r"\s+" r"(\d+)" r"\s*;\s*" # char name # number of parts + r"([.A-Za-z0-9_]+)" # char name + r"\s+" + r"(\d+)" # number of parts + r"\s*;\s*" ) componentRE = re.compile( r"PCC\s+" # PPC From b774045025117341ee91689ae1dbbe422a7ce3b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:51:59 +0000 Subject: [PATCH 70/88] Bump pypa/gh-action-pypi-publish from 1.8.10 to 1.8.11 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.10 to 1.8.11. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.10...v1.8.11) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/wheels.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index e2e02e8c1..267dceb96 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -114,7 +114,7 @@ jobs: with: name: artifact path: dist - - uses: pypa/gh-action-pypi-publish@v1.8.10 + - uses: pypa/gh-action-pypi-publish@v1.8.11 with: user: __token__ password: ${{ secrets.PYPI_PASSWORD }} From 203346af7fb5a3adb2d0be38968e836a996f5a01 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Wed, 6 Dec 2023 10:21:53 +0000 Subject: [PATCH 71/88] setup.py: fix SyntaxWarning: invalid escape sequence Fixes https://github.com/fonttools/fonttools/issues/3370 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 2e9b05616..10e639de3 100755 --- a/setup.py +++ b/setup.py @@ -241,7 +241,7 @@ class release(Command): ] changelog_name = "NEWS.rst" - version_RE = re.compile("^[0-9]+\.[0-9]+") + version_RE = re.compile(r"^[0-9]+\.[0-9]+") date_fmt = "%Y-%m-%d" header_fmt = "%s (released %s)" commit_message = "Release {new_version}" From 2c44688cffffe4c372391d06ce7819f7cd8998d7 Mon Sep 17 00:00:00 2001 From: Jany Belluz Date: Wed, 6 Dec 2023 11:41:50 +0000 Subject: [PATCH 72/88] [designspaceLib] Fix #3369 sources should not allow anisotropic location --- .../designspaceLib/v5_class_diagram.png | Bin 273627 -> 290002 bytes .../designspaceLib/v5_class_diagram.puml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/source/designspaceLib/v5_class_diagram.png b/Doc/source/designspaceLib/v5_class_diagram.png index 7c75bcb92bda1319539a9fd2ea1a2a7753a3ad66..38bcf376ada9a9ff22a0fa152ebef20d118e3606 100644 GIT binary patch literal 290002 zcmeFYWk8f`*ES3yBA|d$5`qbX#3ish#9mz0Uf;^v#oWNq9z)W=(!f^N-r(&$J(qjN_V(6xyilmM zxvr(XgM~SZzLkYzcRMWx25ye{{v87o{ElMLC!US^73XM>>}*yGx9zC`hN5#Zzr<_INPotaWkmV0DdPNv*cW;rkbU4J5TJUi>0!=LEcp0w}1Pcc$`!Ac4$*UOp|1=m!BqvR``<1YrDjOd@iD5NB+`)Hy zPova7*Wc7Eok6g0_G^Jo2NxwWPsa4XQmfnRPX%3+vlAt8pRq_}x4e-NsY~|j2N8^4 z_ih|pHA`Dkcj7azO-wfRt4FaE_&VH5rbsKoZed#MGbQ^OUeq`~V)e)v5C0mnt5#te zGH%$J;k4l7zC5hHZMR^{!I)5bOwMpScBkqy?>nLL9(WyfNbOJngTCIiLvc;s56LlM z3p$Z|%C>qlubX;GU&h!Iv1JD&+{|%r+Ws=_(a@1DeLMCVe5>-dT2o<^1MNnjY)6=# z#Rn?8Geo9Bn5u@bKNrv7yT=a;UgBu%x$M+5J{LT)9K0piVDe>-X_WISN$|wj?J|n1 zZmw`d+vp#u@46kY(tV$FY>`W==AzKXux38^}c2)M<8bkkOi(n&0r-z8`8YijKEMC&b{zLK1J(N(X(OoDp97 z^!tNR`#4<{gWbXuk1ZF!EA3~>(eB?Ou}0U5(vV*|+VmQxjix!G5gMoCxcPcnkp2&9 zjWG?|F!Ad{O|hLmA04jS=rK5(zs&4!Ac=Ny+thY*zDY;>{FUdj^tkOZhp&ChOW&wN zIV6&cBI?0cs))W7!lwMKN+Fo<&;0<$YcRvl_m|n9QNH7T&9;^X*KBGuimkQcwjlO+ zM7rg8e<})UkH)zrG+V!;e~iXFooWqg$6)$`+58D#f^LD%_qnL-I+_~SH{xzcSc?!f zyW{#**~HJJQ(5J!^-8oPo>8|;?SGa9U}u-FeUzVKa4LJ9&%7lYv0grs@tT*_fr(8r zUzAXeIEOk)@h*BZBHF_7RsNeaf|$@md$e4K@nB@f2(xWP8#pOBbRamkm16zSfhu z_gR}!W~%b5OhMLxz*i6R;yn%#Ki1IXq7w&RF0Z#|j2Jncr=N&bURFMc8H#-wL7LK9 z|2C<7Aas~_yH|8uy0F9`Hds&(e(Mv3UzqA=Q}wTV1}%-~fB?cIjO+I;Z~32|S=cMq zg}G`r|ELywjgj?3X&%$|8!O?=hsM48@&eM|UJyxR24yHV;zxa)^?sO7Fa#BwBYJ~r zV({Cts_OYzkLxW4ivm_TOdFhaNx5jz4S=`#>h#vU%JT)psZ`@%?2i zIHRxwD`*b4%QrP!wAFjB-hKk-pK)_DxU;^tb;kme{ZCFW$u0Bpd9|6|aPqom5i|E+ z{MHV;?H0XhRU_cGcE6FCpTeHrW96-%lqwQBYkarO@+I7mtuRI!-X=rG#QDSWiLV%@ zly?Uf);1^gHu7bml%R7bRzyFOH~uOC6`uII*5~X`z51L!Fx?1gl3sn8Y_{JkQT8%e z<h*(o+F= zEbR3f;RBUHn(S5w%2mU%0-VUHC6euIxuSu}bq#3wK%U19)uQp$pl7<`7=*hFODM|^ zgl?+RS1ZMw3#UG7s=b%yPFRa*oLOdN*Dq;Lq4M=hdm)h@y)?xep_POav2ast;NEK? z&ck24`)l!14TsE+NTNO5rUddn$gT2I&!oT08@%($f{hR(-a7v4lY2Jb{9~p)XSE@O z)v?I|$3*fggfeM-!{U^+nkw)3_N9JJ3^nSTQdV!gKGw$J;n&}Ac&3ddGEb%ULxZ77s+T26$`9##F zhnEZ9RLe&0L-sjqkk@|9eK_T%} zhsd~$V~F0-YZ{|L!Cd901WUTf_!e;`_wdU>%sQ`4Zl878#4e)=jI=Y7eb4P)wDPF{ zPJzlEB$yQnqV)J!2-=0xv}1&oiN9XFbwrq_)ulpYwx+&F2^vn=3Q=!XXc` zI^;)51TE4CLJQT zIU}|C=zMj*hdq^P%MK%Zlf9YM0bUeOB*v~HwT5#;i0HCl{VPjLLd`Pfsv<{H%20k5wrXhEj6ZJ}C(WJ5zy zg|^LzH#fLXlV}sg=+FGM6ENJnV$gWNIsT!wd==MF-FK<7zICaa(3apO(KpN~R+(QS48 zdBDf(Y13KIr;1;MK|lBvAB*6SceYTw`0NTPKeD3Oh^i3-!y7|NOyrgG`05m)>Z_4= zD4X(#rB%o&Yj~L^0ozo_digj~ z{ju~F$br@mjsp}w=DiJ5Z8vlJAGx^K>`v>@N9O8XWQvZ2v@?AM+vH!e&Y+Q%@^ZER} z{$a|0{&^hwf7!*}7zZmTC=*%Glw~rf#ds{6QT6m2M4d60)$|S9G>ww7GLFZO4SG{V zIO8okzdS?ludS5h8+aOF&2XM`YmDBYO%>kr5BD%mj~v+EwuUpR6j&R`zEV+fBUY@m znUk=$FU^Si3|lPszT!l7{!QcydXlaIid%%m70szZ{i&u9)A7$6$XQC)SuNIJvJzxp0W0qn4Ozb zNaRJzb)^3M`rMCzlKllqq_*JUA7Yr&V2s?*&=3O@etNWW>((vKcxE1+!{K}lnjRUO z#oqgUQ+aA7kpd+~J!Ec8r-^({fua%;9}mkskWngP9M8Th2%YTCcg3eNY+1<42BUph zDeL>vpN?;wB<^K6g;gl5lA!dq|FqGCw8m*vSdv!AmJW=Leu<8zTfRXncsyF9e~fYA zGMfwaDOFc5Y*2SLvZ1qp8y6SXRPj(EI2=(8B~6j#Z)s}ELWR)^O~Ze}-B3?RA3S_G zWmGu?wgxv*bKjn7x6CpE` zJ=Lji-@R*5GS<-8SW;YUU%0l|mnP1E{D~I>)k)&Ch%=m@c0ZPgX)vxwISt28!)rZQ z8+8Z$=XpEKQX>yBFIM@x$4kTx_k6t=9%qF*6*xEjtt>d>nG|AK#oaZOlpeNk)b4~r zdSclm>)sZrHdU-APpNQm+sul=v;nz;K-G$yJU+Vp3Z|&AoXW||d*x(0U95>ET%Pfk zl7yT^Q<3X2j`i;!?|%J~*xRjbbIH!vta|Brq!Zb!0`ojX#)!Kt4`#=?phBp)s%b6D z)a7VqQ_%i6T?Zj7zI~n>8+lxCw_1rkMwB&mL`JT|Zy= zkK{9-`P=88Fpf@j>Rks$+dGT83+o`>v2$H&Kut5HMR9c#2G9JRExTwRaAu}Rtg)Ah@E~Sc#sN`k`NacS7Job=^2J! z<9%&jhvmp)WzBclN}0=ovpM@s7Q91r+{MN%`?-}(+3TU#i#PSY`;D1 z_r}Ef^Xdo$=w$LU*z4DOTP?If4Jjh;YlWcM;QYE*f(i@kPpc;>fcI8RFfuZ392;O` z+hnY_WMpP`>`uro$fn8cJ9mYa6PgQG@IuQ{-cPw$uQ%7hLyGfHL>OKt z)fB96{kQ-4f`~HJmXno@gtk?A`F@xs7RrV1&fqjPQHNtIzs>M-yqyl%Uyg9-C2j7Go{ICHc$& zy`meG><|u)y`#MqTQ57ioz=0D=KIRI8~`4j<~2sE?2L?!vy8uHXG@(t!jACvap}Mq!5}`4!MXT~R{!{T^_!nQm{`|F&C7dxdmqb0PgdGAE)1LBt;~V%{`38- zBo|-5{Es){*5$hX{+p+y@a4~5{(W#46Z=2D{oCpPzxW@69URdc__eo7?^Q@dtt>BR z$S00x?+^KX;aX>5WqnDbSEM?er#4`r(x}goIk05SUA;yF-}*(>=to$gp0AW43yXnM zTNpuWtW;z@()jiSZD^B@sNGfxLs1KhBP$oDE{vKh)I2x8ccIry$2$V9rAHb&?SiF< z=0-D9(>&#sgRQyvxH#8t@s;v*KtmSSL81kas2t<=o2t!kWlp=QB`M8n1M`w)c?*85 zx4k&sx>Kn`a;w^{Uy1cevL0K_f*Wo=R(yI_YzE|d zr^$Ie4!_n0zKvQom+e2Tt*ux%1b52PD3Tz9gMEU^ONA`(Gb3cW@}XqibrKf8)jrsB8 z^r|W~xXyJ#LY0qC3O*a_Xcq16+E+Q_?$akGq?ni^m}&p+O{l}Trn+#<3( ztz*;C^ddDiwcHA^-sML3?AbFx!RZANQx;zrIn@4CVZ32Do=x$r^%f@)>Ey-|eX{!l z$M%Y>N;yA*yR6j=)qDm2t33$}mBBfz0EG*L%R>_ds?RG||T|uUG!MQr)zEqIVVg8|^oTe>* ztYIJ@#6oH(L`VQ=GdO?B%Fb=e?W_0lnlf$ZfYvkZnqrj1;{c>H_6yd~5lq$JK9&RM(FUx+g3vdJ=f-R)+Hd`6l5*O3s8xyauV2Rb7r_ zNAgaqb5lM6>!$AXC+c`-6Trp6VMM0E=gfpfG~tVjiy);2MmTU&&uUCX^sm8mZCeZs z)aq>JJ~DN5te@{zB~(n4v9Fj56Wc)RCgNJQ$=J6HOEk?!q-av!d>hGf9IgAN$R)9f zqH&-anKH3`9J0=Eft{X*|A%uN&k%a~FQ&+5sOKy1Ju13EoRz7Ld``^HfSI;0*FL|t zC^#!}jif-QzF;Z$>sQ^i@iKrGw+aQ17Sp8Vx;|{(eLsfeyM~F~w|7?o6FdDOj|)?a zN&lzsP8-uA@2|Dt0d@~6jhgelsn&bKi}}6#q?Y!xHl16#S`1$)p-$s;WFu5OsJ@{# zB&PNSrWtlnQN?URLOLWgUdLNUN3J{ZsWnO{={SVa#qy80>!ma=D7bf+*UQtr)$Hy3 zZ5xY2nC+pB#on=*vvcM8WIYTmVX)&ENqRj`+05PDU0*+Kv`1=TWj6hdH(!)bN7b(0$*{)sMp#!M@$D&@OE0?^fS+<_mI}#4IrigQA@jF z;)DYuLc}>enyPll&B>82IC=W!hc};B><2Pm;4jX!ij|%xM*vuw1twRTIZR(gU&P#iTmFTI~2yZ;o(Uzsv5s!n&)cv$m~-HY!kT1azCJF@lB5} zHhpkFkJO=)1}G??*K{2@p`z^~P6Cjk&Tc^-2F!YrSf57^Rr%c0+De2R(eXN&3lk#q zWl+kP?29jZO`FR1IBz2K(a1y$Etw9W#;hD}bH75wgUH6rIdg}2J&zA+Yiq$KsG^fy zlL5CY(r;O}@0@?Vf z-`~7jXC7XIeRXSr6GF1AN?T9?l^&@~mVQU<6D!(WdpuA6EUf}= zl$7UeH*F&$l)&pCU25g2WdHvd!qP+R7B)6T+iUq675xJP$Y3;}(FVSOfq3yTjF&&TTH>NT_4EZg}5cK)^`NZ_{)a=ILotVHW zHve-UIezr=%7Y}($8>bsb?$0Y&ISespvVAhTI}wBb9P#~OJ~PeFUZP*Oz4P7NZ5*8 z_yorKUk-Qq7sizL|7Ci_-*x?eFQZ)N1~qGYPYABM?M3F+2mHQN9C6GbNUexEZ8#tapC46X(|pS6r5mz|Pg@cAofvOUy}rlBEQe zVX!g2JG7-k%KQ`;=L+7GA;@c!mb(vlczFJ&Yrz4HWVm+;xPM2zKe1E#ydHL=V$vvp zdaJo~4=VeGbE%_ymUr0n6fWrtwf5FPLtGR@D*+O#O0wMGz_TUyFXNr77b7F<$X zJYTga)s1CCiyvjFUov(b+~g{W@Z}wXF989V3*4bkl6I=rD3{K0Gk?%UL`39$-BV*^ z*vP6?){}w>KCZ`7Tq)riNnDlv$JO?*#CwT$v+-Y zhz|jn6`h#Z+eGm3X4rK+JXa)r>~f+P`H9ndnDZzKX5j4XY(!tn_~c2Ra_;t8ASvTD z0_xF1o%+GSR|ZBdE>&6jMXGvwdO5kdQ}MSYv2kz+Y52M6=_SXY=knp~x2AW?NW8(R zHf++SckTB9x4nP=z8*#pIn>g`pNx=i!^)UppBJ^;QO!NM+=t-u3?Dg^5!^c85;6ql4V8}u;^ynWbxQ zfT-;e6Bb$P`piX3Nq#ou*CG&KbTHJA{0FTs2iYZ=3>%^ay+03;>MMv9y{To3< z|6q+axgw}3M&1%M?N{}9bbAzCP3!XW_Hi|`w6yf}^mKD`1E`>@t7~YOahoArX+A0{ z3P_}JX-)S{OiX6800EZ$@>E1XW5c%Uk8C|J-fwGeu@03&?V-C;=H_|aVx{GJ&4H1T zBvoF6Suj4wRpX8DhzMdbGCGve+qWd7qyeI8YO%({$4s3)0(^WLrA#$M%#R*FjCu?kpG_0!edu%+=uT6$cNPWT|&3dq6 zf@RG3WZ%OozC`)QZ1?fNanosixk?hLM1};CwX=(FNC7FPFHNYok1Ty>+|J``BGyLezW9&>AN(LS+8C#&X&x@ZT~`1u{V0#g2w37 zwqs|O-o1)AwG5o9@K@VYMj2HB9RacKgf2$$H z#BK(76+*_NsLld`0J`Sl;_~|SYdJZ&c}(oIlFd8an}%NGSa{l@A>N`^BEmCWvs{2b z?isFK?c&8Frb$v&SC`hiq#xdb!T;o#l`D8092~^;oKkEN6#zGNLLIJFQJl42mFtoU zlbt@>3GBW`0+1(?=itkiJIL&-)yvDvlMCHIw1R3@-s@-yy}NTq@eaT9_xZ25pr}+@ z_GbaAW4a7*%wi_I_8;=eg8A$mwtrrr7NEeSEp{qGvm$C_q80cKO3Pc$Hz3YDoIsiq z_r@U^A0MZoMDfxtC@7bLDR0(c&P zx;y<*se4=1^Pn8k@*W|D&h(&towM?GW1IvvR77KhW+$FTB9TB)c8@|B8W|O8!>i%% zAwY0wJt6RWJ`C$wWRycLEM%sq2Rvs1TO-)Iqo`VKpKW{$RKe8A{{CWPR=K7xL5E5A|Dv8f2uqF4cfxXK9nKI`}$bbhNB;^7L+QeI{pfy?*TEKxJi1tKw2Rd|5D*aH<{mXHsnRR}Vmk7W;6fMm zKWY!IbH%eB%6Sb`8){B-RZGi);(hP7hcwE0s?Wf2_Pu%Wq7|HT6s|KY^V_#Sr|1nr ze0+`Kw{7V%F_C4DLG3NJLEx8`mG#0TCp{h6MxRWAZr%)~5is>6qv_EK{-)#i?c2AH zAFoBQyj6S-K-{EQw&DTgu0xiT_t`(sA9kiVPW`8R*-gHrZjwL#KQ7V1$y*NwXDpcd(zAO z?XTV0YF4XZd1v$a5n|di2^pCVIHmQA7cT($xJV=uz?1|1{nx=pu7~Tef_*#xeuvX8 zuWaneaFdGWzGt}3p;U(J0z&*O5&e*6-{Tbp4b6Jv#?=ihysD}ykYcwhlrEAH9VYgv z#l=b{{-qiw!XkzwpOd9Rskj`qX0Aopi-LqeC>NZ}c1F9Q%PW$VlM@&eR5E7%9*0o7 z_^p(NMtqOlUbPX0x3}m$#Ny_rH3}hip)5U{vh<{c7|ym120HOyGaX!4d6f!JJO!9vQX0696=!Xw%8i z)I?do_udWg20XlVM#!RI*U!Z*_UWr6gWyi(_De4xVgiiUNvEb&o(VuyL#sH7IkMd*b(I~6`D!tk!^xb27gf`UQRanVxERH-G)C{0a z!}=ZY9ZR=%MauR;CWPn%E4$E|!=Mft2vXM7ZnT z@;*UoLU_3Fe>){$P7F-!dc4hxQs=nxz`>V_z3qMRQL?~EgOj8uQYISBq!(n%e~?(} zHI9O%S9j-%$J5Jx`Mt%%5$Ek=z4`m6AFZcq^d&)T)}!FDeG6Ejo3O|W1qDI^g7PtQ zmKZ=j1H7-Cah^Lyuf;$31RUiGo+s&VOzf}UzP(+oED}Fc&S`^uu}a^FQE+vBX=1`4 zbY7T&*RJkAUIltm>*HmNRKi^2a5pYYU+>SyvfB^YGGgj<)(v=d5t31egp-2?U;HZj zzn5D4y_8H@5kpnvXW@0obx>W|&7aPJ%g9HfTuK}pxQv8O2bB~8(klPkRhI^OkdpHD zJdiw%-H$<@qFee9BF;lhn^bB&BifJq_YPP7(rSE6Y;SKLom+~EjLgh;xjZL7dB3C$w*6?s4(34oWc6%thWX+DO>o}-l%61fuR{(4cJ>2wKq4)bw` z-wh27>q6K>ikmN$m50ws{k!QmKz_d5ls*0Vl7t!Qji%1vcJD$$Le>hbR*JRT+fNtV zl3aVTk@5%+#`h}d_8fnCU)3fLI;sDT@nV8&90Z3q^ zhmHN+=R&9ayOryZ??pw2CLL`qhx0}uYGY@U<3~#Z$IK(m-lE}wx9={F6edquD!h1M zY;OK4XJ~l%qpxpsb90*&kf23HMXwRkFbS#OrKZj!;04lGJJL2lqNy8*#h*XlmeT=T zElnb%{{|f==l<@}KyfYL|L5uBQ`STLINjDVS|&0XSy@@o;Xtp}^;P{@Sdf&E2*euF z=M2QIM5R_4$H5M*@ykIi?tW-H^i|8ueWYvDDLCcdv!uHY;#PwdS>1y2kJ7GomC zH~RWJI>I9ECmR~|)fFocz`yr7r~{zRmT&eW(zG>p4NoSfnXUnFNQ{UWn7+@&#l^rN zm0jYzrB_q}x}KhVR@1eBX$iRPU&XA=AOEyL^tVj$-dY)>-!mNE>8Z z0j`(;`qWH81v@)C%|)qW;5a)wWv6r@b~}HoBNo~2W~6Ofo9Esafr6)BCxXyf!P~UU zB>w2Vu&^+d1wwZ|?6j4SNnn-*z}3{T0?~ydp9epRhrIspgR|#hy66#O_>`!uDbaC>kLSkxO=66{+sXcG4a3 z>!A7N<_pFU1dlfx+be)x&SNwCp*Zq9w{L&uB}<`^P*qih!9MjZIeW3p+iA_iE4daY z1|FE2ni}>bO*Jb$t+rg`0SaTuM?%`u_q4~q3m%bP1kw3oCpFG})|(6y8*n=>9Fn&Z zGuruSZ%7pVq0aId#NWUYyDjhqu8~AOdROf1z0Oo;=&D_z2@>zWMab$%X~dT=swyh< zcz|Wc^E%{I>+I!VRUclf`u1*=n2IVF?S7TETRg@EI$io(PFUoNfSV)mF_jCqki;hW zR(}{@Pa)`jfDf&;2Ahs(2Q&c;zf|sws9jCZJMR~)+g3GE2_MS_6i=#YX)!0uv%2ms zI!(K@EaA`XVt4Hj1p8pq zV4ZiZ2>c#Gp@lg)Ioa85S&4CRl!vN*Rdx%?Dk@aSN3y9HWo2bRO&!QoP>_+aOU~a| zt-AAUsks(=gLdm)f`A*RpkN(irtpKWbEJa-euZNC^U%d@zQsINc#g8MH*ou>CZ21}>BN&-L#=p+EX)is3H zx)HWcPT0Pnq}gM`Hs_4D!u0+9`wg;+FjFC!Gfs{CR|u8UV(-_=O71=RXE%`6Rt;Aj z930lQ4y;+`?cJ(^7$Mg?VxS1nU+BqvV?Wg!frTe}c6wp}A_xU~pUds%eZ2PNlQ>Z@ zK)^Iv>%zv*uNiIB`DF`;U>e8n*%Pnqsx;4a0@W=rZO~`j`5)Hq|4(a^DH2V1A&y>i z6`p&~=!o^7pUgW35?}W<;gEW@v+@?)?bX#)xp>Ypr_oxMoz_neK?~zt%!!QjZvX;6 z7-fn&ajbzC6~SWd$pQGKrKWGZu;@h|F{bsDW+dDeMzow=(oNVC; zCIqoeX%Eudf`XEnnYpN_NHE!_&*6E`4G5U9;-{m_(5d&Fl?V0I$(o1g8cYGw$?YO|d>cu$gYW1of1ai+sa; z>06-lumX8o*t1w3>;pR|t+V(^E6IBw>?TCh?0wMYC_t0Z4lksoO^uB=nNt*%l!!@5 z4a(H-5=eqjEf!*98yFUu8VB9pDaoj$BpPaJCe!MR%4SM;aCn$EQ9h{o0qHf!FxBotsUjPug50d!Q;siH`q=V@X2?Inyrs0`ZF#a8_KTS;x3vs7=1@#TrPd^2fA(Pg3qZzlL?~2AKZI zbQ7K#FEa}W2uN)J+7}==$ZizEO9%}8u$X^w)~DrQ=|hbs$6r0<6hH)!~sL4$v6Yz&m`%UHgojLJ8txxa&m%FfQF zVZ#AYHEZ2hQ%O0?+Zu;=XaQcp6*V=ft;{bId@sXAZi$8gz5`b%Y5f^~|9xlX6R!bx zepc4wu!`sGO0l_45~S7q9U)45%x-VoFOK$4HyvpxyuwSyGUFh`{!i;f zvd8|I)-f{>02jqEeWzO?Dc=icTHkBT*E`HtLPnBu$qlB0eGbHzZL27$sKl!Pf|-`J zp8%#cUZgMS=9iF=@csMK^iu$iKwttT7cn(;?VF!hV9K;#z?fljGBory8Xq5@jg75q zBl5N-Pz{3v18o)9{I_SDgT&wSllopzXAFCg%mM!}AW^jDtuJL+@s;nA2s(n+A16Tk z3zu8iofH0WF3Xgt!W*B>j;Jh)iMZco`;~1{zIG(ZG9sj!k9tfef6E}vV0lV1D|T@x z@AypJbKd`!&LIEnjLJfoKc;LvXLkDDH&~O%K;-%+fiiiZ09la1u5k+#!Las9Sft|T z+=fc#j`Jw(6 zTTds4l~>#6%ot`FGU&Gv5VB$Jrq4R1qy5cB5 zPHSdHH}xSbeC!JCdXN>P!WS$0mE3YmjrfR&DyI#quCDr}BP*UOc*2CZkOPybNVjfC z3X#rcf-L=uvW4Zu39{vDByV|tx+h|76=I`~E{Iy!JCJ-pr=$Iy^!$$(my8ThMv3c} zq3~Pa{9U*Mgl}=3X_G$`%n<{CJ#ZP?C#HSnnvg>+$UiH@Qu`3Ep4aQqlPCRXZyzb0 z<+Nxfm!lSJFUmClLX17$ich|M>x|g){oGF*;AqdsO8K?z<(b>QC0dB9$MgzbY9Roe zGwrEU@t`_`ejnG&_07Ct^xNRyU`lr} zS1~qwi*xKW4lU%mZSd1r_NTd)j0qMBKHSQ;B0dAte@aP`n}`a}^jg!wI+#ZqDM?e! z<7YO3An;Osvz6$b>r;F|2_0bLj|rK3W~#Fa^TA$c?nycc+1)jos^RmP@0|-%P(fLO ztAF~TXT!XGinXfUSG#8Od3a)lPE4ke9Wm~w7r}#z=?iY?=jXRERa3EXqSOva+4Q}s zV6wm4<0{IP@@DrOXe1J#c8g_iBB}jJCaaJq==yg;(7e z|7`9PNWr+zo<@urrwP#XsATil8~bbKo(Xw5wI5sW9me611QT#A!Qk0eVwp5gfLu=` z@T8Ek%<2^)OEPmuMriyfP%}%|eN7t7?%+L6Ny&TrX0Wbn-zB0#Y-S~1v%pIcN}Ng! znU<&JpjNEoFhykjZuEfd`>%{eN%DWOnq6KSi;syYah)hnKux<}>c#8rZ z@Az;hQ!aiV3H5Sm_<(D-&}{)IgUngv@(~_hHG+(Ugqu1POl|-=4D?l?*3l5-uA7>f zb+orAbe|IF}-VHJv*F6>6_{l~Y#%0f8uAp$$NNUsSo#SbJiW6w62}@?d&FsBoOc zGAjdF5@OX8x94DxkB|IeCwCV2g@nYUjuJlvZa`KM^=DuGXyQ06)DLumX#{uy^Mo>||Bpl%bxGm3 zZUPFwFPL(VrO@_G=HSqf%PRI?rm1wvG}F9&c(10oA59wPYy+JBNEoI#LT*sBP?4Op zNtg1bKW0A5WPpxYBYIU(hjBqqZl0q{a&*kQ!RzF-)LcaEg|N$Ol-=@tBk>wA8pDIx zQ+aF>dnzE2bS`t4026p_ML0#p0W91e*k9(rvL^%sCvQA~q2uI&0dN!L?$v>O$;zIB zeucktl6r!TZ#c2$#phZ&hY%`&)qk4+NPt?86z6O5C>j$K(*N}kV3(Ly3)-f=A-$vJ zSLjLLov=IJ?q^?0p}(q(`zo4xe4Uq;GL0C7B-gQ=a}8q*Z?v`9MHXA4*Y%YUd}(Og zqt5%tA88xwLkW3VP>IDmb^&iL-spfqG96 zQF?Er6UXMHmtz&iKN99`dPA2=4J8krPPh~&;nJ}KB8Zoa6 zS!2=WP0MgyJ$cFJzHZ&n{XuY(1rDY=!Bm_jyU5n>_kz_n~zXH^F@}%9g zjF&nzHT3}i5K&iGS8MC2eR}6<%2{Y4 z6@Zxxdq1b+lfW-u7DE}{q3vT@xNsqhoCiBOYv35J-K6}^Y*qHM1P~;>tVTb{$h8hO zp-GUT4`-?cii=D*w>l(G$&OY_dRTPoG<9@zK(pjkDIdL&l6?2agamWgeR`v{_0$nh z<*Jpp9($S0^j%aWLSb(E^WdbW%b7FlPCsmGbR&Sjc70;DU>4v^>D@E+U`px5+E5v> zlJ0SjDNrvnZI5IC4|hoH9DyfFc-;2QX%8}Afw~vy;pak*$DMyz-(sxB#9kN(KRmV? zb8`=dls5&SuLa;A^z|6P5gkUH(dvv=Tg)ZFh4KYnp62dsOdqeF(PvqD4y(F-W2ZOT z`xRm~?TOBJSQ(BjtP^~SZi5vvv#NVc%?%cgM$@Vn@a@&iHHCf>qBPMm3vpr2$one0 zZa>c>o)|%{aB330XdDVD%sm;nE_D3oIgE@0PU~%no+mzw2M-7Cn|>J;`x)OCM{B@3 z3WNeU(elrx|Dl-)j|uWlU^Nrqmkh{F+!_;jpi%nJE$HjGphl1 zw<2UJcUrjI{Y;kRZRh$NjumVZ{>_a z3#F!fd99|I1A&4cNIL_hU#RC+P@HiC79s!UcE^RLVs)(aUvy~UTp$LWI-`#P#1_^T ze~8uMEdK!)9#j8pvuzB9EjLt8{3>9v1g~Vkew$IcGV)>)(rYY)M!-=O;kKeXMq%ze# z(e>SpvxmBInIaxt{eE(?CZRM=mmf=Qa9hzIZIe*#xjSrZbp>x(Zr5!370lz4YrWx> zy7YX5{!poC*^ZxVIPfZ+c`W7fFC%(`Nckyzj#wpF`9X3MK%YPR&RcVWfV^~9&%W}_ z!0tl6w3@x`!moq!Zb%IM^2wFKSFps|2eg7NVe?Xxzp%yXe!a(TpWhiOBrJB!K>uON zZy4Yrpp}Gh+kk`OjhB&eCDw>6^v*LNGRH(w#2xr7yyczgQP34q*_bR>bYjUoXw+-r z^m9{_?~3M#3@Ehgm^aPvq@6ze4pB+SAwn**4M`Kt#MB?9L+HsK2ii6fJ_PQfTlg_x zJDAI;wWmF(_^4zxuBVJKc$^CtvuVC1&{q0&AS9@8I(YaPVnx@gpe6WtKWJc=E+u8% zV9+eBGoG@-Bcb+`9-2hrn>7h>P}+8#hsR{b=5SR56HVLb`AtI0ede%jtMFIUb6awa znm(J{8v4_KOBd!Gj>tHb$~2R! z0yElcdL7N*RT`tIRZ|&q>0N0jPQE~>1-xDf?3rm84aiR87~yoptoKwQs)t=qD;AKQ z1qb5?@e)NwqlA8Kc-d#4pDb&d!oM-(#+F)HVQf>Y&>YmRu?_GYa`~+d*ZA_t73I)nIg8{t1gSKVC_S) zysD>hm93Wp7T!9~$L@lZH>WIc*OMGz?Nsxg;#|VWAeIBiI?##hMWy22#sn>tbMV4= zctI&IROs>_VAi6_$L9u7tHZ{S!CvH=U$VP#Tj`>FaxNE4vhI;k4oha1S-ffUh*!=5 z{np-CyODu!PFQYJg%tWTy8%bUeuyZBt@dI25aT)wD`HqSl+~rFao&lmgI>86d9(Hg zq_nIez*fmF!Zl+ui-E_Gg4{a!bJ&?wt*Zb=7^^N7PB=q$A=pq~H0>oH71l>EV(~J4ls;<31bgy?MK8fRc{YvLs zLH)r(5Jy*g3&mo0Weoy~xHg&XHba9}VwrXhiW>P33KEzbu}jvVo{*GB~89FSlJG9x1cG!g@Tf_4>X znbmoeabzl7%sTymgZ@9TADDS^6~^=?1T!%oyhTSc+lIiieI*{~{r!ER{5{)?DNy$g ziUVrJ%~Oa27zp73PYQwOGj3?OqdRm?Z4WkQKx4)OZAyHB3%$gbK}Dnr5)0`1wm(X_ zm;8|JFClRa?F3{#;`3)PZfbA83m&YEI+2NCSp&V#(d6*(-qF!4S)PT9?xZ>sS?-WJ z40az?QBfg;UM&HVX5+`3j7&^}?ioTa#M!K-vbDw3c5a>he2>G3C{QiZ1J56)mVv3! zJ->q}&koRYz)$V^^5x6&vMEAYT5-Ro!q7I3f`S6bqsxw-haEbA|fc>`46DuEX+B3vg!E9f6zAV;LQ~6A#*jO^(@Ngo7cD2JlaMx?REG+WbUb~Ah zXl5thM36Dh1@)(+qdOnK&d89+K5zR8;!iaRtEzqp*0V?6B5e1Z8VlO_rFfddn$Zr0U+o zYmw1IEy~KufmUEB6g7eZLHVgz zt273?siSJ8`NTExIq>XZyAg_`WP@&C?cWaIiXKolIlw_?!P3CoU5aHU7|Q^YVOBa8 zms#8Ozsyqrz3H;q>mCcs5>SD*TMgH*XG7`F=v}_ zFO1po`{#R(=jTq`KN!WRQrk%Z!~u$~M5iYyzo+A1!vBk{FOSEnZQH%gg-{8}R0;_R znM0CFLJ~5Cgd|B4GTbEzNhKshh9n^*giIkMAqhz`laMJh`&c~ByWhRPuYY=;eyp{w z>pI8dJkIm7m>us$ee_oXT6UBy-ra;2q5y(F18Y~KFQPlZJps1uGAbIAZ2vPcR#jJ5 zKYKP&h)dD6zSFTP8X_DieZg)t17*wm{D&Ubsf?nD9hAEGabE`ZXPOaRN+%q0+laCP zbsp%;g(9Z;dR$HrrsE(*udfs{duw>k4!Zqn=W(sWhaE=^qD;Z55z^Ds8+f^;A(=Rf z{G^>G`OejY&HQF(Q6haDm5$!^^c|B5^emTnr^Xz-^ z`*gnZxnd@$5jurFJE;j=2q$ z!k0V$$yx{A^*VuYnl}v+?ygVAxprykTQhw0S(C4PTEi29taXB*mVM8=ToDm)psTBk ziAV9dSN5pszq0TT?n`;Jj#)_P>}=kT)-0RpU*`r3B!>Zp1Oxmmkb-8i zr{kdKIQ^KZs0#r!aptUYeax|c&`DpGP)MtkwiH zXwJ^biHK+ltkvWh19yG`NWrhaL(cM{boT;P;c!J1xR|b7Rl0+3S5MkqM)Ar6mK9`$ zb%7OKy=PIp6G{=d9kMCO-V6JE^(+ld@K)N|YT+x+b>IHo^4O~@9H)N+7!r#iZ0+fm zKM$?7ms17bp4!oNhF~4N5KIfL9t7=o?1H`h@A2N6D}s4Y!?%u|@A~?z+wVSfd1xj@ zQ=9T5xYX9XuRmqU-T^!l@YYb00$*6}a-VFpR^nr~(I4q%FHPtY7|y=#;0<;amp?U; zC7pjBhDVn2-_D)?96r9-7ucg_U+DS&!jtn{2dJ-=$ zuXpD=no~+HzaLdf(lasX-+Ef)5M3zp>wc7?n{FN-fS5k^54Oe1`Z_CX|LfYkLId8U zBkQ&B=85pt0}87u5Ig@b(--F~c|rbp36Th)*{+{vv=_r*EXr>6_VvAB-(K&jqzX6@CSl-R zrz84Lb`B5xjfsdjH)QVQU+&eA&Ov@IedX5|^xph$OA3O&AC)R-fB8ws)h)HM^n2O> z*-hbJz;~efU#$iyup}WYjIDPq0~T5CwuG}rAfTM>+X;w2KmVH|$98%U z{NQL@3Kl`cJt1-Ahm@s6LVAJw2Lz{Q53O3;ujRo~!*7^N3Z4F~l1Ejyz4vn=Y$f5l z>qGt(6U1Q{YxMu~t=|an#l{{HRD5%G$=K%Z^10eOppK&ojYq|mQHEEF-S>GWu&JMSS{kAE4|j8N+8I2Pi(Bz$T1asyX$8DKmYqj z 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

C9Ar+dc~5)ULy>A(dc!Q!A?L% zGcaP|YOzv|d2Qn9?9{EX8G1VA$>etjnD4i4nY581)plT1hw3&+o1<{~Ljd<&QH0nL{Vt{B!jV(rlVpgjrcDB?yIF@L0 z|K!ZLYpoCp@JSOhARmU(u|f*jr@mjVGo8!@KCoKVsn1Qa0;~gIAQgyrmQfn=oP46} zHE<0U7I-5aDJ2`~?6eP6k>-SfFo+KZ-N8i}eq z$y4Uer$_^;#HvQ&BW_VqXV4y{A+9~coQk5!lrXBef^ZE%6RB7}L^7va5F{dZ!)>s0 znEAY$SLbk|E;0#TTp7j94Rjcvk@|e={Gwn*H~p81pA5E_PH7x`OoUfo0U3ftITot> z?+aqv9gq)MyOA=$qa;Mhoru~8o&;Znwbl{66eTb4lmGhmSTw`!4N^xZ7|@BW82N(Q z0yfAO8&vWWlqpTiHRioJO0j=14dm)9Ed?Rq1TA%dj>*p_Zuj*d-SlQ)OIJwvlLKFk zS`|W1`U{>a7T|tF_agbV|Gn~Sa~SGN8gN4+TYB?K4q$&9Y(1yE=R~h|#_+z&&m^cb zoQ!#O9`S0l+{0)Uduk&3t05Np1DGfXq0*6wtR?D~WVw(|$rEpEJC9btH2sa0bQ!7` z=u)(-+D8c9$E)*G9Yy`ud?zJl$$mWU1CX|2q{T!#v3sFdb1^&u(%N<~FW`_cDr6e@ zK@Hv2h2`JT%q9;{7A@z6Tc2Xx8(yVcBcSo&eEpiQ^@m@cx6FKb+y_x6xGUa4&ONTy5M_|>93K|NE`1u&yfW; z>s!T=W&MltpN16rQnp)lhyzf+0KWMog~>eH#Ic*xc`Uy#C@hg-Ee#EmRr8e!*!F|P+ ze}R?Y29=lDk8q!${yvHmf*h`fK0ZDNTwHSgM66$+ryyZ-%=f6o;sdNT9UUE=oFo=V zB`gnc6|U#J3-S6skhydON#aJozhyHN`;tiNn9fpISlCHNB5xhoAhaM-dRo-R#7*I<{jd*9J;rv7lRT~^wTy3Rz%%VIi?+Z)Gjs@gB)`#%ECmAo!7F8U!x{b(vU

O){G=oOAJX1Bs>=3T8(oxiNGl*J64EIGQi34e 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

rKzvtr~ej&Q74Y6mRHs7DQkulutBiH?|qbN9x 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
y& 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 b|M&DJNByP+JeeV$1pUjz(A?m$zH`*yF%Wj1 literal 273627 zcmd?QWk8ev`!;N1i-@#-8(J(z$cj1in_x;@1HvlT*f7ONkiLyNPygPHt^`;ORmDw+!Uv72^(#N z`=w4H1vuHM9j2)Hr;i@JyFhaPLVlv$#^|=z`?$MIqVp1q7e(hEF`OTE?>H0*cQIw} zu&7X39G{hBtP9%Z4fBXyn|?rf3989NbY7pLrqNYTiS8P^!EF9FZR`yyQSNm~1~Czd z@*e1?R?bT_w{tj}4a^(`?(>9n7_IY$e3?(qhyJz*n`eTV=|_aHw?4S@y7hXR_uF7r z?z~pBu%_LbTy-OcTqWksE{`9tn;(u^8|e~NgXlaXjYSkD?9mQRc6J~-1%&}v=5N)< zmkK?TW4y`*O`kv3o@3GV|J_A({FXO{qokZ7;zQCms;C^@0kr(3axuTTDI58Qm{?f_ z8LH<^>c7La(pW=_r)6>~cv}!pta)j#=^OA=&eVUgNH3_NUgWj<{-gU&@k?^zN)L`r zx%Wt^=N%aA?OM5c@3(f&P7RNpk}rwo350YHU$6C|5F@9Gdi_gJ$i#kfAz=JZ>4)Dx zTqHg}6l072-R>V}9GATIUPHpUzN<2%%g*>#+;xZ#wKevN7=33;@TSwlN%co`7x&7i zOdB(kbLf}XRs4u~lS^p1xBD7`ORHwzOb6d|I^XxL>9@!j=KewL_(PhbCl*vBdXnFS zIo@ymB1(dp*Q5kq(DJDgC7Ea6dS7S@8cTnx*$n2~Fr4F9Cx`2}-wmMZK%ir*0?9|1 z;j}du_KbfmslWmrF*xFCOD{vmiKlg~>~0&(*ZGP|m%fcQ6pMHvngJhUqc9py-uMh2 zybdaBykKDLJ*raN8c7;2Gv^+y+)rrEpv5U(@s%WPJ&E$4(__4FQN zURuf}^Q-394+QK=NCxDn&cl;b>Wa;tzFJv%ZNf-B9Lw`kWGnwikW$3kG*W5MrvUV>38$0bVA7)N#o10h5zZ9vO zVNR`cal_)9^SR>lN-_of@kU5Tlg`(R&GKnlG+bK=mwUo6vk%Ri%&Jo&tu_CYznH~8 zz3xgXGssO+$bM}$$oTe?5QWl*bG=>juhyTBaz&ZRI>bUaAnA=9ux44d&Mxk0r%n?o z(082E3cF?tUw5zx2N8PudD2^&`(l@Ou!^?YC2!p&{bMZqdSdgy)Rw$4&BzgndU&i= zym#Mq?TOijdRRrMSpmfK1MmfvarmZIJh6XDHDsh1qh-r0Vh zn(uheDDhH7>_~r1dZG8U2`?f%EGU? zuVN$1-|mBzudly(@Z>68vXX`L=4EN+eR=TL!K^QtkK1F$zAHz_UnZ~}NEo@hLoAk; za;~B;`}i7Wvb-d!cBtzbPU!B?ZeXT=N|E)He|V89Va(ie^w&9v)%d{cUyl|u{V!xc z%p5J@xAmrim95E zdHbq|*k|&wALra&l9Rc}kts+NlqlZ1MWbfh#pw+rcTADj-du5goHnkcVd1uplR_im*N7|gFDBd(g#=69D08+ zZn56Ea~?AH(k-Iqr9aKWb6SYbBWILK{xn@+oOqU8nblA~@muq896!e{qrla0xYp*v zl6|Ny(cA$i^u6Jynzz=}8`m0%d0EY_cFC-oj8{z&Yl+|$Nc^?zM~Ua^CZD6odpQ+# z(9PL&B?bmGR>`RoFIP!5#vptPt#tk+4kIBA+Ilx5YS0lh| z!8oeBq=FxZVGaKClX1xr==ZiV(cc2xF1SfwYAEK5dRRQh=R@5ky4Fmw<<#!F@~XG6 z*yI*F`umigNBMy=Tp*&7adQ%YL z4Ew#U*tj%w4du20=2T{?K)8_`n^Sy0THUyO7-cc~yvlibpvlmA*@LKaY2>GwKJzl^ zBdTp&g0+j=?sjOywGi5ui*Kic!h=XLqv-h($Ikj^9Z5&_2@NR{JATt~y&Bu33x?j` z!m0T&d&=x$N*~n}E8(k`-dW4l5Pa|-3*hv9aJ#TBD#b(A=+tM0>| z2c#(7INxyza%JJ%b|`VeTV!-I3CRy#ZN2>!J@YuG-U^{Wsu=CIdvp9?sD6y*@mkKa zui^s^ap18oKO5A*XJ0-M5NVvSDzlou^G*5!KbqZ7obN}ZjYXyp#lU%2sZaqbG@?)b z_`)t#W!nutC`6P#tG@Mex%dYsuQA5){)3sY{St3zF~yM#1o9FIc`?Wo>7ItCh(j=@ zuB&xLP!^xt2^R6my|tS`uHfT6K-^c+f6J$?jKH4n(M(SN#nqK$tRg_3B=IM|(&yp; z-0-t6VzYl3a>Q31wHO*(qMcs^#dVHdrrYS*YrxK^sK%CYtM&LK!YRgwej@#;ps%VB zpOJU2!e)OI^oz6av6{DPZ-x#UYz+LQ>+Pm64|)kR;+m1l+MB#@#MPP<+#0OwUDcuM zC6Y<>4SpdViI)6#qjVO zTSS~9B6?DlpLRATern@}x!pYPEb5k*bIK+t>`UCtIey@B5!x{_{Q!&oI@foEYdarx z0F^MPWFqG2zJ{n9YdZ|m{q5D~bRm6#{CIt06_Ibjz=Nz?w*L4rLC-u%zwcvvcj9DR zu(!FxbacnV*N@`YzI{VKcOtOuaOHDdkqw%@R(+?Uj^NgJ=uNsJ+;DNEUbJ+B3RK zScrqN2SX>{3&9N%etsDadfR<^@zRZ`a$e`+v1x`K*UI*QzLMEkVSA&Qc8&ucUQWr2 z0K)wH7`w;0cmiMlKHl5kQT&hpMt}09{^wuk&W$|+WB>i?9P`5jqJO^>x<>(TDnFmB=_&1jb~{l(U9KC!Oe*N)8WR%}Y!Gaz^NLk(MugM%Z{NPP zgmd*Z|1Z9~EU8~dBWQInNqp-YkLR*v| z#bIqtjkJtR-FUIr;oir~H>ml|9#J<0QYE@$cfOr&b6Ngu`){tm!}Ca-UV_2CTc18% zN}k?Xn^aU(v?}s#PE$?|E#lOz5VM+Hh0bH zcrD`H=cS>dD_5=r6qS{gy$q!M<<;^wgv^JSp4@zUd%MVNn?N92iW0DleDdxi@)0xh zkiAffYy^Xd^U`2Xy64(NT|&8OcM8V6=k3K?TT#`pp8aqAk|1}9Yw+X!QE_o`g!a29 zk&E!<;gam^C*1KuN<3hS$$<8Wu~;G7kG!-eX28!%nrGiQc^1EX$Z5>zIh=1AA_5Y3 z-?HdVk?Rq3wdzg@`ax3P&;Y|-&=f2b^ExOlqgLO}?8{vqAOGcL-k<%>DO0cN{rP5? z-Z$?n#Ldp(oZ9Ky`m(Zt9%>GGn)(I?N#ao%tqn6*a-y`3{TyirDF%di$AH z647o8fq?p3Gy?r1_p7U`6YQbTFxCAa8o^#P%$a~!UDDwndFp*=v^)|?G&*Q=tv-k*0oT?h zS8<=;EHrShJyv|bTS2l(%w>J5X88qpb*LTx@>cEGvA&pM#NDBFa@Q+qetKv%NA4wuxqyZgWX>K?uq2m z(ozpW0Rd>);%MbDVWH37&JK(-;2FqkGP8ST7$kWtdKklN+}?3~JG;#&Z;zxsIXM~Q z^J3Aa^O;}5lCW7ljY;t){4@#jd+NQV!Eu%UI6y+~2}tv4A(r$B3la&jHTwAHKi6(q~n% z_84Xg#B6wYc=XSm`K2WsQjsx&uLYG)!KK4K8p&(?)n%Z_dNiHx_M}yzz@N93RAs8= z#D0f)xw9dwJ!-ld=$2j+{L#8T<9%^AmBSzZvoltex)IX%o~sfdRoAC+`T2a-*46`a zlaq;F_wwC5gnie;R6UR}ewgGgRhEY+)k4p`P16Vy{D|_PnY3Abl!f8J&RX*=%*MtB z#Phc=2}XQ+(;|p*W06f8Vp;ZqXuoX?jrV-D7^kW#d96NCgCOX2?bM!X|Ls8MtZ^8} z1aaV`E3j?m2uk%qj3dh9T(*yol)U^`Cy$UOl_lT7cGZK7l6?mUhkTd$*;zr4omIeg zhx^+!vaj1><)G0*w$E=e#kq=^{CS`#>9LbtEm6cT@8VMIqBg+CpQF9IyE`Z+aN_FF zd6?=U5Xh)>ue*U#jHg-oed%@_fB)r^)xFvF0`k>ZQ-(v$r)%rU!NI|MnSF)PqRyNT zA3l??(h#liNU(YR+RsBnQ&Y3YcknG4kYJ(2Lpl0VyGjzay9c`)>(k@4K0UPp)+1Ua ztodZ3f*PGg*1CBE2h-uY{&6HEB+{j2PxdD20@jnu){6~W!Z6;lQ37%jNdxJgfGL)j zmjO$6E>lh3;_J8GDpO59IoWhPbF~W}gW1U%i`|bkytPlBopW4q7H(r|1lBc-9JD&2?#?Xk=>~Z0TT3HJHPhUHC!v_dQfTsZnm~L$N=)C9Y(3Ip)xTQ5S7JX zBuM-7{Vi;oGOpB_f{XO--KkO@Tx)CVJp$mnJWrmy5nufF@C8`=;2uqZ*P$Chyf#Qs zLq37M3x*?gr$`bzE_= z5UNfph&q{0w^t!rs1t|_(Kr^19;JCUYzLdwV1C+evcD=VlHLf(o|pVjE$^8fPJ z8I2ap!F<=Hg1)VlQR|)!pwgVwGb^hEg}zMf9*XO6fUgJ$6e=dZd>oSYI^=QU%OH%` zA;!%kd3I}Q$ou0*aM4U#6nwpjxzOrbre&G~nN%>{5;iS_60Hy?fuDUEaQVtj$_ImW z`E}{tU0oSa6)mm%l$0!A9G#shXk1pup1BKX^o6o2|8AuB-2AS(50pmttwmPo!!Oig zE~`LQ4QwEZ3X6_rhc1neKO`sV&ZF)&>!7rVulC|~LAlZ2-8WY4QTVuKa#o>jwvY0N zN>2{q+}lc^uwsgfU0hvp%UOvA-#qS~zVFO*Bz*P(u!N!zGxIEv@@G5Z!ii14`uk&W zx>A0~-AAV%Se8DpKYdd53Mf%q@9Ke-mHf{iXaszt;VbP>iX2Tq-Ng7f2^H1+HQh2ryy(0>cyFJoL=yp&D}HaKYR5)R27 zBcy%YCpQn@-ObZeI5SUGXQfF=F#wWa1(cgB{Woh9r+k`8S^nM&8r?fN!Lwxo-{cn&(Zn%;QWfHE-@3&g)dnCgF~Ai&(m_#>!{HM9@$vBq z901!Ci!`CGX`2+1K%@a6Hc6hz@k(bqI755$I{^-0VYx^??g&``IRT02M-YI@$!Xci zTasRfL<(AS(f}!lmok)92AZqEq$tRk?R-w#GcMu2b^5W0j3!nk+r zoC@>jqSv^X&p3|FDwk%_g~E5WU#6#~kg!jEI_`2K7d-%6%+1XWU8%3HZypl>fj|-x zBQ72qRQzUG09LMVY#_=8T<%yJfWTnzNmW+aS{xvyqGF{H7ZbaC_bxa&DG7`<)OT>$ z1eib_b&(Ygzr37DC(RCIwrT`OZBR4DgH<#`w^B!=v%^iT?KTw;c=NmX6=FKAd4I18 zM?$tNHvlCW?KNOS=BQlv?dACR2RV)aU4Y(oK*a*K>KCb)sI>u*D^PR%)|llY4ICS9 zK2CAxgXl|3`%{ARO`K!g?hK#@NtJ_5hn1ZVq=S9$k&*G+&&cL%6nGv0$gbh(eJce8 z1@Cu`G>+S`Yb2LWoJ(j@SN;qnjE(8$TV1vQD%;JQH}6Tpp%AMeYW^SJ$AJ=yXq0p9 zYiW_80-WS={bWlskmgW)zE%e2IqIP;Foe5RmPX!79SE+>bpt54AaTc)E1cwI9=o~K zDu{49+qLetwl-){oNCcg?-o|Ov!m$a*3sd9fGKEyYL@LKw&wl$i-7C!IxVWhXc9`v zKcgo>l0=2KBc4IFP2AkwTMD8j;Uhu`(A!YL;}p8?;?(6G1RY6JZEdZYF@9ujXy?wH z0Df6~lJOMX+SFG@pD~n^I6M@UX=!Sr60qp+5Qyc@a3?|681SfyRG<%f-rh+bstce% zT)TAT%8+Isuu~woMt}mm+w~wpAU1tHx64)EF2vCBalM2 zp(1MvMiXTl!mX|X^Uj#qtsSVo1V&2P6Om^N_KYG$ZE8;vJ0(jcb&+!ez>72?F%dx6 zfy5usj;8;M15o)61DpupF$i+ts3OXAD!sHz+za<`Y(ZHxo@U7ehz+d<}L@IR_;D0mIFTULT zUi6xRG!N5RwAM}n%XwRUfnc9&IF0W?ZGmgn*46+56C>uDyY@vL4SDC`0nc;;quu$U z_)HnR4^Bubm7!z#|_?TmyJ$;p`oCe(LBOg_*WIx zv0cq6vpRR>I3c;YOFm8lS75G|40)}CrW*jQB;2Q=0V$6Iz!z|N*d*xCvG%$5vrv#U z;+6W{LNBH5xhY5-nSiqCeUl4&b&MPAv zy?5{2iTCQyldZ1H?(FOYBJ3W=Y`J9t!n;tS4w!d1NAL|8ZtUMYQU4m>qzy&&Bet7fL(x^4FK$ceADiZqS#s-fX#6c3z?8# z?jB3QNCcz#!FM6&Wi1yMmypMDKSDzOV-pL@Aj9r^fT1=C1j72d(vih;Dj)^6baZrd zcW)#HOYlhizmn<7#j|Ako>cuPNc$9MRN(^uf9pi2Ryp^-fmLjh%tv*13g_&vCufG6 zOKMFyoQg*AkI&GPO_Fthgo5L>q&Ijs;qq~NdE?VNnO!)8zEVF(90&4=D>$T+-{AFF zqxR09y?>71=X4A28Jm3fh7z#wBYWo0N)#<=gtWh+7xw-cSo;bF%caqiI96j_>+0$N zB7WueeHJb*N%)bNvEb>wZa+IkTvgwFk*oy91bLeMcTP@D@7|3A6_ohCkj+dhRlC*c zC+~m!d($2_u;-*^Q&T~U1bh-#5Df8jQ&8ikQd}PtFBPA$?BpC_`k35Ls>roFnG_lt z3Q(DvnwqYzuJv`h|IekYz@9>eR#pqXWnVk2DG8OIK{JM)6=u`RiwIG*X|KH|%(0*o zL0@q~yVK`hn35^De5c&6si}#Tm33fX0N9hyZQ69W@j}50moI79^BmR8L!0l%r;rkP z?aUbW(+U~z3*m*sH>78nOh^e0#`bYp9=osnGIzVFMcC$p zjc*`vy$6a zmul_PSix8@_8!dm*}sl^VnbI)$Lr|8^@!#QaEMh8|1SMU$crqRK509cR0iy)N`c27 z^mQDsIBJ?#@6rUzbrSy13F0@p>b-u(#BfL)pA?VOst8`=9cy3!;M_T%2dAiS?3MiO za`{Z{u%U-aG?J-S3UJn~=_^tE-26}Y&37f&LPnOmHv9@{J{vlTpjjPB18#S3bbQ5@IUBX(JlhQ^6rhN=iJuymhQ^ z0Jg8A(+;0Jxxdh*zu{qLH%Hi|S;?g09%OUTQT)+a=$#cnhl(||4j$p#;h0oKQV2%T zOieSX>c{F0q;uL$z4B7;CncA8;p|*gTui~G)vxkm|Ib4j^~7ZThQhOTb(S6)7x_1? z!Z{CvzRx%Ds#$e>3yuaV9Ao?1=GPA6LYFV4duo&H>IWlWTk@o&Bm-k(3JMB(5eMJn z`jZS}bM>Edn)+kDq_3zUBT;xgHgQtN*4B2dY?Sw1Z~tajMsi&mS6xL0jbdtQt42>s z(c!$Ej?Ry$s5;??R&U-^WoRUV*rYSH2ExAG;k8hAXoFx2azF4>uaYW`elRwd3k4jS zqLPO_&v9ilIF)L&=eS#-ysvTF4fATxUF`O#xrZUM7p(5de;QF{lM_k-pYNe7cMS>Ydq|W*A&BpN=kUa0ZmiX zcm80ICb2yajN9*h{vN3m#y@o ztt&Y~gJ6a1%hzieQjFT_CuhCeHawp*7FnI3NJ}jBa*I;jZ7$a^ zWNWDS^eAmJqBSO_ughj?+@ZvuEc?nJeBEd?g24_RKetV|7HA9fH4 zN#*jWWLf;%nF4ds`~Y7owM>hUzB{OHt>nBe7Lnh-!9-Ui&3H=ob_@Co%s+SiD)T@i zeQiVeG@adm6T}PmM`l+O37BolxH1*FX%C((xp^bcQSeW%LB6;ja-m@WzdEasW!62E zxsZy^Ot$LYAL|nS^e6gM#4{uLcYq>}=WYN|gjPcCmr<7#7t0 z6-$vnWiy-6Wz%gr;$p)<;kPRAwKL2{Uxk)pKx&0@F?(Mt;ULQ^hI~0)zke6c%{`H< zBqwUhT>ca!_@+e|V* zbDP0PgN;pkrh|ScfBquW+r@p9D=VSG=3R(wyeBlG7(Slfd^b{-;H46jA_IU@q=14JsgSF=ke31(S1NbUCyQN&!rMT`A z>*KA>a6MhGYz?u^;CP2f(?A6u5VF*L$ytT$( zrGWh3*=J#D(2%MUj|xf~bXs-nyt>#~mp3?D>oF`+U{@LZ{6)C%3QQVQa+n zxSlmm>1=n!a(^SBsp(f=kU5hEN8GMMFQ274|J;%q>@d9`?ZfMP^rPe#C*Vu zjS(u|mn9_{H|+-K;p}t*?1MO5o1Q5p$(s4@f$6}zt;I{7{YBQkWzm|Us;HFR-GXnm zY>XaEwVq1dcjzXK-4c@l=>Q4-U8LS5EE~^Zq)bFD-J~l78+N2 zm4^m2UYo@)0}hazVvlWx^g8bZe=XgmxEs6e{#Ta3xZZ1B=xL83T`<5?D6CzhI++&{}r@5%p0SUTd*!U|XAck+AXb}iEG8}l)! zu8+D+o&xo|)e06Cp*}vPbzRx++fq}OnJCR@S8;9FNBTv5}6)C6g~PfpN5W=EKhJ;iI(6FhYw4W%REfTROm>k=s zfMJ5Z-tMk&oNgAd1TW3Ia-EiQY$RILXLTq%;ZPJLB&8^XM$Cfya1P z*Vjh&7tcK2gb~kc>|aw8dxsW$?77b)bSgkT4fuyw;QjE_UOj`@sz?68)&b|&D&>YEOdX4k1IfqrE=l13R-J!xJ3~Usop#$okze=a zBTCcdRyKpu5E8C?lFeZVQ%g5^p2h7r`}R|DwZQl9tw|J>ug(g=Vw4MSQWmDeju9~E zV3fj&7Gi4(w4l2qPH*@33;(RO>5utwKCwJn;a|+mF@^>3m{CgZO(W@Y);6Fn#+|^C zcy<3vk*9Zgy2NmboAG`CCoCpSdH8}0V1*P6c+3x_|A2B+-ShS-@WGVrFUZjl1=3Rt zS4?_B9L6jT5+y%BPb6~| zhPgzqoJ4>7OR(IpH)fm(60wJ+nhI%tNY+pGj+X%*bsA+)(I*6=Y5-uI_oM+}J29J+ zF`68S$q0^enfvn#=pAd7*wr*<9K&T2W2G(bfWfKt?CE-)eqnPpuJG(5_a1v0sAOTGV*RNhZ zY4f33OG-=C+zORg3ITEknBYD2Nu%U_9^khu_h!M^qF5R28+}SNQdnU_)(`eRZu0n{ zcfDf@+nl{iAyJ~WdZt3wBa~81Up@D~_{K>dtZKA`5o?rBFD%%vPhrw;&jG_KRZmsq zv#24m`UAPI`T0N$_@O`~+2fGc&=k2Sr^7u*$5}x60!CPlwKTxAG&Jr9JGP3ifmUpA zaCneWp6kiLMy^pCb%Z_a8X#W9l$VwL?f@iy?>xt2-PAJ%eAu1xpA7iy0BkkEhj7*c z(yU|wU!;ArlI9^{I>EXN;@Q&4uGlA+);2=~B$3;)_YsQ%oXd5?!&K7y#&I0JetsE* zr}=}Ox#~|I#1lT>i1J0QwE7Mj@bH`bsp{+7_9m7Pa$5XZxB)0#u;VfJOx0!yAqMYcGH{21BTwq{xg zAZOBKzh&G?$wUo-5Doo9iJFJ@y#}69WoNMSGEDR}V~B{ooK{AnHdwiIY3?5&)syUv zD=%Kj&47kRiM}W^jt-E9 z2G@e=#0LSvbB&jUWe(`8s*1x{qc8uLj~jtr>>cfo*M1S7nVvQhC@nOx9qrGl3|qoD z-%<_JELt{P%Z(pnO0FxeT*H8c9r1FLH)Ta5Z9Cilm~j;LA~PC~_@N@Z(g9A|syH1V z_Sl%ik9B%(^GuSHb&jLuZP%3XZeVTG0RhXkrYzzf6KTskZv3$a(W(LapGJt($b5X9 zfsK=rt?>frZ5L{_40LGjYUt)naOuKhx=ZrnOj=uHc%o>0odA~b`Ln&j1E2_Jsmc$h zDrDcZf*<6l`=J;a-5XJ;x{m;I)J zo*fTNF5Q;=AIz8FwL7ird0^W=-NFbtOpP0%66SdoDxKIc8*5HOf4q~|QJAKrVw%lq zy`n25VBZt-%Z=lsAZ?y+ zmWBVFj(IsCtSse$kiG8&v zY`wfVX4+^HZ+Qo$rgC5s2Q-tqP)GTE zNZC#JN;xwa;CrJPrCt54y_k&5E0#lBN3}l357;J*eQu9HYhxv7ff+-NHlx1OShI)t z!puuO?QhD-QT+bRQuN|I33Z-O!97lpyPRyiRIraiG^G(}ET3B1*==Be%a=T4zH+b# z9-o~JM=+S-&I?-8?KCnH`@aNynO&96*zys15dM zpg*==3#-$k=1H2|9wp9lsI|9G%%`{#CwaV8^HbM-l4l zC4fmKM((fuT?q+lfRaEjPQ5*sDEB+P?hH+qMjZdH{~-NQdB%| zK$WP;)s;*0axFrl3Fce{I9L{JI~SRh3~_VQ42`At>X(sKci`30Dlf0^7%wa+uBPrW z9IM)L->z?TQ|ttJ6J1u}+9R7(__>-?CRwJQxSojy4pp#Nvasy9jAcT9e%UJ13Cz*! zj>ksn@vU{z@+2j$?Mx)n(H|GP$Sl?_E>d6@5R3uAK|70n=r@8A`xa4L6_jQLPPjFQ z&wMvLB#Ndd$*)xXJF?NCgt{TwO)XAMvjVr({&lB+F|6EP6SBP9Jxos=QygPmGDKV+ z`iju_{h+F9%gEk)8AmVdlu_00>(-mm38V$`x z1yp-~ya0}S|GsyB%TOI{(h^p8bc6(q)gvsT?p@U1w zDs=6hs?g)3xZkmoENju&qS}n=!lU@#P07}ycO>G@iY@;934M=lgM!goi2ZS&a<^?O zOMy~OO>D!1jOG^iwI=2$5SRO=OL6>IG8=9|-B}x-+|?aNvC=&I8srV4Eh`%i1-*&l zv+et8{p5wWuV%@7j!23)P>wbF${&_kfzhJn#<8Y^^_I%Jq{?>SebQ>_BDMMXrNbMp z!i&zM<%TEm32D-^gx;MT2oqBllr^D{e{5&1nyY*Y7%9_F zPTkvTsSi-2E*>l?UZ(DW92Q+D+6XjuoH{t%u0=Ro23eyj(fs~6AxlkUnYzY7S&Z*q z>BFtE{3hyrO~;e z_)v<9yy=4C!1`Y_v91eaWvZ&p=>T~mutvkgCMU6l9q8iJQj;c&gD8T+(NU`YXm8Xp zGq(`z;_Ph%&SoyNetqOQ&0(d}5g+1&GuTh}1 zw3~v8LC5-f0f2=3V`D`3X@$Ne(@4(FwBMnXecT6lHUzTqJGYs1piY515>R0!GXMG~ z!@vCV>j#8O2UOj0XO%uu@HiP$i3|vvY#7aEP7qKJ?@v-q{m-$HR7>w$Z&wOfxqVlGM??ZAVny2Tk2NBeXe*u()h z4!2Da3GLAyKJp!OvBmMHx9A>qy|BprF$fh+_!_Xl9;e6og<2egI?E(Q1ut_V;yeYO zs#NSghA#F4(s-R)okWR;Ym$1_&o65`FTOa0c1Tmi-LmB?px-HX*N=72MBB+Y8CC<; ze;cdJf%SRqeCneV1G%mnRfU!-9qnGfq|-L0S4Pv!-gr(=G{V_wkG3gv+Dz_a)&@u# zcm=g8UDCR&febBOer-0aY|knkR;1F$Ig!jBH`2{9S)oIiu`~0|D_EPF&CncX-t2ve zU8y{VLV)Rl)5eR0S@}s1ArxWg<~9P_&rn|r&#G*nA0FTWblNUno?M@@&hj~WfEO%( z$X2Ir_DP|**9!2*hp5uMfV!Tdh19>)>cts5hLJeRwlXTGY#z)+sk`#dnsz@&Xvxt) zgQ&W-9eV4(@fe}_P7Y~ckT(Zz)<=O2vhuq}&lPB}Cb`28F~6YB^g zDJW~R1ClpBReE;jrFQwAmB+y(KEMz0%OUk7NFwm8#1{)C6MAX?w4tjjJS+F-Q=PHI zAE0zq>?xLI#fKyXYZDlAEFB2|27J+8o1Kq&1bRIW3T;dK%YlmEi?$j)`k-A3h#pXIdBa}uFd}a+QDM$@jruqzCR$n;=NWUR`+@w2<|d| zo44-M3gY>scjE4&gm2OfKTBKqniUhZ*FPY_sq4Y5qVdLK9W4O$IzmMX25`kK`gq@n z^GKg+ndJmRunQ+nmcsLt_be8x<2BR|na;Zf*jL|3CCQo+ ztkHPdtx~q}d<-_KCC&Pn&5Y?$*!WrmF9ZN}ot^IhTo>9BV@QuOt_OvKNB88-^v3xthXFv1l=+MJhAhb0Ij?CGXxdsaN)a^;U0z5@ zr4?}jQ8=(o13@!X1h0w(hMu)MBv(*g50=9?ynhQx1=pMU0J*&lfNbvsO8pVbI2!$e z>yuRJeF>RE{zw2xMe=XB?9GQY6H<8ew^mJroUMwxl*L1rHw6HQhSGKQLz6FI)Z(eZ zSj7IB5RuN2CbBM0Fv;oJN=|3sh?%b>4_ef?&SADqoMNPA-f zR1*9-)!k`-Gd8|J`?+8xwsaGR^lqvYFDDR7#(E6B{T9GHGEli1Q}gE;DpDek;7qE3 z9!fb3V@ycF670l8H3TD|;R+l$(2}y6bU_>hUBO?JafPT5&@0ym3+U;Ee`JBNgAN)m zvEiJS=uLHiumKaU8yn`_fUtqk6@@Z$y$?G)3F9ECE}x?}TQdbME1E%0<8z{=_2oH_ zSL=EzxE2A>u%Sz%hb;JCjHIW4TNF9KC;5q|4M702*e4na1B0(oC#~Ag3 zgaB}vuRs!f_={$M?z56L10E1xfMJScU}#Ds*8mt$Xe#pccVVTjgC)GcXDC4BqoZjl z;)blBS```d(p}f+jF*XpcT{eBrT_<#HA^hAR@B!4r{%I=$kQz=x8I~Gv5eF1b{$hw z4m)z0`y~D=d^V|q*63F6t#Svw>>SP%+e~Jz%n(P#=#W1w3tif2hrBt|Qmjsy`GZjw z=7R;fygh~+om1bY8mwlEv73(%8uE}FxTDF5d3TKAF#R4O`lh!#uJ2*d?iHrN{{~ad zLJ1O184p-ks(@a~Spx=#b^RB9$}9QMntswOf%qcNbV{t_$>|EgX#J4@6WGL0CwlRn zD0d4aj?&W2KbT~IF(HbP+&S{;^E4`F7)^zydYUpRs!J6j|U(F%&yV8!4_1#f(6Q3ni?O?Jv-f^< zbKR}i5y^ShBzEDfu5*4DJE`k`+F#|)CN%VXpCS&Iq$$H|$mqQ&x)z4aANAPR|7Bva z{%o>;m_;#SdzZ44!*s|!fv#u|68w6(9`%P-j^-}>P+LBAUHWHR*$CTYeXajbK#DF&fh=v3~-lQxH8B}U*+#G74$1s$coooi5ewGa6_^N z1|tenI$giUncQ=?9{$qr1#IjWw@zIjn=0qZypBS}-Mh9|I`(FwdK!YW zggxC3i6uR@b~38#)fBBoD}IYrRL|A?l7?KPc8*n-uv@Z5yi)Sy&SaTLHo3378HwZ? z<<)qJme$tM6lcjRnkxj1p`_T05{(q#2*a^ih5G7=k>X+p^9g_{a)Lf=4AKmb!l0qQ zrgjD|Pg7e0zvlU92NUgnOI?V^z|b7))|Y?(3RK@(7!bYdReTV!{9dm+-7V1?*Wulx zldJjNG#VAdTj^eNLaNWwujU!4J`vSJH3N~3wO>GLnZP*jQELS6^z`(J+9z2Qwwr%Q z;#f}+5EuvHQ0@x!q<4y)WCr2mxgYIvTRuwD(b9P~WP$gdn62rumG&H<2$?b*SfA;U zu479mq()1V6!hdey~KLG<^ao#e0T)#@}g_xxXZwV#oF#+9Rm$cQ+if&DtI`{$a$xvqu*XfJtS(h7H0nX2VtM#5GX~e*3Q&Z5XANI||I-4ZESZdW z{_9P&2B4E+(nDdOKt_B^c+pH~@}+iKyu_~}c-K>uhi0fYvs$rScAz@1&8**aZo+K} zQo(vw!g;C=-)0~Zr*W~~6cTK44eX*0kvRElWz(KXbuzn`CfcMz5dOJ3xXyf6%bhN( z_4-bp8-hRmtQ0H<*(Q|;w@{X^n)glAf2N84O*yq}c zHIQ9)1C8V5t}hQYJaLcJ+5K+ShC6{Ov$u4Kiz>+A?Sm4USmTvf-wv}>7w>QlwVH6! zKSQg8CIH@-CBFW`t08zOvO&;=W7hRFlTx^tP!~;o}JCag)@e=NGa17T~ zU`LzRe)hNlCdHFnKjKzaN$9S%Sd#TN?N6s!;ZFA5I?0$;dU}8dw@BW&BU;%xr5jma z(ma%{CYk`XKFyDrN=ar<}ehWJ)ov(a~#M2wpSXxokwI2JbMU?K0H~9af`T#~vBB^)NTijZp}~Ht!LS~GMhi#oQD5a(i{8a&-1KY9&ZCya z8{2+v>t~QD`U~JP?=_XRw4!5TVt)Miar2z~qY9_r;lVrCMI7e7y{Kr*uvWyClR70iRU9Cag^8aU$fk$rBqbo|E%htmDK?ZNC6WvU=2W%2j;?-WMhD& zuQsTh#;zGkdGDUhqWXuQ9dn&85)*6jza`GH&zQ%_Qm~Q0j3_WE3S=Ar=s?bm-J7@} z<+0?;MZZR-qNAfjs%yowDN^Xv1Y{Mby-hd36@Yf$%E=jb9Chlwy*-N&kBz&#j8f~RPD>^Nf_DIEyFLy;>cH9{`T+A z^0;Ey1;g>#7nAu!2u7pe)t+AG`P>>6224F9N)e-xEKTjP%d^fKg$Lu~xVxm2RuZgY z+?;^mNCmF|hVK#-&iLbqp5_*nASX1YQj;lV>;IwaEyJ?fy0Fm)QP?VC0!oOAfV9#b zQd?5GL%O@$L`jj7F6r)k0E15H4gqP9ZurK6{hn{X?>Xm}*QGvdtvTn2d)(umbK-=? z9=|NzIRcdqg_N7_RQ+CamW{39d$AXj(GwG*y=1^p)`?k;9aU=^Kr2vTUSxbozxaCY z=g`lwy}ulH|5=%{ypYBM(GO7$)6vn<)6<_vrC!rw|79xbw)Z|aeq*+y|3^5ImSF^C zZJBA%LQwpW)%C!`r^1gflvk{eMlDBU_{Ft`A*K*FNB9zu6~Ux~DmC9mAlx%JJ-f>p zlr)yB2UEW^M=IIS86Amz^qKyE^=OCQ@8gbBo*Ami1tdxriyY1M0qyfIA1WrXu)rUEB)@rm)u$O`NlPDeue_5bcoGT16ZJn`$=M~cv;St| z<&xj4R%Wp#1_a>BS!}x7)|jiPQ*K{8%?zm7{|GohU;AKT-@4?#La8|~omd?2*Y&Y} zXgN*$SAYK&``kh~d*s6q^`+(hT&1T^TM^OYF0%r5K1huGWM;%&-`yZv8VgPz5vBSM|>6+k$^F?7V zvKiOI=zQzs>-t~KF>Dx&@((T8(tDbO7f0sN(kLD#gPbSP{m+Do0xxyeR< zXTK)7iz2{l+t}JF$FzO!P1!8smkhvac}(AP0gJT9LhZUibvB! zQZYjxgsaf2T1Ag!xT?XOLSqywrCJL?VXX7bCaEYY-Ml>JJ;>q)MJv^cxPrmNp;Nd` zV68)~^sqmw=}hvGCUa)>#7*}$O}O_sGV!6^P|RU;*7AJ)p7WFtvN&^R{pJU8MXJvq z7wWfo_q61wvSh={6v?1l8XRbc$2UW!QTG{Q3ErxKp>()(Z?PftVre{(=%G_oRrT=B z$DPG~@f_>c&;4fltvYBOjYL_+uzBd5t~tz$G+w;;B$3hj7m@q^`9+JAk~$Oq*Oktu z!^JnlER9pMMUZ&CTU2(B5eR}5v92i&;&jBLT^so*9Np$neX?(;T13A z|C=;W+xe>4&>^P1^xGgGioFVawZ&eGw;*cM);<7F%+)wp107RyWvE3sYhs^8h=6!# zPGXK7^3qDCi?b`!g`t3-|J82;>G#9`X%3le7%ww@*;xPNahT5zA=~~OA;JcTx}32A z>jB;Cyj{=|+FGy3h5cJNk5(P&>VtMFSGp;c15}jRMPb8OZ1I3A&B9@LNi#j2H?VF82XbQ|scRO_lxS+vs77H9dFjN!8_7tHzAe*I)?Q2 zfTrCFw8fu98Xl+=<+__o_ zvktJydk+Q%%0q0_oYr`>x#h>J?=K|#9mp5Y(HrHRlF}$t-l+r$%mO^djxVB zL2wUa+!3fWtiEXSP;@nowfg;h}1b;bMOE40h0HlGqDX#rkcE4Tj_QOfwYik%CX#t)L<-;HEn;{8o&fmwGq=i|Zf5L*xS`uq zEUrM6i2qvoLhBIljylb5cD_fKZ=A}oYM1}B4+N6pw{jP&lA%4?g@32iBwP#702<)^ z(;!c*46zn6w@8)sj$A=;rWR0CL!*tLe3 z>o>yae#o(P&l5Fp3UnJ7f8HP*5*~Z1en<55gI0Y^7#dGEZlDy-Ho?~hS#0!u9WoqL zB$T0X#B{JNd}JKPbG0nH2o&=K^k$#7#KTKijk`YYZd(MT(a>w5UEBLAlrydqHT)3b zH2-IhK>U9e2`fSA6eb_{U+_J(UP3MC-tj9o1ekLfp#HE4ekhbwUpYt{QXw{g&% z2^>)@|M-#Kzr;KB*X^G^^-GfgF+4z}ZS|HkO>V}52B-vJpG!euYKvhX;fSZ;-BxT=`#h2%P=& zcL3U_A~8`&{)e<$KP}MOI@imcw&-6wI64l4c%?$PYV(g3Wo3mp(D|a8Vl0l5EEh(z zPAaF1UDu%N=J*}b8SUA`J^xQW`6L)CZ2liphK*?dG33lNz5_FX=g++=kUd0+K}#89 z;p@HPJ^4inO`9$mVYk*ZqGspIjit9wVWd~HY7cAg~Y zv`9l4IVb#6PW+UVfvsyn3vzQTrhP^;8KyGN#9RU=7U(N{D!$$X(sEM&LVtCQ6}Rp8 zSxbqgwfV~RYRzG+Kt6U$g;5s?;MU(FtO)8%cZ!$?2uodVv|k}EAG!7A#7k4|`9AtS z<+^XEtNV%5+>c}97Pgu{n)_(!9QY`Li-jE)gJ2Q=oFMj}y*D2^ePv-QQr((vc;&*E z9-8CP&nwqIjUUg%SW5B)X}K*QT!!6u)_V&P9S+MLmIhzRFcru8O{coouxGP5PkQgS zE1uC#s7L=qpc@GU$-HlE#ivd}GQ`rmTQ!&nx2QchCL7m_mD=6lQ5n0ntI&h67Z60A zw5(fm^x(zzPwC4HaojZR7k*Agz2$&mcbM)ZK1zHL_Q}$^ME2~_BW-7Y%6Egu7!m2u z6?+b0r}m}FKC;gbkv!rjY0usrJ-NxibbK(cL1yTtRiU+`%Mi0?)?dv>d4k><9&B@I z$;`akuC_ImaPwDo9Oy{58fbizPPAZ_j!6Z8 z68>{SekUcKyN1Bg|8Nf8#g?0RyclBXD@zqpp}Z{}^=rUtWxc6zh9hp-&D2C@jtIK6 zJf&M3!@3k6g^y>4x5!1ikGJ=T|u8P0rrEAc>j-vZN;2x!>GCO z$lLy`l6nI{&9%M1V#Ykpe}xEVkl9;UIW(W&IxZiI&2x#sYMvApj2xFx9x zT9cH3z!5kLbS+zfsrn#>~7XSAZT=Lk9 ziGPk7X5SjAR~6-qQ4+i{U~r||;q&zT)pX)x9~;c=ZY?m7v#>c*efJ_a1B0}Oq`wHl zj5xmZ{J161cS(g!?@D@Bmflt5T!dQcvjyF(oe80B>nB~^tWSPT%6_z1`XS9&s3*)g z&4caH+&jB6(8uHsvMSV|&NYGFY3u+|uZ7W~$q zs|CD`s`nS)W!-0CVOctl3`qHuR6u#HWYBPrE6mR4a{u|+p_wbyL7td$T}DmV^t->9 zMty`m7t`dc+*_n=qXbS;p?oc1&WOo_f7wnle<|djJ#9v4C_tA_27lZxYGbrNuV1uOH9m6<}%RAAWGz6 zVn1o>nyXRPGh{XO>ubo=7>zEJzKsv_``mObd=oTda~>>6vz@Hi3<;=`7GIJ)FFaRC zVY*uDmo^+EJz^NC>s&MPiCtf&HEmGKLsj&!A@2C7VJ~w$%kRYY`{1P#1LP~bUVb=@ zzg9*WDVx!Tp(-O2H4UdHLKbGf{Ud;3%ACu@arG;HB3@3X~v z)U4&LP^<}Sve|Bbh}so<^rltwdZbyMB;rb$$~Kq1I7rMa+5*?_i!Nx?_D#-g$Wa_l(j< ztuNX65j9jWy3w^SkL04yGwZ7w>w-?r*C9?xpyIVcXWH3!eTE>?|#CHPTuOrg- zNgD08-H|oy{6gy-Pd0|y{ewYMeT6O)#`Vk_TlJqgD2;-b%A|L*#9#*EEbuTzug0bS zdXb%3ddN05x;odY&-l7E<A-8MI9n;w z;jgb1yXi7v&CWWQ&P@DZX7Bi1BQoaT(;&O$ND7dkTl*t?HBAs*m8)bCX&DL+-ymXf4F4MXmLC zl1sR;x(s}$x+~5%n3u|0IALHKWk1dj8!(n?Ia8PG*q# z$VnUz+gw zJ*d?_h-thtdy-X6g3?xmmF=c)Cm;(}5Q(~3G(Y{SvuIF2)Q~<{qr@lr>J{h57FmH3 zE!c|oT)f3Lh0XdMqI2@hrj0Zuw8ABH8Kz}E70E{Hi!BsV$y*th%Wg?FCsR|f^c>{! zkW`@c)Ix}Hn-T&>`(cNEt>Rf2->x0tsra*nhWVm&Q>?2zsPo?fQw=HBLvt%%kMfv2 z`od)D_{9~g!7nltOtsa4gFI83p(iXP1h%86rlizEdmy17_vodsTm) zt6;2oh-NV_s|f<2LtcW>X&AjX{N~Mv%PjPo5WS~QOw`uG8WY*Jo3I3qGrv6^wMjCax^A|3F`<`rvGLePQ{eO;h^EEy3e#{=0U-?-uIP_hS9EaN}H z8s^we%Q7#za!na`^3*>%dIc3@kxx7&A#puPGC-zbO*vynOYK^TxQ9t2jfHucbz!lj z0sW=%xRpCuIrYD>yu(FPS$l8q&yGS^gbA6RnVH|(m*13Xo-BiC!|0!uRJ~8?ok}Mr zDV4zPF4U){;;K&)#!{Y>)85WXLHBOIgSi3ReHNA(<|VLQonqJ7Z@36~4ZKUJ-%6t3YUq|$T}Q@v;S-Orqb%c8!$F43{NfEI zOS-We>F<6jeq~DEFh3z{4*GP+G0pI3xMHc+f4yPfChdbvp`Pm_QOR|-(C?HHFNq#N z?A*M5>K)qJGLGh1QXS|#hJ;6MC-a@lCbb>#aSDMnc*1e2<>h*6@(PL7qqS9%EbovY z71oN+nz7g09zpM3TS$7;Su1i7vLm5-!I zgSHg=G*!IyB`r)$3RdX?%^dtb*k^4-gCk~P8HyhId=0R`5%CWGO_jG>^le?-F6R_5IENC`Tdng{o`mb&D zzLMqS8Q#C7-AI$uqo2lbF2xnAMNw+I#0Dn?3nv_tx>(_hB8(j^bV{ymmez|G*MH^f zWqGdqm%CBpYicFd-<=m;RO*$$tS{pA8ie=hq}4=!QYfIK=CaZqQI7j8QwXu0qtGIi zHm;IxC^%rRs7N=KW?CyJ^!vhsPjhpUoWA&{C!YRhL3)c1qtc~Wmx8YN&UcRYH)l)- z{h|vhAPJUKT;HrKxX9>G-mZmKDA6X^CQnnFW_(3&!N7v^q2gu!60@|oMTcsEW}j8@ zi9gtLl$^hBIH5Ba(>;kk6P1_xTZ-Q;Zt`)_?j^N2NVDn}w5L_CFVMU$2$g&NrlsO* zDRNSu%W1nD^;buk;DpN+_WZ}aIPSE3uK5j_Zh?zAWzEkx+%#em?EeRq zuU=*9icJhF*Waw}>twx)MU!S1e&V{MLw;S@HzRgdTXvRQ<)IyxDBe(TbZ@_ct3;EK zm1c6%;`08k`3?P;@;nBC(Q5+!wq$C;EKkdbdzyaUQ-IBvb7#jpc7`GYr^)Empj7Cm zvENf0Eq}h{!5ZM4nd22T=2~DUn&tCC9-CH0UYcwgUl3hYL`%uWez;q84d%KC&`^4i z{T;>rgv0p*z9;@^wn|m^GtX;@)tbLpGN2pg9DI=8-uin82wT>|R8i z-E==X>-$m`gtej5;?WCJ=0)LxY4W;(ed@DNHozdcJ6cgNwHmvMUq6V&=&RbJIm_?K z8*qW;atp_1y70AhW%XXq%g*035lE-qwwv3&$(uQytUzfDXVm;T3a!97MC3iKX5MtJqmPUhvfdP=fEac6pAp;8V*2-7w9d6{N2wAP#>s zs(8=q!s&x&f~nfDA{JIHnoP!RW5p*MP@Uu(ZUD|6e%rRT;-RW!8M@H)roByRbY3Ny zB%>jgJ0B7yt!UlddNrx-d31E|#|dhGRtLeJGN)u$tXVAYmRvHvPo)Cm44-AcyEFY@ zGy59==wO=WK=|`p)mrX*6oB#uaY+f+onxe2{s`9=y zsapPv#eG^eCzkiZBg&-3k67LnE;Nl=T)TXX?_OaV_CP$n*PZ?gUUjw7mJ=(9m74on z%fS2~Z0pqBHdDtSWayPu9tch$d~Ft>$HNxzo-FP%$3QUlUMvjTO5!xN&0PiO!=uX- zAIM0rmaAWpt2Z6&lIP1fLlklsg<8{8GS~{4Lk0hq8_oCV}&7!6l8HU>vI8o?kAKN$6W*NSHHm4OEPSv zQ6y@D7$;MSQYlqwm=7e`=qg_}wcr8@(?Zzj<BoZw0*by0;|ew(UnI_0zNiRP)Ms9a?^Q~d z*l90dU=nHn`Q5PDuB!;8`>fY!xV}a{nLdfMdiTP>$9IKzHeaZTmcz^l918-*8Q)jJ z&HFk6d8;J0RVb^J?#2;3aHZdqY4(ewki7iy?ZXb`2RBJ2+!T4lnG7_uHgvU0eg+f;YLxfZl4d+`093)wI9eB2clC zdrEUPO!5k`&X8Ye=3~~-HlnBs^Fm{}muTw#g!@+`0~ix^42)%oyGe?crg~cL)Eo;> z<0$(Q-y~f3nJJ9Eb1kJhhzdJ+Jt25X!Uy(9FWp8u3SQYJre=zcimV37UG%AX8Ux|l zob@Rt3ntY?kP1#9WIo$3ot>)RH&VaLx5Q1^x0eq9NmeQCDhJPPfDc7!FPM7Y6bTA) z`zamz)0s5Bj?CrDq3_E~IjXM`lrs3u%nDKX3Eg87^Wma9xgUt42;UA5Kq4xwjVw%ueJd!-Ay z&6%9$<2It5!gH?cgX3wd2Ku`>L8Dsd!yLI8~&pMA_>{Vq4kha&jm!2h7BL;L(Gl zpEIJQF88f{PQt?*SDhd1X9hw6J_SYE4GQik=4H`_-^a5}7ix};_D-TN4Ia*~j#)b1 zAO5Ih<~G~sqbiyCbH$^p-hf!8XF%fhb^yoA;>daS$&~&b|Is>m0jR*TdT;*)Y>BIm zM0c;n&&^?j1$Keu1NmI*UVU}{JaF~~Cu|Fjj~{t{*EQ;?{58m=O{!P;{B8_&oW8w>agK#uK{cXZF+56l$6|Yr6jV|@BYc+Pm5|mF&Q6tVW*T0`J%QN-DtoC5r{oM8wBC`J4oAG6vYK zn;+=LeSu`{N3_^Yuf&SBF34}lexjsU`jMHU+1$U)eKS)dH?2DQ6FEcnjuz4CN@|x; zM3^Z3lK4k9em1Sz>rjf#sY2<;aV?`qKg7%zLAl;fAT{~>Ds>fk`R$p4skbDEL!NnR zT8p3lwRUDis9j}RkdE@4&8ymmJ20WAr|~?FPtQ~FcTIoiML&8y^IhEvt#(+-x!-`_ zhlQc2R~qUoKSea`JaBU)@;fA6)vaGgNg7J%f8#Qi$mbhqdkH-Yxh+ZU1L zJ&!DJr*x0|``)s_`Y76r>xEF4wBh_EzJtTdX{%CI8Q0#%*5@2>DXKVUte%Lj1&2}1 zVWOUC(E-1@dIz{JFd_T62@ImgY9b!jsigWoZBaXhYpG{Etf6?xi~^qBOQCU6P9aef zmkAKK47T>2jeeNAPh>Q|OlnJ*H8bb}rFsu?L%Y3U^njmp+i2r~!qu)lC5h2pz(c93 zgaSHCZcpaYfhu3r-db_TKryJWLZD#2Y%l`j1*0_3mp~-~{sHzw;lqBU-y!6c0)A}b z?27Ds;Cg~;TrxxcURV-={OAsP+rL8%YtlB%JGTK-U)p)9+MZ0Rj@tY26mb{X_ z-h+wwJ5ZC(kGRd$tjCXeW-t88TIp0zZ~2%CM8?)UI>J1r0zVpxS16*U=Y3(S!2xXV z-{$W}zNQ#ShP0Fo9@IHu-?{g4F+Dz9%QLp2Hz3ARZ=afOZMUe80iawGfRJb2-F*XY z*;yGBWHsEJ#d>Nz0F?mbXIPg&r0OZ(y9>C6@P*ozlOmf9)GNhK;?sM7jRHYuqHS(r z(?~pV1wi7+HW~72+*iaLu>b zz8|N!$fJjrB$MDhv2Sp3}lqX6)PKAkSh&W7$0N^B+ z_+*2@D%!pUcyvbMq06oW2MyKOjV8803{2-G=OKK01K~} zDa^;*glKCrunc871R@%aw@^~t5!iP~m+A=R3$D0fXHgnv&4{sy1w$V8V5jyDulMM+ zdET6VMO!V>1P7R%tz%QDgFZ3c+Pf93fQj-tMvBi`e!IfrWfx(4U_R!RM}QxBD5dhn zdX1CaNTjM#tHRLAfPVmraTu^-aL~9_$t&DWOv$O_A+Svde$C@KU^Sb}=d=-d7S>-J zyH&R%qFK2fx$L$=MV;AgyZ7{=w(V>zlyB1;nf6<}lZ6>}qO?=o7$`3fWGi>=a*w=j z*(W(CsQ2Je%TJAZZ*oFJm{J}A>@TSKWZb+IZ@uADjRv6AJ*AX#^~<$BU|cxNNG0pV z`r_9&Cr3UGhZ$36u=Shx98BQszQD$>+;Ia!G&M5>4s1K)81@Ch)PcW@{zLF~l@Dkv zpTs2KILe&JB`DCdUOB$fFDxQZKUENm~*a7U1A!ex?Hg2cO`XETlG8_3}x)nMw=Q z&t^|^oABg;!mYOW5r^Lfro%uy!CVh5#rp;|*+pS>IwIq<@((weaZ(O=Ia4-gBZl7~ z>_u0hDFZy^*lA68Xv(;r4%c1eoyK2Un8dU;+BC5qD1Tuf3R{s#y?zp_el3!Sn4WUu z%x2tXMpl4?3^()bD&LF!qeAX!ed%0$E_`&}#f8gmP)6QJr3GG|JPpeX_Jm}B6F?xD z4w;27hN`CrPO09!fh48TE}gVou^!-~+pgg90r&$bV(-Vx%ka>1s}D@0cfQLfGb( zyN!SmM0sK%YuYOVIeqVl)~TdotCgpI*_+H5w7-Moe*vZ!6|FH2)O+Rah{L9LJP>m~ z$l=%dMJC&BNbcZ(=kb-QsfDIlKIxHr^f^PSL-KRkV{?aVx+556bnxo|dO=O=`a_oU zy*_gw3$PNHgS7g(#SsfS9uL%rCb;I(YvPZ9 zgg7P(n?EW^u%OiXtxA3&w0}Z?;||TGaR$mMWOeNjskFAGJVmz1a@fr&C=$RIAP$N- z{y?a)j3=AR9L|E6p63p13yZUz#J^;TL&``A=J9$7$5(ib8kw5W58@|VuQh`+Vbay| zHc~mmJi$DGC7Nt8#KRshJKJ`F*Dh}Jl_g=yBoGCV)_tBcl#Co0yoDCC5T@%TIDr-l zeYRt0*$+3cv~XBiKhfY{64Q`T8Ctq$TpV#h9qR&wU}sqqoPTrhizo07(>p$Z3`eh#A-e(_ z(qn)h9oVUlZ6Og|@W`Mi3+h$qqj;up7&OvU(}foi5)#7EM(J?BQ1f7c#2>bTs|ECU zZ>k93vC9-Oler!q(g*J3`^qdybMBM zi$EP$Bo>U(X2-|#2RK)67w3*zH;}krmsjgtgJh^&Hk=I05!LCGUc$}E0!{_l6{0sJ zqmPhnfszIul4A;uUZta?Z0PN^hokMO@89Nib22qGt#sx+{PX=_wZ;?9n$iW`$|`!N z=QW(D-MhHO7!($^y;Rtdfqk+bUgHF(xks9U@FaIYU%8pdredD!H4*Md;yV0ZU(%;1vL^hO8Y&gN!F1F7rMlc~>PDdGD5-HiEg ztqxXpW_`~ER~~_`@zuxV?jg0w^V4IM4&bnI)I!IgQMG1U9pr> zXH`o+&dtr`x-Xm7Gt4%9t(W##4{m>D()~KZam={^E`RzhEg`YAq+I7D(OaidH7IQD zb^ae$##H(~=mQXa@FkJGMfC!A$vw01=;jjEk=yK+>u^~SOYD6bt-WR?Wl8fh7*)>Qs8LlYd3Br-VF&>wii20 z)+h5OBPb(4mk!Tkh{Z=_O#HHcj4QSL&c#^k_zLPD3v%%im7^yGaS&P>NI zwE^?Ay-75?*q0rwi_?A6ii32OHjS0%v-5m%_;e4~lP59;E5DTMHkBKf{%1NGVXh(l zKnW^E|5tB?i#QOUDUe%_+{EWCGSbpM^SZlKx~cAcz3S1~JJvt_h3($G+Tr1YP$kVL zyl_lbA_XB45pe0fn>VGo*A6#2TArCT91rH@fW-n`3aB?>gW2n)gm91N(Quty@gf}Q zA|xXdG#JsgBD7Mmm;-b9lww+|J2Qu5N0Bk%w>%fs6f-hdNvZS9^qK(A=B2I-#AOJf zqjwtsG(jr`fL~O{Crm$q7`W)jdr;0Y;_=;&w@H~@v$_WP$2AyyFdw2$F%_z;4IBxQ zA269nkTpz&<~TqNafncKk4PHB6YV%hbXInTyGPdkg%T}ZJCki-i273~QoksiycwRc1MeuOL;g{CnE zjt^3}$aG2L+aH)ry{;$e=8I7%m_65Nm=mf%5>rkKsX>eM{E{pLsN;ofXs^N?rMJ9wf8L>s~{9w?k9$CAV>`NA{cK2Qck1t#0BV4%DE)NAMa$>to zQPCcZ02*P@zV$#XzBw#C(26PHU@~ZRnh8}3Am*@{{C1(+b_njp0hqx0G{e%I{<1z&@6$2g9`DQqJ-aa|Ua4=Rc9j9aGG zH*4ZZk9Dv1j*OUX%Pwg+j`mtNfyZtZLzYF7zuQY$ltX&ma|TjdXdy$B3ZNtx(NSf7 zzRc*W{q)pWmxJX}U$~`b#dpL$$7~x+GS#5tR~!BRU9veo1k0E)nKrp_Z1@2Y4-5W6 z>)V!(iRkXAsNZe4wQOW$g!sk{9qzzT(djQrccVG&Gv?80EiEnjzu;yOIKFG)E8KSB z4pEBng-Z>MvUoDR;NpVDwG!X2r4Tp8!|Sx+v=!&Rfr#7j4>dQLKe!v7$D~$kt87?yf-;)(CWYu0e<1 zXy-clVF2$JGDCiGG zr_AJz4aw`~IdPngFxL5Z1YF5tZ;fy1AVYi)1Et**8ws~G?LYNRsOIKW07BM(Du$$N zjj1iaU1af`MZc=cH$w$@uF_?(bS%`c4j~c}aR`|kwI4snM+NZvd)iu*hRLF~vvbmD zDUIZS{$0-{8NUT(mp5|2X2CD9|c9Qaj{Vex8g$m+ET zDvtxkKc^F7iOS;xmo*Z!T!66Zq$F+EtAD~24Or4dzgeu9@ zfI$V!k62{)^;XJ;3s9j%JNpLIE67;KMgt*fptz92XD%PwsnFvCN|r)OC8Wm1)Z74r zgiuebFb|@04(|!|C1KU9l$dTU>I3569p}+Fw zXMc;w84nPvXn>XnQ0JQ{Y0NxKK!4hH*;&+}#eqI7@ox-Vdk>|%F_FLWnT=Izp@6=H zAPwXutg^TGf=6|Y(*S%_l~$qY&BV=UX2*iSdT`xpC5&2LV2r%dOX`0^ldjtDFZTF_ zO?CU7C$FG(HbV|4t*wG)7u0$Mr`iLU^clTeP>~eW;uqgufc51isfcld$pt})SAbOZ zNHn|t^-?*p*k~>{XDBSc z7Y1@BEAde8t1eg%LIQ@p@SlIQrK#=jfK@@^6mrf>1Gplu91WVxPf1^)R|{XG2gB;& z$zTwnkb_1G7P1-E>N(4uJln9C$TQPjJY3&HGvSW@m$dE zp^(;6hcGLP+Lf?{K`@LmeJ%v)71lZA6K=7o4Y!NVLDdMz)C#KLQk_>C58&s>qvN9h zR7d|&0kA98?uBY}h=;NTrU|ljZm5FHHDF!H;30XQ0IGoJg3-f#(*#P*bm1)F?J=Vo z5Kd&Yf5?gq022I&1Ml3Q{u+&kdk|g0gJCrRSw8~TEJY-41AETl`>(8^iUym!bdC!e z$Pr*_Q;4a>#@-=`BX}xyrPi+Sc>$eR`vd(JfYxEJfGg}kCV}^kXzqjPcVtjN10YFn zYD~R_B1SG@*bEU%2WJYpn1R6$JP*N}<*qWP7?o1F6eK1bA?4E2^JIE5P(wkb@uu7A zd_gSo1hF2uOQ-;(w4jZbH9?=K?#p66?u9lc8@oD$bl#^8+dvl_BO`Q3rk05V?O;_U zX{v(NwRcs&pkkixMiF0u_bb13@EcIB6yfy(rU#)I1UNt?QT;_M z~DJ>*tzxEx=};5-NG-V69MtrnKQ^ z&`>84S`ouSBChKA16(rzk;J(?OYQ;D6x9V(p+!jv-rLpw3Ky8ePjpxpfb;@UAV#es zxOG8TRv^)$Ev(q}g$W}d-8dmmaH6b~A$E1Tn#kXkH9=_@L7ayY-rtwN5$LP4A5(;i zrb10&`-*ix60!WD{B`;4X%0YF7gsOqh z5bS_cv(c1~QsHNr@bW1Yf?SaW;Yt=|rH4dKI#>%RffYWuh+)K=#u*2YOKZ6Sy#RDL zGLsB2M5)Sbji1Z8$Y&*bipcj<$2i#<3g*-+W7+iP^cx%YHTDnjmU&@@I z%G6Wl0(AspB4&cXCV_zi(FqEeWI`(m@OA*oK)HmRLm`t?K`%mKn|2XA3TF!ztl;OP zOXJc6z@5?}af>ycf=p}nH!?fzZWDO`N{uzpcgF9ckT8)~0jd=MwpdFTosuvhAoV|` zTzHHH4F-I~H(su|y^#VabvH(gY9bF21sI={kE)7cpb+u)=39`*b@RL)CXAxG;AJ5@ zZqWq%u&N4PFHjN(@M+o;(1B~m`K!Bp4?1<}Si}*a!IkQyfJG2NR*wMIJqE$)FOV2& z=h?jme2d?~6%>CUklb+%(?udysd%?&p>jI#;35aOX5Acc;h8ZD(bfQC@=Jon9CZ z0VM&_2AuQgLOcj4h=`>~P_?wk)3BkNBC&(BB1QQ(>hYqDSXf^#7yNH9pa4E|BO~Q} zowu2pi|aEjKm}=K=Ze^l}@2Cn_F5)UFPoZ^+SF9?d|0l9yBLUxJZ&pazkD@*XlatjB34MsXshd6WbzM;xgs)szS;Fa@T@N&%q9WnW1r~i`2J4%Nox^jaZGZZ<#8u6?&ThxG=zi!RSDn{dCY47CuaO&q|c-5kaLLk z<)B(KE_|Ja>81HeZWJH|#1epsqi#MvX_?(u$EuutV7w#rsU)zq?6hA}W-ia`4*5(B z;}Pi40EYk#39h06NX_fGr*9z3c7tvZUziHDsR@j_nJfSyAR@|UT7`O;Bk{-)7@U_02zVX zz5R;_Re{8teJ#)kzdOLv7KTzBQOY-Dsr=<+B+JV&?1-iWOdmUl$ABU zcr&gUSDietMVcz;wNTH2$I;MBOl%-i;AJoneSLDG2WLY#PFbG^)F^kUHm&Y?uJsz@ zG#+HZIYjs{=V?;53ZDT9s#rdCw)q`7QVde9m|;Cw&@8!(?NC?Amk_mY*St`CadnkD z+LnFWZY1ciENO`EuBWqmm)~2Usl1?%ZX!x(C;Q=Jtn&hUVj)J4F(6 zN;b_wpcRdF?Nqq+7~$BUS(A==+6O|7;6pzFU;|X0kj_*g(CJ~lA(v9=u_{TNlKzn9 z+O2A-XK3&-;}KL4sAoa~@>o?)(_GT^t1e92cF}_lyAta4FCBS5b8D@hT#krK9CQ?N zf3)NX_d^2X=a`h32&(`~FmV2C{x=s@L;(^^ck^>WegzN z3;7Fbd`N*qJW@iVQEvOYHyMmbJ$Qfber;bj*6sGV9mTksIv?x%49=Lx*d#)xk`mG^ z;65l#TF&>PB*0aGg-iq=aYr1oGL5STB;hdeisMywZXe$d{Yp9c={w{d7ue>9*5^Ii z3E`AR9_n(U^_&x)cS?Zne*m)s>yy!ti2&~}9JatfwVs+~8h|!XI%74Q>%96tjjsA+ zbJ8_#PU>Xd!99JdhAr+u7Ixdtk;1DxNx|9yUfz3y$;rvf@I_DUmOaYrE)rsf=L}5M zAbOu-0k3KiA#;I)#F-?rDbL%5y5fQB#=Wv*u3TeB7gf&bgR6BS?Zfzv7~IiVX1e&P zqc4y^7u_{Ci{Xy7h&`^i>c z!Fk1+kn33Oer~qQL_T(n>-ZaoLh?iH7y93LGix$SSamGnStm#hv9AcSeZXC(A-7Ye z!tgO#8dZA^Mpc_YixTCB4{pIxB|+;*R!;17ih3i@68K#d#Wc_MV(?{Vg~vr_Md|V0 znxkRIy>9T_$4Fu8o+cZf@Q)kBlT|#&^s0k#O_T)RL_E78&Pp86D33F-cDmsQDA zXadjP2s!t75db2f=pKwSnhX=^S3$T-$MmWegsEoX;m&d%vl6$$q-4k$mcXzjA=3oc| zm$PBD!1`#(ASQf(Hb2|%rY4`eQ#abGy+&q9{nm(v~?-G?;nwmB!Vg|Dx%9hV-D zsw~O~9d(I|4-N5({q1Br*Lim*e#ig)DrGG-UE2!7KhSTcy3iTX>XipM9+^fY ze_{Se4~@F~%|Qkm<^JaV(5Lr9O%eG0UUp%4&S6!kjgl^<)u)Jc5l2)5cD2#o^6y% zeZX~W_x&B-FvEKW98GivKw#+Xn~MscxwkzohT&d3JCvInPbeTYBN>#1KQVWIAw@GaYkthhK* zV75yL&8gfCIt$op1RYs1sBaK@5k!TU$taXB0JqxOpH?LgEV4S<`dA@YFF@Qen*BA- z!#tV3T^imVu(#rV6U+Yb)KBc8w)FCoh~_u$=nrWyXadrc6p5lr0eknOIDMTT?_b1u zWEh(?U%KdAy*R_Y(Hi~!y%OIsd;O+n4*>&3vyk32#nr&{!)%DHQKuz?EtCuZhJ%Bo zsl4bxy=M5(4K+s&Gk5zrkm(4J#6@KVK)Bf!ZV~-C9!qev9p*5&kr0S`qSq_EdK6pP zeT~xC;%5DYH?#qq$$P0X)#HOMdWTo_FTxixF^xxY?`cw|eiih_l~E~fj`F@zDTr7k zm@W~IOHY(#HJlYGCT@R|qO81(o$_IoKJi1hl@V(aynDgUvfz}*ZQH{Mx>fEYX*wp>?Mi7) z_B`Knu-SbM8zP-H2@qgFYo*}w_d_iS>@j$O%PG)~g!&P@QrjMEqx9;bhezX7IfLA+ z#qaLaBAG%DyQRT@X%>!B+sE1%}>448mrhg4zhSW>7{A8l#P$NQC zUVM;PQpTdu!Mi>XSR;{sLfjj3+zk&4VLoWcW-Fiq6n9o2qxBnUq&}DZfvO`JRpCIM z`nbc__+l}GN}QGcvTX)q_M z6i^{C=uu4ssNjRgkhqPJmR=uky#|e1=v+cETCAX|wjp{Ul8=J^;)e*vllWlo5P8+j z(pmD8N4x4HV+^Xii9)bI`=p5HX0=mJm zs^t;z@t_SL1fZLzgsg4?fOCkqyRW!AC1GvBZeS6V>xYNA9zOg5n`w^WhHLuM2iUy3 zy~ypo`ULa8A8^tB^1>-w)=2`02Ac8E4~FcUCm|^K-3O0GT|)yJXPRni;z%@szV!fb ztWZ;cGK3kTzjiLndhHEpCId>4#g0dM$_7|(Ah6~sJ3H?QUgdds0{7>tms!0;O1muB z`2fWn49(PBcDgp#sbv*l_?MqX_@%I24-`YUjgVDrfWnv(Kpb$yvZ&DzZud2yccJ#| zL%PbCAom)FuJ{5fen(zNGU;bl*ZZ`W7|32}7YI49FO&sAsPR$L8;P(SK;=@QYE|K} z+V^P2ZbTI8@z?|X;JGS%R5RH-k8R8xSqG#E`#;qMf5#UPESy@+=nhiUu3tg*A!#3T z5GYF6pmAD=@-tX7z#_QHU~VHDAzUU#EX)B;alSssgKR4V&etA=LXH*i!dQ9Jkpc3a z9t^}&x{)l8M*e=qq)Hx?GdV!9+~VKSXrcnS-**D8GX_N43pmsJpag_5!lgmR5aeq$ z5d$n8F*6s3LiCinzL|GdmAYK?X*kN+SdGD@SHFem^1(L^7@H>g*YMbLN30mrnr^thP~r3~JS!f}I^ z0Lbi!aWLnu{L2)rOhGd@ojWE*;uX6O@=73+VaXJceZH*sf$IYv6{$sY$V^64u??17 zUTm6H@1W5S_osF^FVFs(8YgC53K*@_y31_z@lffA>sn;)s#&5O7}-P~tlk7ZP?AtN zGX7xG#@Jhe%>W`$Jwp<~sHK3=q@QJpLjM#N%0AevMW0kYI&$-qFbpFNns1j~fK>Vr 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

jI$U)@3)$g&KPRtV?yKTRW3^H)-Z(IU5f8Rdz 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 VAwU=WGy^pil%ju( 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 location: Location -+ <> designLocation: AnisotropicLocation ++ <> designLocation: SimpleLocation .... + font: Optional[Font] .... From 6a16be3e3b75b10a1ecc6da60d8d0116a46073da Mon Sep 17 00:00:00 2001 From: Jany Belluz Date: Wed, 6 Dec 2023 11:44:15 +0000 Subject: [PATCH 73/88] [designspaceLib] Fix #3369 match Python type hints to the documentation --- Lib/fontTools/designspaceLib/__init__.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Lib/fontTools/designspaceLib/__init__.py b/Lib/fontTools/designspaceLib/__init__.py index 1c71fd002..69d4912c0 100644 --- a/Lib/fontTools/designspaceLib/__init__.py +++ b/Lib/fontTools/designspaceLib/__init__.py @@ -312,7 +312,7 @@ class SourceDescriptor(SimpleDescriptor): return self.designLocation @location.setter - def location(self, location: Optional[AnisotropicLocationDict]): + def location(self, location: Optional[SimpleLocationDict]): self.designLocation = location or {} def setFamilyName(self, familyName, languageCode="en"): @@ -329,15 +329,13 @@ class SourceDescriptor(SimpleDescriptor): """ return self.localisedFamilyName.get(languageCode) - def getFullDesignLocation( - self, doc: "DesignSpaceDocument" - ) -> AnisotropicLocationDict: + def getFullDesignLocation(self, doc: "DesignSpaceDocument") -> SimpleLocationDict: """Get the complete design location of this source, from its :attr:`designLocation` and the document's axis defaults. .. versionadded:: 5.0 """ - result: AnisotropicLocationDict = {} + result: SimpleLocationDict = {} for axis in doc.axes: if axis.name in self.designLocation: result[axis.name] = self.designLocation[axis.name] From 8728789c059e3ce0f8a6aefc494090309241cf35 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 08:14:03 -0700 Subject: [PATCH 74/88] [instancer] Don't produce triples outside <-1,0,+1> Fixes https://github.com/fonttools/fonttools/issues/3350 --- Lib/fontTools/varLib/instancer/solver.py | 4 +++- Tests/varLib/instancer/instancer_test.py | 20 ++++++++++++++++---- Tests/varLib/instancer/solver_test.py | 9 ++++++--- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Lib/fontTools/varLib/instancer/solver.py b/Lib/fontTools/varLib/instancer/solver.py index 9c568fe9a..ba5231b79 100644 --- a/Lib/fontTools/varLib/instancer/solver.py +++ b/Lib/fontTools/varLib/instancer/solver.py @@ -178,7 +178,9 @@ def _solve(tent, axisLimit, negative=False): # newUpper = peak + (1 - gain) * (upper - peak) assert axisMax <= newUpper # Because outGain > gain - if newUpper <= axisDef + (axisMax - axisDef) * 2: + # Disabled because ots doesn't like us: + # https://github.com/fonttools/fonttools/issues/3350 + if False and newUpper <= axisDef + (axisMax - axisDef) * 2: upper = newUpper if not negative and axisDef + (axisMax - axisDef) * MAX_F2DOT14 < upper: # we clamp +2.0 to the max F2Dot14 (~1.99994) for convenience diff --git a/Tests/varLib/instancer/instancer_test.py b/Tests/varLib/instancer/instancer_test.py index da6dd9ee0..0ace29f71 100644 --- a/Tests/varLib/instancer/instancer_test.py +++ b/Tests/varLib/instancer/instancer_test.py @@ -1986,7 +1986,10 @@ class LimitTupleVariationAxisRangesTest: TupleVariation({"wght": (0.0, 0.5, 1.0)}, [100, 100]), "wght", 0.6, - [TupleVariation({"wght": (0.0, 0.833334, 1.666667)}, [100, 100])], + [ + TupleVariation({"wght": (0.0, 0.833334, 1.0)}, [100, 100]), + TupleVariation({"wght": (0.833334, 1.0, 1.0)}, [80, 80]), + ], ), ( TupleVariation({"wght": (0.0, 0.2, 1.0)}, [100, 100]), @@ -2001,7 +2004,10 @@ class LimitTupleVariationAxisRangesTest: TupleVariation({"wght": (0.0, 0.2, 1.0)}, [100, 100]), "wght", 0.5, - [TupleVariation({"wght": (0.0, 0.4, 1.99994)}, [100, 100])], + [ + TupleVariation({"wght": (0.0, 0.4, 1)}, [100, 100]), + TupleVariation({"wght": (0.4, 1, 1)}, [62.5, 62.5]), + ], ), ( TupleVariation({"wght": (0.5, 0.5, 1.0)}, [100, 100]), @@ -2065,7 +2071,10 @@ class LimitTupleVariationAxisRangesTest: TupleVariation({"wght": (-1.0, -0.5, 0.0)}, [100, 100]), "wght", -0.6, - [TupleVariation({"wght": (-1.666667, -0.833334, 0.0)}, [100, 100])], + [ + TupleVariation({"wght": (-1.0, -0.833334, 0.0)}, [100, 100]), + TupleVariation({"wght": (-1.0, -1.0, -0.833334)}, [80, 80]), + ], ), ( TupleVariation({"wght": (-1.0, -0.2, 0.0)}, [100, 100]), @@ -2080,7 +2089,10 @@ class LimitTupleVariationAxisRangesTest: TupleVariation({"wght": (-1.0, -0.2, 0.0)}, [100, 100]), "wght", -0.5, - [TupleVariation({"wght": (-2.0, -0.4, 0.0)}, [100, 100])], + [ + TupleVariation({"wght": (-1.0, -0.4, 0.0)}, [100, 100]), + TupleVariation({"wght": (-1.0, -1.0, -0.4)}, [62.5, 62.5]), + ], ), ( TupleVariation({"wght": (-1.0, -0.5, -0.5)}, [100, 100]), diff --git a/Tests/varLib/instancer/solver_test.py b/Tests/varLib/instancer/solver_test.py index b9acf82f8..7bcab637f 100644 --- a/Tests/varLib/instancer/solver_test.py +++ b/Tests/varLib/instancer/solver_test.py @@ -43,7 +43,8 @@ class RebaseTentTest(object): (0, 0.2, 1), (-1, 0, 0.8), [ - (1, (0, 0.25, 1.25)), + (1, (0, 0.25, 1)), + (0.25, (0.25, 1, 1)), ], ), # Case 3 boundary @@ -51,7 +52,8 @@ class RebaseTentTest(object): (0, 0.4, 1), (-1, 0, 0.5), [ - (1, (0, 0.8, 1.99994)), + (1, (0, 0.8, 1)), + (2.5 / 3, (0.8, 1, 1)), ], ), # Case 4 @@ -234,7 +236,8 @@ class RebaseTentTest(object): (0, 0.2, 1), (0, 0, 0.5), [ - (1, (0, 0.4, 1.99994)), + (1, (0, 0.4, 1)), + (0.625, (0.4, 1, 1)), ], ), # https://github.com/fonttools/fonttools/issues/3139 From 90a84d25ca2f70d395976075df114c09de46880b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 5 Dec 2023 15:09:14 -0700 Subject: [PATCH 75/88] [interpolatableTestStartingPoint] Try to rationalize the extended case Breaks all kinds of things. Going to revert. I have no idea why the existing code works so well but any touching it to make it more reasonable regresses the results :(. --- Lib/fontTools/varLib/interpolatable.py | 23 +++++- .../varLib/interpolatableTestStartingPoint.py | 78 ++++--------------- 2 files changed, 33 insertions(+), 68 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index ae2de2a19..81675052a 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -42,7 +42,9 @@ class Glyph: "controlVectors", "nodeTypes", "isomorphisms", + "isomorphismsNormalized", "points", + "pointsNormalized", "openContours", ) @@ -93,12 +95,12 @@ class Glyph: # Save a "normalized" version of the outlines try: rpen = DecomposingRecordingPen(glyphset) - tpen = TransformPen( - rpen, transform_from_stats(greenStats, inverse=True) - ) + transform = transform_from_stats(greenStats, inverse=True) + tpen = TransformPen(rpen, transform) contour.replay(tpen) self.recordingsNormalized.append(rpen) except ZeroDivisionError: + transform = Transform() self.recordingsNormalized.append(None) greenStats = StatisticsPen(glyphset=glyphset) @@ -112,6 +114,7 @@ class Glyph: assert nodeTypes[0] == "moveTo" assert nodeTypes[-1] in ("closePath", "endPath") + points = SimpleRecordingPointPen() converter = SegmentToPointPen(points, False) contour.replay(converter) @@ -120,14 +123,26 @@ class Glyph: # possible starting points. self.points.append(points.value) + pointsNormalized = SimpleRecordingPointPen() + converter = SegmentToPointPen(pointsNormalized, False) + converter = TransformPen(converter, transform) + contour.replay(converter) + self.pointsNormalized.append(pointsNormalized.value) + isomorphisms = [] self.isomorphisms.append(isomorphisms) - # Add rotations add_isomorphisms(points.value, isomorphisms, False) # Add mirrored rotations add_isomorphisms(points.value, isomorphisms, True) + isomorphisms = [] + self.isomorphismsNormalized.append(isomorphisms) + # Add rotations + add_isomorphisms(pointsNormalized.value, isomorphisms, False) + # Add mirrored rotations + add_isomorphisms(pointsNormalized.value, isomorphisms, True) + def draw(self, pen, countor_idx=None): if countor_idx is None: for contour in self.recordings: diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index a84a65184..409297a60 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -9,10 +9,6 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): m0Vectors = glyph0.greenVectors m1Vectors = [glyph1.greenVectors[i] for i in matching] - proposed_point = 0 - reverse = False - min_cost = first_cost = 1 - c0 = contour0[0] # Next few lines duplicated below. costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] @@ -21,6 +17,7 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): proposed_point = contour1[min_cost_idx][1] reverse = contour1[min_cost_idx][2] + this_tolerance = min_cost / first_cost if first_cost else 1 if min_cost < first_cost * tolerance: # c0 is the first isomorphism of the m0 master @@ -40,69 +37,22 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): # pass. num_points = len(glyph1.points[ix]) - leeway = 3 - if not reverse and ( - proposed_point <= leeway or proposed_point >= num_points - leeway - ): + leeway = num_points // 4 + if proposed_point <= leeway or proposed_point >= num_points - leeway: # Try harder + contour0 = glyph0.isomorphismsNormalized[ix] + contour1 = glyph1.isomorphismsNormalized[matching[ix]] - # Recover the covariance matrix from the GreenVectors. - # This is a 2x2 matrix. - transforms = [] - for vector in (m0Vectors[ix], m1Vectors[ix]): - meanX = vector[1] - meanY = vector[2] - stddevX = vector[3] * 0.5 - stddevY = vector[4] * 0.5 - correlation = vector[5] / abs(vector[0]) + c0 = contour0[0] + costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] + new_min_cost_idx, new_min_cost = min(enumerate(costs), key=lambda x: x[1]) + new_first_cost = costs[0] + new_this_tolerance = new_min_cost / new_first_cost if new_first_cost else 1 + if new_this_tolerance > this_tolerance: + proposed_point = contour1[new_min_cost_idx][1] + reverse = contour1[new_min_cost_idx][2] + this_tolerance = new_this_tolerance - # https://cookierobotics.com/007/ - a = stddevX * stddevX # VarianceX - c = stddevY * stddevY # VarianceY - b = correlation * stddevX * stddevY # Covariance - - delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 - lambda1 = (a + c) * 0.5 + delta # Major eigenvalue - lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue - theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) - trans = Transform() - # Don't translate here. We are working on the complex-vector - # that includes more than just the points. It's horrible what - # we are doing anyway... - # trans = trans.translate(meanX, meanY) - trans = trans.rotate(theta) - trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) - transforms.append(trans) - - trans = transforms[0] - new_c0 = ( - [complex(*trans.transformPoint((pt.real, pt.imag))) for pt in c0[0]], - ) + c0[1:] - trans = transforms[1] - new_contour1 = [] - for c1 in contour1: - new_c1 = ( - [ - complex(*trans.transformPoint((pt.real, pt.imag))) - for pt in c1[0] - ], - ) + c1[1:] - new_contour1.append(new_c1) - - # Next few lines duplicate from above. - costs = [ - vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 - ] - min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) - first_cost = costs[0] - if min_cost < first_cost * tolerance: - # Don't report this - # min_cost = first_cost - # reverse = False - # proposed_point = 0 # new_contour1[min_cost_idx][1] - pass - - this_tolerance = min_cost / first_cost if first_cost else 1 log.debug( "test-starting-point: tolerance %g", this_tolerance, From d88292b7428f5daa118600b20553c5fb02c22485 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 5 Dec 2023 15:10:19 -0700 Subject: [PATCH 76/88] Revert "[interpolatableTestStartingPoint] Try to rationalize the extended case" This reverts commit b950447e491ddf1e1a739d06711755db01ad5e4e. --- Lib/fontTools/varLib/interpolatable.py | 23 +----- .../varLib/interpolatableTestStartingPoint.py | 78 +++++++++++++++---- 2 files changed, 68 insertions(+), 33 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 81675052a..ae2de2a19 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -42,9 +42,7 @@ class Glyph: "controlVectors", "nodeTypes", "isomorphisms", - "isomorphismsNormalized", "points", - "pointsNormalized", "openContours", ) @@ -95,12 +93,12 @@ class Glyph: # Save a "normalized" version of the outlines try: rpen = DecomposingRecordingPen(glyphset) - transform = transform_from_stats(greenStats, inverse=True) - tpen = TransformPen(rpen, transform) + tpen = TransformPen( + rpen, transform_from_stats(greenStats, inverse=True) + ) contour.replay(tpen) self.recordingsNormalized.append(rpen) except ZeroDivisionError: - transform = Transform() self.recordingsNormalized.append(None) greenStats = StatisticsPen(glyphset=glyphset) @@ -114,7 +112,6 @@ class Glyph: assert nodeTypes[0] == "moveTo" assert nodeTypes[-1] in ("closePath", "endPath") - points = SimpleRecordingPointPen() converter = SegmentToPointPen(points, False) contour.replay(converter) @@ -123,26 +120,14 @@ class Glyph: # possible starting points. self.points.append(points.value) - pointsNormalized = SimpleRecordingPointPen() - converter = SegmentToPointPen(pointsNormalized, False) - converter = TransformPen(converter, transform) - contour.replay(converter) - self.pointsNormalized.append(pointsNormalized.value) - isomorphisms = [] self.isomorphisms.append(isomorphisms) + # Add rotations add_isomorphisms(points.value, isomorphisms, False) # Add mirrored rotations add_isomorphisms(points.value, isomorphisms, True) - isomorphisms = [] - self.isomorphismsNormalized.append(isomorphisms) - # Add rotations - add_isomorphisms(pointsNormalized.value, isomorphisms, False) - # Add mirrored rotations - add_isomorphisms(pointsNormalized.value, isomorphisms, True) - def draw(self, pen, countor_idx=None): if countor_idx is None: for contour in self.recordings: diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index 409297a60..a84a65184 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -9,6 +9,10 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): m0Vectors = glyph0.greenVectors m1Vectors = [glyph1.greenVectors[i] for i in matching] + proposed_point = 0 + reverse = False + min_cost = first_cost = 1 + c0 = contour0[0] # Next few lines duplicated below. costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] @@ -17,7 +21,6 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): proposed_point = contour1[min_cost_idx][1] reverse = contour1[min_cost_idx][2] - this_tolerance = min_cost / first_cost if first_cost else 1 if min_cost < first_cost * tolerance: # c0 is the first isomorphism of the m0 master @@ -37,22 +40,69 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): # pass. num_points = len(glyph1.points[ix]) - leeway = num_points // 4 - if proposed_point <= leeway or proposed_point >= num_points - leeway: + leeway = 3 + if not reverse and ( + proposed_point <= leeway or proposed_point >= num_points - leeway + ): # Try harder - contour0 = glyph0.isomorphismsNormalized[ix] - contour1 = glyph1.isomorphismsNormalized[matching[ix]] - c0 = contour0[0] - costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] - new_min_cost_idx, new_min_cost = min(enumerate(costs), key=lambda x: x[1]) - new_first_cost = costs[0] - new_this_tolerance = new_min_cost / new_first_cost if new_first_cost else 1 - if new_this_tolerance > this_tolerance: - proposed_point = contour1[new_min_cost_idx][1] - reverse = contour1[new_min_cost_idx][2] - this_tolerance = new_this_tolerance + # Recover the covariance matrix from the GreenVectors. + # This is a 2x2 matrix. + transforms = [] + for vector in (m0Vectors[ix], m1Vectors[ix]): + meanX = vector[1] + meanY = vector[2] + stddevX = vector[3] * 0.5 + stddevY = vector[4] * 0.5 + correlation = vector[5] / abs(vector[0]) + # https://cookierobotics.com/007/ + a = stddevX * stddevX # VarianceX + c = stddevY * stddevY # VarianceY + b = correlation * stddevX * stddevY # Covariance + + delta = (((a - c) * 0.5) ** 2 + b * b) ** 0.5 + lambda1 = (a + c) * 0.5 + delta # Major eigenvalue + lambda2 = (a + c) * 0.5 - delta # Minor eigenvalue + theta = atan2(lambda1 - a, b) if b != 0 else (pi * 0.5 if a < c else 0) + trans = Transform() + # Don't translate here. We are working on the complex-vector + # that includes more than just the points. It's horrible what + # we are doing anyway... + # trans = trans.translate(meanX, meanY) + trans = trans.rotate(theta) + trans = trans.scale(sqrt(lambda1), sqrt(lambda2)) + transforms.append(trans) + + trans = transforms[0] + new_c0 = ( + [complex(*trans.transformPoint((pt.real, pt.imag))) for pt in c0[0]], + ) + c0[1:] + trans = transforms[1] + new_contour1 = [] + for c1 in contour1: + new_c1 = ( + [ + complex(*trans.transformPoint((pt.real, pt.imag))) + for pt in c1[0] + ], + ) + c1[1:] + new_contour1.append(new_c1) + + # Next few lines duplicate from above. + costs = [ + vdiff_hypot2_complex(new_c0[0], new_c1[0]) for new_c1 in new_contour1 + ] + min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) + first_cost = costs[0] + if min_cost < first_cost * tolerance: + # Don't report this + # min_cost = first_cost + # reverse = False + # proposed_point = 0 # new_contour1[min_cost_idx][1] + pass + + this_tolerance = min_cost / first_cost if first_cost else 1 log.debug( "test-starting-point: tolerance %g", this_tolerance, From aceaf10b78be3949c4f255e389219e449a8794fd Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Tue, 5 Dec 2023 15:10:57 -0700 Subject: [PATCH 77/88] [interpolatableTestStartingPoint] Remove unneeded code --- Lib/fontTools/varLib/interpolatableTestStartingPoint.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py index a84a65184..e76000663 100644 --- a/Lib/fontTools/varLib/interpolatableTestStartingPoint.py +++ b/Lib/fontTools/varLib/interpolatableTestStartingPoint.py @@ -9,16 +9,11 @@ def test_starting_point(glyph0, glyph1, ix, tolerance, matching): m0Vectors = glyph0.greenVectors m1Vectors = [glyph1.greenVectors[i] for i in matching] - proposed_point = 0 - reverse = False - min_cost = first_cost = 1 - c0 = contour0[0] # Next few lines duplicated below. costs = [vdiff_hypot2_complex(c0[0], c1[0]) for c1 in contour1] min_cost_idx, min_cost = min(enumerate(costs), key=lambda x: x[1]) first_cost = costs[0] - proposed_point = contour1[min_cost_idx][1] reverse = contour1[min_cost_idx][2] From 8ad3bb53b7d9f7492420078550a6ac3529e3cb5a Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 12:38:32 -0700 Subject: [PATCH 78/88] [interpolatable] Add InterpolatableProblem --- Lib/fontTools/varLib/interpolatable.py | 53 ++++++++------- Lib/fontTools/varLib/interpolatableHelpers.py | 15 +++++ Lib/fontTools/varLib/interpolatablePlot.py | 67 ++++++++++++------- 3 files changed, 86 insertions(+), 49 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index ae2de2a19..4438d9afa 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -186,7 +186,11 @@ def test_gen( if not ignore_missing: yield ( glyph_name, - {"type": "missing", "master": name, "master_idx": master_idx}, + { + "type": InterpolatableProblem.MISSING, + "master": name, + "master_idx": master_idx, + }, ) continue @@ -198,10 +202,10 @@ def test_gen( yield ( glyph_name, { + "type": InterpolatableProblem.OPEN_PATH, "master": name, "master_idx": master_idx, "contour": ix, - "type": "open_path", }, ) if has_open: @@ -230,7 +234,7 @@ def test_gen( yield ( glyph_name, { - "type": "path_count", + "type": InterpolatableProblem.PATH_COUNT, "master_1": names[m0idx], "master_2": names[m1idx], "master_1_idx": m0idx, @@ -249,7 +253,7 @@ def test_gen( yield ( glyph_name, { - "type": "node_count", + "type": InterpolatableProblem.NODE_COUNT, "path": pathIx, "master_1": names[m0idx], "master_2": names[m1idx], @@ -265,7 +269,7 @@ def test_gen( yield ( glyph_name, { - "type": "node_incompatibility", + "type": InterpolatableProblem.NODE_INCOMPATIBILITY, "path": pathIx, "node": nodeIx, "master_1": names[m0idx], @@ -279,7 +283,7 @@ def test_gen( continue # - # "contour_order" check + # InterpolatableProblem.CONTOUR_ORDER check # this_tolerance, matching = test_contour_order(glyph0, glyph1) @@ -287,7 +291,7 @@ def test_gen( yield ( glyph_name, { - "type": "contour_order", + "type": InterpolatableProblem.CONTOUR_ORDER, "master_1": names[m0idx], "master_2": names[m1idx], "master_1_idx": m0idx, @@ -300,7 +304,7 @@ def test_gen( matchings[m1idx] = matching # - # "wrong_start_point" / weight check + # wrong-start-point / weight check # m0Isomorphisms = glyph0.isomorphisms @@ -354,7 +358,7 @@ def test_gen( yield ( glyph_name, { - "type": "wrong_start_point", + "type": InterpolatableProblem.WRONG_START_POINT, "contour": ix, "master_1": names[m0idx], "master_2": names[m1idx], @@ -400,7 +404,10 @@ def test_gen( t = tolerance**power for overweight, problem_type in enumerate( - ("underweight", "overweight") + ( + InterpolatableProblem.UNDERWEIGHT, + InterpolatableProblem.OVERWEIGHT, + ) ): if overweight: expectedSize = sqrt(size0 * size1) @@ -579,7 +586,7 @@ def test_gen( yield ( glyph_name, { - "type": "kink", + "type": InterpolatableProblem.KINK, "contour": ix, "master_1": names[m0idx], "master_2": names[m1idx], @@ -598,7 +605,7 @@ def test_gen( yield ( glyph_name, { - "type": "nothing", + "type": InterpolatableProblem.NOTHING, "master_1": names[m0idx], "master_2": names[m1idx], "master_1_idx": m0idx, @@ -947,16 +954,16 @@ def main(args=None): print(f" Masters: %s:" % ", ".join(master_names), file=f) last_master_idxs = master_idxs - if p["type"] == "missing": + if p["type"] == InterpolatableProblem.MISSING: print( " Glyph was missing in master %s" % p["master"], file=f ) - elif p["type"] == "open_path": + elif p["type"] == InterpolatableProblem.OPEN_PATH: print( " Glyph has an open path in master %s" % p["master"], file=f, ) - elif p["type"] == "path_count": + elif p["type"] == InterpolatableProblem.PATH_COUNT: print( " Path count differs: %i in %s, %i in %s" % ( @@ -967,7 +974,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "node_count": + elif p["type"] == InterpolatableProblem.NODE_COUNT: print( " Node count differs in path %i: %i in %s, %i in %s" % ( @@ -979,7 +986,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "node_incompatibility": + elif p["type"] == InterpolatableProblem.NODE_INCOMPATIBILITY: print( " Node %o incompatible in path %i: %s in %s, %s in %s" % ( @@ -992,7 +999,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "contour_order": + elif p["type"] == InterpolatableProblem.CONTOUR_ORDER: print( " Contour order differs: %s in %s, %s in %s" % ( @@ -1003,7 +1010,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "wrong_start_point": + elif p["type"] == InterpolatableProblem.WRONG_START_POINT: print( " Contour %d start point differs: %s in %s, %s in %s; reversed: %s" % ( @@ -1016,7 +1023,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "underweight": + elif p["type"] == InterpolatableProblem.UNDERWEIGHT: print( " Contour %d interpolation is underweight: %s, %s" % ( @@ -1026,7 +1033,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "overweight": + elif p["type"] == InterpolatableProblem.OVERWEIGHT: print( " Contour %d interpolation is overweight: %s, %s" % ( @@ -1036,7 +1043,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "kink": + elif p["type"] == InterpolatableProblem.KINK: print( " Contour %d has a kink at %s: %s, %s" % ( @@ -1047,7 +1054,7 @@ def main(args=None): ), file=f, ) - elif p["type"] == "nothing": + elif p["type"] == InterpolatableProblem.NOTHING: print( " Showing %s and %s" % ( diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index 513e5f740..8f3f4de5f 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -4,6 +4,7 @@ from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen from fontTools.misc.transform import Transform from collections import defaultdict, deque from math import sqrt, copysign, atan2, pi +from enum import Enum import itertools import logging @@ -11,6 +12,20 @@ import logging log = logging.getLogger("fontTools.varLib.interpolatable") +class InterpolatableProblem: + NOTHING = "nothing" + MISSING = "missing" + OPEN_PATH = "open_path" + PATH_COUNT = "path_count" + NODE_COUNT = "node_count" + NODE_INCOMPATIBILITY = "node_incompatibility" + CONTOUR_ORDER = "contour_order" + WRONG_START_POINT = "wrong_start_point" + UNDERWEIGHT = "underweight" + OVERWEIGHT = "overweight" + KINK = "kink" + + def rot_list(l, k): """Rotate list by k items forward. Ie. item at position 0 will be at position k in returned list. Negative k is allowed.""" diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index eef4a4716..e5c446a39 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -1,3 +1,4 @@ +from .interpolatableHelpers import * from fontTools.ttLib import TTFont from fontTools.pens.recordingPen import ( RecordingPen, @@ -397,7 +398,7 @@ class InterpolatablePlot: ) master_indices = [problems[0][k] for k in master_keys] - if problem_type == "missing": + if problem_type == InterpolatableProblem.MISSING: sample_glyph = next( i for i, m in enumerate(self.glyphsets) if m[glyphname] is not None ) @@ -457,12 +458,12 @@ class InterpolatablePlot: if any( pt in ( - "nothing", - "wrong_start_point", - "contour_order", - "kink", - "underweight", - "overweight", + InterpolatableProblem.NOTHING, + InterpolatableProblem.WRONG_START_POINT, + InterpolatableProblem.CONTOUR_ORDER, + InterpolatableProblem.KINK, + InterpolatableProblem.UNDERWEIGHT, + InterpolatableProblem.OVERWEIGHT, ) for pt in problem_types ): @@ -489,7 +490,12 @@ class InterpolatablePlot: + [ p for p in problems - if p["type"] in ("kink", "underweight", "overweight") + if p["type"] + in ( + InterpolatableProblem.KINK, + InterpolatableProblem.UNDERWEIGHT, + InterpolatableProblem.OVERWEIGHT, + ) ], None, x=x, @@ -502,9 +508,9 @@ class InterpolatablePlot: if any( pt in ( - "wrong_start_point", - "contour_order", - "kink", + InterpolatableProblem.WRONG_START_POINT, + InterpolatableProblem.CONTOUR_ORDER, + InterpolatableProblem.KINK, ) for pt in problem_types ): @@ -525,14 +531,14 @@ class InterpolatablePlot: glyphset2[glyphname].draw(perContourPen2) for problem in problems: - if problem["type"] == "contour_order": + if problem["type"] == InterpolatableProblem.CONTOUR_ORDER: fixed_contours = [ perContourPen2.value[i] for i in problems[0]["value_2"] ] perContourPen2.value = fixed_contours for problem in problems: - if problem["type"] == "wrong_start_point": + if problem["type"] == InterpolatableProblem.WRONG_START_POINT: # Save the wrong contours wrongContour1 = perContourPen1.value[problem["contour"]] wrongContour2 = perContourPen2.value[problem["contour"]] @@ -578,7 +584,7 @@ class InterpolatablePlot: for problem in problems: # If we have a kink, try to fix it. - if problem["type"] == "kink": + if problem["type"] == InterpolatableProblem.KINK: # Save the wrong contours wrongContour1 = perContourPen1.value[problem["contour"]] wrongContour2 = perContourPen2.value[problem["contour"]] @@ -673,11 +679,11 @@ class InterpolatablePlot: else: emoticon = self.shrug - if "underweight" in problem_types: + if InterpolatableProblem.UNDERWEIGHT in problem_types: emoticon = self.underweight - elif "overweight" in problem_types: + elif InterpolatableProblem.OVERWEIGHT in problem_types: emoticon = self.overweight - elif "nothing" in problem_types: + elif InterpolatableProblem.NOTHING in problem_types: emoticon = self.yay self.draw_emoticon(emoticon, x=x, y=y) @@ -793,7 +799,7 @@ class InterpolatablePlot: pen = CairoPen(glyphset, cr) decomposedRecording.replay(pen) - if self.fill_color and problem_type != "open_path": + if self.fill_color and problem_type != InterpolatableProblem.OPEN_PATH: cr.set_source_rgb(*self.fill_color) cr.fill_preserve() @@ -804,11 +810,17 @@ class InterpolatablePlot: cr.new_path() - if "underweight" in problem_types or "overweight" in problem_types: + if ( + InterpolatableProblem.UNDERWEIGHT in problem_types + or InterpolatableProblem.OVERWEIGHT in problem_types + ): perContourPen = PerContourOrComponentPen(RecordingPen, glyphset=glyphset) recording.replay(perContourPen) for problem in problems: - if problem["type"] in ("underweight", "overweight"): + if problem["type"] in ( + InterpolatableProblem.UNDERWEIGHT, + InterpolatableProblem.OVERWEIGHT, + ): contour = perContourPen.value[problem["contour"]] contour.replay(CairoPen(glyphset, cr)) cr.set_source_rgba(*self.weight_issue_contour_color) @@ -817,9 +829,9 @@ class InterpolatablePlot: if any( t in problem_types for t in { - "nothing", - "node_count", - "node_incompatibility", + InterpolatableProblem.NOTHING, + InterpolatableProblem.NODE_COUNT, + InterpolatableProblem.NODE_INCOMPATIBILITY, } ): cr.set_line_cap(cairo.LINE_CAP_ROUND) @@ -873,7 +885,7 @@ class InterpolatablePlot: matching = None for problem in problems: - if problem["type"] == "contour_order": + if problem["type"] == InterpolatableProblem.CONTOUR_ORDER: matching = problem["value_2"] colors = cycle(self.contour_colors) perContourPen = PerContourOrComponentPen( @@ -889,7 +901,10 @@ class InterpolatablePlot: cr.fill() for problem in problems: - if problem["type"] in ("nothing", "wrong_start_point"): + if problem["type"] in ( + InterpolatableProblem.NOTHING, + InterpolatableProblem.WRONG_START_POINT, + ): idx = problem.get("contour") # Draw suggested point @@ -967,7 +982,7 @@ class InterpolatablePlot: cr.restore() - if problem["type"] == "kink": + if problem["type"] == InterpolatableProblem.KINK: idx = problem.get("contour") perContourPen = PerContourOrComponentPen( RecordingPen, glyphset=glyphset From 1a361941795939777fc2876b00ff6fe43d49f8c0 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 12:47:06 -0700 Subject: [PATCH 79/88] [interpolatable] Sort problems by severity --- Lib/fontTools/varLib/interpolatable.py | 2 ++ Lib/fontTools/varLib/interpolatableHelpers.py | 26 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 4438d9afa..263d0f999 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -1067,6 +1067,8 @@ def main(args=None): for glyphname, problem in problems_gen: problems[glyphname].append(problem) + problems = sort_problems(problems) + if args.pdf: log.info("Writing PDF to %s", args.pdf) from .interpolatablePlot import InterpolatablePDF diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index 8f3f4de5f..b99ae063d 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -21,9 +21,33 @@ class InterpolatableProblem: NODE_INCOMPATIBILITY = "node_incompatibility" CONTOUR_ORDER = "contour_order" WRONG_START_POINT = "wrong_start_point" + KINK = "kink" UNDERWEIGHT = "underweight" OVERWEIGHT = "overweight" - KINK = "kink" + + severity = { + NOTHING: 0, + MISSING: 1, + OPEN_PATH: 2, + PATH_COUNT: 3, + NODE_COUNT: 4, + NODE_INCOMPATIBILITY: 5, + CONTOUR_ORDER: 6, + WRONG_START_POINT: 7, + KINK: 8, + UNDERWEIGHT: 9, + OVERWEIGHT: 10, + } + + +def sort_problems(problems): + """Sort problems by severity, then by glyph name, then by problem message.""" + return dict( + sorted( + problems.items(), + key=lambda _: max(InterpolatableProblem.severity[p["type"]] for p in _[1]), + ) + ) def rot_list(l, k): From c7d9da630a439f2a6db64188a68c21cbe089f4c9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 13:25:28 -0700 Subject: [PATCH 80/88] [interpolatable] Sort "nothing" at the end of the report --- Lib/fontTools/varLib/interpolatableHelpers.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index b99ae063d..aeac863c1 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -26,7 +26,6 @@ class InterpolatableProblem: OVERWEIGHT = "overweight" severity = { - NOTHING: 0, MISSING: 1, OPEN_PATH: 2, PATH_COUNT: 3, @@ -37,6 +36,7 @@ class InterpolatableProblem: KINK: 8, UNDERWEIGHT: 9, OVERWEIGHT: 10, + NOTHING: 11, } @@ -45,7 +45,15 @@ def sort_problems(problems): return dict( sorted( problems.items(), - key=lambda _: max(InterpolatableProblem.severity[p["type"]] for p in _[1]), + key=lambda _: max( + ( + InterpolatableProblem.severity[p["type"]] + for p in _[1] + if InterpolatableProblem.severity[p["type"]] + != InterpolatableProblem.severity[InterpolatableProblem.NOTHING] + ), + default=InterpolatableProblem.severity[InterpolatableProblem.NOTHING], + ), ) ) From 930047d853111b9c9d473e37d02b697af8727298 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 13:44:06 -0700 Subject: [PATCH 81/88] [interpolatable] Tweak sort order Sort by most severe problem. --- Lib/fontTools/varLib/interpolatableHelpers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index aeac863c1..b54ca8a36 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -45,7 +45,7 @@ def sort_problems(problems): return dict( sorted( problems.items(), - key=lambda _: max( + key=lambda _: -min( ( InterpolatableProblem.severity[p["type"]] for p in _[1] @@ -54,6 +54,7 @@ def sort_problems(problems): ), default=InterpolatableProblem.severity[InterpolatableProblem.NOTHING], ), + reverse=True, ) ) From dcf3f0c4b1a39c0d11ce19da7dd95d322f68795e Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 15:01:54 -0700 Subject: [PATCH 82/88] [interpolatable] Simplify sorting --- Lib/fontTools/varLib/interpolatableHelpers.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index b54ca8a36..085357f7e 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -46,13 +46,7 @@ def sort_problems(problems): sorted( problems.items(), key=lambda _: -min( - ( - InterpolatableProblem.severity[p["type"]] - for p in _[1] - if InterpolatableProblem.severity[p["type"]] - != InterpolatableProblem.severity[InterpolatableProblem.NOTHING] - ), - default=InterpolatableProblem.severity[InterpolatableProblem.NOTHING], + (InterpolatableProblem.severity[p["type"]] for p in _[1]), ), reverse=True, ) From 4f6c739181af2de9fbecc3d4a98c589ff1b0241c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Dec 2023 08:34:51 -0700 Subject: [PATCH 83/88] Move LerpGlyphSet and lerp_recordings to more prominent places Fixes https://github.com/fonttools/fonttools/issues/3361 --- Lib/fontTools/pens/recordingPen.py | 30 +++++++++ Lib/fontTools/ttLib/ttGlyphSet.py | 62 +++++++++++++++++++ Lib/fontTools/varLib/interpolatable.py | 10 ++- Lib/fontTools/varLib/interpolatableHelpers.py | 50 +-------------- Lib/fontTools/varLib/interpolatablePlot.py | 4 +- Tests/ttLib/ttGlyphSet_test.py | 48 ++++++++++++++ 6 files changed, 151 insertions(+), 53 deletions(-) diff --git a/Lib/fontTools/pens/recordingPen.py b/Lib/fontTools/pens/recordingPen.py index 2ed8d32ec..1a500f932 100644 --- a/Lib/fontTools/pens/recordingPen.py +++ b/Lib/fontTools/pens/recordingPen.py @@ -172,6 +172,36 @@ class RecordingPointPen(AbstractPointPen): drawPoints = replay +def lerp_recordings(recording1, recording2, factor=0.5): + """Linearly interpolate between two recordings. The recordings + must be decomposed, i.e. they must not contain any components. + + Factor is typically between 0 and 1. 0 means the first recording, + 1 means the second recording, and 0.5 means the average of the + two recordings. Other values are possible, and can be useful to + extrapolate. Defaults to 0.5. + + Returns the new recording. + """ + value = [] + if len(recording1) != len(recording2): + raise ValueError( + "Mismatched lengths: %d and %d" % (len(recording1), len(recording2)) + ) + for (op1, args1), (op2, args2) in zip(recording1, recording2): + if op1 != op2: + raise ValueError("Mismatched operations: %s, %s" % (op1, op2)) + if op1 == "addComponent": + raise ValueError("Cannot interpolate components") + else: + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + value.append((op1, mid_args)) + return value + + if __name__ == "__main__": pen = RecordingPen() pen.moveTo((0, 0)) diff --git a/Lib/fontTools/ttLib/ttGlyphSet.py b/Lib/fontTools/ttLib/ttGlyphSet.py index 349cc2c73..2826a621b 100644 --- a/Lib/fontTools/ttLib/ttGlyphSet.py +++ b/Lib/fontTools/ttLib/ttGlyphSet.py @@ -9,6 +9,7 @@ from fontTools.misc.fixedTools import otRound from fontTools.misc.loggingTools import deprecateFunction from fontTools.misc.transform import Transform from fontTools.pens.transformPen import TransformPen, TransformPointPen +from fontTools.pens.recordingPen import DecomposingRecordingPen class _TTGlyphSet(Mapping): @@ -321,3 +322,64 @@ def _setCoordinates(glyph, coord, glyfTable, *, recalcBounds=True): verticalAdvanceWidth, topSideBearing, ) + + +class LerpGlyphSet(Mapping): + """A glyphset that interpolates between two other glyphsets. + + Factor is typically between 0 and 1. 0 means the first glyphset, + 1 means the second glyphset, and 0.5 means the average of the + two glyphsets. Other values are possible, and can be useful to + extrapolate. Defaults to 0.5. + """ + + def __init__(self, glyphset1, glyphset2, factor=0.5): + self.glyphset1 = glyphset1 + self.glyphset2 = glyphset2 + self.factor = factor + + def __getitem__(self, glyphname): + if glyphname in self.glyphset1 and glyphname in self.glyphset2: + return LerpGlyph(glyphname, self) + raise KeyError(glyphname) + + def __contains__(self, glyphname): + return glyphname in self.glyphset1 and glyphname in self.glyphset2 + + def __iter__(self): + set1 = set(self.glyphset1) + set2 = set(self.glyphset2) + return iter(set1.intersection(set2)) + + def __len__(self): + set1 = set(self.glyphset1) + set2 = set(self.glyphset2) + return len(set1.intersection(set2)) + + +class LerpGlyph: + def __init__(self, glyphname, glyphset): + self.glyphset = glyphset + self.glyphname = glyphname + + def draw(self, pen): + recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) + self.glyphset.glyphset1[self.glyphname].draw(recording1) + recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) + self.glyphset.glyphset2[self.glyphname].draw(recording2) + + factor = self.glyphset.factor + + if len(recording1.value) != len(recording2.value): + raise ValueError( + "Mismatching number of operations: %d, %d" + % (len(recording1.value), len(recording2.value)) + ) + for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): + if op1 != op2: + raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) + mid_args = [ + (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) + for (x1, y1), (x2, y2) in zip(args1, args2) + ] + getattr(pen, op1)(*mid_args) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 263d0f999..5f658e63b 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -9,7 +9,11 @@ $ fonttools varLib.interpolatable font1 font2 ... from .interpolatableHelpers import * from .interpolatableTestContourOrder import test_contour_order from .interpolatableTestStartingPoint import test_starting_point -from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen +from fontTools.pens.recordingPen import ( + RecordingPen, + DecomposingRecordingPen, + lerp_recordings, +) from fontTools.pens.transformPen import TransformPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen from fontTools.pens.momentsPen import OpenContourError @@ -332,7 +336,9 @@ def test_gen( midRecording = [] for c0, c1 in zip(recording0, recording1): try: - midRecording.append(lerp_recordings(c0, c1)) + r = RecordingPen() + r.value = lerp_recordings(c0.value, c1.value) + midRecording.append(r) except ValueError: # Mismatch because of the reordering above midRecording.append(None) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index 085357f7e..699023168 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -1,3 +1,4 @@ +from fontTools.ttLib.ttGlyphSet import LerpGlyphSet from fontTools.pens.basePen import AbstractPen, BasePen, DecomposingPen from fontTools.pens.pointPen import AbstractPointPen, SegmentToPointPen from fontTools.pens.recordingPen import RecordingPen, DecomposingRecordingPen @@ -374,52 +375,3 @@ def transform_from_stats(stats, inverse=False): trans = trans.translate(stats.meanX, stats.meanY) return trans - - -class LerpGlyphSet: - def __init__(self, glyphset1, glyphset2, factor=0.5): - self.glyphset1 = glyphset1 - self.glyphset2 = glyphset2 - self.factor = factor - - def __getitem__(self, glyphname): - return LerpGlyph(glyphname, self) - - -class LerpGlyph: - def __init__(self, glyphname, glyphset): - self.glyphset = glyphset - self.glyphname = glyphname - - def draw(self, pen): - recording1 = DecomposingRecordingPen(self.glyphset.glyphset1) - self.glyphset.glyphset1[self.glyphname].draw(recording1) - recording2 = DecomposingRecordingPen(self.glyphset.glyphset2) - self.glyphset.glyphset2[self.glyphname].draw(recording2) - - factor = self.glyphset.factor - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - getattr(pen, op1)(*mid_args) - - -def lerp_recordings(recording1, recording2, factor=0.5): - pen = RecordingPen() - value = pen.value - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatched operations: %s, %s" % (op1, op2)) - if op1 == "addComponent": - mid_args = args1 # XXX Interpolate transformation? - else: - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - value.append((op1, mid_args)) - return pen diff --git a/Lib/fontTools/varLib/interpolatablePlot.py b/Lib/fontTools/varLib/interpolatablePlot.py index e5c446a39..4c8b5e2f6 100644 --- a/Lib/fontTools/varLib/interpolatablePlot.py +++ b/Lib/fontTools/varLib/interpolatablePlot.py @@ -1,5 +1,6 @@ from .interpolatableHelpers import * from fontTools.ttLib import TTFont +from fontTools.ttLib.ttGlyphSet import LerpGlyphSet from fontTools.pens.recordingPen import ( RecordingPen, DecomposingRecordingPen, @@ -12,10 +13,9 @@ from fontTools.pens.pointPen import ( PointToSegmentPen, ReverseContourPointPen, ) -from fontTools.varLib.interpolatable import ( +from fontTools.varLib.interpolatableHelpers import ( PerContourOrComponentPen, SimpleRecordingPointPen, - LerpGlyphSet, ) from itertools import cycle from functools import wraps diff --git a/Tests/ttLib/ttGlyphSet_test.py b/Tests/ttLib/ttGlyphSet_test.py index 56514464b..177b8a4e7 100644 --- a/Tests/ttLib/ttGlyphSet_test.py +++ b/Tests/ttLib/ttGlyphSet_test.py @@ -1,5 +1,6 @@ from fontTools.ttLib import TTFont from fontTools.ttLib import ttGlyphSet +from fontTools.ttLib.ttGlyphSet import LerpGlyphSet from fontTools.pens.recordingPen import ( RecordingPen, RecordingPointPen, @@ -164,6 +165,53 @@ class TTGlyphSetTest(object): assert actual == expected, (location, actual, expected) + @pytest.mark.parametrize( + "fontfile, locations, factor, expected", + [ + ( + "I.ttf", + ({"wght": 400}, {"wght": 1000}), + 0.5, + [ + ("moveTo", ((151.5, 0.0),)), + ("lineTo", ((458.5, 0.0),)), + ("lineTo", ((458.5, 1456.0),)), + ("lineTo", ((151.5, 1456.0),)), + ("closePath", ()), + ], + ), + ( + "I.ttf", + ({"wght": 400}, {"wght": 1000}), + 0.25, + [ + ("moveTo", ((163.25, 0.0),)), + ("lineTo", ((412.75, 0.0),)), + ("lineTo", ((412.75, 1456.0),)), + ("lineTo", ((163.25, 1456.0),)), + ("closePath", ()), + ], + ), + ], + ) + def test_lerp_glyphset(self, fontfile, locations, factor, expected): + font = TTFont(self.getpath(fontfile)) + glyphset1 = font.getGlyphSet(location=locations[0]) + glyphset2 = font.getGlyphSet(location=locations[1]) + glyphset = LerpGlyphSet(glyphset1, glyphset2, factor) + + assert "I" in glyphset + + pen = RecordingPen() + glyph = glyphset["I"] + + assert glyphset.get("foobar") is None + + glyph.draw(pen) + actual = pen.value + + assert actual == expected, (locations, actual, expected) + def test_glyphset_varComposite_components(self): font = TTFont(self.getpath("varc-ac00-ac01.ttf")) glyphset = font.getGlyphSet() From 167e0cb6467150e0e3c964e56114296348b44302 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 7 Dec 2023 04:41:54 -0700 Subject: [PATCH 84/88] [ttGlyphSet] Use lerp_recordings --- Lib/fontTools/ttLib/ttGlyphSet.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/Lib/fontTools/ttLib/ttGlyphSet.py b/Lib/fontTools/ttLib/ttGlyphSet.py index 2826a621b..495256174 100644 --- a/Lib/fontTools/ttLib/ttGlyphSet.py +++ b/Lib/fontTools/ttLib/ttGlyphSet.py @@ -9,7 +9,11 @@ from fontTools.misc.fixedTools import otRound from fontTools.misc.loggingTools import deprecateFunction from fontTools.misc.transform import Transform from fontTools.pens.transformPen import TransformPen, TransformPointPen -from fontTools.pens.recordingPen import DecomposingRecordingPen +from fontTools.pens.recordingPen import ( + DecomposingRecordingPen, + RecordingPen, + lerp_recordings, +) class _TTGlyphSet(Mapping): @@ -370,16 +374,6 @@ class LerpGlyph: factor = self.glyphset.factor - if len(recording1.value) != len(recording2.value): - raise ValueError( - "Mismatching number of operations: %d, %d" - % (len(recording1.value), len(recording2.value)) - ) - for (op1, args1), (op2, args2) in zip(recording1.value, recording2.value): - if op1 != op2: - raise ValueError("Mismatching operations: %s, %s" % (op1, op2)) - mid_args = [ - (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) - for (x1, y1), (x2, y2) in zip(args1, args2) - ] - getattr(pen, op1)(*mid_args) + lerped = RecordingPen() + lerped.value = lerp_recordings(recording1.value, recording2.value, factor) + lerped.replay(pen) From 9afac791058ed4606ecb46b7e535ea9d366d3fd9 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 7 Dec 2023 04:43:02 -0700 Subject: [PATCH 85/88] [lerp_recording] Make into a generator --- Lib/fontTools/pens/recordingPen.py | 9 ++++----- Lib/fontTools/ttLib/ttGlyphSet.py | 8 +++----- Lib/fontTools/varLib/interpolatable.py | 4 ++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Lib/fontTools/pens/recordingPen.py b/Lib/fontTools/pens/recordingPen.py index 1a500f932..e24b65265 100644 --- a/Lib/fontTools/pens/recordingPen.py +++ b/Lib/fontTools/pens/recordingPen.py @@ -8,6 +8,7 @@ __all__ = [ "RecordingPen", "DecomposingRecordingPen", "RecordingPointPen", + "lerpRecordings", ] @@ -172,7 +173,7 @@ class RecordingPointPen(AbstractPointPen): drawPoints = replay -def lerp_recordings(recording1, recording2, factor=0.5): +def lerpRecordings(recording1, recording2, factor=0.5): """Linearly interpolate between two recordings. The recordings must be decomposed, i.e. they must not contain any components. @@ -181,9 +182,8 @@ def lerp_recordings(recording1, recording2, factor=0.5): two recordings. Other values are possible, and can be useful to extrapolate. Defaults to 0.5. - Returns the new recording. + Returns a generator with the new recording. """ - value = [] if len(recording1) != len(recording2): raise ValueError( "Mismatched lengths: %d and %d" % (len(recording1), len(recording2)) @@ -198,8 +198,7 @@ def lerp_recordings(recording1, recording2, factor=0.5): (x1 + (x2 - x1) * factor, y1 + (y2 - y1) * factor) for (x1, y1), (x2, y2) in zip(args1, args2) ] - value.append((op1, mid_args)) - return value + yield (op1, mid_args) if __name__ == "__main__": diff --git a/Lib/fontTools/ttLib/ttGlyphSet.py b/Lib/fontTools/ttLib/ttGlyphSet.py index 495256174..5d188d6a1 100644 --- a/Lib/fontTools/ttLib/ttGlyphSet.py +++ b/Lib/fontTools/ttLib/ttGlyphSet.py @@ -11,8 +11,8 @@ from fontTools.misc.transform import Transform from fontTools.pens.transformPen import TransformPen, TransformPointPen from fontTools.pens.recordingPen import ( DecomposingRecordingPen, - RecordingPen, - lerp_recordings, + lerpRecordings, + replayRecording, ) @@ -374,6 +374,4 @@ class LerpGlyph: factor = self.glyphset.factor - lerped = RecordingPen() - lerped.value = lerp_recordings(recording1.value, recording2.value, factor) - lerped.replay(pen) + replayRecording(lerpRecordings(recording1.value, recording2.value, factor), pen) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 5f658e63b..9107e7038 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -12,7 +12,7 @@ from .interpolatableTestStartingPoint import test_starting_point from fontTools.pens.recordingPen import ( RecordingPen, DecomposingRecordingPen, - lerp_recordings, + lerpRecordings, ) from fontTools.pens.transformPen import TransformPen from fontTools.pens.statisticsPen import StatisticsPen, StatisticsControlPen @@ -337,7 +337,7 @@ def test_gen( for c0, c1 in zip(recording0, recording1): try: r = RecordingPen() - r.value = lerp_recordings(c0.value, c1.value) + r.value = list(lerpRecordings(c0.value, c1.value)) midRecording.append(r) except ValueError: # Mismatch because of the reordering above From e1382c1094ef336af19214dd52c5ffc4a7d56936 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 7 Dec 2023 05:57:23 -0700 Subject: [PATCH 86/88] [interpolatable] Log --- Lib/fontTools/varLib/interpolatable.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 9107e7038..775bac474 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -582,13 +582,14 @@ def test_gen( this_tolerance = t / (abs(sin_mid) * kinkiness) log.debug( - "deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g", + "kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g", deviation, deviation_ratio, sin_mid, r_diff, ) log.debug("tolerance %g", this_tolerance) + continue yield ( glyph_name, { From 141b155353fa7b5296c3e34786946b0d1f02a850 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 7 Dec 2023 05:58:48 -0700 Subject: [PATCH 87/88] [interpolatable] Undo unintentional change I'm sorry. I'll go work on a branch again. --- Lib/fontTools/varLib/interpolatable.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatable.py b/Lib/fontTools/varLib/interpolatable.py index 775bac474..49ab1a8d8 100644 --- a/Lib/fontTools/varLib/interpolatable.py +++ b/Lib/fontTools/varLib/interpolatable.py @@ -589,7 +589,6 @@ def test_gen( r_diff, ) log.debug("tolerance %g", this_tolerance) - continue yield ( glyph_name, { From 3ecbc94dcf6b48e3e0f72ae8341cbbe6ab571b60 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 7 Dec 2023 06:10:10 -0700 Subject: [PATCH 88/88] [interpolatable] Sort issues by tolerance as well --- Lib/fontTools/varLib/interpolatableHelpers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/fontTools/varLib/interpolatableHelpers.py b/Lib/fontTools/varLib/interpolatableHelpers.py index 699023168..2a3540fff 100644 --- a/Lib/fontTools/varLib/interpolatableHelpers.py +++ b/Lib/fontTools/varLib/interpolatableHelpers.py @@ -47,7 +47,10 @@ def sort_problems(problems): sorted( problems.items(), key=lambda _: -min( - (InterpolatableProblem.severity[p["type"]] for p in _[1]), + ( + (InterpolatableProblem.severity[p["type"]] + p.get("tolerance", 0)) + for p in _[1] + ), ), reverse=True, )