From c527f47a89aabaa914423c9a72064eb00157a1cd Mon Sep 17 00:00:00 2001 From: Charles Masson <72135060+charlesmass2@users.noreply.github.com> Date: Sat, 1 Jan 2022 22:42:45 +0100 Subject: [PATCH] Fix using above/below filling option with discontinuous lines (#10024) Added a test in the boundary folder --- src/plugins/plugin.filler.js | 25 ++++++++- .../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, 129 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 8650248cf..75fea2ff7 100644 --- a/src/plugins/plugin.filler.js +++ b/src/plugins/plugin.filler.js @@ -383,9 +383,30 @@ function resolveTarget(sources, index, propagate) { } function _clip(ctx, target, clipY) { + const {segments, points} = target; + let first = true; + let lineLoop = false; + ctx.beginPath(); - target.path(ctx); - ctx.lineTo(target.last().x, clipY); + 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 000000000..e0bce4bce --- /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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 PfG=4oCCQQ(@BID`_zw7P literal 0 Hc-jL100001 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 000000000..405542e14 --- /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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 W_Ql^J*c$Wz0000