package com.github.mikephil.charting.buffer;
import com.github.mikephil.charting.data.BarEntry;
import java.util.List;
public class BarBuffer extends AbstractBuffer<BarEntry> {
protected float mBarSpace = 0f;
protected float mGroupSpace = 0f;
protected int mDataSetIndex = 0;
protected int mDataSetCount = 1;
protected boolean mContainsStacks = false;
protected boolean mInverted = false;
public BarBuffer(int size, float groupspace, int dataSetCount, boolean containsStacks) {
super(size);
this.mGroupSpace = groupspace;
this.mDataSetCount = dataSetCount;
this.mContainsStacks = containsStacks;
}
public void setBarSpace(float barspace) {
this.mBarSpace = barspace;
}
public void setDataSet(int index) {
this.mDataSetIndex = index;
}
public void setInverted(boolean inverted) {
this.mInverted = inverted;
}
protected void addBar(float left, float top, float right, float bottom) {
buffer[index++] = left;
buffer[index++] = top;
buffer[index++] = right;
buffer[index++] = bottom;
}
@Override
public void feed(List<BarEntry> entries) {
float size = entries.size() * phaseX;
int dataSetOffset = (mDataSetCount - 1);
float barSpaceHalf = mBarSpace / 2f;
float groupSpaceHalf = mGroupSpace / 2f;
float barWidth = 0.5f;
for (int i = 0; i < size; i++) {
BarEntry e = entries.get(i);
// calculate the x-position, depending on datasetcount
float x = e.getXIndex() + i * dataSetOffset + mDataSetIndex
+ mGroupSpace * i + groupSpaceHalf;
float y = e.getVal();
float [] vals = e.getVals();
if(mInverted) { // inverted axis, here, I chose performance over readability
if(!mContainsStacks || vals == null) {
float left = x - barWidth + barSpaceHalf;
float right = x + barWidth - barSpaceHalf;
float bottom = y >= 0 ? y : 0;
float top = y <= 0 ? y : 0;
// multiply the height of the rect with the phase
if (top > 0)
top *= phaseY;
else
bottom *= phaseY;
addBar(left, top, right, bottom);
} else {
float all = e.getVal();
// fill the stack
for (int k = 0; k < vals.length; k++) {
all -= vals[k];
y = vals[k] + all;
float left = x - barWidth + barSpaceHalf;
float right = x + barWidth - barSpaceHalf;
float bottom = y >= 0 ? y : 0;
float top = y <= 0 ? y : 0;
// multiply the height of the rect with the phase
if (top > 0)
top *= phaseY;
else
bottom *= phaseY;
addBar(left, top, right, bottom);
}
}
} else { // non inverted axis
if(!mContainsStacks || vals == null) {
float left = x - barWidth + barSpaceHalf;
float right = x + barWidth - barSpaceHalf;
float top = y >= 0 ? y : 0;
float bottom = y <= 0 ? y : 0;
// multiply the height of the rect with the phase
if (top > 0)
top *= phaseY;
else
bottom *= phaseY;
addBar(left, top, right, bottom);
} else {
float all = e.getVal();
// fill the stack
for (int k = 0; k < vals.length; k++) {
all -= vals[k];
y = vals[k] + all;
float left = x - barWidth + barSpaceHalf;
float right = x + barWidth - barSpaceHalf;
float top = y >= 0 ? y : 0;
float bottom = y <= 0 ? y : 0;
// multiply the height of the rect with the phase
if (top > 0)
top *= phaseY;
else
bottom *= phaseY;
addBar(left, top, right, bottom);
}
}
}
}
reset();
}
}