From 1a2a87be3b6eb85d7749fb13e13910e58ba2a735 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 30 Apr 2019 12:34:10 +0300 Subject: [PATCH] Fix arc border with circumference over 2*PI (#6215) --- src/elements/element.arc.js | 149 +++++++++---- .../doughnut-circumference-over-2pi.json | 24 ++ .../doughnut-circumference-over-2pi.png | Bin 0 -> 35638 bytes test/specs/element.arc.tests.js | 210 ------------------ 4 files changed, 133 insertions(+), 250 deletions(-) create mode 100644 test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.json create mode 100644 test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.png diff --git a/src/elements/element.arc.js b/src/elements/element.arc.js index 1d5f9aede..e3b8875b4 100644 --- a/src/elements/element.arc.js +++ b/src/elements/element.arc.js @@ -3,6 +3,7 @@ var defaults = require('../core/core.defaults'); var Element = require('../core/core.element'); var helpers = require('../helpers/index'); +var TAU = Math.PI * 2; defaults._set('global', { elements: { @@ -15,6 +16,81 @@ defaults._set('global', { } }); +function clipArc(ctx, arc) { + var startAngle = arc.startAngle; + var endAngle = arc.endAngle; + var pixelMargin = arc.pixelMargin; + var angleMargin = pixelMargin / arc.outerRadius; + var x = arc.x; + var y = arc.y; + + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + ctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin); + if (arc.innerRadius > pixelMargin) { + angleMargin = pixelMargin / arc.innerRadius; + ctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true); + } else { + ctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); +} + +function drawFullCircleBorders(ctx, vm, arc, inner) { + var endAngle = arc.endAngle; + var i; + + if (inner) { + arc.endAngle = arc.startAngle + TAU; + clipArc(ctx, arc); + arc.endAngle = endAngle; + if (arc.endAngle === arc.startAngle && arc.fullCircles) { + arc.endAngle += TAU; + arc.fullCircles--; + } + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.stroke(); + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.stroke(); + } +} + +function drawBorder(ctx, vm, arc) { + var inner = vm.borderAlign === 'inner'; + + if (inner) { + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + if (arc.fullCircles) { + drawFullCircleBorders(ctx, vm, arc, inner); + } + + if (inner) { + clipArc(ctx, arc); + } + + ctx.beginPath(); + ctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); + ctx.closePath(); + ctx.stroke(); +} + module.exports = Element.extend({ inLabelRange: function(mouseX) { var vm = this._view; @@ -30,20 +106,20 @@ module.exports = Element.extend({ if (vm) { var pointRelativePosition = helpers.getAngleFromPoint(vm, {x: chartX, y: chartY}); - var angle = pointRelativePosition.angle; + var angle = pointRelativePosition.angle; var distance = pointRelativePosition.distance; // Sanitise angle range var startAngle = vm.startAngle; var endAngle = vm.endAngle; while (endAngle < startAngle) { - endAngle += 2.0 * Math.PI; + endAngle += TAU; } while (angle > endAngle) { - angle -= 2.0 * Math.PI; + angle -= TAU; } while (angle < startAngle) { - angle += 2.0 * Math.PI; + angle += TAU; } // Check if within the range of the open/close angle @@ -84,51 +160,44 @@ module.exports = Element.extend({ draw: function() { var ctx = this._chart.ctx; var vm = this._view; - var sA = vm.startAngle; - var eA = vm.endAngle; var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; - var angleMargin; + var arc = { + x: vm.x, + y: vm.y, + innerRadius: vm.innerRadius, + outerRadius: Math.max(vm.outerRadius - pixelMargin, 0), + pixelMargin: pixelMargin, + startAngle: vm.startAngle, + endAngle: vm.endAngle, + fullCircles: Math.floor(vm.circumference / TAU) + }; + var i; ctx.save(); + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + + if (arc.fullCircles) { + arc.endAngle = arc.startAngle + TAU; + ctx.beginPath(); + ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); + ctx.closePath(); + for (i = 0; i < arc.fullCircles; ++i) { + ctx.fill(); + } + arc.endAngle = arc.startAngle + vm.circumference % TAU; + } + ctx.beginPath(); - ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle); + ctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true); ctx.closePath(); - - ctx.fillStyle = vm.backgroundColor; ctx.fill(); if (vm.borderWidth) { - if (vm.borderAlign === 'inner') { - // Draw an inner border by cliping the arc and drawing a double-width border - // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders - ctx.beginPath(); - angleMargin = pixelMargin / vm.outerRadius; - ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); - if (vm.innerRadius > pixelMargin) { - angleMargin = pixelMargin / vm.innerRadius; - ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); - } else { - ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); - } - ctx.closePath(); - ctx.clip(); - - ctx.beginPath(); - ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); - ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); - ctx.closePath(); - - ctx.lineWidth = vm.borderWidth * 2; - ctx.lineJoin = 'round'; - } else { - ctx.lineWidth = vm.borderWidth; - ctx.lineJoin = 'bevel'; - } - - ctx.strokeStyle = vm.borderColor; - ctx.stroke(); + drawBorder(ctx, vm, arc); } ctx.restore(); diff --git a/test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.json b/test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.json new file mode 100644 index 000000000..e2c427517 --- /dev/null +++ b/test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.json @@ -0,0 +1,24 @@ +{ + "config": { + "type": "doughnut", + "data": { + "labels": ["A"], + "datasets": [{ + "data": [100], + "backgroundColor": [ + "rgba(153, 102, 255, 0.8)" + ], + "borderWidth": 20, + "borderColor": [ + "rgb(153, 102, 255)" + ] + }] + }, + "options": { + "circumference": 7, + "responsive": false, + "legend": false, + "title": false + } + } +} diff --git a/test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.png b/test/fixtures/controller.doughnut/doughnut-circumference-over-2pi.png new file mode 100644 index 0000000000000000000000000000000000000000..b918ceb921bc627f98ab5a71cd7c96ff77083d28 GIT binary patch literal 35638 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

GPSZyY4`xH05g0x1h#u9vT$M`UUHH^`P6 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 AF#rGn literal 0 Hc-jL100001 diff --git a/test/specs/element.arc.tests.js b/test/specs/element.arc.tests.js index dd3736435..40d52533d 100644 --- a/test/specs/element.arc.tests.js +++ b/test/specs/element.arc.tests.js @@ -99,214 +99,4 @@ describe('Arc element tests', function() { expect(center.x).toBeCloseTo(0.5, 6); expect(center.y).toBeCloseTo(0.5, 6); }); - - it ('should draw correctly with no border', function() { - var mockContext = window.createMockContext(); - var arc = new Chart.elements.Arc({ - _datasetIndex: 2, - _index: 1, - _chart: { - ctx: mockContext, - } - }); - - // Mock out the view as if the controller put it there - arc._view = { - startAngle: 0, - endAngle: Math.PI / 2, - x: 10, - y: 5, - innerRadius: 1, - outerRadius: 3, - - backgroundColor: 'rgb(0, 0, 255)', - borderColor: 'rgb(255, 0, 0)', - }; - - arc.draw(); - - expect(mockContext.getCalls()).toEqual([{ - name: 'save', - args: [] - }, { - name: 'beginPath', - args: [] - }, { - name: 'arc', - args: [10, 5, 3, 0, Math.PI / 2] - }, { - name: 'arc', - args: [10, 5, 1, Math.PI / 2, 0, true] - }, { - name: 'closePath', - args: [] - }, { - name: 'setFillStyle', - args: ['rgb(0, 0, 255)'] - }, { - name: 'fill', - args: [] - }, { - name: 'restore', - args: [] - }]); - }); - - it ('should draw correctly with a border', function() { - var mockContext = window.createMockContext(); - var arc = new Chart.elements.Arc({ - _datasetIndex: 2, - _index: 1, - _chart: { - ctx: mockContext, - } - }); - - // Mock out the view as if the controller put it there - arc._view = { - startAngle: 0, - endAngle: Math.PI / 2, - x: 10, - y: 5, - innerRadius: 1, - outerRadius: 3, - - backgroundColor: 'rgb(0, 0, 255)', - borderColor: 'rgb(255, 0, 0)', - borderWidth: 5 - }; - - arc.draw(); - - expect(mockContext.getCalls()).toEqual([{ - name: 'save', - args: [] - }, { - name: 'beginPath', - args: [] - }, { - name: 'arc', - args: [10, 5, 3, 0, Math.PI / 2] - }, { - name: 'arc', - args: [10, 5, 1, Math.PI / 2, 0, true] - }, { - name: 'closePath', - args: [] - }, { - name: 'setFillStyle', - args: ['rgb(0, 0, 255)'] - }, { - name: 'fill', - args: [] - }, { - name: 'setLineWidth', - args: [5] - }, { - name: 'setLineJoin', - args: ['bevel'] - }, { - name: 'setStrokeStyle', - args: ['rgb(255, 0, 0)'] - }, { - name: 'stroke', - args: [] - }, { - name: 'restore', - args: [] - }]); - }); - - it ('should draw correctly with an inner border', function() { - var mockContext = window.createMockContext(); - var arc = new Chart.elements.Arc({ - _datasetIndex: 2, - _index: 1, - _chart: { - ctx: mockContext, - } - }); - - // Mock out the view as if the controller put it there - arc._view = { - startAngle: 0, - endAngle: Math.PI / 2, - x: 10, - y: 5, - innerRadius: 1, - outerRadius: 3, - - backgroundColor: 'rgb(0, 0, 255)', - borderColor: 'rgb(255, 0, 0)', - borderWidth: 5, - borderAlign: 'inner' - }; - - arc.draw(); - - expect(mockContext.getCalls()).toEqual([{ - name: 'save', - args: [] - }, { - name: 'beginPath', - args: [] - }, { - name: 'arc', - args: [10, 5, 2.67, 0, Math.PI / 2] - }, { - name: 'arc', - args: [10, 5, 1, Math.PI / 2, 0, true] - }, { - name: 'closePath', - args: [] - }, { - name: 'setFillStyle', - args: ['rgb(0, 0, 255)'] - }, { - name: 'fill', - args: [] - }, { - name: 'beginPath', - args: [] - }, { - name: 'arc', - args: [10, 5, 3, -0.11, Math.PI / 2 + 0.11] - }, { - name: 'arc', - args: [10, 5, 1 - 0.33, Math.PI / 2 + 0.33, -0.33, true] - }, { - name: 'closePath', - args: [] - }, { - name: 'clip', - args: [] - }, { - name: 'beginPath', - args: [] - }, { - name: 'arc', - args: [10, 5, 3, 0, Math.PI / 2] - }, { - name: 'arc', - args: [10, 5, 1, Math.PI / 2, 0, true] - }, { - name: 'closePath', - args: [] - }, { - name: 'setLineWidth', - args: [10] - }, { - name: 'setLineJoin', - args: ['round'] - }, { - name: 'setStrokeStyle', - args: ['rgb(255, 0, 0)'] - }, { - name: 'stroke', - args: [] - }, { - name: 'restore', - args: [] - }]); - }); }); -- 2.47.3