Commit beb1b2d9 authored by user's avatar user
Browse files

fixed bug where scalar bbox cache prevented garrays from registering mouse clicks

parent cdef6296
......@@ -872,11 +872,17 @@ void array_redraw(t_array *a, t_glist *glist)
}
/* routine to get screen coordinates of a point in an array */
/* glist_topixels parameter was added because of t_scalar
and t_draw caching mechanism. For scalers, we're only
converting to pixels in scalar_getrect. So in plot_getrect
we need to get the coordinate without regard to the x/y
offset (and scaling factor) of a gop window */
void array_getcoordinate(t_glist *glist,
char *elem, int xonset, int yonset, int wonset, int indx,
t_float basex, t_float basey, t_float xinc,
t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
t_float *xp1, t_float *xp2, t_float *yp, t_float *wp)
t_float *xp1, t_float *xp2, t_float *yp, t_float *wp,
int glist_topixels)
{
t_float xval, yval, ypix, wpix;
if (xonset >= 0)
......@@ -885,23 +891,39 @@ void array_getcoordinate(t_glist *glist,
if (yonset >= 0)
yval = *(t_float *)(elem + yonset);
else yval = 0;
ypix = glist_ytopixels(glist, basey +
fielddesc_cvttocoord(yfielddesc, yval));
// ypix = glist_ytopixels(glist, basey +
// fielddesc_cvttocoord(yfielddesc, yval));
ypix = basey + fielddesc_cvttocoord(yfielddesc, yval);
if (glist_topixels)
ypix = glist_ytopixels(glist, ypix);
if (wonset >= 0)
{
/* found "w" field which controls linewidth. */
t_float wval = *(t_float *)(elem + wonset);
wpix = glist_ytopixels(glist, basey +
fielddesc_cvttocoord(yfielddesc, yval) +
fielddesc_cvttocoord(wfielddesc, wval)) - ypix;
// wpix = glist_ytopixels(glist, basey +
// fielddesc_cvttocoord(yfielddesc, yval) +
// fielddesc_cvttocoord(wfielddesc, wval)) - ypix;
wpix = basey + fielddesc_cvttocoord(yfielddesc, yval) +
fielddesc_cvttocoord(wfielddesc, wval);
if (glist_topixels)
wpix = glist_ytopixels(glist, wpix);
wpix -= ypix;
if (wpix < 0)
wpix = -wpix;
}
else wpix = 1;
*xp1 = glist_xtopixels(glist, basex +
fielddesc_cvttocoord(xfielddesc, xval));
*xp2 = glist_xtopixels(glist, basex +
fielddesc_cvttocoord(xfielddesc, xval+1))-1;
if (glist_topixels)
{
*xp1 = glist_xtopixels(glist, basex +
fielddesc_cvttocoord(xfielddesc, xval));
*xp2 = glist_xtopixels(glist, basex +
fielddesc_cvttocoord(xfielddesc, xval+1))-1;
}
else
{
*xp1 = basex + fielddesc_cvttocoord(xfielddesc, xval);
*xp2 = basex + fielddesc_cvttocoord(xfielddesc, xval+1)-1;
}
*yp = ypix;
// increased following on 20140830 to 8 (+4 and -4) and
// so that the smallest hitbox is always at least 8x8
......@@ -1119,13 +1141,14 @@ int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap,
{
array_getcoordinate(glist, (char *)(array->a_vec) + i * elemsize,
xonset, yonset, wonset, i, xloc, yloc, xinc,
xfield, yfield, wfield, &pxpix1, &pxpix2, &pypix, &pwpix);
xfield, yfield, wfield, &pxpix1, &pxpix2, &pypix, &pwpix, 1);
//fprintf(stderr," array_getcoordinate %d: pxpix1:%f pxpix2:%f pypix:%f pwpix:%f dx:%f dy:%f elemsize:%d yonset:%d wonset:%d xonset:%d xloc:%f yloc:%f xinc:%f\n", i, pxpix1, pxpix2, pypix, pwpix, dx, dy, elemsize, yonset, wonset, xonset, xloc, yloc, xinc);
// increased following on 20140830 to 8 and updated array_getcoordinate
// so that the smallest hitbox is always at least 8x8--check with
// all_about_arrays.pd inside custom scalars in an array
if (pwpix < 8)
pwpix = 8;
if (xpix >= (int)pxpix1-pwpix && xpix <= (int)pxpix2+pwpix &&
((array_joc) ||
(ypix >= pypix-pwpix && ypix <= pypix+pwpix)))
......@@ -1180,7 +1203,7 @@ int array_doclick(t_array *array, t_glist *glist, t_scalar *sc, t_array *ap,
//{
//array_getcoordinate(glist, (char *)(array->a_vec) + i * elemsize,
// xonset, yonset, wonset, i, xloc, yloc, xinc,
// xfield, yfield, wfield, &pxpix1, &pxpix2, &pypix, &pwpix);
// xfield, yfield, wfield, &pxpix1, &pxpix2, &pypix, &pwpix, 1);
//dx = pxpix1 - xpix;
//if (dx < 0) dx = -dx;
dy = pypix - ypix;
......@@ -1371,7 +1394,7 @@ static void array_getrect(t_array *array, t_glist *glist,
i * elemsize,
xonset, yonset, wonset, i, 0, 0, 1,
0, 0, 0,
&pxpix1, &pxpix2, &pypix, &pwpix);
&pxpix1, &pxpix2, &pypix, &pwpix, 1);
if (pwpix < 2)
pwpix = 2;
if (pxpix1 < x1)
......@@ -1452,7 +1475,6 @@ static void garray_vis(t_gobj *z, t_glist *glist, int vis)
static int garray_click(t_gobj *z, t_glist *glist,
int xpix, int ypix, int shift, int alt, int dbl, int doit)
{
//fprintf(stderr,"garray_click\n");
t_garray *x = (t_garray *)z;
array_garray = x;
return (gobj_click(&x->x_scalar->sc_gobj, glist,
......
......@@ -638,7 +638,8 @@ EXTERN void array_getcoordinate(t_glist *glist,
char *elem, int xonset, int yonset, int wonset, int indx,
t_float basex, t_float basey, t_float xinc,
t_fielddesc *xfielddesc, t_fielddesc *yfielddesc, t_fielddesc *wfielddesc,
t_float *xp1, t_float *xp2, t_float *yp, t_float *wp);
t_float *xp1, t_float *xp2, t_float *yp, t_float *wp,
int glist_topixels);
EXTERN int array_getfields(t_symbol *elemtemplatesym,
t_canvas **elemtemplatecanvasp,
......
......@@ -361,6 +361,7 @@ static void scalar_getrect(t_gobj *z, t_glist *owner,
t_canvas *templatecanvas = template_findcanvas(template);
int x1 = 0x7fffffff, x2 = -0x7fffffff, y1 = 0x7fffffff, y2 = -0x7fffffff;
t_float basex, basey;
t_float screenx1, screeny1, screenx2, screeny2;
// EXPERIMENTAL: we assume that entire canvas is within
// the rectangle--this is for arrays
......@@ -371,7 +372,6 @@ static void scalar_getrect(t_gobj *z, t_glist *owner,
{
x1 = -0x7fffffff, y1 = -0x7fffffff, x2 = 0x7fffffff, y2 = 0x7fffffff;
}
else
{
scalar_getbasexy(x, &basex, &basey);
......@@ -385,12 +385,25 @@ static void scalar_getrect(t_gobj *z, t_glist *owner,
else
{
/* todo: bad flow with internal return here. make it cleaner */
if (x->sc_bboxcache)
if (x->sc_bboxcache && 0)
{
*xp1 = x->sc_x1;
*yp1 = x->sc_y1;
*xp2 = x->sc_x2;
*yp2 = x->sc_y2;
screenx1 = glist_xtopixels(owner, x->sc_x1);
screeny1 = glist_ytopixels(owner, x->sc_y1);
screenx2 = glist_xtopixels(owner, x->sc_x2);
screeny2 = glist_ytopixels(owner, x->sc_y2);
*xp1 = (int)(screenx1 < screenx2 ? screenx1 : screenx2);
*yp1 = (int)(screeny1 < screeny2 ? screeny1 : screeny2);
*xp2 = (int)(screenx2 > screenx1 ? screenx2 : screenx1);
*yp2 = (int)(screeny2 > screeny1 ? screeny2 : screeny1);
//fprintf(stderr,"CACHED FINAL scalar_getrect "
// "x1 %g y1 %g x2 %g y2 %g\n",
screenx1,
screeny1,
screenx2,
screeny2);
return;
}
x1 = y1 = 0x7fffffff;
......@@ -401,13 +414,31 @@ static void scalar_getrect(t_gobj *z, t_glist *owner,
x1 = y1 = x2 = y2 = 0;
}
}
//fprintf(stderr,"FINAL scalar_getrect x1 %d y1 %d x2 %d y2 %d\n",
// x1, y1, x2, y2);
*xp1 = x->sc_x1 = x1;
*yp1 = x->sc_y1 = y1;
*xp2 = x->sc_x2 = x2;
*yp2 = x->sc_y2 = y2;
x->sc_bboxcache = 1;
screenx1 = glist_xtopixels(owner, x1);
screeny1 = glist_ytopixels(owner, y1);
screenx2 = glist_xtopixels(owner, x2);
screeny2 = glist_ytopixels(owner, y2);
// Values for screen bounding box
*xp1 = (int)(screenx1 < screenx2 ? screenx1 : screenx2);
*xp2 = (int)(screenx2 > screenx1 ? screenx2 : screenx1);
*yp1 = (int)(screeny1 < screeny2 ? screeny1 : screeny2);
*yp2 = (int)(screeny2 > screeny1 ? screeny2 : screeny1);
// Cache without glist_topixel (in case a gop is moved, for example)
x->sc_x1 = x1;
x->sc_x2 = x2;
x->sc_y1 = y1;
x->sc_y2 = y2;
//fprintf(stderr,"COMPUTED FINAL scalar_getrect "
// "x1 %g y1 %g x2 %g y2 %g\n",
// screenx1,
// screeny1,
// screenx2,
// screeny2);
x->sc_bboxcache = 1; // We now have cached values for the next call
}
void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
......@@ -426,6 +457,11 @@ void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
x1--; x2++; y1--; y2++;
if (glist_istoplevel(glist))
{
t_float xscale = glist_xtopixels(glist, 1) -
glist_xtopixels(glist, 0);
t_float yscale = glist_ytopixels(glist, 1) -
glist_ytopixels(glist, 0);
//sys_vgui(".x%lx.c create prect %d %d %d %d "
// "-strokewidth 1 -stroke $pd_colors(selection) "
// "-tags {select%lx selected}\n",
......
......@@ -2323,16 +2323,16 @@ void svg_parsetransform(t_svg *x, t_template *template, t_word *data,
}
else if (type == gensym("skewx"))
{
t_float a = fielddesc_getfloat(fd++, template, data, 0); // *
// 3.14159 / 180;
t_float a = fielddesc_getfloat(fd++, template, data, 0) *
3.14159 / 180;
argc--;
mset(m2, 1, 0, tan(a), 1, 0, 0);
mmult(m, m2, m);
}
else if (type == gensym("skewy"))
{
t_float a = fielddesc_getfloat(fd++, template, data, 0); // *
// 3.14159 / 180;
t_float a = fielddesc_getfloat(fd++, template, data, 0) *
3.14159 / 180;
argc--;
mset(m2, 1, tan(a), 0, 1, 0, 0);
mmult(m, m2, m);
......@@ -3121,14 +3121,14 @@ static void svg_getpathrect(t_svg *x, t_glist *glist,
x->x_y2 = finaly2;
if (x->x_pathrect_cache != -1)
x->x_pathrect_cache = 1;
finalx1 = glist_xtopixels(glist, basex + finalx1);
finalx2 = glist_xtopixels(glist, basex + finalx2);
finaly1 = glist_ytopixels(glist, basey + finaly1);
finaly2 = glist_ytopixels(glist, basey + finaly2);
*xp1 = (int)finalx1;
*xp2 = (int)finalx2;
*yp1 = (int)finaly1;
*yp2 = (int)finaly2;
//finalx1 = glist_xtopixels(glist, basex + finalx1);
//finalx2 = glist_xtopixels(glist, basex + finalx2);
//finaly1 = glist_ytopixels(glist, basey + finaly1);
//finaly2 = glist_ytopixels(glist, basey + finaly2);
*xp1 = (int)(finalx1 + basex);
*xp2 = (int)(finalx2 + basex);
*yp1 = (int)(finaly1 + basey);
*yp2 = (int)(finaly2 + basey);
}
static void draw_getrect(t_gobj *z, t_glist *glist,
......@@ -3155,10 +3155,16 @@ static void draw_getrect(t_gobj *z, t_glist *glist,
if (sa->x_pathrect_cache == 1)
{
*xp1 = glist_xtopixels(glist, basex + sa->x_x1);
*xp2 = glist_xtopixels(glist, basex + sa->x_x2);
*yp1 = glist_ytopixels(glist, basey + sa->x_y1);
*yp2 = glist_ytopixels(glist, basey + sa->x_y2);
//*xp1 = glist_xtopixels(glist, basex + sa->x_x1);
//*xp2 = glist_xtopixels(glist, basex + sa->x_x2);
//*yp1 = glist_ytopixels(glist, basey + sa->x_y1);
//*yp2 = glist_ytopixels(glist, basey + sa->x_y2);
*xp1 = basex + sa->x_x1;
*xp2 = basex + sa->x_x2;
*yp1 = basey + sa->x_y1;
*yp2 = basey + sa->x_y2;
return;
}
......@@ -3208,10 +3214,15 @@ static void draw_getrect(t_gobj *z, t_glist *glist,
}
if (n)
{
x1 = glist_xtopixels(glist, basex + x1);
x2 = glist_xtopixels(glist, basex + x2);
y1 = glist_ytopixels(glist, basey + y1);
y2 = glist_ytopixels(glist, basey + y2);
//x1 = glist_xtopixels(glist, basex + x1);
//x2 = glist_xtopixels(glist, basex + x2);
//y1 = glist_ytopixels(glist, basey + y1);
//y2 = glist_ytopixels(glist, basey + y2);
x1 = basex + x1;
x2 = basex + x2;
y1 = basey + y1;
y2 = basey + y2;
}
}
else if (sa->x_type == gensym("rect") ||
......@@ -3301,10 +3312,15 @@ static void draw_getrect(t_gobj *z, t_glist *glist,
if (tx2 > x2) x2 = tx2;
if (ty1 > y2) y2 = ty1;
if (ty2 > y2) y2 = ty2;
x1 = glist_xtopixels(glist, basex + x1);
x2 = glist_xtopixels(glist, basex + x2);
y1 = glist_ytopixels(glist, basey + y1);
y2 = glist_ytopixels(glist, basey + y2);
//x1 = glist_xtopixels(glist, basex + x1);
//x2 = glist_xtopixels(glist, basex + x2);
//y1 = glist_ytopixels(glist, basey + y1);
//y2 = glist_ytopixels(glist, basey + y2);
x1 = basex + x1;
x2 = basex + x2;
y1 = basey + y1;
y2 = basey + y2;
}
if (fielddesc_getfloat(&sa->x_strokewidth.a_attr, template, data, 0))
{
......@@ -4342,10 +4358,8 @@ static void curve_getrect(t_gobj *z, t_glist *glist,
}
for (i = 0, f = x->x_vec; i < n; i++, f += 2)
{
int xloc = glist_xtopixels(glist,
basex + fielddesc_getcoord(f, template, data, 0));
int yloc = glist_ytopixels(glist,
basey + fielddesc_getcoord(f+1, template, data, 0));
int xloc = basex + fielddesc_getcoord(f, template, data, 0);
int yloc = basey + fielddesc_getcoord(f+1, template, data, 0);
if (xloc < x1) x1 = xloc;
if (xloc > x2) x2 = xloc;
if (yloc < y1) y1 = yloc;
......@@ -4977,7 +4991,8 @@ static void plot_getrect(t_gobj *z, t_glist *glist,
mset(mtx1, 1, 0, 0, 1, 0, 0);
if (x->x_canvas->gl_owner && x->x_canvas->gl_svg)
svg_dogroupmtx(x->x_canvas, template, data, mtx1);
//post("plot_getrect matrix: %g %g %g %g %g %g", mtx1[0][0], mtx1[1][0], mtx1[0][1], mtx1[1][1], mtx1[0][2], mtx1[2][1]);
//post("plot_getrect matrix: %g %g %g %g %g %g",
// mtx1[0][0], mtx1[1][0], mtx1[0][1], mtx1[1][1], mtx1[0][2], mtx1[2][1]);
int elemsize, yonset, wonset, xonset;
t_canvas *elemtemplatecanvas;
t_template *elemtemplate;
......@@ -5016,7 +5031,7 @@ static void plot_getrect(t_gobj *z, t_glist *glist,
array_getcoordinate(glist, (char *)(array->a_vec) + i * elemsize,
xonset, yonset, wonset, i, basex + xloc, basey + yloc, xinc,
xfielddesc, yfielddesc, wfielddesc,
&xpix1, &xpix2, &ypix, &wpix);
&xpix1, &xpix2, &ypix, &wpix, 0);
//fprintf(stderr,"elemsize%d yonset%d wonset%d xonset%d "
// "i%d basex%f xloc%f basey%f yloc%f xinc%f "
// "xpix%f ypix%f wpix%f\n",
......@@ -5104,7 +5119,7 @@ static void plot_getrect(t_gobj *z, t_glist *glist,
// x1, y1, x2, y2);
}
}
//fprintf(stderr,"FINAL plot_getrect %d %d %d %d\n", x1, y1, x2, y2);
fprintf(stderr,"FINAL plot_getrect %d %d %d %d\n", x1, y1, x2, y2);
//fprintf(stderr,"basex %g basey %g\n", basex, basey);
*xp1 = x1;
*yp1 = y1;
......@@ -6765,7 +6780,7 @@ static void drawimage_getrect(t_gobj *z, t_glist *glist,
x1 = y1 = 0x7fffffff;
x2 = y2 = -0x7fffffff;
// char buf[DRAWNUMBER_BUFSIZE];
//char buf[DRAWNUMBER_BUFSIZE];
t_float mtx1[3][3] = { {1, 0, 0}, {0, 1, 0}, {0, 0, 1} };
t_float mtx2[3][3] = { {1, 0, 0}, {0, 1, 0}, {1, 0, 1} };
t_float m1, m2, m3, m4, m5, m6,
......@@ -6811,10 +6826,15 @@ static void drawimage_getrect(t_gobj *z, t_glist *glist,
if (tx2 > x2) x2 = tx2;
if (ty1 > y2) y2 = ty1;
if (ty2 > y2) y2 = ty2;
x1 = glist_xtopixels(glist, basex + x1);
x2 = glist_xtopixels(glist, basex + x2);
y1 = glist_ytopixels(glist, basey + y1);
y2 = glist_ytopixels(glist, basey + y2);
//x1 = glist_xtopixels(glist, basex + x1);
//x2 = glist_xtopixels(glist, basex + x2);
//y1 = glist_ytopixels(glist, basey + y1);
//y2 = glist_ytopixels(glist, basey + y2);
x1 = basex + x1;
x2 = basex + x2;
y1 = basey + y1;
y2 = basey + y2;
/* todo: put these up top */
if (!fielddesc_getfloat(&x->x_vis, template, data, 0))
......
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