UNPKG

@krisdages/d3-path

Version:

Serialize Canvas path commands to SVG.

1 lines 7.87 kB
{"version":3,"file":"d3-path.min.cjs","sources":["../src/path.js"],"sourcesContent":["const pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n"],"names":["pi","Math","PI","tau","tauEpsilon","Path","this","_x0","_y0","_x1","_y1","_","path","prototype","constructor","moveTo","x","y","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","r","x0","y0","x21","y21","x01","y01","l01_2","Error","abs","x20","y20","l21_2","l20_2","l21","sqrt","l01","l","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","toString"],"mappings":"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"}