Add orientation support to VideoOutput.

Just uses an integer to represent the degrees rotation from standard.
Only supports multiples of 90 - other rotation can be done with
standard QML.

Change-Id: Id4013169c5d9da473b6e5be94ba341da21c2f2a3
Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
This commit is contained in:
Michael Goddard
2011-11-25 15:25:22 +10:00
committed by Qt by Nokia
parent 581564c990
commit be7cc17cbf
4 changed files with 126 additions and 11 deletions

View File

@@ -42,26 +42,83 @@
#include "qsgvideonode_p.h"
QSGVideoNode::QSGVideoNode()
: m_orientation(-1)
{
}
void QSGVideoNode::setTexturedRectGeometry(const QRectF &rect, const QRectF &textureRect)
/* Helpers */
static inline void qSetGeom(QSGGeometry::TexturedPoint2D *v, const QPointF &p)
{
if (rect == m_rect && textureRect == m_textureRect)
v->x = p.x();
v->y = p.y();
}
static inline void qSetTex(QSGGeometry::TexturedPoint2D *v, const QPointF &p)
{
v->tx = p.x();
v->ty = p.y();
}
/* Update the vertices and texture coordinates. Orientation must be in {0,90,180,270} */
void QSGVideoNode::setTexturedRectGeometry(const QRectF &rect, const QRectF &textureRect, int orientation)
{
if (rect == m_rect && textureRect == m_textureRect && orientation == m_orientation)
return;
m_rect = rect;
m_textureRect = textureRect;
m_orientation = orientation;
QSGGeometry *g = geometry();
if (g == 0) {
if (g == 0)
g = new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4);
QSGGeometry::updateTexturedRectGeometry(g, rect, textureRect);
setGeometry(g);
} else {
QSGGeometry::updateTexturedRectGeometry(g, rect, textureRect);
QSGGeometry::TexturedPoint2D *v = g->vertexDataAsTexturedPoint2D();
// Set geometry first
qSetGeom(v + 0, rect.topLeft());
qSetGeom(v + 1, rect.bottomLeft());
qSetGeom(v + 2, rect.topRight());
qSetGeom(v + 3, rect.bottomRight());
// and then texture coordinates
switch (orientation) {
default:
// tl, bl, tr, br
qSetTex(v + 0, textureRect.topLeft());
qSetTex(v + 1, textureRect.bottomLeft());
qSetTex(v + 2, textureRect.topRight());
qSetTex(v + 3, textureRect.bottomRight());
break;
case 90:
// tr, tl, br, bl
qSetTex(v + 0, textureRect.topRight());
qSetTex(v + 1, textureRect.topLeft());
qSetTex(v + 2, textureRect.bottomRight());
qSetTex(v + 3, textureRect.bottomLeft());
break;
case 180:
// br, tr, bl, tl
qSetTex(v + 0, textureRect.bottomRight());
qSetTex(v + 1, textureRect.topRight());
qSetTex(v + 2, textureRect.bottomLeft());
qSetTex(v + 3, textureRect.topLeft());
break;
case 270:
// bl, br, tl, tr
qSetTex(v + 0, textureRect.bottomLeft());
qSetTex(v + 1, textureRect.bottomRight());
qSetTex(v + 2, textureRect.topLeft());
qSetTex(v + 3, textureRect.topRight());
break;
}
if (!geometry())
setGeometry(g);
markDirty(DirtyGeometry);
}