Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickshapecurverenderer_p.h
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QQUICKSHAPECURVERENDERER_P_H
6#define QQUICKSHAPECURVERENDERER_P_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists for the convenience
13// of a number of Qt sources files. This header file may change from
14// version to version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuickShapes/private/qquickshapesglobal_p.h>
20#include <QtQuickShapes/private/qquickshape_p_p.h>
21#include <QtQuick/private/qquadpath_p.h>
22#include <QtQuick/private/qsgcurveabstractnode_p.h>
23#include <QtQuick/private/qsggradientcache_p.h>
24#include <qsgnode.h>
25#include <qsggeometry.h>
26#include <qsgmaterial.h>
27#include <qsgrendererinterface.h>
28#include <qsgtexture.h>
29#include <QtCore/qrunnable.h>
30#include <QRunnable>
31
32#include <QtGui/private/qtriangulator_p.h>
33#include <QtQuick/private/qsgcurvefillnode_p.h>
34
36
38
39class Q_QUICKSHAPES_EXPORT QQuickShapeCurveRenderer : public QQuickAbstractPathRenderer
40{
41public:
42 QQuickShapeCurveRenderer(QQuickItem *item)
43 : m_item(item)
44 { }
45 ~QQuickShapeCurveRenderer() override;
46
47 void beginSync(int totalCount, bool *countChanged) override;
48 void setPath(int index, const QPainterPath &path, QQuickShapePath::PathHints pathHints = {}) override;
49 void setStrokeColor(int index, const QColor &color) override;
50 void setStrokeWidth(int index, qreal w) override;
51 void setCosmeticStroke(int index, bool c) override;
52 void setFillColor(int index, const QColor &color) override;
53 void setFillRule(int index, QQuickShapePath::FillRule fillRule) override;
54 void setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit) override;
55 void setCapStyle(int index, QQuickShapePath::CapStyle capStyle) override;
56 void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle,
57 qreal dashOffset, const QList<qreal> &dashPattern) override;
58 void setFillGradient(int index, QQuickShapeGradient *gradient) override;
59 void setStrokeGradient(int index, QQuickShapeGradient *gradient) override;
60 void setFillTextureProvider(int index, QQuickItem *textureProviderItem) override;
61 void setFillTransform(int index, const QSGTransform &transform) override;
62 void endSync(bool async) override;
63 void setAsyncCallback(void (*)(void *), void *) override;
64 Flags flags() const override { return SupportsAsync; }
65 void handleSceneChange(QQuickWindow *window) override;
66
67 void updateNode() override;
68
69 void setRootNode(QSGNode *node);
70 void clearNodeReferences();
71
72 using NodeList = QList<QSGCurveAbstractNode *>;
73
74 enum DirtyFlag
75 {
76 PathDirty = 0x01,
77 FillDirty = 0x02,
78 StrokeDirty = 0x04,
79 UniformsDirty = 0x08
80 };
81
82 enum DebugVisualizationOption {
83 NoDebug = 0,
84 DebugCurves = 0x01,
85 DebugWireframe = 0x02
86 };
87
88 static int debugVisualization();
89 static void setDebugVisualization(int options);
90
91private:
92 struct PathData {
93
94 bool isFillVisible() const
95 {
96 return gradientType != QGradient::NoGradient
97 || fillTextureProviderItem != nullptr
98 || fillColor.alpha() > 0;
99 }
100
101 bool isStrokeVisible() const
102 {
103 return validPenWidth && pen.style() != Qt::NoPen
104 && (pen.color().alpha() > 0 || strokeGradientType != QGradient::NoGradient);
105 }
106
107 QGradient::Type gradientType = QGradient::NoGradient;
108 QSGGradientCache::GradientDesc gradient;
109
110 QGradient::Type strokeGradientType = QGradient::NoGradient;
111 QSGGradientCache::GradientDesc strokeGradient;
112
113 QSGTransform fillTransform;
114 QColor fillColor;
115 Qt::FillRule fillRule = Qt::OddEvenFill;
116 QPen pen;
117 bool validPenWidth = true;
118 int m_dirty = 0;
119 QQuickShapePath::PathHints pathHints;
120
121 QPainterPath originalPath;
122 QQuadPath path;
123 QQuadPath fillPath;
124
125 NodeList fillNodes;
126 NodeList strokeNodes;
127
128 QQuickShapeCurveRunnable *currentRunner = nullptr;
129 QQuickItem *fillTextureProviderItem = nullptr;
130 };
131
132 void setUpRunner(PathData *pathData);
133 void maybeUpdateAsyncItem();
134
135 static void processPath(PathData *pathData);
136 static NodeList addFillNodes(const QQuadPath &path);
137 static NodeList addTriangulatingStrokerNodes(const QQuadPath &path, const QPen &pen);
138 static NodeList addCurveStrokeNodes(const QQuadPath &path, const QPen &pen);
139
140 QQuickItem *m_item;
141 QSGNode *m_rootNode = nullptr;
142 QList<PathData> m_paths;
143 QList<PathData> m_removedPaths;
144 void (*m_asyncCallback)(void *) = nullptr;
145 void *m_asyncCallbackData = nullptr;
146 static int debugVisualizationFlags;
147
148 friend class QQuickShapeCurveRunnable;
149};
150
152{
154
155public:
157 void run() override;
158
159 bool isInitialized = false;
160 bool isAsync = false;
161 bool isDone = false;
162 bool orphaned = false;
163
164 // input / output
166
169};
170
171QT_END_NAMESPACE
172
173#endif // QQUICKSHAPECURVERENDERER_P_H
virtual void setFillTextureProvider(int index, QQuickItem *textureProviderItem)=0
virtual void beginSync(int totalCount, bool *countChanged)=0
virtual void setStrokeColor(int index, const QColor &color)=0
virtual void setPath(int index, const QPainterPath &path, QQuickShapePath::PathHints pathHints={})=0
virtual void setAsyncCallback(void(*)(void *), void *)
virtual Flags flags() const
virtual void setCapStyle(int index, QQuickShapePath::CapStyle capStyle)=0
virtual void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle, qreal dashOffset, const QList< qreal > &dashPattern)=0
virtual void setFillGradient(int index, QQuickShapeGradient *gradient)=0
virtual void setFillColor(int index, const QColor &color)=0
virtual void setCosmeticStroke(int index, bool c)=0
virtual void setPath(int index, const QQuickPath *path)
virtual void setTriangulationScale(int, qreal)
virtual void setFillRule(int index, QQuickShapePath::FillRule fillRule)=0
virtual void setStrokeWidth(int index, qreal w)=0
virtual void setFillTransform(int index, const QSGTransform &transform)=0
virtual void endSync(bool async)=0
virtual void updateNode()=0
virtual void handleSceneChange(QQuickWindow *window)=0
virtual void setStrokeGradient(int index, QQuickShapeGradient *gradient)=0
virtual void setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit)=0
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
QQuickShapeConicalGradientMaterial(QQuickShapeGenericStrokeFillNode *node)
int compare(const QSGMaterial *other) const override
Compares this material to other and returns 0 if they are equal; -1 if this material should sort befo...
QSGMaterialShader * createShader(QSGRendererInterface::RenderMode renderMode) const override
This function returns a new instance of a the QSGMaterialShader implementation used to render geometr...
QQuickShapeGenericStrokeFillNode * node() const
void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to prepare use of sampled images in the shader,...
bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to get the contents of the shader program's uniform buffer...
void run() override
Implement this pure virtual function in your subclass.
QQuickShapeGenericRenderer::Color4ub fillColor
QQuickShapeGenericRenderer::VertexContainerType fillVertices
QQuickShapeGenericRenderer::IndexContainerType fillIndices
static QSGMaterial * createLinearGradient(QQuickWindow *window, QQuickShapeGenericStrokeFillNode *node)
static QSGMaterial * createTextureFill(QQuickWindow *window, QQuickShapeGenericStrokeFillNode *node)
static QSGMaterial * createConicalGradient(QQuickWindow *window, QQuickShapeGenericStrokeFillNode *node)
static QSGMaterial * createVertexColor(QQuickWindow *window)
static QSGMaterial * createRadialGradient(QQuickWindow *window, QQuickShapeGenericStrokeFillNode *node)
QQuickShapeGenericStrokeFillNode * m_fillNode
QQuickShapeGenericStrokeFillNode * m_strokeNode
void setAsyncCallback(void(*)(void *), void *) override
void setFillGradient(int index, QQuickShapeGradient *gradient) override
void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle, qreal dashOffset, const QList< qreal > &dashPattern) override
void setFillTransform(int index, const QSGTransform &transform) override
void setCosmeticStroke(int index, bool c) override
void setStrokeGradient(int index, QQuickShapeGradient *gradient) override
static void triangulateFill(const QPainterPath &path, const Color4ub &fillColor, VertexContainerType *fillVertices, IndexContainerType *fillIndices, QSGGeometry::Type *indexType, bool supportsElementIndexUint, qreal triangulationScale)
QList< QSGGeometry::ColoredPoint2D > VertexContainerType
void setPath(int index, const QPainterPath &path, QQuickShapePath::PathHints pathHints={}) override
void setStrokeColor(int index, const QColor &color) override
void setFillRule(int index, QQuickShapePath::FillRule fillRule) override
void setFillTextureProvider(int index, QQuickItem *textureProviderItem) override
void setFillColor(int index, const QColor &color) override
void setTriangulationScale(int index, qreal scale) override
void setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit) override
void setStrokeWidth(int index, qreal w) override
void setRootNode(QQuickShapeGenericNode *node)
QList< QSGGeometry::TexturedPoint2D > TexturedVertexContainerType
void handleSceneChange(QQuickWindow *window) override
void beginSync(int totalCount, bool *countChanged) override
void setCapStyle(int index, QQuickShapePath::CapStyle capStyle) override
static void triangulateStroke(const QPainterPath &path, const QPen &pen, const Color4ub &strokeColor, VertexContainerType *strokeVertices, const QSize &clipSize, qreal triangulationScale)
void preprocess() override
Override this function to do processing on the node before it is rendered.
QSGGradientCache::GradientDesc m_gradient
void activateMaterial(QQuickWindow *window, Material m)
QQuickShapeLinearGradientMaterial(QQuickShapeGenericStrokeFillNode *node)
QSGMaterialShader * createShader(QSGRendererInterface::RenderMode renderMode) const override
This function returns a new instance of a the QSGMaterialShader implementation used to render geometr...
int compare(const QSGMaterial *other) const override
Compares this material to other and returns 0 if they are equal; -1 if this material should sort befo...
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
QQuickShapeGenericStrokeFillNode * node() const
void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to prepare use of sampled images in the shader,...
bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to get the contents of the shader program's uniform buffer...
QQuickShapeGenericStrokeFillNode * node() const
QQuickShapeRadialGradientMaterial(QQuickShapeGenericStrokeFillNode *node)
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
QSGMaterialShader * createShader(QSGRendererInterface::RenderMode renderMode) const override
This function returns a new instance of a the QSGMaterialShader implementation used to render geometr...
int compare(const QSGMaterial *other) const override
Compares this material to other and returns 0 if they are equal; -1 if this material should sort befo...
bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to get the contents of the shader program's uniform buffer...
void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to prepare use of sampled images in the shader,...
RenderingFlags flags() const override
void releaseResources() override
This function is called when all custom graphics resources allocated by this node have to be freed im...
void render(const RenderState *state) override
This function is called by the renderer and should paint this node with directly invoking commands vi...
StateFlags changedStates() const override
This function should return a mask where each bit represents graphics states changed by the \l render...
void setPath(int index, const QPainterPath &path, QQuickShapePath::PathHints pathHints={}) override
void setStrokeColor(int index, const QColor &color) override
void setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit) override
void setStrokeGradient(int index, QQuickShapeGradient *gradient) override
void setFillColor(int index, const QColor &color) override
void setTriangulationScale(int index, qreal scale) override
void handleSceneChange(QQuickWindow *window) override
void setNode(QQuickShapeSoftwareRenderNode *node)
void setFillTextureProvider(int index, QQuickItem *textureProviderItem) override
void beginSync(int totalCount, bool *countChanged) override
void setCapStyle(int index, QQuickShapePath::CapStyle capStyle) override
void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle, qreal dashOffset, const QList< qreal > &dashPattern) override
void setCosmeticStroke(int index, bool c) override
void setFillGradient(int index, QQuickShapeGradient *gradient) override
void setFillRule(int index, QQuickShapePath::FillRule fillRule) override
void setStrokeWidth(int index, qreal w) override
void setFillTransform(int index, const QSGTransform &transform) override
QQuickShapeGenericRenderer::Color4ub strokeColor
QQuickShapeGenericRenderer::VertexContainerType strokeVertices
QQuickShapeTextureFillMaterial(QQuickShapeGenericStrokeFillNode *node)
QSGMaterialShader * createShader(QSGRendererInterface::RenderMode renderMode) const override
This function returns a new instance of a the QSGMaterialShader implementation used to render geometr...
int compare(const QSGMaterial *other) const override
Compares this material to other and returns 0 if they are equal; -1 if this material should sort befo...
QQuickShapeGenericStrokeFillNode * node() const
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
bool updateUniformData(RenderState &state, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to get the contents of the shader program's uniform buffer...
void updateSampledImage(RenderState &state, int binding, QSGTexture **texture, QSGMaterial *newMaterial, QSGMaterial *oldMaterial) override
This function is called by the scene graph to prepare use of sampled images in the shader,...
Combined button and popup list for selecting options.
QT_BEGIN_NAMESPACE Q_STATIC_LOGGING_CATEGORY(lcSynthesizedIterableAccess, "qt.iterable.synthesized", QtWarningMsg)
static void initResources()
static void vpe_clear(QQmlListProperty< QObject > *property)
static void vpe_append(QQmlListProperty< QObject > *property, QObject *obj)
Q_GHS_KEEP_REFERENCE(QQuickShapes_initializeModule)
QQuickShapeGradient * strokeGradient
QQuickShapeGradient * fillGradient