From patchwork Fri Mar 26 22:05:40 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 11733 X-Patchwork-Delegate: kieran.bingham@ideasonboard.com Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7B989C32EB for ; Fri, 26 Mar 2021 22:05:46 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 36ECC68D6D; Fri, 26 Mar 2021 23:05:46 +0100 (CET) Authentication-Results: lancelot.ideasonboard.com; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="DU3SfTMd"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id A740F68D6A for ; Fri, 26 Mar 2021 23:05:44 +0100 (CET) Received: from localhost.localdomain (cpc89244-aztw30-2-0-cust3082.18-1.cable.virginm.net [86.31.172.11]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 02537885; Fri, 26 Mar 2021 23:05:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1616796344; bh=U8EmImkQo83KLt+f/aEsqHU+nCJQQhIGPtD7byXvAiE=; h=From:To:Cc:Subject:Date:From; b=DU3SfTMdDYir9jKA27uH8nU2D1JLnOx0HoVFEEZme67XNE1mu+ZZobmGzrmMT9S7u 7i2J11kjlXPieeCo95pjXXuYpTYoWZ7Pg2K+LpZoywGW9ITuH/RL9YCMNzNiOsxld3 pQQfgwtLv+Bzy9vkfKpaNTolgs2VRBnpaTwtgtwI= From: Kieran Bingham To: libcamera devel Date: Fri, 26 Mar 2021 22:05:40 +0000 Message-Id: <20210326220540.1479330-1-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH] qcam: viewfinder: Maintain aspect ratio X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Keep the image aspect ratio when displaying in the viewfinder. When the window is adjusted to a size that differs in aspect ratio to the image, keep the image centered in the main viewpoint while maintaining the image's aspect ratio. Signed-off-by: Kieran Bingham --- It's been really annoying me that the QCam viewfinder can scale to fit the window, but that it breaks the aspect ratio of the image it contains. I can't imagine why we would want to viewfind with an incorrect aspect ratio, but if we do we can add that as an option later. For now - enforce aspect ratio on the QT viewfinder. Of course I'm aware that this doesn't cover the GL viewfinder. That can either be handled on top, or independently if this is deemed a worthy feature. src/qcam/viewfinder_qt.cpp | 19 +++++++++++++++++-- src/qcam/viewfinder_qt.h | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/qcam/viewfinder_qt.cpp b/src/qcam/viewfinder_qt.cpp index e436714c6bdb..f6ca6793b4e4 100644 --- a/src/qcam/viewfinder_qt.cpp +++ b/src/qcam/viewfinder_qt.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -34,7 +35,7 @@ static const QMap nativeFormats }; ViewFinderQt::ViewFinderQt(QWidget *parent) - : QWidget(parent), buffer_(nullptr) + : QWidget(parent), place_(rect()), buffer_(nullptr) { icon_ = QIcon(":camera-off.svg"); } @@ -146,7 +147,7 @@ void ViewFinderQt::paintEvent(QPaintEvent *) /* If we have an image, draw it. */ if (!image_.isNull()) { - painter.drawImage(rect(), image_, image_.rect()); + painter.drawImage(place_, image_, image_.rect()); return; } @@ -179,3 +180,17 @@ QSize ViewFinderQt::sizeHint() const { return size_.isValid() ? size_ : QSize(640, 480); } + +void ViewFinderQt::resizeEvent(QResizeEvent *event) +{ + if (!size_.isValid()) { + event->accept(); + return; + } + + QPoint zero(0, 0); + place_ = QRect(zero, size_.scaled(event->size(), Qt::KeepAspectRatio)); + place_.moveCenter(QRect(zero, size()).center()); + + event->accept(); +} diff --git a/src/qcam/viewfinder_qt.h b/src/qcam/viewfinder_qt.h index d755428887c0..bf31b81b3437 100644 --- a/src/qcam/viewfinder_qt.h +++ b/src/qcam/viewfinder_qt.h @@ -42,6 +42,7 @@ Q_SIGNALS: protected: void paintEvent(QPaintEvent *) override; + void resizeEvent(QResizeEvent *) override; QSize sizeHint() const override; private: @@ -49,6 +50,7 @@ private: libcamera::PixelFormat format_; QSize size_; + QRect place_; /* Camera stopped icon */ QSize vfSize_;