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:
committed by
Qt by Nokia
parent
581564c990
commit
be7cc17cbf
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user