From 566d7224312150268386aeec698da94e4a0cc566 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 20 Jul 2021 14:52:41 +0300 Subject: [PATCH] Don't draw points outside chartArea (#9443) --- src/elements/element.point.js | 6 +-- src/helpers/helpers.canvas.js | 2 +- test/fixtures/controller.line/clip/false.js | 46 +++++++++++++++++++ test/fixtures/controller.line/clip/false.png | Bin 0 -> 20500 bytes 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/controller.line/clip/false.js create mode 100644 test/fixtures/controller.line/clip/false.png diff --git a/src/elements/element.point.js b/src/elements/element.point.js index 8c4e094cc..05b521910 100644 --- a/src/elements/element.point.js +++ b/src/elements/element.point.js @@ -1,5 +1,5 @@ import Element from '../core/core.element'; -import {drawPoint} from '../helpers/helpers.canvas'; +import {drawPoint, _isPointInArea} from '../helpers/helpers.canvas'; function inRange(el, pos, axis, useFinalPosition) { const options = el.options; @@ -50,11 +50,11 @@ export default class PointElement extends Element { return (radius + borderWidth) * 2; } - draw(ctx) { + draw(ctx, area) { const me = this; const options = me.options; - if (me.skip || options.radius < 0.1) { + if (me.skip || options.radius < 0.1 || !_isPointInArea(me, area, me.size(options) / 2)) { return; } diff --git a/src/helpers/helpers.canvas.js b/src/helpers/helpers.canvas.js index faae4e5db..c65f58115 100644 --- a/src/helpers/helpers.canvas.js +++ b/src/helpers/helpers.canvas.js @@ -251,7 +251,7 @@ export function drawPoint(ctx, options, x, y) { export function _isPointInArea(point, area, margin) { margin = margin || 0.5; // margin - default is to match rounded decimals - return point && point.x > area.left - margin && point.x < area.right + margin && + return point && area && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin; } diff --git a/test/fixtures/controller.line/clip/false.js b/test/fixtures/controller.line/clip/false.js new file mode 100644 index 000000000..1f86abd2d --- /dev/null +++ b/test/fixtures/controller.line/clip/false.js @@ -0,0 +1,46 @@ +const data = []; +for (let x = 0.95; x < 1.15; x += 0.002) { + data.push({x, y: x}); +} + +for (let x = 0.95; x < 1.15; x += 0.001) { + data.push({x, y: 2.1 - x}); +} + +module.exports = { + config: { + type: 'scatter', + data: { + datasets: [{ + clip: false, + radius: 8, + borderWidth: 0, + backgroundColor: (ctx) => ctx.type !== 'data' || ctx.raw.x < 1 || ctx.raw.x > 1.1 ? 'rgba(255,0,0,0.7)' : 'rgba(0,0,255,0.05)', + data + }] + }, + options: { + plugins: false, + scales: { + x: { + min: 1, + max: 1.1 + }, + y: { + min: 1, + max: 1.1 + }, + }, + layout: { + padding: 32 + } + } + }, + options: { + spriteText: true, + canvas: { + height: 240, + width: 320 + } + } +}; diff --git a/test/fixtures/controller.line/clip/false.png b/test/fixtures/controller.line/clip/false.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9347bbb1fa44b5a720902d6c986809ee6431d2 GIT binary patch literal 20500 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