From aad46cbbda383bee3c4e54d24ce720b85be1fb5c Mon Sep 17 00:00:00 2001 From: Jonathan Wilkes <jancsika@yahoo.com> Date: Sat, 12 Jul 2014 20:49:05 -0400 Subject: [PATCH] fixed bbox for path: Q T S & C commands with multiple sets of coords now have proper bounds --- pd/src/g_template.c | 57 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/pd/src/g_template.c b/pd/src/g_template.c index 186509bb0..ebd3ac826 100644 --- a/pd/src/g_template.c +++ b/pd/src/g_template.c @@ -2414,10 +2414,9 @@ static void svg_curvedim(t_float p1x, t_float p1y, t_float mtx2[3][3]; int i; t_float a = (c2x - 2 * c1x + p1x) - (p2x - 2 * c2x + c1x); - t_float b = 2 * (c1x - p1x) - 2 * (c2x - c1x), + t_float b = 2 * (c1x - p1x) - 2 * (c2x - c1x), c = p1x - c1x; - t_float syntax_sanity_check = 42, - t1 = (a ? ((-b + sqrt(abs(b * b - 4 * a * c))) / 2.0 / a) : 0), + t_float t1 = (a ? ((-b + sqrt(abs(b * b - 4 * a * c))) / 2.0 / a) : 0), t2 = (a ? ((-b - sqrt(abs(b * b - 4 * a * c))) / 2.0 / a) : 0); t_float xy[12]; xy[0] = p1x; xy[1] = p1y; xy[2] = p2x; xy[3] = p2y; @@ -2867,9 +2866,9 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, case 'S': for (j = 0; j < x->x_nargs_per_cmd[i]; j += 4) { - /* hack */ - if ((j + 3) >= x->x_nargs_per_cmd[i]) - break; + /* hack */ + if ((j + 3) >= x->x_nargs_per_cmd[i]) + break; if (pcmd == 'C' || pcmd == 'S') { /* this is wrong... we need a @@ -2884,12 +2883,12 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, ny = yprev; } svg_curvedim(xprev, yprev, - nx, ny, *ia, *(ia+1), *(ia+2), *(ia+3), + nx, ny, *ia+j, *(ia+j+1), *(ia+j+2), *(ia+j+3), &x1, &y1, &x2, &y2, mtx1); - xprev = *(ia+2); - yprev = *(ia+3); - bx = *ia; - by = *(ia + 1); + xprev = *(ia+j+2); + yprev = *(ia+j+3); + bx = *ia+j; + by = *(ia + j + 1); if (x1 == 0x7fffffff && y1 == 0x7fffffff && x2 == -0x7fffffff && y2 == -0x7fffffff) @@ -2917,13 +2916,13 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, qxprev = xprev; qyprev = yprev; } - t_float cx1 = qxprev, cy1 = qyprev, cx2 = *ia, cy2 = *(ia+1), - cx, cy; + t_float cx1 = qxprev, cy1 = qyprev, cx2 = *ia+j, + cy2 = *(ia+j+1), cx, cy; svg_q2c(xprev, yprev, &cx1, &cy1, &cx2, &cy2, &cx, &cy); svg_curvedim(xprev, yprev, cx1, cy1, cx2, cy2, cx, cy, &x1, &y1, &x2, &y2, mtx1); - xprev = *ia; - yprev = *(ia+1); + xprev = *ia+j; + yprev = *(ia+j+1); if (x1 == 0x7fffffff && y1 == 0x7fffffff && x2 == -0x7fffffff && y2 == -0x7fffffff) @@ -2941,13 +2940,13 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, /* hack */ if ((j + 3) >= x->x_nargs_per_cmd[i]) break; - t_float cx1 = *ia, cy1 = *(ia+1), - cx2 = *(ia+2), cy2 = *(ia+3), cx, cy; + t_float cx1 = *ia+j, cy1 = *(ia+j+1), + cx2 = *(ia+j+2), cy2 = *(ia+j+3), cx, cy; svg_q2c(xprev, yprev, &cx1, &cy1, &cx2, &cy2, &cx, &cy); svg_curvedim(xprev, yprev, cx1, cy1, cx2, cy2, cx, cy, &x1, &y1, &x2, &y2, mtx1); - xprev = *(ia+2); - yprev = *(ia+3); + xprev = *(ia+j+2); + yprev = *(ia+j+3); if (x1 == 0x7fffffff && y1 == 0x7fffffff && x2 == -0x7fffffff && y2 == -0x7fffffff) @@ -2964,12 +2963,12 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, /* hack */ if ((j + 5) >= x->x_nargs_per_cmd[i]) break; - svg_curvedim(xprev, yprev, *ia, *(ia+1), *(ia+2), *(ia+3), - *(ia+4), *(ia+5), &x1, &y1, &x2, &y2, mtx1); - xprev = *(ia+4); - yprev = *(ia+5); - bx = *(ia+2); - by = *(ia+3); + svg_curvedim(xprev, yprev, *(ia+j), *(ia+j+1), *(ia+j+2), + *(ia+j+3), *(ia+j+4), *(ia+j+5), &x1, &y1, &x2, &y2, mtx1); + xprev = *(ia+j+4); + yprev = *(ia+j+5); + bx = *(ia+j+2); + by = *(ia+j+3); if (x1 == 0x7fffffff && y1 == 0x7fffffff && x2 == -0x7fffffff && y2 == -0x7fffffff) @@ -2983,25 +2982,25 @@ static void svg_getpathrect(t_svg *x, t_glist *glist, case 'V': for (j = 0; j < x->x_nargs_per_cmd[i]; j++) { - mset(mtx2, xprev, *ia, 0, 0, 0, 0); + mset(mtx2, xprev, *ia+j, 0, 0, 0, 0); mtx2[2][0] = 1; mmult(mtx1, mtx2, mtx2); tmpy = mtx2[1][0]; finaly1 = tmpy < finaly1 ? tmpy : finaly1; finaly2 = tmpy > finaly2 ? tmpy : finaly2; - yprev = *ia; + yprev = *ia+j; } break; case 'H': for (j = 0; j < x->x_nargs_per_cmd[i]; j++) { - mset(mtx2, *ia, yprev, 0, 0, 0, 0); + mset(mtx2, *ia+j, yprev, 0, 0, 0, 0); mtx2[2][0] = 1; mmult(mtx1, mtx2, mtx2); tmpx = mtx2[0][0]; finalx1 = tmpx < finalx1 ? tmpx : finalx1; finalx2 = tmpx > finalx2 ? tmpx : finalx2; - xprev = *ia; + xprev = *ia+j; } break; default: -- GitLab