7443aa1ba9ba39c5c5459bbebf92beb902a396ec
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / graphics / shaders / image-visual-shader.vert
1 INPUT mediump vec2 aPosition;
2 OUTPUT mediump vec2 vTexCoord;
3 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE)
4 OUTPUT mediump vec2 vPosition;
5 OUTPUT mediump vec2 vRectSize;
6 OUTPUT mediump vec2 vOptRectSize;
7 #ifdef IS_REQUIRED_ROUNDED_CORNER
8 OUTPUT mediump vec4 vCornerRadius;
9 #endif
10 #endif
11
12 uniform highp mat4 uMvpMatrix;
13 uniform highp vec3 uSize;
14 uniform mediump vec4 pixelArea;
15
16 //Visual size and offset
17 uniform mediump vec2 offset;
18 uniform highp vec2 size;
19 uniform mediump vec4 offsetSizeMode;
20 uniform mediump vec2 origin;
21 uniform mediump vec2 anchorPoint;
22 #ifdef IS_REQUIRED_BORDERLINE
23 uniform mediump float borderlineWidth;
24 uniform mediump float borderlineOffset;
25 #endif
26 #ifdef IS_REQUIRED_ROUNDED_CORNER
27 uniform mediump vec4 cornerRadius;
28 uniform mediump float cornerRadiusPolicy;
29 #endif
30 #ifdef IS_REQUIRED_ALPHA_MASKING
31 OUTPUT  mediump vec2  vMaskTexCoord;
32 uniform lowp    float cropToMask;
33 uniform mediump vec2  maskTextureRatio;
34 #endif
35 uniform mediump vec2 extraSize;
36
37 vec4 ComputeVertexPosition()
38 {
39   vec2 visualSize = mix(size * uSize.xy, size, offsetSizeMode.zw) + extraSize;
40   vec2 visualOffset = mix(offset * uSize.xy, offset, offsetSizeMode.xy);
41
42 #if defined(IS_REQUIRED_ROUNDED_CORNER) || defined(IS_REQUIRED_BORDERLINE)
43   vRectSize = visualSize * 0.5;
44   vOptRectSize = vRectSize;
45 #endif
46
47 #ifdef IS_REQUIRED_ROUNDED_CORNER
48 #ifdef IS_REQUIRED_BORDERLINE
49   mediump float minSize = min(visualSize.x, visualSize.y) + (1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth;
50 #else
51   mediump float minSize = min(visualSize.x, visualSize.y);
52 #endif
53   vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
54   vCornerRadius = min(vCornerRadius, minSize * 0.5);
55   // Optimize fragment shader. 0.2929 ~= 1.0 - sqrt(0.5)
56   mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
57   vOptRectSize -= 0.2929 * maxRadius + 1.0;
58 #endif
59
60 #ifdef IS_REQUIRED_BORDERLINE
61   vPosition = aPosition * (visualSize + (1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth);
62   vOptRectSize -= (1.0 - clamp(borderlineOffset, -1.0, 1.0)) * 0.5 * borderlineWidth + 1.0;
63 #elif defined(IS_REQUIRED_ROUNDED_CORNER)
64   vPosition = aPosition * visualSize;
65 #else
66   mediump vec2 vPosition = aPosition * visualSize;
67 #endif
68
69   vec4 finalPixelArea = pixelArea;
70 #ifdef IS_REQUIRED_ALPHA_MASKING
71   finalPixelArea = mix(pixelArea,
72                        vec4(
73                             vec2(0.5) + (pixelArea.xy - vec2(0.5)) * maskTextureRatio,
74                             pixelArea.zw * maskTextureRatio
75                        ),
76                        cropToMask);
77   vMaskTexCoord = pixelArea.xy + pixelArea.zw * (vPosition.xy / max(vec2(1.0), visualSize) + vec2(0.5));
78 #endif
79   vTexCoord = finalPixelArea.xy + finalPixelArea.zw * (vPosition.xy / max(vec2(1.0), visualSize) + vec2(0.5));
80
81   return vec4(vPosition + anchorPoint * visualSize + visualOffset + origin * uSize.xy, 0.0, 1.0);
82 }
83
84 void main()
85 {
86   gl_Position = uMvpMatrix * ComputeVertexPosition();
87 }