Пример #1
0
def _quadratic_callback(max_err, subpath_start, curr_xy, cmd, args, prev_xy,
                        prev_cmd, prev_args):
    if cmd.upper() == "M":
        return ((cmd, args), )

    # Convert to quadratic if needed
    if cmd.upper() == "Z":
        # a line back to subpath start ... unless we are there already
        if curr_xy == subpath_start:
            return ()
        cmd = "L"
        args = subpath_start

    if cmd == "L":
        # line from curr_xy to args
        assert len(args) == 2
        end_xy = args

        # quad ctl point 1/2 along
        cmd = "Q"
        args = (
            *line_pos(0.5, curr_xy, end_xy),
            *end_xy,
        )

    if cmd == "C":
        cubic_points = [curr_xy] + [
            tuple(args[i:i + 2]) for i in range(0, len(args), 2)
        ]
        quad_points = cubic_to_quad(cubic_points, max_err)
        quad_segments = []
        for (control_pt, end_pt) in pathops.decompose_quadratic_segment(
                tuple(quad_points[1:])):
            quad_segments.append(("Q", (*control_pt, *end_pt)))
        return tuple(quad_segments)

    if cmd != "Q":
        raise ValueError(f"How do you quad {cmd}, {args}")

    assert len(args) == 4

    return (("Q", args), )
Пример #2
0
def _qcurveto_to_svg(points) -> SVGCommandGen:
    for (control_pt, end_pt) in pathops.decompose_quadratic_segment(points):
        yield ("Q", control_pt + end_pt)
Пример #3
0
 def qCurveTo(self, *points):
     # handle TrueType quadratic splines with implicit on-curve mid-points
     for (control_pt,
          end_pt) in pathops.decompose_quadratic_segment(points):
         self.path.Q(*control_pt, *end_pt)