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 {
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 {
#include "qtcamviewfinderrenderer.h"
#include <QPainter>
#include <QGraphicsSceneResizeEvent>
+#include <QMatrix4x4>
class QtCamGraphicsViewfinderPrivate {
public:
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) {
class QtCamConfig;
class QMetaObject;
-class QPainter;
+class QMatrix4x4;
class QSizeF;
class QtCamViewfinderRenderer : public QObject {
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;
virtual QRectF renderArea() = 0;
virtual QSizeF videoResolution() = 0;
+ virtual bool needsNativePainting() = 0;
+
protected:
QtCamViewfinderRenderer(QtCamConfig *config, QObject *parent = 0);
}
}
-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");
createProgram();
}
- paintFrame(painter, m_frame);
-
- painter->endNativePainting();
+ paintFrame(matrix, m_frame);
}
void QtCamViewfinderRendererMeeGo::resize(const QSizeF& size) {
m_program->release();
}
-void QtCamViewfinderRendererMeeGo::paintFrame(QPainter *painter, int frame) {
+void QtCamViewfinderRendererMeeGo::paintFrame(const QMatrix4x4& matrix, int frame) {
EGLSyncKHR sync = 0;
if (frame == -1) {
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";
~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();
QRectF renderArea();
QSizeF videoResolution();
+ bool needsNativePainting();
+
private slots:
void setVideoSize(const QSizeF& size);
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;