summaryrefslogtreecommitdiff
path: root/src/qcam/viewfinder.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-16 22:50:15 +0000
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-20 18:35:12 +0200
commit9977fc3fcbfa0a6aaab04118fc67f0b9b9627570 (patch)
tree4363118cd022ddcb88c4c9bbad19eac264fad6cd /src/qcam/viewfinder.cpp
parent026b3af8c2154ad2670528dc4ca7703ca15a64cc (diff)
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>
Diffstat (limited to 'src/qcam/viewfinder.cpp')
-rw-r--r--src/qcam/viewfinder.cpp22
1 files changed, 15 insertions, 7 deletions
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 <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);
+}