[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / graphics / shaders / npatch-visual-mask-shader.frag
1 varying mediump vec2 vTexCoord;
2 varying mediump vec2 vMaskTexCoord;
3 uniform sampler2D sTexture;
4 uniform sampler2D sMask;
5 uniform lowp vec4 uColor;
6 uniform lowp vec3 mixColor;
7 uniform lowp float preMultipliedAlpha;
8 uniform mediump float auxiliaryImageAlpha;
9
10 void main()
11 {
12   // Where mask image is transparent, all of background image must show through.
13   // where mask image is opaque, only mask should be shown
14   // where mask is translucent, less of background should be shown.
15   // auxiliaryImageAlpha controls how much of mask is visible
16
17   mediump vec4 color = texture2D(sTexture, vTexCoord);
18   mediump vec4 mask = texture2D(sMask, vMaskTexCoord);
19
20   mediump float maskAlpha = mask.a * auxiliaryImageAlpha;
21
22   lowp vec3 preMultipliedMaskRGB = mask.rgb * mix(mask.a, 1.0, preMultipliedAlpha) * auxiliaryImageAlpha;
23   lowp vec3 preMultipliedTextureRGB = color.rgb * mix(color.a, 1.0, preMultipliedAlpha);
24
25   // Manual blend operation with premultiplied colors.
26   // Final alpha = maskAlpha + (1.0 - maskAlpha) * color.a.
27   // (Final rgb * alpha) =  preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB
28   // If preMultipliedAlpha == 1.0, just return vec4(rgb*alpha, alpha)
29   // Else, return vec4((rgb*alpha) / alpha, alpha)
30
31   lowp float finalAlpha = mix(color.a, 1.0, maskAlpha);
32   lowp vec3  finalMultipliedRGB = preMultipliedMaskRGB + (1.0 - maskAlpha) * preMultipliedTextureRGB;
33
34   // TODO : Need to find some way without division
35   lowp vec4 finalColor = vec4(finalMultipliedRGB * mix(1.0 / finalAlpha, 1.0, preMultipliedAlpha), finalAlpha);
36   gl_FragColor = finalColor * uColor * vec4(mixColor, 1.0);
37 }