Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/quick/scenegraph/adaptations/software/qsgabstractsoftwarerenderer.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||
2 | - | |||||||||||||
3 | - | |||||||||||||
4 | - | |||||||||||||
5 | const QLoggingCategory &lc2DRender() { static const QLoggingCategory category("qt.scenegraph.softwarecontext.abstractrenderer"); return executed 88 times by 1 test: category;return category; Executed by:
executed 88 times by 1 test: }return category; Executed by:
| 88 | ||||||||||||
6 | - | |||||||||||||
7 | - | |||||||||||||
8 | - | |||||||||||||
9 | QSGAbstractSoftwareRenderer::QSGAbstractSoftwareRenderer(QSGRenderContext *context) | - | ||||||||||||
10 | : QSGRenderer(context) | - | ||||||||||||
11 | , m_background(new QSGSimpleRectNode) | - | ||||||||||||
12 | , m_nodeUpdater(new QSGSoftwareRenderableNodeUpdater(this)) | - | ||||||||||||
13 | { | - | ||||||||||||
14 | - | |||||||||||||
15 | auto backgroundRenderable = new QSGSoftwareRenderableNode(QSGSoftwareRenderableNode::SimpleRect, m_background); | - | ||||||||||||
16 | addNodeMapping(m_background, backgroundRenderable); | - | ||||||||||||
17 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
18 | - | |||||||||||||
19 | QSGAbstractSoftwareRenderer::~QSGAbstractSoftwareRenderer() | - | ||||||||||||
20 | { | - | ||||||||||||
21 | - | |||||||||||||
22 | delete m_background; | - | ||||||||||||
23 | - | |||||||||||||
24 | qDeleteAll(m_nodes); | - | ||||||||||||
25 | - | |||||||||||||
26 | delete m_nodeUpdater; | - | ||||||||||||
27 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
28 | - | |||||||||||||
29 | QSGSoftwareRenderableNode *QSGAbstractSoftwareRenderer::renderableNode(QSGNode *node) const | - | ||||||||||||
30 | { | - | ||||||||||||
31 | return executed 104 times by 1 test: m_nodes.value(node, nullptr);return m_nodes.value(node, nullptr); Executed by:
executed 104 times by 1 test: return m_nodes.value(node, nullptr); Executed by:
| 104 | ||||||||||||
32 | } | - | ||||||||||||
33 | - | |||||||||||||
34 | const QLinkedList<QSGSoftwareRenderableNode*> &QSGAbstractSoftwareRenderer::renderableNodes() const | - | ||||||||||||
35 | { | - | ||||||||||||
36 | return never executed: m_renderableNodes;return m_renderableNodes; never executed: return m_renderableNodes; | 0 | ||||||||||||
37 | } | - | ||||||||||||
38 | - | |||||||||||||
39 | void QSGAbstractSoftwareRenderer::addNodeMapping(QSGNode *node, QSGSoftwareRenderableNode *renderableNode) | - | ||||||||||||
40 | { | - | ||||||||||||
41 | m_nodes.insert(node, renderableNode); | - | ||||||||||||
42 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
43 | - | |||||||||||||
44 | void QSGAbstractSoftwareRenderer::appendRenderableNode(QSGSoftwareRenderableNode *node) | - | ||||||||||||
45 | { | - | ||||||||||||
46 | m_renderableNodes.append(node); | - | ||||||||||||
47 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
48 | - | |||||||||||||
49 | void QSGAbstractSoftwareRenderer::nodeChanged(QSGNode *node, QSGNode::DirtyState state) | - | ||||||||||||
50 | { | - | ||||||||||||
51 | if (state & QSGNode::DirtyGeometry
| 0-72 | ||||||||||||
52 | nodeGeometryUpdated(node); | - | ||||||||||||
53 | } never executed: end of block | 0 | ||||||||||||
54 | if (state & QSGNode::DirtyMaterial
| 0-72 | ||||||||||||
55 | nodeMaterialUpdated(node); | - | ||||||||||||
56 | } never executed: end of block | 0 | ||||||||||||
57 | if (state & QSGNode::DirtyMatrix
| 16-56 | ||||||||||||
58 | nodeMatrixUpdated(node); | - | ||||||||||||
59 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
60 | if (state & QSGNode::DirtyNodeAdded
| 32-40 | ||||||||||||
61 | nodeAdded(node); | - | ||||||||||||
62 | } executed 32 times by 1 test: end of block Executed by:
| 32 | ||||||||||||
63 | if (state & QSGNode::DirtyNodeRemoved
| 24-48 | ||||||||||||
64 | nodeRemoved(node); | - | ||||||||||||
65 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
66 | if (state & QSGNode::DirtyOpacity
| 0-72 | ||||||||||||
67 | nodeOpacityUpdated(node); | - | ||||||||||||
68 | } never executed: end of block | 0 | ||||||||||||
69 | if (state & QSGNode::DirtySubtreeBlocked
| 0-72 | ||||||||||||
70 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
71 | } never executed: end of block | 0 | ||||||||||||
72 | if (state & QSGNode::DirtyForceUpdate
| 0-72 | ||||||||||||
73 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
74 | } never executed: end of block | 0 | ||||||||||||
75 | QSGRenderer::nodeChanged(node, state); | - | ||||||||||||
76 | } executed 72 times by 1 test: end of block Executed by:
| 72 | ||||||||||||
77 | - | |||||||||||||
78 | QRegion QSGAbstractSoftwareRenderer::renderNodes(QPainter *painter) | - | ||||||||||||
79 | { | - | ||||||||||||
80 | QRegion dirtyRegion; | - | ||||||||||||
81 | - | |||||||||||||
82 | if (m_renderableNodes.isEmpty()
| 0-24 | ||||||||||||
83 | return never executed: dirtyRegion;return dirtyRegion; never executed: return dirtyRegion; | 0 | ||||||||||||
84 | - | |||||||||||||
85 | auto iterator = m_renderableNodes.begin(); | - | ||||||||||||
86 | - | |||||||||||||
87 | auto backgroundNode = *iterator; | - | ||||||||||||
88 | dirtyRegion += backgroundNode->renderNode(painter, true); | - | ||||||||||||
89 | iterator++; | - | ||||||||||||
90 | - | |||||||||||||
91 | for (; iterator != m_renderableNodes.end()
| 24 | ||||||||||||
92 | auto node = *iterator; | - | ||||||||||||
93 | dirtyRegion += node->renderNode(painter); | - | ||||||||||||
94 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
95 | - | |||||||||||||
96 | return executed 24 times by 1 test: dirtyRegion;return dirtyRegion; Executed by:
executed 24 times by 1 test: return dirtyRegion; Executed by:
| 24 | ||||||||||||
97 | } | - | ||||||||||||
98 | - | |||||||||||||
99 | void QSGAbstractSoftwareRenderer::buildRenderList() | - | ||||||||||||
100 | { | - | ||||||||||||
101 | - | |||||||||||||
102 | m_renderableNodes.clear(); | - | ||||||||||||
103 | - | |||||||||||||
104 | m_renderableNodes.append(renderableNode(m_background)); | - | ||||||||||||
105 | - | |||||||||||||
106 | QSGSoftwareRenderListBuilder(this).visitChildren(rootNode()); | - | ||||||||||||
107 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
108 | - | |||||||||||||
109 | QRegion QSGAbstractSoftwareRenderer::optimizeRenderList() | - | ||||||||||||
110 | { | - | ||||||||||||
111 | - | |||||||||||||
112 | - | |||||||||||||
113 | for (auto i = m_renderableNodes.rbegin(); i != m_renderableNodes.rend()
| 24-48 | ||||||||||||
114 | auto node = *i; | - | ||||||||||||
115 | if (!m_dirtyRegion.isEmpty()
| 16-32 | ||||||||||||
116 | - | |||||||||||||
117 | node->addDirtyRegion(m_dirtyRegion, true); | - | ||||||||||||
118 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
119 | - | |||||||||||||
120 | if (!m_obscuredRegion.isEmpty()
| 0-48 | ||||||||||||
121 | - | |||||||||||||
122 | node->subtractDirtyRegion(m_obscuredRegion); | - | ||||||||||||
123 | } never executed: end of block | 0 | ||||||||||||
124 | - | |||||||||||||
125 | - | |||||||||||||
126 | if (node->isOpaque()
| 24 | ||||||||||||
127 | m_obscuredRegion += node->boundingRectMin(); | - | ||||||||||||
128 | } executed 24 times by 1 test: end of block Executed by:
| 24 | ||||||||||||
129 | - | |||||||||||||
130 | if (node->isDirty()
| 16-32 | ||||||||||||
131 | - | |||||||||||||
132 | if (!m_background->rect().toRect().contains(node->boundingRectMax(), true)
| 6-10 | ||||||||||||
133 | - | |||||||||||||
134 | QRegion renderArea(m_background->rect().toRect()); | - | ||||||||||||
135 | QRegion outsideRegions = node->dirtyRegion().subtracted(renderArea); | - | ||||||||||||
136 | if (!outsideRegions.isEmpty()
| 2-8 | ||||||||||||
137 | node->subtractDirtyRegion(outsideRegions); executed 2 times by 1 test: node->subtractDirtyRegion(outsideRegions); Executed by:
| 2 | ||||||||||||
138 | } executed 10 times by 1 test: end of block Executed by:
| 10 | ||||||||||||
139 | - | |||||||||||||
140 | - | |||||||||||||
141 | if (node->isOpaque()
| 8 | ||||||||||||
142 | - | |||||||||||||
143 | m_dirtyRegion -= node->boundingRectMin(); | - | ||||||||||||
144 | } executed 8 times by 1 test: else {end of block Executed by:
| 8 | ||||||||||||
145 | - | |||||||||||||
146 | m_dirtyRegion += node->dirtyRegion(); | - | ||||||||||||
147 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
148 | - | |||||||||||||
149 | QRegion prevDirty = node->previousDirtyRegion(); | - | ||||||||||||
150 | if (!prevDirty.isNull()
| 0-16 | ||||||||||||
151 | m_dirtyRegion += prevDirty; never executed: m_dirtyRegion += prevDirty; | 0 | ||||||||||||
152 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
153 | } executed 48 times by 1 test: end of block Executed by:
| 48 | ||||||||||||
154 | - | |||||||||||||
155 | if (m_obscuredRegion.contains(m_background->rect().toAlignedRect())
| 0-24 | ||||||||||||
156 | m_isOpaque = true; | - | ||||||||||||
157 | } executed 24 times by 1 test: else {end of block Executed by:
| 24 | ||||||||||||
158 | m_isOpaque = false; | - | ||||||||||||
159 | } never executed: end of block | 0 | ||||||||||||
160 | - | |||||||||||||
161 | - | |||||||||||||
162 | m_dirtyRegion = QRegion(); | - | ||||||||||||
163 | m_obscuredRegion = QRegion(); | - | ||||||||||||
164 | - | |||||||||||||
165 | - | |||||||||||||
166 | - | |||||||||||||
167 | for (auto j = m_renderableNodes.begin(); j != m_renderableNodes.end()
| 24-48 | ||||||||||||
168 | auto node = *j; | - | ||||||||||||
169 | - | |||||||||||||
170 | if (!node->isOpaque()
| 8-24 | ||||||||||||
171 | - | |||||||||||||
172 | node->addDirtyRegion(m_dirtyRegion, true); | - | ||||||||||||
173 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
174 | - | |||||||||||||
175 | m_dirtyRegion += node->dirtyRegion(); | - | ||||||||||||
176 | } executed 48 times by 1 test: end of block Executed by:
| 48 | ||||||||||||
177 | - | |||||||||||||
178 | QRegion updateRegion = m_dirtyRegion; | - | ||||||||||||
179 | - | |||||||||||||
180 | - | |||||||||||||
181 | m_dirtyRegion = QRegion(); | - | ||||||||||||
182 | m_obscuredRegion = QRegion(); | - | ||||||||||||
183 | - | |||||||||||||
184 | return executed 24 times by 1 test: updateRegion;return updateRegion; Executed by:
executed 24 times by 1 test: return updateRegion; Executed by:
| 24 | ||||||||||||
185 | } | - | ||||||||||||
186 | - | |||||||||||||
187 | void QSGAbstractSoftwareRenderer::setBackgroundColor(const QColor &color) | - | ||||||||||||
188 | { | - | ||||||||||||
189 | if (m_background->color() == color
| 0-24 | ||||||||||||
190 | return; executed 24 times by 1 test: return; Executed by:
| 24 | ||||||||||||
191 | m_background->setColor(color); | - | ||||||||||||
192 | renderableNode(m_background)->markMaterialDirty(); | - | ||||||||||||
193 | } never executed: end of block | 0 | ||||||||||||
194 | - | |||||||||||||
195 | void QSGAbstractSoftwareRenderer::setBackgroundRect(const QRect &rect) | - | ||||||||||||
196 | { | - | ||||||||||||
197 | if (m_background->rect().toRect() == rect
| 8-16 | ||||||||||||
198 | return; executed 16 times by 1 test: return; Executed by:
| 16 | ||||||||||||
199 | m_background->setRect(rect); | - | ||||||||||||
200 | renderableNode(m_background)->markGeometryDirty(); | - | ||||||||||||
201 | - | |||||||||||||
202 | markDirty(); | - | ||||||||||||
203 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
204 | - | |||||||||||||
205 | QColor QSGAbstractSoftwareRenderer::backgroundColor() | - | ||||||||||||
206 | { | - | ||||||||||||
207 | return never executed: m_background->color();return m_background->color(); never executed: return m_background->color(); | 0 | ||||||||||||
208 | } | - | ||||||||||||
209 | - | |||||||||||||
210 | QRect QSGAbstractSoftwareRenderer::backgroundRect() | - | ||||||||||||
211 | { | - | ||||||||||||
212 | return never executed: m_background->rect().toRect();return m_background->rect().toRect(); never executed: return m_background->rect().toRect(); | 0 | ||||||||||||
213 | } | - | ||||||||||||
214 | - | |||||||||||||
215 | void QSGAbstractSoftwareRenderer::nodeAdded(QSGNode *node) | - | ||||||||||||
216 | { | - | ||||||||||||
217 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 263, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeAdded %p", (void*)node); | 0-32 | ||||||||||||
218 | - | |||||||||||||
219 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
220 | } executed 32 times by 1 test: end of block Executed by:
| 32 | ||||||||||||
221 | - | |||||||||||||
222 | void QSGAbstractSoftwareRenderer::nodeRemoved(QSGNode *node) | - | ||||||||||||
223 | { | - | ||||||||||||
224 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 270, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeRemoved %p", (void*)node); | 0-40 | ||||||||||||
225 | - | |||||||||||||
226 | auto renderable = renderableNode(node); | - | ||||||||||||
227 | - | |||||||||||||
228 | if (renderable != nullptr
| 8-32 | ||||||||||||
229 | - | |||||||||||||
230 | QRegion dirtyRegion = renderable->previousDirtyRegion(true); | - | ||||||||||||
231 | if (dirtyRegion.isEmpty()
| 0-8 | ||||||||||||
232 | dirtyRegion = renderable->boundingRectMax(); never executed: dirtyRegion = renderable->boundingRectMax(); | 0 | ||||||||||||
233 | m_dirtyRegion += dirtyRegion; | - | ||||||||||||
234 | m_nodes.remove(node); | - | ||||||||||||
235 | delete renderable; | - | ||||||||||||
236 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
237 | - | |||||||||||||
238 | - | |||||||||||||
239 | for (QSGNode *child = node->firstChild(); child
| 16-40 | ||||||||||||
240 | nodeRemoved(child); | - | ||||||||||||
241 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
242 | - | |||||||||||||
243 | m_nodeUpdater->updateNodes(node, true); | - | ||||||||||||
244 | } executed 40 times by 1 test: end of block Executed by:
| 40 | ||||||||||||
245 | - | |||||||||||||
246 | void QSGAbstractSoftwareRenderer::nodeGeometryUpdated(QSGNode *node) | - | ||||||||||||
247 | { | - | ||||||||||||
248 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 294, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeGeometryUpdated"); | 0 | ||||||||||||
249 | - | |||||||||||||
250 | - | |||||||||||||
251 | auto renderable = renderableNode(node); | - | ||||||||||||
252 | if (renderable != nullptr
| 0 | ||||||||||||
253 | renderable->markGeometryDirty(); | - | ||||||||||||
254 | } never executed: else {end of block | 0 | ||||||||||||
255 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
256 | } never executed: end of block | 0 | ||||||||||||
257 | } | - | ||||||||||||
258 | - | |||||||||||||
259 | void QSGAbstractSoftwareRenderer::nodeMaterialUpdated(QSGNode *node) | - | ||||||||||||
260 | { | - | ||||||||||||
261 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 307, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeMaterialUpdated"); | 0 | ||||||||||||
262 | - | |||||||||||||
263 | - | |||||||||||||
264 | auto renderable = renderableNode(node); | - | ||||||||||||
265 | if (renderable != nullptr
| 0 | ||||||||||||
266 | renderable->markMaterialDirty(); | - | ||||||||||||
267 | } never executed: else {end of block | 0 | ||||||||||||
268 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
269 | } never executed: end of block | 0 | ||||||||||||
270 | } | - | ||||||||||||
271 | - | |||||||||||||
272 | void QSGAbstractSoftwareRenderer::nodeMatrixUpdated(QSGNode *node) | - | ||||||||||||
273 | { | - | ||||||||||||
274 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 320, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeMaterialUpdated"); | 0-16 | ||||||||||||
275 | - | |||||||||||||
276 | - | |||||||||||||
277 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
278 | } executed 16 times by 1 test: end of block Executed by:
| 16 | ||||||||||||
279 | - | |||||||||||||
280 | void QSGAbstractSoftwareRenderer::nodeOpacityUpdated(QSGNode *node) | - | ||||||||||||
281 | { | - | ||||||||||||
282 | for (bool qt_category_enabled = lc2DRender().isDebugEnabled(); qt_category_enabled
never executed: QMessageLogger(__FILE__, 328, __PRETTY_FUNCTION__, lc2DRender().categoryName()).debug("nodeOpacityUpdated"); | 0 | ||||||||||||
283 | - | |||||||||||||
284 | - | |||||||||||||
285 | m_nodeUpdater->updateNodes(node); | - | ||||||||||||
286 | } never executed: end of block | 0 | ||||||||||||
287 | - | |||||||||||||
288 | void QSGAbstractSoftwareRenderer::markDirty() | - | ||||||||||||
289 | { | - | ||||||||||||
290 | m_dirtyRegion = QRegion(m_background->rect().toRect()); | - | ||||||||||||
291 | } executed 8 times by 1 test: end of block Executed by:
| 8 | ||||||||||||
292 | - | |||||||||||||
293 | - | |||||||||||||
Switch to Source code | Preprocessed file |