dygraphs
Version:
dygraphs is a fast, flexible open source JavaScript charting library.
128 lines (121 loc) • 16 kB
JavaScript
;
/**
* @license
* Copyright 2011 Dan Vanderkam (danvdk@gmail.com)
* MIT-licenced: https://opensource.org/license/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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0cmFzX3NoYXBlc19jbG9zdXJlIiwiRHlncmFwaCIsIndpbmRvdyIsIm1vZHVsZSIsInJlcXVpcmUiLCJOQU1FIiwicmVndWxhclNoYXBlIiwiY3R4Iiwic2lkZXMiLCJyYWRpdXMiLCJjeCIsImN5Iiwicm90YXRpb25SYWRpYW5zIiwiZGVsdGEiLCJNYXRoIiwiUEkiLCJiZWdpblBhdGgiLCJpbml0aWFsQW5nbGUiLCJhbmdsZSIsImNvbXB1dGVDb29yZGluYXRlcyIsIngiLCJzaW4iLCJ5IiwiY29zIiwiaW5pdGlhbENvb3JkaW5hdGVzIiwibW92ZVRvIiwiaWR4IiwiY29vcmRzIiwibGluZVRvIiwiZmlsbCIsInN0cm9rZSIsInNoYXBlRnVuY3Rpb24iLCJzaGFwZWRGdW5jdGlvbiIsImciLCJuYW1lIiwiY29sb3IiLCJzdHJva2VTdHlsZSIsImZpbGxTdHlsZSIsImN1c3RvbUNpcmNsZXMiLCJUUklBTkdMRSIsIlNRVUFSRSIsIkRJQU1PTkQiLCJQRU5UQUdPTiIsIkhFWEFHT04iLCJDSVJDTEUiLCJhcmMiLCJTVEFSIiwiUExVUyIsImNsb3NlUGF0aCIsIkVYIiwiayIsImhhc093blByb3BlcnR5IiwiQ2lyY2xlcyIsIl9yZXF1aXJlIiwiYWRkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4dHJhcy9zaGFwZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTEgRGFuIFZhbmRlcmthbSAoZGFudmRrQGdtYWlsLmNvbSlcbiAqIE1JVC1saWNlbmNlZDogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlL01JVFxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlld1xuICogSW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIGFkZCBzZXZlcmFsIGFkZGl0aW9uYWwgc2hhcGVzIHRvIER5Z3JhcGguQ2lyY2xlc1xuICogd2hpY2ggY2FuIGJlIHBhc3NlZCB0byBkcmF3UG9pbnRDYWxsYmFjay5cbiAqIFNlZSB0ZXN0cy9jdXN0b20tY2lyY2xlcy5odG1sIGZvciB1c2FnZS5cbiAqL1xuXG4vKiBsb2FkZXIgd3JhcHBlciB0byBhbGxvdyBicm93c2VyIHVzZSBhbmQgRVM2IGltcG9ydHMgKi9cbihmdW5jdGlvbiBfZXh0cmFzX3NoYXBlc19jbG9zdXJlKCkge1xuJ3VzZSBzdHJpY3QnO1xudmFyIER5Z3JhcGg7XG5pZiAod2luZG93LkR5Z3JhcGgpIHtcbiAgRHlncmFwaCA9IHdpbmRvdy5EeWdyYXBoO1xufSBlbHNlIGlmICh0eXBlb2YobW9kdWxlKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgRHlncmFwaCA9IHJlcXVpcmUoJy4uL2R5Z3JhcGgnKTtcbiAgaWYgKHR5cGVvZihEeWdyYXBoLk5BTUUpID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YoRHlncmFwaC5kZWZhdWx0KSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgRHlncmFwaCA9IER5Z3JhcGguZGVmYXVsdDtcbn1cbi8qIGVuZCBvZiBsb2FkZXIgd3JhcHBlciBoZWFkZXIgKi9cblxuLyoqXG4gKiBAcGFyYW0geyFDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGN0eCB0aGUgY2FudmFzIGNvbnRleHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaWRlcyB0aGUgbnVtYmVyIG9mIHNpZGVzIGluIHRoZSBzaGFwZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSByYWRpdXMgdGhlIHJhZGl1cyBvZiB0aGUgaW1hZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gY3ggY2VudGVyIHggY29vcmRhdGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBjeSBjZW50ZXIgeSBjb29yZGluYXRlXG4gKiBAcGFyYW0ge251bWJlcj19IHJvdGF0aW9uUmFkaWFucyB0aGUgc2hpZnQgb2YgdGhlIGluaXRpYWwgYW5nbGUsIGluIHJhZGlhbnMuXG4gKiBAcGFyYW0ge251bWJlcj19IGRlbHRhIHRoZSBhbmdsZSBzaGlmdCBmb3IgZWFjaCBsaW5lLiBJZiBtaXNzaW5nLCBjcmVhdGVzIGFcbiAqICAgICByZWd1bGFyIHBvbHlnb24uXG4gKi9cbnZhciByZWd1bGFyU2hhcGUgPSBmdW5jdGlvbiByZWd1bGFyU2hhcGUoXG4gICAgY3R4LCBzaWRlcywgcmFkaXVzLCBjeCwgY3ksIHJvdGF0aW9uUmFkaWFucywgZGVsdGEpIHtcbiAgcm90YXRpb25SYWRpYW5zID0gcm90YXRpb25SYWRpYW5zIHx8IDA7XG4gIGRlbHRhID0gZGVsdGEgfHwgTWF0aC5QSSAqIDIgLyBzaWRlcztcblxuICBjdHguYmVnaW5QYXRoKCk7XG4gIHZhciBpbml0aWFsQW5nbGUgPSByb3RhdGlvblJhZGlhbnM7XG4gIHZhciBhbmdsZSA9IGluaXRpYWxBbmdsZTtcblxuICB2YXIgY29tcHV0ZUNvb3JkaW5hdGVzID0gZnVuY3Rpb24gY29tcHV0ZUNvb3JkaW5hdGVzKCkge1xuICAgIHZhciB4ID0gY3ggKyAoTWF0aC5zaW4oYW5nbGUpICogcmFkaXVzKTtcbiAgICB2YXIgeSA9IGN5ICsgKC1NYXRoLmNvcyhhbmdsZSkgKiByYWRpdXMpO1xuICAgIHJldHVybiBbeCwgeV07XG4gIH07XG5cbiAgdmFyIGluaXRpYWxDb29yZGluYXRlcyA9IGNvbXB1dGVDb29yZGluYXRlcygpO1xuICB2YXIgeCA9IGluaXRpYWxDb29yZGluYXRlc1swXTtcbiAgdmFyIHkgPSBpbml0aWFsQ29vcmRpbmF0ZXNbMV07XG4gIGN0eC5tb3ZlVG8oeCwgeSk7XG5cbiAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgc2lkZXM7IGlkeCsrKSB7XG4gICAgYW5nbGUgPSAoaWR4ID09IHNpZGVzIC0gMSkgPyBpbml0aWFsQW5nbGUgOiAoYW5nbGUgKyBkZWx0YSk7XG4gICAgdmFyIGNvb3JkcyA9IGNvbXB1dGVDb29yZGluYXRlcygpO1xuICAgIGN0eC5saW5lVG8oY29vcmRzWzBdLCBjb29yZHNbMV0pO1xuICB9XG4gIGN0eC5maWxsKCk7XG4gIGN0eC5zdHJva2UoKTtcbn07XG5cbi8qKlxuICogVE9ETyhkYW52ayk6IGJlIG1vcmUgc3BlY2lmaWMgb24gdGhlIHJldHVybiB0eXBlLlxuICogQHBhcmFtIHtudW1iZXJ9IHNpZGVzXG4gKiBAcGFyYW0ge251bWJlcj19IHJvdGF0aW9uUmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXI9fSBkZWx0YVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgc2hhcGVGdW5jdGlvbiA9IGZ1bmN0aW9uIHNoYXBlRnVuY3Rpb24oc2lkZXMsIHJvdGF0aW9uUmFkaWFucywgZGVsdGEpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNoYXBlZEZ1bmN0aW9uKGcsIG5hbWUsIGN0eCwgY3gsIGN5LCBjb2xvciwgcmFkaXVzKSB7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgY3R4LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcbiAgICByZWd1bGFyU2hhcGUoY3R4LCBzaWRlcywgcmFkaXVzLCBjeCwgY3ksIHJvdGF0aW9uUmFkaWFucywgZGVsdGEpO1xuICB9O1xufTtcblxudmFyIGN1c3RvbUNpcmNsZXMgPSB7XG4gIFRSSUFOR0xFIDogc2hhcGVGdW5jdGlvbigzKSxcbiAgU1FVQVJFIDogc2hhcGVGdW5jdGlvbig0LCBNYXRoLlBJIC8gNCksXG4gIERJQU1PTkQgOiBzaGFwZUZ1bmN0aW9uKDQpLFxuICBQRU5UQUdPTiA6IHNoYXBlRnVuY3Rpb24oNSksXG4gIEhFWEFHT04gOiBzaGFwZUZ1bmN0aW9uKDYpLFxuICBDSVJDTEUgOiBmdW5jdGlvbiBDSVJDTEUoZywgbmFtZSwgY3R4LCBjeCwgY3ksIGNvbG9yLCByYWRpdXMpIHtcbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4LnN0cm9rZVN0eWxlID0gY29sb3I7XG4gICAgY3R4LmZpbGxTdHlsZSA9IFwid2hpdGVcIjtcbiAgICBjdHguYXJjKGN4LCBjeSwgcmFkaXVzLCAwLCAyICogTWF0aC5QSSwgZmFsc2UpO1xuICAgIGN0eC5maWxsKCk7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9LFxuICBTVEFSIDogc2hhcGVGdW5jdGlvbig1LCAwLCA0ICogTWF0aC5QSSAvIDUpLFxuICBQTFVTIDogZnVuY3Rpb24gUExVUyhnLCBuYW1lLCBjdHgsIGN4LCBjeSwgY29sb3IsIHJhZGl1cykge1xuICAgIGN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuXG4gICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgIGN0eC5tb3ZlVG8oY3ggKyByYWRpdXMsIGN5KTtcbiAgICBjdHgubGluZVRvKGN4IC0gcmFkaXVzLCBjeSk7XG4gICAgY3R4LmNsb3NlUGF0aCgpO1xuICAgIGN0eC5zdHJva2UoKTtcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKGN4LCBjeSArIHJhZGl1cyk7XG4gICAgY3R4LmxpbmVUbyhjeCwgY3kgLSByYWRpdXMpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBjdHguc3Ryb2tlKCk7XG4gIH0sXG4gIEVYIDogZnVuY3Rpb24gRVgoZywgbmFtZSwgY3R4LCBjeCwgY3ksIGNvbG9yLCByYWRpdXMpIHtcbiAgICBjdHguc3Ryb2tlU3R5bGUgPSBjb2xvcjtcblxuICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICBjdHgubW92ZVRvKGN4ICsgcmFkaXVzLCBjeSArIHJhZGl1cyk7XG4gICAgY3R4LmxpbmVUbyhjeCAtIHJhZGl1cywgY3kgLSByYWRpdXMpO1xuICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgY3R4Lm1vdmVUbyhjeCArIHJhZGl1cywgY3kgLSByYWRpdXMpO1xuICAgIGN0eC5saW5lVG8oY3ggLSByYWRpdXMsIGN5ICsgcmFkaXVzKTtcbiAgICBjdHguY2xvc2VQYXRoKCk7XG4gICAgY3R4LnN0cm9rZSgpO1xuICB9XG59O1xuXG5mb3IgKHZhciBrIGluIGN1c3RvbUNpcmNsZXMpIHtcbiAgaWYgKCFjdXN0b21DaXJjbGVzLmhhc093blByb3BlcnR5KGspKSBjb250aW51ZTtcbiAgRHlncmFwaC5DaXJjbGVzW2tdID0gY3VzdG9tQ2lyY2xlc1trXTtcbn1cblxuLyogY2xvc3VyZSBhbmQgbG9hZGVyIHdyYXBwZXIgKi9cbkR5Z3JhcGguX3JlcXVpcmUuYWRkKCdkeWdyYXBocy9zcmMvZXh0cmFzL3NoYXBlcy5qcycsIC8qIGV4cG9ydHMgKi8ge30pO1xufSkoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUMsU0FBU0Esc0JBQXNCQSxDQUFBLEVBQUc7RUFDbkMsWUFBWTs7RUFDWixJQUFJQyxPQUFPO0VBQ1gsSUFBSUMsTUFBTSxDQUFDRCxPQUFPLEVBQUU7SUFDbEJBLE9BQU8sR0FBR0MsTUFBTSxDQUFDRCxPQUFPO0VBQzFCLENBQUMsTUFBTSxJQUFJLE9BQU9FLE1BQU8sS0FBSyxXQUFXLEVBQUU7SUFDekNGLE9BQU8sR0FBR0csT0FBTyxDQUFDLFlBQVksQ0FBQztJQUMvQixJQUFJLE9BQU9ILE9BQU8sQ0FBQ0ksSUFBSyxLQUFLLFdBQVcsSUFBSSxPQUFPSixPQUFPLFdBQVMsS0FBSyxXQUFXLEVBQ2pGQSxPQUFPLEdBQUdBLE9BQU8sV0FBUTtFQUM3QjtFQUNBOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsSUFBSUssWUFBWSxHQUFHLFNBQVNBLFlBQVlBLENBQ3BDQyxHQUFHLEVBQUVDLEtBQUssRUFBRUMsTUFBTSxFQUFFQyxFQUFFLEVBQUVDLEVBQUUsRUFBRUMsZUFBZSxFQUFFQyxLQUFLLEVBQUU7SUFDdERELGVBQWUsR0FBR0EsZUFBZSxJQUFJLENBQUM7SUFDdENDLEtBQUssR0FBR0EsS0FBSyxJQUFJQyxJQUFJLENBQUNDLEVBQUUsR0FBRyxDQUFDLEdBQUdQLEtBQUs7SUFFcENELEdBQUcsQ0FBQ1MsU0FBUyxDQUFDLENBQUM7SUFDZixJQUFJQyxZQUFZLEdBQUdMLGVBQWU7SUFDbEMsSUFBSU0sS0FBSyxHQUFHRCxZQUFZ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