1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#include "qsgvideonode_p.h"
41
42QT_BEGIN_NAMESPACE
43
44QSGVideoNode::QSGVideoNode()
45 : m_orientation(-1)
46{
47 setFlag(QSGNode::OwnsGeometry);
48}
49
50/* Helpers */
51static inline void qSetGeom(QSGGeometry::TexturedPoint2D *v, const QPointF &p)
52{
53 v->x = p.x();
54 v->y = p.y();
55}
56
57static inline void qSetTex(QSGGeometry::TexturedPoint2D *v, const QPointF &p)
58{
59 v->tx = p.x();
60 v->ty = p.y();
61}
62
63/* Update the vertices and texture coordinates. Orientation must be in {0,90,180,270} */
64void QSGVideoNode::setTexturedRectGeometry(const QRectF &rect, const QRectF &textureRect, int orientation)
65{
66 if (rect == m_rect && textureRect == m_textureRect && orientation == m_orientation)
67 return;
68
69 m_rect = rect;
70 m_textureRect = textureRect;
71 m_orientation = orientation;
72
73 QSGGeometry *g = geometry();
74
75 if (g == 0)
76 g = new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4);
77
78 QSGGeometry::TexturedPoint2D *v = g->vertexDataAsTexturedPoint2D();
79
80 // Set geometry first
81 qSetGeom(v: v + 0, p: rect.topLeft());
82 qSetGeom(v: v + 1, p: rect.bottomLeft());
83 qSetGeom(v: v + 2, p: rect.topRight());
84 qSetGeom(v: v + 3, p: rect.bottomRight());
85
86 // and then texture coordinates
87 switch (orientation) {
88 default:
89 // tl, bl, tr, br
90 qSetTex(v: v + 0, p: textureRect.topLeft());
91 qSetTex(v: v + 1, p: textureRect.bottomLeft());
92 qSetTex(v: v + 2, p: textureRect.topRight());
93 qSetTex(v: v + 3, p: textureRect.bottomRight());
94 break;
95
96 case 90:
97 // tr, tl, br, bl
98 qSetTex(v: v + 0, p: textureRect.topRight());
99 qSetTex(v: v + 1, p: textureRect.topLeft());
100 qSetTex(v: v + 2, p: textureRect.bottomRight());
101 qSetTex(v: v + 3, p: textureRect.bottomLeft());
102 break;
103
104 case 180:
105 // br, tr, bl, tl
106 qSetTex(v: v + 0, p: textureRect.bottomRight());
107 qSetTex(v: v + 1, p: textureRect.topRight());
108 qSetTex(v: v + 2, p: textureRect.bottomLeft());
109 qSetTex(v: v + 3, p: textureRect.topLeft());
110 break;
111
112 case 270:
113 // bl, br, tl, tr
114 qSetTex(v: v + 0, p: textureRect.bottomLeft());
115 qSetTex(v: v + 1, p: textureRect.bottomRight());
116 qSetTex(v: v + 2, p: textureRect.topLeft());
117 qSetTex(v: v + 3, p: textureRect.topRight());
118 break;
119 }
120
121 if (!geometry())
122 setGeometry(g);
123
124 markDirty(bits: DirtyGeometry);
125}
126
127QSGVideoNodeFactoryInterface::~QSGVideoNodeFactoryInterface()
128{
129}
130
131QT_END_NAMESPACE
132

source code of qtmultimedia/src/qtmultimediaquicktools/qsgvideonode_p.cpp