Commit d98d82b5 authored by pokergaming's avatar pokergaming
Browse files

fixed some regressions with [struct] validity checks

keep [drawsymbol] and [drawnumber] from flipping with negative gop scaling
default to black fill and no stroke, per svg spec
merged transform gui updates with other attributes
fixed tags so that array elements display properly
parent f101ebf6
......@@ -458,6 +458,36 @@ static void canvas_addtemplatesforscalar(t_symbol *templatesym,
}
}
static void canvas_addtemplatesforstruct(t_template *template,
int *p_ntemplates, t_symbol ***p_templatevec)
{
t_dataslot *ds;
int i;
canvas_doaddtemplate(template->t_sym, p_ntemplates, p_templatevec);
if (!template)
bug("canvas_addtemplatesforscalar");
else for (ds = template->t_vec, i = template->t_n; i--; ds++)
{
if (ds->ds_type == DT_ARRAY)
{
t_symbol *arraytemplatesym = ds->ds_arraytemplate;
t_template *arraytemplate = template_findbyname(arraytemplatesym);
if (arraytemplate)
{
canvas_doaddtemplate(arraytemplatesym, p_ntemplates,
p_templatevec);
canvas_addtemplatesforstruct(arraytemplate,
p_ntemplates, p_templatevec);
}
}
/* not sure about this part-- all the sublist datatype seems
to do is crash */
//else if (ds->ds_type == DT_LIST)
// canvas_addtemplatesforlist(w->w_list->gl_list,
// p_ntemplates, p_templatevec);
}
}
static void canvas_addtemplatesforlist(t_gobj *y,
int *p_ntemplates, t_symbol ***p_templatevec)
{
......@@ -625,6 +655,9 @@ static void canvas_saveto(t_canvas *x, t_binbuf *b)
}
}
/* yuck, wish I didn't have to do this... */
extern t_class *gtemplate_class;
/* call this recursively to collect all the template names for
a canvas or for the selection. */
static void canvas_collecttemplatesfor(t_canvas *x, int *ntemplatesp,
......@@ -638,6 +671,10 @@ static void canvas_collecttemplatesfor(t_canvas *x, int *ntemplatesp,
(wholething || glist_isselected(x, y)))
canvas_addtemplatesforscalar(((t_scalar *)y)->sc_template,
((t_scalar *)y)->sc_vec, ntemplatesp, templatevecp);
else if ((pd_class(&y->g_pd) == gtemplate_class) &&
(wholething || glist_isselected(x, y)))
canvas_addtemplatesforstruct(gtemplate_get((t_gtemplate *)y),
ntemplatesp, templatevecp);
else if ((pd_class(&y->g_pd) == canvas_class) &&
(wholething || glist_isselected(x, y)))
canvas_collecttemplatesfor((t_canvas *)y,
......
......@@ -140,20 +140,25 @@ int template_hasxy(t_template *template)
int template_check_array_fields(t_symbol *structname, t_template *template)
{
/* We're calling this from template_cancreate as well as
gtemplate_cancreate.
With gtemplate_cancreate, the t_template doesn't exist yet.
So we send the struct name to see if it matches the name of any
array field templates that our gtemplate will depend on. If we find
a match we will refuse to create the gtemplate.
However, template_cancreate starts from the struct name for a template
that already exists. So on the first time through this recursive
function, there isn't a containing structname yet.
So we suppress this conditional the first
time through the recursive loop, and then set the structname for
all subsequent iterations through the loop. */
gtemplate_cancreate. With gtemplate_cancreate, the t_template doesn't
exist yet. So we send the struct name to see if it matches the name of
any array field templates that our gtemplate will depend on. If we find
a match we will refuse to create the gtemplate. However,
template_cancreate starts from the struct name for a template that
already exists. On the first time through this recursive function,
there isn't a containing structname yet. So we suppress this conditional
the first time through the recursive loop, and then set the structname
for all subsequent iterations through the loop.
1 = success
0 = circular dependency
-1 = non-existant array elemtemplate found */
if (structname && structname == template->t_sym)
{
return 0;
t_object *ob = template_getstruct(template);
pd_error(ob, "%s: circular dependency",
template->t_sym->s_name);
return (0);
}
int i, nitems = template->t_n;
t_dataslot *datatypes = template->t_vec;
......@@ -168,7 +173,7 @@ int template_check_array_fields(t_symbol *structname, t_template *template)
t_object *ob = template_getstruct(template);
pd_error(ob, "%s: no such template",
datatypes->ds_arraytemplate->s_name);
return (0);
return (-1);
}
else if (elemtemplate->t_sym == structname)
{
......@@ -187,13 +192,13 @@ int template_check_array_fields(t_symbol *structname, t_template *template)
}
}
}
return (1);
return 1;
}
int template_cancreate(t_template *template)
{
/* we send "0" for the structname since there is no container struct */
return (template_check_array_fields(0, template));
return (template_check_array_fields(0, template) == 1);
}
/* make a new scalar and add to the glist. We create a "gp" here which
......@@ -703,10 +708,16 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
{
t_float xscale = glist_xtopixels(owner, 1) - glist_xtopixels(owner, 0);
t_float yscale = glist_ytopixels(owner, 1) - glist_ytopixels(owner, 0);
/* we could use the tag .template%lx for easy access from
the draw_class, but that's not necessary at this point */
/* we translate the .scalar%lx group to displace it on the tk side.
This is the outermost group for the scalar, something like a
poor man's viewport.
Also, the default stroke is supposed to be "none" and default
fill is supposed to be black. Unfortunately tkpath does the
opposite. To fix this, we set the correct fill/stroke options
here on the .scalar%lx group. Notice also that tkpath doesn't
understand "None"-- instead we must send an empty symbol. */
sys_vgui(".x%lx.c create group -tags {.scalar%lx %s} "
"-matrix { {%g %g} {%g %g} {%d %d} }\n",
"-matrix { {%g %g} {%g %g} {%d %d} } -stroke \"\" -fill black\n",
glist_getcanvas(owner), x->sc_vec,
(glist_isselected(owner, &x->sc_gobj) ? "scalar_selected" : ""),
xscale, 0.0, 0.0, yscale, (int)glist_xtopixels(owner, basex),
......
......@@ -45,7 +45,7 @@ static int drawimage_getindex(void *z, t_template *template, t_word *data);
/* ---------------------- storage ------------------------- */
static t_class *gtemplate_class;
t_class *gtemplate_class;
static t_class *template_class;
/* there's a pre-defined "float" template. LATER should we bind this
......@@ -673,9 +673,13 @@ int gtemplate_cancreate(t_symbol *templatename, int argc, t_atom *argv)
/* check for cancreation here */
t_template *elemtemplate =
template_findbyname(canvas_makebindsym(argv[2].a_w.w_symbol));
if (!elemtemplate ||
!template_check_array_fields(
canvas_makebindsym(templatename), elemtemplate))
if (!elemtemplate)
{
post("warning: template %s does not exist",
argv[2].a_w.w_symbol->s_name);
}
else if (template_check_array_fields(
canvas_makebindsym(templatename), elemtemplate) == 0)
{
return 0;
}
......@@ -707,7 +711,7 @@ static void *gtemplate_new(t_symbol *s, int argc, t_atom *argv)
return (gtemplate_donew(canvas_makebindsym(sym), argc, argv));
}
else
return 0;
return (0);
}
/* old version (0.34) -- delete 2003 or so */
......@@ -1244,7 +1248,7 @@ void *svg_new(t_pd *parent, t_symbol *s, int argc, t_atom *argv)
}
if (argc & 1 && x->x_type != gensym("path"))
fielddesc_setfloat_const(fd, 0);
x->x_filltype = 42;
x->x_filltype = 0;
x->x_fillopacity.a_flag = 0;
x->x_fillrule.a_flag = 0;
x->x_stroketype = 0;
......@@ -1399,15 +1403,17 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
t_template *template, t_word *data, int *predraw_bbox, void *parent,
t_scalar *sc)
{
/* todo-- I'm mixing "c" with glist_getcanvas(c) a little too freely...
need to experiment with gop scalars to make sure I'm not breaking
anything */
char tag[MAXPDSTRING];
/* todo-- I'm mixing "c" with glist_getcanvas(c) a little too freely...
need to experiment with gop scalars to make sure I'm not breaking
anything */
int in_array = (sc->sc_vec != data);
post("in_array is %d", in_array);
char tag[MAXPDSTRING];
if (x->x_type == gensym("group"))
{
template_findcanvas(template);
sprintf(tag, ".dgroup%lx.%lx",
(long unsigned int)template_findcanvas(template),
sprintf(tag, "%s%lx.%lx",
(in_array ? ".scelem" : ".dgroup"),
(long unsigned int)x->x_parent,
(long unsigned int)data);
}
else
......@@ -1537,14 +1543,6 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
x->x_pathrect_cache = 0;
}
svg_parsetransform(x, template, data, &m1, &m2, &m3, &m4, &m5, &m6);
if (x->x_type == gensym("group"))
{
sys_vgui(".x%lx.c itemconfigure .dgroup%lx.%lx -matrix "
"{ {%g %g} {%g %g} {%g %g} }\n",
glist_getcanvas(c), x->x_parent, data,
m1, m2, m3, m4, m5, m6);
}
else
sys_vgui(".x%lx.c itemconfigure %s -matrix "
"{ {%g %g} {%g %g} {%g %g} }\n",
glist_getcanvas(c), tag,
......@@ -1650,6 +1648,7 @@ void svg_updatevec(t_canvas *c, t_word *data, t_template *template,
t_template *target, void *parent, t_symbol *s, t_svg *x, t_scalar *sc,
int *predraw_bbox)
{
post("updateing vec...");
int i, j;
for (i = 0; i < template->t_n; i++)
{
......@@ -2103,7 +2102,8 @@ void svg_rectpoints(t_svg *x, t_symbol *s, int argc, t_atom *argv)
if (type == A_FLOAT || type == A_SYMBOL)
{
t_fielddesc *fd = x->x_vec;
if (type == A_FLOAT && argv[0].a_w.w_float < 0)
/* don't allow negative height/width */
if (type == A_FLOAT && i > 1 && argv[0].a_w.w_float < 0)
fielddesc_setfloat_const(fd + i, 0);
else
fielddesc_setfloatarg(fd + i, argc, argv);
......@@ -3443,16 +3443,6 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
*/
int in_array = (sc->sc_vec == data) ? 0 : 1;
// if (in_array)
// {
/* we probably don't need 'p' anymore... */
//t_canvas *p =
// template_findcanvas(template_findbyname(sc->sc_template));
// sys_vgui(".x%lx.c create group -tags {.scelem%lx} "
// "-parent .scelem%lx.%lx -matrix { {1 0} {0 1} {%g %g} }\n",
// glist_getcanvas(glist), data,
// parentglist, data, basex, basey);
// }
//int flags = sa->x_flags;
t_float pix[500];
if (n > 500)
......@@ -3875,7 +3865,7 @@ typedef struct _curve
when loading a file.) The reason is that they have not had their
motionfn revised to respect the parent affine transformations. If they
did then we could allow them inside a [group]. */
extern canvas_isgroup(t_canvas *x);
extern int canvas_isgroup(t_canvas *x);
static int legacy_draw_in_group(t_canvas *c)
{
......@@ -4097,18 +4087,6 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
revised so it's done in a more sane fashion
*/
int in_array = (sc->sc_vec == data) ? 0 : 1;
if (in_array)
{
/* since the old drawing commands don't have svg attributes
or transforms, we just make them children of the scalar's
group. That seems to work just fine. */
t_canvas *p =
template_findcanvas(template_findbyname(sc->sc_template));
sys_vgui(".x%lx.c create group -tags {.scelem%lx} "
"-parent .dgroup%lx.%lx -matrix { {1 0} {0 1} {%g %g} }\n",
glist_getcanvas(glist), data,
p, sc->sc_vec, basex, basey);
}
int flags = x->x_flags;
t_float width = fielddesc_getfloat(&x->x_width, template, data, 1);
char outline[20], fill[20];
......@@ -4166,10 +4144,9 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
}
for (i = 0; i < n; i++)
{
//sys_vgui("%d %d \\\n", pix[2*i], pix[2*i+1]);
sys_vgui("%d %d \\\n",
pix[2*i] + (in_array ? (int)basex : 0),
pix[2*i+1] + (in_array ? (int)basey : 0));
pix[2*i],
pix[2*i+1]);
if ((flags & BEZ) && (flags & BBOX))
{
sys_vgui("-rx %d -ry %d \\\n",
......@@ -4184,9 +4161,9 @@ static void curve_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
if (flags & CLOSED) sys_vgui("-fill %s -stroke %s \\\n",
fill, outline);
else if(flags & BBOX) sys_vgui("-stroke %s \\\n", outline);
else sys_vgui("-stroke %s \\\n", outline);
else sys_vgui("-stroke %s -fill \"\" \\\n", outline);
if (in_array)
sys_vgui("-parent .scelem%lx \\\n", data);
sys_vgui("-parent .scelem%lx.%lx \\\n", parentglist, data);
else
sys_vgui("-parent .dgroup%lx.%lx \\\n", x->x_canvas, sc->sc_vec);
// this doesn't work with tkpath...
......@@ -4920,7 +4897,7 @@ static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
if (symfill == &s_) symfill = gensym("#000000");
if (style == PLOTSTYLE_POINTS || style == PLOTSTYLE_BARS)
{
symfill = style == PLOTSTYLE_POINTS ? symoutline : symfill;
symfill = (style == PLOTSTYLE_POINTS ? symoutline : symfill);
t_float minyval = 1e20, maxyval = -1e20;
int ndrawn = 0;
sys_vgui(".x%lx.c create path { \\\n", glist_getcanvas(glist));
......@@ -5165,7 +5142,7 @@ static void plot_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
fielddesc_cvttocoord(yfielddesc, yval));
}
sys_vgui("-strokewidth %f -stroke %s \\\n", linewidth, symoutline->s_name);
sys_vgui("-strokewidth %f -stroke %s -fill \"\" \\\n", linewidth, symoutline->s_name);
//if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1 \\\n"); //this doesn't work with tkpath
if (in_array)
sys_vgui(" -parent .scelem%lx \\\n", data);
......@@ -6277,8 +6254,8 @@ static void drawnumber_getrect(t_gobj *z, t_glist *glist,
drawnumber_sprintf(x, buf, &at);
*xp1 = xloc;
*yp1 = yloc;
*xp2 = xloc + (fontwidth * strlen(buf) * xscale);
*yp2 = yloc + (fontheight * yscale);
*xp2 = xloc + (fontwidth * strlen(buf));
*yp2 = yloc + (fontheight);
}
static void drawnumber_displace(t_gobj *z, t_glist *glist,
......@@ -6323,7 +6300,11 @@ static void drawnumber_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
if (vis)
{
t_atom at;
int in_array = (sc->sc_vec == data) ? 0 : 1;
t_float xscale = glist_xtopixels(glist, 1) - glist_xtopixels(glist, 0);
t_float yscale = glist_ytopixels(glist, 1) - glist_ytopixels(glist, 0);
if (xscale != 0) xscale = 1.0 / xscale;
if (yscale != 0) yscale = 1.0 / yscale;
int fontsize = fielddesc_getfloat(&x->x_fontsize, template, data, 0);
if (!fontsize) fontsize = glist_getfont(glist);
/*int xloc = glist_xtopixels(glist,
......@@ -6351,8 +6332,14 @@ static void drawnumber_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
sys_hostfontsize(fontsize), yloc, colorstring, buf);
/* have to remove fontweight for the time being... */
sys_vgui(" -fontfamily {%s} -fontsize %d", sys_font, fontsize);
sys_vgui(" -parent .scalar%lx", data);
/* sys_vgui(" -matrix {{%g 0.0} {0.0 %g} {0.0 0.0}}", xinv, yinv); */
sys_vgui(" -matrix { {%g 0} {0 %g} {0 0} }", xscale, yscale);
if (in_array)
sys_vgui(" -parent .scelem%lx.%lx \\\n", parentglist, data);
else
sys_vgui(" -parent .dgroup%lx.%lx \\\n",
x->x_canvas, data);
sys_vgui(" -tags {.x%lx.x%lx.template%lx scalar%lx}\n",
glist_getcanvas(glist), glist, data, sc);
}
......@@ -6654,6 +6641,7 @@ static void drawsymbol_getrect(t_gobj *z, t_glist *glist,
basex + fielddesc_getcoord(&x->x_xloc, template, data, 0));
yloc = glist_ytopixels(glist,
basey + fielddesc_getcoord(&x->x_yloc, template, data, 0));
font = fielddesc_getfloat(&x->x_fontsize, template, data, 0);
if (!font) font = glist_getfont(glist);
fontwidth = sys_fontwidth(font);
......@@ -6664,8 +6652,8 @@ static void drawsymbol_getrect(t_gobj *z, t_glist *glist,
drawsymbol_sprintf(x, buf, &at);
*xp1 = xloc;
*yp1 = yloc;
*xp2 = (xloc + (fontwidth * strlen(buf) * xscale));
*yp2 = (yloc + (fontheight * yscale));
*xp2 = (xloc + (fontwidth * strlen(buf)));
*yp2 = (yloc + (fontheight));
}
static void drawsymbol_displace(t_gobj *z, t_glist *glist,
......@@ -6708,8 +6696,12 @@ static void drawsymbol_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
return;
if (vis)
{
int in_array = (sc->sc_vec == data) ? 0 : 1;
t_atom at;
int in_array = (sc->sc_vec == data) ? 0 : 1;
t_float xscale = glist_xtopixels(glist, 1) - glist_xtopixels(glist, 0);
t_float yscale = glist_ytopixels(glist, 1) - glist_ytopixels(glist, 0);
if (xscale != 0) xscale = 1.0 / xscale;
if (yscale != 0) yscale = 1.0 / yscale;
int fontsize = fielddesc_getfloat(&x->x_fontsize, template, data, 0);
if (!fontsize) fontsize = glist_getfont(glist);
......@@ -6734,8 +6726,14 @@ static void drawsymbol_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
glist_getcanvas(glist), xloc, sys_font,
sys_hostfontsize(fontsize), yloc, colorstring, buf);
sys_vgui(" -fontfamily {%s} -fontsize %d ", sys_font, fontsize);
sys_vgui(" -parent .scalar%lx", data);
/* sys_vgui(" -matrix {{%g 0.0} {0.0 %g} {0.0 0.0}}", xinv, yinv); */
sys_vgui(" -matrix { {%g 0} {0 %g} {0 0} }", xscale, yscale);
if (in_array)
sys_vgui(" -parent .scelem%lx.%lx \\\n", parentglist, data);
else
sys_vgui(" -parent .dgroup%lx.%lx \\\n",
x->x_canvas, data);
sys_vgui(" -tags {.x%lx.x%lx.template%lx scalar%lx}\n",
glist_getcanvas(glist), glist, data, sc);
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment