aboutsummaryrefslogtreecommitdiffstats
path: root/src/effects/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/shaders')
-rw-r--r--src/effects/shaders/+glslcore/brightnesscontrast.frag17
-rw-r--r--src/effects/shaders/+glslcore/colorize.frag60
-rw-r--r--src/effects/shaders/+glslcore/coloroverlay.frag10
-rw-r--r--src/effects/shaders/+glslcore/conicalgradient_mask.frag16
-rw-r--r--src/effects/shaders/+glslcore/conicalgradient_nomask.frag14
-rw-r--r--src/effects/shaders/+glslcore/desaturate.frag11
-rw-r--r--src/effects/shaders/+glslcore/displace.frag29
-rw-r--r--src/effects/shaders/+glslcore/fastblur.frag23
-rw-r--r--src/effects/shaders/+glslcore/fastblur_internal.frag16
-rw-r--r--src/effects/shaders/+glslcore/fastblur_internal.vert18
-rw-r--r--src/effects/shaders/+glslcore/fastglow.frag30
-rw-r--r--src/effects/shaders/+glslcore/fastinnershadow.frag32
-rw-r--r--src/effects/shaders/+glslcore/fastinnershadow_level0.frag15
-rw-r--r--src/effects/shaders/+glslcore/fastmaskedblur.frag53
-rw-r--r--src/effects/shaders/+glslcore/gammaadjust.frag13
-rw-r--r--src/effects/shaders/+glslcore/gaussianinnershadow.frag19
-rw-r--r--src/effects/shaders/+glslcore/gaussianinnershadow_shadow.frag15
-rw-r--r--src/effects/shaders/+glslcore/huesaturation.frag79
-rw-r--r--src/effects/shaders/+glslcore/leveladjust.frag37
-rw-r--r--src/effects/shaders/+glslcore/lineargradient.vert22
-rw-r--r--src/effects/shaders/+glslcore/lineargradient_mask.frag13
-rw-r--r--src/effects/shaders/+glslcore/lineargradient_nomask.frag9
-rw-r--r--src/effects/shaders/+glslcore/opacitymask.frag9
-rw-r--r--src/effects/shaders/+glslcore/opacitymask_invert.frag9
-rw-r--r--src/effects/shaders/+glslcore/radialgradient.vert31
-rw-r--r--src/effects/shaders/+glslcore/radialgradient_mask.frag14
-rw-r--r--src/effects/shaders/+glslcore/radialgradient_nomask.frag11
-rw-r--r--src/effects/shaders/+glslcore/rectangularglow.frag21
-rw-r--r--src/effects/shaders/+glslcore/recursiveblur.frag9
-rw-r--r--src/effects/shaders/+glslcore/recursiveblur.vert15
-rw-r--r--src/effects/shaders/+glslcore/thresholdmask.frag14
-rw-r--r--src/effects/shaders/brightnesscontrast.frag14
-rw-r--r--src/effects/shaders/colorize.frag58
-rw-r--r--src/effects/shaders/coloroverlay.frag8
-rw-r--r--src/effects/shaders/conicalgradient_mask.frag14
-rw-r--r--src/effects/shaders/conicalgradient_nomask.frag12
-rw-r--r--src/effects/shaders/desaturate.frag9
-rw-r--r--src/effects/shaders/displace.frag27
-rw-r--r--src/effects/shaders/fastblur.frag21
-rw-r--r--src/effects/shaders/fastblur_internal.frag14
-rw-r--r--src/effects/shaders/fastblur_internal.vert17
-rw-r--r--src/effects/shaders/fastglow.frag28
-rw-r--r--src/effects/shaders/fastinnershadow.frag30
-rw-r--r--src/effects/shaders/fastinnershadow_level0.frag13
-rw-r--r--src/effects/shaders/fastmaskedblur.frag51
-rw-r--r--src/effects/shaders/gammaadjust.frag10
-rw-r--r--src/effects/shaders/gaussianinnershadow.frag17
-rw-r--r--src/effects/shaders/gaussianinnershadow_shadow.frag13
-rw-r--r--src/effects/shaders/huesaturation.frag77
-rw-r--r--src/effects/shaders/leveladjust.frag35
-rw-r--r--src/effects/shaders/lineargradient.vert21
-rw-r--r--src/effects/shaders/lineargradient_mask.frag11
-rw-r--r--src/effects/shaders/lineargradient_nomask.frag7
-rw-r--r--src/effects/shaders/opacitymask.frag7
-rw-r--r--src/effects/shaders/opacitymask_invert.frag7
-rw-r--r--src/effects/shaders/radialgradient.vert30
-rw-r--r--src/effects/shaders/radialgradient_mask.frag12
-rw-r--r--src/effects/shaders/radialgradient_nomask.frag10
-rw-r--r--src/effects/shaders/rectangularglow.frag19
-rw-r--r--src/effects/shaders/recursiveblur.frag6
-rw-r--r--src/effects/shaders/recursiveblur.vert14
-rw-r--r--src/effects/shaders/thresholdmask.frag11
62 files changed, 1307 insertions, 0 deletions
diff --git a/src/effects/shaders/+glslcore/brightnesscontrast.frag b/src/effects/shaders/+glslcore/brightnesscontrast.frag
new file mode 100644
index 0000000..414e268
--- /dev/null
+++ b/src/effects/shaders/+glslcore/brightnesscontrast.frag
@@ -0,0 +1,17 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform float brightness;
+uniform float contrast;
+out vec4 fragColor;
+
+void main() {
+ vec4 pixelColor = texture(source, qt_TexCoord0);
+ pixelColor.rgb /= max(1.0/256.0, pixelColor.a);
+ float c = 1.0 + contrast;
+ float contrastGainFactor = 1.0 + c * c * c * c * step(0.0, contrast);
+ pixelColor.rgb = ((pixelColor.rgb - 0.5) * (contrastGainFactor * contrast + 1.0)) + 0.5;
+ pixelColor.rgb = mix(pixelColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
+ fragColor = vec4(pixelColor.rgb * pixelColor.a, pixelColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/colorize.frag b/src/effects/shaders/+glslcore/colorize.frag
new file mode 100644
index 0000000..67496c6
--- /dev/null
+++ b/src/effects/shaders/+glslcore/colorize.frag
@@ -0,0 +1,60 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform float hue;
+uniform float saturation;
+uniform float lightness;
+out vec4 fragColor;
+
+float RGBtoL(vec3 color) {
+ float cmin = min(color.r, min(color.g, color.b));
+ float cmax = max(color.r, max(color.g, color.b));
+ float l = (cmin + cmax) / 2.0;
+ return l;
+}
+
+float hueToIntensity(float v1, float v2, float h) {
+ h = fract(h);
+ if (h < 1.0 / 6.0)
+ return v1 + (v2 - v1) * 6.0 * h;
+ else if (h < 1.0 / 2.0)
+ return v2;
+ else if (h < 2.0 / 3.0)
+ return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+ return v1;
+}
+
+vec3 HSLtoRGB(vec3 color) {
+ float h = color.x;
+ float l = color.z;
+ float s = color.y;
+
+ if (s < 1.0 / 256.0)
+ return vec3(l, l, l);
+
+ float v1;
+ float v2;
+ if (l < 0.5)
+ v2 = l * (1.0 + s);
+ else
+ v2 = (l + s) - (s * l);
+
+ v1 = 2.0 * l - v2;
+
+ float d = 1.0 / 3.0;
+ float r = hueToIntensity(v1, v2, h + d);
+ float g = hueToIntensity(v1, v2, h);
+ float b = hueToIntensity(v1, v2, h - d);
+ return vec3(r, g, b);
+}
+
+void main() {
+ vec4 sample = texture(source, qt_TexCoord0);
+ sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
+ float light = RGBtoL(sample.rgb);
+ float c = step(0.0, lightness);
+ sample.rgb = HSLtoRGB(vec3(hue, saturation, mix(light, c, abs(lightness))));
+ fragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/coloroverlay.frag b/src/effects/shaders/+glslcore/coloroverlay.frag
new file mode 100644
index 0000000..68c15ab
--- /dev/null
+++ b/src/effects/shaders/+glslcore/coloroverlay.frag
@@ -0,0 +1,10 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform vec4 color;
+out vec4 fragColor;
+void main() {
+ vec4 pixelColor = texture(source, qt_TexCoord0);
+ fragColor = vec4(mix(pixelColor.rgb/max(pixelColor.a, 0.00390625), color.rgb/max(color.a, 0.00390625), color.a) * pixelColor.a, pixelColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/conicalgradient_mask.frag b/src/effects/shaders/+glslcore/conicalgradient_mask.frag
new file mode 100644
index 0000000..5724ebb
--- /dev/null
+++ b/src/effects/shaders/+glslcore/conicalgradient_mask.frag
@@ -0,0 +1,16 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform sampler2D gradientSource;
+uniform sampler2D maskSource;
+uniform float qt_Opacity;
+uniform float startAngle;
+uniform vec2 center;
+out vec4 fragColor;
+
+void main() {
+ float maskAlpha = texture(maskSource, qt_TexCoord0).a;
+ const float PI = 3.14159265;
+ const float PIx2inv = 0.1591549;
+ float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
+ fragColor = texture(gradientSource, vec2(0.0, fract(a))) * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/conicalgradient_nomask.frag b/src/effects/shaders/+glslcore/conicalgradient_nomask.frag
new file mode 100644
index 0000000..89a3278
--- /dev/null
+++ b/src/effects/shaders/+glslcore/conicalgradient_nomask.frag
@@ -0,0 +1,14 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform sampler2D gradientSource;
+uniform float qt_Opacity;
+uniform float startAngle;
+uniform vec2 center;
+out vec4 fragColor;
+
+void main() {
+ const float PI = 3.14159265;
+ const float PIx2inv = 0.1591549;
+ float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
+ fragColor = texture(gradientSource, vec2(0.0, fract(a))) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/desaturate.frag b/src/effects/shaders/+glslcore/desaturate.frag
new file mode 100644
index 0000000..c95c0a5
--- /dev/null
+++ b/src/effects/shaders/+glslcore/desaturate.frag
@@ -0,0 +1,11 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform float desaturation;
+out vec4 fragColor;
+void main(void) {
+ vec4 textureColor = texture(source, qt_TexCoord0.st);
+ float grayColor = (textureColor.r + textureColor.g + textureColor.b) / 3.0;
+ fragColor = mix(textureColor, vec4(vec3(grayColor), textureColor.a), desaturation) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/displace.frag b/src/effects/shaders/+glslcore/displace.frag
new file mode 100644
index 0000000..0a1ba7c
--- /dev/null
+++ b/src/effects/shaders/+glslcore/displace.frag
@@ -0,0 +1,29 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform sampler2D displacementSource;
+uniform float displacement;
+uniform float xPixel;
+uniform float yPixel;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ vec4 offset = texture(displacementSource, qt_TexCoord0);
+ offset.xy -= vec2(0.5, 0.5);
+ offset.xy = offset.xy * step(vec2(1.0/256.0), abs(offset.xy));
+ vec2 tx = qt_TexCoord0 + (vec2(-offset.x, offset.y) * displacement);
+
+ float e1 = linearstep(0.0, xPixel, tx.x);
+ float e2 = linearstep(0.0, yPixel, tx.y);
+ float e3 = 1.0 - linearstep(1.0, 1.0 + xPixel, tx.x);
+ float e4 = 1.0 - linearstep(1.0, 1.0 + yPixel, tx.y);
+
+ vec4 sample = texture(source, tx);
+ sample.rgb *= e1 * e2 * e3 * e4;
+ fragColor = sample * qt_Opacity * offset.a;
+}
diff --git a/src/effects/shaders/+glslcore/fastblur.frag b/src/effects/shaders/+glslcore/fastblur.frag
new file mode 100644
index 0000000..d80ba4e
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastblur.frag
@@ -0,0 +1,23 @@
+#version 150 core
+uniform sampler2D source1;
+uniform sampler2D source2;
+uniform sampler2D source3;
+uniform sampler2D source4;
+uniform sampler2D source5;
+uniform float weight1;
+uniform float weight2;
+uniform float weight3;
+uniform float weight4;
+uniform float weight5;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+void main() {
+ vec4 sourceColor = texture(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture(source5, qt_TexCoord0) * weight5;
+ fragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/fastblur_internal.frag b/src/effects/shaders/+glslcore/fastblur_internal.frag
new file mode 100644
index 0000000..444e8ca
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastblur_internal.frag
@@ -0,0 +1,16 @@
+#version 150 core
+uniform sampler2D source;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+in vec2 qt_TexCoord1;
+in vec2 qt_TexCoord2;
+in vec2 qt_TexCoord3;
+out vec4 fragColor;
+
+void main() {
+ vec4 sourceColor = (texture(source, qt_TexCoord0) +
+ texture(source, qt_TexCoord1) +
+ texture(source, qt_TexCoord2) +
+ texture(source, qt_TexCoord3)) * 0.25;
+ fragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/fastblur_internal.vert b/src/effects/shaders/+glslcore/fastblur_internal.vert
new file mode 100644
index 0000000..1ceb9a2
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastblur_internal.vert
@@ -0,0 +1,18 @@
+#version 150 core
+in vec4 qt_Vertex;
+in vec2 qt_MultiTexCoord0;
+uniform mat4 qt_Matrix;
+uniform float yStep;
+uniform float xStep;
+out vec2 qt_TexCoord0;
+out vec2 qt_TexCoord1;
+out vec2 qt_TexCoord2;
+out vec2 qt_TexCoord3;
+
+void main() {
+ qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
+ qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
+ qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
+ qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/+glslcore/fastglow.frag b/src/effects/shaders/+glslcore/fastglow.frag
new file mode 100644
index 0000000..4e18c45
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastglow.frag
@@ -0,0 +1,30 @@
+#version 150 core
+uniform sampler2D source1;
+uniform sampler2D source2;
+uniform sampler2D source3;
+uniform sampler2D source4;
+uniform sampler2D source5;
+uniform float weight1;
+uniform float weight2;
+uniform float weight3;
+uniform float weight4;
+uniform float weight5;
+uniform vec4 color;
+uniform float spread;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ vec4 sourceColor = texture(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture(source5, qt_TexCoord0) * weight5;
+ sourceColor = mix(vec4(0), color, linearstep(0.0, spread, sourceColor.a));
+ fragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/fastinnershadow.frag b/src/effects/shaders/+glslcore/fastinnershadow.frag
new file mode 100644
index 0000000..cf3f166
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastinnershadow.frag
@@ -0,0 +1,32 @@
+#version 150 core
+uniform sampler2D original;
+uniform sampler2D source1;
+uniform sampler2D source2;
+uniform sampler2D source3;
+uniform sampler2D source4;
+uniform sampler2D source5;
+uniform float weight1;
+uniform float weight2;
+uniform float weight3;
+uniform float weight4;
+uniform float weight5;
+uniform vec4 color;
+uniform float spread;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ vec4 shadowColor = texture(source1, qt_TexCoord0) * weight1;
+ shadowColor += texture(source2, qt_TexCoord0) * weight2;
+ shadowColor += texture(source3, qt_TexCoord0) * weight3;
+ shadowColor += texture(source4, qt_TexCoord0) * weight4;
+ shadowColor += texture(source5, qt_TexCoord0) * weight5;
+ vec4 originalColor = texture(original, qt_TexCoord0);
+ shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
+ fragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/fastinnershadow_level0.frag b/src/effects/shaders/+glslcore/fastinnershadow_level0.frag
new file mode 100644
index 0000000..4449bb0
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastinnershadow_level0.frag
@@ -0,0 +1,15 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform vec4 color;
+uniform float horizontalOffset;
+uniform float verticalOffset;
+out vec4 fragColor;
+
+void main(void) {
+ vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
+ float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
+ float eb = 1.0 - ea;
+ fragColor = (eb * color + ea * color * (1.0 - texture(source, pos).a)) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/fastmaskedblur.frag b/src/effects/shaders/+glslcore/fastmaskedblur.frag
new file mode 100644
index 0000000..ae4d628
--- /dev/null
+++ b/src/effects/shaders/+glslcore/fastmaskedblur.frag
@@ -0,0 +1,53 @@
+#version 150 core
+uniform sampler2D mask;
+uniform sampler2D source1;
+uniform sampler2D source2;
+uniform sampler2D source3;
+uniform sampler2D source4;
+uniform sampler2D source5;
+uniform sampler2D source6;
+uniform float lod;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+float weight(float v) {
+ if (v <= 0.0)
+ return 1.0;
+
+ if (v >= 0.5)
+ return 0.0;
+
+ return 1.0 - v * 2.0;
+}
+
+void main() {
+
+ vec4 maskColor = texture(mask, qt_TexCoord0);
+ float l = lod * maskColor.a;
+
+ float w1 = weight(abs(l - 0.100));
+ float w2 = weight(abs(l - 0.300));
+ float w3 = weight(abs(l - 0.500));
+ float w4 = weight(abs(l - 0.700));
+ float w5 = weight(abs(l - 0.900));
+ float w6 = weight(abs(l - 1.100));
+
+ float sum = w1 + w2 + w3 + w4 + w5 + w6;
+ float weight1 = w1 / sum;
+ float weight2 = w2 / sum;
+ float weight3 = w3 / sum;
+ float weight4 = w4 / sum;
+ float weight5 = w5 / sum;
+ float weight6 = w6 / sum;
+
+ vec4 sourceColor = texture(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture(source5, qt_TexCoord0) * weight5;
+ sourceColor += texture(source6, qt_TexCoord0) * weight6;
+
+ fragColor = sourceColor * qt_Opacity;
+
+}
diff --git a/src/effects/shaders/+glslcore/gammaadjust.frag b/src/effects/shaders/+glslcore/gammaadjust.frag
new file mode 100644
index 0000000..7efdd89
--- /dev/null
+++ b/src/effects/shaders/+glslcore/gammaadjust.frag
@@ -0,0 +1,13 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform float gamma;
+out vec4 fragColor;
+
+void main(void) {
+ vec4 originalColor = texture(source, qt_TexCoord0.st);
+ originalColor.rgb = originalColor.rgb / max(1.0/256.0, originalColor.a);
+ vec3 adjustedColor = pow(originalColor.rgb, vec3(gamma));
+ fragColor = vec4(adjustedColor * originalColor.a, originalColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/gaussianinnershadow.frag b/src/effects/shaders/+glslcore/gaussianinnershadow.frag
new file mode 100644
index 0000000..8b8c863
--- /dev/null
+++ b/src/effects/shaders/+glslcore/gaussianinnershadow.frag
@@ -0,0 +1,19 @@
+#version 150 core
+uniform sampler2D original;
+uniform sampler2D shadow;
+uniform float qt_Opacity;
+uniform float spread;
+uniform vec4 color;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main(void) {
+ vec4 originalColor = texture(original, qt_TexCoord0);
+ vec4 shadowColor = texture(shadow, qt_TexCoord0);
+ shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
+ fragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/gaussianinnershadow_shadow.frag b/src/effects/shaders/+glslcore/gaussianinnershadow_shadow.frag
new file mode 100644
index 0000000..d511daf
--- /dev/null
+++ b/src/effects/shaders/+glslcore/gaussianinnershadow_shadow.frag
@@ -0,0 +1,15 @@
+#version 150 core
+uniform sampler2D original;
+uniform float qt_Opacity;
+uniform vec4 color;
+uniform float horizontalOffset;
+uniform float verticalOffset;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+void main(void) {
+ vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
+ float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
+ float eb = 1.0 - ea;
+ fragColor = eb * color + ea * color * (1.0 - texture(original, pos).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/huesaturation.frag b/src/effects/shaders/+glslcore/huesaturation.frag
new file mode 100644
index 0000000..c593dcb
--- /dev/null
+++ b/src/effects/shaders/+glslcore/huesaturation.frag
@@ -0,0 +1,79 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform vec3 hsl;
+out vec4 fragColor;
+
+vec3 RGBtoHSL(vec3 color) {
+ float cmin = min(color.r, min(color.g, color.b));
+ float cmax = max(color.r, max(color.g, color.b));
+ float h = 0.0;
+ float s = 0.0;
+ float l = (cmin + cmax) / 2.0;
+ float diff = cmax - cmin;
+
+ if (diff > 1.0 / 256.0) {
+ if (l < 0.5)
+ s = diff / (cmin + cmax);
+ else
+ s = diff / (2.0 - (cmin + cmax));
+
+ if (color.r == cmax)
+ h = (color.g - color.b) / diff;
+ else if (color.g == cmax)
+ h = 2.0 + (color.b - color.r) / diff;
+ else
+ h = 4.0 + (color.r - color.g) / diff;
+
+ h /= 6.0;
+ }
+ return vec3(h, s, l);
+}
+
+float hueToIntensity(float v1, float v2, float h) {
+ h = fract(h);
+ if (h < 1.0 / 6.0)
+ return v1 + (v2 - v1) * 6.0 * h;
+ else if (h < 1.0 / 2.0)
+ return v2;
+ else if (h < 2.0 / 3.0)
+ return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+ return v1;
+}
+
+vec3 HSLtoRGB(vec3 color) {
+ float h = color.x;
+ float l = color.z;
+ float s = color.y;
+
+ if (s < 1.0 / 256.0)
+ return vec3(l);
+
+ float v1;
+ float v2;
+ if (l < 0.5)
+ v2 = l * (1.0 + s);
+ else
+ v2 = (l + s) - (s * l);
+
+ v1 = 2.0 * l - v2;
+
+ float d = 1.0 / 3.0;
+ float r = hueToIntensity(v1, v2, h + d);
+ float g = hueToIntensity(v1, v2, h);
+ float b = hueToIntensity(v1, v2, h - d);
+ return vec3(r, g, b);
+}
+
+void main() {
+ vec4 sample = texture(source, qt_TexCoord0);
+ sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
+ sample.rgb = mix(vec3(dot(sample.rgb, vec3(0.2125, 0.7154, 0.0721))), sample.rgb, 1.0 + hsl.y);
+ sample.xyz = RGBtoHSL(sample.rgb);
+ sample.rgb = HSLtoRGB(vec3(sample.x + hsl.x, sample.y, sample.z));
+ float c = step(0.0, hsl.z);
+ sample.rgb = mix(sample.rgb, vec3(c), abs(hsl.z));
+ fragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/leveladjust.frag b/src/effects/shaders/+glslcore/leveladjust.frag
new file mode 100644
index 0000000..67370ec
--- /dev/null
+++ b/src/effects/shaders/+glslcore/leveladjust.frag
@@ -0,0 +1,37 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform vec3 minimumInputRGB;
+uniform vec3 maximumInputRGB;
+uniform float minimumInputAlpha;
+uniform float maximumInputAlpha;
+uniform vec3 minimumOutputRGB;
+uniform vec3 maximumOutputRGB;
+uniform float minimumOutputAlpha;
+uniform float maximumOutputAlpha;
+uniform vec3 gamma;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main(void) {
+ vec4 textureColor = texture(source, qt_TexCoord0.st);
+ vec4 color = vec4(textureColor.rgb / max(1.0/256.0, textureColor.a), textureColor.a);
+
+ color.r = linearstep(minimumInputRGB.r, maximumInputRGB.r, color.r);
+ color.g = linearstep(minimumInputRGB.g, maximumInputRGB.g, color.g);
+ color.b = linearstep(minimumInputRGB.b, maximumInputRGB.b, color.b);
+ color.a = linearstep(minimumInputAlpha, maximumInputAlpha, color.a);
+
+ color.rgb = pow(color.rgb, gamma);
+
+ color.r = minimumOutputRGB.r + color.r * (maximumOutputRGB.r - minimumOutputRGB.r);
+ color.g = minimumOutputRGB.g + color.g * (maximumOutputRGB.g - minimumOutputRGB.g);
+ color.b = minimumOutputRGB.b + color.b * (maximumOutputRGB.b - minimumOutputRGB.b);
+ color.a = minimumOutputAlpha + color.a * (maximumOutputAlpha - minimumOutputAlpha);
+
+ fragColor = vec4(color.rgb * color.a, color.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/lineargradient.vert b/src/effects/shaders/+glslcore/lineargradient.vert
new file mode 100644
index 0000000..4764f7e
--- /dev/null
+++ b/src/effects/shaders/+glslcore/lineargradient.vert
@@ -0,0 +1,22 @@
+#version 150 core
+in vec4 qt_Vertex;
+in vec2 qt_MultiTexCoord0;
+uniform mat4 qt_Matrix;
+out vec2 qt_TexCoord0;
+out vec2 qt_TexCoord1;
+uniform vec2 startPoint;
+uniform float l;
+uniform vec2 matrixData;
+
+void main() {
+ mat2 rot = mat2(matrixData.y, -matrixData.x,
+ matrixData.x, matrixData.y);
+
+ qt_TexCoord0 = qt_MultiTexCoord0;
+
+ qt_TexCoord1 = qt_MultiTexCoord0 * l;
+ qt_TexCoord1 -= startPoint * l;
+ qt_TexCoord1 *= rot;
+
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/+glslcore/lineargradient_mask.frag b/src/effects/shaders/+glslcore/lineargradient_mask.frag
new file mode 100644
index 0000000..351ff33
--- /dev/null
+++ b/src/effects/shaders/+glslcore/lineargradient_mask.frag
@@ -0,0 +1,13 @@
+#version 150 core
+uniform sampler2D source;
+uniform sampler2D maskSource;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+in vec2 qt_TexCoord1;
+out vec4 fragColor;
+
+void main() {
+ vec4 gradientColor = texture(source, qt_TexCoord1);
+ float maskAlpha = texture(maskSource, qt_TexCoord0).a;
+ fragColor = gradientColor * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/lineargradient_nomask.frag b/src/effects/shaders/+glslcore/lineargradient_nomask.frag
new file mode 100644
index 0000000..4ca8ebe
--- /dev/null
+++ b/src/effects/shaders/+glslcore/lineargradient_nomask.frag
@@ -0,0 +1,9 @@
+#version 150 core
+uniform sampler2D source;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord1;
+out vec4 fragColor;
+
+void main() {
+ fragColor = texture(source, qt_TexCoord1) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/opacitymask.frag b/src/effects/shaders/+glslcore/opacitymask.frag
new file mode 100644
index 0000000..629f82c
--- /dev/null
+++ b/src/effects/shaders/+glslcore/opacitymask.frag
@@ -0,0 +1,9 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform sampler2D maskSource;
+out vec4 fragColor;
+void main(void) {
+ fragColor = texture(source, qt_TexCoord0.st) * (texture(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/opacitymask_invert.frag b/src/effects/shaders/+glslcore/opacitymask_invert.frag
new file mode 100644
index 0000000..c8090a4
--- /dev/null
+++ b/src/effects/shaders/+glslcore/opacitymask_invert.frag
@@ -0,0 +1,9 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform sampler2D maskSource;
+out vec4 fragColor;
+void main(void) {
+ fragColor = texture(source, qt_TexCoord0.st) * (1.0 - texture(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/radialgradient.vert b/src/effects/shaders/+glslcore/radialgradient.vert
new file mode 100644
index 0000000..8179122
--- /dev/null
+++ b/src/effects/shaders/+glslcore/radialgradient.vert
@@ -0,0 +1,31 @@
+#version 150 core
+in vec4 qt_Vertex;
+in vec2 qt_MultiTexCoord0;
+uniform mat4 qt_Matrix;
+uniform vec2 matrixData;
+uniform float horizontalRatio;
+uniform float verticalRatio;
+uniform vec2 center;
+out vec2 qt_TexCoord0;
+out vec2 qt_TexCoord1;
+out vec2 centerPoint;
+
+void main() {
+ vec2 ratio = vec2(horizontalRatio, verticalRatio);
+
+ // Rotation matrix
+ mat2 rot = mat2(matrixData.y, -matrixData.x,
+ matrixData.x, matrixData.y);
+
+ qt_TexCoord0 = qt_MultiTexCoord0;
+
+ qt_TexCoord1 = qt_MultiTexCoord0;
+ qt_TexCoord1 -= center;
+ qt_TexCoord1 *= rot;
+ qt_TexCoord1 += center;
+ qt_TexCoord1 *= ratio;
+
+ centerPoint = center * ratio;
+
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/+glslcore/radialgradient_mask.frag b/src/effects/shaders/+glslcore/radialgradient_mask.frag
new file mode 100644
index 0000000..11a3395
--- /dev/null
+++ b/src/effects/shaders/+glslcore/radialgradient_mask.frag
@@ -0,0 +1,14 @@
+#version 150 core
+uniform sampler2D gradientImage;
+uniform sampler2D maskSource;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord0;
+in vec2 qt_TexCoord1;
+in vec2 centerPoint;
+out vec4 fragColor;
+
+void main() {
+ vec4 gradientColor = texture(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
+ float maskAlpha = texture(maskSource, qt_TexCoord0).a;
+ fragColor = gradientColor * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/radialgradient_nomask.frag b/src/effects/shaders/+glslcore/radialgradient_nomask.frag
new file mode 100644
index 0000000..455777b
--- /dev/null
+++ b/src/effects/shaders/+glslcore/radialgradient_nomask.frag
@@ -0,0 +1,11 @@
+#version 150 core
+uniform sampler2D gradientImage;
+uniform float qt_Opacity;
+in vec2 qt_TexCoord1;
+in vec2 centerPoint;
+out vec4 fragColor;
+
+void main() {
+ vec4 gradientColor = texture(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
+ fragColor = gradientColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/rectangularglow.frag b/src/effects/shaders/+glslcore/rectangularglow.frag
new file mode 100644
index 0000000..f749519
--- /dev/null
+++ b/src/effects/shaders/+glslcore/rectangularglow.frag
@@ -0,0 +1,21 @@
+#version 150 core
+uniform float qt_Opacity;
+uniform float relativeSizeX;
+uniform float relativeSizeY;
+uniform float spread;
+uniform vec4 color;
+in vec2 qt_TexCoord0;
+out vec4 fragColor;
+
+float linearstep(float e0, float e1, float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ float alpha =
+ smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *
+ smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));
+
+ float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);
+ fragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;
+}
diff --git a/src/effects/shaders/+glslcore/recursiveblur.frag b/src/effects/shaders/+glslcore/recursiveblur.frag
new file mode 100644
index 0000000..ff47b7c
--- /dev/null
+++ b/src/effects/shaders/+glslcore/recursiveblur.frag
@@ -0,0 +1,9 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+out vec4 fragColor;
+
+void main() {
+ fragColor = texture(source, qt_TexCoord0) * qt_Opacity;
+}
diff --git a/src/effects/shaders/+glslcore/recursiveblur.vert b/src/effects/shaders/+glslcore/recursiveblur.vert
new file mode 100644
index 0000000..3dc3a0b
--- /dev/null
+++ b/src/effects/shaders/+glslcore/recursiveblur.vert
@@ -0,0 +1,15 @@
+#version 150 core
+in vec4 qt_Vertex;
+in vec2 qt_MultiTexCoord0;
+uniform mat4 qt_Matrix;
+uniform float expandX;
+uniform float expandY;
+out vec2 qt_TexCoord0;
+
+void main() {
+ vec2 texCoord = qt_MultiTexCoord0;
+ texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
+ texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
+ qt_TexCoord0 = texCoord;
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/+glslcore/thresholdmask.frag b/src/effects/shaders/+glslcore/thresholdmask.frag
new file mode 100644
index 0000000..5b331d8
--- /dev/null
+++ b/src/effects/shaders/+glslcore/thresholdmask.frag
@@ -0,0 +1,14 @@
+#version 150 core
+in vec2 qt_TexCoord0;
+uniform float qt_Opacity;
+uniform sampler2D source;
+uniform sampler2D maskSource;
+uniform float threshold;
+uniform float spread;
+out vec4 fragColor;
+
+void main(void) {
+ vec4 colorFragment = texture(source, qt_TexCoord0.st);
+ vec4 maskFragment = texture(maskSource, qt_TexCoord0.st);
+ fragColor = colorFragment * smoothstep(threshold * (1.0 + spread) - spread, threshold * (1.0 + spread), maskFragment.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/brightnesscontrast.frag b/src/effects/shaders/brightnesscontrast.frag
new file mode 100644
index 0000000..4a3d435
--- /dev/null
+++ b/src/effects/shaders/brightnesscontrast.frag
@@ -0,0 +1,14 @@
+varying mediump vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp float brightness;
+uniform highp float contrast;
+void main() {
+ highp vec4 pixelColor = texture2D(source, qt_TexCoord0);
+ pixelColor.rgb /= max(1.0/256.0, pixelColor.a);
+ highp float c = 1.0 + contrast;
+ highp float contrastGainFactor = 1.0 + c * c * c * c * step(0.0, contrast);
+ pixelColor.rgb = ((pixelColor.rgb - 0.5) * (contrastGainFactor * contrast + 1.0)) + 0.5;
+ pixelColor.rgb = mix(pixelColor.rgb, vec3(step(0.0, brightness)), abs(brightness));
+ gl_FragColor = vec4(pixelColor.rgb * pixelColor.a, pixelColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/colorize.frag b/src/effects/shaders/colorize.frag
new file mode 100644
index 0000000..88c3abc
--- /dev/null
+++ b/src/effects/shaders/colorize.frag
@@ -0,0 +1,58 @@
+varying mediump vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp float hue;
+uniform highp float saturation;
+uniform highp float lightness;
+
+highp float RGBtoL(highp vec3 color) {
+ highp float cmin = min(color.r, min(color.g, color.b));
+ highp float cmax = max(color.r, max(color.g, color.b));
+ highp float l = (cmin + cmax) / 2.0;
+ return l;
+}
+
+highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
+ h = fract(h);
+ if (h < 1.0 / 6.0)
+ return v1 + (v2 - v1) * 6.0 * h;
+ else if (h < 1.0 / 2.0)
+ return v2;
+ else if (h < 2.0 / 3.0)
+ return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+ return v1;
+}
+
+highp vec3 HSLtoRGB(highp vec3 color) {
+ highp float h = color.x;
+ highp float l = color.z;
+ highp float s = color.y;
+
+ if (s < 1.0 / 256.0)
+ return vec3(l, l, l);
+
+ highp float v1;
+ highp float v2;
+ if (l < 0.5)
+ v2 = l * (1.0 + s);
+ else
+ v2 = (l + s) - (s * l);
+
+ v1 = 2.0 * l - v2;
+
+ highp float d = 1.0 / 3.0;
+ highp float r = hueToIntensity(v1, v2, h + d);
+ highp float g = hueToIntensity(v1, v2, h);
+ highp float b = hueToIntensity(v1, v2, h - d);
+ return vec3(r, g, b);
+}
+
+void main() {
+ lowp vec4 sample = texture2D(source, qt_TexCoord0);
+ sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
+ highp float light = RGBtoL(sample.rgb);
+ highp float c = step(0.0, lightness);
+ sample.rgb = HSLtoRGB(vec3(hue, saturation, mix(light, c, abs(lightness))));
+ gl_FragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/coloroverlay.frag b/src/effects/shaders/coloroverlay.frag
new file mode 100644
index 0000000..a68d88c
--- /dev/null
+++ b/src/effects/shaders/coloroverlay.frag
@@ -0,0 +1,8 @@
+varying mediump vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp vec4 color;
+void main() {
+ highp vec4 pixelColor = texture2D(source, qt_TexCoord0);
+ gl_FragColor = vec4(mix(pixelColor.rgb/max(pixelColor.a, 0.00390625), color.rgb/max(color.a, 0.00390625), color.a) * pixelColor.a, pixelColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/conicalgradient_mask.frag b/src/effects/shaders/conicalgradient_mask.frag
new file mode 100644
index 0000000..db78564
--- /dev/null
+++ b/src/effects/shaders/conicalgradient_mask.frag
@@ -0,0 +1,14 @@
+varying mediump vec2 qt_TexCoord0;
+uniform lowp sampler2D gradientSource;
+uniform lowp sampler2D maskSource;
+uniform highp float qt_Opacity;
+uniform highp float startAngle;
+uniform highp vec2 center;
+
+void main() {
+ lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
+ const highp float PI = 3.14159265;
+ const highp float PIx2inv = 0.1591549;
+ highp float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
+ gl_FragColor = texture2D(gradientSource, vec2(0.0, fract(a))) * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/conicalgradient_nomask.frag b/src/effects/shaders/conicalgradient_nomask.frag
new file mode 100644
index 0000000..3f7d785
--- /dev/null
+++ b/src/effects/shaders/conicalgradient_nomask.frag
@@ -0,0 +1,12 @@
+varying mediump vec2 qt_TexCoord0;
+uniform lowp sampler2D gradientSource;
+uniform highp float qt_Opacity;
+uniform highp float startAngle;
+uniform highp vec2 center;
+
+void main() {
+ const highp float PI = 3.14159265;
+ const highp float PIx2inv = 0.1591549;
+ highp float a = (atan((center.y - qt_TexCoord0.t), (center.x - qt_TexCoord0.s)) + PI - startAngle) * PIx2inv;
+ gl_FragColor = texture2D(gradientSource, vec2(0.0, fract(a))) * qt_Opacity;
+}
diff --git a/src/effects/shaders/desaturate.frag b/src/effects/shaders/desaturate.frag
new file mode 100644
index 0000000..c6491ca
--- /dev/null
+++ b/src/effects/shaders/desaturate.frag
@@ -0,0 +1,9 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp float desaturation;
+void main(void) {
+ lowp vec4 textureColor = texture2D(source, qt_TexCoord0.st);
+ lowp float grayColor = (textureColor.r + textureColor.g + textureColor.b) / 3.0;
+ gl_FragColor = mix(textureColor, vec4(vec3(grayColor), textureColor.a), desaturation) * qt_Opacity;
+}
diff --git a/src/effects/shaders/displace.frag b/src/effects/shaders/displace.frag
new file mode 100644
index 0000000..e6ae990
--- /dev/null
+++ b/src/effects/shaders/displace.frag
@@ -0,0 +1,27 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform lowp sampler2D displacementSource;
+uniform highp float displacement;
+uniform highp float xPixel;
+uniform highp float yPixel;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ lowp vec4 offset = texture2D(displacementSource, qt_TexCoord0);
+ offset.xy -= vec2(0.5, 0.5);
+ offset.xy = offset.xy * step(vec2(1.0/256.0), abs(offset.xy));
+ highp vec2 tx = qt_TexCoord0 + (vec2(-offset.x, offset.y) * displacement);
+
+ lowp float e1 = linearstep(0.0, xPixel, tx.x);
+ lowp float e2 = linearstep(0.0, yPixel, tx.y);
+ lowp float e3 = 1.0 - linearstep(1.0, 1.0 + xPixel, tx.x);
+ lowp float e4 = 1.0 - linearstep(1.0, 1.0 + yPixel, tx.y);
+
+ lowp vec4 sample = texture2D(source, tx);
+ sample.rgb *= e1 * e2 * e3 * e4;
+ gl_FragColor = sample * qt_Opacity * offset.a;
+}
diff --git a/src/effects/shaders/fastblur.frag b/src/effects/shaders/fastblur.frag
new file mode 100644
index 0000000..261127a
--- /dev/null
+++ b/src/effects/shaders/fastblur.frag
@@ -0,0 +1,21 @@
+uniform lowp sampler2D source1;
+uniform lowp sampler2D source2;
+uniform lowp sampler2D source3;
+uniform lowp sampler2D source4;
+uniform lowp sampler2D source5;
+uniform mediump float weight1;
+uniform mediump float weight2;
+uniform mediump float weight3;
+uniform mediump float weight4;
+uniform mediump float weight5;
+uniform lowp float qt_Opacity;
+varying mediump vec2 qt_TexCoord0;
+
+void main() {
+ lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
+ gl_FragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/fastblur_internal.frag b/src/effects/shaders/fastblur_internal.frag
new file mode 100644
index 0000000..c284326
--- /dev/null
+++ b/src/effects/shaders/fastblur_internal.frag
@@ -0,0 +1,14 @@
+uniform lowp sampler2D source;
+uniform lowp float qt_Opacity;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+varying highp vec2 qt_TexCoord2;
+varying highp vec2 qt_TexCoord3;
+
+void main() {
+ highp vec4 sourceColor = (texture2D(source, qt_TexCoord0) +
+ texture2D(source, qt_TexCoord1) +
+ texture2D(source, qt_TexCoord2) +
+ texture2D(source, qt_TexCoord3)) * 0.25;
+ gl_FragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/fastblur_internal.vert b/src/effects/shaders/fastblur_internal.vert
new file mode 100644
index 0000000..aadfd68
--- /dev/null
+++ b/src/effects/shaders/fastblur_internal.vert
@@ -0,0 +1,17 @@
+attribute highp vec4 qt_Vertex;
+attribute highp vec2 qt_MultiTexCoord0;
+uniform highp mat4 qt_Matrix;
+uniform highp float yStep;
+uniform highp float xStep;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+varying highp vec2 qt_TexCoord2;
+varying highp vec2 qt_TexCoord3;
+
+void main() {
+ qt_TexCoord0 = vec2(qt_MultiTexCoord0.x + xStep, qt_MultiTexCoord0.y + yStep * 0.36);
+ qt_TexCoord1 = vec2(qt_MultiTexCoord0.x + xStep * 0.36, qt_MultiTexCoord0.y - yStep);
+ qt_TexCoord2 = vec2(qt_MultiTexCoord0.x - xStep * 0.36, qt_MultiTexCoord0.y + yStep);
+ qt_TexCoord3 = vec2(qt_MultiTexCoord0.x - xStep, qt_MultiTexCoord0.y - yStep * 0.36);
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/fastglow.frag b/src/effects/shaders/fastglow.frag
new file mode 100644
index 0000000..0eb3ece
--- /dev/null
+++ b/src/effects/shaders/fastglow.frag
@@ -0,0 +1,28 @@
+uniform lowp sampler2D source1;
+uniform lowp sampler2D source2;
+uniform lowp sampler2D source3;
+uniform lowp sampler2D source4;
+uniform lowp sampler2D source5;
+uniform mediump float weight1;
+uniform mediump float weight2;
+uniform mediump float weight3;
+uniform mediump float weight4;
+uniform mediump float weight5;
+uniform highp vec4 color;
+uniform highp float spread;
+uniform lowp float qt_Opacity;
+varying mediump vec2 qt_TexCoord0;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
+ sourceColor = mix(vec4(0), color, linearstep(0.0, spread, sourceColor.a));
+ gl_FragColor = sourceColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/fastinnershadow.frag b/src/effects/shaders/fastinnershadow.frag
new file mode 100644
index 0000000..323197e
--- /dev/null
+++ b/src/effects/shaders/fastinnershadow.frag
@@ -0,0 +1,30 @@
+uniform lowp sampler2D original;
+uniform lowp sampler2D source1;
+uniform lowp sampler2D source2;
+uniform lowp sampler2D source3;
+uniform lowp sampler2D source4;
+uniform lowp sampler2D source5;
+uniform mediump float weight1;
+uniform mediump float weight2;
+uniform mediump float weight3;
+uniform mediump float weight4;
+uniform mediump float weight5;
+uniform highp vec4 color;
+uniform highp float spread;
+uniform lowp float qt_Opacity;
+varying mediump vec2 qt_TexCoord0;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ lowp vec4 shadowColor = texture2D(source1, qt_TexCoord0) * weight1;
+ shadowColor += texture2D(source2, qt_TexCoord0) * weight2;
+ shadowColor += texture2D(source3, qt_TexCoord0) * weight3;
+ shadowColor += texture2D(source4, qt_TexCoord0) * weight4;
+ shadowColor += texture2D(source5, qt_TexCoord0) * weight5;
+ lowp vec4 originalColor = texture2D(original, qt_TexCoord0);
+ shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
+ gl_FragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
+}
diff --git a/src/effects/shaders/fastinnershadow_level0.frag b/src/effects/shaders/fastinnershadow_level0.frag
new file mode 100644
index 0000000..30a31ce
--- /dev/null
+++ b/src/effects/shaders/fastinnershadow_level0.frag
@@ -0,0 +1,13 @@
+varying highp vec2 qt_TexCoord0;
+uniform lowp float qt_Opacity;
+uniform highp sampler2D source;
+uniform lowp vec4 color;
+uniform highp float horizontalOffset;
+uniform highp float verticalOffset;
+
+void main(void) {
+ highp vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
+ lowp float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
+ lowp float eb = 1.0 - ea;
+ gl_FragColor = (eb * color + ea * color * (1.0 - texture2D(source, pos).a)) * qt_Opacity;
+}
diff --git a/src/effects/shaders/fastmaskedblur.frag b/src/effects/shaders/fastmaskedblur.frag
new file mode 100644
index 0000000..9613012
--- /dev/null
+++ b/src/effects/shaders/fastmaskedblur.frag
@@ -0,0 +1,51 @@
+uniform lowp sampler2D mask;
+uniform lowp sampler2D source1;
+uniform lowp sampler2D source2;
+uniform lowp sampler2D source3;
+uniform lowp sampler2D source4;
+uniform lowp sampler2D source5;
+uniform lowp sampler2D source6;
+uniform lowp float lod;
+uniform lowp float qt_Opacity;
+varying mediump vec2 qt_TexCoord0;
+
+mediump float weight(mediump float v) {
+ if (v <= 0.0)
+ return 1.0;
+
+ if (v >= 0.5)
+ return 0.0;
+
+ return 1.0 - v * 2.0;
+}
+
+void main() {
+
+ lowp vec4 maskColor = texture2D(mask, qt_TexCoord0);
+ mediump float l = lod * maskColor.a;
+
+ mediump float w1 = weight(abs(l - 0.100));
+ mediump float w2 = weight(abs(l - 0.300));
+ mediump float w3 = weight(abs(l - 0.500));
+ mediump float w4 = weight(abs(l - 0.700));
+ mediump float w5 = weight(abs(l - 0.900));
+ mediump float w6 = weight(abs(l - 1.100));
+
+ mediump float sum = w1 + w2 + w3 + w4 + w5 + w6;
+ mediump float weight1 = w1 / sum;
+ mediump float weight2 = w2 / sum;
+ mediump float weight3 = w3 / sum;
+ mediump float weight4 = w4 / sum;
+ mediump float weight5 = w5 / sum;
+ mediump float weight6 = w6 / sum;
+
+ lowp vec4 sourceColor = texture2D(source1, qt_TexCoord0) * weight1;
+ sourceColor += texture2D(source2, qt_TexCoord0) * weight2;
+ sourceColor += texture2D(source3, qt_TexCoord0) * weight3;
+ sourceColor += texture2D(source4, qt_TexCoord0) * weight4;
+ sourceColor += texture2D(source5, qt_TexCoord0) * weight5;
+ sourceColor += texture2D(source6, qt_TexCoord0) * weight6;
+
+ gl_FragColor = sourceColor * qt_Opacity;
+
+}
diff --git a/src/effects/shaders/gammaadjust.frag b/src/effects/shaders/gammaadjust.frag
new file mode 100644
index 0000000..f87492a
--- /dev/null
+++ b/src/effects/shaders/gammaadjust.frag
@@ -0,0 +1,10 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp float gamma;
+void main(void) {
+ highp vec4 originalColor = texture2D(source, qt_TexCoord0.st);
+ originalColor.rgb = originalColor.rgb / max(1.0/256.0, originalColor.a);
+ highp vec3 adjustedColor = pow(originalColor.rgb, vec3(gamma));
+ gl_FragColor = vec4(adjustedColor * originalColor.a, originalColor.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/gaussianinnershadow.frag b/src/effects/shaders/gaussianinnershadow.frag
new file mode 100644
index 0000000..c9f57a6
--- /dev/null
+++ b/src/effects/shaders/gaussianinnershadow.frag
@@ -0,0 +1,17 @@
+uniform highp sampler2D original;
+uniform highp sampler2D shadow;
+uniform lowp float qt_Opacity;
+uniform highp float spread;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main(void) {
+ lowp vec4 originalColor = texture2D(original, qt_TexCoord0);
+ lowp vec4 shadowColor = texture2D(shadow, qt_TexCoord0);
+ shadowColor.rgb = mix(originalColor.rgb, color.rgb * originalColor.a, linearstep(0.0, spread, shadowColor.a));
+ gl_FragColor = vec4(shadowColor.rgb, originalColor.a) * originalColor.a * qt_Opacity;
+}
diff --git a/src/effects/shaders/gaussianinnershadow_shadow.frag b/src/effects/shaders/gaussianinnershadow_shadow.frag
new file mode 100644
index 0000000..fc95dd6
--- /dev/null
+++ b/src/effects/shaders/gaussianinnershadow_shadow.frag
@@ -0,0 +1,13 @@
+uniform highp sampler2D original;
+uniform lowp float qt_Opacity;
+uniform lowp vec4 color;
+uniform highp float horizontalOffset;
+uniform highp float verticalOffset;
+varying highp vec2 qt_TexCoord0;
+
+void main(void) {
+ highp vec2 pos = qt_TexCoord0 - vec2(horizontalOffset, verticalOffset);
+ lowp float ea = step(0.0, pos.x) * step(0.0, pos.y) * step(pos.x, 1.0) * step(pos.y, 1.0);
+ lowp float eb = 1.0 - ea;
+ gl_FragColor = eb * color + ea * color * (1.0 - texture2D(original, pos).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/huesaturation.frag b/src/effects/shaders/huesaturation.frag
new file mode 100644
index 0000000..c6073be
--- /dev/null
+++ b/src/effects/shaders/huesaturation.frag
@@ -0,0 +1,77 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform highp sampler2D source;
+uniform highp vec3 hsl;
+
+highp vec3 RGBtoHSL(highp vec3 color) {
+ highp float cmin = min(color.r, min(color.g, color.b));
+ highp float cmax = max(color.r, max(color.g, color.b));
+ highp float h = 0.0;
+ highp float s = 0.0;
+ highp float l = (cmin + cmax) / 2.0;
+ highp float diff = cmax - cmin;
+
+ if (diff > 1.0 / 256.0) {
+ if (l < 0.5)
+ s = diff / (cmin + cmax);
+ else
+ s = diff / (2.0 - (cmin + cmax));
+
+ if (color.r == cmax)
+ h = (color.g - color.b) / diff;
+ else if (color.g == cmax)
+ h = 2.0 + (color.b - color.r) / diff;
+ else
+ h = 4.0 + (color.r - color.g) / diff;
+
+ h /= 6.0;
+ }
+ return vec3(h, s, l);
+}
+
+highp float hueToIntensity(highp float v1, highp float v2, highp float h) {
+ h = fract(h);
+ if (h < 1.0 / 6.0)
+ return v1 + (v2 - v1) * 6.0 * h;
+ else if (h < 1.0 / 2.0)
+ return v2;
+ else if (h < 2.0 / 3.0)
+ return v1 + (v2 - v1) * 6.0 * (2.0 / 3.0 - h);
+
+ return v1;
+}
+
+highp vec3 HSLtoRGB(highp vec3 color) {
+ highp float h = color.x;
+ highp float l = color.z;
+ highp float s = color.y;
+
+ if (s < 1.0 / 256.0)
+ return vec3(l);
+
+ highp float v1;
+ highp float v2;
+ if (l < 0.5)
+ v2 = l * (1.0 + s);
+ else
+ v2 = (l + s) - (s * l);
+
+ v1 = 2.0 * l - v2;
+
+ highp float d = 1.0 / 3.0;
+ highp float r = hueToIntensity(v1, v2, h + d);
+ highp float g = hueToIntensity(v1, v2, h);
+ highp float b = hueToIntensity(v1, v2, h - d);
+ return vec3(r, g, b);
+}
+
+void main() {
+ lowp vec4 sample = texture2D(source, qt_TexCoord0);
+ sample = vec4(sample.rgb / max(1.0/256.0, sample.a), sample.a);
+ sample.rgb = mix(vec3(dot(sample.rgb, vec3(0.2125, 0.7154, 0.0721))), sample.rgb, 1.0 + hsl.y);
+ sample.xyz = RGBtoHSL(sample.rgb);
+ sample.rgb = HSLtoRGB(vec3(sample.x + hsl.x, sample.y, sample.z));
+ highp float c = step(0.0, hsl.z);
+ sample.rgb = mix(sample.rgb, vec3(c), abs(hsl.z));
+ gl_FragColor = vec4(sample.rgb * sample.a, sample.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/leveladjust.frag b/src/effects/shaders/leveladjust.frag
new file mode 100644
index 0000000..9462a0c
--- /dev/null
+++ b/src/effects/shaders/leveladjust.frag
@@ -0,0 +1,35 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform highp vec3 minimumInputRGB;
+uniform highp vec3 maximumInputRGB;
+uniform highp float minimumInputAlpha;
+uniform highp float maximumInputAlpha;
+uniform highp vec3 minimumOutputRGB;
+uniform highp vec3 maximumOutputRGB;
+uniform highp float minimumOutputAlpha;
+uniform highp float maximumOutputAlpha;
+uniform highp vec3 gamma;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main(void) {
+ highp vec4 textureColor = texture2D(source, qt_TexCoord0.st);
+ highp vec4 color = vec4(textureColor.rgb / max(1.0/256.0, textureColor.a), textureColor.a);
+
+ color.r = linearstep(minimumInputRGB.r, maximumInputRGB.r, color.r);
+ color.g = linearstep(minimumInputRGB.g, maximumInputRGB.g, color.g);
+ color.b = linearstep(minimumInputRGB.b, maximumInputRGB.b, color.b);
+ color.a = linearstep(minimumInputAlpha, maximumInputAlpha, color.a);
+
+ color.rgb = pow(color.rgb, gamma);
+
+ color.r = minimumOutputRGB.r + color.r * (maximumOutputRGB.r - minimumOutputRGB.r);
+ color.g = minimumOutputRGB.g + color.g * (maximumOutputRGB.g - minimumOutputRGB.g);
+ color.b = minimumOutputRGB.b + color.b * (maximumOutputRGB.b - minimumOutputRGB.b);
+ color.a = minimumOutputAlpha + color.a * (maximumOutputAlpha - minimumOutputAlpha);
+
+ gl_FragColor = vec4(color.rgb * color.a, color.a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/lineargradient.vert b/src/effects/shaders/lineargradient.vert
new file mode 100644
index 0000000..e01854c
--- /dev/null
+++ b/src/effects/shaders/lineargradient.vert
@@ -0,0 +1,21 @@
+attribute highp vec4 qt_Vertex;
+attribute highp vec2 qt_MultiTexCoord0;
+uniform highp mat4 qt_Matrix;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+uniform highp vec2 startPoint;
+uniform highp float l;
+uniform highp vec2 matrixData;
+
+void main() {
+ highp mat2 rot = mat2(matrixData.y, -matrixData.x,
+ matrixData.x, matrixData.y);
+
+ qt_TexCoord0 = qt_MultiTexCoord0;
+
+ qt_TexCoord1 = qt_MultiTexCoord0 * l;
+ qt_TexCoord1 -= startPoint * l;
+ qt_TexCoord1 *= rot;
+
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/lineargradient_mask.frag b/src/effects/shaders/lineargradient_mask.frag
new file mode 100644
index 0000000..0fed39f
--- /dev/null
+++ b/src/effects/shaders/lineargradient_mask.frag
@@ -0,0 +1,11 @@
+uniform lowp sampler2D source;
+uniform lowp sampler2D maskSource;
+uniform lowp float qt_Opacity;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+
+void main() {
+ lowp vec4 gradientColor = texture2D(source, qt_TexCoord1);
+ lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
+ gl_FragColor = gradientColor * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/lineargradient_nomask.frag b/src/effects/shaders/lineargradient_nomask.frag
new file mode 100644
index 0000000..ada02db
--- /dev/null
+++ b/src/effects/shaders/lineargradient_nomask.frag
@@ -0,0 +1,7 @@
+uniform lowp sampler2D source;
+uniform lowp float qt_Opacity;
+varying highp vec2 qt_TexCoord1;
+
+void main() {
+ gl_FragColor = texture2D(source, qt_TexCoord1) * qt_Opacity;
+}
diff --git a/src/effects/shaders/opacitymask.frag b/src/effects/shaders/opacitymask.frag
new file mode 100644
index 0000000..84f9bc3
--- /dev/null
+++ b/src/effects/shaders/opacitymask.frag
@@ -0,0 +1,7 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform lowp sampler2D maskSource;
+void main(void) {
+ gl_FragColor = texture2D(source, qt_TexCoord0.st) * (texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/opacitymask_invert.frag b/src/effects/shaders/opacitymask_invert.frag
new file mode 100644
index 0000000..e48c78e
--- /dev/null
+++ b/src/effects/shaders/opacitymask_invert.frag
@@ -0,0 +1,7 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform lowp sampler2D maskSource;
+void main(void) {
+ gl_FragColor = texture2D(source, qt_TexCoord0.st) * (1.0 - texture2D(maskSource, qt_TexCoord0.st).a) * qt_Opacity;
+}
diff --git a/src/effects/shaders/radialgradient.vert b/src/effects/shaders/radialgradient.vert
new file mode 100644
index 0000000..ce69586
--- /dev/null
+++ b/src/effects/shaders/radialgradient.vert
@@ -0,0 +1,30 @@
+attribute highp vec4 qt_Vertex;
+attribute highp vec2 qt_MultiTexCoord0;
+uniform highp mat4 qt_Matrix;
+uniform highp vec2 matrixData;
+uniform highp float horizontalRatio;
+uniform highp float verticalRatio;
+uniform highp vec2 center;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+varying highp vec2 centerPoint;
+
+void main() {
+ highp vec2 ratio = vec2(horizontalRatio, verticalRatio);
+
+ // Rotation matrix
+ highp mat2 rot = mat2(matrixData.y, -matrixData.x,
+ matrixData.x, matrixData.y);
+
+ qt_TexCoord0 = qt_MultiTexCoord0;
+
+ qt_TexCoord1 = qt_MultiTexCoord0;
+ qt_TexCoord1 -= center;
+ qt_TexCoord1 *= rot;
+ qt_TexCoord1 += center;
+ qt_TexCoord1 *= ratio;
+
+ centerPoint = center * ratio;
+
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/radialgradient_mask.frag b/src/effects/shaders/radialgradient_mask.frag
new file mode 100644
index 0000000..5911753
--- /dev/null
+++ b/src/effects/shaders/radialgradient_mask.frag
@@ -0,0 +1,12 @@
+uniform lowp sampler2D gradientImage;
+uniform lowp sampler2D maskSource;
+uniform lowp float qt_Opacity;
+varying highp vec2 qt_TexCoord0;
+varying highp vec2 qt_TexCoord1;
+varying highp vec2 centerPoint;
+
+void main() {
+ lowp vec4 gradientColor = texture2D(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
+ lowp float maskAlpha = texture2D(maskSource, qt_TexCoord0).a;
+ gl_FragColor = gradientColor * maskAlpha * qt_Opacity;
+}
diff --git a/src/effects/shaders/radialgradient_nomask.frag b/src/effects/shaders/radialgradient_nomask.frag
new file mode 100644
index 0000000..cf92236
--- /dev/null
+++ b/src/effects/shaders/radialgradient_nomask.frag
@@ -0,0 +1,10 @@
+
+uniform lowp sampler2D gradientImage;
+uniform lowp float qt_Opacity;
+varying highp vec2 qt_TexCoord1;
+varying highp vec2 centerPoint;
+
+void main() {
+ lowp vec4 gradientColor = texture2D(gradientImage, vec2(0.0, 2.0 * distance(qt_TexCoord1, centerPoint)));
+ gl_FragColor = gradientColor * qt_Opacity;
+}
diff --git a/src/effects/shaders/rectangularglow.frag b/src/effects/shaders/rectangularglow.frag
new file mode 100644
index 0000000..40bab58
--- /dev/null
+++ b/src/effects/shaders/rectangularglow.frag
@@ -0,0 +1,19 @@
+uniform highp float qt_Opacity;
+uniform mediump float relativeSizeX;
+uniform mediump float relativeSizeY;
+uniform mediump float spread;
+uniform lowp vec4 color;
+varying highp vec2 qt_TexCoord0;
+
+highp float linearstep(highp float e0, highp float e1, highp float x) {
+ return clamp((x - e0) / (e1 - e0), 0.0, 1.0);
+}
+
+void main() {
+ lowp float alpha =
+ smoothstep(0.0, relativeSizeX, 0.5 - abs(0.5 - qt_TexCoord0.x)) *
+ smoothstep(0.0, relativeSizeY, 0.5 - abs(0.5 - qt_TexCoord0.y));
+
+ highp float spreadMultiplier = linearstep(spread, 1.0 - spread, alpha);
+ gl_FragColor = color * qt_Opacity * spreadMultiplier * spreadMultiplier;
+}
diff --git a/src/effects/shaders/recursiveblur.frag b/src/effects/shaders/recursiveblur.frag
new file mode 100644
index 0000000..5562929
--- /dev/null
+++ b/src/effects/shaders/recursiveblur.frag
@@ -0,0 +1,6 @@
+varying mediump vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+void main() {
+ gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity;
+}
diff --git a/src/effects/shaders/recursiveblur.vert b/src/effects/shaders/recursiveblur.vert
new file mode 100644
index 0000000..67f64e1
--- /dev/null
+++ b/src/effects/shaders/recursiveblur.vert
@@ -0,0 +1,14 @@
+attribute highp vec4 qt_Vertex;
+attribute highp vec2 qt_MultiTexCoord0;
+uniform highp mat4 qt_Matrix;
+uniform highp float expandX;
+uniform highp float expandY;
+varying highp vec2 qt_TexCoord0;
+
+void main() {
+ mediump vec2 texCoord = qt_MultiTexCoord0;
+ texCoord.s = (texCoord.s - expandX) / (1.0 - 2.0 * expandX);
+ texCoord.t = (texCoord.t - expandY) / (1.0 - 2.0 * expandY);
+ qt_TexCoord0 = texCoord;
+ gl_Position = qt_Matrix * qt_Vertex;
+}
diff --git a/src/effects/shaders/thresholdmask.frag b/src/effects/shaders/thresholdmask.frag
new file mode 100644
index 0000000..b979589
--- /dev/null
+++ b/src/effects/shaders/thresholdmask.frag
@@ -0,0 +1,11 @@
+varying highp vec2 qt_TexCoord0;
+uniform highp float qt_Opacity;
+uniform lowp sampler2D source;
+uniform lowp sampler2D maskSource;
+uniform highp float threshold;
+uniform highp float spread;
+void main(void) {
+ lowp vec4 colorFragment = texture2D(source, qt_TexCoord0.st);
+ lowp vec4 maskFragment = texture2D(maskSource, qt_TexCoord0.st);
+ gl_FragColor = colorFragment * smoothstep(threshold * (1.0 + spread) - spread, threshold * (1.0 + spread), maskFragment.a) * qt_Opacity;
+}