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:
@@ -33,7 +33,6 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
|
||||
|
||||
viewfinder_ = new ViewFinder(this);
|
||||
setCentralWidget(viewfinder_);
|
||||
viewfinder_->setFixedSize(500, 500);
|
||||
adjustSize();
|
||||
|
||||
ret = openCamera(cm);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
#ifndef __QCAM_VIEWFINDER_H__
|
||||
#define __QCAM_VIEWFINDER_H__
|
||||
|
||||
#include <QLabel>
|
||||
#include <QWidget>
|
||||
|
||||
#include "format_converter.h"
|
||||
|
||||
class QImage;
|
||||
|
||||
class ViewFinder : public QLabel
|
||||
class ViewFinder : public QWidget
|
||||
{
|
||||
public:
|
||||
ViewFinder(QWidget *parent);
|
||||
@@ -23,6 +23,10 @@ public:
|
||||
unsigned int height);
|
||||
void display(const unsigned char *rgb, size_t size);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *) override;
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
unsigned int format_;
|
||||
unsigned int width_;
|
||||
|
||||
Reference in New Issue
Block a user