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 );