| function d3_geo_pathBuffer() { | |
| var pointCircle = d3_geo_pathBufferCircle(4.5), | |
| buffer = []; | |
| var stream = { | |
| point: point, | |
| // While inside a line, override point to moveTo then lineTo. | |
| lineStart: function() { stream.point = pointLineStart; }, | |
| lineEnd: lineEnd, | |
| // While inside a polygon, override lineEnd to closePath. | |
| polygonStart: function() { stream.lineEnd = lineEndPolygon; }, | |
| polygonEnd: function() { stream.lineEnd = lineEnd; stream.point = point; }, | |
| pointRadius: function(_) { | |
| pointCircle = d3_geo_pathBufferCircle(_); | |
| return stream; | |
| }, | |
| result: function() { | |
| if (buffer.length) { | |
| var result = buffer.join(""); | |
| buffer = []; | |
| return result; | |
| } | |
| } | |
| }; | |
| function point(x, y) { | |
| buffer.push("M", x, ",", y, pointCircle); | |
| } | |
| function pointLineStart(x, y) { | |
| buffer.push("M", x, ",", y); | |
| stream.point = pointLine; | |
| } | |
| function pointLine(x, y) { | |
| buffer.push("L", x, ",", y); | |
| } | |
| function lineEnd() { | |
| stream.point = point; | |
| } | |
| function lineEndPolygon() { | |
| buffer.push("Z"); | |
| } | |
| return stream; | |
| } | |
| function d3_geo_pathBufferCircle(radius) { | |
| return "m0," + radius | |
| + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius | |
| + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius | |
| + "z"; | |
| } |