Warning, /sdk/licensedigger/autotests/testdata_conversionexamples/blur.h.origfile is written in an unsupported language. File is not indexed.

0001 /*
0002  *   Copyright © 2010 Fredrik Höglund <fredrik@kde.org>
0003  *
0004  *   This program is free software; you can redistribute it and/or modify
0005  *   it under the terms of the GNU General Public License as published by
0006  *   the Free Software Foundation; either version 2 of the License, or
0007  *   (at your option) any later version.
0008  *
0009  *   This program is distributed in the hope that it will be useful,
0010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
0011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012  *   General Public License for more details.
0013  *
0014  *   You should have received a copy of the GNU General Public License
0015  *   along with this program; see the file COPYING.  if not, write to
0016  *   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017  *   Boston, MA 02110-1301, USA.
0018  */
0019 
0020 #ifndef BLUR_H
0021 #define BLUR_H
0022 
0023 #include <kwineffects.h>
0024 #include <kwinglplatform.h>
0025 #include <kwinglutils.h>
0026 
0027 #include <QVector>
0028 #include <QVector2D>
0029 
0030 namespace KWin
0031 {
0032 
0033 class BlurShader;
0034 
0035 class BlurEffect : public KWin::Effect
0036 {
0037     Q_OBJECT
0038     Q_PROPERTY(int blurRadius READ blurRadius)
0039     Q_PROPERTY(bool cacheTexture READ isCacheTexture)
0040 public:
0041     BlurEffect();
0042     ~BlurEffect();
0043 
0044     static bool supported();
0045     static bool enabledByDefault();
0046 
0047     void reconfigure(ReconfigureFlags flags);
0048     void prePaintScreen(ScreenPrePaintData &data, int time);
0049     void prePaintWindow(EffectWindow* w, WindowPrePaintData& data, int time);
0050     void drawWindow(EffectWindow *w, int mask, QRegion region, WindowPaintData &data);
0051     void paintEffectFrame(EffectFrame *frame, QRegion region, double opacity, double frameOpacity);
0052 
0053     // for dynamic setting extraction
0054     int blurRadius() const;
0055     bool isCacheTexture() const {
0056         return m_shouldCache;
0057     }
0058     virtual bool provides(Feature feature);
0059 
0060     int requestedEffectChainPosition() const override {
0061         return 75;
0062     }
0063 
0064 public Q_SLOTS:
0065     void slotWindowAdded(KWin::EffectWindow *w);
0066     void slotWindowDeleted(KWin::EffectWindow *w);
0067     void slotPropertyNotify(KWin::EffectWindow *w, long atom);
0068     void slotScreenGeometryChanged();
0069 
0070 private:
0071     QRect expand(const QRect &rect) const;
0072     QRegion expand(const QRegion &region) const;
0073     QRegion blurRegion(const EffectWindow *w) const;
0074     bool shouldBlur(const EffectWindow *w, int mask, const WindowPaintData &data) const;
0075     void updateBlurRegion(EffectWindow *w) const;
0076     void doBlur(const QRegion &shape, const QRect &screen, const float opacity);
0077     void doCachedBlur(EffectWindow *w, const QRegion& region, const float opacity);
0078     void uploadRegion(QVector2D *&map, const QRegion &region);
0079     void uploadGeometry(GLVertexBuffer *vbo, const QRegion &horizontal, const QRegion &vertical);
0080 
0081 private:
0082     BlurShader *shader;
0083     GLRenderTarget *target;
0084     GLTexture tex;
0085     long net_wm_blur_region;
0086     QRegion m_damagedArea; // keeps track of the area which has been damaged (from bottom to top)
0087     QRegion m_paintedArea; // actually painted area which is greater than m_damagedArea
0088     QRegion m_currentBlur; // keeps track of the currently blured area of non-caching windows(from bottom to top)
0089     bool m_shouldCache;
0090 
0091     struct BlurWindowInfo {
0092         GLTexture blurredBackground; // keeps the horizontally blurred background
0093         QRegion damagedRegion;
0094         QPoint windowPos;
0095         bool dropCache;
0096     };
0097 
0098     QHash< const EffectWindow*, BlurWindowInfo > windows;
0099     typedef QHash<const EffectWindow*, BlurWindowInfo>::iterator CacheEntry;
0100 };
0101 
0102 inline
0103 bool BlurEffect::provides(Effect::Feature feature)
0104 {
0105     if (feature == Blur) {
0106         return true;
0107     }
0108     return KWin::Effect::provides(feature);
0109 }
0110 
0111 
0112 } // namespace KWin
0113 
0114 #endif
0115