Skip to content

Commit

Permalink
Fixed #6708, 0 value bars were incorrectly drawn in 3D chart.
Browse files Browse the repository at this point in the history
  • Loading branch information
Grzesiek Blachliński authored and TorsteinHonsi committed May 24, 2017
1 parent ee798c4 commit 31339e8
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 31 deletions.
47 changes: 28 additions & 19 deletions js/parts-3d/Column.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,16 @@ wrap(seriesTypes.column.prototype, 'translate', function (proceed) {
chart = series.chart,
seriesOptions = series.options,
depth = seriesOptions.depth || 25,
stack = seriesOptions.stacking ?
(seriesOptions.stack || 0) :
series.index, // #4743
z = stack * (depth + (seriesOptions.groupZPadding || 1)),
borderCrisp = series.borderWidth % 2 ? 0.5 : 0;

if (
(chart.inverted && !series.yAxis.reversed) ||
(!chart.inverted && series.yAxis.reversed)
) {
if (chart.inverted && !series.yAxis.reversed) {
borderCrisp *= -1;
}

var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series.index; // #4743
var z = stack * (depth + (seriesOptions.groupZPadding || 1));

if (seriesOptions.grouping !== false) {
z = 0;
}
Expand All @@ -55,26 +53,37 @@ wrap(seriesTypes.column.prototype, 'translate', function (proceed) {
// Array for final shapeArgs calculation.
// We are checking two dimensions (x and y).
dimensions = [['x', 'width'], ['y', 'height']],
borderlessBase; // crisped rects can have +/- 0.5 pixels offset
borderlessBase; // Crisped rects can have +/- 0.5 pixels offset.

// #3131 We need to check if column shape arguments are inside plotArea.
// #3131 We need to check if column is inside plotArea.
each(dimensions, function (d) {
borderlessBase = shapeArgs[d[0]] - borderCrisp;
if (borderlessBase < 0) {
// If borderLessBase is smaller than 0, it is needed to set
// its value to 0 or 0.5 depending on borderWidth
// borderWidth may be even or odd.
shapeArgs[d[1]] += shapeArgs[d[0]] + borderCrisp;
shapeArgs[d[0]] = -borderCrisp;
borderlessBase = 0;
}
if (
borderlessBase + shapeArgs[d[1]] > series[d[0] + 'Axis'].len &&
shapeArgs[d[1]] !== 0 // Do not change height/width of column if 0.
// #6708
) {
shapeArgs[d[1]] = series[d[0] + 'Axis'].len - shapeArgs[d[0]];
}
if (
borderlessBase + shapeArgs[d[1]] < 0 || // End column position is smaller than axis start.
borderlessBase > series[d[0] + 'Axis'].len // Start column position is bigger than axis end.
) {
(shapeArgs[d[1]] !== 0) && // Do not remove columns with zero height/width.
(
shapeArgs[d[0]] >= series[d[0] + 'Axis'].len ||
shapeArgs[d[0]] + shapeArgs[d[1]] <= borderCrisp
)
) {
for (var key in shapeArgs) { // Set args to 0 if column is outside the chart.
shapeArgs[key] = 0;
}
}
if (borderlessBase < 0) {
shapeArgs[d[1]] += shapeArgs[d[0]];
shapeArgs[d[0]] = 0;
}
if (borderlessBase + shapeArgs[d[1]] > series[d[0] + 'Axis'].len) {
shapeArgs[d[1]] = series[d[0] + 'Axis'].len - shapeArgs[d[0]];
}
});

point.shapeType = 'cuboid';
Expand Down
74 changes: 62 additions & 12 deletions samples/unit-tests/3d/column-crop/demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ $(function () {
chart: {
renderTo: 'container',
type: 'column',
animation: false,
options3d: {
enabled: true,
alpha: 10,
Expand All @@ -21,6 +22,7 @@ $(function () {
},
plotOptions: {
column: {
animation: false,
grouping: false,
groupZPadding: 10,
pointPadding: 0.2,
Expand Down Expand Up @@ -50,18 +52,66 @@ $(function () {
}]
});

shapeArgs0 = chart.series[0].data[0].shapeArgs;
shapeArgs1 = chart.series[0].data[1].shapeArgs;
var testColumnCrop = function (chart, string) {
shapeArgs0 = chart.series[0].data[0].shapeArgs;
shapeArgs1 = chart.series[0].data[1].shapeArgs;
assert.strictEqual(
(
shapeArgs0.x >= -0.5 &&
shapeArgs1.x >= -0.5 &&
shapeArgs0.x + shapeArgs0.width <= chart.xAxis[0].len + 0.5 &&
shapeArgs0.y + shapeArgs0.height <= chart.yAxis[0].len + 0.5 &&
shapeArgs1.x + shapeArgs1.width <= chart.xAxis[0].len + 0.5 &&
shapeArgs1.y + shapeArgs1.height <= chart.yAxis[0].len + 0.5
),
true,
string + ' are cropped outside plotArea'
);

chart.yAxis[0].update({
reversed: true
});

shapeArgs0 = chart.series[0].data[0].shapeArgs;
shapeArgs1 = chart.series[0].data[1].shapeArgs;
assert.strictEqual(
(
shapeArgs0.x === shapeArgs1.x &&
shapeArgs0.y === shapeArgs1.y &&
shapeArgs0.height === shapeArgs1.height &&
shapeArgs0.width === shapeArgs1.width
),
true,
string + ' are cropped outside plotArea with reversed axis'
);

chart.yAxis[0].setExtremes(5, 10);

shapeArgs0 = chart.series[0].data[0].shapeArgs;
assert.strictEqual(
(
shapeArgs0.x !== 0 ||
shapeArgs0.y !== 0
),
true,
'0 ' + string + ' are visible inside plotArea'
);
};
chart.yAxis[0].setExtremes(2,5);
testColumnCrop(chart, 'Columns');

chart.update({
chart:{
inverted: true
},
yAxis: {
reversed: false,
}
});

chart.yAxis[0].setExtremes(2,5);

testColumnCrop(chart, 'Bars');

assert.strictEqual(
(
shapeArgs0.x === shapeArgs1.x &&
shapeArgs0.y === shapeArgs1.y &&
shapeArgs0.height === shapeArgs1.height &&
shapeArgs0.width === shapeArgs1.width
),
true,
'Columns are cropped outside plotArea'
);
});
});

0 comments on commit 31339e8

Please sign in to comment.