protected void drawDataSet(Canvas c, CandleDataSet dataSet) {

    Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());

    float phaseX = mAnimator.getPhaseX();
    float phaseY = mAnimator.getPhaseY();

    int dataSetIndex = mChart.getCandleData().getIndexOfDataSet(dataSet);

    List<CandleEntry> entries = dataSet.getYVals();

    Entry entryFrom = dataSet.getEntryForXIndex(mMinX);
    Entry entryTo = dataSet.getEntryForXIndex(mMaxX);

    int minx = Math.max(dataSet.getEntryPosition(entryFrom), 0);
    int maxx = Math.min(dataSet.getEntryPosition(entryTo) + 1, entries.size());

    int range = (maxx - minx) * 4;
    int to = (int) Math.ceil((maxx - minx) * phaseX + minx);

    CandleShadowBuffer shadowBuffer = mShadowBuffers[dataSetIndex];
    shadowBuffer.setPhases(phaseX, phaseY);
    shadowBuffer.limitFrom(minx);
    shadowBuffer.limitTo(maxx);
    shadowBuffer.feed(entries);

    trans.pointValuesToPixel(shadowBuffer.buffer);

    mRenderPaint.setStyle(Paint.Style.STROKE);

    // If not set, use default functionality for backward compatibility
    if (dataSet.getShadowColor() == ColorTemplate.COLOR_NONE) {
      mRenderPaint.setColor(dataSet.getColor());
    } else {
      mRenderPaint.setColor(dataSet.getShadowColor());
    }

    mRenderPaint.setStrokeWidth(dataSet.getShadowWidth());

    // draw the shadow
    c.drawLines(shadowBuffer.buffer, 0, range, mRenderPaint);

    CandleBodyBuffer bodyBuffer = mBodyBuffers[dataSetIndex];
    bodyBuffer.setBodySpace(dataSet.getBodySpace());
    bodyBuffer.setPhases(phaseX, phaseY);
    bodyBuffer.limitFrom(minx);
    bodyBuffer.limitTo(maxx);
    bodyBuffer.feed(entries);

    trans.pointValuesToPixel(bodyBuffer.buffer);

    // draw the body
    for (int j = 0; j < range; j += 4) {

      // get the entry
      CandleEntry e = entries.get(j / 4 + minx);

      if (!fitsBounds(e.getXIndex(), mMinX, to)) continue;

      float leftBody = bodyBuffer.buffer[j];
      float open = bodyBuffer.buffer[j + 1];
      float rightBody = bodyBuffer.buffer[j + 2];
      float close = bodyBuffer.buffer[j + 3];

      // draw body differently for increasing and decreasing entry
      if (open > close) { // decreasing

        if (dataSet.getDecreasingColor() == ColorTemplate.COLOR_NONE) {
          mRenderPaint.setColor(dataSet.getColor(j / 4 + minx));
        } else {
          mRenderPaint.setColor(dataSet.getDecreasingColor());
        }

        mRenderPaint.setStyle(dataSet.getDecreasingPaintStyle());
        // draw the body
        c.drawRect(leftBody, close, rightBody, open, mRenderPaint);

      } else if (open < close) {

        if (dataSet.getIncreasingColor() == ColorTemplate.COLOR_NONE) {
          mRenderPaint.setColor(dataSet.getColor(j / 4 + minx));
        } else {
          mRenderPaint.setColor(dataSet.getIncreasingColor());
        }

        mRenderPaint.setStyle(dataSet.getIncreasingPaintStyle());
        // draw the body
        c.drawRect(leftBody, open, rightBody, close, mRenderPaint);
      } else { // equal values

        mRenderPaint.setColor(Color.BLACK);
        mRenderPaint.setStyle(Paint.Style.STROKE);
        c.drawLine(leftBody, open, rightBody, close, mRenderPaint);
      }
    }
  }