mirror of
https://github.com/chartjs/Chart.js.git
synced 2025-12-08 20:36:08 +00:00
The `fill` option now accepts the index of the target dataset (number) or a string starting by "+" or "-" followed by a number representing the dataset index relative to the current one (e.g. `fill: "-2"` on dataset at index 3 will fill to dataset at index 1). It's also possible to "propagate" the filling to the target of an hidden dataset (`options.plugins.filler.propagate`). Fill boundaries `zero`, `top` and `bottom` have been deprecated and replaced by `origin`, `start` and `end`. Implementation has been moved out of the line element into a new plugin (`src/plugins/plugin.filler.js`) and does not rely anymore on the deprecated model `scaleTop`, `scaleBottom` and `scaleZero` values. Drawing Bézier splines has been refactored in the canvas helpers (note that `Chart.helpers.canvas` is now an alias of `Chart.canvasHelpers`). Add 3 new examples and extend utils with a pseudo-random number generator that can be initialized with `srand`. That makes possible to design examples starting always with the same initial data.
147 lines
3.8 KiB
JavaScript
147 lines
3.8 KiB
JavaScript
'use strict';
|
|
|
|
module.exports = function(Chart) {
|
|
// Global Chart canvas helpers object for drawing items to canvas
|
|
var helpers = Chart.canvasHelpers = {};
|
|
|
|
helpers.drawPoint = function(ctx, pointStyle, radius, x, y) {
|
|
var type, edgeLength, xOffset, yOffset, height, size;
|
|
|
|
if (typeof pointStyle === 'object') {
|
|
type = pointStyle.toString();
|
|
if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {
|
|
ctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (isNaN(radius) || radius <= 0) {
|
|
return;
|
|
}
|
|
|
|
switch (pointStyle) {
|
|
// Default includes circle
|
|
default:
|
|
ctx.beginPath();
|
|
ctx.arc(x, y, radius, 0, Math.PI * 2);
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
break;
|
|
case 'triangle':
|
|
ctx.beginPath();
|
|
edgeLength = 3 * radius / Math.sqrt(3);
|
|
height = edgeLength * Math.sqrt(3) / 2;
|
|
ctx.moveTo(x - edgeLength / 2, y + height / 3);
|
|
ctx.lineTo(x + edgeLength / 2, y + height / 3);
|
|
ctx.lineTo(x, y - 2 * height / 3);
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
break;
|
|
case 'rect':
|
|
size = 1 / Math.SQRT2 * radius;
|
|
ctx.beginPath();
|
|
ctx.fillRect(x - size, y - size, 2 * size, 2 * size);
|
|
ctx.strokeRect(x - size, y - size, 2 * size, 2 * size);
|
|
break;
|
|
case 'rectRounded':
|
|
var offset = radius / Math.SQRT2;
|
|
var leftX = x - offset;
|
|
var topY = y - offset;
|
|
var sideSize = Math.SQRT2 * radius;
|
|
Chart.helpers.drawRoundedRectangle(ctx, leftX, topY, sideSize, sideSize, radius / 2);
|
|
ctx.fill();
|
|
break;
|
|
case 'rectRot':
|
|
size = 1 / Math.SQRT2 * radius;
|
|
ctx.beginPath();
|
|
ctx.moveTo(x - size, y);
|
|
ctx.lineTo(x, y + size);
|
|
ctx.lineTo(x + size, y);
|
|
ctx.lineTo(x, y - size);
|
|
ctx.closePath();
|
|
ctx.fill();
|
|
break;
|
|
case 'cross':
|
|
ctx.beginPath();
|
|
ctx.moveTo(x, y + radius);
|
|
ctx.lineTo(x, y - radius);
|
|
ctx.moveTo(x - radius, y);
|
|
ctx.lineTo(x + radius, y);
|
|
ctx.closePath();
|
|
break;
|
|
case 'crossRot':
|
|
ctx.beginPath();
|
|
xOffset = Math.cos(Math.PI / 4) * radius;
|
|
yOffset = Math.sin(Math.PI / 4) * radius;
|
|
ctx.moveTo(x - xOffset, y - yOffset);
|
|
ctx.lineTo(x + xOffset, y + yOffset);
|
|
ctx.moveTo(x - xOffset, y + yOffset);
|
|
ctx.lineTo(x + xOffset, y - yOffset);
|
|
ctx.closePath();
|
|
break;
|
|
case 'star':
|
|
ctx.beginPath();
|
|
ctx.moveTo(x, y + radius);
|
|
ctx.lineTo(x, y - radius);
|
|
ctx.moveTo(x - radius, y);
|
|
ctx.lineTo(x + radius, y);
|
|
xOffset = Math.cos(Math.PI / 4) * radius;
|
|
yOffset = Math.sin(Math.PI / 4) * radius;
|
|
ctx.moveTo(x - xOffset, y - yOffset);
|
|
ctx.lineTo(x + xOffset, y + yOffset);
|
|
ctx.moveTo(x - xOffset, y + yOffset);
|
|
ctx.lineTo(x + xOffset, y - yOffset);
|
|
ctx.closePath();
|
|
break;
|
|
case 'line':
|
|
ctx.beginPath();
|
|
ctx.moveTo(x - radius, y);
|
|
ctx.lineTo(x + radius, y);
|
|
ctx.closePath();
|
|
break;
|
|
case 'dash':
|
|
ctx.beginPath();
|
|
ctx.moveTo(x, y);
|
|
ctx.lineTo(x + radius, y);
|
|
ctx.closePath();
|
|
break;
|
|
}
|
|
|
|
ctx.stroke();
|
|
};
|
|
|
|
helpers.clipArea = function(ctx, clipArea) {
|
|
ctx.save();
|
|
ctx.beginPath();
|
|
ctx.rect(clipArea.left, clipArea.top, clipArea.right - clipArea.left, clipArea.bottom - clipArea.top);
|
|
ctx.clip();
|
|
};
|
|
|
|
helpers.unclipArea = function(ctx) {
|
|
ctx.restore();
|
|
};
|
|
|
|
helpers.lineTo = function(ctx, previous, target, flip) {
|
|
if (target.steppedLine) {
|
|
ctx.lineTo(target.x, previous.y);
|
|
ctx.lineTo(target.x, target.y);
|
|
return;
|
|
}
|
|
|
|
if (!target.tension) {
|
|
ctx.lineTo(target.x, target.y);
|
|
return;
|
|
}
|
|
|
|
ctx.bezierCurveTo(
|
|
flip? previous.controlPointPreviousX : previous.controlPointNextX,
|
|
flip? previous.controlPointPreviousY : previous.controlPointNextY,
|
|
flip? target.controlPointNextX : target.controlPointPreviousX,
|
|
flip? target.controlPointNextY : target.controlPointPreviousY,
|
|
target.x,
|
|
target.y);
|
|
};
|
|
|
|
Chart.helpers.canvas = helpers;
|
|
};
|