diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp
--- a/src/framebufferseries.cpp
+++ b/src/framebufferseries.cpp
@@ -1,5 +1,5 @@
 /*
-  Copyright © 2017 Hasan Yavuz Özderya
+  Copyright © 2018 Hasan Yavuz Özderya
 
   This file is part of serialplot.
 
@@ -17,14 +17,17 @@
   along with serialplot.  If not, see .
 */
 
+#include 
 #include "framebufferseries.h"
 
-FrameBufferSeries::FrameBufferSeries(FrameBuffer* buffer)
+FrameBufferSeries::FrameBufferSeries(const FrameBuffer* buffer)
 {
     xAsIndex = true;
     _xmin = 0;
     _xmax = 1;
     _buffer = buffer;
+    int_index_start = 0;
+    int_index_end = _buffer->size();
 }
 
 void FrameBufferSeries::setXAxis(bool asIndex, double xmin, double xmax)
@@ -36,32 +39,56 @@ void FrameBufferSeries::setXAxis(bool as
 
 size_t FrameBufferSeries::size() const
 {
-    return _buffer->size();
+    return int_index_end - int_index_start;
 }
 
 QPointF FrameBufferSeries::sample(size_t i) const
 {
+    i += int_index_start;
     if (xAsIndex)
     {
         return QPointF(i, _buffer->sample(i));
     }
     else
     {
-        return QPointF(i * (_xmax - _xmin) / size() + _xmin, _buffer->sample(i));
+        return QPointF(i * (_xmax - _xmin) / _buffer->size() + _xmin, _buffer->sample(i));
     }
 }
 
 QRectF FrameBufferSeries::boundingRect() const
 {
+    QRectF rect;
+    auto yLim = _buffer->limits();
+    rect.setBottom(yLim.start);
+    rect.setTop(yLim.end);
     if (xAsIndex)
     {
-        return _buffer->boundingRect();
+        rect.setLeft(0);
+        rect.setRight(size());
     }
     else
     {
-        auto rect = _buffer->boundingRect();
         rect.setLeft(_xmin);
         rect.setRight(_xmax);
-        return rect;
+    }
+    return rect.normalized();
+}
+
+void FrameBufferSeries::setRectOfInterest(const QRectF& rect)
+{
+    if (xAsIndex)
+    {
+        int_index_start = floor(rect.left())-1;
+        int_index_end = ceil(rect.right())+1;
     }
+    else
+    {
+        double xsize = _xmax - _xmin;
+        size_t bsize = _buffer->size();
+        int_index_start =  floor(bsize * (rect.left()-_xmin) / xsize)-1;
+        int_index_end = ceil(bsize * (rect.right()-_xmin) / xsize)+1;
+    }
+
+    int_index_start = std::max(int_index_start, 0);
+    int_index_end = std::min((int) _buffer->size(), int_index_end);
 }