Reworking QtCamViewfinderRenderer to avoid having to pass QPainter to the renderer
authorMohammed Sameer <msameer@foolab.org>
Sun, 28 Jul 2013 18:56:59 +0000 (21:56 +0300)
committerMohammed Sameer <msameer@foolab.org>
Sun, 28 Jul 2013 18:56:59 +0000 (21:56 +0300)
declarative/videoplayer.cpp
declarative/viewfinder.cpp
lib/qtcamgraphicsviewfinder.cpp
lib/qtcamviewfinderrenderer.h
lib/qtcamviewfinderrenderermeego.cpp
lib/qtcamviewfinderrenderermeego.h

index 7110d77..0866f0c 100644 (file)
@@ -258,7 +258,17 @@ void VideoPlayer::paint(QPainter *painter) {
     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();
+  }
 }
 
 VideoPlayer::State VideoPlayer::state() const {
index 377adb7..17a7659 100644 (file)
@@ -150,7 +150,17 @@ void Viewfinder::paint(QPainter *painter) {
     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 {
index 1347fe3..4755c3d 100644 (file)
@@ -25,6 +25,7 @@
 #include "qtcamviewfinderrenderer.h"
 #include <QPainter>
 #include <QGraphicsSceneResizeEvent>
+#include <QMatrix4x4>
 
 class QtCamGraphicsViewfinderPrivate {
 public:
@@ -118,7 +119,17 @@ void QtCamGraphicsViewfinder::paint(QPainter *painter, const QStyleOptionGraphic
     return;
   }
 
-  d_ptr->renderer->paint(painter);
+  bool needsNativePainting = d_ptr->renderer->needsNativePainting();
+
+  if (needsNativePainting) {
+    painter->beginNativePainting();
+  }
+
+  d_ptr->renderer->paint(QMatrix4x4(painter->combinedTransform()), painter->viewport());
+
+  if (needsNativePainting) {
+    painter->endNativePainting();
+  }
 }
 
 void QtCamGraphicsViewfinder::resizeEvent(QGraphicsSceneResizeEvent *event) {
index aabd532..a172d5b 100644 (file)
@@ -29,7 +29,7 @@
 
 class QtCamConfig;
 class QMetaObject;
-class QPainter;
+class QMatrix4x4;
 class QSizeF;
 
 class QtCamViewfinderRenderer : public QObject {
@@ -41,7 +41,7 @@ public:
 
   virtual ~QtCamViewfinderRenderer();
 
-  virtual void paint(QPainter *painter) = 0;
+  virtual void paint(const QMatrix4x4& matrix, const QRectF& viewport) = 0;
   virtual void resize(const QSizeF& size) = 0;
   virtual void reset() = 0;
   virtual GstElement *sinkElement() = 0;
@@ -49,6 +49,8 @@ public:
   virtual QRectF renderArea() = 0;
   virtual QSizeF videoResolution() = 0;
 
+  virtual bool needsNativePainting() = 0;
+
 protected:
   QtCamViewfinderRenderer(QtCamConfig *config, QObject *parent = 0);
 
index b6a205c..ba77f27 100644 (file)
@@ -92,16 +92,18 @@ QtCamViewfinderRendererMeeGo::~QtCamViewfinderRendererMeeGo() {
   }
 }
 
-void QtCamViewfinderRendererMeeGo::paint(QPainter *painter) {
+bool QtCamViewfinderRendererMeeGo::needsNativePainting() {
+  return true;
+}
+
+void QtCamViewfinderRendererMeeGo::paint(const QMatrix4x4& matrix, const QRectF& viewport) {
   QMutexLocker locker(&m_frameMutex);
   if (m_frame == -1) {
     return;
   }
 
-  painter->beginNativePainting();
-
   if (m_needsInit) {
-    calculateProjectionMatrix(painter->viewport());
+    calculateProjectionMatrix(viewport);
 
     if (!eglCreateSyncKHR && m_conf->viewfinderUseFence()) {
       eglCreateSyncKHR = (_PFNEGLCREATESYNCKHRPROC)eglGetProcAddress("eglCreateSyncKHR");
@@ -120,9 +122,7 @@ void QtCamViewfinderRendererMeeGo::paint(QPainter *painter) {
     createProgram();
   }
 
-  paintFrame(painter, m_frame);
-
-  painter->endNativePainting();
+  paintFrame(matrix, m_frame);
 }
 
 void QtCamViewfinderRendererMeeGo::resize(const QSizeF& size) {
@@ -268,7 +268,7 @@ void QtCamViewfinderRendererMeeGo::createProgram() {
   m_program->release();
 }
 
-void QtCamViewfinderRendererMeeGo::paintFrame(QPainter *painter, int frame) {
+void QtCamViewfinderRendererMeeGo::paintFrame(const QMatrix4x4& matrix, int frame) {
   EGLSyncKHR sync = 0;
 
   if (frame == -1) {
@@ -284,7 +284,7 @@ void QtCamViewfinderRendererMeeGo::paintFrame(QPainter *painter, int frame) {
   m_program->bind();
 
   m_program->setUniformValue("matrix", m_projectionMatrix);
-  m_program->setUniformValue("matrixWorld", QMatrix4x4(painter->combinedTransform()));
+  m_program->setUniformValue("matrixWorld", matrix);
 
   if (!meego_gst_video_texture_bind_frame(sink, GL_TEXTURE_EXTERNAL_OES, frame)) {
     qDebug() << "Failed to bind frame";
index fbaff0b..d7ec2b3 100644 (file)
@@ -40,7 +40,7 @@ public:
 
   ~QtCamViewfinderRendererMeeGo();
 
-  virtual void paint(QPainter *painter);
+  virtual void paint(const QMatrix4x4& matrix, const QRectF& viewport);
   virtual void resize(const QSizeF& size);
   virtual void reset();
   virtual GstElement *sinkElement();
@@ -48,6 +48,8 @@ public:
   QRectF renderArea();
   QSizeF videoResolution();
 
+  bool needsNativePainting();
+
 private slots:
   void setVideoSize(const QSizeF& size);
 
@@ -58,7 +60,7 @@ private:
 
   void calculateProjectionMatrix(const QRectF& rect);
   void createProgram();
-  void paintFrame(QPainter *painter, int frame);
+  void paintFrame(const QMatrix4x4& matrix, int frame);
   void calculateCoords();
 
   QtCamConfig *m_conf;