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); }