Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/gui/opengl/qopengltextureblitter.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||
2 | - | |||||||||||||
3 | - | |||||||||||||
4 | - | |||||||||||||
5 | - | |||||||||||||
6 | - | |||||||||||||
7 | - | |||||||||||||
8 | - | |||||||||||||
9 | static const char vertex_shader150[] = | - | ||||||||||||
10 | "#version 150 core\n" | - | ||||||||||||
11 | "in vec3 vertexCoord;" | - | ||||||||||||
12 | "in vec2 textureCoord;" | - | ||||||||||||
13 | "out vec2 uv;" | - | ||||||||||||
14 | "uniform mat4 vertexTransform;" | - | ||||||||||||
15 | "uniform mat3 textureTransform;" | - | ||||||||||||
16 | "void main() {" | - | ||||||||||||
17 | " uv = (textureTransform * vec3(textureCoord,1.0)).xy;" | - | ||||||||||||
18 | " gl_Position = vertexTransform * vec4(vertexCoord,1.0);" | - | ||||||||||||
19 | "}"; | - | ||||||||||||
20 | - | |||||||||||||
21 | static const char fragment_shader150[] = | - | ||||||||||||
22 | "#version 150 core\n" | - | ||||||||||||
23 | "in vec2 uv;" | - | ||||||||||||
24 | "out vec4 fragcolor;" | - | ||||||||||||
25 | "uniform sampler2D textureSampler;" | - | ||||||||||||
26 | "uniform bool swizzle;" | - | ||||||||||||
27 | "uniform float opacity;" | - | ||||||||||||
28 | "void main() {" | - | ||||||||||||
29 | " vec4 tmpFragColor = texture(textureSampler, uv);" | - | ||||||||||||
30 | " tmpFragColor.a *= opacity;" | - | ||||||||||||
31 | " fragcolor = swizzle ? tmpFragColor.bgra : tmpFragColor;" | - | ||||||||||||
32 | "}"; | - | ||||||||||||
33 | - | |||||||||||||
34 | static const char vertex_shader[] = | - | ||||||||||||
35 | "attribute highp vec3 vertexCoord;" | - | ||||||||||||
36 | "attribute highp vec2 textureCoord;" | - | ||||||||||||
37 | "varying highp vec2 uv;" | - | ||||||||||||
38 | "uniform highp mat4 vertexTransform;" | - | ||||||||||||
39 | "uniform highp mat3 textureTransform;" | - | ||||||||||||
40 | "void main() {" | - | ||||||||||||
41 | " uv = (textureTransform * vec3(textureCoord,1.0)).xy;" | - | ||||||||||||
42 | " gl_Position = vertexTransform * vec4(vertexCoord,1.0);" | - | ||||||||||||
43 | "}"; | - | ||||||||||||
44 | - | |||||||||||||
45 | static const char fragment_shader[] = | - | ||||||||||||
46 | "varying highp vec2 uv;" | - | ||||||||||||
47 | "uniform sampler2D textureSampler;" | - | ||||||||||||
48 | "uniform bool swizzle;" | - | ||||||||||||
49 | "uniform highp float opacity;" | - | ||||||||||||
50 | "void main() {" | - | ||||||||||||
51 | " highp vec4 tmpFragColor = texture2D(textureSampler,uv);" | - | ||||||||||||
52 | " tmpFragColor.a *= opacity;" | - | ||||||||||||
53 | " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;" | - | ||||||||||||
54 | "}"; | - | ||||||||||||
55 | - | |||||||||||||
56 | static const char fragment_shader_external_oes[] = | - | ||||||||||||
57 | "#extension GL_OES_EGL_image_external : require\n" | - | ||||||||||||
58 | "varying highp vec2 uv;" | - | ||||||||||||
59 | "uniform samplerExternalOES textureSampler;\n" | - | ||||||||||||
60 | "uniform bool swizzle;" | - | ||||||||||||
61 | "uniform highp float opacity;" | - | ||||||||||||
62 | "void main() {" | - | ||||||||||||
63 | " highp vec4 tmpFragColor = texture2D(textureSampler, uv);" | - | ||||||||||||
64 | " tmpFragColor.a *= opacity;" | - | ||||||||||||
65 | " gl_FragColor = swizzle ? tmpFragColor.bgra : tmpFragColor;" | - | ||||||||||||
66 | "}"; | - | ||||||||||||
67 | - | |||||||||||||
68 | static const GLfloat vertex_buffer_data[] = { | - | ||||||||||||
69 | -1,-1, 0, | - | ||||||||||||
70 | -1, 1, 0, | - | ||||||||||||
71 | 1,-1, 0, | - | ||||||||||||
72 | -1, 1, 0, | - | ||||||||||||
73 | 1,-1, 0, | - | ||||||||||||
74 | 1, 1, 0 | - | ||||||||||||
75 | }; | - | ||||||||||||
76 | - | |||||||||||||
77 | static const GLfloat texture_buffer_data[] = { | - | ||||||||||||
78 | 0, 0, | - | ||||||||||||
79 | 0, 1, | - | ||||||||||||
80 | 1, 0, | - | ||||||||||||
81 | 0, 1, | - | ||||||||||||
82 | 1, 0, | - | ||||||||||||
83 | 1, 1 | - | ||||||||||||
84 | }; | - | ||||||||||||
85 | - | |||||||||||||
86 | class TextureBinder | - | ||||||||||||
87 | { | - | ||||||||||||
88 | public: | - | ||||||||||||
89 | TextureBinder(GLenum target, GLuint textureId) : m_target(target) | - | ||||||||||||
90 | { | - | ||||||||||||
91 | QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, textureId); | - | ||||||||||||
92 | } never executed: end of block | 0 | ||||||||||||
93 | ~TextureBinder() | - | ||||||||||||
94 | { | - | ||||||||||||
95 | QOpenGLContext::currentContext()->functions()->glBindTexture(m_target, 0); | - | ||||||||||||
96 | } never executed: end of block | 0 | ||||||||||||
97 | - | |||||||||||||
98 | private: | - | ||||||||||||
99 | GLenum m_target; | - | ||||||||||||
100 | }; | - | ||||||||||||
101 | - | |||||||||||||
102 | class QOpenGLTextureBlitterPrivate | - | ||||||||||||
103 | { | - | ||||||||||||
104 | public: | - | ||||||||||||
105 | enum TextureMatrixUniform { | - | ||||||||||||
106 | User, | - | ||||||||||||
107 | Identity, | - | ||||||||||||
108 | IdentityFlipped | - | ||||||||||||
109 | }; | - | ||||||||||||
110 | - | |||||||||||||
111 | enum ProgramIndex { | - | ||||||||||||
112 | TEXTURE_2D, | - | ||||||||||||
113 | TEXTURE_EXTERNAL_OES | - | ||||||||||||
114 | }; | - | ||||||||||||
115 | - | |||||||||||||
116 | QOpenGLTextureBlitterPrivate() : | - | ||||||||||||
117 | swizzle(false), | - | ||||||||||||
118 | opacity(1.0f), | - | ||||||||||||
119 | vao(new QOpenGLVertexArrayObject), | - | ||||||||||||
120 | currentTarget(TEXTURE_2D) | - | ||||||||||||
121 | { } never executed: end of block | 0 | ||||||||||||
122 | - | |||||||||||||
123 | bool buildProgram(ProgramIndex idx, const char *vs, const char *fs); | - | ||||||||||||
124 | - | |||||||||||||
125 | void blit(GLuint texture, const QMatrix4x4 &vertexTransform, const QMatrix3x3 &textureTransform); | - | ||||||||||||
126 | void blit(GLuint texture, const QMatrix4x4 &vertexTransform, QOpenGLTextureBlitter::Origin origin); | - | ||||||||||||
127 | - | |||||||||||||
128 | void prepareProgram(const QMatrix4x4 &vertexTransform); | - | ||||||||||||
129 | - | |||||||||||||
130 | QOpenGLBuffer vertexBuffer; | - | ||||||||||||
131 | QOpenGLBuffer textureBuffer; | - | ||||||||||||
132 | struct Program { | - | ||||||||||||
133 | Program() : | - | ||||||||||||
134 | vertexCoordAttribPos(0), | - | ||||||||||||
135 | vertexTransformUniformPos(0), | - | ||||||||||||
136 | textureCoordAttribPos(0), | - | ||||||||||||
137 | textureTransformUniformPos(0), | - | ||||||||||||
138 | swizzleUniformPos(0), | - | ||||||||||||
139 | opacityUniformPos(0), | - | ||||||||||||
140 | swizzle(false), | - | ||||||||||||
141 | opacity(0.0f), | - | ||||||||||||
142 | textureMatrixUniformState(User) | - | ||||||||||||
143 | { } never executed: end of block | 0 | ||||||||||||
144 | QScopedPointer<QOpenGLShaderProgram> glProgram; | - | ||||||||||||
145 | GLuint vertexCoordAttribPos; | - | ||||||||||||
146 | GLuint vertexTransformUniformPos; | - | ||||||||||||
147 | GLuint textureCoordAttribPos; | - | ||||||||||||
148 | GLuint textureTransformUniformPos; | - | ||||||||||||
149 | GLuint swizzleUniformPos; | - | ||||||||||||
150 | GLuint opacityUniformPos; | - | ||||||||||||
151 | bool swizzle; | - | ||||||||||||
152 | float opacity; | - | ||||||||||||
153 | TextureMatrixUniform textureMatrixUniformState; | - | ||||||||||||
154 | } programs[2]; | - | ||||||||||||
155 | bool swizzle; | - | ||||||||||||
156 | float opacity; | - | ||||||||||||
157 | QScopedPointer<QOpenGLVertexArrayObject> vao; | - | ||||||||||||
158 | GLenum currentTarget; | - | ||||||||||||
159 | }; | - | ||||||||||||
160 | - | |||||||||||||
161 | static inline QOpenGLTextureBlitterPrivate::ProgramIndex targetToProgramIndex(GLenum target) | - | ||||||||||||
162 | { | - | ||||||||||||
163 | switch (target) { | - | ||||||||||||
164 | case never executed: 0x0DE1:case 0x0DE1: never executed: case 0x0DE1: | 0 | ||||||||||||
165 | return never executed: QOpenGLTextureBlitterPrivate::TEXTURE_2D;return QOpenGLTextureBlitterPrivate::TEXTURE_2D; never executed: return QOpenGLTextureBlitterPrivate::TEXTURE_2D; | 0 | ||||||||||||
166 | case never executed: 0x8D65:case 0x8D65: never executed: case 0x8D65: | 0 | ||||||||||||
167 | return never executed: QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES;return QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES; never executed: return QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES; | 0 | ||||||||||||
168 | default never executed: :default: never executed: default: | 0 | ||||||||||||
169 | QMessageLogger(__FILE__, 214, __PRETTY_FUNCTION__).warning("Unsupported texture target 0x%x", target); | - | ||||||||||||
170 | return never executed: QOpenGLTextureBlitterPrivate::TEXTURE_2D;return QOpenGLTextureBlitterPrivate::TEXTURE_2D; never executed: return QOpenGLTextureBlitterPrivate::TEXTURE_2D; | 0 | ||||||||||||
171 | } | - | ||||||||||||
172 | } | - | ||||||||||||
173 | - | |||||||||||||
174 | void QOpenGLTextureBlitterPrivate::prepareProgram(const QMatrix4x4 &vertexTransform) | - | ||||||||||||
175 | { | - | ||||||||||||
176 | Program *program = &programs[targetToProgramIndex(currentTarget)]; | - | ||||||||||||
177 | - | |||||||||||||
178 | vertexBuffer.bind(); | - | ||||||||||||
179 | program->glProgram->setAttributeBuffer(program->vertexCoordAttribPos, 0x1406, 0, 3, 0); | - | ||||||||||||
180 | program->glProgram->enableAttributeArray(program->vertexCoordAttribPos); | - | ||||||||||||
181 | vertexBuffer.release(); | - | ||||||||||||
182 | - | |||||||||||||
183 | program->glProgram->setUniformValue(program->vertexTransformUniformPos, vertexTransform); | - | ||||||||||||
184 | - | |||||||||||||
185 | textureBuffer.bind(); | - | ||||||||||||
186 | program->glProgram->setAttributeBuffer(program->textureCoordAttribPos, 0x1406, 0, 2, 0); | - | ||||||||||||
187 | program->glProgram->enableAttributeArray(program->textureCoordAttribPos); | - | ||||||||||||
188 | textureBuffer.release(); | - | ||||||||||||
189 | - | |||||||||||||
190 | if (swizzle != program->swizzle
| 0 | ||||||||||||
191 | program->glProgram->setUniformValue(program->swizzleUniformPos, swizzle); | - | ||||||||||||
192 | program->swizzle = swizzle; | - | ||||||||||||
193 | } never executed: end of block | 0 | ||||||||||||
194 | - | |||||||||||||
195 | if (opacity != program->opacity
| 0 | ||||||||||||
196 | program->glProgram->setUniformValue(program->opacityUniformPos, opacity); | - | ||||||||||||
197 | program->opacity = opacity; | - | ||||||||||||
198 | } never executed: end of block | 0 | ||||||||||||
199 | } never executed: end of block | 0 | ||||||||||||
200 | - | |||||||||||||
201 | void QOpenGLTextureBlitterPrivate::blit(GLuint texture, | - | ||||||||||||
202 | const QMatrix4x4 &vertexTransform, | - | ||||||||||||
203 | const QMatrix3x3 &textureTransform) | - | ||||||||||||
204 | { | - | ||||||||||||
205 | TextureBinder binder(currentTarget, texture); | - | ||||||||||||
206 | prepareProgram(vertexTransform); | - | ||||||||||||
207 | - | |||||||||||||
208 | Program *program = &programs[targetToProgramIndex(currentTarget)]; | - | ||||||||||||
209 | program->glProgram->setUniformValue(program->textureTransformUniformPos, textureTransform); | - | ||||||||||||
210 | program->textureMatrixUniformState = User; | - | ||||||||||||
211 | - | |||||||||||||
212 | QOpenGLContext::currentContext()->functions()->glDrawArrays(0x0004, 0, 6); | - | ||||||||||||
213 | } never executed: end of block | 0 | ||||||||||||
214 | - | |||||||||||||
215 | void QOpenGLTextureBlitterPrivate::blit(GLuint texture, | - | ||||||||||||
216 | const QMatrix4x4 &vertexTransform, | - | ||||||||||||
217 | QOpenGLTextureBlitter::Origin origin) | - | ||||||||||||
218 | { | - | ||||||||||||
219 | TextureBinder binder(currentTarget, texture); | - | ||||||||||||
220 | prepareProgram(vertexTransform); | - | ||||||||||||
221 | - | |||||||||||||
222 | Program *program = &programs[targetToProgramIndex(currentTarget)]; | - | ||||||||||||
223 | if (origin == QOpenGLTextureBlitter::OriginTopLeft
| 0 | ||||||||||||
224 | if (program->textureMatrixUniformState != IdentityFlipped
| 0 | ||||||||||||
225 | QMatrix3x3 flipped; | - | ||||||||||||
226 | flipped(1,1) = -1; | - | ||||||||||||
227 | flipped(1,2) = 1; | - | ||||||||||||
228 | program->glProgram->setUniformValue(program->textureTransformUniformPos, flipped); | - | ||||||||||||
229 | program->textureMatrixUniformState = IdentityFlipped; | - | ||||||||||||
230 | } never executed: end of block | 0 | ||||||||||||
231 | } never executed: else if (program->textureMatrixUniformState != Identityend of block
| 0 | ||||||||||||
232 | program->glProgram->setUniformValue(program->textureTransformUniformPos, QMatrix3x3()); | - | ||||||||||||
233 | program->textureMatrixUniformState = Identity; | - | ||||||||||||
234 | } never executed: end of block | 0 | ||||||||||||
235 | - | |||||||||||||
236 | QOpenGLContext::currentContext()->functions()->glDrawArrays(0x0004, 0, 6); | - | ||||||||||||
237 | } never executed: end of block | 0 | ||||||||||||
238 | - | |||||||||||||
239 | bool QOpenGLTextureBlitterPrivate::buildProgram(ProgramIndex idx, const char *vs, const char *fs) | - | ||||||||||||
240 | { | - | ||||||||||||
241 | Program *p = &programs[idx]; | - | ||||||||||||
242 | - | |||||||||||||
243 | p->glProgram.reset(new QOpenGLShaderProgram); | - | ||||||||||||
244 | - | |||||||||||||
245 | p->glProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vs); | - | ||||||||||||
246 | p->glProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fs); | - | ||||||||||||
247 | p->glProgram->link(); | - | ||||||||||||
248 | if (!p->glProgram->isLinked()
| 0 | ||||||||||||
249 | QMessageLogger(__FILE__, 294, __PRETTY_FUNCTION__).warning() << "Could not link shader program:\n" << p->glProgram->log(); | - | ||||||||||||
250 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
251 | } | - | ||||||||||||
252 | - | |||||||||||||
253 | p->glProgram->bind(); | - | ||||||||||||
254 | - | |||||||||||||
255 | p->vertexCoordAttribPos = p->glProgram->attributeLocation("vertexCoord"); | - | ||||||||||||
256 | p->vertexTransformUniformPos = p->glProgram->uniformLocation("vertexTransform"); | - | ||||||||||||
257 | p->textureCoordAttribPos = p->glProgram->attributeLocation("textureCoord"); | - | ||||||||||||
258 | p->textureTransformUniformPos = p->glProgram->uniformLocation("textureTransform"); | - | ||||||||||||
259 | p->swizzleUniformPos = p->glProgram->uniformLocation("swizzle"); | - | ||||||||||||
260 | p->opacityUniformPos = p->glProgram->uniformLocation("opacity"); | - | ||||||||||||
261 | - | |||||||||||||
262 | p->glProgram->setUniformValue(p->swizzleUniformPos, false); | - | ||||||||||||
263 | - | |||||||||||||
264 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||
265 | } | - | ||||||||||||
266 | - | |||||||||||||
267 | QOpenGLTextureBlitter::QOpenGLTextureBlitter() | - | ||||||||||||
268 | : d_ptr(new QOpenGLTextureBlitterPrivate) | - | ||||||||||||
269 | { | - | ||||||||||||
270 | } never executed: end of block | 0 | ||||||||||||
271 | - | |||||||||||||
272 | QOpenGLTextureBlitter::~QOpenGLTextureBlitter() | - | ||||||||||||
273 | { | - | ||||||||||||
274 | destroy(); | - | ||||||||||||
275 | } never executed: end of block | 0 | ||||||||||||
276 | - | |||||||||||||
277 | bool QOpenGLTextureBlitter::create() | - | ||||||||||||
278 | { | - | ||||||||||||
279 | QOpenGLContext *currentContext = QOpenGLContext::currentContext(); | - | ||||||||||||
280 | if (!currentContext
| 0 | ||||||||||||
281 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
282 | - | |||||||||||||
283 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
284 | - | |||||||||||||
285 | if (d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram
| 0 | ||||||||||||
286 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||
287 | - | |||||||||||||
288 | QSurfaceFormat format = currentContext->format(); | - | ||||||||||||
289 | if (format.profile() == QSurfaceFormat::CoreProfile
| 0 | ||||||||||||
290 | if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader150, fragment_shader150)
| 0 | ||||||||||||
291 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
292 | } never executed: else {end of block | 0 | ||||||||||||
293 | if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_2D, vertex_shader, fragment_shader)
| 0 | ||||||||||||
294 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
295 | if (supportsExternalOESTarget()
| 0 | ||||||||||||
296 | if (!d->buildProgram(QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES, vertex_shader, fragment_shader_external_oes)
| 0 | ||||||||||||
297 | return never executed: false;return false; never executed: return false; | 0 | ||||||||||||
298 | } never executed: end of block | 0 | ||||||||||||
299 | - | |||||||||||||
300 | - | |||||||||||||
301 | QOpenGLVertexArrayObject::Binder vaoBinder(d->vao.data()); | - | ||||||||||||
302 | - | |||||||||||||
303 | d->vertexBuffer.create(); | - | ||||||||||||
304 | d->vertexBuffer.bind(); | - | ||||||||||||
305 | d->vertexBuffer.allocate(vertex_buffer_data, sizeof(vertex_buffer_data)); | - | ||||||||||||
306 | d->vertexBuffer.release(); | - | ||||||||||||
307 | - | |||||||||||||
308 | d->textureBuffer.create(); | - | ||||||||||||
309 | d->textureBuffer.bind(); | - | ||||||||||||
310 | d->textureBuffer.allocate(texture_buffer_data, sizeof(texture_buffer_data)); | - | ||||||||||||
311 | d->textureBuffer.release(); | - | ||||||||||||
312 | - | |||||||||||||
313 | return never executed: true;return true; never executed: return true; | 0 | ||||||||||||
314 | } | - | ||||||||||||
315 | - | |||||||||||||
316 | bool QOpenGLTextureBlitter::isCreated() const | - | ||||||||||||
317 | { | - | ||||||||||||
318 | const QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
319 | return never executed: d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram;return d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram; never executed: return d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram; | 0 | ||||||||||||
320 | } | - | ||||||||||||
321 | - | |||||||||||||
322 | void QOpenGLTextureBlitter::destroy() | - | ||||||||||||
323 | { | - | ||||||||||||
324 | if (!isCreated()
| 0 | ||||||||||||
325 | return; never executed: return; | 0 | ||||||||||||
326 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
327 | d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_2D].glProgram.reset(); | - | ||||||||||||
328 | d->programs[QOpenGLTextureBlitterPrivate::TEXTURE_EXTERNAL_OES].glProgram.reset(); | - | ||||||||||||
329 | d->vertexBuffer.destroy(); | - | ||||||||||||
330 | d->textureBuffer.destroy(); | - | ||||||||||||
331 | d->vao.reset(); | - | ||||||||||||
332 | } never executed: end of block | 0 | ||||||||||||
333 | - | |||||||||||||
334 | bool QOpenGLTextureBlitter::supportsExternalOESTarget() const | - | ||||||||||||
335 | { | - | ||||||||||||
336 | QOpenGLContext *ctx = QOpenGLContext::currentContext(); | - | ||||||||||||
337 | return never executed: ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external");return ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external"); never executed: return ctx && ctx->isOpenGLES() && ctx->hasExtension("GL_OES_EGL_image_external"); | 0 | ||||||||||||
338 | } | - | ||||||||||||
339 | - | |||||||||||||
340 | void QOpenGLTextureBlitter::bind(GLenum target) | - | ||||||||||||
341 | { | - | ||||||||||||
342 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
343 | - | |||||||||||||
344 | if (d->vao->isCreated()
| 0 | ||||||||||||
345 | d->vao->bind(); never executed: d->vao->bind(); | 0 | ||||||||||||
346 | - | |||||||||||||
347 | d->currentTarget = target; | - | ||||||||||||
348 | QOpenGLTextureBlitterPrivate::Program *p = &d->programs[targetToProgramIndex(target)]; | - | ||||||||||||
349 | p->glProgram->bind(); | - | ||||||||||||
350 | - | |||||||||||||
351 | d->vertexBuffer.bind(); | - | ||||||||||||
352 | p->glProgram->setAttributeBuffer(p->vertexCoordAttribPos, 0x1406, 0, 3, 0); | - | ||||||||||||
353 | p->glProgram->enableAttributeArray(p->vertexCoordAttribPos); | - | ||||||||||||
354 | d->vertexBuffer.release(); | - | ||||||||||||
355 | - | |||||||||||||
356 | d->textureBuffer.bind(); | - | ||||||||||||
357 | p->glProgram->setAttributeBuffer(p->textureCoordAttribPos, 0x1406, 0, 2, 0); | - | ||||||||||||
358 | p->glProgram->enableAttributeArray(p->textureCoordAttribPos); | - | ||||||||||||
359 | d->textureBuffer.release(); | - | ||||||||||||
360 | } never executed: end of block | 0 | ||||||||||||
361 | - | |||||||||||||
362 | void QOpenGLTextureBlitter::release() | - | ||||||||||||
363 | { | - | ||||||||||||
364 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
365 | d->programs[targetToProgramIndex(d->currentTarget)].glProgram->release(); | - | ||||||||||||
366 | if (d->vao->isCreated()
| 0 | ||||||||||||
367 | d->vao->release(); never executed: d->vao->release(); | 0 | ||||||||||||
368 | } never executed: end of block | 0 | ||||||||||||
369 | - | |||||||||||||
370 | void QOpenGLTextureBlitter::setSwizzleRB(bool swizzle) | - | ||||||||||||
371 | { | - | ||||||||||||
372 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
373 | d->swizzle = swizzle; | - | ||||||||||||
374 | } never executed: end of block | 0 | ||||||||||||
375 | - | |||||||||||||
376 | void QOpenGLTextureBlitter::setOpacity(float opacity) | - | ||||||||||||
377 | { | - | ||||||||||||
378 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
379 | d->opacity = opacity; | - | ||||||||||||
380 | } never executed: end of block | 0 | ||||||||||||
381 | - | |||||||||||||
382 | void QOpenGLTextureBlitter::blit(GLuint texture, | - | ||||||||||||
383 | const QMatrix4x4 &targetTransform, | - | ||||||||||||
384 | Origin sourceOrigin) | - | ||||||||||||
385 | { | - | ||||||||||||
386 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
387 | d->blit(texture,targetTransform, sourceOrigin); | - | ||||||||||||
388 | } never executed: end of block | 0 | ||||||||||||
389 | - | |||||||||||||
390 | void QOpenGLTextureBlitter::blit(GLuint texture, | - | ||||||||||||
391 | const QMatrix4x4 &targetTransform, | - | ||||||||||||
392 | const QMatrix3x3 &sourceTransform) | - | ||||||||||||
393 | { | - | ||||||||||||
394 | QOpenGLTextureBlitterPrivate * const d = d_func(); | - | ||||||||||||
395 | d->blit(texture, targetTransform, sourceTransform); | - | ||||||||||||
396 | } never executed: end of block | 0 | ||||||||||||
397 | - | |||||||||||||
398 | QMatrix4x4 QOpenGLTextureBlitter::targetTransform(const QRectF &target, | - | ||||||||||||
399 | const QRect &viewport) | - | ||||||||||||
400 | { | - | ||||||||||||
401 | qreal x_scale = target.width() / viewport.width(); | - | ||||||||||||
402 | qreal y_scale = target.height() / viewport.height(); | - | ||||||||||||
403 | - | |||||||||||||
404 | const QPointF relative_to_viewport = target.topLeft() - viewport.topLeft(); | - | ||||||||||||
405 | qreal x_translate = x_scale - 1 + ((relative_to_viewport.x() / viewport.width()) * 2); | - | ||||||||||||
406 | qreal y_translate = -y_scale + 1 - ((relative_to_viewport.y() / viewport.height()) * 2); | - | ||||||||||||
407 | - | |||||||||||||
408 | QMatrix4x4 matrix; | - | ||||||||||||
409 | matrix(0,3) = x_translate; | - | ||||||||||||
410 | matrix(1,3) = y_translate; | - | ||||||||||||
411 | - | |||||||||||||
412 | matrix(0,0) = x_scale; | - | ||||||||||||
413 | matrix(1,1) = y_scale; | - | ||||||||||||
414 | - | |||||||||||||
415 | return never executed: matrix;return matrix; never executed: return matrix; | 0 | ||||||||||||
416 | } | - | ||||||||||||
417 | - | |||||||||||||
418 | QMatrix3x3 QOpenGLTextureBlitter::sourceTransform(const QRectF &subTexture, | - | ||||||||||||
419 | const QSize &textureSize, | - | ||||||||||||
420 | Origin origin) | - | ||||||||||||
421 | { | - | ||||||||||||
422 | qreal x_scale = subTexture.width() / textureSize.width(); | - | ||||||||||||
423 | qreal y_scale = subTexture.height() / textureSize.height(); | - | ||||||||||||
424 | - | |||||||||||||
425 | const QPointF topLeft = subTexture.topLeft(); | - | ||||||||||||
426 | qreal x_translate = topLeft.x() / textureSize.width(); | - | ||||||||||||
427 | qreal y_translate = topLeft.y() / textureSize.height(); | - | ||||||||||||
428 | - | |||||||||||||
429 | if (origin == OriginTopLeft
| 0 | ||||||||||||
430 | y_scale = -y_scale; | - | ||||||||||||
431 | y_translate = 1 - y_translate; | - | ||||||||||||
432 | } never executed: end of block | 0 | ||||||||||||
433 | - | |||||||||||||
434 | QMatrix3x3 matrix; | - | ||||||||||||
435 | matrix(0,2) = x_translate; | - | ||||||||||||
436 | matrix(1,2) = y_translate; | - | ||||||||||||
437 | - | |||||||||||||
438 | matrix(0,0) = x_scale; | - | ||||||||||||
439 | matrix(1,1) = y_scale; | - | ||||||||||||
440 | - | |||||||||||||
441 | return never executed: matrix;return matrix; never executed: return matrix; | 0 | ||||||||||||
442 | } | - | ||||||||||||
443 | - | |||||||||||||
444 | - | |||||||||||||
Switch to Source code | Preprocessed file |