diff --git a/src/path/Path.js b/src/path/Path.js index 1133d671..8e018d17 100644 --- a/src/path/Path.js +++ b/src/path/Path.js @@ -1874,32 +1874,29 @@ statics: { if (!first) return new Rectangle(); var coords = new Array(6), - prevCoords = new Array(6), - roots = new Array(2); - // Make coordinates for first segment available in prevCoords. - first._transformCoordinates(matrix, prevCoords, false); - var min = prevCoords.slice(0, 2), + // Make coordinates for first segment available in prevCoords. + prevCoords = first._transformCoordinates(matrix, new Array(6), false), + roots = new Array(2), + min = prevCoords.slice(0, 2), max = min.slice(0), // clone // Add some tolerance for good roots, as t = 0 / 1 are added // seperately anyhow, and we don't want joins to be added with // radiuses in getStrokeBounds() tMin = Numerical.TOLERANCE, tMax = 1 - tMin; + + function add(value, coord, padding) { + var left = value - padding, + right = value + padding; + if (left < min[coord]) + min[coord] = left; + if (right > max[coord]) + max[coord] = right; + } + function processSegment(segment) { segment._transformCoordinates(matrix, coords, false); - for (var i = 0; i < 2; i++) { - - function add(value, padding) { - var left = value - padding, - right = value + padding; - if (left < min[i]) - min[i] = left; - if (right > max[i]) - max[i] = right; - - } - var v0 = prevCoords[i], // prev.point v1 = prevCoords[i + 4], // prev.handleOut v2 = coords[i + 2], // segment.handleIn @@ -1912,12 +1909,10 @@ statics: { c = v1 - v0; count = Numerical.solveQuadratic(a, b, c, roots, Numerical.TOLERANCE); - // Only add strokeWidth to bounds for points which lie within // 0 < t < 1. The corner cases for cap and join are handled in // getStrokeBounds() - add(v3, 0); - + add(v3, i, 0); for (var j = 0; j < count; j++) { var t = roots[j], u = 1 - t; @@ -1928,6 +1923,7 @@ statics: { + 3 * u * u * t * v1 + 3 * u * t * t * v2 + t * t * t * v3, + i, strokePadding ? strokePadding[i] : 0); } } @@ -1936,6 +1932,7 @@ statics: { prevCoords = coords; coords = tmp; } + for (var i = 1, l = segments.length; i < l; i++) processSegment(segments[i]); if (closed) diff --git a/src/path/Segment.js b/src/path/Segment.js index 603d39f0..fc7db86d 100644 --- a/src/path/Segment.js +++ b/src/path/Segment.js @@ -393,35 +393,36 @@ var Segment = this.Segment = Base.extend(/** @lends Segment# */{ } // If no matrix was previded, this was just called to get the coords and // we are done now. - if (!matrix) - return; - matrix._transformCoordinates(coords, 0, coords, 0, i / 2); - x = coords[0]; - y = coords[1]; - if (change) { - // If change is true, we need to set the new values back - point._x = x; - point._y = y; - i = 2; - if (handleIn) { - handleIn._x = coords[i++] - x; - handleIn._y = coords[i++] - y; - } - if (handleOut) { - handleOut._x = coords[i++] - x; - handleOut._y = coords[i++] - y; - } - } else { - // We want to receive the results in coords, so make sure - // handleIn and out are defined too, even if they're 0 - if (!handleIn) { - coords[i++] = x; - coords[i++] = y; - } - if (!handleOut) { - coords[i++] = x; - coords[i++] = y; + if (matrix) { + matrix._transformCoordinates(coords, 0, coords, 0, i / 2); + x = coords[0]; + y = coords[1]; + if (change) { + // If change is true, we need to set the new values back + point._x = x; + point._y = y; + i = 2; + if (handleIn) { + handleIn._x = coords[i++] - x; + handleIn._y = coords[i++] - y; + } + if (handleOut) { + handleOut._x = coords[i++] - x; + handleOut._y = coords[i++] - y; + } + } else { + // We want to receive the results in coords, so make sure + // handleIn and out are defined too, even if they're 0 + if (!handleIn) { + coords[i++] = x; + coords[i++] = y; + } + if (!handleOut) { + coords[i++] = x; + coords[i++] = y; + } } } + return coords; } });