From 2e65fc9422c5f603d2bf8ff922ea7995a226d99a Mon Sep 17 00:00:00 2001 From: Charles MASSON Date: Sun, 26 Dec 2021 12:39:37 +0100 Subject: [PATCH] Fix using above/below filling option with discontinuous lines Added a test in the boundary folder --- src/plugins/plugin.filler.js | 26 ++++++++- .../boundary/above-below-line-null-start.json | 53 ++++++++++++++++++ .../boundary/above-below-line-null-start.png | Bin 0 -> 17762 bytes .../line/boundary/above-below-line-null.json | 53 ++++++++++++++++++ .../line/boundary/above-below-line-null.png | Bin 0 -> 18647 bytes 5 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.json create mode 100644 test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.png create mode 100644 test/fixtures/plugin.filler/line/boundary/above-below-line-null.json create mode 100644 test/fixtures/plugin.filler/line/boundary/above-below-line-null.png diff --git a/src/plugins/plugin.filler.js b/src/plugins/plugin.filler.js index 8650248cfb4..146f995b1e0 100644 --- a/src/plugins/plugin.filler.js +++ b/src/plugins/plugin.filler.js @@ -383,9 +383,31 @@ function resolveTarget(sources, index, propagate) { } function _clip(ctx, target, clipY) { + const {segments, points} = target; + let first = true; + ctx.beginPath(); - target.path(ctx); - ctx.lineTo(target.last().x, clipY); + + let lineLoop = false; + for (const segment of segments) { + const {start, end} = segment; + const firstPoint = points[start]; + const lastPoint = points[findSegmentEnd(start, end, points)]; + if (first) { + ctx.moveTo(firstPoint.x, firstPoint.y); + first = false; + } else { + ctx.lineTo(firstPoint.x, clipY); + ctx.lineTo(firstPoint.x, firstPoint.y); + } + lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop}); + if (lineLoop) { + ctx.closePath(); + } else { + ctx.lineTo(lastPoint.x, clipY); + } + } + ctx.lineTo(target.first().x, clipY); ctx.closePath(); ctx.clip(); diff --git a/test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.json b/test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.json new file mode 100644 index 00000000000..e0bce4bce0c --- /dev/null +++ b/test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.json @@ -0,0 +1,53 @@ +{ + "config": { + "type": "line", + "data": { + "labels": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], + "datasets": [{ + "borderColor": "rgb(42, 90, 145)", + "data": [null, 12, 30, 36, 45, 53, 68, 79, null, 95, 18, 18, 180], + "fill": { + "target": "+1", + "above": "rgba(4, 142, 43, 0.5)", + "below": "rgba(241, 49, 34, 0.5)" + } + }, { + "borderColor": "#00ADEE", + "data": [null, 0, 0, 0, 0, 0, 20, 108, null, 72, 72, 72, 72], + "fill": false + }] + }, + "options": { + "responsive": false, + "spanGaps": false, + "scales": { + "x": { + "display": false + }, + "y": { + "display": false + } + }, + "elements": { + "point": { + "radius": 0 + }, + "line": { + "cubicInterpolationMode": "monotone", + "borderColor": "transparent" + } + }, + "plugins": { + "legend": false, + "title": false, + "tooltip": false + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.png b/test/fixtures/plugin.filler/line/boundary/above-below-line-null-start.png new file mode 100644 index 0000000000000000000000000000000000000000..5414dc9bd935f0dba51a6b6ef14b2d17d37e20c2 GIT binary patch literal 17762 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/plugin.filler/line/boundary/above-below-line-null.json b/test/fixtures/plugin.filler/line/boundary/above-below-line-null.json new file mode 100644 index 00000000000..405542e149f --- /dev/null +++ b/test/fixtures/plugin.filler/line/boundary/above-below-line-null.json @@ -0,0 +1,53 @@ +{ + "config": { + "type": "line", + "data": { + "labels": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], + "datasets": [{ + "borderColor": "rgb(42, 90, 145)", + "data": [4, 12, 30, 36, 45, 53, 68, 79, null, 95, 18, null, 18, 180], + "fill": { + "target": "+1", + "above": "rgba(4, 142, 43, 0.5)", + "below": "rgba(241, 49, 34, 0.5)" + } + }, { + "borderColor": "#00ADEE", + "data": [0, 0, 0, 0, 0, 0, 20, 108, null, 72, 72, null, 72, 72], + "fill": false + }] + }, + "options": { + "responsive": false, + "spanGaps": false, + "scales": { + "x": { + "display": false + }, + "y": { + "display": false + } + }, + "elements": { + "point": { + "radius": 0 + }, + "line": { + "cubicInterpolationMode": "monotone", + "borderColor": "transparent" + } + }, + "plugins": { + "legend": false, + "title": false, + "tooltip": false + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/plugin.filler/line/boundary/above-below-line-null.png b/test/fixtures/plugin.filler/line/boundary/above-below-line-null.png new file mode 100644 index 0000000000000000000000000000000000000000..7118324e73c73c3d85d8cf5c622c597dd2ca41a8 GIT binary patch literal 18647 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