diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp --- a/src/framebufferseries.cpp +++ b/src/framebufferseries.cpp @@ -1,5 +1,5 @@ /* - Copyright © 2016 Hasan Yavuz Özderya + Copyright © 2017 Hasan Yavuz Özderya This file is part of serialplot. @@ -17,24 +17,74 @@ along with serialplot. If not, see . */ +#include #include "framebufferseries.h" FrameBufferSeries::FrameBufferSeries(FrameBuffer* buffer) { + xAsIndex = true; + _xmin = 0; + _xmax = 1; _buffer = buffer; + int_index_start = 0; + int_index_end = 0; +} + +void FrameBufferSeries::setXAxis(bool asIndex, double xmin, double xmax) +{ + xAsIndex = asIndex; + _xmin = xmin; + _xmax = xmax; } size_t FrameBufferSeries::size() const { - return _buffer->size(); + return int_index_end - int_index_start; } QPointF FrameBufferSeries::sample(size_t i) const { - return QPointF(i, _buffer->sample(i)); + i += int_index_start; + if (xAsIndex) + { + return QPointF(i, _buffer->sample(i)); + } + else + { + return QPointF(i * (_xmax - _xmin) / _buffer->size() + _xmin, _buffer->sample(i)); + } } QRectF FrameBufferSeries::boundingRect() const { - return _buffer->boundingRect(); + if (xAsIndex) + { + return _buffer->boundingRect(); + } + else + { + auto rect = _buffer->boundingRect(); + rect.setLeft(_xmin); + rect.setRight(_xmax); + return rect; + } } + +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, (size_t) 0); + int_index_end = std::min(_buffer->size(), int_index_end); +}