Unity 8
BackgroundBlur.qml
1 /*
2  * Copyright (C) 2016 Canonical, Ltd.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 3.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 import QtQuick 2.4
18 import Ubuntu.Components 1.3
19 import QtGraphicalEffects 1.0
20 
21 Item {
22  id: root
23 
24  property int blurAmount: 32
25  property Item sourceItem
26  property rect blurRect: Qt.rect(0,0,0,0)
27  property alias cached: fastBlur.cached
28 
29  Rectangle {
30  id: blurMask
31  color: "yellow"
32  x: blurRect.x
33  y: blurRect.y
34  width: blurRect.width
35  height: blurRect.height
36  }
37 
38  ShaderEffect {
39  id: maskedBlurEffect
40  x: blurRect.x
41  y: blurRect.y
42  width: blurRect.width
43  height: blurRect.height
44 
45  property variant source: ShaderEffectSource {
46  id: shaderEffectSource
47  sourceItem: root.sourceItem
48  hideSource: false
49  sourceRect: root.blurRect
50  }
51 
52  property var mask: ShaderEffectSource {
53  sourceItem: blurMask
54  hideSource: true
55  }
56 
57  fragmentShader: "
58  varying highp vec2 qt_TexCoord0;
59  uniform sampler2D source;
60  uniform sampler2D mask;
61  void main(void)
62  {
63  highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
64  highp vec4 maskColor = texture2D(mask, qt_TexCoord0);
65 
66  sourceColor *= maskColor.a;
67 
68  gl_FragColor = sourceColor;
69  }"
70  }
71 
72  FastBlur {
73  id: fastBlur
74  x: blurRect.x
75  y: blurRect.y
76  width: blurRect.width
77  height: blurRect.height
78  source: maskedBlurEffect
79  radius: Math.min(blurAmount, 128)
80  }
81  }