From 137b51d87d69b1afc5aae26c607aea0e69f1a930 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 7 May 2021 04:06:40 +0300 Subject: [PATCH] Fix line segments with alignToPixel (#9042) --- src/helpers/helpers.segment.js | 5 ++ .../line/segments/alignToPixels.js | 46 ++++++++++++++++++ .../line/segments/alignToPixels.png | Bin 0 -> 5919 bytes test/specs/helpers.segment.tests.js | 8 +++ 4 files changed, 59 insertions(+) create mode 100644 test/fixtures/plugin.filler/line/segments/alignToPixels.js create mode 100644 test/fixtures/plugin.filler/line/segments/alignToPixels.png diff --git a/src/helpers/helpers.segment.js b/src/helpers/helpers.segment.js index fe7940302..13063f019 100644 --- a/src/helpers/helpers.segment.js +++ b/src/helpers/helpers.segment.js @@ -100,6 +100,11 @@ export function _boundSegment(segment, points, bounds) { } value = normalize(point[property]); + + if (value === prevValue) { + continue; + } + inside = between(value, startBound, endBound); if (subStart === null && shouldStart()) { diff --git a/test/fixtures/plugin.filler/line/segments/alignToPixels.js b/test/fixtures/plugin.filler/line/segments/alignToPixels.js new file mode 100644 index 000000000..99ece11b3 --- /dev/null +++ b/test/fixtures/plugin.filler/line/segments/alignToPixels.js @@ -0,0 +1,46 @@ +module.exports = { + config: { + type: 'line', + data: { + datasets: [ + { + data: [ + {x: 0, y: 0}, + {x: 1, y: 20}, + {x: 1.00001, y: 30}, + {x: 2, y: 100}, + {x: 2.00001, y: 100} + ], + backgroundColor: '#FF000070', + borderColor: 'black', + radius: 0, + segment: { + borderDash: ctx => ctx.p0.parsed.x > 1 ? [10, 5] : undefined, + }, + fill: true + } + ] + }, + options: { + plugins: { + legend: false + }, + scales: { + x: { + type: 'linear', + alignToPixels: true, + display: false + }, + y: { + display: false + } + } + } + }, + options: { + canvas: { + width: 300, + height: 240 + } + } +}; diff --git a/test/fixtures/plugin.filler/line/segments/alignToPixels.png b/test/fixtures/plugin.filler/line/segments/alignToPixels.png new file mode 100644 index 0000000000000000000000000000000000000000..df12d54ff5cce1fc7af9c268daf524e7f929a318 GIT binary patch literal 5919 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 WAx;bFHqiqDJ~md4mUZTo`2PX>PI5i~ literal 0 Hc-jL100001 diff --git a/test/specs/helpers.segment.tests.js b/test/specs/helpers.segment.tests.js index 0553a2aac..f603a6ebc 100644 --- a/test/specs/helpers.segment.tests.js +++ b/test/specs/helpers.segment.tests.js @@ -49,5 +49,13 @@ describe('helpers.segments', function() { {start: 3, end: 4, loop: false, style: undefined}, ]); }); + + it('should find correct segments when there are multiple points with same property value', function() { + const repeatedPoints = [{x: 1, y: 5}, {x: 1, y: 6}, {x: 2, y: 5}, {x: 2, y: 6}, {x: 3, y: 5}, {x: 3, y: 6}, {x: 3, y: 7}]; + expect(_boundSegment({start: 0, end: 6, loop: false}, repeatedPoints, {property: 'x', start: 1, end: 1.1})).toEqual([{start: 0, end: 2, loop: false, style: undefined}]); + expect(_boundSegment({start: 0, end: 6, loop: false}, repeatedPoints, {property: 'x', start: 2, end: 2.1})).toEqual([{start: 2, end: 4, loop: false, style: undefined}]); + expect(_boundSegment({start: 0, end: 6, loop: false}, repeatedPoints, {property: 'x', start: 2, end: 3.1})).toEqual([{start: 2, end: 6, loop: false, style: undefined}]); + expect(_boundSegment({start: 0, end: 6, loop: false}, repeatedPoints, {property: 'x', start: 0, end: 8})).toEqual([{start: 0, end: 6, loop: false, style: undefined}]); + }); }); }); -- 2.39.5