From 6ff6255ed77e6c2a7a64d5dcffe68f5b802ab7c7 Mon Sep 17 00:00:00 2001
From: user <user@user-ThinkPad-X60.(none)>
Date: Mon, 4 May 2015 22:33:15 -0400
Subject: [PATCH] refactoring [draw] methods, fixing stray [draw] bugs

---
 pd/src/g_template.c | 248 ++++++++++++++------------------------------
 1 file changed, 79 insertions(+), 169 deletions(-)

diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index 6f91d44ef..93cfc641e 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1093,6 +1093,7 @@ typedef struct _svg
     t_svg_attr x_strokedashoffset;
     t_svg_event x_events;
     t_fielddesc x_drag; /* convenience event, not part of the svg spec */
+    t_svg_attr x_opacity;
     t_svg_attr x_pointerevents;
     t_svg_attr x_strokelinecap;
     t_svg_attr x_strokelinejoin;
@@ -1541,6 +1542,10 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             canvas_tag(glist_getcanvas(c)), tag, "fill-rule", (int)fielddesc_getcoord(
                 &x->x_fillrule.a_attr, template, data, 1) ?
                     "evenodd" : "nonzero");
+    else if (s == gensym("opacity"))
+        gui_vmess("gui_draw_configure", "sssf",
+            canvas_tag(glist_getcanvas(c)), tag, "opacity",
+                fielddesc_getcoord(&x->x_opacity.a_attr, template, data, 1));
     else if (s == gensym("pointer-events"))
         *predraw_bbox = 1;
     else if (s == gensym("stroke-linecap"))
@@ -1750,8 +1755,13 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
     }
     else if (s == gensym("points"))
     {
-        sys_vgui(".x%lx.c coords .draw%lx.%lx \\\n",
-            glist_getcanvas(c), parent, data);
+        char tagbuf[MAXPDSTRING];
+        sprintf(tagbuf, "draw%lx.%lx", parent, data);
+        //sys_vgui(".x%lx.c coords .draw%lx.%lx \\\n",
+        //    glist_getcanvas(c), parent, data);
+        gui_start_vmess("gui_draw_coords", "sss",
+            canvas_tag(glist_getcanvas(c)), tagbuf, x->x_type->s_name);
+        gui_start_array();
         /* let's turn off bbox caching so we can recalculate the bbox */
         if (x->x_pathrect_cache != -1)
            x->x_pathrect_cache = 0;
@@ -1768,11 +1778,17 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             {
                 w = xval + (fielddesc_getcoord(f+2, template, data, 1));
                 h = yval + (fielddesc_getcoord(f+3, template, data, 1));
-                sys_vgui("%g %g %g %g\\\n", xval, yval, w, h);
+                gui_f(xval);
+                gui_f(yval);
+                gui_f(w);
+                gui_f(h);
+                //sys_vgui("%g %g %g %g\\\n", xval, yval, w, h);
             }
             else
             {
-                sys_vgui("%g %g\\\n", xval, yval);
+                //sys_vgui("%g %g\\\n", xval, yval);
+                gui_f(xval);
+                gui_f(yval);
             }
         }
         else
@@ -1780,11 +1796,14 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             int n = (x->x_type == gensym("circle")) ? 2 : x->x_nargs;
             for (i = 0; i < n; i++)
             {
-                sys_vgui("%g\\\n", fielddesc_getcoord(
-                    f+i, template, data, 1));
+                //sys_vgui("%g\\\n", fielddesc_getcoord(
+                //    f+i, template, data, 1));
+                gui_f(fielddesc_getcoord(f+i, template, data, 1));
             }
         }
-        sys_gui("\n");
+        //sys_gui("\n");
+        gui_end_array();
+        gui_end_vmess();
     }
 }
 
@@ -1899,6 +1918,43 @@ void svg_update(t_svg *x, t_symbol *s)
         svg_doupdate(x, c, s);
 }
 
