5#include <QtGui/private/qtriangulator_p.h>
6#include <QtGui/private/qtriangulatingstroker_p.h>
8#include <QSGVertexColorMaterial>
10#include <QtQuick/private/qsggradientcache_p.h>
31 c.getRgbF(&
r, &
g, &
b, &
a);
47#ifdef QSG_RUNTIME_DESCRIPTION
80 for (ShapePathData &
d : m_sp) {
82 d.pendingFill->orphaned =
true;
84 d.pendingStroke->orphaned =
true;
93 if (m_sp.size() != totalCount) {
94 m_sp.resize(totalCount);
98 *countChanged =
false;
100 for (ShapePathData &
d : m_sp)
106 ShapePathData &
d(m_sp[
index]);
113 ShapePathData &
d(m_sp[
index]);
114 const bool wasTransparent =
d.strokeColor.a == 0;
116 const bool isTransparent =
d.strokeColor.a == 0;
118 if (wasTransparent && !isTransparent)
124 ShapePathData &
d(m_sp[
index]);
133 ShapePathData &
d(m_sp[
index]);
134 const bool wasTransparent =
d.fillColor.a == 0;
136 const bool isTransparent =
d.fillColor.a == 0;
138 if (wasTransparent && !isTransparent)
144 ShapePathData &
d(m_sp[
index]);
151 ShapePathData &
d(m_sp[
index]);
153 d.pen.setMiterLimit(miterLimit);
159 ShapePathData &
d(m_sp[
index]);
165 qreal dashOffset,
const QVector<qreal> &dashPattern)
167 ShapePathData &
d(m_sp[
index]);
170 d.pen.setDashPattern(dashPattern);
171 d.pen.setDashOffset(dashOffset);
178 ShapePathData &
d(m_sp[
index]);
188 d.fillGradient.a =
QPointF(
g->centerX(),
g->centerY());
189 d.fillGradient.b =
QPointF(
g->focalX(),
g->focalY());
190 d.fillGradient.v0 =
g->centerRadius();
191 d.fillGradient.v1 =
g->focalRadius();
194 d.fillGradient.a =
QPointF(
g->centerX(),
g->centerY());
195 d.fillGradient.v0 =
g->angle();
207 ShapePathData &
d(m_sp[
index]);
215 m_triangulationScale =
scale;
233 m_asyncCallback = callback;
234 m_asyncCallbackData =
data;
240static void deletePathWorkThreadPool()
242 delete pathWorkThreadPool;
243 pathWorkThreadPool =
nullptr;
249#if !QT_CONFIG(thread)
255 bool didKickOffAsync =
false;
257 for (
int i = 0;
i < m_sp.size(); ++
i) {
258 ShapePathData &
d(m_sp[
i]);
262 m_accDirty |=
d.syncDirty;
269 d.effectiveDirty |=
d.syncDirty;
271 if (
d.path.isEmpty()) {
272 d.fillVertices.clear();
273 d.fillIndices.clear();
274 d.strokeVertices.clear();
279 if (async && !pathWorkThreadPool) {
283 pathWorkThreadPool->setMaxThreadCount(idealCount > 0 ? idealCount * 2 : 4);
293 static bool supportsElementIndexUint = testFeatureIndexUint(m_item);
295 d.path.setFillRule(
d.fillRule);
302 d.pendingFill->orphaned =
true;
305 r->fillColor =
d.fillColor;
306 r->supportsElementIndexUint = supportsElementIndexUint;
307 r->triangulationScale = m_triangulationScale;
313 if (!
r->orphaned &&
i < m_sp.size()) {
314 ShapePathData &d(m_sp[i]);
315 d.fillVertices = r->fillVertices;
316 d.fillIndices = r->fillIndices;
317 d.indexType = r->indexType;
318 d.pendingFill = nullptr;
319 d.effectiveDirty |= DirtyFillGeom;
320 maybeUpdateAsyncItem();
324 didKickOffAsync =
true;
329 pathWorkThreadPool->start(
r);
333 supportsElementIndexUint,
334 m_triangulationScale);
343 d.pendingStroke->orphaned =
true;
347 r->strokeColor =
d.strokeColor;
349 r->triangulationScale = m_triangulationScale;
351 if (!
r->orphaned &&
i < m_sp.size()) {
352 ShapePathData &d(m_sp[i]);
353 d.strokeVertices = r->strokeVertices;
354 d.pendingStroke = nullptr;
355 d.effectiveDirty |= DirtyStrokeGeom;
356 maybeUpdateAsyncItem();
360 didKickOffAsync =
true;
365 pathWorkThreadPool->start(
r);
374 if (!didKickOffAsync && async && m_asyncCallback)
375 m_asyncCallback(m_asyncCallbackData);
378void QQuickShapeGenericRenderer::maybeUpdateAsyncItem()
380 for (
const ShapePathData &
d :
std::as_const(m_sp)) {
381 if (
d.pendingFill ||
d.pendingStroke)
387 m_asyncCallback(m_asyncCallbackData);
397 bool supportsElementIndexUint,
398 qreal triangulationScale)
404 fillVertices->
resize(vertexCount);
407 for (
int i = 0;
i < vertexCount; ++
i)
408 vdst[
i].
set(vsrc[
i * 2] / triangulationScale, vsrc[
i * 2 + 1] / triangulationScale, fillColor);
410 size_t indexByteSize;
429 const QSize &clipSize,
430 qreal triangulationScale)
434 const qreal inverseScale = 1.0 / triangulationScale;
440 stroker.
process(vp, pen, clip, {});
444 dashStroker.
process(vp, pen, clip, {});
447 stroker.
process(dashStroke, pen, clip, {});
451 strokeVertices->
clear();
456 strokeVertices->
resize(vertexCount);
458 const float *vsrc = stroker.
vertices();
459 for (
int i = 0;
i < vertexCount; ++
i)
460 vdst[
i].
set(vsrc[
i * 2], vsrc[
i * 2 + 1], strokeColor);
465 if (m_rootNode != node) {
474 if (!m_rootNode || !m_accDirty)
490 for (ShapePathData &
d : m_sp) {
494 prevNode->
m_next = *nodePtr;
503 if (!
d.effectiveDirty) {
509 if (
d.fillColor.a == 0) {
522 if (
d.strokeWidth < 0.0f ||
d.strokeColor.a == 0) {
531 updateFillNode(&
d, node);
532 updateStrokeNode(&
d, node);
534 d.effectiveDirty = 0;
540 if (*nodePtr && prevNode) {
551 if (
d->fillGradientActive) {
553 n->m_fillGradient =
d->fillGradient;
555 n->m_fillTransform =
d->fillTransform;
569 updateShadowDataInNode(
d,
n);
572 if (
d->fillVertices.isEmpty()) {
573 if (
g->vertexCount() ||
g->indexCount()) {
580 if (
d->fillGradientActive) {
582 switch (
d->fillGradientActive) {
593 Q_UNREACHABLE_RETURN();
595 n->activateMaterial(m_item->
window(), gradMat);
608 for (
int i = 0;
i <
g->vertexCount(); ++
i)
609 vdst[
i].
set(vdst[
i].
x, vdst[
i].
y,
d->fillColor);
616 ?
d->fillIndices.size() * 2 :
d->fillIndices.size();
617 if (
g->indexType() !=
d->indexType) {
619 d->fillVertices.size(), indexCount,
d->indexType);
622 g->allocate(
d->fillVertices.size(), indexCount);
625 memcpy(
g->vertexData(),
d->fillVertices.constData(),
g->vertexCount() *
g->sizeOfVertex());
626 memcpy(
g->indexData(),
d->fillIndices.constData(),
g->indexCount() *
g->sizeOfIndex());
640 if (
d->strokeVertices.isEmpty()) {
641 if (
g->vertexCount() ||
g->indexCount()) {
653 if (!
g->vertexCount())
658 for (
int i = 0;
i <
g->vertexCount(); ++
i)
659 vdst[
i].
set(vdst[
i].
x, vdst[
i].
y,
d->strokeColor);
663 g->allocate(
d->strokeVertices.size(), 0);
665 memcpy(
g->vertexData(),
d->strokeVertices.constData(),
g->vertexCount() *
g->sizeOfVertex());
675 qWarning(
"Vertex-color material: Unsupported graphics API %d",
api);
687 qWarning(
"Linear gradient material: Unsupported graphics API %d",
api);
699 qWarning(
"Radial gradient material: Unsupported graphics API %d",
api);
711 qWarning(
"Conical gradient material: Unsupported graphics API %d",
api);
724 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
726 bool changed =
false;
729 const int shaderMatrixCount = newMaterial->viewCount();
730 const int matrixCount =
qMin(
state.projectionMatrixCount(), shaderMatrixCount);
732 if (
state.isMatrixDirty()) {
733 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
735 memcpy(
buf->data() + 64 * viewIndex,
m.constData(), 64);
751 memcpy(
buf->data() + 64 * shaderMatrixCount + 64, &m_gradA, 8);
757 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8, &m_gradB, 8);
761 if (
state.isOpacityDirty()) {
762 const float opacity =
state.opacity();
763 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8 + 8, &opacity, 4);
780 t->commitTextureOperations(
state.rhi(),
state.resourceUpdateBatch());
804 if (
int d = ga->spread - gb->spread)
807 if (
int d = ga->a.x() - gb->a.x())
809 if (
int d = ga->a.y() - gb->a.y())
811 if (
int d = ga->b.x() - gb->b.x())
813 if (
int d = ga->b.y() - gb->b.y())
816 if (
int d = ga->stops.size() - gb->stops.size())
819 for (
int i = 0;
i < ga->stops.size(); ++
i) {
820 if (
int d = ga->stops[
i].first - gb->stops[
i].first)
822 if (
int d = ga->stops[
i].second.rgba() - gb->stops[
i].second.rgba())
826 if (
int d =
a->m_fillTransform.compareTo(
b->m_fillTransform))
847 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
849 bool changed =
false;
852 const int shaderMatrixCount = newMaterial->viewCount();
853 const int matrixCount =
qMin(
state.projectionMatrixCount(), shaderMatrixCount);
855 if (
state.isMatrixDirty()) {
856 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
858 memcpy(
buf->data() + 64 * viewIndex,
m.constData(), 64);
879 Q_ASSERT(
sizeof(m_focalPoint) == 8);
880 memcpy(
buf->data() + 64 * shaderMatrixCount + 64, &m_focalPoint, 8);
884 if (!oldMaterial || m_focalToCenter.
x() != focalToCenter.x() || m_focalToCenter.
y() != focalToCenter.y()) {
885 m_focalToCenter =
QVector2D(focalToCenter.x(), focalToCenter.y());
886 Q_ASSERT(
sizeof(m_focalToCenter) == 8);
887 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8, &m_focalToCenter, 8);
891 if (!oldMaterial || m_centerRadius != centerRadius) {
892 m_centerRadius = centerRadius;
893 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8 + 8, &m_centerRadius, 4);
897 if (!oldMaterial || m_focalRadius != focalRadius) {
898 m_focalRadius = focalRadius;
899 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8 + 8 + 4, &m_focalRadius, 4);
903 if (
state.isOpacityDirty()) {
904 const float opacity =
state.opacity();
905 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8 + 8 + 4 + 4, &opacity, 4);
922 t->commitTextureOperations(
state.rhi(),
state.resourceUpdateBatch());
946 if (
int d = ga->spread - gb->spread)
949 if (
int d = ga->a.x() - gb->a.x())
951 if (
int d = ga->a.y() - gb->a.y())
953 if (
int d = ga->b.x() - gb->b.x())
955 if (
int d = ga->b.y() - gb->b.y())
958 if (
int d = ga->v0 - gb->v0)
960 if (
int d = ga->v1 - gb->v1)
963 if (
int d = ga->stops.size() - gb->stops.size())
966 for (
int i = 0;
i < ga->stops.size(); ++
i) {
967 if (
int d = ga->stops[
i].first - gb->stops[
i].first)
969 if (
int d = ga->stops[
i].second.rgba() - gb->stops[
i].second.rgba())
973 if (
int d =
a->m_fillTransform.compareTo(
b->m_fillTransform))
994 Q_ASSERT(oldMaterial ==
nullptr || newMaterial->type() == oldMaterial->type());
996 bool changed =
false;
999 const int shaderMatrixCount = newMaterial->viewCount();
1000 const int matrixCount =
qMin(
state.projectionMatrixCount(), shaderMatrixCount);
1002 if (
state.isMatrixDirty()) {
1003 for (
int viewIndex = 0; viewIndex < matrixCount; ++viewIndex) {
1005 memcpy(
buf->data() + 64 * viewIndex,
m.constData(), 64);
1021 if (!oldMaterial || m_centerPoint.
x() != centerPoint.
x() || m_centerPoint.
y() != centerPoint.
y()) {
1022 m_centerPoint =
QVector2D(centerPoint.
x(), centerPoint.
y());
1023 Q_ASSERT(
sizeof(m_centerPoint) == 8);
1024 memcpy(
buf->data() + 64 * shaderMatrixCount + 64, &m_centerPoint, 8);
1028 if (!oldMaterial || m_angle !=
angle) {
1030 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8, &m_angle, 4);
1034 if (
state.isOpacityDirty()) {
1035 const float opacity =
state.opacity();
1036 memcpy(
buf->data() + 64 * shaderMatrixCount + 64 + 8 + 4, &opacity, 4);
1053 t->commitTextureOperations(
state.rhi(),
state.resourceUpdateBatch());
1077 if (
int d = ga->a.x() - gb->a.x())
1079 if (
int d = ga->a.y() - gb->a.y())
1082 if (
int d = ga->v0 - gb->v0)
1085 if (
int d = ga->stops.size() - gb->stops.size())
1088 for (
int i = 0;
i < ga->stops.size(); ++
i) {
1089 if (
int d = ga->stops[
i].first - gb->stops[
i].first)
1091 if (
int d = ga->stops[
i].second.rgba() - gb->stops[
i].second.rgba())
1095 if (
int d =
a->m_fillTransform.compareTo(
b->m_fillTransform))
1109#include "moc_qquickshapegenericrenderer_p.cpp"
The QColor class provides colors based on RGB, HSV or CMYK values.
QPainterPath::ElementType * elementTypes() const
void process(const QVectorPath &path, const QPen &pen, const QRectF &clip, QPainter::RenderHints hints)
void setInvScale(qreal invScale)
Spread
Specifies how the area outside the gradient area should be filled.
QGraphicsWidget * window() const
qsizetype size() const noexcept
const_pointer constData() const noexcept
void resize(qsizetype size)
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Qt::PenStyle style() const
Returns the pen style.
\inmodule QtCore\reentrant
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
QGradientStops gradientStops() const
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
QQuickWindow * window() const
Returns the window in which this item is rendered.
qreal width
This property holds the width of this item.
qreal height
This property holds the height of this item.
void update()
Schedules a call to updatePaintNode() for this item.
QSGMaterialType * type() const override
This function is called by the scene graph to query an identifier that is unique to the QSGMaterialSh...
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...
QQuickShapeConicalGradientRhiShader(int viewCount)
bool supportsElementIndexUint
QQuickShapeGenericRenderer::Color4ub fillColor
QSGGeometry::Type indexType
QQuickShapeGenericRenderer::VertexContainerType fillVertices
QQuickShapeGenericRenderer::IndexContainerType fillIndices
void done(QQuickShapeFillRunnable *self)
void run() override
Implement this pure virtual function in your subclass.
static QSGMaterial * createLinearGradient(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
QQuickShapeGenericNode * m_next
void setAsyncCallback(void(*)(void *), void *) override
void setTriangulationScale(qreal scale) override
void setFillGradient(int index, QQuickShapeGradient *gradient) override
void setFillTransform(int index, const QSGTransform &transform) override
static void triangulateFill(const QPainterPath &path, const Color4ub &fillColor, VertexContainerType *fillVertices, IndexContainerType *fillIndices, QSGGeometry::Type *indexType, bool supportsElementIndexUint, qreal triangulationScale)
void setStrokeColor(int index, const QColor &color) override
void setFillRule(int index, QQuickShapePath::FillRule fillRule) override
void setFillColor(int index, const QColor &color) override
void setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit) override
void setStrokeWidth(int index, qreal w) override
~QQuickShapeGenericRenderer()
void setRootNode(QQuickShapeGenericNode *node)
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 updateNode() override
void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle, qreal dashOffset, const QVector< qreal > &dashPattern) override
void setPath(int index, const QQuickPath *path) override
void endSync(bool async) override
QSGGradientCache::GradientDesc m_fillGradient
QSGTransform m_fillTransform
QQuickShapeGenericStrokeFillNode(QQuickWindow *window)
void activateMaterial(QQuickWindow *window, Material m)
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,...
QQuickShapeLinearGradientRhiShader(int viewCount)
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
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...
QQuickShapeRadialGradientRhiShader(int viewCount)
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,...
QQuickShapeGenericRenderer::Color4ub strokeColor
QQuickShapeGenericRenderer::VertexContainerType strokeVertices
void done(QQuickShapeStrokeRunnable *self)
void run() override
Implement this pure virtual function in your subclass.
static QQuickWindowPrivate * get(QQuickWindow *c)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
\inmodule QtCore\reentrant
void setAutoDelete(bool autoDelete)
Enables auto-deletion if autoDelete is true; otherwise auto-deletion is disabled.
void setGeometry(QSGGeometry *geometry)
Sets the geometry of this node to geometry.
QSGMaterial * material() const
Returns the material of the QSGGeometryNode.
void setMaterial(QSGMaterial *material)
Sets the material of this geometry node to material.
The QSGGeometry class provides low-level storage for graphics primitives in the \l{Qt Quick Scene Gra...
static const AttributeSet & defaultAttributes_ColoredPoint2D()
Convenience function which returns attributes to be used for per vertex colored 2D drawing.
void allocate(int vertexCount, int indexCount=0)
Resizes the vertex and index data of this geometry object to fit vertexCount vertices and indexCount ...
Type
Specifies the component type in the vertex data.
static QSGGradientCache * cacheForRhi(QRhi *rhi)
Encapsulates the current rendering state during a call to QSGMaterialShader::updateUniformData() and ...
The QSGMaterialShader class represents a graphics API independent shader program.
void setShaderFileName(Stage stage, const QString &filename)
Sets the filename for the shader for the specified stage.
The QSGMaterial class encapsulates rendering state for a shader program.
void removeChildNode(QSGNode *node)
Removes node from this node's list of children.
void appendChildNode(QSGNode *node)
Appends node to this node's list of children.
void setFlag(Flag, bool=true)
Sets the flag f on this node if enabled is true; otherwise clears the flag.
RenderMode
\value RenderMode2D Normal 2D rendering \value RenderMode2DNoDepthBuffer Normal 2D rendering with dep...
static bool isApiRhiBased(GraphicsApi api)
virtual GraphicsApi graphicsApi() const =0
Returns the graphics API that is in use by the Qt Quick scenegraph.
GraphicsApi
\value Unknown An unknown graphics API is in use \value Software The Qt Quick 2D Renderer is in use \...
The QSGVertexColorMaterial class provides a convenient way of rendering per-vertex colored geometry i...
T * data() const noexcept
Returns the value of the pointer referenced by this object.
void reset(T *other=nullptr) noexcept(noexcept(Cleanup::cleanup(std::declval< T * >())))
Deletes the existing object it is pointing to (if any), and sets its pointer to other.
static int idealThreadCount() noexcept
const float * vertices() const
void setInvScale(qreal invScale)
void process(const QVectorPath &path, const QPen &pen, const QRectF &clip, QPainter::RenderHints hints)
The QVector2D class represents a vector or vertex in 2D space.
constexpr float y() const noexcept
Returns the y coordinate of this point.
constexpr float x() const noexcept
Returns the x coordinate of this point.
const void * data() const
Combined button and popup list for selecting options.
void qAddPostRoutine(QtCleanUpFunction p)
int qRound(qfloat16 d) noexcept
static QByteArray cacheKey(Args &&...args)
constexpr float qDegreesToRadians(float degrees)
constexpr const T & qMin(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLuint GLenum GLsizei const GLchar * buf
GLuint GLenum GLenum transform
GLsizei const GLchar *const * path
GLenum GLenum GLenum GLenum GLenum scale
const QVectorPath & qtVectorPathForPath(const QPainterPath &path)
static QQuickShapeGenericRenderer::Color4ub colorToColor4ub(const QColor &c)
void qsgnode_set_description(QSGNode *node, const QString &description)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
Q_GUI_EXPORT QTriangleSet qTriangulate(const qreal *polygon, int count, uint hint, const QTransform &matrix, bool allowUintIndices)
QFuture< QSet< QChar > > set
[10]
QNetworkRequestFactory api
[0]
void set(float nx, float ny, QQuickShapeGenericRenderer::Color4ub ncolor)
QQuickShapeGenericRenderer::Color4ub color
The QSGMaterialType class is used as a unique type token in combination with QSGMaterial.
QVertexIndexVector indices