From 8a3f912f7cbe6d019f847ed1eb67efb1a29a5851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Mon, 31 Aug 2009 14:52:38 +0200 Subject: 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 --- src/opengl/qglpixmapfilter.cpp | 53 ++++++++++++++++++++---------------------- 1 file 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(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(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; } -- cgit v0.12