summaryrefslogtreecommitdiffstats
path: root/src/opengl
diff options
context:
space:
mode:
authorSamuel Rødal <sroedal@trolltech.com>2009-08-31 12:52:38 (GMT)
committerSamuel Rødal <sroedal@trolltech.com>2009-08-31 13:19:39 (GMT)
commit8a3f912f7cbe6d019f847ed1eb67efb1a29a5851 (patch)
tree28bc6687d03ccea035c468ae16dc05e820f93fd1 /src/opengl
parentf776327408d828a2556e8f9a35df5fe3c2976ef6 (diff)
downloadQt-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.cpp53
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;
}