From 48869225bb64d86c7817c444ffc8cff872c93cf8 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 18 Apr 2019 23:52:25 +0300 Subject: [PATCH] Fill before drawing lines (#6208) --- src/plugins/plugin.filler.js | 38 ++++++----- .../fill-line-dataset-border.json | 59 ++++++++++++++++++ .../fill-line-dataset-border.png | Bin 0 -> 17148 bytes 3 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 test/fixtures/plugin.filler/fill-line-dataset-border.json create mode 100644 test/fixtures/plugin.filler/fill-line-dataset-border.png diff --git a/src/plugins/plugin.filler.js b/src/plugins/plugin.filler.js index e89bb0d8785..434a795eba7 100644 --- a/src/plugins/plugin.filler.js +++ b/src/plugins/plugin.filler.js @@ -296,23 +296,29 @@ module.exports = { } }, - beforeDatasetDraw: function(chart, args) { - var meta = args.meta.$filler; - if (!meta) { - return; - } - + beforeDatasetsDraw: function(chart) { + var count = (chart.data.datasets || []).length - 1; var ctx = chart.ctx; - var el = meta.el; - var view = el._view; - var points = el._children || []; - var mapper = meta.mapper; - var color = view.backgroundColor || defaults.global.defaultColor; - - if (mapper && color && points.length) { - helpers.canvas.clipArea(ctx, chart.chartArea); - doFill(ctx, points, mapper, view, color, el._loop); - helpers.canvas.unclipArea(ctx); + var meta, i, el, view, points, mapper, color; + + for (i = count; i >= 0; --i) { + meta = chart.getDatasetMeta(i).$filler; + + if (!meta || !meta.visible) { + continue; + } + + el = meta.el; + view = el._view; + points = el._children || []; + mapper = meta.mapper; + color = view.backgroundColor || defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers.canvas.unclipArea(ctx); + } } } }; diff --git a/test/fixtures/plugin.filler/fill-line-dataset-border.json b/test/fixtures/plugin.filler/fill-line-dataset-border.json new file mode 100644 index 00000000000..46d923374c9 --- /dev/null +++ b/test/fixtures/plugin.filler/fill-line-dataset-border.json @@ -0,0 +1,59 @@ +{ + "config": { + "type": "line", + "data": { + "labels": ["0", "1", "2", "3", "4", "5", "6", "7", "8"], + "datasets": [{ + "backgroundColor": "rgba(255, 0, 0, 0.25)", + "data": [null, null, 0, -1, 0, 1, 0, -1, 0], + "fill": 1 + }, { + "backgroundColor": "rgba(0, 255, 0, 0.25)", + "data": [1, 0, null, 1, 0, null, -1, 0, 1], + "fill": "+1" + }, { + "backgroundColor": "rgba(0, 0, 255, 0.25)", + "data": [0, 2, 0, -2, 0, 2, 0], + "fill": 3 + }, { + "backgroundColor": "rgba(255, 0, 255, 0.25)", + "data": [2, 0, -2, 0, 2, 0, -2, 0, 2], + "fill": "-2" + }, { + "backgroundColor": "rgba(255, 255, 0, 0.25)", + "data": [3, 1, -1, -3, -1, 1, 3, 1, -1], + "fill": "-1" + }] + }, + "options": { + "responsive": false, + "spanGaps": false, + "legend": false, + "title": false, + "scales": { + "xAxes": [{ + "display": false + }], + "yAxes": [{ + "display": false + }] + }, + "elements": { + "point": { + "radius": 0 + }, + "line": { + "borderColor": "black", + "borderWidth": 5, + "tension": 0 + } + } + } + }, + "options": { + "canvas": { + "height": 256, + "width": 512 + } + } +} diff --git a/test/fixtures/plugin.filler/fill-line-dataset-border.png b/test/fixtures/plugin.filler/fill-line-dataset-border.png new file mode 100644 index 0000000000000000000000000000000000000000..01afc9f35484e90b65e2e83626712a1b407e59b5 GIT binary patch literal 17148 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 literal 0 HcmV?d00001