Line | Source Code | Coverage |
---|
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | extern QImage qt_gl_read_frame_buffer(const QSize&, bool, bool); | - |
8 | | - |
9 | | - |
10 | QGLContext* QGLPBufferGLPaintDevice::context() const | - |
11 | { | - |
12 | return pbuf->d_func()->qctx; never executed: return pbuf->d_func()->qctx; | 0 |
13 | } | - |
14 | | - |
15 | void QGLPBufferGLPaintDevice::beginPaint() | - |
16 | { | - |
17 | pbuf->makeCurrent(); | - |
18 | QGLPaintDevice::beginPaint(); | - |
19 | } | 0 |
20 | | - |
21 | void QGLPBufferGLPaintDevice::endPaint() | - |
22 | { | - |
23 | glFlush(); | - |
24 | QGLPaintDevice::endPaint(); | - |
25 | } | 0 |
26 | | - |
27 | void QGLPBufferGLPaintDevice::setFbo(GLuint fbo) | - |
28 | { | - |
29 | m_thisFBO = fbo; | - |
30 | } | 0 |
31 | | - |
32 | void QGLPBufferGLPaintDevice::setPBuffer(QGLPixelBuffer* pb) | - |
33 | { | - |
34 | pbuf = pb; | - |
35 | } | 0 |
36 | | - |
37 | void QGLPixelBufferPrivate::common_init(const QSize &size, const QGLFormat &format, QGLWidget *shareWidget) | - |
38 | { | - |
39 | QGLPixelBuffer * const q = q_func(); | - |
40 | if(init(size, format, shareWidget)) { never evaluated: init(size, format, shareWidget) | 0 |
41 | req_size = size; | - |
42 | req_format = format; | - |
43 | req_shareWidget = shareWidget; | - |
44 | invalid = false; | - |
45 | glDevice.setPBuffer(q); | - |
46 | } | 0 |
47 | } | 0 |
48 | QGLPixelBuffer::QGLPixelBuffer(const QSize &size, const QGLFormat &format, QGLWidget *shareWidget) | - |
49 | : d_ptr(new QGLPixelBufferPrivate(this)) | - |
50 | { | - |
51 | QGLPixelBufferPrivate * const d = d_func(); | - |
52 | d->common_init(size, format, shareWidget); | - |
53 | } | 0 |
54 | QGLPixelBuffer::QGLPixelBuffer(int width, int height, const QGLFormat &format, QGLWidget *shareWidget) | - |
55 | : d_ptr(new QGLPixelBufferPrivate(this)) | - |
56 | { | - |
57 | QGLPixelBufferPrivate * const d = d_func(); | - |
58 | d->common_init(QSize(width, height), format, shareWidget); | - |
59 | } | 0 |
60 | | - |
61 | | - |
62 | | - |
63 | | - |
64 | | - |
65 | | - |
66 | QGLPixelBuffer::~QGLPixelBuffer() | - |
67 | { | - |
68 | QGLPixelBufferPrivate * const d = d_func(); | - |
69 | | - |
70 | | - |
71 | QGLContext *current = const_cast<QGLContext *>(QGLContext::currentContext()); | - |
72 | if (current != d->qctx) never evaluated: current != d->qctx | 0 |
73 | makeCurrent(); never executed: makeCurrent(); | 0 |
74 | d->cleanup(); | - |
75 | if (current && current != d->qctx) never evaluated: current != d->qctx | 0 |
76 | current->makeCurrent(); never executed: current->makeCurrent(); | 0 |
77 | } | 0 |
78 | bool QGLPixelBuffer::makeCurrent() | - |
79 | { | - |
80 | QGLPixelBufferPrivate * const d = d_func(); | - |
81 | if (d->invalid) never evaluated: d->invalid | 0 |
82 | return false; never executed: return false; | 0 |
83 | d->qctx->makeCurrent(); | - |
84 | if (!d->fbo) { | 0 |
85 | QOpenGLFramebufferObjectFormat format; | - |
86 | if (d->req_format.stencil()) never evaluated: d->req_format.stencil() | 0 |
87 | format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); never executed: format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil); | 0 |
88 | else if (d->req_format.depth()) never evaluated: d->req_format.depth() | 0 |
89 | format.setAttachment(QOpenGLFramebufferObject::Depth); never executed: format.setAttachment(QOpenGLFramebufferObject::Depth); | 0 |
90 | if (d->req_format.sampleBuffers()) never evaluated: d->req_format.sampleBuffers() | 0 |
91 | format.setSamples(d->req_format.samples()); never executed: format.setSamples(d->req_format.samples()); | 0 |
92 | d->fbo = new QOpenGLFramebufferObject(d->req_size, format); | - |
93 | d->fbo->bind(); | - |
94 | d->glDevice.setFbo(d->fbo->handle()); | - |
95 | glViewport(0, 0, d->req_size.width(), d->req_size.height()); | - |
96 | } | 0 |
97 | return true; never executed: return true; | 0 |
98 | } | - |
99 | | - |
100 | | - |
101 | | - |
102 | | - |
103 | | - |
104 | | - |
105 | | - |
106 | bool QGLPixelBuffer::doneCurrent() | - |
107 | { | - |
108 | QGLPixelBufferPrivate * const d = d_func(); | - |
109 | if (d->invalid) never evaluated: d->invalid | 0 |
110 | return false; never executed: return false; | 0 |
111 | d->qctx->doneCurrent(); | - |
112 | return true; never executed: return true; | 0 |
113 | } | - |
114 | | - |
115 | | - |
116 | | - |
117 | | - |
118 | QGLContext *QGLPixelBuffer::context() const | - |
119 | { | - |
120 | const QGLPixelBufferPrivate * const d = d_func(); | - |
121 | return d->qctx; never executed: return d->qctx; | 0 |
122 | } | - |
123 | void QGLPixelBuffer::updateDynamicTexture(GLuint texture_id) const | - |
124 | { | - |
125 | const QGLPixelBufferPrivate * const d = d_func(); | - |
126 | if (d->invalid || !d->fbo) never evaluated: d->invalid | 0 |
127 | return; | 0 |
128 | | - |
129 | QOpenGLContext *ctx = QOpenGLContext::currentContext(); | - |
130 | if (!ctx) | 0 |
131 | return; | 0 |
132 | QOpenGLExtensions extensions(ctx); | - |
133 | | - |
134 | if (d->blit_fbo) { never evaluated: d->blit_fbo | 0 |
135 | QOpenGLFramebufferObject::blitFramebuffer(d->blit_fbo, d->fbo); | - |
136 | extensions.glBindFramebuffer(0x8CA8, d->blit_fbo->handle()); | - |
137 | } | 0 |
138 | | - |
139 | glBindTexture(0x0DE1, texture_id); | - |
140 | | - |
141 | glCopyTexImage2D(0x0DE1, 0, 0x8058, 0, 0, d->req_size.width(), d->req_size.height(), 0); | - |
142 | | - |
143 | | - |
144 | | - |
145 | | - |
146 | if (d->blit_fbo) never evaluated: d->blit_fbo | 0 |
147 | extensions.glBindFramebuffer(0x8CA8, ctx->d_func()->current_fbo); never executed: extensions.glBindFramebuffer(0x8CA8, ctx->d_func()->current_fbo); | 0 |
148 | } | 0 |
149 | | - |
150 | | - |
151 | | - |
152 | | - |
153 | QSize QGLPixelBuffer::size() const | - |
154 | { | - |
155 | const QGLPixelBufferPrivate * const d = d_func(); | - |
156 | return d->req_size; never executed: return d->req_size; | 0 |
157 | } | - |
158 | | - |
159 | | - |
160 | | - |
161 | | - |
162 | QImage QGLPixelBuffer::toImage() const | - |
163 | { | - |
164 | const QGLPixelBufferPrivate * const d = d_func(); | - |
165 | if (d->invalid) never evaluated: d->invalid | 0 |
166 | return QImage(); never executed: return QImage(); | 0 |
167 | | - |
168 | const_cast<QGLPixelBuffer *>(this)->makeCurrent(); | - |
169 | if (d->fbo) | 0 |
170 | d->fbo->bind(); never executed: d->fbo->bind(); | 0 |
171 | return qt_gl_read_frame_buffer(d->req_size, d->format.alpha(), true); never executed: return qt_gl_read_frame_buffer(d->req_size, d->format.alpha(), true); | 0 |
172 | } | - |
173 | | - |
174 | | - |
175 | | - |
176 | | - |
177 | Qt::HANDLE QGLPixelBuffer::handle() const | - |
178 | { | - |
179 | const QGLPixelBufferPrivate * const d = d_func(); | - |
180 | if (d->invalid) never evaluated: d->invalid | 0 |
181 | return 0; never executed: return 0; | 0 |
182 | return (Qt::HANDLE) d->pbuf; never executed: return (Qt::HANDLE) d->pbuf; | 0 |
183 | } | - |
184 | | - |
185 | | - |
186 | | - |
187 | | - |
188 | bool QGLPixelBuffer::isValid() const | - |
189 | { | - |
190 | const QGLPixelBufferPrivate * const d = d_func(); | - |
191 | return !d->invalid; never executed: return !d->invalid; | 0 |
192 | } | - |
193 | | - |
194 | static QGLEngineThreadStorage<QGL2PaintEngineEx> *qt_buffer_2_engine() { static QGlobalStatic<QGLEngineThreadStorage<QGL2PaintEngineEx> > thisGlobalStatic = { { (0) }, false }; if (!thisGlobalStatic.pointer.load() && !thisGlobalStatic.destroyed) { QGLEngineThreadStorage<QGL2PaintEngineEx> *x = new QGLEngineThreadStorage<QGL2PaintEngineEx>; if (!thisGlobalStatic.pointer.testAndSetOrdered(0, x)) delete x; else static QGlobalStaticDeleter<QGLEngineThreadStorage<QGL2PaintEngineEx> > cleanup(thisGlobalStatic); } return thisGlobalStatic.pointer.load(); } never executed: delete x; never executed: return thisGlobalStatic.pointer.load(); never evaluated: !thisGlobalStatic.pointer.testAndSetOrdered(0, x) never evaluated: !thisGlobalStatic.pointer.load() never evaluated: !thisGlobalStatic.destroyed | 0 |
195 | | - |
196 | | - |
197 | QPaintEngine *QGLPixelBuffer::paintEngine() const | - |
198 | { | - |
199 | return qt_buffer_2_engine()->engine(); never executed: return qt_buffer_2_engine()->engine(); | 0 |
200 | } | - |
201 | | - |
202 | | - |
203 | int QGLPixelBuffer::metric(PaintDeviceMetric metric) const | - |
204 | { | - |
205 | const QGLPixelBufferPrivate * const d = d_func(); | - |
206 | | - |
207 | float dpmx = qt_defaultDpiX()*100./2.54; | - |
208 | float dpmy = qt_defaultDpiY()*100./2.54; | - |
209 | int w = d->req_size.width(); | - |
210 | int h = d->req_size.height(); | - |
211 | switch (metric) { | - |
212 | case PdmWidth: | - |
213 | return w; never executed: return w; | 0 |
214 | | - |
215 | case PdmHeight: | - |
216 | return h; never executed: return h; | 0 |
217 | | - |
218 | case PdmWidthMM: | - |
219 | return qRound(w * 1000 / dpmx); never executed: return qRound(w * 1000 / dpmx); | 0 |
220 | | - |
221 | case PdmHeightMM: | - |
222 | return qRound(h * 1000 / dpmy); never executed: return qRound(h * 1000 / dpmy); | 0 |
223 | | - |
224 | case PdmNumColors: | - |
225 | return 0; never executed: return 0; | 0 |
226 | | - |
227 | case PdmDepth: | - |
228 | return 32; never executed: return 32; | 0 |
229 | | - |
230 | case PdmDpiX: | - |
231 | return qRound(dpmx * 0.0254); never executed: return qRound(dpmx * 0.0254); | 0 |
232 | | - |
233 | case PdmDpiY: | - |
234 | return qRound(dpmy * 0.0254); never executed: return qRound(dpmy * 0.0254); | 0 |
235 | | - |
236 | case PdmPhysicalDpiX: | - |
237 | return qRound(dpmx * 0.0254); never executed: return qRound(dpmx * 0.0254); | 0 |
238 | | - |
239 | case PdmPhysicalDpiY: | - |
240 | return qRound(dpmy * 0.0254); never executed: return qRound(dpmy * 0.0254); | 0 |
241 | | - |
242 | default: | - |
243 | QMessageLogger("qglpixelbuffer.cpp", 466, __PRETTY_FUNCTION__).warning("QGLPixelBuffer::metric(), Unhandled metric type: %d\n", metric); | - |
244 | break; | 0 |
245 | } | - |
246 | return 0; never executed: return 0; | 0 |
247 | } | - |
248 | GLuint QGLPixelBuffer::bindTexture(const QImage &image, GLenum target) | - |
249 | { | - |
250 | QGLPixelBufferPrivate * const d = d_func(); | - |
251 | | - |
252 | return d->qctx->bindTexture(image, target, GLint(0x8058)); never executed: return d->qctx->bindTexture(image, target, GLint(0x8058)); | 0 |
253 | | - |
254 | | - |
255 | | - |
256 | } | - |
257 | GLuint QGLPixelBuffer::bindTexture(const QPixmap &pixmap, GLenum target) | - |
258 | { | - |
259 | QGLPixelBufferPrivate * const d = d_func(); | - |
260 | | - |
261 | return d->qctx->bindTexture(pixmap, target, GLint(0x8058)); never executed: return d->qctx->bindTexture(pixmap, target, GLint(0x8058)); | 0 |
262 | | - |
263 | | - |
264 | | - |
265 | } | - |
266 | GLuint QGLPixelBuffer::bindTexture(const QString &fileName) | - |
267 | { | - |
268 | QGLPixelBufferPrivate * const d = d_func(); | - |
269 | return d->qctx->bindTexture(fileName); never executed: return d->qctx->bindTexture(fileName); | 0 |
270 | } | - |
271 | | - |
272 | | - |
273 | | - |
274 | | - |
275 | | - |
276 | | - |
277 | void QGLPixelBuffer::deleteTexture(GLuint texture_id) | - |
278 | { | - |
279 | QGLPixelBufferPrivate * const d = d_func(); | - |
280 | d->qctx->deleteTexture(texture_id); | - |
281 | } | 0 |
282 | void QGLPixelBuffer::drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget) | - |
283 | { | - |
284 | QGLPixelBufferPrivate * const d = d_func(); | - |
285 | d->qctx->drawTexture(target, textureId, textureTarget); | - |
286 | } | 0 |
287 | void QGLPixelBuffer::drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget) | - |
288 | { | - |
289 | QGLPixelBufferPrivate * const d = d_func(); | - |
290 | d->qctx->drawTexture(point, textureId, textureTarget); | - |
291 | } | 0 |
292 | | - |
293 | | - |
294 | | - |
295 | | - |
296 | | - |
297 | QGLFormat QGLPixelBuffer::format() const | - |
298 | { | - |
299 | const QGLPixelBufferPrivate * const d = d_func(); | - |
300 | return d->format; never executed: return d->format; | 0 |
301 | } | - |
302 | | - |
303 | | - |
304 | | - |
305 | | - |
306 | | - |
307 | bool QGLPixelBufferPrivate::init(const QSize &, const QGLFormat &f, QGLWidget *shareWidget) | - |
308 | { | - |
309 | widget = new QGLWidget(f, 0, shareWidget); | - |
310 | widget->resize(1, 1); | - |
311 | qctx = const_cast<QGLContext *>(widget->context()); | - |
312 | return widget->isValid(); never executed: return widget->isValid(); | 0 |
313 | } | - |
314 | | - |
315 | bool QGLPixelBufferPrivate::cleanup() | - |
316 | { | - |
317 | delete fbo; | - |
318 | fbo = 0; | - |
319 | delete blit_fbo; | - |
320 | blit_fbo = 0; | - |
321 | delete widget; | - |
322 | widget = 0; | - |
323 | return true; never executed: return true; | 0 |
324 | } | - |
325 | | - |
326 | bool QGLPixelBuffer::bindToDynamicTexture(GLuint texture_id) | - |
327 | { | - |
328 | (void)texture_id;; | - |
329 | return false; never executed: return false; | 0 |
330 | } | - |
331 | | - |
332 | void QGLPixelBuffer::releaseFromDynamicTexture() | - |
333 | { | - |
334 | } | - |
335 | | - |
336 | GLuint QGLPixelBuffer::generateDynamicTexture() const | - |
337 | { | - |
338 | const QGLPixelBufferPrivate * const d = d_func(); | - |
339 | if (!d->fbo) | 0 |
340 | return 0; never executed: return 0; | 0 |
341 | | - |
342 | if (d->fbo->format().samples() > 0 never evaluated: d->fbo->format().samples() > 0 | 0 |
343 | && QOpenGLExtensions(QOpenGLContext::currentContext()) | 0 |
344 | .hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit)) never evaluated: QOpenGLExtensions(QOpenGLContext::currentContext()) .hasOpenGLExtension(QOpenGLExtensions::FramebufferBlit) | 0 |
345 | { | - |
346 | if (!d->blit_fbo) never evaluated: !d->blit_fbo | 0 |
347 | const_cast<QOpenGLFramebufferObject *&>(d->blit_fbo) = new QOpenGLFramebufferObject(d->req_size); never executed: const_cast<QOpenGLFramebufferObject *&>(d->blit_fbo) = new QOpenGLFramebufferObject(d->req_size); | 0 |
348 | } else { | 0 |
349 | return d->fbo->texture(); never executed: return d->fbo->texture(); | 0 |
350 | } | - |
351 | | - |
352 | GLuint texture; | - |
353 | | - |
354 | glGenTextures(1, &texture); | - |
355 | glBindTexture(0x0DE1, texture); | - |
356 | | - |
357 | glTexParameteri(0x0DE1, 0x2801, 0x2600); | - |
358 | glTexParameteri(0x0DE1, 0x2800, 0x2600); | - |
359 | glTexParameteri(0x0DE1, 0x2802, 0x812F); | - |
360 | glTexParameteri(0x0DE1, 0x2803, 0x812F); | - |
361 | | - |
362 | glTexImage2D(0x0DE1, 0, 0x1908, d->req_size.width(), d->req_size.height(), 0, | - |
363 | 0x1908, 0x1401, 0); | - |
364 | | - |
365 | return texture; never executed: return texture; | 0 |
366 | } | - |
367 | | - |
368 | bool QGLPixelBuffer::hasOpenGLPbuffers() | - |
369 | { | - |
370 | return QGLFramebufferObject::hasOpenGLFramebufferObjects(); never executed: return QGLFramebufferObject::hasOpenGLFramebufferObjects(); | 0 |
371 | } | - |
372 | | - |
373 | | - |
374 | | - |
| | |