From 9116ad8ac2898d681a6fabef4355705951bb0ae9 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 2 Jan 2024 23:38:40 -0500 Subject: [PATCH] Doing my best here --- py/hexagram/path.py | 65 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/py/hexagram/path.py b/py/hexagram/path.py index 3a25265..68cb610 100644 --- a/py/hexagram/path.py +++ b/py/hexagram/path.py @@ -65,7 +65,7 @@ class Path(): return (c >= ord('0') and c <= ord('9')) @staticmethod - def parse(text: str) -> Path: + def parse(text: str): commands = list() command = PathCommand() state = State.NONE @@ -152,6 +152,14 @@ class Path(): return cr.line_to(x, y + y2) + def quad_to_cube(self, cr: cairo.Context, x1: float, y1: float, x2: float, y2: float): + x0, y0 = cr.get_current_point() + + return (2 / 3 * x1 + 1 / 3 * x0, + 2 / 3 * y1 + 1 / 3 * y0, + 2 / 3 * x1 + 1 / 3 * x2, + 2 / 3 * y1 + 1 / 3 * y2) + def draw(self, cr: cairo.Context): last = None @@ -161,21 +169,21 @@ class Path(): if command == 'M': for i in range(0, len(args), 2): if i == 0: - cr.move_to(args[i], args[i+1]) + cr.move_to(*args[i:i+2]) else: - cr.line_to(args[i], args[i+1]) + cr.line_to(*args[i:i+2]) elif command == 'm': for i in range(0, len(args), 2): if i == 0: - cr.rel_move_to(args[i], args[i+1]) + cr.rel_move_to(*args[i:i+2]) else: - cr.rel_line_to(args[i], args[i+1]) + cr.rel_line_to(*args[i:i+2]) elif command == 'L': for i in range(0, len(args), 2): - cr.line_to(args[i], args[i+1]) + cr.line_to(*args[i:i+2]) elif command == 'l': for i in range(0, len(args), 2): - cr.rel_line_to(args[i], args[i+1]) + cr.rel_line_to(*args[i:i+2]) elif command == 'H': for arg in args: self.horiz_to(cr, arg) @@ -189,12 +197,45 @@ class Path(): for arg in args: self.rel_vert_to(cr, arg) elif command == 'C': - for arg in args: - cr.curve_to(*arg) + for i in range(0, len(args), 6): + cr.curve_to(*args[i:i+6]) elif command == 'c': - for arg in args: - cr.rel_curve_to(*arg) + for i in range(0, len(args), 6): + cr.rel_curve_to(*args[i:i+6]) + elif command == 'S' or command == 's': + for i in range(0, len(args), 4): + x2, y2, x, y = args[i:i+4] + + if last[0] == 'C' or last[0] == 'c': + x1, y1 = last[1][2:4] + elif last[0] == 'S' or last[0] == 's': + raise NotImplementedError + else: + x1, y1 = cr.get_current_point() + + if command == 'S': + cr.curve_to(x1, y1, x2, y2, x, y) + elif command == 's': + cr.curve_to(x1, y1, x2, y2, x, y) + elif command == 'Q' or command == 'q': + for i in range(0, len(args), 4): + x1, y1, x2, y2 = args[i:i+4] + cube = self.quad_to_cube(cr, x1, y1, x2, y2) + + if command == 'Q': + cr.curve_to(*cube) + elif command == 'q': + cr.rel_curve_to(*cube) + elif command == 'T' or command == 't': + for i in range(0, len(args), 2): + x, y = args[i:i+2] + + if last[0] == 'Q' or last[0] == 'q': + x1, y1 = last[1][0:2] + elif last[0] == 'T' or last[0] == 't': + raise NotImplementedError + elif command == 'Z' or command == 'z': cr.close_path() - last = command + last = item