diff options
author | Samuel Rødal <sroedal@trolltech.com> | 2009-08-31 12:52:38 (GMT) |
---|---|---|
committer | Samuel Rødal <sroedal@trolltech.com> | 2009-08-31 13:19:39 (GMT) |
commit | 8a3f912f7cbe6d019f847ed1eb67efb1a29a5851 (patch) | |
tree | 28bc6687d03ccea035c468ae16dc05e820f93fd1 /src/opengl | |
parent | f776327408d828a2556e8f9a35df5fe3c2976ef6 (diff) | |
download | Qt-8a3f912f7cbe6d019f847ed1eb67efb1a29a5851.zip Qt-8a3f912f7cbe6d019f847ed1eb67efb1a29a5851.tar.gz Qt-8a3f912f7cbe6d019f847ed1eb67efb1a29a5851.tar.bz2 |
Fixed rendering bug in blurpicker example with -graphicssystem opengl
Made the GL blur filter code slightly less hacky by not reusing the same
paint engine for rendering both to the offscreen FBO and to the actual
target device. This should make the code less reliant on paint engine
implementation details and thus more robust with regards to changes in
the paint engine.
Task-number: 260402
Reviewed-by: Trond
Diffstat (limited to 'src/opengl')
-rw-r--r-- | src/opengl/qglpixmapfilter.cpp | 53 |
1 files changed, 25 insertions, 28 deletions
diff --git a/src/opengl/qglpixmapfilter.cpp b/src/opengl/qglpixmapfilter.cpp index 808038b..c51ccc7 100644 --- a/src/opengl/qglpixmapfilter.cpp +++ b/src/opengl/qglpixmapfilter.cpp @@ -119,6 +119,8 @@ private: mutable QSize m_textureSize; + mutable bool m_horizontalBlur; + QGLShaderProgram *m_program; }; @@ -336,46 +338,37 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); - QGL2PaintEngineEx *engine = static_cast<QGL2PaintEngineEx *>(painter->paintEngine()); - - painter->save(); - - // ensure GL_LINEAR filtering is used - painter->setRenderHint(QPainter::SmoothPixmapTransform); - // prepare for updateUniforms m_textureSize = src.size(); - // first pass, to fbo - fbo->bind(); + // horizontal pass, to pixmap + m_horizontalBlur = true; + + QPainter fboPainter(fbo); + if (src.hasAlphaChannel()) { glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); } - filter->setOnPainter(painter); - - QTransform transform = engine->state()->matrix; - if (!transform.isIdentity()) { - engine->state()->matrix = QTransform(); - engine->transformChanged(); - } - - engine->drawPixmap(src.rect().translated(0, painter->device()->height() - fbo->height()), - src, src.rect()); + // ensure GL_LINEAR filtering is used + fboPainter.setRenderHint(QPainter::SmoothPixmapTransform); + filter->setOnPainter(&fboPainter); + fboPainter.drawPixmap(0, 0, src); + filter->removeFromPainter(&fboPainter); + fboPainter.end(); - if (!transform.isIdentity()) { - engine->state()->matrix = transform; - engine->transformChanged(); - } + QGL2PaintEngineEx *engine = static_cast<QGL2PaintEngineEx *>(painter->paintEngine()); - fbo->release(); + // vertical pass, to painter + m_horizontalBlur = false; - // second pass, to widget - m_program->setUniformValue("delta", 0.0, 1.0); + painter->save(); + // ensure GL_LINEAR filtering is used + painter->setRenderHint(QPainter::SmoothPixmapTransform); + filter->setOnPainter(painter); engine->drawTexture(src.rect().translated(pos.x(), pos.y()), fbo->texture(), fbo->size(), src.rect().translated(0, fbo->height() - src.height())); filter->removeFromPainter(painter); - painter->restore(); qgl_fbo_pool()->release(fbo); @@ -386,7 +379,11 @@ bool QGLPixmapBlurFilter::processGL(QPainter *painter, const QPointF &pos, const void QGLPixmapBlurFilter::setUniforms(QGLShaderProgram *program) { program->setUniformValue("invTextureSize", 1.0 / m_textureSize.width(), 1.0 / m_textureSize.height()); - program->setUniformValue("delta", 1.0, 0.0); + + if (m_horizontalBlur) + program->setUniformValue("delta", 1.0, 0.0); + else + program->setUniformValue("delta", 0.0, 1.0); m_program = program; } |