dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
128 lines (121 loc) • 15.8 kB
JavaScript
/**
* @license
* Copyright 2011 Dan Vanderkam (danvdk@gmail.com)
* MIT-licenced: https://opensource.org/licenses/MIT
*/
/**
* @fileoverview
* Including this file will add several additional shapes to Dygraph.Circles
* which can be passed to drawPointCallback.
* See tests/custom-circles.html for usage.
*/
/* loader wrapper to allow browser use and ES6 imports */
(function _extras_shapes_closure() {
'use strict';
var Dygraph;
if (window.Dygraph) {
Dygraph = window.Dygraph;
} else if (typeof module !== 'undefined') {
Dygraph = require('../dygraph');
if (typeof Dygraph.NAME === 'undefined' && typeof Dygraph["default"] !== 'undefined') Dygraph = Dygraph["default"];
}
/* end of loader wrapper header */
/**
* @param {!CanvasRenderingContext2D} ctx the canvas context
* @param {number} sides the number of sides in the shape.
* @param {number} radius the radius of the image.
* @param {number} cx center x coordate
* @param {number} cy center y coordinate
* @param {number=} rotationRadians the shift of the initial angle, in radians.
* @param {number=} delta the angle shift for each line. If missing, creates a
* regular polygon.
*/
var regularShape = function regularShape(ctx, sides, radius, cx, cy, rotationRadians, delta) {
rotationRadians = rotationRadians || 0;
delta = delta || Math.PI * 2 / sides;
ctx.beginPath();
var initialAngle = rotationRadians;
var angle = initialAngle;
var computeCoordinates = function computeCoordinates() {
var x = cx + Math.sin(angle) * radius;
var y = cy + -Math.cos(angle) * radius;
return [x, y];
};
var initialCoordinates = computeCoordinates();
var x = initialCoordinates[0];
var y = initialCoordinates[1];
ctx.moveTo(x, y);
for (var idx = 0; idx < sides; idx++) {
angle = idx == sides - 1 ? initialAngle : angle + delta;
var coords = computeCoordinates();
ctx.lineTo(coords[0], coords[1]);
}
ctx.fill();
ctx.stroke();
};
/**
* TODO(danvk): be more specific on the return type.
* @param {number} sides
* @param {number=} rotationRadians
* @param {number=} delta
* @return {Function}
* @private
*/
var shapeFunction = function shapeFunction(sides, rotationRadians, delta) {
return function shapedFunction(g, name, ctx, cx, cy, color, radius) {
ctx.strokeStyle = color;
ctx.fillStyle = "white";
regularShape(ctx, sides, radius, cx, cy, rotationRadians, delta);
};
};
var customCircles = {
TRIANGLE: shapeFunction(3),
SQUARE: shapeFunction(4, Math.PI / 4),
DIAMOND: shapeFunction(4),
PENTAGON: shapeFunction(5),
HEXAGON: shapeFunction(6),
CIRCLE: function CIRCLE(g, name, ctx, cx, cy, color, radius) {
ctx.beginPath();
ctx.strokeStyle = color;
ctx.fillStyle = "white";
ctx.arc(cx, cy, radius, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
},
STAR: shapeFunction(5, 0, 4 * Math.PI / 5),
PLUS: function PLUS(g, name, ctx, cx, cy, color, radius) {
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(cx + radius, cy);
ctx.lineTo(cx - radius, cy);
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(cx, cy + radius);
ctx.lineTo(cx, cy - radius);
ctx.closePath();
ctx.stroke();
},
EX: function EX(g, name, ctx, cx, cy, color, radius) {
ctx.strokeStyle = color;
ctx.beginPath();
ctx.moveTo(cx + radius, cy + radius);
ctx.lineTo(cx - radius, cy - radius);
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(cx + radius, cy - radius);
ctx.lineTo(cx - radius, cy + radius);
ctx.closePath();
ctx.stroke();
}
};
for (var k in customCircles) {
if (!customCircles.hasOwnProperty(k)) continue;
Dygraph.Circles[k] = customCircles[k];
}
/* closure and loader wrapper */
Dygraph._require.add('dygraphs/src/extras/shapes.js', /* exports */{});
})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0cmFzX3NoYXBlc19jbG9zdXJlIiwiRHlncmFwaCIsIndpbmRvdyIsIm1vZHVsZSIsInJlcXVpcmUiLCJOQU1FIiwicmVndWxhclNoYXBlIiwiY3R4Iiwic2lkZXMiLCJyYWRpdXMiLCJjeCIsImN5Iiwicm90YXRpb25SYWRpYW5zIiwiZGVsdGEiLCJNYXRoIiwiUEkiLCJiZWdpblBhdGgiLCJpbml0aWFsQW5nbGUiLCJhbmdsZSIsImNvbXB1dGVDb29yZGluYXRlcyIsIngiLCJzaW4iLCJ5IiwiY29zIiwiaW5pdGlhbENvb3JkaW5hdGVzIiwibW92ZVRvIiwiaWR4IiwiY29vcmRzIiwibGluZVRvIiwiZmlsbCIsInN0cm9rZSIsInNoYXBlRnVuY3Rpb24iLCJzaGFwZWRGdW5jdGlvbiIsImciLCJuYW1lIiwiY29sb3IiLCJzdHJva2VTdHlsZSIsImZpbGxTdHlsZSIsImN1c3RvbUNpcmNsZXMiLCJUUklBTkdMRSIsIlNRVUFSRSIsIkRJQU1PTkQiLCJQRU5UQUdPTiIsIkhFWEFHT04iLCJDSVJDTEUiLCJhcmMiLCJTVEFSIiwiUExVUyIsImNsb3NlUGF0aCIsIkVYIiwiayIsImhhc093blByb3BlcnR5IiwiQ2lyY2xlcyIsIl9yZXF1aXJlIiwiYWRkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dHJhcy9zaGFwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTEgRGFuIFZhbmRlcmthbSAoZGFudmRrQGdtYWlsLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqL1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIEluY2x1ZGluZyB0aGlzIGZpbGUgd2lsbCBhZGQgc2V2ZXJhbCBhZGRpdGlvbmFsIHNoYXBlcyB0byBEeWdyYXBoLkNpcmNsZXNcbiAqIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gZHJhd1BvaW50Q2FsbGJhY2suXG4gKiBTZWUgdGVzdHMvY3VzdG9tLWNpcmNsZXMuaHRtbCBmb3IgdXNhZ2UuXG4gKi9cblxuLyogbG9hZGVyIHdyYXBwZXIgdG8gYWxsb3cgYnJvd3NlciB1c2UgYW5kIEVTNiBpbXBvcnRzICovXG4oZnVuY3Rpb24gX2V4dHJhc19zaGFwZXNfY2xvc3VyZSgpIHtcbid1c2Ugc3RyaWN0JztcbnZhciBEeWdyYXBoO1xuaWYgKHdpbmRvdy5EeWdyYXBoKSB7XG4gIER5Z3JhcGggPSB3aW5kb3cuRHlncmFwaDtcbn0gZWxzZSBpZiAodHlwZW9mKG1vZHVsZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gIER5Z3JhcGggPSByZXF1aXJlKCcuLi9keWdyYXBoJyk7XG4gIGlmICh0eXBlb2YoRHlncmFwaC5OQU1FKSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mKER5Z3JhcGguZGVmYXVsdCkgIT09ICd1bmRlZmluZWQnKVxuICAgIER5Z3JhcGggPSBEeWdyYXBoLmRlZmF1bHQ7XG59XG4vKiBlbmQgb2YgbG9hZGVyIHdyYXBwZXIgaGVhZGVyICovXG5cbi8qKlxuICogQHBhcmFtIHshQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggdGhlIGNhbnZhcyBjb250ZXh0XG4gKiBAcGFyYW0ge251bWJlcn0gc2lkZXMgdGhlIG51bWJlciBvZiBzaWRlcyBpbiB0aGUgc2hhcGUuXG4gKiBAcGFyYW0ge251bWJlcn0gcmFkaXVzIHRoZSByYWRpdXMgb2YgdGhlIGltYWdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGN4IGNlbnRlciB4IGNvb3JkYXRlXG4gKiBAcGFyYW0ge251bWJlcn0gY3kgY2VudGVyIHkgY29vcmRpbmF0ZVxuICogQHBhcmFtIHtudW1iZXI9fSByb3RhdGlvblJhZGlhbnMgdGhlIHNoaWZ0IG9mIHRoZSBpbml0aWFsIGFuZ2xlLCBpbiByYWRpYW5zLlxuICogQHBhcmFtIHtudW1iZXI9fSBkZWx0YSB0aGUgYW5nbGUgc2hpZnQgZm9yIGVhY2ggbGluZS4gSWYgbWlzc2luZywgY3JlYXRlcyBhXG4gKiAgICAgcmVndWxhciBwb2x5Z29uLlxuICovXG52YXIgcmVndWxhclNoYXBlID0gZnVuY3Rpb24gcmVndWxhclNoYXBlKFxuICAgIGN0eCwgc2lkZXMsIHJhZGl1cywgY3gsIGN5LCByb3RhdGlvblJhZGlhbnMsIGRlbHRhKSB7XG4gIHJvdGF0aW9uUmFkaWFucyA9IHJvdGF0aW9uUmFkaWFucyB8fCAwO1xuICBkZWx0YSA9IGRlbHRhIHx8IE1hdGguUEkgKiAyIC8gc2lkZXM7XG5cbiAgY3R4LmJlZ2luUGF0aCgpO1xuICB2YXIgaW5pdGlhbEFuZ2xlID0gcm90YXRpb25SYWRpYW5zO1xuICB2YXIgYW5nbGUgPSBpbml0aWFsQW5nbGU7XG5cbiAgdmFyIGNvbXB1dGVDb29yZGluYXRlcyA9IGZ1bmN0aW9uIGNvbXB1dGVDb29yZGluYXRlcygpIHtcbiAgICB2YXIgeCA9IGN4ICsgKE1hdGguc2luKGFuZ2xlKSAqIHJhZGl1cyk7XG4gICAgdmFyIHkgPSBjeSArICgtTWF0aC5jb3MoYW5nbGUpICogcmFkaXVzKTtcbiAgICByZXR1cm4gW3gsIHldO1xuICB9O1xuXG4gIHZhciBpbml0aWFsQ29vcmRpbmF0ZXMgPSBjb21wdXRlQ29vcmRpbmF0ZXMoKTtcbiAgdmFyIHggPSBpbml0aWFsQ29vcmRpbmF0ZXNbMF07XG4gIHZhciB5ID0gaW5pdGlhbENvb3JkaW5hdGVzWzFdO1xuICBjdHgubW92ZVRvKHgsIHkpO1xuXG4gIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IHNpZGVzOyBpZHgrKykge1xuICAgIGFuZ2xlID0gKGlkeCA9PSBzaWRlcyAtIDEpID8gaW5pdGlhbEFuZ2xlIDogKGFuZ2xlICsgZGVsdGEpO1xuICAgIHZhciBjb29yZHMgPSBjb21wdXRlQ29vcmRpbmF0ZXMoKTtcbiAgICBjdHgubGluZVRvKGNvb3Jkc1swXSwgY29vcmRzWzFdKTtcbiAgfVxuICBjdHguZmlsbCgpO1xuICBjdHguc3Ryb2tlKCk7XG59O1xuXG4vKipcbiAqIFRPRE8oZGFudmspOiBiZSBtb3JlIHNwZWNpZmljIG9uIHRoZSByZXR1cm4gdHlwZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaWRlc1xuICogQHBhcmFtIHtudW1iZXI9fSByb3RhdGlvblJhZGlhbnNcbiAqIEBwYXJhbSB7bnVtYmVyPX0gZGVsdGFcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufVxuICogQHByaXZhdGVcbiAqL1xudmFyIHNoYXBlRnVuY3Rpb24gPSBmdW5jdGlvbiBzaGFwZUZ1bmN0aW9uKHNpZGVzLCByb3RhdGlvblJhZGlhbnMsIGRlbHRhKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzaGFwZWRGdW5jdGlvbihnLCBuYW1lLCBjdHgsIGN4LCBjeSwgY29sb3IsIHJhZGl1cykge1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XG4gICAgcmVndWxhclNoYXBlKGN0eCwgc2lkZXMsIHJhZGl1cywgY3gsIGN5LCByb3RhdGlvblJhZGlhbnMsIGRlbHRhKTtcbiAgfTtcbn07XG5cbnZhciBjdXN0b21DaXJjbGVzID0ge1xuICBUUklBTkdMRSA6IHNoYXBlRnVuY3Rpb24oMyksXG4gIFNRVUFSRSA6IHNoYXBlRnVuY3Rpb24oNCwgTWF0aC5QSSAvIDQpLFxuICBESUFNT05EIDogc2hhcGVGdW5jdGlvbig0KSxcbiAgUEVOVEFHT04gOiBzaGFwZUZ1bmN0aW9uKDUpLFxuICBIRVhBR09OIDogc2hhcGVGdW5jdGlvbig2KSxcbiAgQ0lSQ0xFIDogZnVuY3Rpb24gQ0lSQ0xFKGcsIG5hbWUsIGN0eCwgY3gsIGN5LCBjb2xvciwgcmFkaXVzKSB7XG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgIGN0eC5maWxsU3R5bGUgPSBcIndoaXRlXCI7XG4gICAgY3R4LmFyYyhjeCwgY3ksIHJhZGl1cywgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgICBjdHguZmlsbCgpO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfSxcbiAgU1RBUiA6IHNoYXBlRnVuY3Rpb24oNSwgMCwgNCAqIE1hdGguUEkgLyA1KSxcbiAgUExVUyA6IGZ1bmN0aW9uIFBMVVMoZywgbmFtZSwgY3R4LCBjeCwgY3ksIGNvbG9yLCByYWRpdXMpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKGN4ICsgcmFkaXVzLCBjeSk7XG4gICAgY3R4LmxpbmVUbyhjeCAtIHJhZGl1cywgY3kpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4Lm1vdmVUbyhjeCwgY3kgKyByYWRpdXMpO1xuICAgIGN0eC5saW5lVG8oY3gsIGN5IC0gcmFkaXVzKTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9LFxuICBFWCA6IGZ1bmN0aW9uIEVYKGcsIG5hbWUsIGN0eCwgY3gsIGN5LCBjb2xvciwgcmFkaXVzKSB7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4Lm1vdmVUbyhjeCArIHJhZGl1cywgY3kgKyByYWRpdXMpO1xuICAgIGN0eC5saW5lVG8oY3ggLSByYWRpdXMsIGN5IC0gcmFkaXVzKTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LnN0cm9rZSgpO1xuXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5tb3ZlVG8oY3ggKyByYWRpdXMsIGN5IC0gcmFkaXVzKTtcbiAgICBjdHgubGluZVRvKGN4IC0gcmFkaXVzLCBjeSArIHJhZGl1cyk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5zdHJva2UoKTtcbiAgfVxufTtcblxuZm9yICh2YXIgayBpbiBjdXN0b21DaXJjbGVzKSB7XG4gIGlmICghY3VzdG9tQ2lyY2xlcy5oYXNPd25Qcm9wZXJ0eShrKSkgY29udGludWU7XG4gIER5Z3JhcGguQ2lyY2xlc1trXSA9IGN1c3RvbUNpcmNsZXNba107XG59XG5cbi8qIGNsb3N1cmUgYW5kIGxvYWRlciB3cmFwcGVyICovXG5EeWdyYXBoLl9yZXF1aXJlLmFkZCgnZHlncmFwaHMvc3JjL2V4dHJhcy9zaGFwZXMuanMnLCAvKiBleHBvcnRzICovIHt9KTtcbn0pKCk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxDQUFDLFNBQVNBLHNCQUFzQixHQUFHO0VBQ25DLFlBQVk7O0VBQ1osSUFBSUMsT0FBTztFQUNYLElBQUlDLE1BQU0sQ0FBQ0QsT0FBTyxFQUFFO0lBQ2xCQSxPQUFPLEdBQUdDLE1BQU0sQ0FBQ0QsT0FBTztFQUMxQixDQUFDLE1BQU0sSUFBSSxPQUFPRSxNQUFPLEtBQUssV0FBVyxFQUFFO0lBQ3pDRixPQUFPLEdBQUdHLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDL0IsSUFBSSxPQUFPSCxPQUFPLENBQUNJLElBQUssS0FBSyxXQUFXLElBQUksT0FBT0osT0FBTyxXQUFTLEtBQUssV0FBVyxFQUNqRkEsT0FBTyxHQUFHQSxPQUFPLFdBQVE7RUFDN0I7RUFDQTs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNBLElBQUlLLFlBQVksR0FBRyxTQUFTQSxZQUFZLENBQ3BDQyxHQUFHLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsZUFBZSxFQUFFQyxLQUFLLEVBQUU7SUFDdERELGVBQWUsR0FBR0EsZUFBZSxJQUFJLENBQUM7SUFDdENDLEtBQUssR0FBR0EsS0FBSyxJQUFJQyxJQUFJLENBQUNDLEVBQUUsR0FBRyxDQUFDLEdBQUdQLEtBQUs7SUFFcENELEdBQUcsQ0FBQ1MsU0FBUyxFQUFFO0lBQ2YsSUFBSUMsWUFBWSxHQUFHTCxlQUFlO0lBQ2xDLElBQUlNLEtBQUssR0FBR0QsWUFBWTtJQUV4QixJQUFJ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
;