Warning: That file was not part of the compilation database. It may have many parsing errors.
1 | /**************************************************************************** |
---|---|
2 | ** |
3 | ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). |
4 | ** Contact: http://www.qt-project.org/legal |
5 | ** |
6 | ** This file is part of the QtOpenGL module of the Qt Toolkit. |
7 | ** |
8 | ** $QT_BEGIN_LICENSE:LGPL$ |
9 | ** Commercial License Usage |
10 | ** Licensees holding valid commercial Qt licenses may use this file in |
11 | ** accordance with the commercial license agreement provided with the |
12 | ** Software or, alternatively, in accordance with the terms contained in |
13 | ** a written agreement between you and Digia. For licensing terms and |
14 | ** conditions see http://qt.digia.com/licensing. For further information |
15 | ** use the contact form at http://qt.digia.com/contact-us. |
16 | ** |
17 | ** GNU Lesser General Public License Usage |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
19 | ** General Public License version 2.1 as published by the Free Software |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the |
21 | ** packaging of this file. Please review the following information to |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
24 | ** |
25 | ** In addition, as a special exception, Digia gives you certain additional |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
28 | ** |
29 | ** GNU General Public License Usage |
30 | ** Alternatively, this file may be used under the terms of the GNU |
31 | ** General Public License version 3.0 as published by the Free Software |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the |
33 | ** packaging of this file. Please review the following information to |
34 | ** ensure the GNU General Public License version 3.0 requirements will be |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. |
36 | ** |
37 | ** |
38 | ** $QT_END_LICENSE$ |
39 | ** |
40 | ****************************************************************************/ |
41 | |
42 | #include <qglpixelbuffer.h> |
43 | #include <qgl.h> |
44 | #include <private/qgl_p.h> |
45 | |
46 | #include <private/qglpixelbuffer_p.h> |
47 | |
48 | #include <qimage.h> |
49 | #include <qdebug.h> |
50 | |
51 | QT_BEGIN_NAMESPACE |
52 | |
53 | /* WGL_WGLEXT_PROTOTYPES */ |
54 | typedef const char * (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); |
55 | typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); |
56 | typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); |
57 | typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); |
58 | typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); |
59 | typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); |
60 | typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); |
61 | typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); |
62 | typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); |
63 | typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); |
64 | typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); |
65 | typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int * piAttribList); |
66 | |
67 | #ifndef WGL_ARB_pbuffer |
68 | #define WGL_DRAW_TO_PBUFFER_ARB 0x202D |
69 | #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E |
70 | #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F |
71 | #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 |
72 | #define WGL_PBUFFER_LARGEST_ARB 0x2033 |
73 | #define WGL_PBUFFER_WIDTH_ARB 0x2034 |
74 | #define WGL_PBUFFER_HEIGHT_ARB 0x2035 |
75 | #define WGL_PBUFFER_LOST_ARB 0x2036 |
76 | #endif |
77 | |
78 | #ifndef WGL_ARB_pixel_format |
79 | #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 |
80 | #define WGL_DRAW_TO_WINDOW_ARB 0x2001 |
81 | #define WGL_DRAW_TO_BITMAP_ARB 0x2002 |
82 | #define WGL_ACCELERATION_ARB 0x2003 |
83 | #define WGL_NEED_PALETTE_ARB 0x2004 |
84 | #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 |
85 | #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 |
86 | #define WGL_SWAP_METHOD_ARB 0x2007 |
87 | #define WGL_NUMBER_OVERLAYS_ARB 0x2008 |
88 | #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 |
89 | #define WGL_TRANSPARENT_ARB 0x200A |
90 | #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 |
91 | #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 |
92 | #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 |
93 | #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A |
94 | #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B |
95 | #define WGL_SHARE_DEPTH_ARB 0x200C |
96 | #define WGL_SHARE_STENCIL_ARB 0x200D |
97 | #define WGL_SHARE_ACCUM_ARB 0x200E |
98 | #define WGL_SUPPORT_GDI_ARB 0x200F |
99 | #define WGL_SUPPORT_OPENGL_ARB 0x2010 |
100 | #define WGL_DOUBLE_BUFFER_ARB 0x2011 |
101 | #define WGL_STEREO_ARB 0x2012 |
102 | #define WGL_PIXEL_TYPE_ARB 0x2013 |
103 | #define WGL_COLOR_BITS_ARB 0x2014 |
104 | #define WGL_RED_BITS_ARB 0x2015 |
105 | #define WGL_RED_SHIFT_ARB 0x2016 |
106 | #define WGL_GREEN_BITS_ARB 0x2017 |
107 | #define WGL_GREEN_SHIFT_ARB 0x2018 |
108 | #define WGL_BLUE_BITS_ARB 0x2019 |
109 | #define WGL_BLUE_SHIFT_ARB 0x201A |
110 | #define WGL_ALPHA_BITS_ARB 0x201B |
111 | #define WGL_ALPHA_SHIFT_ARB 0x201C |
112 | #define WGL_ACCUM_BITS_ARB 0x201D |
113 | #define WGL_ACCUM_RED_BITS_ARB 0x201E |
114 | #define WGL_ACCUM_GREEN_BITS_ARB 0x201F |
115 | #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 |
116 | #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 |
117 | #define WGL_DEPTH_BITS_ARB 0x2022 |
118 | #define WGL_STENCIL_BITS_ARB 0x2023 |
119 | #define WGL_AUX_BUFFERS_ARB 0x2024 |
120 | #define WGL_NO_ACCELERATION_ARB 0x2025 |
121 | #define WGL_GENERIC_ACCELERATION_ARB 0x2026 |
122 | #define WGL_FULL_ACCELERATION_ARB 0x2027 |
123 | #define WGL_SWAP_EXCHANGE_ARB 0x2028 |
124 | #define WGL_SWAP_COPY_ARB 0x2029 |
125 | #define WGL_SWAP_UNDEFINED_ARB 0x202A |
126 | #define WGL_TYPE_RGBA_ARB 0x202B |
127 | #define WGL_TYPE_COLORINDEX_ARB 0x202C |
128 | #endif |
129 | |
130 | #ifndef WGL_ARB_render_texture |
131 | #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 |
132 | #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 |
133 | #define WGL_TEXTURE_FORMAT_ARB 0x2072 |
134 | #define WGL_TEXTURE_TARGET_ARB 0x2073 |
135 | #define WGL_MIPMAP_TEXTURE_ARB 0x2074 |
136 | #define WGL_TEXTURE_RGB_ARB 0x2075 |
137 | #define WGL_TEXTURE_RGBA_ARB 0x2076 |
138 | #define WGL_NO_TEXTURE_ARB 0x2077 |
139 | #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 |
140 | #define WGL_TEXTURE_1D_ARB 0x2079 |
141 | #define WGL_TEXTURE_2D_ARB 0x207A |
142 | #define WGL_MIPMAP_LEVEL_ARB 0x207B |
143 | #define WGL_CUBE_MAP_FACE_ARB 0x207C |
144 | #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D |
145 | #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E |
146 | #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F |
147 | #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 |
148 | #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 |
149 | #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 |
150 | #define WGL_FRONT_LEFT_ARB 0x2083 |
151 | #define WGL_FRONT_RIGHT_ARB 0x2084 |
152 | #define WGL_BACK_LEFT_ARB 0x2085 |
153 | #define WGL_BACK_RIGHT_ARB 0x2086 |
154 | #define WGL_AUX0_ARB 0x2087 |
155 | #define WGL_AUX1_ARB 0x2088 |
156 | #define WGL_AUX2_ARB 0x2089 |
157 | #define WGL_AUX3_ARB 0x208A |
158 | #define WGL_AUX4_ARB 0x208B |
159 | #define WGL_AUX5_ARB 0x208C |
160 | #define WGL_AUX6_ARB 0x208D |
161 | #define WGL_AUX7_ARB 0x208E |
162 | #define WGL_AUX8_ARB 0x208F |
163 | #define WGL_AUX9_ARB 0x2090 |
164 | #endif |
165 | |
166 | #ifndef WGL_FLOAT_COMPONENTS_NV |
167 | #define WGL_FLOAT_COMPONENTS_NV 0x20B0 |
168 | #endif |
169 | |
170 | #ifndef WGL_ARB_multisample |
171 | #define WGL_SAMPLE_BUFFERS_ARB 0x2041 |
172 | #define WGL_SAMPLES_ARB 0x2042 |
173 | #endif |
174 | |
175 | #ifndef GL_SAMPLES_ARB |
176 | #define GL_SAMPLES_ARB 0x80A9 |
177 | #endif |
178 | |
179 | QGLFormat pfiToQGLFormat(HDC hdc, int pfi); |
180 | |
181 | static void qt_format_to_attrib_list(bool has_render_texture, const QGLFormat &f, int attribs[]) |
182 | { |
183 | int i = 0; |
184 | attribs[i++] = WGL_SUPPORT_OPENGL_ARB; |
185 | attribs[i++] = TRUE; |
186 | attribs[i++] = WGL_DRAW_TO_PBUFFER_ARB; |
187 | attribs[i++] = TRUE; |
188 | |
189 | if (has_render_texture) { |
190 | attribs[i++] = WGL_BIND_TO_TEXTURE_RGBA_ARB; |
191 | attribs[i++] = TRUE; |
192 | } |
193 | |
194 | attribs[i++] = WGL_COLOR_BITS_ARB; |
195 | attribs[i++] = 32; |
196 | attribs[i++] = WGL_DOUBLE_BUFFER_ARB; |
197 | attribs[i++] = FALSE; |
198 | |
199 | if (f.stereo()) { |
200 | attribs[i++] = WGL_STEREO_ARB; |
201 | attribs[i++] = TRUE; |
202 | } |
203 | if (f.depth()) { |
204 | attribs[i++] = WGL_DEPTH_BITS_ARB; |
205 | attribs[i++] = f.depthBufferSize() == -1 ? 24 : f.depthBufferSize(); |
206 | } |
207 | if (f.redBufferSize() != -1) { |
208 | attribs[i++] = WGL_RED_BITS_ARB; |
209 | attribs[i++] = f.redBufferSize(); |
210 | } |
211 | if (f.greenBufferSize() != -1) { |
212 | attribs[i++] = WGL_GREEN_BITS_ARB; |
213 | attribs[i++] = f.greenBufferSize(); |
214 | } |
215 | if (f.blueBufferSize() != -1) { |
216 | attribs[i++] = WGL_BLUE_BITS_ARB; |
217 | attribs[i++] = f.blueBufferSize(); |
218 | } |
219 | if (f.alpha()) { |
220 | attribs[i++] = WGL_ALPHA_BITS_ARB; |
221 | attribs[i++] = f.alphaBufferSize() == -1 ? 8 : f.alphaBufferSize(); |
222 | } |
223 | if (f.accum()) { |
224 | attribs[i++] = WGL_ACCUM_BITS_ARB; |
225 | attribs[i++] = f.accumBufferSize() == -1 ? 16 : f.accumBufferSize(); |
226 | } |
227 | if (f.stencil()) { |
228 | attribs[i++] = WGL_STENCIL_BITS_ARB; |
229 | attribs[i++] = f.stencilBufferSize() == -1 ? 8 : f.stencilBufferSize(); |
230 | } |
231 | if ((f.redBufferSize() > 8 || f.greenBufferSize() > 8 |
232 | || f.blueBufferSize() > 8 || f.alphaBufferSize() > 8) |
233 | && (QGLExtensions::glExtensions() & QGLExtensions::NVFloatBuffer)) |
234 | { |
235 | attribs[i++] = WGL_FLOAT_COMPONENTS_NV; |
236 | attribs[i++] = TRUE; |
237 | } |
238 | if (f.sampleBuffers()) { |
239 | attribs[i++] = WGL_SAMPLE_BUFFERS_ARB; |
240 | attribs[i++] = 1; |
241 | attribs[i++] = WGL_SAMPLES_ARB; |
242 | attribs[i++] = f.samples() == -1 ? 16 : f.samples(); |
243 | } |
244 | attribs[i] = 0; |
245 | } |
246 | |
247 | bool QGLPixelBufferPrivate::init(const QSize &size, const QGLFormat &f, QGLWidget *shareWidget) |
248 | { |
249 | QGLTemporaryContext tempContext; |
250 | |
251 | PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB = |
252 | (PFNWGLCREATEPBUFFERARBPROC) wglGetProcAddress("wglCreatePbufferARB"); |
253 | PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB = |
254 | (PFNWGLGETPBUFFERDCARBPROC) wglGetProcAddress("wglGetPbufferDCARB"); |
255 | PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB = |
256 | (PFNWGLQUERYPBUFFERARBPROC) wglGetProcAddress("wglQueryPbufferARB"); |
257 | PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB = |
258 | (PFNWGLCHOOSEPIXELFORMATARBPROC) wglGetProcAddress("wglChoosePixelFormatARB"); |
259 | |
260 | if (!wglCreatePbufferARB) // assumes that if one can be resolved, all of them can |
261 | return false; |
262 | |
263 | dc = wglGetCurrentDC(); |
264 | Q_ASSERT(dc); |
265 | has_render_texture = false; |
266 | |
267 | // sample buffers doesn't work in conjunction with the render_texture extension |
268 | if (!f.sampleBuffers()) { |
269 | PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = |
270 | (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); |
271 | |
272 | if (wglGetExtensionsStringARB) { |
273 | QString extensions(QLatin1String(wglGetExtensionsStringARB(dc))); |
274 | has_render_texture = extensions.contains(QLatin1String("WGL_ARB_render_texture")); |
275 | } |
276 | } |
277 | |
278 | int attribs[40]; |
279 | qt_format_to_attrib_list(has_render_texture, f, attribs); |
280 | |
281 | // Find pbuffer capable pixel format. |
282 | unsigned int num_formats = 0; |
283 | int pixel_format; |
284 | wglChoosePixelFormatARB(dc, attribs, 0, 1, &pixel_format, &num_formats); |
285 | |
286 | // some GL implementations don't support pbuffers with accum |
287 | // buffers, so try that before we give up |
288 | if (num_formats == 0 && f.accum()) { |
289 | QGLFormat tmp = f; |
290 | tmp.setAccum(false); |
291 | qt_format_to_attrib_list(has_render_texture, tmp, attribs); |
292 | wglChoosePixelFormatARB(dc, attribs, 0, 1, &pixel_format, &num_formats); |
293 | } |
294 | |
295 | if (num_formats == 0) { |
296 | qWarning("QGLPixelBuffer: Unable to find a pixel format with pbuffer - giving up."); |
297 | return false; |
298 | } |
299 | format = pfiToQGLFormat(dc, pixel_format); |
300 | |
301 | // NB! The below ONLY works if the width/height are powers of 2. |
302 | // Set some pBuffer attributes so that we can use this pBuffer as |
303 | // a 2D RGBA texture target. |
304 | int pb_attribs[] = {WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB, |
305 | WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB, 0}; |
306 | int pb_attribs_null[] = {0}; |
307 | |
308 | pbuf = wglCreatePbufferARB(dc, pixel_format, size.width(), size.height(), |
309 | has_render_texture ? pb_attribs : pb_attribs_null); |
310 | if (!pbuf) { |
311 | // try again without the render_texture extension |
312 | pbuf = wglCreatePbufferARB(dc, pixel_format, size.width(), size.height(), pb_attribs_null); |
313 | has_render_texture = false; |
314 | if (!pbuf) { |
315 | qWarning("QGLPixelBuffer: Unable to create pbuffer [w=%d, h=%d] - giving up.", size.width(), size.height()); |
316 | return false; |
317 | } |
318 | } |
319 | |
320 | dc = wglGetPbufferDCARB(pbuf); |
321 | ctx = wglCreateContext(dc); |
322 | if (!dc || !ctx) { |
323 | qWarning("QGLPixelBuffer: Unable to create pbuffer context - giving up."); |
324 | return false; |
325 | } |
326 | |
327 | // Explicitly disable the render_texture extension if we have a |
328 | // multi-sampled pbuffer context. This seems to be a problem only with |
329 | // ATI cards if multi-sampling is forced globally in the driver. |
330 | wglMakeCurrent(dc, ctx); |
331 | GLint samples = 0; |
332 | glGetIntegerv(GL_SAMPLES_ARB, &samples); |
333 | if (has_render_texture && samples != 0) |
334 | has_render_texture = false; |
335 | |
336 | HGLRC share_ctx = shareWidget ? shareWidget->d_func()->glcx->d_func()->rc : 0; |
337 | if (share_ctx && !wglShareLists(share_ctx, ctx)) |
338 | qWarning("QGLPixelBuffer: Unable to share display lists - with share widget."); |
339 | |
340 | int width, height; |
341 | wglQueryPbufferARB(pbuf, WGL_PBUFFER_WIDTH_ARB, &width); |
342 | wglQueryPbufferARB(pbuf, WGL_PBUFFER_HEIGHT_ARB, &height); |
343 | return true; |
344 | } |
345 | |
346 | bool QGLPixelBufferPrivate::cleanup() |
347 | { |
348 | PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB = |
349 | (PFNWGLRELEASEPBUFFERDCARBPROC) wglGetProcAddress("wglReleasePbufferDCARB"); |
350 | PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB = |
351 | (PFNWGLDESTROYPBUFFERARBPROC) wglGetProcAddress("wglDestroyPbufferARB"); |
352 | if (!invalid && wglReleasePbufferDCARB && wglDestroyPbufferARB) { |
353 | wglReleasePbufferDCARB(pbuf, dc); |
354 | wglDestroyPbufferARB(pbuf); |
355 | } |
356 | return true; |
357 | } |
358 | |
359 | bool QGLPixelBuffer::bindToDynamicTexture(GLuint texture_id) |
360 | { |
361 | Q_D(QGLPixelBuffer); |
362 | if (d->invalid || !d->has_render_texture) |
363 | return false; |
364 | PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB = |
365 | (PFNWGLBINDTEXIMAGEARBPROC) wglGetProcAddress("wglBindTexImageARB"); |
366 | if (wglBindTexImageARB) { |
367 | glBindTexture(GL_TEXTURE_2D, texture_id); |
368 | return wglBindTexImageARB(d->pbuf, WGL_FRONT_LEFT_ARB); |
369 | } |
370 | return false; |
371 | } |
372 | |
373 | void QGLPixelBuffer::releaseFromDynamicTexture() |
374 | { |
375 | Q_D(QGLPixelBuffer); |
376 | if (d->invalid || !d->has_render_texture) |
377 | return; |
378 | PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB = |
379 | (PFNWGLRELEASETEXIMAGEARBPROC) wglGetProcAddress("wglReleaseTexImageARB"); |
380 | if (wglReleaseTexImageARB) |
381 | wglReleaseTexImageARB(d->pbuf, WGL_FRONT_LEFT_ARB); |
382 | } |
383 | |
384 | bool QGLPixelBuffer::hasOpenGLPbuffers() |
385 | { |
386 | bool ret = false; |
387 | QGLTemporaryContext *tmpContext = 0; |
388 | if (!QGLContext::currentContext()) |
389 | tmpContext = new QGLTemporaryContext; |
390 | PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = |
391 | (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); |
392 | if (wglGetExtensionsStringARB) { |
393 | QString extensions(QLatin1String(wglGetExtensionsStringARB(wglGetCurrentDC()))); |
394 | if (extensions.contains(QLatin1String("WGL_ARB_pbuffer")) |
395 | && extensions.contains(QLatin1String("WGL_ARB_pixel_format"))) { |
396 | ret = true; |
397 | } |
398 | } |
399 | if (tmpContext) |
400 | delete tmpContext; |
401 | return ret; |
402 | } |
403 | |
404 | QT_END_NAMESPACE |
405 |
Warning: That file was not part of the compilation database. It may have many parsing errors.