52 Q_ASSERT(!oldMaterial || newMaterial->type() == oldMaterial->type());
60 QByteArray *buf = state.uniformData();
62 if (state.isMatrixDirty()) {
63 const QMatrix4x4 m = state.combinedMatrix();
64 memcpy(buf->data(), m.constData(), 64);
68 if (state.isOpacityDirty() || !oldMat) {
69 float opacity = state.opacity();
70 memcpy(buf->data() + 64, &opacity,
sizeof(
float));
76 memcpy(buf->data() + 64 + 4, &hue,
sizeof(
float));
98QSGNode *QQuickSaturationLightnessPickerCanvas::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
100 QSGGeometryNode *node =
nullptr;
102 bool shaderSupported =
false;
104 QSGRendererInterface::GraphicsApi api = window()->rendererInterface()->graphicsApi();
106 case QSGRendererInterface::OpenGL:
107 case QSGRendererInterface::Vulkan:
108 case QSGRendererInterface::Metal:
109 case QSGRendererInterface::Direct3D11:
110 shaderSupported =
true;
113 shaderSupported =
false;
116 if (shaderSupported) {
118 QSGGeometryNode* geomNode =
static_cast<QSGGeometryNode*>(oldNode);
121 geomNode =
new QSGGeometryNode();
122 geom =
new QSGGeometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4);
123 geom->setDrawingMode(QSGGeometry::DrawTriangleStrip);
124 geomNode->setGeometry(geom);
125 geomNode->setFlag(QSGNode::OwnsGeometry);
127 auto* mat =
new QQuickSaturationLightnessPickerMaterial();
128 geomNode->setMaterial(mat);
129 geomNode->setFlag(QSGNode::OwnsMaterial);
130 m_lastSize = QSize();
133 geom = geomNode->geometry();
136 if (m_lastSize != size()) {
139 auto *v = geom->vertexDataAsTexturedPoint2D();
140 v[0].set(0, 0, 0, 0);
141 v[1].set(width(), 0, 1, 0);
142 v[2].set(0, height(), 0, 1);
143 v[3].set(width(), height(), 1, 1);
145 geomNode->markDirty(QSGNode::DirtyGeometry);
148 auto* mat =
static_cast<QQuickSaturationLightnessPickerMaterial*>(geomNode->material());
149 if (mat->hue != m_hue) {
151 geomNode->markDirty(QSGNode::DirtyMaterial);
157 QSGSimpleTextureNode *texNode =
static_cast<QSGSimpleTextureNode*>(oldNode);
158 if (!texNode) texNode =
new QSGSimpleTextureNode();
159 if (m_image.size().isNull() || m_image.size() != QSize(width(), height()))
160 m_image = generateImage(width(), height(), m_hue);
161 QSGTexture *tex = window()->createTextureFromImage(m_image);
162 texNode->setTexture(tex);
163 texNode->setOwnsTexture(
true);
164 texNode->setRect(0,0,width(),height());
200QColor QQuickSaturationLightnessPicker::colorAt(
const QPointF &pos)
202 const qreal w = width();
203 const qreal h = height();
204 if (w <= 0 || h <= 0)
206 const qreal x = qBound(.0, pos.x(), w);
207 const qreal y = qBound(.0, pos.y(), h);
208 const qreal saturation = 1.0 - (y / h);
209 const qreal lightness = x / w;
211 return QColor::fromHslF(hue(), saturation, lightness);