+t_svg_attr *svg_getattr(t_svg *x, t_symbol *s)
+{
+    if (s == gensym("fill-opacity")) return &x->x_fillopacity;
+    else if (s == gensym("fill-rule")) return &x->x_fillrule;
+    else if (s == gensym("opacity")) return &x->x_opacity;
+    else if (s == gensym("pointer-events")) return &x->x_pointerevents;
+    else if (s == gensym("rx")) return &x->x_rx;
+    else if (s == gensym("ry")) return &x->x_ry;
+    else if (s == gensym("stroke-opacity")) return &x->x_strokeopacity;
+    else if (s == gensym("stroke-dashoffset")) return &x->x_strokedashoffset;
+    else if (s == gensym("stroke-linecap")) return &x->x_strokelinecap;
+    else if (s == gensym("stroke-linejoin")) return &x->x_strokelinejoin;
+    else if (s == gensym("stroke-miterlimit")) return &x->x_strokemiterlimit;
+    else if (s == gensym("stroke-width")) return &x->x_strokewidth;
+    else if (s == gensym("vis")) return &x->x_vis;
+    else return 0;
+}
+
+void svg_setattr(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
+{
+    t_svg_attr *attr = svg_getattr(x, s);
+    if (!attr)
+    {
+        pd_error(x, "draw: can't find attribute %s", s->s_name);
+        return;
+    }
+    if (argc < 1)
+        attr->a_flag = 0;
+    else if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
+    {
+        fielddesc_setfloatarg(&attr->a_attr, argc, argv);
+        attr->a_flag = 1;
+        svg_update(x, s);
+    }
+}
+
+
 void svg_vis(t_svg *x, t_symbol *s, int argc, t_atom *argv)
 {
     if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
@@ -1985,38 +2041,6 @@ void svg_data(t_svg *x, t_symbol *s, int argc, t_atom *argv)
     svg_update(x, s);
 }
 
-void svg_fillopacity(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        /* the svg_attr stuff should probably be set with a function */
-        fielddesc_setfloatarg(&x->x_fillopacity.a_attr, argc, argv);
-        x->x_fillopacity.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokeopacity(t_svg *x, t_symbol *s,
-    t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokeopacity.a_attr, argc, argv);
-        x->x_strokeopacity.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokedashoffset(t_svg *x, t_symbol *s, int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokedashoffset.a_attr, argc, argv);
-        x->x_strokedashoffset.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
 void svg_strokedasharray(t_svg *x, t_symbol *s,
     int argc, t_atom *argv)
 {
@@ -2067,7 +2091,7 @@ void svg_fill(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
         }
         if (argc && (argv->a_type == A_FLOAT || argv->a_type == A_SYMBOL))
         {
-            svg_fillopacity(x, gensym("fill-opacity"), argc, argv);
+            svg_setattr(x, gensym("fill-opacity"), argc, argv);
         }
     }
     svg_update(x, s);
@@ -2109,7 +2133,7 @@ void svg_stroke(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
         }
         if (argc && (argv->a_type == A_FLOAT || argv->a_type == A_SYMBOL))
         {
-            svg_strokeopacity(x, s, argc, argv);
+            svg_setattr(x, gensym("stroke-opacity"), argc, argv);
             return;
         }
     }
@@ -2152,70 +2176,6 @@ void svg_event(t_svg *x, t_symbol *s, int argc, t_atom *argv)
     }
 }
 
