10#if QT_CONFIG(quick_sprite)
11#include "qsgopenvgspritenode.h"
17#include <QtQuick/qsgsimplerectnode.h>
18#include <QtQuick/qsgsimpletexturenode.h>
19#include <QtQuick/qsgrendernode.h>
23QSGOpenVGNodeVisitor::QSGOpenVGNodeVisitor()
26 QVector<VGfloat> matrix(9);
27 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
28 vgGetMatrix(matrix.data());
30 m_transformStack.push(QOpenVGMatrix(matrix.constData()));
33 m_opacityState.push(1.0f);
38 const QVector<
float> matrixData = { node->matrix().constData()[0], node->matrix().constData()[1], node->matrix().constData()[3],
39 node->matrix().constData()[4], node->matrix().constData()[5], node->matrix().constData()[7],
40 node->matrix().constData()[12], node->matrix().constData()[13], node->matrix().constData()[15] };
41 const QOpenVGMatrix matrix2d(matrixData.constData());
43 m_transformStack.push(m_transformStack.top() * matrix2d);
49 m_transformStack.pop();
54 VGMaskOperation maskOperation = VG_INTERSECT_MASK;
55 if (m_clipStack.count() == 0) {
56 vgSeti(VG_MASKING, VG_TRUE);
57 vgMask(0,VG_FILL_MASK, 0, 0, VG_MAXINT, VG_MAXINT);
61 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
63 VGPath clipPath = generateClipPath(node->clipRect());
64 vgRenderToMask(clipPath, VG_FILL_PATH, maskOperation);
66 m_clipStack.push(clipPath);
74 auto clipState = m_clipStack.pop();
75 vgDestroyPath(clipState);
77 if (m_clipStack.count() == 0) {
78 vgSeti(VG_MASKING, VG_FALSE);
81 vgMask(0,VG_FILL_MASK, 0, 0, VG_MAXINT, VG_MAXINT);
82 vgSeti(VG_MATRIX_MODE, VG_MATRIX_PATH_USER_TO_SURFACE);
84 for (
auto path : std::as_const(m_clipStack)) {
85 vgRenderToMask(path, VG_FILL_PATH, VG_INTERSECT_MASK);
92 if (QSGSimpleRectNode *rectNode =
dynamic_cast<QSGSimpleRectNode *>(node)) {
96 }
else if (QSGSimpleTextureNode *tn =
dynamic_cast<QSGSimpleTextureNode *>(node)) {
101 renderRenderableNode(nn);
103 renderRenderableNode(rn);
105 renderRenderableNode(n);
120 m_opacityState.push(m_opacityState.top() * node->opacity());
126 m_opacityState.pop();
178#if QT_CONFIG(quick_sprite)
179bool QSGOpenVGNodeVisitor::visit(QSGSpriteNode *node)
181 renderRenderableNode(
static_cast<QSGOpenVGSpriteNode*>(node));
185void QSGOpenVGNodeVisitor::endVisit(QSGSpriteNode *)
201 VGPath clipPath = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0,
202 VG_PATH_CAPABILITY_APPEND_TO);
205 static const VGubyte rectCommands[] = {
213 const QOpenVGMatrix &transform = m_transformStack.top();
216 QVector<VGfloat> coordinates(8);
217 const QPointF topLeft = transform.map(rect.topLeft());
218 const QPointF topRight = transform.map(rect.topRight());
219 const QPointF bottomLeft = transform.map(rect.bottomLeft());
220 const QPointF bottomRight = transform.map(rect.bottomRight());
221 coordinates[0] = bottomLeft.x();
222 coordinates[1] = bottomLeft.y();
223 coordinates[2] = bottomRight.x();
224 coordinates[3] = bottomRight.y();
225 coordinates[4] = topRight.x();
226 coordinates[5] = topRight.y();
227 coordinates[6] = topLeft.x();
228 coordinates[7] = topLeft.y();
230 vgAppendPathData(clipPath, 5, rectCommands, coordinates.constData());
238 node->setTransform(m_transformStack.top());
239 node->setOpacity(m_opacityState.top());
void endVisit(QSGTransformNode *) override
bool visit(QSGTransformNode *) override