OpenCoverage

qquickshapenvprrenderer.cpp

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quickshapes/qquickshapenvprrenderer.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4void QQuickShapeNvprRenderer::beginSync(int totalCount)-
5{-
6 if (m_sp.count() != totalCount
m_sp.count() != totalCountDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
7 m_sp.resize(totalCount);-
8 m_accDirty |= DirtyList;-
9 }
never executed: end of block
0
10}
never executed: end of block
0
11-
12void QQuickShapeNvprRenderer::setPath(int index, const QQuickPath *path)-
13{-
14 ShapePathGuiData &d(m_sp[index]);-
15 convertPath(path, &d);-
16 d.dirty |= DirtyPath;-
17 m_accDirty |= DirtyPath;-
18}
never executed: end of block
0
19-
20void QQuickShapeNvprRenderer::setStrokeColor(int index, const QColor &color)-
21{-
22 ShapePathGuiData &d(m_sp[index]);-
23 d.strokeColor = color;-
24 d.dirty |= DirtyStyle;-
25 m_accDirty |= DirtyStyle;-
26}
never executed: end of block
0
27-
28void QQuickShapeNvprRenderer::setStrokeWidth(int index, qreal w)-
29{-
30 ShapePathGuiData &d(m_sp[index]);-
31 d.strokeWidth = w;-
32 d.dirty |= DirtyStyle;-
33 m_accDirty |= DirtyStyle;-
34}
never executed: end of block
0
35-
36void QQuickShapeNvprRenderer::setFillColor(int index, const QColor &color)-
37{-
38 ShapePathGuiData &d(m_sp[index]);-
39 d.fillColor = color;-
40 d.dirty |= DirtyStyle;-
41 m_accDirty |= DirtyStyle;-
42}
never executed: end of block
0
43-
44void QQuickShapeNvprRenderer::setFillRule(int index, QQuickShapePath::FillRule fillRule)-
45{-
46 ShapePathGuiData &d(m_sp[index]);-
47 d.fillRule = fillRule;-
48 d.dirty |= DirtyFillRule;-
49 m_accDirty |= DirtyFillRule;-
50}
never executed: end of block
0
51-
52void QQuickShapeNvprRenderer::setJoinStyle(int index, QQuickShapePath::JoinStyle joinStyle, int miterLimit)-
53{-
54 ShapePathGuiData &d(m_sp[index]);-
55 d.joinStyle = joinStyle;-
56 d.miterLimit = miterLimit;-
57 d.dirty |= DirtyStyle;-
58 m_accDirty |= DirtyStyle;-
59}
never executed: end of block
0
60-
61void QQuickShapeNvprRenderer::setCapStyle(int index, QQuickShapePath::CapStyle capStyle)-
62{-
63 ShapePathGuiData &d(m_sp[index]);-
64 d.capStyle = capStyle;-
65 d.dirty |= DirtyStyle;-
66 m_accDirty |= DirtyStyle;-
67}
never executed: end of block
0
68-
69void QQuickShapeNvprRenderer::setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle,-
70 qreal dashOffset, const QVector<qreal> &dashPattern)-
71{-
72 ShapePathGuiData &d(m_sp[index]);-
73 d.dashActive = strokeStyle == QQuickShapePath::DashLine;-
74 d.dashOffset = dashOffset;-
75 d.dashPattern = dashPattern;-
76 d.dirty |= DirtyDash;-
77 m_accDirty |= DirtyDash;-
78}
never executed: end of block
0
79-
80void QQuickShapeNvprRenderer::setFillGradient(int index, QQuickShapeGradient *gradient)-
81{-
82 ShapePathGuiData &d(m_sp[index]);-
83 if (gradient
gradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
84 d.fillGradient.stops = gradient->gradientStops();-
85 d.fillGradient.spread = gradient->spread();-
86 if (QQuickShapeLinearGradient *g = qobject_cast<QQuickShapeLinearGradient *>(gradient)
QQuickShapeLin...t *>(gradient)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
87 d.fillGradientActive = LinearGradient;-
88 d.fillGradient.a = QPointF(g->x1(), g->y1());-
89 d.fillGradient.b = QPointF(g->x2(), g->y2());-
90 }
never executed: end of block
else if (QQuickShapeRadialGradient *g = qobject_cast<QQuickShapeRadialGradient *>(gradient)
QQuickShapeRad...t *>(gradient)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
91 d.fillGradientActive = RadialGradient;-
92 d.fillGradient.a = QPointF(g->centerX(), g->centerY());-
93 d.fillGradient.b = QPointF(g->focalX(), g->focalY());-
94 d.fillGradient.v0 = g->centerRadius();-
95 d.fillGradient.v1 = g->focalRadius();-
96 }
never executed: end of block
else if (QQuickShapeConicalGradient *g = qobject_cast<QQuickShapeConicalGradient *>(gradient)
QQuickShapeCon...t *>(gradient)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
97 d.fillGradientActive = ConicalGradient;-
98 d.fillGradient.a = QPointF(g->centerX(), g->centerY());-
99 d.fillGradient.v0 = g->angle();-
100 }
never executed: end of block
else {
0
101 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 148)); __builtin_unreachable(); } while (false);-
102 }
never executed: end of block
0
103 } else {-
104 d.fillGradientActive = NoGradient;-
105 }
never executed: end of block
0
106 d.dirty |= DirtyFillGradient;-
107 m_accDirty |= DirtyFillGradient;-
108}
never executed: end of block
0
109-
110void QQuickShapeNvprRenderer::endSync(bool)-
111{-
112}-
113-
114void QQuickShapeNvprRenderer::setNode(QQuickShapeNvprRenderNode *node)-
115{-
116 if (m_node != node
m_node != nodeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
117 m_node = node;-
118 m_accDirty |= DirtyList;-
119 }
never executed: end of block
0
120}
never executed: end of block
0
121-
122QDebug operator<<(QDebug debug, const QQuickShapeNvprRenderer::NvprPath &path)-
123{-
124 QDebugStateSaver saver(debug);-
125 debug.space().noquote();-
126 if (!path.str.isEmpty()
!path.str.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
127 debug << "Path with SVG string" << path.str;-
128 return
never executed: return debug;
debug;
never executed: return debug;
0
129 }-
130 debug << "Path with" << path.cmd.count() << "commands";-
131 int ci = 0;-
132 for (GLubyte cmd : path.cmd) {-
133 static struct { GLubyte cmd; const char *s; int coordCount; } nameTab[] = {-
134 { 0x02, "moveTo", 2 },-
135 { 0x04, "lineTo", 2 },-
136 { 0x0A, "quadTo", 4 },-
137 { 0x0C, "cubicTo", 6 },-
138 { 0x18, "arcTo-large-CW", 5 },-
139 { 0x16, "arcTo-large-CCW", 5 },-
140 { 0x14, "arcTo-small-CW", 5 },-
141 { 0x12, "arcTo-small-CCW", 5 },-
142 { 0x00, "closePath", 0 } };-
143 for (size_t i = 0; i < sizeof(nameTab) / sizeof(nameTab[0])
i < sizeof(nam...of(nameTab[0])Description
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
144 if (nameTab[i].cmd == cmd
nameTab[i].cmd == cmdDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
145 QByteArray cs;-
146 for (int j = 0; j < nameTab[i].coordCount
j < nameTab[i].coordCountDescription
TRUEnever evaluated
FALSEnever evaluated
; ++j) {
0
147 cs.append(QByteArray::number(path.coord[ci++]));-
148 cs.append(' ');-
149 }
never executed: end of block
0
150 debug << "\n " << nameTab[i].s << " " << cs;-
151 break;
never executed: break;
0
152 }-
153 }
never executed: end of block
0
154 }
never executed: end of block
0
155 return
never executed: return debug;
debug;
never executed: return debug;
0
156}-
157-
158static inline void appendCoords(QVector<GLfloat> *v, QQuickCurve *c, QPointF *pos)-
159{-
160 QPointF p(c->hasRelativeX() ? pos->x() + c->relativeX() : c->x(),-
161 c->hasRelativeY() ? pos->y() + c->relativeY() : c->y());-
162 v->append(p.x());-
163 v->append(p.y());-
164 *pos = p;-
165}
never executed: end of block
0
166-
167static inline void appendControlCoords(QVector<GLfloat> *v, QQuickPathQuad *c, const QPointF &pos)-
168{-
169 QPointF p(c->hasRelativeControlX() ? pos.x() + c->relativeControlX() : c->controlX(),-
170 c->hasRelativeControlY() ? pos.y() + c->relativeControlY() : c->controlY());-
171 v->append(p.x());-
172 v->append(p.y());-
173}
never executed: end of block
0
174-
175static inline void appendControl1Coords(QVector<GLfloat> *v, QQuickPathCubic *c, const QPointF &pos)-
176{-
177 QPointF p(c->hasRelativeControl1X() ? pos.x() + c->relativeControl1X() : c->control1X(),-
178 c->hasRelativeControl1Y() ? pos.y() + c->relativeControl1Y() : c->control1Y());-
179 v->append(p.x());-
180 v->append(p.y());-
181}
never executed: end of block
0
182-
183static inline void appendControl2Coords(QVector<GLfloat> *v, QQuickPathCubic *c, const QPointF &pos)-
184{-
185 QPointF p(c->hasRelativeControl2X() ? pos.x() + c->relativeControl2X() : c->control2X(),-
186 c->hasRelativeControl2Y() ? pos.y() + c->relativeControl2Y() : c->control2Y());-
187 v->append(p.x());-
188 v->append(p.y());-
189}
never executed: end of block
0
190-
191void QQuickShapeNvprRenderer::convertPath(const QQuickPath *path, ShapePathGuiData *d)-
192{-
193 d->path = NvprPath();-
194 if (!path
!pathDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
195 return;
never executed: return;
0
196-
197 const QList<QQuickPathElement *> &pp(QQuickPathPrivate::get(path)->_pathElements);-
198 if (pp.isEmpty()
pp.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
199 return;
never executed: return;
0
200-
201 QPointF startPos(path->startX(), path->startY());-
202 QPointF pos(startPos);-
203 if (!qFuzzyIsNull(pos.x())
!qFuzzyIsNull(pos.x())Description
TRUEnever evaluated
FALSEnever evaluated
|| !qFuzzyIsNull(pos.y())
!qFuzzyIsNull(pos.y())Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
204 d->path.cmd.append(0x02);-
205 d->path.coord.append(pos.x());-
206 d->path.coord.append(pos.y());-
207 }
never executed: end of block
0
208-
209 for (QQuickPathElement *e : pp) {-
210 if (QQuickPathMove *o = qobject_cast<QQuickPathMove *>(e)
QQuickPathMove...PathMove *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
211 d->path.cmd.append(0x02);-
212 appendCoords(&d->path.coord, o, &pos);-
213 startPos = pos;-
214 }
never executed: end of block
else if (QQuickPathLine *o = qobject_cast<QQuickPathLine *>(e)
QQuickPathLine...PathLine *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
215 d->path.cmd.append(0x04);-
216 appendCoords(&d->path.coord, o, &pos);-
217 }
never executed: end of block
else if (QQuickPathQuad *o = qobject_cast<QQuickPathQuad *>(e)
QQuickPathQuad...PathQuad *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
218 d->path.cmd.append(0x0A);-
219 appendControlCoords(&d->path.coord, o, pos);-
220 appendCoords(&d->path.coord, o, &pos);-
221 }
never executed: end of block
else if (QQuickPathCubic *o = qobject_cast<QQuickPathCubic *>(e)
QQuickPathCubi...athCubic *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
222 d->path.cmd.append(0x0C);-
223 appendControl1Coords(&d->path.coord, o, pos);-
224 appendControl2Coords(&d->path.coord, o, pos);-
225 appendCoords(&d->path.coord, o, &pos);-
226 }
never executed: end of block
else if (QQuickPathArc *o = qobject_cast<QQuickPathArc *>(e)
QQuickPathArc ...kPathArc *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
227 const bool sweepFlag = o->direction() == QQuickPathArc::Clockwise;-
228 GLenum cmd;-
229 if (o->useLargeArc()
o->useLargeArc()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
230 cmd = sweepFlag
sweepFlagDescription
TRUEnever evaluated
FALSEnever evaluated
? 0x16 : 0x18;
never executed: cmd = sweepFlag ? 0x16 : 0x18;
0
231 else-
232 cmd = sweepFlag
sweepFlagDescription
TRUEnever evaluated
FALSEnever evaluated
? 0x12 : 0x14;
never executed: cmd = sweepFlag ? 0x12 : 0x14;
0
233 d->path.cmd.append(cmd);-
234 d->path.coord.append(o->radiusX());-
235 d->path.coord.append(o->radiusY());-
236 d->path.coord.append(o->xAxisRotation());-
237 appendCoords(&d->path.coord, o, &pos);-
238 }
never executed: end of block
else if (QQuickPathSvg *o = qobject_cast<QQuickPathSvg *>(e)
QQuickPathSvg ...kPathSvg *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
239-
240-
241 if (d->path.str.isEmpty()
d->path.str.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
242 d->path.str = QString(([]() noexcept -> QString { enum { Size = sizeof(u"" "M %1 %2 ")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "M %1 %2 " }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return
never executed: return qstring_literal_temp;
qstring_literal_temp;
never executed: return qstring_literal_temp;
}())).arg(pos.x()).arg(pos.y()).toUtf8();
never executed: d->path.str = QString(([]() noexcept -> QString { enum { Size = sizeof(u"" "M %1 %2 ")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" "M %1 %2 " }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return qstring_literal_temp; }())).arg(pos.x()).arg(pos.y()).toUtf8();
0
243 d->path.str.append(o->path().toUtf8());-
244 }
never executed: end of block
else if (QQuickPathAngleArc *o = qobject_cast<QQuickPathAngleArc *>(e)
QQuickPathAngl...AngleArc *>(e)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
245 QRectF rect(o->centerX() - o->radiusX(), o->centerY() - o->radiusY(), o->radiusX() * 2, o->radiusY() * 2);-
246 QPointF startPoint;-
247 QPointF endPoint;-
248 qt_find_ellipse_coords(rect, o->startAngle(), -o->sweepAngle(), &startPoint, &endPoint);-
249-
250-
251 if (o->moveToStart()
o->moveToStart()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
252 d->path.cmd.append(0x02);
never executed: d->path.cmd.append(0x02);
0
253 else-
254 d->path.cmd.append(0x04);
never executed: d->path.cmd.append(0x04);
0
255 d->path.coord.append(startPoint.x());-
256 d->path.coord.append(startPoint.y());-
257-
258 const bool sweepFlag = o->sweepAngle() > 0;-
259 d->path.cmd.append(qAbs(o->sweepAngle()) > 180.0-
260 ? (sweepFlag ? 0x16 : 0x18)-
261 : (sweepFlag ? 0x12 : 0x14));-
262 d->path.coord.append(o->radiusX());-
263 d->path.coord.append(o->radiusY());-
264 d->path.coord.append(0);-
265 d->path.coord.append(endPoint.x());-
266 d->path.coord.append(endPoint.y());-
267 pos = endPoint;-
268 }
never executed: end of block
else {
0
269 QMessageLogger(__FILE__, 316, __PRETTY_FUNCTION__).warning() << "Shape/NVPR: unsupported Path element" << e;-
270 }
never executed: end of block
0
271 }-
272-
273-
274-
275-
276-
277-
278 if (pos == startPos
pos == startPosDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
279 d->path.cmd.append(0x00);
never executed: d->path.cmd.append(0x00);
0
280}
never executed: end of block
0
281-
282static inline QVector4D qsg_premultiply(const QColor &c, float globalOpacity)-
283{-
284 const float o = c.alphaF() * globalOpacity;-
285 return
never executed: return QVector4D(c.redF() * o, c.greenF() * o, c.blueF() * o, o);
QVector4D(c.redF() * o, c.greenF() * o, c.blueF() * o, o);
never executed: return QVector4D(c.redF() * o, c.greenF() * o, c.blueF() * o, o);
0
286}-
287-
288void QQuickShapeNvprRenderer::updateNode()-
289{-
290-
291-
292-
293 if (!m_accDirty
!m_accDirtyDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
294 return;
never executed: return;
0
295-
296 const int count = m_sp.count();-
297 const bool listChanged = m_accDirty & DirtyList;-
298 if (listChanged
listChangedDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
299 m_node->m_sp.resize(count);
never executed: m_node->m_sp.resize(count);
0
300-
301 for (int i = 0; i < count
i < countDescription
TRUEnever evaluated
FALSEnever evaluated
; ++i) {
0
302 ShapePathGuiData &src(m_sp[i]);-
303 QQuickShapeNvprRenderNode::ShapePathRenderData &dst(m_node->m_sp[i]);-
304-
305 int dirty = src.dirty;-
306 src.dirty = 0;-
307 if (listChanged
listChangedDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
308 dirty |= DirtyPath | DirtyStyle | DirtyFillRule | DirtyDash | DirtyFillGradient;
never executed: dirty |= DirtyPath | DirtyStyle | DirtyFillRule | DirtyDash | DirtyFillGradient;
0
309-
310-
311-
312 dst.dirty |= dirty;-
313-
314 if (dirty & DirtyPath
dirty & DirtyPathDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
315 dst.source = src.path;
never executed: dst.source = src.path;
0
316-
317 if (dirty & DirtyStyle
dirty & DirtyStyleDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
318 dst.strokeWidth = src.strokeWidth;-
319 dst.strokeColor = qsg_premultiply(src.strokeColor, 1.0f);-
320 dst.fillColor = qsg_premultiply(src.fillColor, 1.0f);-
321 switch (src.joinStyle) {-
322 case
never executed: case QQuickShapePath::MiterJoin:
QQuickShapePath::MiterJoin:
never executed: case QQuickShapePath::MiterJoin:
0
323 dst.joinStyle = 0x90A8;-
324 break;
never executed: break;
0
325 case
never executed: case QQuickShapePath::BevelJoin:
QQuickShapePath::BevelJoin:
never executed: case QQuickShapePath::BevelJoin:
0
326 dst.joinStyle = 0x90A6;-
327 break;
never executed: break;
0
328 case
never executed: case QQuickShapePath::RoundJoin:
QQuickShapePath::RoundJoin:
never executed: case QQuickShapePath::RoundJoin:
0
329 dst.joinStyle = 0x90A4;-
330 break;
never executed: break;
0
331 default
never executed: default:
:
never executed: default:
0
332 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 379)); __builtin_unreachable(); } while (false);-
333 }
never executed: end of block
0
334 dst.miterLimit = src.miterLimit;-
335 switch (src.capStyle) {-
336 case
never executed: case QQuickShapePath::FlatCap:
QQuickShapePath::FlatCap:
never executed: case QQuickShapePath::FlatCap:
0
337 dst.capStyle = -
338 0x1D00-
339 ;-
340 break;
never executed: break;
0
341 case
never executed: case QQuickShapePath::SquareCap:
QQuickShapePath::SquareCap:
never executed: case QQuickShapePath::SquareCap:
0
342 dst.capStyle = 0x90A3;-
343 break;
never executed: break;
0
344 case
never executed: case QQuickShapePath::RoundCap:
QQuickShapePath::RoundCap:
never executed: case QQuickShapePath::RoundCap:
0
345 dst.capStyle = 0x90A4;-
346 break;
never executed: break;
0
347 default
never executed: default:
:
never executed: default:
0
348 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 393)); __builtin_unreachable(); } while (false);-
349 }
never executed: end of block
0
350 }-
351-
352 if (dirty & DirtyFillRule
dirty & DirtyFillRuleDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
353 switch (src.fillRule) {-
354 case
never executed: case QQuickShapePath::OddEvenFill:
QQuickShapePath::OddEvenFill:
never executed: case QQuickShapePath::OddEvenFill:
0
355 dst.fillRule = -
356 0x150A-
357 ;-
358 break;
never executed: break;
0
359 case
never executed: case QQuickShapePath::WindingFill:
QQuickShapePath::WindingFill:
never executed: case QQuickShapePath::WindingFill:
0
360 dst.fillRule = 0x9088;-
361 break;
never executed: break;
0
362 default
never executed: default:
:
never executed: default:
0
363 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 406)); __builtin_unreachable(); } while (false);-
364 }
never executed: end of block
0
365 }-
366-
367 if (dirty & DirtyDash
dirty & DirtyDashDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
368-
369-
370 dst.dashOffset = src.dashOffset * src.strokeWidth;-
371 if (src.dashActive
src.dashActiveDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
372 if (src.dashPattern.isEmpty()
src.dashPattern.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
373-
374 dst.dashPattern.resize(2);-
375 dst.dashPattern[0] = 4 * src.strokeWidth;-
376 dst.dashPattern[1] = 2 * src.strokeWidth;-
377 }
never executed: end of block
else {
0
378 dst.dashPattern.resize(src.dashPattern.count());-
379 for (int i = 0; i < src.dashPattern.count()
i < src.dashPattern.count()Description
TRUEnever evaluated
FALSEnever evaluated
; ++i)
0
380 dst.dashPattern[i] = GLfloat(src.dashPattern[i]) * src.strokeWidth;
never executed: dst.dashPattern[i] = GLfloat(src.dashPattern[i]) * src.strokeWidth;
0
381-
382-
383 if (src.dashPattern.count() % 2 != 0
src.dashPatter...unt() % 2 != 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
384 QMessageLogger(__FILE__, 427, __PRETTY_FUNCTION__).warning("QQuickShapeNvprRenderNode: dash pattern not of even length");-
385 dst.dashPattern << src.strokeWidth;-
386 }
never executed: end of block
0
387 }
never executed: end of block
0
388 } else {-
389 dst.dashPattern.clear();-
390 }
never executed: end of block
0
391 }-
392-
393 if (dirty & DirtyFillGradient
dirty & DirtyFillGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
394 dst.fillGradientActive = src.fillGradientActive;-
395 if (src.fillGradientActive
src.fillGradientActiveDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
396 dst.fillGradient = src.fillGradient;
never executed: dst.fillGradient = src.fillGradient;
0
397 }
never executed: end of block
0
398 }
never executed: end of block
0
399-
400 m_node->markDirty(QSGNode::DirtyMaterial);-
401 m_accDirty = 0;-
402}
never executed: end of block
0
403-
404bool QQuickShapeNvprRenderNode::nvprInited = false;-
405QQuickNvprFunctions QQuickShapeNvprRenderNode::nvpr;-
406QQuickNvprMaterialManager QQuickShapeNvprRenderNode::mtlmgr;-
407-
408QQuickShapeNvprRenderNode::~QQuickShapeNvprRenderNode()-
409{-
410 releaseResources();-
411}
never executed: end of block
0
412-
413void QQuickShapeNvprRenderNode::releaseResources()-
414{-
415 for (ShapePathRenderData &d : m_sp) {-
416 if (d.path
d.pathDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
417 nvpr.deletePaths(d.path, 1);-
418 d.path = 0;-
419 }
never executed: end of block
0
420 if (d.fallbackFbo
d.fallbackFboDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
421 delete d.fallbackFbo;-
422 d.fallbackFbo = nullptr;-
423 }
never executed: end of block
0
424 }
never executed: end of block
0
425-
426 m_fallbackBlitter.destroy();-
427}
never executed: end of block
0
428-
429void QQuickNvprMaterialManager::create(QQuickNvprFunctions *nvpr)-
430{-
431 m_nvpr = nvpr;-
432}
never executed: end of block
0
433-
434void QQuickNvprMaterialManager::releaseResources()-
435{-
436 QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions();-
437 for (MaterialDesc &mtl : m_materials) {-
438 if (mtl.ppl
mtl.pplDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
439 f->glDeleteProgramPipelines(1, &mtl.ppl);-
440 mtl = MaterialDesc();-
441 }
never executed: end of block
0
442 }
never executed: end of block
0
443}
never executed: end of block
0
444-
445QQuickNvprMaterialManager::MaterialDesc *QQuickNvprMaterialManager::activateMaterial(Material m)-
446{-
447 QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions();-
448 MaterialDesc &mtl(m_materials[m]);-
449-
450 if (!mtl.ppl
!mtl.pplDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
451 if (m == MatSolid
m == MatSolidDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
452 static const char *fragSrc =-
453 "#version 310 es\n"-
454 "precision highp float;\n"-
455 "out vec4 fragColor;\n"-
456 "uniform vec4 color;\n"-
457 "uniform float opacity;\n"-
458 "void main() {\n"-
459 " fragColor = color * opacity;\n"-
460 "}\n";-
461 if (!m_nvpr->createFragmentOnlyPipeline(fragSrc, &mtl.ppl, &mtl.prg)
!m_nvpr->creat...ppl, &mtl.prg)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
462 QMessageLogger(__FILE__, 505, __PRETTY_FUNCTION__).warning("NVPR: Failed to create shader pipeline for solid fill");-
463 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
464 }-
465 ((mtl.ppl && mtl.prg) ? static_cast<void>(0) : qt_assert("mtl.ppl && mtl.prg", __FILE__, 508));-
466 mtl.uniLoc[0] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "color");-
467 ((mtl.uniLoc[0] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[0] >= 0", __FILE__, 510));-
468 mtl.uniLoc[1] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "opacity");-
469 ((mtl.uniLoc[1] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[1] >= 0", __FILE__, 512));-
470 }
never executed: end of block
else if (m == MatLinearGradient
m == MatLinearGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
471 static const char *fragSrc =-
472 "#version 310 es\n"-
473 "precision highp float;\n"-
474 "layout(location = 0) in vec2 uv;"-
475 "uniform float opacity;\n"-
476 "uniform sampler2D gradTab;\n"-
477 "uniform vec2 gradStart;\n"-
478 "uniform vec2 gradEnd;\n"-
479 "out vec4 fragColor;\n"-
480 "void main() {\n"-
481 " vec2 gradVec = gradEnd - gradStart;\n"-
482 " float gradTabIndex = dot(gradVec, uv - gradStart) / (gradVec.x * gradVec.x + gradVec.y * gradVec.y);\n"-
483 " fragColor = texture(gradTab, vec2(gradTabIndex, 0.5)) * opacity;\n"-
484 "}\n";-
485 if (!m_nvpr->createFragmentOnlyPipeline(fragSrc, &mtl.ppl, &mtl.prg)
!m_nvpr->creat...ppl, &mtl.prg)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
486 QMessageLogger(__FILE__, 529, __PRETTY_FUNCTION__).warning("NVPR: Failed to create shader pipeline for linear gradient");-
487 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
488 }-
489 ((mtl.ppl && mtl.prg) ? static_cast<void>(0) : qt_assert("mtl.ppl && mtl.prg", __FILE__, 532));-
490 mtl.uniLoc[1] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "opacity");-
491 ((mtl.uniLoc[1] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[1] >= 0", __FILE__, 534));-
492 mtl.uniLoc[2] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "gradStart");-
493 ((mtl.uniLoc[2] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[2] >= 0", __FILE__, 536));-
494 mtl.uniLoc[3] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "gradEnd");-
495 ((mtl.uniLoc[3] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[3] >= 0", __FILE__, 538));-
496 }
never executed: end of block
else if (m == MatRadialGradient
m == MatRadialGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
497 static const char *fragSrc =-
498 "#version 310 es\n"-
499 "precision highp float;\n"-
500 "uniform sampler2D gradTab;\n"-
501 "uniform float opacity;\n"-
502 "uniform vec2 focalToCenter;\n"-
503 "uniform float centerRadius;\n"-
504 "uniform float focalRadius;\n"-
505 "uniform vec2 translationPoint;\n"-
506 "layout(location = 0) in vec2 uv;\n"-
507 "out vec4 fragColor;\n"-
508 "void main() {\n"-
509 " vec2 coord = uv - translationPoint;\n"-
510 " float rd = centerRadius - focalRadius;\n"-
511 " float b = 2.0 * (rd * focalRadius + dot(coord, focalToCenter));\n"-
512 " float fmp2_m_radius2 = -focalToCenter.x * focalToCenter.x - focalToCenter.y * focalToCenter.y + rd * rd;\n"-
513 " float inverse_2_fmp2_m_radius2 = 1.0 / (2.0 * fmp2_m_radius2);\n"-
514 " float det = b * b - 4.0 * fmp2_m_radius2 * ((focalRadius * focalRadius) - dot(coord, coord));\n"-
515 " vec4 result = vec4(0.0);\n"-
516 " if (det >= 0.0) {\n"-
517 " float detSqrt = sqrt(det);\n"-
518 " float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2);\n"-
519 " if (focalRadius + w * (centerRadius - focalRadius) >= 0.0)\n"-
520 " result = texture(gradTab, vec2(w, 0.5)) * opacity;\n"-
521 " }\n"-
522 " fragColor = result;\n"-
523 "}\n";-
524 if (!m_nvpr->createFragmentOnlyPipeline(fragSrc, &mtl.ppl, &mtl.prg)
!m_nvpr->creat...ppl, &mtl.prg)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
525 QMessageLogger(__FILE__, 568, __PRETTY_FUNCTION__).warning("NVPR: Failed to create shader pipeline for radial gradient");-
526 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
527 }-
528 ((mtl.ppl && mtl.prg) ? static_cast<void>(0) : qt_assert("mtl.ppl && mtl.prg", __FILE__, 571));-
529 mtl.uniLoc[1] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "opacity");-
530 ((mtl.uniLoc[1] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[1] >= 0", __FILE__, 573));-
531 mtl.uniLoc[2] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "focalToCenter");-
532 ((mtl.uniLoc[2] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[2] >= 0", __FILE__, 575));-
533 mtl.uniLoc[3] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "centerRadius");-
534 ((mtl.uniLoc[3] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[3] >= 0", __FILE__, 577));-
535 mtl.uniLoc[4] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "focalRadius");-
536 ((mtl.uniLoc[4] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[4] >= 0", __FILE__, 579));-
537 mtl.uniLoc[5] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "translationPoint");-
538 ((mtl.uniLoc[5] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[5] >= 0", __FILE__, 581));-
539 }
never executed: end of block
else if (m == MatConicalGradient
m == MatConicalGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
540 static const char *fragSrc =-
541 "#version 310 es\n"-
542 "precision highp float;\n"-
543 "#define INVERSE_2PI 0.1591549430918953358\n"-
544 "uniform sampler2D gradTab;\n"-
545 "uniform float opacity;\n"-
546 "uniform float angle;\n"-
547 "uniform vec2 translationPoint;\n"-
548 "layout(location = 0) in vec2 uv;\n"-
549 "out vec4 fragColor;\n"-
550 "void main() {\n"-
551 " vec2 coord = uv - translationPoint;\n"-
552 " float t;\n"-
553 " if (abs(coord.y) == abs(coord.x))\n"-
554 " t = (atan(-coord.y + 0.002, coord.x) + angle) * INVERSE_2PI;\n"-
555 " else\n"-
556 " t = (atan(-coord.y, coord.x) + angle) * INVERSE_2PI;\n"-
557 " fragColor = texture(gradTab, vec2(t - floor(t), 0.5)) * opacity;\n"-
558 "}\n";-
559 if (!m_nvpr->createFragmentOnlyPipeline(fragSrc, &mtl.ppl, &mtl.prg)
!m_nvpr->creat...ppl, &mtl.prg)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
560 QMessageLogger(__FILE__, 603, __PRETTY_FUNCTION__).warning("NVPR: Failed to create shader pipeline for conical gradient");-
561 return
never executed: return nullptr;
nullptr;
never executed: return nullptr;
0
562 }-
563 ((mtl.ppl && mtl.prg) ? static_cast<void>(0) : qt_assert("mtl.ppl && mtl.prg", __FILE__, 606));-
564 mtl.uniLoc[1] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "opacity");-
565 ((mtl.uniLoc[1] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[1] >= 0", __FILE__, 608));-
566 mtl.uniLoc[2] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "angle");-
567 ((mtl.uniLoc[2] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[2] >= 0", __FILE__, 610));-
568 mtl.uniLoc[3] = f->glGetProgramResourceLocation(mtl.prg, 0x92E1, "translationPoint");-
569 ((mtl.uniLoc[3] >= 0) ? static_cast<void>(0) : qt_assert("mtl.uniLoc[3] >= 0", __FILE__, 612));-
570 }
never executed: end of block
else {
0
571 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 614)); __builtin_unreachable(); } while (false);-
572 }
never executed: end of block
0
573 }-
574-
575 f->glBindProgramPipeline(mtl.ppl);-
576-
577 return
never executed: return &mtl;
&mtl;
never executed: return &mtl;
0
578}-
579-
580void QQuickShapeNvprRenderNode::updatePath(ShapePathRenderData *d)-
581{-
582 if (d->dirty & QQuickShapeNvprRenderer::DirtyPath
d->dirty & QQu...rer::DirtyPathDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
583 if (!d->path
!d->pathDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
584 d->path = nvpr.genPaths(1);-
585 ((d->path != 0) ? static_cast<void>(0) : qt_assert("d->path != 0", __FILE__, 628));-
586 }
never executed: end of block
0
587 if (d->source.str.isEmpty()
d->source.str.isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
588 nvpr.pathCommands(d->path, d->source.cmd.count(), d->source.cmd.constData(),-
589 d->source.coord.count(), -
590 0x1406-
591 , d->source.coord.constData());-
592 }
never executed: end of block
else {
0
593 nvpr.pathString(d->path, 0x9070, d->source.str.count(), d->source.str.constData());-
594 }
never executed: end of block
0
595 }-
596-
597 if (d->dirty & QQuickShapeNvprRenderer::DirtyStyle
d->dirty & QQu...er::DirtyStyleDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
598 nvpr.pathParameterf(d->path, 0x9075, d->strokeWidth);-
599 nvpr.pathParameteri(d->path, 0x9079, d->joinStyle);-
600 nvpr.pathParameteri(d->path, 0x907A, d->miterLimit);-
601 nvpr.pathParameteri(d->path, 0x9076, d->capStyle);-
602 nvpr.pathParameteri(d->path, 0x907B, d->capStyle);-
603 }
never executed: end of block
0
604-
605 if (d->dirty & QQuickShapeNvprRenderer::DirtyDash
d->dirty & QQu...rer::DirtyDashDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
606 nvpr.pathParameterf(d->path, 0x907E, d->dashOffset);-
607-
608 nvpr.pathDashArray(d->path, d->dashPattern.count(), d->dashPattern.constData());-
609 }
never executed: end of block
0
610-
611 if (d->dirty
d->dirtyDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
612 d->fallbackValid = false;
never executed: d->fallbackValid = false;
0
613}
never executed: end of block
0
614-
615void QQuickShapeNvprRenderNode::renderStroke(ShapePathRenderData *d, int strokeStencilValue, int writeMask)-
616{-
617 QQuickNvprMaterialManager::MaterialDesc *mtl = mtlmgr.activateMaterial(QQuickNvprMaterialManager::MatSolid);-
618 f->glProgramUniform4f(mtl->prg, mtl->uniLoc[0],-
619 d->strokeColor.x(), d->strokeColor.y(), d->strokeColor.z(), d->strokeColor.w());-
620 f->glProgramUniform1f(mtl->prg, mtl->uniLoc[1], inheritedOpacity());-
621-
622 nvpr.stencilThenCoverStrokePath(d->path, strokeStencilValue, writeMask, 0x908B);-
623}
never executed: end of block
0
624-
625void QQuickShapeNvprRenderNode::renderFill(ShapePathRenderData *d)-
626{-
627 QQuickNvprMaterialManager::MaterialDesc *mtl = nullptr;-
628 if (d->fillGradientActive
d->fillGradientActiveDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
629 QQuickShapeGradient::SpreadMode spread = d->fillGradient.spread;-
630 if (d->fillGradientActive == QQuickAbstractPathRenderer::LinearGradient
d->fillGradien...LinearGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
631 mtl = mtlmgr.activateMaterial(QQuickNvprMaterialManager::MatLinearGradient);-
632-
633-
634-
635 GLfloat coeff[6] = { 1, 0, 0,-
636 0, 1, 0 };-
637 nvpr.programPathFragmentInputGen(mtl->prg, 0, 0x2401, 2, coeff);-
638 f->glProgramUniform2f(mtl->prg, mtl->uniLoc[2], d->fillGradient.a.x(), d->fillGradient.a.y());-
639 f->glProgramUniform2f(mtl->prg, mtl->uniLoc[3], d->fillGradient.b.x(), d->fillGradient.b.y());-
640 }
never executed: end of block
else if (d->fillGradientActive == QQuickAbstractPathRenderer::RadialGradient
d->fillGradien...RadialGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
641 mtl = mtlmgr.activateMaterial(QQuickNvprMaterialManager::MatRadialGradient);-
642-
643 GLfloat coeff[6] = { 1, 0, 0,-
644 0, 1, 0 };-
645 nvpr.programPathFragmentInputGen(mtl->prg, 0, 0x2401, 2, coeff);-
646-
647 const QPointF centerPoint = d->fillGradient.a;-
648 const QPointF focalPoint = d->fillGradient.b;-
649 const QPointF focalToCenter = centerPoint - focalPoint;-
650 const GLfloat centerRadius = d->fillGradient.v0;-
651 const GLfloat focalRadius = d->fillGradient.v1;-
652-
653 f->glProgramUniform2f(mtl->prg, mtl->uniLoc[2], focalToCenter.x(), focalToCenter.y());-
654 f->glProgramUniform1f(mtl->prg, mtl->uniLoc[3], centerRadius);-
655 f->glProgramUniform1f(mtl->prg, mtl->uniLoc[4], focalRadius);-
656 f->glProgramUniform2f(mtl->prg, mtl->uniLoc[5], focalPoint.x(), focalPoint.y());-
657 }
never executed: end of block
else if (d->fillGradientActive == QQuickAbstractPathRenderer::ConicalGradient
d->fillGradien...onicalGradientDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
658 mtl = mtlmgr.activateMaterial(QQuickNvprMaterialManager::MatConicalGradient);-
659-
660 GLfloat coeff[6] = { 1, 0, 0,-
661 0, 1, 0 };-
662 nvpr.programPathFragmentInputGen(mtl->prg, 0, 0x2401, 2, coeff);-
663-
664 const QPointF centerPoint = d->fillGradient.a;-
665 const GLfloat angle = -qDegreesToRadians(d->fillGradient.v0);-
666-
667 f->glProgramUniform1f(mtl->prg, mtl->uniLoc[2], angle);-
668 f->glProgramUniform2f(mtl->prg, mtl->uniLoc[3], centerPoint.x(), centerPoint.y());-
669-
670 spread = QQuickShapeGradient::RepeatSpread;-
671 }
never executed: end of block
else {
0
672 do { ((false) ? static_cast<void>(0) : qt_assert_x("Q_UNREACHABLE()", "Q_UNREACHABLE was reached", __FILE__, 713)); __builtin_unreachable(); } while (false);-
673 }
never executed: end of block
0
674 const QQuickShapeGradientCache::Key cacheKey(d->fillGradient.stops, spread);-
675 QSGTexture *tx = QQuickShapeGradientCache::currentCache()->get(cacheKey);-
676 tx->bind();-
677 }
never executed: end of block
else {
0
678 mtl = mtlmgr.activateMaterial(QQuickNvprMaterialManager::MatSolid);-
679 f->glProgramUniform4f(mtl->prg, mtl->uniLoc[0],-
680 d->fillColor.x(), d->fillColor.y(), d->fillColor.z(), d->fillColor.w());-
681 }
never executed: end of block
0
682 f->glProgramUniform1f(mtl->prg, mtl->uniLoc[1], inheritedOpacity());-
683-
684 const int writeMask = 0xFF;-
685 nvpr.stencilThenCoverFillPath(d->path, d->fillRule, writeMask, 0x908D);-
686}
never executed: end of block
0
687-
688void QQuickShapeNvprRenderNode::renderOffscreenFill(ShapePathRenderData *d)-
689{-
690 if (d->fallbackValid
d->fallbackValidDescription
TRUEnever evaluated
FALSEnever evaluated
&& d->fallbackFbo
d->fallbackFboDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
691 return;
never executed: return;
0
692-
693 GLfloat bb[4];-
694 nvpr.getPathParameterfv(d->path, 0x90A2, bb);-
695 QSize sz = QSizeF(bb[2] - bb[0] + 1, bb[3] - bb[1] + 1).toSize();-
696 d->fallbackSize = QSize(qMax(32, sz.width()), qMax(32, sz.height()));-
697 d->fallbackTopLeft = QPointF(bb[0], bb[1]);-
698-
699 if (d->fallbackFbo
d->fallbackFboDescription
TRUEnever evaluated
FALSEnever evaluated
&& d->fallbackFbo->size() != d->fallbackSize
d->fallbackFbo...->fallbackSizeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
700 delete d->fallbackFbo;-
701 d->fallbackFbo = nullptr;-
702 }
never executed: end of block
0
703 if (!d->fallbackFbo
!d->fallbackFboDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
704 d->fallbackFbo = new QOpenGLFramebufferObject(d->fallbackSize, QOpenGLFramebufferObject::CombinedDepthStencil);
never executed: d->fallbackFbo = new QOpenGLFramebufferObject(d->fallbackSize, QOpenGLFramebufferObject::CombinedDepthStencil);
0
705 if (!d->fallbackFbo->bind()
!d->fallbackFbo->bind()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
706 return;
never executed: return;
0
707-
708 GLint prevViewport[4];-
709 f->glGetIntegerv(-
710 0x0BA2-
711 , prevViewport);-
712-
713 f->glViewport(0, 0, d->fallbackSize.width(), d->fallbackSize.height());-
714 f->glDisable(-
715 0x0B71-
716 );-
717 f->glClearColor(0, 0, 0, 0);-
718 f->glClearStencil(0);-
719 f->glClear(-
720 0x00004000 -
721 | -
722 0x00000400-
723 );-
724 f->glStencilFunc(-
725 0x0205-
726 , 0, 0xFF);-
727 f->glStencilOp(-
728 0x1E00-
729 , -
730 0x1E00-
731 , -
732 0x1E00-
733 );-
734-
735 QMatrix4x4 mv;-
736 mv.translate(-d->fallbackTopLeft.x(), -d->fallbackTopLeft.y());-
737 nvpr.matrixLoadf(0x1700, mv.constData());-
738 QMatrix4x4 proj;-
739 proj.ortho(0, d->fallbackSize.width(), d->fallbackSize.height(), 0, 1, -1);-
740 nvpr.matrixLoadf(0x1701, proj.constData());-
741-
742 renderFill(d);-
743-
744 d->fallbackFbo->release();-
745 f->glEnable(-
746 0x0B71-
747 );-
748 f->glViewport(prevViewport[0], prevViewport[1], prevViewport[2], prevViewport[3]);-
749-
750 d->fallbackValid = true;-
751}
never executed: end of block
0
752-
753void QQuickShapeNvprRenderNode::setupStencilForCover(bool stencilClip, int sv)-
754{-
755 if (!stencilClip
!stencilClipDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
756-
757-
758 f->glStencilFunc(-
759 0x0205-
760 , 0, 0xFF);-
761 f->glStencilOp(-
762 0x1E00-
763 , -
764 0x1E00-
765 , -
766 0-
767 );-
768 }
never executed: end of block
else {
0
769 f->glStencilFunc(-
770 0x0201-
771 , sv, 0xFF);-
772 f->glStencilOp(-
773 0x1E00-
774 , -
775 0x1E00-
776 , -
777 0x1E01-
778 );-
779 }
never executed: end of block
0
780}-
781-
782void QQuickShapeNvprRenderNode::render(const RenderState *state)-
783{-
784 f = QOpenGLContext::currentContext()->extraFunctions();-
785-
786 if (!nvprInited
!nvprInitedDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
787 if (!nvpr.create()
!nvpr.create()Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
788 QMessageLogger(__FILE__, 795, __PRETTY_FUNCTION__).warning("NVPR init failed");-
789 return;
never executed: return;
0
790 }-
791 mtlmgr.create(&nvpr);-
792 nvprInited = true;-
793 }
never executed: end of block
0
794-
795 f->glUseProgram(0);-
796 f->glStencilMask(~0);-
797 f->glEnable(-
798 0x0B90-
799 );-
800-
801 const bool stencilClip = state->stencilEnabled();-
802-
803 const int sv = state->stencilValue();-
804 const bool hasScissor = state->scissorEnabled();-
805-
806 if (hasScissor
hasScissorDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
807-
808 f->glEnable(-
809 0x0C11-
810 );-
811 }
never executed: end of block
0
812-
813-
814 f->glEnable(-
815 0x0B71-
816 );-
817 f->glDepthFunc(-
818 0x0201-
819 );-
820 nvpr.pathCoverDepthFunc(-
821 0x0201-
822 );-
823 nvpr.pathStencilDepthOffset(-0.05f, -1);-
824-
825 bool reloadMatrices = true;-
826-
827 for (ShapePathRenderData &d : m_sp) {-
828 updatePath(&d);-
829-
830 const bool hasFill = d.hasFill();-
831 const bool hasStroke = d.hasStroke();-
832-
833 if (hasFill
hasFillDescription
TRUEnever evaluated
FALSEnever evaluated
&& stencilClip
stencilClipDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
834-
835-
836-
837 if (hasScissor
hasScissorDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
838 f->glDisable(
never executed: f->glDisable( 0x0C11 );
0
839 0x0C11
never executed: f->glDisable( 0x0C11 );
0
840 );
never executed: f->glDisable( 0x0C11 );
0
841 renderOffscreenFill(&d);-
842 reloadMatrices = true;-
843 if (hasScissor
hasScissorDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
844 f->glEnable(
never executed: f->glEnable( 0x0C11 );
0
845 0x0C11
never executed: f->glEnable( 0x0C11 );
0
846 );
never executed: f->glEnable( 0x0C11 );
0
847 }
never executed: end of block
0
848-
849 if (reloadMatrices
reloadMatricesDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
850 reloadMatrices = false;-
851 nvpr.matrixLoadf(0x1700, matrix()->constData());-
852 nvpr.matrixLoadf(0x1701, state->projectionMatrix()->constData());-
853 }
never executed: end of block
0
854-
855-
856 if (hasFill
hasFillDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
857 if (!stencilClip
!stencilClipDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
858 setupStencilForCover(false, 0);-
859 renderFill(&d);-
860 }
never executed: end of block
else {
0
861 if (!m_fallbackBlitter.isCreated()
!m_fallbackBlitter.isCreated()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
862 m_fallbackBlitter.create();
never executed: m_fallbackBlitter.create();
0
863 f->glStencilFunc(-
864 0x0202-
865 , sv, 0xFF);-
866 f->glStencilOp(-
867 0x1E00-
868 , -
869 0x1E00-
870 , -
871 0x1E00-
872 );-
873 QMatrix4x4 mv = *matrix();-
874 mv.translate(d.fallbackTopLeft.x(), d.fallbackTopLeft.y());-
875 m_fallbackBlitter.texturedQuad(d.fallbackFbo->texture(), d.fallbackFbo->size(),-
876 *state->projectionMatrix(), mv,-
877 inheritedOpacity());-
878 }
never executed: end of block
0
879 }-
880-
881-
882 if (hasStroke
hasStrokeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
883 const int strokeStencilValue = 0x80;-
884 const int writeMask = 0x80;-
885-
886 setupStencilForCover(stencilClip, sv);-
887 if (stencilClip
stencilClipDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
888-
889 nvpr.pathStencilFunc(-
890 0x0202-
891 , sv, 0xFF);-
892-
893-
894 if (sv >= strokeStencilValue
sv >= strokeStencilValueDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
895 QMessageLogger(__FILE__, 878, __PRETTY_FUNCTION__).warning("Shape/NVPR: stencil clip ref value %d too large; expect rendering errors", sv);
never executed: QMessageLogger(__FILE__, 878, __PRETTY_FUNCTION__).warning("Shape/NVPR: stencil clip ref value %d too large; expect rendering errors", sv);
0
896 }
never executed: end of block
0
897-
898 renderStroke(&d, strokeStencilValue, writeMask);-
899 }
never executed: end of block
0
900-
901 if (stencilClip
stencilClipDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
902 nvpr.pathStencilFunc(
never executed: nvpr.pathStencilFunc( 0x0207 , 0, ~0);
0
903 0x0207
never executed: nvpr.pathStencilFunc( 0x0207 , 0, ~0);
0
904 , 0, ~0);
never executed: nvpr.pathStencilFunc( 0x0207 , 0, ~0);
0
905-
906 d.dirty = 0;-
907 }
never executed: end of block
0
908-
909 f->glBindProgramPipeline(0);-
910}
never executed: end of block
0
911-
912QSGRenderNode::StateFlags QQuickShapeNvprRenderNode::changedStates() const-
913{-
914 return
never executed: return BlendState | StencilState | DepthState | ScissorState;
BlendState | StencilState | DepthState | ScissorState;
never executed: return BlendState | StencilState | DepthState | ScissorState;
0
915}-
916-
917QSGRenderNode::RenderingFlags QQuickShapeNvprRenderNode::flags() const-
918{-
919 return
never executed: return DepthAwareRendering;
DepthAwareRendering;
never executed: return DepthAwareRendering;
0
920}-
921-
922bool QQuickShapeNvprRenderNode::isSupported()-
923{-
924 static const bool nvprDisabled = qEnvironmentVariableIntValue("QT_NO_NVPR") != 0;-
925 return
executed 166 times by 1 test: return !nvprDisabled && QQuickNvprFunctions::isSupported();
Executed by:
  • tst_examples
!nvprDisabled && QQuickNvprFunctions::isSupported();
executed 166 times by 1 test: return !nvprDisabled && QQuickNvprFunctions::isSupported();
Executed by:
  • tst_examples
166
926}-
927-
928bool QQuickNvprBlitter::create()-
929{-
930 if (isCreated()
isCreated()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
931 destroy();
never executed: destroy();
0
932-
933 m_program = new QOpenGLShaderProgram;-
934 if (QOpenGLContext::currentContext()->format().profile() == QSurfaceFormat::CoreProfile
QOpenGLContext...t::CoreProfileDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
935 m_program->addCacheableShaderFromSourceFile(QOpenGLShader::Vertex, ([]() noexcept -> QString { enum { Size = sizeof(u"" ":/qt-project.org/shapes/shaders/blit_core.vert")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/shapes/shaders/blit_core.vert" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return
never executed: return qstring_literal_temp;
qstring_literal_temp;
never executed: return qstring_literal_temp;
}()));
0
936 m_program->addCacheableShaderFromSourceFile(QOpenGLShader::Fragment, ([]() noexcept -> QString { enum { Size = sizeof(u"" ":/qt-project.org/shapes/shaders/blit_core.frag")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/shapes/shaders/blit_core.frag" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return
never executed: return qstring_literal_temp;
qstring_literal_temp;
never executed: return qstring_literal_temp;
}()));
0
937 }
never executed: end of block
else {
0
938 m_program->addCacheableShaderFromSourceFile(QOpenGLShader::Vertex, ([]() noexcept -> QString { enum { Size = sizeof(u"" ":/qt-project.org/shapes/shaders/blit.vert")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/shapes/shaders/blit.vert" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return
never executed: return qstring_literal_temp;
qstring_literal_temp;
never executed: return qstring_literal_temp;
}()));
0
939 m_program->addCacheableShaderFromSourceFile(QOpenGLShader::Fragment, ([]() noexcept -> QString { enum { Size = sizeof(u"" ":/qt-project.org/shapes/shaders/blit.frag")/2 - 1 }; static const QStaticStringData<Size> qstring_literal = { { { { -1 } }, Size, 0, 0, sizeof(QStringData) }, u"" ":/qt-project.org/shapes/shaders/blit.frag" }; QStringDataPtr holder = { qstring_literal.data_ptr() }; const QString qstring_literal_temp(holder); return
never executed: return qstring_literal_temp;
qstring_literal_temp;
never executed: return qstring_literal_temp;
}()));
0
940 }
never executed: end of block
0
941 m_program->bindAttributeLocation("qt_Vertex", 0);-
942 m_program->bindAttributeLocation("qt_MultiTexCoord0", 1);-
943 if (!m_program->link()
!m_program->link()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
944 return
never executed: return false;
false;
never executed: return false;
0
945-
946 m_matrixLoc = m_program->uniformLocation("qt_Matrix");-
947 m_opacityLoc = m_program->uniformLocation("qt_Opacity");-
948-
949 m_buffer = new QOpenGLBuffer;-
950 if (!m_buffer->create()
!m_buffer->create()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
951 return
never executed: return false;
false;
never executed: return false;
0
952 m_buffer->bind();-
953 m_buffer->allocate(4 * sizeof(GLfloat) * 6);-
954 m_buffer->release();-
955-
956 return
never executed: return true;
true;
never executed: return true;
0
957}-
958-
959void QQuickNvprBlitter::destroy()-
960{-
961 if (m_program
m_programDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
962 delete m_program;-
963 m_program = nullptr;-
964 }
never executed: end of block
0
965 if (m_buffer
m_bufferDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
966 delete m_buffer;-
967 m_buffer = nullptr;-
968 }
never executed: end of block
0
969}
never executed: end of block
0
970-
971void QQuickNvprBlitter::texturedQuad(GLuint textureId, const QSize &size,-
972 const QMatrix4x4 &proj, const QMatrix4x4 &modelview,-
973 float opacity)-
974{-
975 QOpenGLExtraFunctions *f = QOpenGLContext::currentContext()->extraFunctions();-
976-
977 m_program->bind();-
978-
979 QMatrix4x4 m = proj * modelview;-
980 m_program->setUniformValue(m_matrixLoc, m);-
981 m_program->setUniformValue(m_opacityLoc, opacity);-
982-
983 m_buffer->bind();-
984-
985 if (size != m_prevSize
size != m_prevSizeDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
986 m_prevSize = size;-
987-
988 QPointF p0(size.width() - 1, size.height() - 1);-
989 QPointF p1(0, 0);-
990 QPointF p2(0, size.height() - 1);-
991 QPointF p3(size.width() - 1, 0);-
992-
993 GLfloat vertices[6 * 4] = {-
994 GLfloat(p0.x()), GLfloat(p0.y()), 1, 0,-
995 GLfloat(p1.x()), GLfloat(p1.y()), 0, 1,-
996 GLfloat(p2.x()), GLfloat(p2.y()), 0, 0,-
997-
998 GLfloat(p0.x()), GLfloat(p0.y()), 1, 0,-
999 GLfloat(p3.x()), GLfloat(p3.y()), 1, 1,-
1000 GLfloat(p1.x()), GLfloat(p1.y()), 0, 1,-
1001 };-
1002-
1003 m_buffer->write(0, vertices, sizeof(vertices));-
1004 }
never executed: end of block
0
1005-
1006 m_program->enableAttributeArray(0);-
1007 m_program->enableAttributeArray(1);-
1008 f->glVertexAttribPointer(0, 2, -
1009 0x1406-
1010 , -
1011 0-
1012 , 4 * sizeof(GLfloat), nullptr);-
1013 f->glVertexAttribPointer(1, 2, -
1014 0x1406-
1015 , -
1016 0-
1017 , 4 * sizeof(GLfloat), (const void *) (2 * sizeof(GLfloat)));-
1018-
1019 f->glBindTexture(-
1020 0x0DE1-
1021 , textureId);-
1022-
1023 f->glDrawArrays(-
1024 0x0004-
1025 , 0, 6);-
1026-
1027 f->glBindTexture(-
1028 0x0DE1-
1029 , 0);-
1030 m_buffer->release();-
1031 m_program->release();-
1032}
never executed: end of block
0
1033-
1034-
Switch to Source codePreprocessed file

Generated by Squish Coco 4.2.0