From 25e74291fbea66e36698a355937c231934351ef9 Mon Sep 17 00:00:00 2001 From: user <user@user-ThinkPad-X60.(none)> Date: Mon, 4 May 2015 00:54:26 -0400 Subject: [PATCH] added stroke-dashoffset method for [draw], fixed some format specifiers --- pd/nw/todo.txt | 1 + pd/src/g_template.c | 190 +++++++++++++------------------------------- 2 files changed, 55 insertions(+), 136 deletions(-) diff --git a/pd/nw/todo.txt b/pd/nw/todo.txt index ace3b1b8d..7c705eeeb 100644 --- a/pd/nw/todo.txt +++ b/pd/nw/todo.txt @@ -142,6 +142,7 @@ Everything else: (A [*] means we've fixed it) [ ] getting the sense that glist_isselected should _always_ have glist_getcanvas(x) as its first parameter [x] get rid of the old tcl specific sys_get_audio_apis +[ ] have a single function to set t_svg_attr Crashers -------- diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 0ffd8ad67..0d185aa5d 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -1090,6 +1090,7 @@ typedef struct _svg int x_stroketype; int x_ndash; t_fielddesc *x_strokedasharray; /* array of lengths */ + 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_pointerevents; @@ -1313,6 +1314,7 @@ void *svg_new(t_pd *parent, t_symbol *s, int argc, t_atom *argv) x->x_strokedasharray = (t_fielddesc *)t_getbytes(x->x_ndash * sizeof(t_fielddesc)); x->x_transform_n = 0; + x->x_strokedashoffset.a_flag = 0; x->x_transform = (t_fielddesc *)t_getbytes(x->x_transform_n * sizeof(t_fielddesc)); /* initialize events */ @@ -1570,9 +1572,17 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s, //sys_vgui(".x%lx.c itemconfigure %s -strokeopacity %g\n", // glist_getcanvas(c), tag, fielddesc_getcoord( // &x->x_strokeopacity.a_attr, template, data, 1)); - gui_vmess("gui_draw_configure", "sssg", + gui_vmess("gui_draw_configure", "sssf", canvas_tag(glist_getcanvas(c)), tag, "stroke-opacity", fielddesc_getcoord( &x->x_strokeopacity.a_attr, template, data, 1)); + else if (s == gensym("stroke-dashoffset")) + //sys_vgui(".x%lx.c itemconfigure %s -strokeopacity %g\n", + // glist_getcanvas(c), tag, fielddesc_getcoord( + // &x->x_strokeopacity.a_attr, template, data, 1)); + gui_vmess("gui_draw_configure", "sssf", + canvas_tag(glist_getcanvas(c)), tag, "stroke-dashoffset", + fielddesc_getcoord( + &x->x_strokedashoffset.a_attr, template, data, 1)); else if (s == gensym("stroke-width")) { //sys_vgui(".x%lx.c itemconfigure %s -strokewidth %g\n", @@ -1997,6 +2007,16 @@ void svg_strokeopacity(t_svg *x, t_symbol *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) { @@ -3499,117 +3519,59 @@ static void draw_activate(t_gobj *z, t_glist *glist, static void svg_togui(t_svg *x, t_template *template, t_word *data) { - // Hack to send parameter as an object to the GUI. Not sure yet if + // Hack to send parameters to the GUI. Not sure yet if // we want to generalize that... - //sys_gui(",{ "); gui_start_array(); - if (x->x_type != gensym("line")) + if (x->x_filltype) { - if (x->x_filltype) + t_fielddesc *fd = x->x_fill; + if (x->x_filltype == 1) { - t_fielddesc *fd = x->x_fill; - if (x->x_filltype == 1) - { - t_symbol *f = fielddesc_getsymbol(fd, template, data, 1); - //sys_vgui("-fill %s ", f->s_name); - //sys_vgui("fill: '%s',", f->s_name); - gui_s("fill"); - gui_s(f->s_name); - } - else if (x->x_filltype == 2) - { - //sys_vgui("-fill %s ", rgb_to_hex( - // (int)fielddesc_getfloat(fd, - // template, data, 1), - // (int)fielddesc_getfloat(fd+1, - // template, data, 1), - // (int)fielddesc_getfloat(fd+2, - // template, data, 1))); - - //sys_vgui("fill: '%s',", rgb_to_hex( - // (int)fielddesc_getfloat(fd, - // template, data, 1), - // (int)fielddesc_getfloat(fd+1, - // template, data, 1), - // (int)fielddesc_getfloat(fd+2, - // template, data, 1))); - gui_s("fill"); - gui_s(rgb_to_hex( - (int)fielddesc_getfloat(fd, - template, data, 1), - (int)fielddesc_getfloat(fd+1, - template, data, 1), - (int)fielddesc_getfloat(fd+2, - template, data, 1))); - } + t_symbol *f = fielddesc_getsymbol(fd, template, data, 1); + gui_s("fill"); + gui_s(f->s_name); } - if (x->x_fillopacity.a_flag) - { - //sys_vgui("-fillopacity %g ", - // fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); - //sys_vgui("fill-opacity: %g,", - // fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); - gui_s("fill-opacity"); - gui_f(fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); - } - if (x->x_fillrule.a_flag) - { - //sys_vgui("-fillrule %s ", (int)fielddesc_getfloat( - // &x->x_fillrule.a_attr, template, data, 1) ? - // "evenodd" : "nonzero"); - //sys_vgui("'fill-rule': '%s',", (int)fielddesc_getfloat( - // &x->x_fillrule.a_attr, template, data, 1) ? - // "evenodd" : "nonzero"); - gui_s("fill-rule"); - gui_s((int)fielddesc_getfloat( - &x->x_fillrule.a_attr, template, data, 1) ? - "evenodd" : "nonzero"); + else if (x->x_filltype == 2) + { + gui_s("fill"); + gui_s(rgb_to_hex( + (int)fielddesc_getfloat(fd, template, data, 1), + (int)fielddesc_getfloat(fd+1, template, data, 1), + (int)fielddesc_getfloat(fd+2, template, data, 1))); } } + if (x->x_fillopacity.a_flag) + { + gui_s("fill-opacity"); + gui_f(fielddesc_getfloat(&x->x_fillopacity.a_attr, template, data, 1)); + } + if (x->x_fillrule.a_flag) + { + gui_s("fill-rule"); + gui_s((int)fielddesc_getfloat( + &x->x_fillrule.a_attr, template, data, 1) ? + "evenodd" : "nonzero"); + } if (x->x_stroketype) { t_fielddesc *fd = x->x_stroke; if (x->x_stroketype == 1) { t_symbol *s = fielddesc_getsymbol(fd, template, data, 1); - //sys_vgui("-stroke %s ", s->s_name); - //sys_vgui("stroke: '%s',", s->s_name); gui_s("stroke"); gui_s(s->s_name); } else if (x->x_stroketype == 2) { - //sys_vgui("-stroke %s ", rgb_to_hex( - // (int)fielddesc_getfloat(fd, - // template, data, 1), - // (int)fielddesc_getfloat(fd+1, - // template, data, 1), - // (int)fielddesc_getfloat(fd+2, - // template, data, 1))); - //sys_vgui("stroke: '%s',", rgb_to_hex( - // (int)fielddesc_getfloat(fd, - // template, data, 1), - // (int)fielddesc_getfloat(fd+1, - // template, data, 1), - // (int)fielddesc_getfloat(fd+2, - // template, data, 1))); - gui_s("stroke"); gui_s(rgb_to_hex( - (int)fielddesc_getfloat(fd, - template, data, 1), - (int)fielddesc_getfloat(fd+1, - template, data, 1), - (int)fielddesc_getfloat(fd+2, - template, data, 1))); + (int)fielddesc_getfloat(fd, template, data, 1), + (int)fielddesc_getfloat(fd+1, template, data, 1), + (int)fielddesc_getfloat(fd+2, template, data, 1))); } } if (x->x_strokewidth.a_flag) { - //sys_vgui("-strokewidth %g\\\n", - // fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); - //sys_vgui("stroke-width: %g,", - // fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); gui_s("stroke-width"); gui_f(fielddesc_getfloat(&x->x_strokewidth.a_attr, template, data, 1)); } @@ -3623,23 +3585,11 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) } if (x->x_strokeopacity.a_flag) { - //sys_vgui("-strokeopacity %g ", - // fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); - //sys_vgui("'stroke-opacity': %g,", - // fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); - gui_s("stroke-opacity"); gui_f(fielddesc_getfloat(&x->x_strokeopacity.a_attr, template, data, 1)); } if (x->x_strokelinecap.a_flag) { - //sys_vgui("-strokelinecap %s ", get_strokelinecap( - // (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, - // template, data, 1))); - //sys_vgui("'stroke-linecap': '%s',", get_strokelinecap( - // (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, - // template, data, 1))); - gui_s("stroke-linecap"); gui_s(get_strokelinecap( (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr, @@ -3647,13 +3597,6 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) } if (x->x_strokelinejoin.a_flag) { - //sys_vgui("-strokelinejoin %s ", get_strokelinejoin( - // (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, - //template, data, 1))); - //sys_vgui("'stroke-linejoin': '%s',", get_strokelinejoin( - // (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, - //template, data, 1))); - gui_s("stroke-linejoin"); gui_s(get_strokelinejoin( (int)fielddesc_getfloat(&x->x_strokelinejoin.a_attr, @@ -3661,12 +3604,6 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) } if (x->x_strokemiterlimit.a_flag) { - //sys_vgui("-strokemiterlimit %g ", - // fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, - // template, data, 1)); - //sys_vgui("'stroke-miterlimit': %g,", - // fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, - // template, data, 1)); gui_s("stroke-miterlimit"); gui_f(fielddesc_getfloat(&x->x_strokemiterlimit.a_attr, template, data, 1)); @@ -3675,20 +3612,13 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) { int i; t_fielddesc *fd; - // inner array... - //sys_gui(" -strokedasharray {\\\n"); - //sys_gui("'stroke-dasharray': \""); gui_s("stroke-dasharray"); gui_start_array(); for (i = 0, fd = x->x_strokedasharray; i < x->x_ndash; i++) { // Should this be a float? - //sys_vgui("%d ", (int)fielddesc_getfloat(fd+i, - //template, data, 1)); - gui_i((int)fielddesc_getfloat(fd+i, - template, data, 1)); + gui_f(fielddesc_getfloat(fd+i, template, data, 1)); } - //sys_gui("\","); gui_end_array(); } if (x->x_transform_n > 0) @@ -3697,8 +3627,6 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) t_float m1, m2, m3, m4, m5, m6; svg_parsetransform(x, template, data, &m1, &m2, &m3, &m4, &m5, &m6); - //sys_vgui("-matrix { {%g %g} {%g %g} {%g %g} }\\\n", - // m1, m2, m3, m4, m5, m6); gui_s("transform"); char transbuf[MAXPDSTRING]; sprintf(transbuf, "matrix(%g,%g,%g,%g,%g,%g)", @@ -3707,37 +3635,25 @@ static void svg_togui(t_svg *x, t_template *template, t_word *data) } if (x->x_vis.a_flag) { - //sys_vgui("-state %s ", fielddesc_getfloat(&x->x_vis.a_attr, - // template, data, 1) ? "normal" : "hidden"); - //sys_vgui("visibility: '%s',", fielddesc_getfloat(&x->x_vis.a_attr, - // template, data, 1) ? "visible" : "hidden"); gui_s("visibility"); gui_s(fielddesc_getfloat(&x->x_vis.a_attr, template, data, 1) ? "visible" : "hidden"); } if (x->x_rx.a_flag) { - //sys_vgui("-rx %d ", (int)fielddesc_getfloat(&x->x_rx.a_attr, - // template, data, 1)); - //sys_vgui("rx: %d,", (int)fielddesc_getfloat(&x->x_rx.a_attr, - // template, data, 1)); gui_s("rx"); gui_i((int)fielddesc_getfloat(&x->x_rx.a_attr, template, data, 1)); } if (x->x_ry.a_flag) { - //sys_vgui("-ry %d ", (int)fielddesc_getfloat(&x->x_ry.a_attr, - // template, data, 1)); - //sys_vgui("ry: %d,", (int)fielddesc_getfloat(&x->x_ry.a_attr, - // template, data, 1)); gui_s("ry"); gui_f((int)fielddesc_getfloat(&x->x_ry.a_attr, template, data, 1)); } + // Not sure why display attr is here... gui_s("display"); gui_s("inline"); - //sys_gui("display: 'inline'},"); gui_end_array(); } @@ -4420,6 +4336,8 @@ static void draw_setup(void) gensym("stroke-dasharray"), A_GIMME, 0); class_addmethod(svg_class, (t_method)svg_strokeopacity, gensym("stroke-opacity"), A_GIMME, 0); + class_addmethod(svg_class, (t_method)svg_strokedashoffset, + gensym("stroke-dashoffset"), A_GIMME, 0); class_addmethod(svg_class, (t_method)svg_strokelinecap, gensym("stroke-linecap"), A_GIMME, 0); class_addmethod(svg_class, (t_method)svg_strokelinejoin, -- GitLab