DRYed scatter code, simplified IShapeRenderer implementations
diff --git a/MPChartExample/src/com/xxmassdeveloper/mpchartexample/custom/CustomScatterShapeRenderer.java b/MPChartExample/src/com/xxmassdeveloper/mpchartexample/custom/CustomScatterShapeRenderer.java
index 77ffe27..6279e39 100644
--- a/MPChartExample/src/com/xxmassdeveloper/mpchartexample/custom/CustomScatterShapeRenderer.java
+++ b/MPChartExample/src/com/xxmassdeveloper/mpchartexample/custom/CustomScatterShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.renderer.scatter.IShapeRenderer;
 import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -16,28 +15,16 @@
 {
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
-        final float shapeHalf = shapeSize / 2f;
+        final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
 
-        for (int i = 0; i < buffer.size(); i += 2) {
-
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
-
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            c.drawLine(
-                    buffer.buffer[i] - shapeHalf,
-                    buffer.buffer[i + 1] - shapeHalf,
-                    buffer.buffer[i] + shapeHalf,
-                    buffer.buffer[i + 1] + shapeHalf,
-                    renderPaint);
-        }
+        c.drawLine(
+                posX - shapeHalf,
+                posY - shapeHalf,
+                posX + shapeHalf,
+                posY + shapeHalf,
+                renderPaint);
     }
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/buffer/ScatterBuffer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/buffer/ScatterBuffer.java
deleted file mode 100644
index 14b75fb..0000000
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/buffer/ScatterBuffer.java
+++ /dev/null
@@ -1,31 +0,0 @@
-
-package com.github.mikephil.charting.buffer;
-
-import com.github.mikephil.charting.data.Entry;
-import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
-
-public class ScatterBuffer extends AbstractBuffer<IScatterDataSet> {
-    
-    public ScatterBuffer(int size) {
-        super(size);
-    }
-
-    protected void addForm(float x, float y) {
-        buffer[index++] = x;
-        buffer[index++] = y;
-    }
-
-    @Override
-    public void feed(IScatterDataSet data) {
-        
-        float size = data.getEntryCount() * phaseX;
-        
-        for (int i = 0; i < size; i++) {
-
-            Entry e = data.getEntryForIndex(i);
-            addForm(e.getX(), e.getY() * phaseY);
-        }
-        
-        reset();
-    }
-}
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ScatterChartRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ScatterChartRenderer.java
index e3da3cc..faf2395 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ScatterChartRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/ScatterChartRenderer.java
@@ -2,9 +2,9 @@
 package com.github.mikephil.charting.renderer;
 
 import android.graphics.Canvas;
+import android.util.Log;
 
 import com.github.mikephil.charting.animation.ChartAnimator;
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.data.Entry;
 import com.github.mikephil.charting.data.ScatterData;
 import com.github.mikephil.charting.highlight.Highlight;
@@ -22,8 +22,6 @@
 
     protected ScatterDataProvider mChart;
 
-    protected ScatterBuffer[] mScatterBuffers;
-
     public ScatterChartRenderer(ScatterDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) {
         super(animator, viewPortHandler);
         mChart = chart;
@@ -31,15 +29,6 @@
 
     @Override
     public void initBuffers() {
-
-        ScatterData scatterData = mChart.getScatterData();
-
-        mScatterBuffers = new ScatterBuffer[scatterData.getDataSetCount()];
-
-        for (int i = 0; i < mScatterBuffers.length; i++) {
-            IScatterDataSet set = scatterData.getDataSetByIndex(i);
-            mScatterBuffers[i] = new ScatterBuffer(set.getEntryCount() * 2);
-        }
     }
 
     @Override
@@ -57,28 +46,47 @@
         }
     }
 
