diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp --- a/src/framebufferseries.cpp +++ b/src/framebufferseries.cpp @@ -25,6 +25,8 @@ FrameBufferSeries::FrameBufferSeries(Fra _xmin = 0; _xmax = 1; _buffer = buffer; + int_index_start = 0; + int_index_end = 0; } void FrameBufferSeries::setXAxis(bool asIndex, double xmin, double xmax) @@ -36,18 +38,19 @@ 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)); } } @@ -65,3 +68,22 @@ QRectF FrameBufferSeries::boundingRect() return rect; } } + +void FrameBufferSeries::setRectOfInterest(const QRectF& rect) +{ + if (xAsIndex) + { + int_index_start = rect.left(); + int_index_end = rect.right(); + } + else + { + double xsize = _xmax - _xmin; + size_t bsize = _buffer->size(); + int_index_start = bsize * (rect.left()-_xmin) / xsize; + int_index_end = bsize * (rect.right()-_xmin) / xsize; + } + + int_index_start = std::max(int_index_start, (size_t) 0); + int_index_end = std::min(_buffer->size(), int_index_end); +} diff --git a/src/framebufferseries.h b/src/framebufferseries.h --- a/src/framebufferseries.h +++ b/src/framebufferseries.h @@ -44,12 +44,16 @@ public: size_t size() const; QPointF sample(size_t i) const; QRectF boundingRect() const; + void setRectOfInterest(const QRectF& rect); private: FrameBuffer* _buffer; bool xAsIndex; double _xmin; double _xmax; + + size_t int_index_start; ///< starting index of "rectangle of interest" + size_t int_index_end; ///< ending index of "rectangle of interest" }; #endif // FRAMEBUFFERSERIES_H