From 9977fc3fcbfa0a6aaab04118fc67f0b9b9627570 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 16 Jan 2020 22:50:15 +0000 Subject: qcam: Support scaling of the viewfinder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Niklas Söderlund Reviewed-by: Kieran Bingham --- src/qcam/viewfinder.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/qcam/viewfinder.cpp') diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp index 98a8ab68..6de284d1 100644 --- a/src/qcam/viewfinder.cpp +++ b/src/qcam/viewfinder.cpp @@ -6,13 +6,13 @@ */ #include -#include +#include #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); +} -- cgit v1.2.1