Fix texture coordinate error when visualSize < 1.0
[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_BORDERLINE
48   // Extend size of visual by borderline.
49   mediump float outerBorderlineSize = (1.0 + clamp(borderlineOffset, -1.0, 1.0)) * borderlineWidth;
50 #endif
51
52 #ifdef IS_REQUIRED_ROUNDED_CORNER
53 #ifdef IS_REQUIRED_BORDERLINE
54   mediump float minSize = min(visualSize.x, visualSize.y) + outerBorderlineSize;
55 #else
56   mediump float minSize = min(visualSize.x, visualSize.y);
57 #endif
58   vCornerRadius = mix(cornerRadius * minSize, cornerRadius, cornerRadiusPolicy);
59   vCornerRadius = min(vCornerRadius, minSize * 0.5);
60   // Optimize fragment shader. 0.2929 ~= 1.0 - sqrt(0.5)
61   mediump float maxRadius = max(max(vCornerRadius.x, vCornerRadius.y), max(vCornerRadius.z, vCornerRadius.w));
62   vOptRectSize -= 0.2929 * maxRadius + 1.0;
63 #endif
64
65 #ifdef IS_REQUIRED_BORDERLINE
66   vPosition = aPosition * (visualSize + outerBorderlineSize);
67   vOptRectSize -= (borderlineWidth - outerBorderlineSize * 0.5) + 1.0;
68 #elif defined(IS_REQUIRED_ROUNDED_CORNER)
69   vPosition = aPosition * visualSize;
70 #else
71   mediump vec2 vPosition = aPosition * visualSize;
72 #endif
73
74   vec4 finalPixelArea = pixelArea;
75 #ifdef IS_REQUIRED_ALPHA_MASKING
76   finalPixelArea = mix(pixelArea,
77                        vec4(
78                             vec2(0.5) + (pixelArea.xy - vec2(0.5)) * maskTextureRatio,
79                             pixelArea.zw * maskTextureRatio
80                        ),
81                        cropToMask);
82   vMaskTexCoord = pixelArea.xy + pixelArea.zw * (vec2(0.5) + aPosition.xy
83 #ifdef IS_REQUIRED_BORDERLINE
84                                                   * (1.0 +  outerBorderlineSize / visualSize)
85 #endif
86                                                 );
87 #endif
88   vTexCoord = finalPixelArea.xy + finalPixelArea.zw * (vec2(0.5) + aPosition.xy
89 #ifdef IS_REQUIRED_BORDERLINE
90                                                         * (1.0 + outerBorderlineSize / visualSize)
91 #endif
92                                                       );
93
94   return vec4(vPosition + anchorPoint * visualSize + visualOffset + origin * uSize.xy, 0.0, 1.0);
95 }
96
97 void main()
98 {
99   gl_Position = uMvpMatrix * ComputeVertexPosition();
100 }