+    float[] mPixelBuffer = new float[2];
+
     protected void drawDataSet(Canvas c, IScatterDataSet dataSet) {
 
+        ViewPortHandler viewPortHandler = mViewPortHandler;
+
         Transformer trans = mChart.getTransformer(dataSet.getAxisDependency());
 
-        float phaseX = Math.max(0.f, Math.min(1.f, mAnimator.getPhaseX()));
         float phaseY = mAnimator.getPhaseY();
 
-        final float shapeSize = Utils.convertDpToPixel(dataSet.getScatterShapeSize());
-
-        ScatterBuffer buffer = mScatterBuffers[mChart.getScatterData().getIndexOfDataSet(dataSet)];
-        buffer.setPhases(phaseX, phaseY);
-        buffer.feed(dataSet);
-
-        trans.pointValuesToPixel(buffer.buffer);
-
         IShapeRenderer renderer = dataSet.getShapeRenderer();
+        if (renderer == null) {
+            Log.i("MISSING", "There's no IShapeRenderer specified for ScatterDataSet");
+            return;
+        }
 
-        if (renderer != null) {
-            renderer.renderShape(c, dataSet, mViewPortHandler, buffer, mRenderPaint, shapeSize);
-        } else {
-            throw new RuntimeException("No IShapeRenderer found for provided identifier. Please make sure to add a IShapeRenderer" +
-                    " capable of rendering the provided shape.");
+        int max = (int)(Math.min(
+                Math.ceil((float)dataSet.getEntryCount() * mAnimator.getPhaseX()),
+                (float)dataSet.getEntryCount()));
+
+        for (int i = 0; i < max; i++) {
+
+            Entry e = dataSet.getEntryForIndex(i);
+
+            mPixelBuffer[0] = e.getX();
+            mPixelBuffer[1] = e.getY() * phaseY;
+
+            trans.pointValuesToPixel(mPixelBuffer);
+
+            if (!viewPortHandler.isInBoundsRight(mPixelBuffer[0]))
+                break;
+
+            if (!viewPortHandler.isInBoundsLeft(mPixelBuffer[0])
+                    || !viewPortHandler.isInBoundsY(mPixelBuffer[1]))
+                continue;
+
+            mRenderPaint.setColor(dataSet.getColor(i / 2));
+            renderer.renderShape(
+                    c, dataSet, mViewPortHandler,
+                    mPixelBuffer[0], mPixelBuffer[1],
+                    mRenderPaint);
         }
     }
 
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronDownShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronDownShapeRenderer.java
index cdc3f2a..9328b27 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronDownShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronDownShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.Utils;
 import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,39 +16,26 @@
 
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                     float posX, float posY, Paint renderPaint) {
 
-        final float shapeHalf = shapeSize / 2f;
+        final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
 
         renderPaint.setStyle(Paint.Style.STROKE);
         renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
 
-        for (int i = 0; i < buffer.size(); i += 2) {
+        c.drawLine(
+                posX,
+                posY + (2 * shapeHalf),
+                posX + (2 * shapeHalf),
+                posY,
+                renderPaint);
 
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
-
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            c.drawLine(
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] + (2 * shapeHalf),
-                    buffer.buffer[i] + (2 * shapeHalf),
-                    buffer.buffer[i + 1],
-                    renderPaint);
-
-            c.drawLine(
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] + (2 * shapeHalf),
-                    buffer.buffer[i] - (2 * shapeHalf),
-                    buffer.buffer[i + 1],
-                    renderPaint);
-        }
-
+        c.drawLine(
+                posX,
+                posY + (2 * shapeHalf),
+                posX - (2 * shapeHalf),
+                posY,
+                renderPaint);
     }
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronUpShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronUpShapeRenderer.java
index f4185bf..6dea0ab 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronUpShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/ChevronUpShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.Utils;
 import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,39 +16,27 @@
 
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
-        final float shapeHalf = shapeSize / 2f;
+        final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
 
         renderPaint.setStyle(Paint.Style.STROKE);
         renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
 
-        for (int i = 0; i < buffer.size(); i += 2) {
+        c.drawLine(
+                posX,
+                posY - (2 * shapeHalf),
+                posX + (2 * shapeHalf),
+                posY,
+                renderPaint);
 
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
-
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            c.drawLine(
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] - (2 * shapeHalf),
-                    buffer.buffer[i] + (2 * shapeHalf),
-                    buffer.buffer[i + 1],
-                    renderPaint);
-
-            c.drawLine(
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] - (2 * shapeHalf),
-                    buffer.buffer[i] - (2 * shapeHalf),
-                    buffer.buffer[i + 1],
-                    renderPaint);
-        }
+        c.drawLine(
+                posX,
+                posY - (2 * shapeHalf),
+                posX - (2 * shapeHalf),
+                posY,
+                renderPaint);
 
     }
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CircleShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CircleShapeRenderer.java
index 98ed8c1..ac7abb9 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CircleShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CircleShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.ColorTemplate;
 import com.github.mikephil.charting.utils.Utils;
