kwin/effects/blur.h
Rivo Laks 213833fc7f Finally make the bloody blur effect work properly.
This fixes the artefacts appearing when only part of the screen is updated.
This version also brings ton of optimizations which might well increase performance
  2 or 3 times on slower cards:
- Windows are not drawn twice anymore. Now they're drawn only to render target and
  later changed parts of the render target are copied back onto screen.
- Shaders have been optimized. Some calculations moved from pixel shader to vertex shader.
- For ARGB windows, if window's opacity is 0 then it will stay transparent instead of being
  replaced by blurred background.
- Blur effect should now play nicer with other effects, e.g. shadows.

svn path=/trunk/KDE/kdebase/workspace/; revision=748502
2007-12-14 16:57:38 +00:00

86 lines
2.3 KiB
C++

/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2007 Rivo Laks <rivolaks@hot.ee>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_BLUR_H
#define KWIN_BLUR_H
// Include with base class for effects.
#include <kwineffects.h>
#include <QRegion>
template< class T > class QVector;
namespace KWin
{
class GLRenderTarget;
class GLTexture;
class GLShader;
/**
* Blurs the background of translucent windows
**/
class BlurEffect : public Effect
{
public:
BlurEffect();
~BlurEffect();
virtual void prePaintScreen( ScreenPrePaintData& data, int time );
virtual void paintScreen( int mask, QRegion region, ScreenPaintData& data );
virtual void prePaintWindow( EffectWindow* w, WindowPrePaintData& data, int time );
virtual void drawWindow( EffectWindow* w, int mask, QRegion region, WindowPaintData& data );
static bool supported();
protected:
bool loadData();
GLShader* loadShader(const QString& name);
void updateBlurTexture(const QVector<QRect>& rects);
void updateBlurTexture(const QRegion& region);
QRegion expandedRegion( const QRegion& r ) const;
private:
GLTexture* mSceneTexture;
GLTexture* mTmpTexture;
GLTexture* mBlurTexture;
GLRenderTarget* mSceneTarget;
GLRenderTarget* mTmpTarget;
GLRenderTarget* mBlurTarget;
GLShader* mBlurShader;
GLShader* mWindowShader;
bool mValid;
int mBlurRadius;
int mTransparentWindows;
QRegion mBlurDirty;
QRegion mScreenDirty;
QRegion mBlurMask;
};
} // namespace
#endif