#include "camera.h"
#include "cameraconfig.h"
#include "qtcamviewfinderrenderer.h"
+#if defined(QT4)
#include <QDeclarativeInfo>
+#elif defined(QT5)
+#include <QQmlInfo>
+#endif
#include <QPainter>
#include "qtcamdevice.h"
+#include <QMatrix4x4>
+#if defined(QT4)
Viewfinder::Viewfinder(QDeclarativeItem *parent) :
QDeclarativeItem(parent),
+#elif defined(QT5)
+Viewfinder::Viewfinder(QQuickItem *parent) :
+ QQuickPaintedItem(parent),
+#endif
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) {
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()) {
emit cameraConfigChanged();
}
+#if defined(QT4)
void Viewfinder::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget) {
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
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::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry) {
+#if defined(QT4)
QDeclarativeItem::geometryChanged(newGeometry, oldGeometry);
+#elif defined(QT5)
+ QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
+#endif
if (m_renderer) {
m_renderer->resize(newGeometry.size());
}
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;
+ }
+}