Added NoFaceDetection quirk
[harmattan/cameraplus] / declarative / viewfinder.cpp
index d212c35..841fd14 100644 (file)
 #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() {
@@ -74,12 +93,14 @@ void Viewfinder::setCamera(Camera *camera) {
 
   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()) {
@@ -117,19 +138,33 @@ void Viewfinder::setCameraConfig(CameraConfig *config) {
   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 {
@@ -141,7 +176,11 @@ QSizeF Viewfinder::videoResolution() 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());
@@ -149,6 +188,12 @@ void Viewfinder::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeo
 }
 
 void Viewfinder::componentComplete() {
+#if defined(QT4)
+  QDeclarativeItem::componentComplete();
+#elif defined(QT5)
+  QQuickPaintedItem::componentComplete();
+#endif
+
   if (!m_cam) {
     qmlInfo(this) << "Camera not set";
     return;
@@ -177,10 +222,15 @@ void Viewfinder::deviceChanged() {
     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();
@@ -191,12 +241,6 @@ GstElement *Viewfinder::sinkElement() {
   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();
@@ -208,3 +252,10 @@ void Viewfinder::updateRequested() {
     update();
   }
 }
+
+void Viewfinder::prepareForDeviceChange() {
+  if (m_dev) {
+    m_dev->setViewfinder(0);
+    m_dev = 0;
+  }
+}