@@ -17,9 +16,10 @@
 {
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
+        final float shapeSize = dataSet.getScatterShapeSize();
         final float shapeHalf = shapeSize / 2f;
         final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
         final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@@ -28,46 +28,34 @@
 
         final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
 
-        for (int i = 0; i < buffer.size(); i += 2) {
+        if (shapeSize > 0.0) {
+            renderPaint.setStyle(Paint.Style.STROKE);
+            renderPaint.setStrokeWidth(shapeStrokeSize);
 
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
+            c.drawCircle(
+                    posX,
+                    posY,
+                    shapeHoleSizeHalf + shapeStrokeSizeHalf,
+                    renderPaint);
 
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            if (shapeSize > 0.0) {
-                renderPaint.setStyle(Paint.Style.STROKE);
-                renderPaint.setStrokeWidth(shapeStrokeSize);
-
-                c.drawCircle(
-                        buffer.buffer[i],
-                        buffer.buffer[i + 1],
-                        shapeHoleSizeHalf + shapeStrokeSizeHalf,
-                        renderPaint);
-
-                if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
-                    renderPaint.setStyle(Paint.Style.FILL);
-
-                    renderPaint.setColor(shapeHoleColor);
-                    c.drawCircle(
-                            buffer.buffer[i],
-                            buffer.buffer[i + 1],
-                            shapeHoleSizeHalf,
-                            renderPaint);
-                }
-            } else {
+            if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
                 renderPaint.setStyle(Paint.Style.FILL);
 
+                renderPaint.setColor(shapeHoleColor);
                 c.drawCircle(
-                        buffer.buffer[i],
-                        buffer.buffer[i + 1],
-                        shapeHalf,
+                        posX,
+                        posY,
+                        shapeHoleSizeHalf,
                         renderPaint);
             }
+        } else {
+            renderPaint.setStyle(Paint.Style.FILL);
+
+            c.drawCircle(
+                    posX,
+                    posY,
+                    shapeHalf,
+                    renderPaint);
         }
 
     }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CrossShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CrossShapeRenderer.java
index 3273490..202670d 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CrossShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/CrossShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.Utils;
 import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,39 +16,26 @@
 
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
-        final float shapeHalf = shapeSize / 2f;
-
+        final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
 
         renderPaint.setStyle(Paint.Style.STROKE);
         renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
 
-        for (int i = 0; i < buffer.size(); i += 2) {
-
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
-
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            c.drawLine(
-                    buffer.buffer[i] - shapeHalf,
-                    buffer.buffer[i + 1],
-                    buffer.buffer[i] + shapeHalf,
-                    buffer.buffer[i + 1],
-                    renderPaint);
-            c.drawLine(
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] - shapeHalf,
-                    buffer.buffer[i],
-                    buffer.buffer[i + 1] + shapeHalf,
-                    renderPaint);
-        }
+        c.drawLine(
+                posX - shapeHalf,
+                posY,
+                posX + shapeHalf,
+                posY,
+                renderPaint);
+        c.drawLine(
+                posX,
+                posY - shapeHalf,
+                posX,
+                posY + shapeHalf,
+                renderPaint);
 
     }
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/IShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/IShapeRenderer.java
index f89d6f6..20b57a9 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/IShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/IShapeRenderer.java
@@ -3,8 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
-import com.github.mikephil.charting.charts.ScatterChart;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.ViewPortHandler;
 
@@ -19,12 +17,12 @@
      * Renders the provided ScatterDataSet with a shape.
      *
      * @param c               Canvas object for drawing the shape
-     * @param dataSet         the DataSet to be drawn
-     * @param viewPortHandler contains information about the current state of the view
-     * @param buffer          buffer containing the transformed values of all entries in the DataSet
+     * @param dataSet         The DataSet to be drawn
+     * @param viewPortHandler Contains information about the current state of the view
+     * @param posX            Position to draw the shape at
+     * @param posY            Position to draw the shape at
      * @param renderPaint     Paint object used for styling and drawing
-     * @param shapeSize
      */
-    void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize);
+    void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                     float posX, float posY, Paint renderPaint);
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/SquareShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/SquareShapeRenderer.java
index 7467047..ac98679 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/SquareShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/SquareShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.ColorTemplate;
 import com.github.mikephil.charting.utils.Utils;
@@ -18,9 +17,10 @@
 
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
+        final float shapeSize = dataSet.getScatterShapeSize();
         final float shapeHalf = shapeSize / 2f;
         final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
         final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@@ -29,47 +29,35 @@
 
         final int shapeHoleColor = dataSet.getScatterShapeHoleColor();
 
