blob: 773b23fd1ab2ab70abdb5081f89ff32b73b96ff3 [file] [log] [blame]
Sébastien Blin1f915762020-08-03 13:27:42 -04001/*
2 * Copyright (C) 2020 by Savoir-faire Linux
3 * Author: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
4 * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include "previewrenderer.h"
21
22#include "lrcinstance.h"
23
24PreviewRenderer::PreviewRenderer(QQuickItem *parent)
25 : QQuickPaintedItem(parent)
26{
27 setAntialiasing(true);
28 setFillColor(Qt::black);
29 setRenderTarget(QQuickPaintedItem::FramebufferObject);
30 setPerformanceHint(QQuickPaintedItem::FastFBOResizing);
31
32 previewFrameUpdatedConnection_ = connect(LRCInstance::renderer(),
33 &RenderManager::previewFrameUpdated,
34 [this]() { update(QRect(0, 0, width(), height())); });
35 previewRenderingStopped_ = connect(LRCInstance::renderer(),
36 &RenderManager::previewRenderingStopped,
37 [this]() { update(QRect(0, 0, width(), height())); });
38}
39
40PreviewRenderer::~PreviewRenderer()
41{
42 disconnect(previewFrameUpdatedConnection_);
43 disconnect(previewRenderingStopped_);
44}
45
46void
47PreviewRenderer::paint(QPainter *painter)
48{
49 auto previewImage = LRCInstance::renderer()->getPreviewFrame();
50 if (previewImage) {
51 QImage scaledPreview;
52 auto aspectRatio = static_cast<qreal>(previewImage->width())
53 / static_cast<qreal>(previewImage->height());
54 auto previewHeight = height();
55 auto previewWidth = previewHeight * aspectRatio;
56
57 /* Instead of setting fixed size, we could get an x offset for the preview
58 * but this would render the horizontal spacers in the parent widget useless.
59 * e.g.
60 * auto parent = qobject_cast<QWidget*>(this->parent());
61 * auto xPos = (parent->width() - previewWidth) / 2;
62 * setGeometry(QRect(QPoint(xPos, this->pos().y()), QSize(previewWidth, previewHeight)));
63 */
64 setWidth(previewWidth);
65 setHeight(previewHeight);
66
67 scaledPreview = previewImage->scaled(size().toSize(), Qt::KeepAspectRatio);
68 painter->drawImage(QRect(0, 0, scaledPreview.width(), scaledPreview.height()),
69 scaledPreview);
70 }
71}
72
73VideoCallPreviewRenderer::VideoCallPreviewRenderer(QQuickItem *parent)
74 : PreviewRenderer(parent)
75{}
76
77VideoCallPreviewRenderer::~VideoCallPreviewRenderer() {}
78
79qreal
80VideoCallPreviewRenderer::getPreviewImageScalingFactor()
81{
82 auto previewImage = LRCInstance::renderer()->getPreviewFrame();
83 if (previewImage) {
84 return static_cast<qreal>(previewImage->height())
85 / static_cast<qreal>(previewImage->width());
86 }
87 return 1.0;
88}
89
90void
91VideoCallPreviewRenderer::paint(QPainter *painter)
92{
93 auto previewImage = LRCInstance::renderer()->getPreviewFrame();
94
95 if (previewImage) {
96 emit previewImageAvailable();
97
98 QImage scaledPreview;
99 scaledPreview = previewImage->scaled(size().toSize(), Qt::KeepAspectRatio);
100 painter->drawImage(QRect(0, 0, scaledPreview.width(), scaledPreview.height()),
101 scaledPreview);
102 }
103}
104
105PhotoboothPreviewRender::PhotoboothPreviewRender(QQuickItem *parent)
106 : PreviewRenderer(parent)
107{
108 connect(LRCInstance::renderer(), &RenderManager::previewRenderingStopped, [this]() {
109 emit hideBooth();
110 });
111}
112
113PhotoboothPreviewRender::~PhotoboothPreviewRender() {}
114
115QImage
116PhotoboothPreviewRender::takePhoto()
117{
118 if (auto previewImage = LRCInstance::renderer()->getPreviewFrame()) {
119 return previewImage->copy();
120 }
121 return QImage();
122}
123
124QString
125PhotoboothPreviewRender::takeCroppedPhotoToBase64(int size)
126{
127 auto image = Utils::cropImage(takePhoto());
128 auto avatar = image.scaled(size, size, Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
129
130 return QString::fromLatin1(Utils::QImageToByteArray(avatar).toBase64().data());
131}
132
133void
134PhotoboothPreviewRender::paint(QPainter *painter)
135{
136 painter->setRenderHint(QPainter::Antialiasing, true);
137
138 auto previewImage = LRCInstance::renderer()->getPreviewFrame();
139 if (previewImage) {
140 QImage scaledPreview;
141 scaledPreview = Utils::getCirclePhoto(*previewImage,
142 height() <= width() ? height() : width());
143 painter->drawImage(QRect(0, 0, scaledPreview.width(), scaledPreview.height()),
144 scaledPreview);
145 }
146}