summaryrefslogtreecommitdiffstats
path: root/src/opengl
diff options
context:
space:
mode:
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;
}