Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | #include "qsgsoftwareinternalimagenode_p.h" | - |
41 | | - |
42 | #include "qsgsoftwarepixmaptexture_p.h" | - |
43 | #include "qsgsoftwarelayer_p.h" | - |
44 | #include <QPainter> | - |
45 | #include <qmath.h> | - |
46 | | - |
47 | QT_BEGIN_NAMESPACE | - |
48 | | - |
49 | namespace QSGSoftwareHelpers { | - |
50 | | - |
51 | | - |
52 | static inline QMargins normalizedMargins(const QMargins &m) | - |
53 | { | - |
54 | return QMargins(qMax(m.left(), 0), qMax(m.top(), 0), qMax(m.right(), 0), qMax(m.bottom(), 0)); never executed: return QMargins(qMax(m.left(), 0), qMax(m.top(), 0), qMax(m.right(), 0), qMax(m.bottom(), 0)); | 0 |
55 | } | - |
56 | | - |
57 | void qDrawBorderPixmap(QPainter *painter, const QRect &targetRect, const QMargins &targetMarginsIn, | - |
58 | const QPixmap &pixmap, const QRect &sourceRect, const QMargins &sourceMarginsIn, | - |
59 | const QTileRules &rules, QDrawBorderPixmap::DrawingHints hints) | - |
60 | { | - |
61 | QPainter::PixmapFragment d; | - |
62 | d.opacity = 1.0; | - |
63 | d.rotation = 0.0; | - |
64 | | - |
65 | QPixmapFragmentsArray opaqueData; | - |
66 | QPixmapFragmentsArray translucentData; | - |
67 | | - |
68 | QMargins sourceMargins = normalizedMargins(sourceMarginsIn); | - |
69 | QMargins targetMargins = normalizedMargins(targetMarginsIn); | - |
70 | | - |
71 | const qreal sourceDpr = pixmap.devicePixelRatioF(); | - |
72 | sourceMargins *= sourceDpr; | - |
73 | | - |
74 | | - |
75 | const int sourceCenterTop = sourceRect.top() + sourceMargins.top(); | - |
76 | const int sourceCenterLeft = sourceRect.left() + sourceMargins.left(); | - |
77 | const int sourceCenterBottom = sourceRect.bottom() - sourceMargins.bottom() + 1; | - |
78 | const int sourceCenterRight = sourceRect.right() - sourceMargins.right() + 1; | - |
79 | const int sourceCenterWidth = sourceCenterRight - sourceCenterLeft; | - |
80 | const int sourceCenterHeight = sourceCenterBottom - sourceCenterTop; | - |
81 | | - |
82 | const int targetCenterTop = targetRect.top() + targetMargins.top(); | - |
83 | const int targetCenterLeft = targetRect.left() + targetMargins.left(); | - |
84 | const int targetCenterBottom = targetRect.bottom() - targetMargins.bottom() + 1; | - |
85 | const int targetCenterRight = targetRect.right() - targetMargins.right() + 1; | - |
86 | const int targetCenterWidth = targetCenterRight - targetCenterLeft; | - |
87 | const int targetCenterHeight = targetCenterBottom - targetCenterTop; | - |
88 | | - |
89 | QVarLengthArray<qreal, 16> xTarget; | - |
90 | QVarLengthArray<qreal, 16> yTarget; | - |
91 | | - |
92 | int columns = 3; | - |
93 | int rows = 3; | - |
94 | if (rules.horizontal != Qt::StretchTile && sourceCenterWidth != 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
95 | columns = qMax(3, 2 + qCeil((targetCenterWidth * sourceDpr) / qreal(sourceCenterWidth))); never executed: columns = qMax(3, 2 + qCeil((targetCenterWidth * sourceDpr) / qreal(sourceCenterWidth))); | 0 |
96 | if (rules.vertical != Qt::StretchTile && sourceCenterHeight != 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
97 | rows = qMax(3, 2 + qCeil((targetCenterHeight * sourceDpr) / qreal(sourceCenterHeight))); never executed: rows = qMax(3, 2 + qCeil((targetCenterHeight * sourceDpr) / qreal(sourceCenterHeight))); | 0 |
98 | | - |
99 | xTarget.resize(columns + 1); | - |
100 | yTarget.resize(rows + 1); | - |
101 | | - |
102 | bool oldAA = painter->testRenderHint(QPainter::Antialiasing); | - |
103 | if (painter->paintEngine()->type() != QPaintEngine::OpenGLTRUE | never evaluated | FALSE | never evaluated |
| 0 |
104 | && painter->paintEngine()->type() != QPaintEngine::OpenGL2TRUE | never evaluated | FALSE | never evaluated |
| 0 |
105 | && oldAA && painter->combinedTransform().type() != QTransform::TxNone) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
106 | painter->setRenderHint(QPainter::Antialiasing, false); | - |
107 | } never executed: end of block | 0 |
108 | | - |
109 | xTarget[0] = targetRect.left(); | - |
110 | xTarget[1] = targetCenterLeft; | - |
111 | xTarget[columns - 1] = targetCenterRight; | - |
112 | xTarget[columns] = targetRect.left() + targetRect.width(); | - |
113 | | - |
114 | yTarget[0] = targetRect.top(); | - |
115 | yTarget[1] = targetCenterTop; | - |
116 | yTarget[rows - 1] = targetCenterBottom; | - |
117 | yTarget[rows] = targetRect.top() + targetRect.height(); | - |
118 | | - |
119 | qreal dx = targetCenterWidth; | - |
120 | qreal dy = targetCenterHeight; | - |
121 | | - |
122 | switch (rules.horizontal) { | - |
123 | case Qt::StretchTile: never executed: case Qt::StretchTile: | 0 |
124 | dx = targetCenterWidth; | - |
125 | break; never executed: break; | 0 |
126 | case Qt::RepeatTile: never executed: case Qt::RepeatTile: | 0 |
127 | dx = sourceCenterWidth / sourceDpr; | - |
128 | break; never executed: break; | 0 |
129 | case Qt::RoundTile: never executed: case Qt::RoundTile: | 0 |
130 | dx = targetCenterWidth / qreal(columns - 2); | - |
131 | break; never executed: break; | 0 |
132 | } | - |
133 | | - |
134 | for (int i = 2; i < columns - 1; ++i)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
135 | xTarget[i] = xTarget[i - 1] + dx; never executed: xTarget[i] = xTarget[i - 1] + dx; | 0 |
136 | | - |
137 | switch (rules.vertical) { | - |
138 | case Qt::StretchTile: never executed: case Qt::StretchTile: | 0 |
139 | dy = targetCenterHeight; | - |
140 | break; never executed: break; | 0 |
141 | case Qt::RepeatTile: never executed: case Qt::RepeatTile: | 0 |
142 | dy = sourceCenterHeight / sourceDpr; | - |
143 | break; never executed: break; | 0 |
144 | case Qt::RoundTile: never executed: case Qt::RoundTile: | 0 |
145 | dy = targetCenterHeight / qreal(rows - 2); | - |
146 | break; never executed: break; | 0 |
147 | } | - |
148 | | - |
149 | for (int i = 2; i < rows - 1; ++i)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
150 | yTarget[i] = yTarget[i - 1] + dy; never executed: yTarget[i] = yTarget[i - 1] + dy; | 0 |
151 | | - |
152 | | - |
153 | if (targetMargins.top() > 0 && targetMargins.left() > 0 && sourceMargins.top() > 0 && sourceMargins.left() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
154 | d.x = (0.5 * (xTarget[1] + xTarget[0])); | - |
155 | d.y = (0.5 * (yTarget[1] + yTarget[0])); | - |
156 | d.sourceLeft = sourceRect.left(); | - |
157 | d.sourceTop = sourceRect.top(); | - |
158 | d.width = sourceMargins.left(); | - |
159 | d.height = sourceMargins.top(); | - |
160 | d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width; | - |
161 | d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height; | - |
162 | if (hints & QDrawBorderPixmap::OpaqueTopLeft)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
163 | opaqueData.append(d); never executed: opaqueData.append(d); | 0 |
164 | else | - |
165 | translucentData.append(d); never executed: translucentData.append(d); | 0 |
166 | } | - |
167 | if (targetMargins.top() > 0 && targetMargins.right() > 0 && sourceMargins.top() > 0 && sourceMargins.right() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
168 | d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1])); | - |
169 | d.y = (0.5 * (yTarget[1] + yTarget[0])); | - |
170 | d.sourceLeft = sourceCenterRight; | - |
171 | d.sourceTop = sourceRect.top(); | - |
172 | d.width = sourceMargins.right(); | - |
173 | d.height = sourceMargins.top(); | - |
174 | d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width; | - |
175 | d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height; | - |
176 | if (hints & QDrawBorderPixmap::OpaqueTopRight)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
177 | opaqueData.append(d); never executed: opaqueData.append(d); | 0 |
178 | else | - |
179 | translucentData.append(d); never executed: translucentData.append(d); | 0 |
180 | } | - |
181 | if (targetMargins.bottom() > 0 && targetMargins.left() > 0 && sourceMargins.bottom() > 0 && sourceMargins.left() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
182 | d.x = (0.5 * (xTarget[1] + xTarget[0])); | - |
183 | d.y =(0.5 * (yTarget[rows] + yTarget[rows - 1])); | - |
184 | d.sourceLeft = sourceRect.left(); | - |
185 | d.sourceTop = sourceCenterBottom; | - |
186 | d.width = sourceMargins.left(); | - |
187 | d.height = sourceMargins.bottom(); | - |
188 | d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width; | - |
189 | d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height; | - |
190 | if (hints & QDrawBorderPixmap::OpaqueBottomLeft)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
191 | opaqueData.append(d); never executed: opaqueData.append(d); | 0 |
192 | else | - |
193 | translucentData.append(d); never executed: translucentData.append(d); | 0 |
194 | } | - |
195 | if (targetMargins.bottom() > 0 && targetMargins.right() > 0 && sourceMargins.bottom() > 0 && sourceMargins.right() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
196 | d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1])); | - |
197 | d.y = (0.5 * (yTarget[rows] + yTarget[rows - 1])); | - |
198 | d.sourceLeft = sourceCenterRight; | - |
199 | d.sourceTop = sourceCenterBottom; | - |
200 | d.width = sourceMargins.right(); | - |
201 | d.height = sourceMargins.bottom(); | - |
202 | d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width; | - |
203 | d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height; | - |
204 | if (hints & QDrawBorderPixmap::OpaqueBottomRight)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
205 | opaqueData.append(d); never executed: opaqueData.append(d); | 0 |
206 | else | - |
207 | translucentData.append(d); never executed: translucentData.append(d); | 0 |
208 | } | - |
209 | | - |
210 | | - |
211 | if (targetCenterWidth > 0 && sourceCenterWidth > 0) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
212 | if (targetMargins.top() > 0 && sourceMargins.top() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
213 | QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueTop ? opaqueData : translucentData;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
214 | d.sourceLeft = sourceCenterLeft; | - |
215 | d.sourceTop = sourceRect.top(); | - |
216 | d.width = sourceCenterWidth; | - |
217 | d.height = sourceMargins.top(); | - |
218 | d.y = (0.5 * (yTarget[1] + yTarget[0])); | - |
219 | d.scaleX = dx / d.width; | - |
220 | d.scaleY = qreal(yTarget[1] - yTarget[0]) / d.height; | - |
221 | for (int i = 1; i < columns - 1; ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
222 | d.x = (0.5 * (xTarget[i + 1] + xTarget[i])); | - |
223 | data.append(d); | - |
224 | } never executed: end of block | 0 |
225 | if (rules.horizontal == Qt::RepeatTile)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
226 | data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); never executed: data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); | 0 |
227 | } never executed: end of block | 0 |
228 | if (targetMargins.bottom() > 0 && sourceMargins.bottom() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
229 | QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueBottom ? opaqueData : translucentData;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
230 | d.sourceLeft = sourceCenterLeft; | - |
231 | d.sourceTop = sourceCenterBottom; | - |
232 | d.width = sourceCenterWidth; | - |
233 | d.height = sourceMargins.bottom(); | - |
234 | d.y = (0.5 * (yTarget[rows] + yTarget[rows - 1])); | - |
235 | d.scaleX = dx / d.width; | - |
236 | d.scaleY = qreal(yTarget[rows] - yTarget[rows - 1]) / d.height; | - |
237 | for (int i = 1; i < columns - 1; ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
238 | d.x = (0.5 * (xTarget[i + 1] + xTarget[i])); | - |
239 | data.append(d); | - |
240 | } never executed: end of block | 0 |
241 | if (rules.horizontal == Qt::RepeatTile)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
242 | data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); never executed: data[data.size() - 1].width = ((xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX); | 0 |
243 | } never executed: end of block | 0 |
244 | } never executed: end of block | 0 |
245 | | - |
246 | | - |
247 | if (targetCenterHeight > 0 && sourceCenterHeight > 0) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
248 | if (targetMargins.left() > 0 && sourceMargins.left() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
249 | QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueLeft ? opaqueData : translucentData;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
250 | d.sourceLeft = sourceRect.left(); | - |
251 | d.sourceTop = sourceCenterTop; | - |
252 | d.width = sourceMargins.left(); | - |
253 | d.height = sourceCenterHeight; | - |
254 | d.x = (0.5 * (xTarget[1] + xTarget[0])); | - |
255 | d.scaleX = qreal(xTarget[1] - xTarget[0]) / d.width; | - |
256 | d.scaleY = dy / d.height; | - |
257 | for (int i = 1; i < rows - 1; ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
258 | d.y = (0.5 * (yTarget[i + 1] + yTarget[i])); | - |
259 | data.append(d); | - |
260 | } never executed: end of block | 0 |
261 | if (rules.vertical == Qt::RepeatTile)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
262 | data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); never executed: data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); | 0 |
263 | } never executed: end of block | 0 |
264 | if (targetMargins.right() > 0 && sourceMargins.right() > 0) { TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
265 | QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueRight ? opaqueData : translucentData;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
266 | d.sourceLeft = sourceCenterRight; | - |
267 | d.sourceTop = sourceCenterTop; | - |
268 | d.width = sourceMargins.right(); | - |
269 | d.height = sourceCenterHeight; | - |
270 | d.x = (0.5 * (xTarget[columns] + xTarget[columns - 1])); | - |
271 | d.scaleX = qreal(xTarget[columns] - xTarget[columns - 1]) / d.width; | - |
272 | d.scaleY = dy / d.height; | - |
273 | for (int i = 1; i < rows - 1; ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
274 | d.y = (0.5 * (yTarget[i + 1] + yTarget[i])); | - |
275 | data.append(d); | - |
276 | } never executed: end of block | 0 |
277 | if (rules.vertical == Qt::RepeatTile)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
278 | data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); never executed: data[data.size() - 1].height = ((yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY); | 0 |
279 | } never executed: end of block | 0 |
280 | } never executed: end of block | 0 |
281 | | - |
282 | | - |
283 | if (targetCenterWidth > 0 && targetCenterHeight > 0 && sourceCenterWidth > 0 && sourceCenterHeight > 0) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
284 | QPixmapFragmentsArray &data = hints & QDrawBorderPixmap::OpaqueCenter ? opaqueData : translucentData;TRUE | never evaluated | FALSE | never evaluated |
| 0 |
285 | d.sourceLeft = sourceCenterLeft; | - |
286 | d.sourceTop = sourceCenterTop; | - |
287 | d.width = sourceCenterWidth; | - |
288 | d.height = sourceCenterHeight; | - |
289 | d.scaleX = dx / d.width; | - |
290 | d.scaleY = dy / d.height; | - |
291 | | - |
292 | qreal repeatWidth = (xTarget[columns - 1] - xTarget[columns - 2]) / d.scaleX; | - |
293 | qreal repeatHeight = (yTarget[rows - 1] - yTarget[rows - 2]) / d.scaleY; | - |
294 | | - |
295 | for (int j = 1; j < rows - 1; ++j) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
296 | d.y = (0.5 * (yTarget[j + 1] + yTarget[j])); | - |
297 | for (int i = 1; i < columns - 1; ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
298 | d.x = (0.5 * (xTarget[i + 1] + xTarget[i])); | - |
299 | data.append(d); | - |
300 | } never executed: end of block | 0 |
301 | if (rules.horizontal == Qt::RepeatTile)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
302 | data[data.size() - 1].width = repeatWidth; never executed: data[data.size() - 1].width = repeatWidth; | 0 |
303 | } never executed: end of block | 0 |
304 | if (rules.vertical == Qt::RepeatTile) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
305 | for (int i = 1; i < columns - 1; ++i)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
306 | data[data.size() - i].height = repeatHeight; never executed: data[data.size() - i].height = repeatHeight; | 0 |
307 | } never executed: end of block | 0 |
308 | } never executed: end of block | 0 |
309 | | - |
310 | if (opaqueData.size())TRUE | never evaluated | FALSE | never evaluated |
| 0 |
311 | painter->drawPixmapFragments(opaqueData.data(), opaqueData.size(), pixmap, QPainter::OpaqueHint); never executed: painter->drawPixmapFragments(opaqueData.data(), opaqueData.size(), pixmap, QPainter::OpaqueHint); | 0 |
312 | if (translucentData.size())TRUE | never evaluated | FALSE | never evaluated |
| 0 |
313 | painter->drawPixmapFragments(translucentData.data(), translucentData.size(), pixmap); never executed: painter->drawPixmapFragments(translucentData.data(), translucentData.size(), pixmap); | 0 |
314 | | - |
315 | if (oldAA)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
316 | painter->setRenderHint(QPainter::Antialiasing, true); never executed: painter->setRenderHint(QPainter::Antialiasing, true); | 0 |
317 | } never executed: end of block | 0 |
318 | | - |
319 | } | - |
320 | | - |
321 | QSGSoftwareInternalImageNode::QSGSoftwareInternalImageNode() | - |
322 | : m_innerSourceRect(0, 0, 1, 1) | - |
323 | , m_subSourceRect(0, 0, 1, 1) | - |
324 | , m_texture(nullptr) | - |
325 | , m_mirror(false) | - |
326 | , m_textureIsLayer(false) | - |
327 | , m_smooth(true) | - |
328 | , m_tileHorizontal(false) | - |
329 | , m_tileVertical(false) | - |
330 | , m_cachedMirroredPixmapIsDirty(false) | - |
331 | { | - |
332 | setMaterial((QSGMaterial*)1); | - |
333 | setGeometry((QSGGeometry*)1); | - |
334 | } never executed: end of block | 0 |
335 | | - |
336 | | - |
337 | void QSGSoftwareInternalImageNode::setTargetRect(const QRectF &rect) | - |
338 | { | - |
339 | if (rect == m_targetRect)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
340 | return; never executed: return; | 0 |
341 | m_targetRect = rect; | - |
342 | markDirty(DirtyGeometry); | - |
343 | } never executed: end of block | 0 |
344 | | - |
345 | void QSGSoftwareInternalImageNode::setInnerTargetRect(const QRectF &rect) | - |
346 | { | - |
347 | if (rect == m_innerTargetRect)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
348 | return; never executed: return; | 0 |
349 | m_innerTargetRect = rect; | - |
350 | markDirty(DirtyGeometry); | - |
351 | } never executed: end of block | 0 |
352 | | - |
353 | void QSGSoftwareInternalImageNode::setInnerSourceRect(const QRectF &rect) | - |
354 | { | - |
355 | if (rect == m_innerSourceRect)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
356 | return; never executed: return; | 0 |
357 | m_innerSourceRect = rect; | - |
358 | markDirty(DirtyGeometry); | - |
359 | } never executed: end of block | 0 |
360 | | - |
361 | void QSGSoftwareInternalImageNode::setSubSourceRect(const QRectF &rect) | - |
362 | { | - |
363 | if (rect == m_subSourceRect)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
364 | return; never executed: return; | 0 |
365 | m_subSourceRect = rect; | - |
366 | markDirty(DirtyGeometry); | - |
367 | } never executed: end of block | 0 |
368 | | - |
369 | void QSGSoftwareInternalImageNode::setTexture(QSGTexture *texture) | - |
370 | { | - |
371 | m_texture = texture; | - |
372 | m_cachedMirroredPixmapIsDirty = true; | - |
373 | m_textureIsLayer = static_cast<bool>(qobject_cast<QSGSoftwareLayer*>(texture)); | - |
374 | markDirty(DirtyMaterial); | - |
375 | } never executed: end of block | 0 |
376 | | - |
377 | void QSGSoftwareInternalImageNode::setMirror(bool mirror) | - |
378 | { | - |
379 | if (m_mirror != mirror) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
380 | m_mirror = mirror; | - |
381 | m_cachedMirroredPixmapIsDirty = true; | - |
382 | markDirty(DirtyMaterial); | - |
383 | } never executed: end of block | 0 |
384 | } never executed: end of block | 0 |
385 | | - |
386 | void QSGSoftwareInternalImageNode::setMipmapFiltering(QSGTexture::Filtering ) | - |
387 | { | - |
388 | } | - |
389 | | - |
390 | void QSGSoftwareInternalImageNode::setFiltering(QSGTexture::Filtering filtering) | - |
391 | { | - |
392 | bool smooth = (filtering == QSGTexture::Linear); | - |
393 | if (smooth == m_smooth)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
394 | return; never executed: return; | 0 |
395 | | - |
396 | m_smooth = smooth; | - |
397 | markDirty(DirtyMaterial); | - |
398 | } never executed: end of block | 0 |
399 | | - |
400 | void QSGSoftwareInternalImageNode::setHorizontalWrapMode(QSGTexture::WrapMode wrapMode) | - |
401 | { | - |
402 | bool tileHorizontal = (wrapMode == QSGTexture::Repeat); | - |
403 | if (tileHorizontal == m_tileHorizontal)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
404 | return; never executed: return; | 0 |
405 | | - |
406 | m_tileHorizontal = tileHorizontal; | - |
407 | markDirty(DirtyMaterial); | - |
408 | } never executed: end of block | 0 |
409 | | - |
410 | void QSGSoftwareInternalImageNode::setVerticalWrapMode(QSGTexture::WrapMode wrapMode) | - |
411 | { | - |
412 | bool tileVertical = (wrapMode == QSGTexture::Repeat); | - |
413 | if (tileVertical == m_tileVertical)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
414 | return; never executed: return; | 0 |
415 | | - |
416 | m_tileVertical = (wrapMode == QSGTexture::Repeat); | - |
417 | markDirty(DirtyMaterial); | - |
418 | } never executed: end of block | 0 |
419 | | - |
420 | void QSGSoftwareInternalImageNode::update() | - |
421 | { | - |
422 | if (m_cachedMirroredPixmapIsDirty) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
423 | if (m_mirror || m_textureIsLayer) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
424 | QTransform transform( | - |
425 | (m_mirror ? -1 : 1), 0, | - |
426 | 0 , (m_textureIsLayer ? -1 :1), | - |
427 | 0 , 0 | - |
428 | ); | - |
429 | m_cachedMirroredPixmap = pixmap().transformed(transform); | - |
430 | } else { never executed: end of block | 0 |
431 | | - |
432 | if (!m_cachedMirroredPixmap.isNull())TRUE | never evaluated | FALSE | never evaluated |
| 0 |
433 | m_cachedMirroredPixmap = QPixmap(); never executed: m_cachedMirroredPixmap = QPixmap(); | 0 |
434 | } never executed: end of block | 0 |
435 | m_cachedMirroredPixmapIsDirty = false; | - |
436 | } never executed: end of block | 0 |
437 | } never executed: end of block | 0 |
438 | | - |
439 | void QSGSoftwareInternalImageNode::preprocess() | - |
440 | { | - |
441 | bool doDirty = false; | - |
442 | QSGLayer *t = qobject_cast<QSGLayer *>(m_texture); | - |
443 | if (t) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
444 | doDirty = t->updateTexture(); | - |
445 | markDirty(DirtyGeometry); | - |
446 | } never executed: end of block | 0 |
447 | if (doDirty)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
448 | markDirty(DirtyMaterial); never executed: markDirty(DirtyMaterial); | 0 |
449 | m_cachedMirroredPixmapIsDirty = doDirty; | - |
450 | } never executed: end of block | 0 |
451 | | - |
452 | static Qt::TileRule getTileRule(qreal factor) | - |
453 | { | - |
454 | int ifactor = qRound(factor); | - |
455 | if (qFuzzyCompare(factor, ifactor )) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
456 | if (ifactor == 1 || ifactor == 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
457 | return Qt::StretchTile; never executed: return Qt::StretchTile; | 0 |
458 | return Qt::RoundTile; never executed: return Qt::RoundTile; | 0 |
459 | } | - |
460 | return Qt::RepeatTile; never executed: return Qt::RepeatTile; | 0 |
461 | } | - |
462 | | - |
463 | | - |
464 | void QSGSoftwareInternalImageNode::paint(QPainter *painter) | - |
465 | { | - |
466 | painter->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth); | - |
467 | | - |
468 | const QPixmap &pm = m_mirror || m_textureIsLayer ? m_cachedMirroredPixmap : pixmap();TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
469 | | - |
470 | if (m_innerTargetRect != m_targetRect) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
471 | | - |
472 | QMargins margins(m_innerTargetRect.left() - m_targetRect.left(), m_innerTargetRect.top() - m_targetRect.top(), | - |
473 | m_targetRect.right() - m_innerTargetRect.right(), m_targetRect.bottom() - m_innerTargetRect.bottom()); | - |
474 | QSGSoftwareHelpers::QTileRules tilerules(getTileRule(m_subSourceRect.width()), getTileRule(m_subSourceRect.height())); | - |
475 | QSGSoftwareHelpers::qDrawBorderPixmap(painter, m_targetRect.toRect(), margins, pm, QRect(0, 0, pm.width(), pm.height()), | - |
476 | margins, tilerules, QSGSoftwareHelpers::QDrawBorderPixmap::DrawingHints(nullptr)); | - |
477 | return; never executed: return; | 0 |
478 | } | - |
479 | | - |
480 | if (m_tileHorizontal || m_tileVertical) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
481 | painter->save(); | - |
482 | qreal sx = m_targetRect.width()/(m_subSourceRect.width()*pm.width()); | - |
483 | qreal sy = m_targetRect.height()/(m_subSourceRect.height()*pm.height()); | - |
484 | QMatrix transform(sx, 0, 0, sy, 0, 0); | - |
485 | painter->setMatrix(transform, true); | - |
486 | painter->drawTiledPixmap(QRectF(m_targetRect.x()/sx, m_targetRect.y()/sy, m_targetRect.width()/sx, m_targetRect.height()/sy), | - |
487 | pm, | - |
488 | QPointF(m_subSourceRect.left()*pm.width(), m_subSourceRect.top()*pm.height())); | - |
489 | painter->restore(); | - |
490 | } else { never executed: end of block | 0 |
491 | QRectF sr(m_subSourceRect.left()*pm.width(), m_subSourceRect.top()*pm.height(), | - |
492 | m_subSourceRect.width()*pm.width(), m_subSourceRect.height()*pm.height()); | - |
493 | painter->drawPixmap(m_targetRect, pm, sr); | - |
494 | } never executed: end of block | 0 |
495 | } | - |
496 | | - |
497 | QRectF QSGSoftwareInternalImageNode::rect() const | - |
498 | { | - |
499 | return m_targetRect; never executed: return m_targetRect; | 0 |
500 | } | - |
501 | | - |
502 | const QPixmap &QSGSoftwareInternalImageNode::pixmap() const | - |
503 | { | - |
504 | if (QSGSoftwarePixmapTexture *pt = qobject_cast<QSGSoftwarePixmapTexture*>(m_texture))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
505 | return pt->pixmap(); never executed: return pt->pixmap(); | 0 |
506 | if (QSGSoftwareLayer *layer = qobject_cast<QSGSoftwareLayer*>(m_texture))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
507 | return layer->pixmap(); never executed: return layer->pixmap(); | 0 |
508 | Q_ASSERT(m_texture == nullptr); | - |
509 | static const QPixmap nullPixmap; | - |
510 | return nullPixmap; never executed: return nullPixmap; | 0 |
511 | } | - |
512 | | - |
513 | QT_END_NAMESPACE | - |
| | |