6#include "QskShapeNode.h"
7#include "QskGradient.h"
8#include "QskGradientDirection.h"
10#include "QskFillNodePrivate.h"
11#include "QskInternalMacros.h"
14#include <private/qvectorpath_p.h>
15#include <private/qtriangulator_p.h>
21static void qskUpdateGeometry(
const QPainterPath& path,
22 const QTransform& transform,
const QColor&, QSGGeometry& geometry )
24 const auto ts = qTriangulate( path, transform, 1,
false );
26 geometry.allocate( ts.vertices.size(), ts.indices.size() );
28 auto vertexData =
reinterpret_cast< float*
>( geometry.vertexData() );
29 const auto points = ts.vertices.constData();
31 for (
int i = 0; i < ts.vertices.count(); i++ )
32 vertexData[i] = points[i];
34 memcpy( geometry.indexData(), ts.indices.data(),
35 ts.indices.size() *
sizeof( quint16 ) );
40static void qskUpdateGeometry(
const QPainterPath& path,
41 const QTransform& transform,
const QColor& color, QSGGeometry& geometry )
43 const auto ts = qTriangulate( path, transform, 1,
false );
60 const auto points = ts.vertices.constData();
61 const auto indices =
reinterpret_cast< const quint16*
>( ts.indices.data() );
63 geometry.allocate( ts.indices.size() );
65 if ( color.isValid() )
69 auto vertexData = geometry.vertexDataAsColoredPoint2D();
70 for (
int i = 0; i < ts.indices.size(); i++ )
72 const int j = 2 * indices[i];
73 vertexData[i].set( points[j], points[j + 1], c.r, c.g, c.b, c.a );
78 auto vertexData = geometry.vertexDataAsPoint2D();
79 for (
int i = 0; i < ts.indices.size(); i++ )
81 const int j = 2 * indices[i];
82 vertexData[i].set( points[j], points[j + 1] );
89class QskShapeNodePrivate final :
public QskFillNodePrivate
100QskShapeNode::QskShapeNode()
109 setColoring( Monochrome );
112 geometry()->setDrawingMode( QSGGeometry::DrawTriangles );
115QskShapeNode::~QskShapeNode()
119void QskShapeNode::updatePath(
const QPainterPath& path,
120 const QTransform& transform,
const QRectF& rect,
const QskGradient& gradient )
124 if ( path.isEmpty() || !gradient.isVisible() )
126 d->path = QPainterPath();
127 d->transform = QTransform();
135 if ( gradient.isMonochrome() && hasHint( PreferColoredGeometry ) )
136 c = gradient.startColor();
138 const bool isDirty = ( isGeometryColored() != c.isValid() );
141 setColoring( QskFillNode::Polychrome );
143 setColoring( rect, gradient );
145 if ( isDirty || ( transform != d->transform ) || ( path != d->path ) )
148 d->transform = transform;
150 qskUpdateGeometry( path, transform, c, *geometry() );
152 geometry()->markVertexDataDirty();
153 markDirty( QSGNode::DirtyGeometry );