qcam: Support scaling of the viewfinder

The viewfinder is drawn using a QLabel. This could support scaling
through QLabel::setScaledContents(), but in a very inefficient way. To
maintain reasonable efficiency, turn the viewfinder into a QWidget and
draw the image directly using a QPainter.

No performance change was noticed running on a fast x86 machine, and
performance was 60% higher when scaling up to full screen compared to
QLabel.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
Laurent Pinchart
2020-01-16 22:50:15 +00:00
parent 026b3af8c2
commit 9977fc3fcb
3 changed files with 21 additions and 10 deletions
+15 -7
View File
@@ -6,13 +6,13 @@
*/
#include <QImage>
#include <QPixmap>
#include <QPainter>
#include "format_converter.h"
#include "viewfinder.h"
ViewFinder::ViewFinder(QWidget *parent)
: QLabel(parent), format_(0), width_(0), height_(0), image_(nullptr)
: QWidget(parent), format_(0), width_(0), height_(0), image_(nullptr)
{
}
@@ -24,9 +24,7 @@ ViewFinder::~ViewFinder()
void ViewFinder::display(const unsigned char *raw, size_t size)
{
converter_.convert(raw, size, image_);
QPixmap pixmap = QPixmap::fromImage(*image_);
setPixmap(pixmap);
update();
}
int ViewFinder::setFormat(unsigned int format, unsigned int width,
@@ -42,10 +40,20 @@ int ViewFinder::setFormat(unsigned int format, unsigned int width,
width_ = width;
height_ = height;
setFixedSize(width, height);
delete image_;
image_ = new QImage(width, height, QImage::Format_RGB32);
updateGeometry();
return 0;
}
void ViewFinder::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawImage(rect(), *image_, image_->rect());
}
QSize ViewFinder::sizeHint() const
{
return image_ ? image_->size() : QSize(640, 480);
}