-void svg_pointerevents(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
-{
-    if (argc < 1)
-        x->x_pointerevents.a_flag = 0;
-    else if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_pointerevents.a_attr, argc, argv);
-        x->x_pointerevents.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokelinecap(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokelinecap.a_attr, argc, argv);
-        x->x_strokelinecap.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokelinejoin(t_svg *x, t_symbol *s,
-    t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokelinejoin.a_attr, argc, argv);
-        x->x_strokelinejoin.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokemiterlimit(t_svg *x, t_symbol *s,
-    t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokemiterlimit.a_attr, argc, argv);
-        x->x_strokemiterlimit.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_strokewidth(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_strokewidth.a_attr, argc, argv);
-        x->x_strokewidth.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
-void svg_fillrule(t_svg *x, t_symbol *s, t_int argc, t_atom *argv)
-{
-    if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-    {
-        fielddesc_setfloatarg(&x->x_fillrule.a_attr, argc, argv);
-        x->x_fillrule.a_flag = 1;
-        svg_update(x, s);
-    }
-}
-
 void svg_r(t_svg *x, t_symbol *s, int argc, t_atom *argv)
 {
     if (x->x_type != gensym("circle"))
@@ -2231,58 +2191,6 @@ void svg_r(t_svg *x, t_symbol *s, int argc, t_atom *argv)
     }
 }
 
-void svg_rx(t_svg *x, t_symbol *s, int argc, t_atom *argv)
-{
-    t_symbol *type = x->x_type;
-    if (type == gensym("rect") || type == gensym("ellipse"))
-    {
-        if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-        {
-            if (type == gensym("rect"))
-            {
-                fielddesc_setfloatarg(&x->x_rx.a_attr, argc, argv);
-                x->x_rx.a_flag = 1;
-            }
-            else
-            {
-                fielddesc_setfloatarg(x->x_vec+2, argc, argv);
-            }
-            svg_update(x, s);
-        }
-    }
-    else
-    {
-        pd_error(x, "draw: %s: no method for 'rx'", x->x_type->s_name);
-        return;
-    }
-}
-
-void svg_ry(t_svg *x, t_symbol *s, int argc, t_atom *argv)
-{
-    t_symbol *type = x->x_type;
-    if (type == gensym("rect") || type == gensym("ellipse"))
-    {
-        if (argv[0].a_type == A_FLOAT || argv[0].a_type == A_SYMBOL)
-        {
-            if (type == gensym("rect"))
-            {
-                fielddesc_setfloatarg(&x->x_ry.a_attr, argc, argv);
-                x->x_rx.a_flag = 1;
-            }
-            else
-            {
-                fielddesc_setfloatarg(x->x_vec+3, argc, argv);
-            }
-            svg_update(x, s);
-        }
-    }
-    else
-    {
-        pd_error(x, "draw: %s: no method for 'ry'", x->x_type->s_name);
-        return;
-    }
-}
-
 /* The svg spec actually says that the rect shouldn't be rendered if
    height or width = 0. Current behavior is to draw a straight line,
    and only fail to draw if both are 0. Also, svg spec says to handle
@@ -4312,43 +4220,45 @@ static void draw_setup(void)
         gensym("drag"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_fill,
         gensym("fill"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_fillopacity,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("fill-opacity"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_fillrule,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("fill-rule"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_rectpoints,
         gensym("height"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_event,
         gensym("mousedown"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_pointerevents,
+    class_addmethod(svg_class, (t_method)svg_setattr,
+        gensym("opacity"), A_GIMME, 0);
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("pointer-events"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_data,
         gensym("points"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_r,
         gensym("r"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_rx,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("rx"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_ry,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("ry"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_stroke,
         gensym("stroke"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_strokedasharray,
         gensym("stroke-dasharray"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokeopacity,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-opacity"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokedashoffset,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-dashoffset"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokelinecap,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-linecap"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokelinejoin,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-linejoin"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokemiterlimit,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-miterlimit"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_strokewidth,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("stroke-width"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_transform,
         gensym("transform"), A_GIMME, 0);
-    class_addmethod(svg_class, (t_method)svg_vis,
+    class_addmethod(svg_class, (t_method)svg_setattr,
         gensym("vis"), A_GIMME, 0);
     class_addmethod(svg_class, (t_method)svg_rectpoints,
         gensym("width"), A_GIMME, 0);
-- 
GitLab