Declarative ROI can now report unnormalized ROI coordinates using the normalize property
authorMohammed Sameer <msameer@foolab.org>
Sun, 3 Feb 2013 18:34:01 +0000 (20:34 +0200)
committerMohammed Sameer <msameer@foolab.org>
Sun, 3 Feb 2013 19:39:34 +0000 (21:39 +0200)
declarative/roi.cpp
declarative/roi.h
lib/qtcamroi.cpp
lib/qtcamroi.h
qml/main.qml

index 65a9643..ee3db75 100644 (file)
 
 #include "roi.h"
 #include "qtcamroi.h"
+#include "qtcamdevice.h"
+#include "qtcamviewfinder.h"
+
+class UnNormalizer {
+public:
+  void init(const QRectF& renderArea, bool normalize) {
+    m_area = renderArea;
+    m_normalize = normalize;
+  }
+
+  QRectF unNormalize(const QRectF& rect) {
+    if (m_normalize) {
+      return rect;
+    }
+
+    return QRectF(rect.x() * m_area.width(),
+                 rect.y() * m_area.height(),
+                 rect.width() * m_area.width(),
+                 rect.height() * m_area.height());
+  }
+
+  QVariantList unNormalize(const QList<QRectF>& rects) {
+    QVariantList vars;
+
+    foreach (const QRectF& rect, rects) {
+      vars.append(QVariant::fromValue(unNormalize(rect)));
+    }
+
+    return vars;
+  }
+
+private:
+  QRectF m_area;
+  bool m_normalize;
+};
 
 Roi::Roi(QtCamDevice *device, QObject *parent) :
   QObject(parent),
-  m_roi(new QtCamRoi(device)) {
+  m_roi(new QtCamRoi(device)),
+  m_normalize(true) {
 
   QObject::connect(m_roi,
                   SIGNAL(regionsOfInterestUpdated(const QList<QRectF>&, const QRectF&, const QList<QRectF>&)),
@@ -58,19 +94,24 @@ void Roi::resetRegionOfInterest() {
 void Roi::handleRegionsChanged(const QList<QRectF>& regions, const QRectF& primary,
                               const QList<QRectF>& rest) {
 
-  QVariantList regionsList = variantList(regions);
-  QVariantList restList = variantList(rest);
-  QVariant primaryRect = QVariant::fromValue(primary);
+  UnNormalizer n;
+
+  n.init(m_roi->device()->viewfinder()->renderArea(), m_normalize);
+
+  QVariantList regionsList = n.unNormalize(regions);
+  QVariantList restList = n.unNormalize(rest);
+  QVariant primaryRect = QVariant::fromValue(n.unNormalize(primary));
 
   emit regionsChanged(regionsList, primaryRect, restList);
 }
 
-QVariantList Roi::variantList(const QList<QRectF>& rects) {
-  QVariantList list;
+bool Roi::normalize() const {
+  return m_normalize;
+}
 
-  foreach(const QRectF& rect, rects) {
-    list.append(QVariant::fromValue(rect));
+void Roi::setNormalize(bool normalize) {
+  if (normalize != m_normalize) {
+    m_normalize = normalize;
+    emit normalizeChanged();
   }
-
-  return list;
 }
index c019d2a..c06d6b7 100644 (file)
@@ -34,6 +34,7 @@ class Roi : public QObject {
   Q_OBJECT
 
   Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged);
+  Q_PROPERTY(bool normalize READ normalize WRITE setNormalize NOTIFY normalizeChanged);
 
 public:
   Roi(QtCamDevice *device, QObject *parent = 0);
@@ -44,12 +45,16 @@ public:
 
   QList<QRectF> regions();
 
+  bool normalize() const;
+  void setNormalize(bool normalize);
+
 public slots:
   void setRegionOfInterest(const QRectF& region);
   void resetRegionOfInterest();
 
 signals:
   void enabledChanged();
+  void normalizeChanged();
   void regionsChanged(const QVariantList& regions, const QVariant& primary,
                      const QVariantList& rest);
 
@@ -58,9 +63,8 @@ private slots:
                            const QList<QRectF>& rest);
 
 private:
-  QVariantList variantList(const QList<QRectF>& rects);
-
   QtCamRoi *m_roi;
+  bool m_normalize;
 };
 
 #endif /* ROI_H */
index fc7e3b7..77f4b42 100644 (file)
@@ -122,3 +122,7 @@ bool QtCamRoi::isEnabled() {
 
   return val == TRUE;
 }
+
+QtCamDevice *QtCamRoi::device() {
+  return d_ptr->dev;
+}
index 90e8d9c..9ebe3d0 100644 (file)
@@ -44,6 +44,8 @@ public:
 
   bool isEnabled();
 
+  QtCamDevice *device();
+
 signals:
   void regionsOfInterestUpdated(const QList<QRectF>& regions,
                                const QRectF& primary,
index 4a8edb2..e746263 100644 (file)
@@ -241,6 +241,8 @@ PageStackWindow {
                 id: cam
                 anchors.fill: parent
 
+                onRoiChanged: roi.normalize = false;
+
                 GridLines {
                         x: cam.renderArea.x
                         y: cam.renderArea.y