| import * as vec2 from './vector.js'; | 
| import BoundingRect from './BoundingRect.js'; | 
| import { devicePixelRatio as dpr } from '../config.js'; | 
| import { fromLine, fromCubic, fromQuadratic, fromArc } from './bbox.js'; | 
| import { cubicLength, cubicSubdivide, quadraticLength, quadraticSubdivide } from './curve.js'; | 
| var CMD = { | 
|     M: 1, | 
|     L: 2, | 
|     C: 3, | 
|     Q: 4, | 
|     A: 5, | 
|     Z: 6, | 
|     R: 7 | 
| }; | 
| var tmpOutX = []; | 
| var tmpOutY = []; | 
| var min = []; | 
| var max = []; | 
| var min2 = []; | 
| var max2 = []; | 
| var mathMin = Math.min; | 
| var mathMax = Math.max; | 
| var mathCos = Math.cos; | 
| var mathSin = Math.sin; | 
| var mathAbs = Math.abs; | 
| var PI = Math.PI; | 
| var PI2 = PI * 2; | 
| var hasTypedArray = typeof Float32Array !== 'undefined'; | 
| var tmpAngles = []; | 
| function modPI2(radian) { | 
|     var n = Math.round(radian / PI * 1e8) / 1e8; | 
|     return (n % 2) * PI; | 
| } | 
| export function normalizeArcAngles(angles, anticlockwise) { | 
|     var newStartAngle = modPI2(angles[0]); | 
|     if (newStartAngle < 0) { | 
|         newStartAngle += PI2; | 
|     } | 
|     var delta = newStartAngle - angles[0]; | 
|     var newEndAngle = angles[1]; | 
|     newEndAngle += delta; | 
|     if (!anticlockwise && newEndAngle - newStartAngle >= PI2) { | 
|         newEndAngle = newStartAngle + PI2; | 
|     } | 
|     else if (anticlockwise && newStartAngle - newEndAngle >= PI2) { | 
|         newEndAngle = newStartAngle - PI2; | 
|     } | 
|     else if (!anticlockwise && newStartAngle > newEndAngle) { | 
|         newEndAngle = newStartAngle + (PI2 - modPI2(newStartAngle - newEndAngle)); | 
|     } | 
|     else if (anticlockwise && newStartAngle < newEndAngle) { | 
|         newEndAngle = newStartAngle - (PI2 - modPI2(newEndAngle - newStartAngle)); | 
|     } | 
|     angles[0] = newStartAngle; | 
|     angles[1] = newEndAngle; | 
| } | 
| var PathProxy = (function () { | 
|     function PathProxy(notSaveData) { | 
|         this.dpr = 1; | 
|         this._xi = 0; | 
|         this._yi = 0; | 
|         this._x0 = 0; | 
|         this._y0 = 0; | 
|         this._len = 0; | 
|         if (notSaveData) { | 
|             this._saveData = false; | 
|         } | 
|         if (this._saveData) { | 
|             this.data = []; | 
|         } | 
|     } | 
|     PathProxy.prototype.increaseVersion = function () { | 
|         this._version++; | 
|     }; | 
|     PathProxy.prototype.getVersion = function () { | 
|         return this._version; | 
|     }; | 
|     PathProxy.prototype.setScale = function (sx, sy, segmentIgnoreThreshold) { | 
|         segmentIgnoreThreshold = segmentIgnoreThreshold || 0; | 
|         if (segmentIgnoreThreshold > 0) { | 
|             this._ux = mathAbs(segmentIgnoreThreshold / dpr / sx) || 0; | 
|             this._uy = mathAbs(segmentIgnoreThreshold / dpr / sy) || 0; | 
|         } | 
|     }; | 
|     PathProxy.prototype.setDPR = function (dpr) { | 
|         this.dpr = dpr; | 
|     }; | 
|     PathProxy.prototype.setContext = function (ctx) { | 
|         this._ctx = ctx; | 
|     }; | 
|     PathProxy.prototype.getContext = function () { | 
|         return this._ctx; | 
|     }; | 
|     PathProxy.prototype.beginPath = function () { | 
|         this._ctx && this._ctx.beginPath(); | 
|         this.reset(); | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.reset = function () { | 
|         if (this._saveData) { | 
|             this._len = 0; | 
|         } | 
|         if (this._pathSegLen) { | 
|             this._pathSegLen = null; | 
|             this._pathLen = 0; | 
|         } | 
|         this._version++; | 
|     }; | 
|     PathProxy.prototype.moveTo = function (x, y) { | 
|         this._drawPendingPt(); | 
|         this.addData(CMD.M, x, y); | 
|         this._ctx && this._ctx.moveTo(x, y); | 
|         this._x0 = x; | 
|         this._y0 = y; | 
|         this._xi = x; | 
|         this._yi = y; | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.lineTo = function (x, y) { | 
|         var dx = mathAbs(x - this._xi); | 
|         var dy = mathAbs(y - this._yi); | 
|         var exceedUnit = dx > this._ux || dy > this._uy; | 
|         this.addData(CMD.L, x, y); | 
|         if (this._ctx && exceedUnit) { | 
|             this._ctx.lineTo(x, y); | 
|         } | 
|         if (exceedUnit) { | 
|             this._xi = x; | 
|             this._yi = y; | 
|             this._pendingPtDist = 0; | 
|         } | 
|         else { | 
|             var d2 = dx * dx + dy * dy; | 
|             if (d2 > this._pendingPtDist) { | 
|                 this._pendingPtX = x; | 
|                 this._pendingPtY = y; | 
|                 this._pendingPtDist = d2; | 
|             } | 
|         } | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.bezierCurveTo = function (x1, y1, x2, y2, x3, y3) { | 
|         this._drawPendingPt(); | 
|         this.addData(CMD.C, x1, y1, x2, y2, x3, y3); | 
|         if (this._ctx) { | 
|             this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); | 
|         } | 
|         this._xi = x3; | 
|         this._yi = y3; | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.quadraticCurveTo = function (x1, y1, x2, y2) { | 
|         this._drawPendingPt(); | 
|         this.addData(CMD.Q, x1, y1, x2, y2); | 
|         if (this._ctx) { | 
|             this._ctx.quadraticCurveTo(x1, y1, x2, y2); | 
|         } | 
|         this._xi = x2; | 
|         this._yi = y2; | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.arc = function (cx, cy, r, startAngle, endAngle, anticlockwise) { | 
|         this._drawPendingPt(); | 
|         tmpAngles[0] = startAngle; | 
|         tmpAngles[1] = endAngle; | 
|         normalizeArcAngles(tmpAngles, anticlockwise); | 
|         startAngle = tmpAngles[0]; | 
|         endAngle = tmpAngles[1]; | 
|         var delta = endAngle - startAngle; | 
|         this.addData(CMD.A, cx, cy, r, r, startAngle, delta, 0, anticlockwise ? 0 : 1); | 
|         this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); | 
|         this._xi = mathCos(endAngle) * r + cx; | 
|         this._yi = mathSin(endAngle) * r + cy; | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.arcTo = function (x1, y1, x2, y2, radius) { | 
|         this._drawPendingPt(); | 
|         if (this._ctx) { | 
|             this._ctx.arcTo(x1, y1, x2, y2, radius); | 
|         } | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.rect = function (x, y, w, h) { | 
|         this._drawPendingPt(); | 
|         this._ctx && this._ctx.rect(x, y, w, h); | 
|         this.addData(CMD.R, x, y, w, h); | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.closePath = function () { | 
|         this._drawPendingPt(); | 
|         this.addData(CMD.Z); | 
|         var ctx = this._ctx; | 
|         var x0 = this._x0; | 
|         var y0 = this._y0; | 
|         if (ctx) { | 
|             ctx.closePath(); | 
|         } | 
|         this._xi = x0; | 
|         this._yi = y0; | 
|         return this; | 
|     }; | 
|     PathProxy.prototype.fill = function (ctx) { | 
|         ctx && ctx.fill(); | 
|         this.toStatic(); | 
|     }; | 
|     PathProxy.prototype.stroke = function (ctx) { | 
|         ctx && ctx.stroke(); | 
|         this.toStatic(); | 
|     }; | 
|     PathProxy.prototype.len = function () { | 
|         return this._len; | 
|     }; | 
|     PathProxy.prototype.setData = function (data) { | 
|         var len = data.length; | 
|         if (!(this.data && this.data.length === len) && hasTypedArray) { | 
|             this.data = new Float32Array(len); | 
|         } | 
|         for (var i = 0; i < len; i++) { | 
|             this.data[i] = data[i]; | 
|         } | 
|         this._len = len; | 
|     }; | 
|     PathProxy.prototype.appendPath = function (path) { | 
|         if (!(path instanceof Array)) { | 
|             path = [path]; | 
|         } | 
|         var len = path.length; | 
|         var appendSize = 0; | 
|         var offset = this._len; | 
|         for (var i = 0; i < len; i++) { | 
|             appendSize += path[i].len(); | 
|         } | 
|         if (hasTypedArray && (this.data instanceof Float32Array)) { | 
|             this.data = new Float32Array(offset + appendSize); | 
|         } | 
|         for (var i = 0; i < len; i++) { | 
|             var appendPathData = path[i].data; | 
|             for (var k = 0; k < appendPathData.length; k++) { | 
|                 this.data[offset++] = appendPathData[k]; | 
|             } | 
|         } | 
|         this._len = offset; | 
|     }; | 
|     PathProxy.prototype.addData = function (cmd, a, b, c, d, e, f, g, h) { | 
|         if (!this._saveData) { | 
|             return; | 
|         } | 
|         var data = this.data; | 
|         if (this._len + arguments.length > data.length) { | 
|             this._expandData(); | 
|             data = this.data; | 
|         } | 
|         for (var i = 0; i < arguments.length; i++) { | 
|             data[this._len++] = arguments[i]; | 
|         } | 
|     }; | 
|     PathProxy.prototype._drawPendingPt = function () { | 
|         if (this._pendingPtDist > 0) { | 
|             this._ctx && this._ctx.lineTo(this._pendingPtX, this._pendingPtY); | 
|             this._pendingPtDist = 0; | 
|         } | 
|     }; | 
|     PathProxy.prototype._expandData = function () { | 
|         if (!(this.data instanceof Array)) { | 
|             var newData = []; | 
|             for (var i = 0; i < this._len; i++) { | 
|                 newData[i] = this.data[i]; | 
|             } | 
|             this.data = newData; | 
|         } | 
|     }; | 
|     PathProxy.prototype.toStatic = function () { | 
|         if (!this._saveData) { | 
|             return; | 
|         } | 
|         this._drawPendingPt(); | 
|         var data = this.data; | 
|         if (data instanceof Array) { | 
|             data.length = this._len; | 
|             if (hasTypedArray && this._len > 11) { | 
|                 this.data = new Float32Array(data); | 
|             } | 
|         } | 
|     }; | 
|     PathProxy.prototype.getBoundingRect = function () { | 
|         min[0] = min[1] = min2[0] = min2[1] = Number.MAX_VALUE; | 
|         max[0] = max[1] = max2[0] = max2[1] = -Number.MAX_VALUE; | 
|         var data = this.data; | 
|         var xi = 0; | 
|         var yi = 0; | 
|         var x0 = 0; | 
|         var y0 = 0; | 
|         var i; | 
|         for (i = 0; i < this._len;) { | 
|             var cmd = data[i++]; | 
|             var isFirst = i === 1; | 
|             if (isFirst) { | 
|                 xi = data[i]; | 
|                 yi = data[i + 1]; | 
|                 x0 = xi; | 
|                 y0 = yi; | 
|             } | 
|             switch (cmd) { | 
|                 case CMD.M: | 
|                     xi = x0 = data[i++]; | 
|                     yi = y0 = data[i++]; | 
|                     min2[0] = x0; | 
|                     min2[1] = y0; | 
|                     max2[0] = x0; | 
|                     max2[1] = y0; | 
|                     break; | 
|                 case CMD.L: | 
|                     fromLine(xi, yi, data[i], data[i + 1], min2, max2); | 
|                     xi = data[i++]; | 
|                     yi = data[i++]; | 
|                     break; | 
|                 case CMD.C: | 
|                     fromCubic(xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], min2, max2); | 
|                     xi = data[i++]; | 
|                     yi = data[i++]; | 
|                     break; | 
|                 case CMD.Q: | 
|                     fromQuadratic(xi, yi, data[i++], data[i++], data[i], data[i + 1], min2, max2); | 
|                     xi = data[i++]; | 
|                     yi = data[i++]; | 
|                     break; | 
|                 case CMD.A: | 
|                     var cx = data[i++]; | 
|                     var cy = data[i++]; | 
|                     var rx = data[i++]; | 
|                     var ry = data[i++]; | 
|                     var startAngle = data[i++]; | 
|                     var endAngle = data[i++] + startAngle; | 
|                     i += 1; | 
|                     var anticlockwise = !data[i++]; | 
|                     if (isFirst) { | 
|                         x0 = mathCos(startAngle) * rx + cx; | 
|                         y0 = mathSin(startAngle) * ry + cy; | 
|                     } | 
|                     fromArc(cx, cy, rx, ry, startAngle, endAngle, anticlockwise, min2, max2); | 
|                     xi = mathCos(endAngle) * rx + cx; | 
|                     yi = mathSin(endAngle) * ry + cy; | 
|                     break; | 
|                 case CMD.R: | 
|                     x0 = xi = data[i++]; | 
|                     y0 = yi = data[i++]; | 
|                     var width = data[i++]; | 
|                     var height = data[i++]; | 
|                     fromLine(x0, y0, x0 + width, y0 + height, min2, max2); | 
|                     break; | 
|                 case CMD.Z: | 
|                     xi = x0; | 
|                     yi = y0; | 
|                     break; | 
|             } | 
|             vec2.min(min, min, min2); | 
|             vec2.max(max, max, max2); | 
|         } | 
|         if (i === 0) { | 
|             min[0] = min[1] = max[0] = max[1] = 0; | 
|         } | 
|         return new BoundingRect(min[0], min[1], max[0] - min[0], max[1] - min[1]); | 
|     }; | 
|     PathProxy.prototype._calculateLength = function () { | 
|         var data = this.data; | 
|         var len = this._len; | 
|         var ux = this._ux; | 
|         var uy = this._uy; | 
|         var xi = 0; | 
|         var yi = 0; | 
|         var x0 = 0; | 
|         var y0 = 0; | 
|         if (!this._pathSegLen) { | 
|             this._pathSegLen = []; | 
|         } | 
|         var pathSegLen = this._pathSegLen; | 
|         var pathTotalLen = 0; | 
|         var segCount = 0; | 
|         for (var i = 0; i < len;) { | 
|             var cmd = data[i++]; | 
|             var isFirst = i === 1; | 
|             if (isFirst) { | 
|                 xi = data[i]; | 
|                 yi = data[i + 1]; | 
|                 x0 = xi; | 
|                 y0 = yi; | 
|             } | 
|             var l = -1; | 
|             switch (cmd) { | 
|                 case CMD.M: | 
|                     xi = x0 = data[i++]; | 
|                     yi = y0 = data[i++]; | 
|                     break; | 
|                 case CMD.L: { | 
|                     var x2 = data[i++]; | 
|                     var y2 = data[i++]; | 
|                     var dx = x2 - xi; | 
|                     var dy = y2 - yi; | 
|                     if (mathAbs(dx) > ux || mathAbs(dy) > uy || i === len - 1) { | 
|                         l = Math.sqrt(dx * dx + dy * dy); | 
|                         xi = x2; | 
|                         yi = y2; | 
|                     } | 
|                     break; | 
|                 } | 
|                 case CMD.C: { | 
|                     var x1 = data[i++]; | 
|                     var y1 = data[i++]; | 
|                     var x2 = data[i++]; | 
|                     var y2 = data[i++]; | 
|                     var x3 = data[i++]; | 
|                     var y3 = data[i++]; | 
|                     l = cubicLength(xi, yi, x1, y1, x2, y2, x3, y3, 10); | 
|                     xi = x3; | 
|                     yi = y3; | 
|                     break; | 
|                 } | 
|                 case CMD.Q: { | 
|                     var x1 = data[i++]; | 
|                     var y1 = data[i++]; | 
|                     var x2 = data[i++]; | 
|                     var y2 = data[i++]; | 
|                     l = quadraticLength(xi, yi, x1, y1, x2, y2, 10); | 
|                     xi = x2; | 
|                     yi = y2; | 
|                     break; | 
|                 } | 
|                 case CMD.A: | 
|                     var cx = data[i++]; | 
|                     var cy = data[i++]; | 
|                     var rx = data[i++]; | 
|                     var ry = data[i++]; | 
|                     var startAngle = data[i++]; | 
|                     var delta = data[i++]; | 
|                     var endAngle = delta + startAngle; | 
|                     i += 1; | 
|                     if (isFirst) { | 
|                         x0 = mathCos(startAngle) * rx + cx; | 
|                         y0 = mathSin(startAngle) * ry + cy; | 
|                     } | 
|                     l = mathMax(rx, ry) * mathMin(PI2, Math.abs(delta)); | 
|                     xi = mathCos(endAngle) * rx + cx; | 
|                     yi = mathSin(endAngle) * ry + cy; | 
|                     break; | 
|                 case CMD.R: { | 
|                     x0 = xi = data[i++]; | 
|                     y0 = yi = data[i++]; | 
|                     var width = data[i++]; | 
|                     var height = data[i++]; | 
|                     l = width * 2 + height * 2; | 
|                     break; | 
|                 } | 
|                 case CMD.Z: { | 
|                     var dx = x0 - xi; | 
|                     var dy = y0 - yi; | 
|                     l = Math.sqrt(dx * dx + dy * dy); | 
|                     xi = x0; | 
|                     yi = y0; | 
|                     break; | 
|                 } | 
|             } | 
|             if (l >= 0) { | 
|                 pathSegLen[segCount++] = l; | 
|                 pathTotalLen += l; | 
|             } | 
|         } | 
|         this._pathLen = pathTotalLen; | 
|         return pathTotalLen; | 
|     }; | 
|     PathProxy.prototype.rebuildPath = function (ctx, percent) { | 
|         var d = this.data; | 
|         var ux = this._ux; | 
|         var uy = this._uy; | 
|         var len = this._len; | 
|         var x0; | 
|         var y0; | 
|         var xi; | 
|         var yi; | 
|         var x; | 
|         var y; | 
|         var drawPart = percent < 1; | 
|         var pathSegLen; | 
|         var pathTotalLen; | 
|         var accumLength = 0; | 
|         var segCount = 0; | 
|         var displayedLength; | 
|         var pendingPtDist = 0; | 
|         var pendingPtX; | 
|         var pendingPtY; | 
|         if (drawPart) { | 
|             if (!this._pathSegLen) { | 
|                 this._calculateLength(); | 
|             } | 
|             pathSegLen = this._pathSegLen; | 
|             pathTotalLen = this._pathLen; | 
|             displayedLength = percent * pathTotalLen; | 
|             if (!displayedLength) { | 
|                 return; | 
|             } | 
|         } | 
|         lo: for (var i = 0; i < len;) { | 
|             var cmd = d[i++]; | 
|             var isFirst = i === 1; | 
|             if (isFirst) { | 
|                 xi = d[i]; | 
|                 yi = d[i + 1]; | 
|                 x0 = xi; | 
|                 y0 = yi; | 
|             } | 
|             if (cmd !== CMD.L && pendingPtDist > 0) { | 
|                 ctx.lineTo(pendingPtX, pendingPtY); | 
|                 pendingPtDist = 0; | 
|             } | 
|             switch (cmd) { | 
|                 case CMD.M: | 
|                     x0 = xi = d[i++]; | 
|                     y0 = yi = d[i++]; | 
|                     ctx.moveTo(xi, yi); | 
|                     break; | 
|                 case CMD.L: { | 
|                     x = d[i++]; | 
|                     y = d[i++]; | 
|                     var dx = mathAbs(x - xi); | 
|                     var dy = mathAbs(y - yi); | 
|                     if (dx > ux || dy > uy) { | 
|                         if (drawPart) { | 
|                             var l = pathSegLen[segCount++]; | 
|                             if (accumLength + l > displayedLength) { | 
|                                 var t = (displayedLength - accumLength) / l; | 
|                                 ctx.lineTo(xi * (1 - t) + x * t, yi * (1 - t) + y * t); | 
|                                 break lo; | 
|                             } | 
|                             accumLength += l; | 
|                         } | 
|                         ctx.lineTo(x, y); | 
|                         xi = x; | 
|                         yi = y; | 
|                         pendingPtDist = 0; | 
|                     } | 
|                     else { | 
|                         var d2 = dx * dx + dy * dy; | 
|                         if (d2 > pendingPtDist) { | 
|                             pendingPtX = x; | 
|                             pendingPtY = y; | 
|                             pendingPtDist = d2; | 
|                         } | 
|                     } | 
|                     break; | 
|                 } | 
|                 case CMD.C: { | 
|                     var x1 = d[i++]; | 
|                     var y1 = d[i++]; | 
|                     var x2 = d[i++]; | 
|                     var y2 = d[i++]; | 
|                     var x3 = d[i++]; | 
|                     var y3 = d[i++]; | 
|                     if (drawPart) { | 
|                         var l = pathSegLen[segCount++]; | 
|                         if (accumLength + l > displayedLength) { | 
|                             var t = (displayedLength - accumLength) / l; | 
|                             cubicSubdivide(xi, x1, x2, x3, t, tmpOutX); | 
|                             cubicSubdivide(yi, y1, y2, y3, t, tmpOutY); | 
|                             ctx.bezierCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2], tmpOutX[3], tmpOutY[3]); | 
|                             break lo; | 
|                         } | 
|                         accumLength += l; | 
|                     } | 
|                     ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); | 
|                     xi = x3; | 
|                     yi = y3; | 
|                     break; | 
|                 } | 
|                 case CMD.Q: { | 
|                     var x1 = d[i++]; | 
|                     var y1 = d[i++]; | 
|                     var x2 = d[i++]; | 
|                     var y2 = d[i++]; | 
|                     if (drawPart) { | 
|                         var l = pathSegLen[segCount++]; | 
|                         if (accumLength + l > displayedLength) { | 
|                             var t = (displayedLength - accumLength) / l; | 
|                             quadraticSubdivide(xi, x1, x2, t, tmpOutX); | 
|                             quadraticSubdivide(yi, y1, y2, t, tmpOutY); | 
|                             ctx.quadraticCurveTo(tmpOutX[1], tmpOutY[1], tmpOutX[2], tmpOutY[2]); | 
|                             break lo; | 
|                         } | 
|                         accumLength += l; | 
|                     } | 
|                     ctx.quadraticCurveTo(x1, y1, x2, y2); | 
|                     xi = x2; | 
|                     yi = y2; | 
|                     break; | 
|                 } | 
|                 case CMD.A: | 
|                     var cx = d[i++]; | 
|                     var cy = d[i++]; | 
|                     var rx = d[i++]; | 
|                     var ry = d[i++]; | 
|                     var startAngle = d[i++]; | 
|                     var delta = d[i++]; | 
|                     var psi = d[i++]; | 
|                     var anticlockwise = !d[i++]; | 
|                     var r = (rx > ry) ? rx : ry; | 
|                     var isEllipse = mathAbs(rx - ry) > 1e-3; | 
|                     var endAngle = startAngle + delta; | 
|                     var breakBuild = false; | 
|                     if (drawPart) { | 
|                         var l = pathSegLen[segCount++]; | 
|                         if (accumLength + l > displayedLength) { | 
|                             endAngle = startAngle + delta * (displayedLength - accumLength) / l; | 
|                             breakBuild = true; | 
|                         } | 
|                         accumLength += l; | 
|                     } | 
|                     if (isEllipse && ctx.ellipse) { | 
|                         ctx.ellipse(cx, cy, rx, ry, psi, startAngle, endAngle, anticlockwise); | 
|                     } | 
|                     else { | 
|                         ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); | 
|                     } | 
|                     if (breakBuild) { | 
|                         break lo; | 
|                     } | 
|                     if (isFirst) { | 
|                         x0 = mathCos(startAngle) * rx + cx; | 
|                         y0 = mathSin(startAngle) * ry + cy; | 
|                     } | 
|                     xi = mathCos(endAngle) * rx + cx; | 
|                     yi = mathSin(endAngle) * ry + cy; | 
|                     break; | 
|                 case CMD.R: | 
|                     x0 = xi = d[i]; | 
|                     y0 = yi = d[i + 1]; | 
|                     x = d[i++]; | 
|                     y = d[i++]; | 
|                     var width = d[i++]; | 
|                     var height = d[i++]; | 
|                     if (drawPart) { | 
|                         var l = pathSegLen[segCount++]; | 
|                         if (accumLength + l > displayedLength) { | 
|                             var d_1 = displayedLength - accumLength; | 
|                             ctx.moveTo(x, y); | 
|                             ctx.lineTo(x + mathMin(d_1, width), y); | 
|                             d_1 -= width; | 
|                             if (d_1 > 0) { | 
|                                 ctx.lineTo(x + width, y + mathMin(d_1, height)); | 
|                             } | 
|                             d_1 -= height; | 
|                             if (d_1 > 0) { | 
|                                 ctx.lineTo(x + mathMax(width - d_1, 0), y + height); | 
|                             } | 
|                             d_1 -= width; | 
|                             if (d_1 > 0) { | 
|                                 ctx.lineTo(x, y + mathMax(height - d_1, 0)); | 
|                             } | 
|                             break lo; | 
|                         } | 
|                         accumLength += l; | 
|                     } | 
|                     ctx.rect(x, y, width, height); | 
|                     break; | 
|                 case CMD.Z: | 
|                     if (drawPart) { | 
|                         var l = pathSegLen[segCount++]; | 
|                         if (accumLength + l > displayedLength) { | 
|                             var t = (displayedLength - accumLength) / l; | 
|                             ctx.lineTo(xi * (1 - t) + x0 * t, yi * (1 - t) + y0 * t); | 
|                             break lo; | 
|                         } | 
|                         accumLength += l; | 
|                     } | 
|                     ctx.closePath(); | 
|                     xi = x0; | 
|                     yi = y0; | 
|             } | 
|         } | 
|     }; | 
|     PathProxy.prototype.clone = function () { | 
|         var newProxy = new PathProxy(); | 
|         var data = this.data; | 
|         newProxy.data = data.slice ? data.slice() | 
|             : Array.prototype.slice.call(data); | 
|         newProxy._len = this._len; | 
|         return newProxy; | 
|     }; | 
|     PathProxy.CMD = CMD; | 
|     PathProxy.initDefaultProps = (function () { | 
|         var proto = PathProxy.prototype; | 
|         proto._saveData = true; | 
|         proto._ux = 0; | 
|         proto._uy = 0; | 
|         proto._pendingPtDist = 0; | 
|         proto._version = 0; | 
|     })(); | 
|     return PathProxy; | 
| }()); | 
| export default PathProxy; |