-        for (int i = 0; i < buffer.size(); i += 2) {
+        if (shapeSize > 0.0) {
+            renderPaint.setStyle(Paint.Style.STROKE);
+            renderPaint.setStrokeWidth(shapeStrokeSize);
 
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
+            c.drawRect(posX - shapeHoleSizeHalf - shapeStrokeSizeHalf,
+                    posY - shapeHoleSizeHalf - shapeStrokeSizeHalf,
+                    posX + shapeHoleSizeHalf + shapeStrokeSizeHalf,
+                    posY + shapeHoleSizeHalf + shapeStrokeSizeHalf,
+                    renderPaint);
 
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            if (shapeSize > 0.0) {
-                renderPaint.setStyle(Paint.Style.STROKE);
-                renderPaint.setStrokeWidth(shapeStrokeSize);
-
-                c.drawRect(buffer.buffer[i] - shapeHoleSizeHalf - shapeStrokeSizeHalf,
-                        buffer.buffer[i + 1] - shapeHoleSizeHalf - shapeStrokeSizeHalf,
-                        buffer.buffer[i] + shapeHoleSizeHalf + shapeStrokeSizeHalf,
-                        buffer.buffer[i + 1] + shapeHoleSizeHalf + shapeStrokeSizeHalf,
-                        renderPaint);
-
-                if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
-                    renderPaint.setStyle(Paint.Style.FILL);
-
-                    renderPaint.setColor(shapeHoleColor);
-                    c.drawRect(buffer.buffer[i] - shapeHoleSizeHalf,
-                            buffer.buffer[i + 1] - shapeHoleSizeHalf,
-                            buffer.buffer[i] + shapeHoleSizeHalf,
-                            buffer.buffer[i + 1] + shapeHoleSizeHalf,
-                            renderPaint);
-                }
-
-            } else {
+            if (shapeHoleColor != ColorTemplate.COLOR_NONE) {
                 renderPaint.setStyle(Paint.Style.FILL);
 
-                c.drawRect(buffer.buffer[i] - shapeHalf,
-                        buffer.buffer[i + 1] - shapeHalf,
-                        buffer.buffer[i] + shapeHalf,
-                        buffer.buffer[i + 1] + shapeHalf,
+                renderPaint.setColor(shapeHoleColor);
+                c.drawRect(posX - shapeHoleSizeHalf,
+                        posY - shapeHoleSizeHalf,
+                        posX + shapeHoleSizeHalf,
+                        posY + shapeHoleSizeHalf,
                         renderPaint);
             }
+
+        } else {
+            renderPaint.setStyle(Paint.Style.FILL);
+
+            c.drawRect(posX - shapeHalf,
+                    posY - shapeHalf,
+                    posX + shapeHalf,
+                    posY + shapeHalf,
+                    renderPaint);
         }
     }
 }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/TriangleShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/TriangleShapeRenderer.java
index f8e2f30..5343454 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/TriangleShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/TriangleShapeRenderer.java
@@ -4,7 +4,6 @@
 import android.graphics.Paint;
 import android.graphics.Path;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.ColorTemplate;
 import com.github.mikephil.charting.utils.Utils;
@@ -20,9 +19,10 @@
     protected Path mTrianglePathBuffer = new Path();
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
+        final float shapeSize = dataSet.getScatterShapeSize();
         final float shapeHalf = shapeSize / 2f;
         final float shapeHoleSizeHalf = Utils.convertDpToPixel(dataSet.getScatterShapeHoleRadius());
         final float shapeHoleSize = shapeHoleSizeHalf * 2.f;
@@ -36,55 +36,43 @@
         Path tri = mTrianglePathBuffer;
         tri.reset();
 
