@@ -17,8 +17,8 @@ defaults._set('global', {
17
17
}
18
18
} ) ;
19
19
20
- function isVertical ( bar ) {
21
- return bar . _view . width !== undefined ;
20
+ function isVertical ( vm ) {
21
+ return vm . width !== undefined ;
22
22
}
23
23
24
24
/**
@@ -27,11 +27,10 @@ function isVertical(bar) {
27
27
* @return {Bounds } bounds of the bar
28
28
* @private
29
29
*/
30
- function getBarBounds ( bar ) {
31
- var vm = bar . _view ;
30
+ function getBarBounds ( vm ) {
32
31
var x1 , x2 , y1 , y2 , half ;
33
32
34
- if ( isVertical ( bar ) ) {
33
+ if ( isVertical ( vm ) ) {
35
34
half = vm . width / 2 ;
36
35
x1 = vm . x - half ;
37
36
x2 = vm . x + half ;
@@ -57,29 +56,29 @@ function swap(orig, v1, v2) {
57
56
return orig === v1 ? v2 : orig === v2 ? v1 : orig ;
58
57
}
59
58
60
- function parseBorderSkipped ( bar ) {
61
- var vm = bar . _view ;
59
+ function parseBorderSkipped ( vm ) {
62
60
var edge = vm . borderSkipped ;
63
61
var res = { } ;
64
62
65
63
if ( ! edge ) {
66
64
return res ;
67
65
}
68
66
69
- if ( isVertical ( bar ) ) {
70
- if ( vm . base < vm . y ) {
71
- edge = swap ( edge , 'bottom ' , 'top ' ) ;
67
+ if ( vm . horizontal ) {
68
+ if ( vm . base > vm . x ) {
69
+ edge = swap ( edge , 'left ' , 'right ' ) ;
72
70
}
73
- } else if ( vm . base > vm . x ) {
74
- edge = swap ( edge , 'left ' , 'right ' ) ;
71
+ } else if ( vm . base < vm . y ) {
72
+ edge = swap ( edge , 'bottom ' , 'top ' ) ;
75
73
}
76
74
77
75
res [ edge ] = true ;
78
76
return res ;
79
77
}
80
78
81
- function parseBorderWidth ( value , bar , maxWidth , maxHeight ) {
82
- var _skip = parseBorderSkipped ( bar ) ;
79
+ function parseBorderWidth ( vm , maxW , maxH ) {
80
+ var value = vm . borderWidth ;
81
+ var _skip = parseBorderSkipped ( vm ) ;
83
82
var t , r , b , l ;
84
83
85
84
if ( helpers . isObject ( value ) ) {
@@ -92,62 +91,57 @@ function parseBorderWidth(value, bar, maxWidth, maxHeight) {
92
91
}
93
92
94
93
return {
95
- top : _skip . top || ( t < 0 ) ? 0 : t > maxHeight ? maxHeight : t ,
96
- right : _skip . right || ( r < 0 ) ? 0 : r > maxWidth ? maxWidth : r ,
97
- bottom : _skip . bottom || ( b < 0 ) ? 0 : b > maxWidth ? maxWidth : b ,
98
- left : _skip . left || ( l < 0 ) ? 0 : l > maxWidth ? maxWidth : l
94
+ t : _skip . top || ( t < 0 ) ? 0 : t > maxH ? maxH : t ,
95
+ r : _skip . right || ( r < 0 ) ? 0 : r > maxW ? maxW : r ,
96
+ b : _skip . bottom || ( b < 0 ) ? 0 : b > maxH ? maxH : b ,
97
+ l : _skip . left || ( l < 0 ) ? 0 : l > maxW ? maxW : l
98
+ } ;
99
+ }
100
+
101
+ function boundingRects ( vm ) {
102
+ var bounds = getBarBounds ( vm ) ;
103
+ var width = bounds . right - bounds . left ;
104
+ var height = bounds . bottom - bounds . top ;
105
+ var border = parseBorderWidth ( vm , width / 2 , height / 2 ) ;
106
+
107
+ return {
108
+ outer : {
109
+ x : bounds . left ,
110
+ y : bounds . top ,
111
+ w : width ,
112
+ h : height
113
+ } ,
114
+ inner : {
115
+ x : bounds . left + border . l ,
116
+ y : bounds . top + border . t ,
117
+ w : width - border . l - border . r ,
118
+ h : height - border . t - border . b
119
+ }
99
120
} ;
100
121
}
101
122
102
123
module . exports = Element . extend ( {
103
124
draw : function ( ) {
104
- var me = this ;
105
- var ctx = me . _chart . ctx ;
106
- var vm = me . _view ;
107
- var bounds = getBarBounds ( me ) ;
108
- var left = bounds . left ;
109
- var top = bounds . top ;
110
- var width = bounds . right - left ;
111
- var height = bounds . bottom - top ;
112
- var border = parseBorderWidth ( vm . borderWidth , me , width / 2 , height / 2 ) ;
113
- var bLeft = border . left ;
114
- var bTop = border . top ;
115
- var bRight = border . right ;
116
- var bBottom = border . bottom ;
117
- var maxBorder = Math . max ( bLeft , bTop , bRight , bBottom ) ;
118
- var halfBorder = maxBorder / 2 ;
119
- var inner = {
120
- left : left + bLeft ,
121
- top : top + bTop ,
122
- width : width - bLeft - bRight ,
123
- height : height - bBottom - bTop
124
- } ;
125
+ var ctx = this . _chart . ctx ;
126
+ var vm = this . _view ;
127
+ var rects = boundingRects ( vm ) ;
128
+ var outer = rects . outer ;
129
+ var inner = rects . inner ;
125
130
126
131
ctx . fillStyle = vm . backgroundColor ;
132
+ ctx . fillRect ( outer . x , outer . y , outer . w , outer . h ) ;
127
133
128
- if ( ! maxBorder ) {
129
- ctx . fillRect ( left , top , width , height ) ;
134
+ if ( outer . w === inner . w && outer . h === inner . h ) {
130
135
return ;
131
136
}
132
137
133
- ctx . fillRect ( inner . left , inner . top , inner . width , inner . height ) ;
134
-
135
- // offset inner rectangle by half of widest border
136
- // move edges additional 1px out, where there is no border, to prevent artifacts
137
- inner . left -= halfBorder + ( bLeft ? 0 : 1 ) ;
138
- inner . top -= halfBorder + ( bTop ? 0 : 1 ) ;
139
- inner . width += maxBorder + ( bLeft ? 0 : 1 ) + ( bRight ? 0 : 1 ) ;
140
- inner . height += maxBorder + ( bTop ? 0 : 1 ) + ( bBottom ? 0 : 1 ) ;
141
-
142
138
ctx . save ( ) ;
143
139
ctx . beginPath ( ) ;
144
- ctx . rect ( left , top , width , height ) ;
140
+ ctx . rect ( outer . x , outer . y , outer . w , outer . h ) ;
145
141
ctx . clip ( ) ;
146
- ctx . beginPath ( ) ;
147
- ctx . rect ( inner . left , inner . top , inner . width , inner . height ) ;
148
- ctx . lineWidth = maxBorder + 1 ; // + 1 to prevent artifacts
149
- ctx . strokeStyle = vm . borderColor ;
150
- ctx . stroke ( ) ;
142
+ ctx . fillStyle = vm . borderColor ;
143
+ ctx . rect ( inner . x , inner . y , inner . w , inner . h ) ;
144
+ ctx . fill ( 'evenodd' ) ;
151
145
ctx . restore ( ) ;
152
146
} ,
153
147
@@ -158,25 +152,26 @@ module.exports = Element.extend({
158
152
159
153
inRange : function ( mouseX , mouseY ) {
160
154
var inRange = false ;
155
+ var vm = this . _view ;
161
156
162
- if ( this . _view ) {
163
- var bounds = getBarBounds ( this ) ;
157
+ if ( vm ) {
158
+ var bounds = getBarBounds ( vm ) ;
164
159
inRange = mouseX >= bounds . left && mouseX <= bounds . right && mouseY >= bounds . top && mouseY <= bounds . bottom ;
165
160
}
166
161
167
162
return inRange ;
168
163
} ,
169
164
170
165
inLabelRange : function ( mouseX , mouseY ) {
171
- var me = this ;
172
- if ( ! me . _view ) {
166
+ var vm = this . _view ;
167
+ if ( ! vm ) {
173
168
return false ;
174
169
}
175
170
176
171
var inRange = false ;
177
- var bounds = getBarBounds ( me ) ;
172
+ var bounds = getBarBounds ( vm ) ;
178
173
179
- if ( isVertical ( me ) ) {
174
+ if ( isVertical ( vm ) ) {
180
175
inRange = mouseX >= bounds . left && mouseX <= bounds . right ;
181
176
} else {
182
177
inRange = mouseY >= bounds . top && mouseY <= bounds . bottom ;
@@ -186,19 +181,19 @@ module.exports = Element.extend({
186
181
} ,
187
182
188
183
inXRange : function ( mouseX ) {
189
- var bounds = getBarBounds ( this ) ;
184
+ var bounds = getBarBounds ( this . _view ) ;
190
185
return mouseX >= bounds . left && mouseX <= bounds . right ;
191
186
} ,
192
187
193
188
inYRange : function ( mouseY ) {
194
- var bounds = getBarBounds ( this ) ;
189
+ var bounds = getBarBounds ( this . _view ) ;
195
190
return mouseY >= bounds . top && mouseY <= bounds . bottom ;
196
191
} ,
197
192
198
193
getCenterPoint : function ( ) {
199
194
var vm = this . _view ;
200
195
var x , y ;
201
- if ( isVertical ( this ) ) {
196
+ if ( isVertical ( vm ) ) {
202
197
x = vm . x ;
203
198
y = ( vm . y + vm . base ) / 2 ;
204
199
} else {
@@ -212,7 +207,7 @@ module.exports = Element.extend({
212
207
getArea : function ( ) {
213
208
var vm = this . _view ;
214
209
215
- return isVertical ( this )
210
+ return isVertical ( vm )
216
211
? vm . width * Math . abs ( vm . y - vm . base )
217
212
: vm . height * Math . abs ( vm . x - vm . base ) ;
218
213
} ,
0 commit comments