Make sure that both the render target and the shader are valid
before using them. svn path=/trunk/KDE/kdebase/workspace/; revision=1102465
This commit is contained in:
parent
7e68fc7c44
commit
c82351488e
3 changed files with 27 additions and 7 deletions
|
@ -162,12 +162,13 @@ void BlurEffect::drawWindow(EffectWindow *w, int mask, QRegion region, WindowPai
|
|||
bool translated = data.xTranslate || data.yTranslate;
|
||||
bool transformed = scaled || translated;
|
||||
bool hasAlpha = w->hasAlpha() || (w->hasDecoration() && effects->decorationsHaveAlpha());
|
||||
bool valid = target->valid() && shader->isValid();
|
||||
|
||||
QRegion shape;
|
||||
if (!effects->activeFullScreenEffect() && hasAlpha && !w->isDesktop() && !transformed)
|
||||
shape = blurRegion(w).translated(w->geometry().topLeft()) & screen;
|
||||
|
||||
if (!shape.isEmpty() && region.intersects(shape.boundingRect()))
|
||||
if (valid && !shape.isEmpty() && region.intersects(shape.boundingRect()))
|
||||
{
|
||||
const QRect r = expand(shape.boundingRect()) & screen;
|
||||
const QPoint offset = -shape.boundingRect().topLeft() +
|
||||
|
|
|
@ -29,7 +29,7 @@ using namespace KWin;
|
|||
|
||||
|
||||
BlurShader::BlurShader()
|
||||
: mRadius(12)
|
||||
: mRadius(0), mValid(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,7 @@ void BlurShader::setRadius(int radius)
|
|||
if (mRadius != r) {
|
||||
mRadius = r;
|
||||
reset();
|
||||
init();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -117,10 +118,15 @@ void GLSLBlurShader::reset()
|
|||
glDeleteProgram(program);
|
||||
program = 0;
|
||||
}
|
||||
|
||||
setIsValid(false);
|
||||
}
|
||||
|
||||
void GLSLBlurShader::setPixelDistance(float val)
|
||||
{
|
||||
if (!isValid())
|
||||
return;
|
||||
|
||||
float pixelSize[2] = { 0.0, 0.0 };
|
||||
|
||||
if (direction() == Qt::Horizontal)
|
||||
|
@ -133,14 +139,17 @@ void GLSLBlurShader::setPixelDistance(float val)
|
|||
|
||||
void GLSLBlurShader::setOpacity(float val)
|
||||
{
|
||||
if (!isValid())
|
||||
return;
|
||||
|
||||
const float opacity[4] = { val, val, val, val };
|
||||
glUniform4fv(uOpacity, 1, opacity);
|
||||
}
|
||||
|
||||
void GLSLBlurShader::bind()
|
||||
{
|
||||
if (!program)
|
||||
init();
|
||||
if (!isValid())
|
||||
return;
|
||||
|
||||
glUseProgram(program);
|
||||
glUniform1i(uTexUnit, 0);
|
||||
|
@ -284,6 +293,8 @@ void GLSLBlurShader::init()
|
|||
uPixelSize = glGetUniformLocation(program, "pixelSize");
|
||||
uOpacity = glGetUniformLocation(program, "opacity");
|
||||
}
|
||||
|
||||
setIsValid(program != 0);
|
||||
}
|
||||
|
||||
|
||||
|
@ -308,6 +319,8 @@ void ARBBlurShader::reset()
|
|||
glDeleteProgramsARB(1, &program);
|
||||
program = 0;
|
||||
}
|
||||
|
||||
setIsValid(false);
|
||||
}
|
||||
|
||||
void ARBBlurShader::setPixelDistance(float val)
|
||||
|
@ -331,8 +344,8 @@ void ARBBlurShader::setOpacity(float val)
|
|||
|
||||
void ARBBlurShader::bind()
|
||||
{
|
||||
if (!program)
|
||||
init();
|
||||
if (!isValid())
|
||||
return;
|
||||
|
||||
glEnable(GL_FRAGMENT_PROGRAM_ARB);
|
||||
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program);
|
||||
|
@ -413,7 +426,9 @@ void ARBBlurShader::init()
|
|||
if (glGetError()) {
|
||||
const char *error = (const char*)glGetString(GL_PROGRAM_ERROR_STRING_ARB);
|
||||
kError() << "Failed to compile fragment program:" << error;
|
||||
}
|
||||
setIsValid(false);
|
||||
} else
|
||||
setIsValid(true);
|
||||
|
||||
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
|
||||
}
|
||||
|
|
|
@ -33,6 +33,8 @@ public:
|
|||
|
||||
static BlurShader *create();
|
||||
|
||||
bool isValid() const { return mValid; }
|
||||
|
||||
// Sets the radius in pixels
|
||||
void setRadius(int radius);
|
||||
int radius() const { return mRadius; }
|
||||
|
@ -53,6 +55,7 @@ public:
|
|||
protected:
|
||||
float gaussian(float x, float sigma) const;
|
||||
QVector<float> gaussianKernel() const;
|
||||
void setIsValid(bool value) { mValid = value; }
|
||||
virtual void init() = 0;
|
||||
virtual void reset() = 0;
|
||||
virtual int maxKernelSize() const = 0;
|
||||
|
@ -60,6 +63,7 @@ protected:
|
|||
private:
|
||||
int mRadius;
|
||||
Qt::Orientation mDirection;
|
||||
bool mValid;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue