#endif
#include <QPainter>
#include "qtcamdevice.h"
+#include <QMatrix4x4>
#if defined(QT4)
Viewfinder::Viewfinder(QDeclarativeItem *parent) :
m_renderer(0),
m_cam(0),
m_conf(0),
+ m_dev(0),
m_enabled(true) {
#if defined(QT4)
setFlag(QGraphicsItem::ItemHasNoContents, false);
#endif
+
+#if defined(QT5)
+ setRenderTarget(QQuickPaintedItem::FramebufferObject);
+ setSmooth(false);
+ setAntialiasing(false);
+#endif
}
Viewfinder::~Viewfinder() {
+ if (m_cam) {
+ m_cam->stop(true);
+ }
+ if (m_dev) {
+ m_dev->setViewfinder(0);
+ }
}
bool Viewfinder::isRenderingEnabled() const {
if (m_cam) {
QObject::disconnect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+ QObject::disconnect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
}
m_cam = camera;
if (m_cam) {
QObject::connect(m_cam, SIGNAL(deviceChanged()), this, SLOT(deviceChanged()));
+ QObject::connect(m_cam, SIGNAL(prepareForDeviceChange()), this, SLOT(prepareForDeviceChange()));
}
if (isComponentComplete()) {
Q_UNUSED(widget);
Q_UNUSED(option);
+ painter->fillRect(boundingRect(), Qt::black);
#elif defined(QT5)
void Viewfinder::paint(QPainter *painter) {
+ painter->fillRect(contentsBoundingRect(), Qt::black);
#endif
- painter->fillRect(boundingRect(), Qt::black);
if (!m_renderer || !m_enabled) {
return;
}
- m_renderer->paint(painter);
+ bool needsNativePainting = m_renderer->needsNativePainting();
+
+ if (needsNativePainting) {
+ painter->beginNativePainting();
+ }
+
+ m_renderer->paint(QMatrix4x4(painter->combinedTransform()), painter->viewport());
+
+ if (needsNativePainting) {
+ painter->endNativePainting();
+ }
}
QRectF Viewfinder::renderArea() const {
}
void Viewfinder::componentComplete() {
+#if defined(QT4)
+ QDeclarativeItem::componentComplete();
+#elif defined(QT5)
+ QQuickPaintedItem::componentComplete();
+#endif
+
if (!m_cam) {
qmlInfo(this) << "Camera not set";
return;
return;
}
- QtCamDevice *dev = m_cam->device();
+ if (m_dev) {
+ qmlInfo(this) << "Cannot set a new device without cleaning up the existing one";
+ abort();
+ }
+
+ m_dev = m_cam->device();
- if (dev) {
- dev->setViewfinder(this);
+ if (m_dev) {
+ m_dev->setViewfinder(this);
}
emit renderAreaChanged();
return m_renderer ? m_renderer->sinkElement() : 0;
}
-bool Viewfinder::setDevice(QtCamDevice *device) {
- Q_UNUSED(device);
-
- return true;
-}
-
void Viewfinder::stop() {
if (m_renderer) {
m_renderer->reset();
update();
}
}
+
+void Viewfinder::prepareForDeviceChange() {
+ if (m_dev) {
+ m_dev->setViewfinder(0);
+ m_dev = 0;
+ }
+}