-        for (int i = 0; i < buffer.size(); i += 2) {
+        tri.moveTo(posX, posY - shapeHalf);
+        tri.lineTo(posX + shapeHalf, posY + shapeHalf);
+        tri.lineTo(posX - shapeHalf, posY + shapeHalf);
 
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
+        if (shapeSize > 0.0) {
+            tri.lineTo(posX, posY - shapeHalf);
 
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
+            tri.moveTo(posX - shapeHalf + shapeStrokeSize,
+                    posY + shapeHalf - shapeStrokeSize);
+            tri.lineTo(posX + shapeHalf - shapeStrokeSize,
+                    posY + shapeHalf - shapeStrokeSize);
+            tri.lineTo(posX,
+                    posY - shapeHalf + shapeStrokeSize);
+            tri.lineTo(posX - shapeHalf + shapeStrokeSize,
+                    posY + shapeHalf - shapeStrokeSize);
+        }
 
-            renderPaint.setColor(dataSet.getColor(i / 2));
+        tri.close();
 
-            tri.moveTo(buffer.buffer[i], buffer.buffer[i + 1] - shapeHalf);
-            tri.lineTo(buffer.buffer[i] + shapeHalf, buffer.buffer[i + 1] + shapeHalf);
-            tri.lineTo(buffer.buffer[i] - shapeHalf, buffer.buffer[i + 1] + shapeHalf);
+        c.drawPath(tri, renderPaint);
+        tri.reset();
 
-            if (shapeSize > 0.0) {
-                tri.lineTo(buffer.buffer[i], buffer.buffer[i + 1] - shapeHalf);
+        if (shapeSize > 0.0 &&
+                shapeHoleColor != ColorTemplate.COLOR_NONE) {
 
-                tri.moveTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
-                        buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
-                tri.lineTo(buffer.buffer[i] + shapeHalf - shapeStrokeSize,
-                        buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
-                tri.lineTo(buffer.buffer[i],
-                        buffer.buffer[i + 1] - shapeHalf + shapeStrokeSize);
-                tri.lineTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
-                        buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
-            }
+            renderPaint.setColor(shapeHoleColor);
 
+            tri.moveTo(posX,
+                    posY - shapeHalf + shapeStrokeSize);
+            tri.lineTo(posX + shapeHalf - shapeStrokeSize,
+                    posY + shapeHalf - shapeStrokeSize);
+            tri.lineTo(posX - shapeHalf + shapeStrokeSize,
+                    posY + shapeHalf - shapeStrokeSize);
             tri.close();
 
             c.drawPath(tri, renderPaint);
             tri.reset();
-
-            if (shapeSize > 0.0 &&
-                    shapeHoleColor != ColorTemplate.COLOR_NONE) {
-
-                renderPaint.setColor(shapeHoleColor);
-
-                tri.moveTo(buffer.buffer[i],
-                        buffer.buffer[i + 1] - shapeHalf + shapeStrokeSize);
-                tri.lineTo(buffer.buffer[i] + shapeHalf - shapeStrokeSize,
-                        buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
-                tri.lineTo(buffer.buffer[i] - shapeHalf + shapeStrokeSize,
-                        buffer.buffer[i + 1] + shapeHalf - shapeStrokeSize);
-                tri.close();
-
-                c.drawPath(tri, renderPaint);
-                tri.reset();
-            }
         }
 
     }
diff --git a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/XShapeRenderer.java b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/XShapeRenderer.java
index 3c37174..225640e 100644
--- a/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/XShapeRenderer.java
+++ b/MPChartLib/src/main/java/com/github/mikephil/charting/renderer/scatter/XShapeRenderer.java
@@ -3,7 +3,6 @@
 import android.graphics.Canvas;
 import android.graphics.Paint;
 
-import com.github.mikephil.charting.buffer.ScatterBuffer;
 import com.github.mikephil.charting.interfaces.datasets.IScatterDataSet;
 import com.github.mikephil.charting.utils.Utils;
 import com.github.mikephil.charting.utils.ViewPortHandler;
@@ -17,38 +16,26 @@
 
 
     @Override
-    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler, ScatterBuffer buffer, Paint
-            renderPaint, final float shapeSize) {
+    public void renderShape(Canvas c, IScatterDataSet dataSet, ViewPortHandler viewPortHandler,
+                            float posX, float posY, Paint renderPaint) {
 
-        final float shapeHalf = shapeSize / 2f;
+        final float shapeHalf = dataSet.getScatterShapeSize() / 2f;
 
         renderPaint.setStyle(Paint.Style.STROKE);
         renderPaint.setStrokeWidth(Utils.convertDpToPixel(1f));
 
-        for (int i = 0; i < buffer.size(); i += 2) {
-
-            if (!viewPortHandler.isInBoundsRight(buffer.buffer[i]))
-                break;
-
-            if (!viewPortHandler.isInBoundsLeft(buffer.buffer[i])
-                    || !viewPortHandler.isInBoundsY(buffer.buffer[i + 1]))
-                continue;
-
-            renderPaint.setColor(dataSet.getColor(i / 2));
-
-            c.drawLine(
-                    buffer.buffer[i] - shapeHalf,
-                    buffer.buffer[i + 1] - shapeHalf,
-                    buffer.buffer[i] + shapeHalf,
-                    buffer.buffer[i + 1] + shapeHalf,
-                    renderPaint);
-            c.drawLine(
-                    buffer.buffer[i] + shapeHalf,
-                    buffer.buffer[i + 1] - shapeHalf,
-                    buffer.buffer[i] - shapeHalf,
-                    buffer.buffer[i + 1] + shapeHalf,
-                    renderPaint);
-        }
+        c.drawLine(
+                posX - shapeHalf,
+                posY - shapeHalf,
+                posX + shapeHalf,
+                posY + shapeHalf,
+                renderPaint);
+        c.drawLine(
+                posX + shapeHalf,
+                posY - shapeHalf,
+                posX - shapeHalf,
+                posY + shapeHalf,
+                renderPaint);
 
     }