Improvements

This commit is contained in:
2020-04-30 21:06:17 +02:00
parent 81cc81fe3a
commit 96167220ca
13 changed files with 589 additions and 136 deletions

View File

@ -6,40 +6,72 @@
#include <QPainter>
#include <QPalette>
QPixmap GraphRenderer::render(const QSize &size, const frame_t *frameBegin, const frame_t *frameEnd, const QPalette &palette)
QPixmap GraphRenderer::render(const QSize &size, const frame_t *begin, const frame_t *end, const QPalette &palette)
{
QPixmap pixmap{size};
QPainter painter;
painter.begin(&pixmap);
{
QPainter painter;
painter.begin(&pixmap);
painter.fillRect(pixmap.rect(), palette.base());
painter.setPen({});
painter.setBrush(palette.base());
painter.drawRect(pixmap.rect());
painter.setBrush(palette.base());
painter.setPen(QPen{palette.color(QPalette::Text)});
painter.setBrush(palette.text());
render(pixmap.rect(), begin, end, painter);
painter.drawRect(pixmap.rect());
painter.end();
}
render(pixmap.rect(), frameBegin, frameEnd, painter, palette);
painter.end();
return pixmap;
}
void GraphRenderer::render(const QRect &rect, const frame_t *frameBegin, const frame_t *frameEnd, QPainter &painter, const QPalette &palette)
void GraphRenderer::render(const QRect &rect, const frame_t *begin, const frame_t *end, QPainter &painter)
{
if (frameEnd == frameBegin)
if (end == begin)
return;
painter.setPen(QPen{palette.color(QPalette::Text)});
painter.setBrush(palette.text());
std::pair<frame_t, frame_t> arr[rect.width()];
const auto framesPerPixel = std::distance(frameBegin, frameEnd) / rect.width();
reduceSamples(begin, end, arr, arr+rect.width());
for (int x = 0; x < rect.width(); x++)
render(rect.topLeft(), rect.height(), arr, arr+rect.width(), painter);
}
void GraphRenderer::render(const QPoint &pos, int height, std::pair<frame_t, frame_t> *begin, std::pair<frame_t, frame_t> *end, QPainter &painter)
{
int x = pos.x();
for (auto iter = begin; iter != end; iter++)
{
const frame_t *begin = frameBegin + (x * framesPerPixel);
const frame_t &min = iter->first;
const frame_t &max = iter->second;
painter.drawLine(x, pos.y() + (height / 2) - (min[0] * (height / 2)),
x, pos.y() + (height / 2) + (max[0] * (height / 2)));
x++;
}
}
void GraphRenderer::reduceSamples(const frame_t *inputBegin, const frame_t *inputEnd, std::pair<frame_t, frame_t> *outputBegin, std::pair<frame_t, frame_t> *outputEnd)
{
const auto inputLength = std::distance(inputBegin, inputEnd);
const auto outputLength = std::distance(outputBegin, outputEnd);
const auto framesPerPixel = inputLength / outputLength;
for (int i = 0; i < outputLength; i++)
{
frame_t &min = outputBegin[i].first;
frame_t &max = outputBegin[i].second;
min = {1.f, 1.f};
max = {-1.f, -1.f};
const frame_t *begin = inputBegin + (i * framesPerPixel);
const frame_t *end = begin + framesPerPixel;
frame_t min{1.f, 1.f}, max{-1.f, -1.f};
for (auto iter = begin; iter != end; iter++)
{
if ((*iter)[0] < min[0])
@ -51,8 +83,5 @@ void GraphRenderer::render(const QRect &rect, const frame_t *frameBegin, const f
if ((*iter)[1] > max[1])
max[1] = (*iter)[1];
}
painter.drawLine(rect.x() + x, rect.y() + (rect.height() / 2) - (min[0] * (rect.height() / 2)),
rect.x() + x, rect.y() + (rect.height() / 2) + (max[0] * (rect.height() / 2)));
}
}