ControlRenderer & RendererFactory for Toolkit Controls
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-RendererFactory.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <dali/devel-api/rendering/renderer.h>
21 #include <dali/devel-api/rendering/material.h>
22 #include <dali/devel-api/rendering/shader.h>
23 #include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
24
25 using namespace Dali;
26 using namespace Dali::Toolkit;
27
28 void dali_renderer_factory_startup(void)
29 {
30   test_return_value = TET_UNDEF;
31 }
32
33 void dali_renderer_factory_cleanup(void)
34 {
35   test_return_value = TET_PASS;
36 }
37
38 int UtcDaliRendererFactoryGet(void)
39 {
40   ToolkitTestApplication application;
41   tet_infoline( "UtcDaliRendererFactory" );
42
43   //Register type
44   TypeInfo type;
45   type = TypeRegistry::Get().GetTypeInfo( "RendererFactory" );
46   DALI_TEST_CHECK( type );
47   BaseHandle handle = type.CreateInstance();
48   DALI_TEST_CHECK( handle );
49
50   RendererFactory factory;
51   factory = RendererFactory::Get();
52   DALI_TEST_CHECK( factory );
53
54   RendererFactory newFactory = RendererFactory::Get();
55   DALI_TEST_CHECK( newFactory );
56
57   // Check that renderer factory is a singleton
58   DALI_TEST_CHECK(factory == newFactory);
59
60   RendererFactory newFactory2(factory);
61   DALI_TEST_CHECK(factory == newFactory2);
62
63   END_TEST;
64 }
65
66 int UtcDaliRendererFactoryGetColorRenderer(void)
67 {
68   ToolkitTestApplication application;
69   tet_infoline( "UtcDaliRendererFactoryGetColorRenderer" );
70
71   RendererFactory factory = RendererFactory::Get();
72   DALI_TEST_CHECK( factory );
73
74   Property::Map propertyMap;
75   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
76   propertyMap.Insert("renderer-type", "color-renderer");
77   propertyMap.Insert("blend-color", testColor);
78
79   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
80   DALI_TEST_CHECK( controlRenderer );
81
82   Actor actor = Actor::New();
83   actor.SetSize(200.f, 200.f);
84   Stage::GetCurrent().Add( actor );
85   controlRenderer.SetSize(Vector2(200.f, 200.f));
86   controlRenderer.SetOnStage( actor );
87
88   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
89
90   TestGlAbstraction& gl = application.GetGlAbstraction();
91
92   application.SendNotification();
93   application.Render(0);
94
95   Vector4 actualValue(Vector4::ZERO);
96   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
97   DALI_TEST_EQUALS( actualValue, testColor, TEST_LOCATION );
98
99   Stage::GetCurrent().Remove( actor );
100   controlRenderer.SetOffStage( actor );
101   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
102
103   END_TEST;
104 }
105
106 int UtcDaliRendererFactoryGetLinearGradientRenderer(void)
107 {
108   ToolkitTestApplication application;
109   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
110
111   RendererFactory factory = RendererFactory::Get();
112   DALI_TEST_CHECK( factory );
113
114   Property::Map propertyMap;
115   propertyMap.Insert("renderer-type", "gradient-renderer");
116
117   Vector2 start(-1.f, -1.f);
118   Vector2 end(1.f, 1.f);
119   propertyMap.Insert("gradient-start-position", start);
120   propertyMap.Insert("gradient-end-position", end);
121   propertyMap.Insert("gradient-spread-method", "repeat");
122
123   Property::Array stopOffsets;
124   stopOffsets.PushBack( 0.2f );
125   stopOffsets.PushBack( 0.8f );
126   propertyMap.Insert("gradient-stop-offset", stopOffsets);
127
128   Property::Array stopColors;
129   stopColors.PushBack( Color::RED );
130   stopColors.PushBack( Color::GREEN );
131   propertyMap.Insert("gradient-stop-color", stopColors);
132
133   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
134   DALI_TEST_CHECK( controlRenderer );
135
136   Actor actor = Actor::New();
137   Vector2 size(200.f, 200.f);
138   actor.SetSize(size);
139   Stage::GetCurrent().Add( actor );
140   controlRenderer.SetOnStage( actor );
141   controlRenderer.SetSize(size);
142
143   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
144
145   // A lookup texture is generated and pass to shader as sampler
146   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
147
148   application.SendNotification();
149   application.Render(0);
150
151   Stage::GetCurrent().Remove( actor );
152   controlRenderer.SetOffStage( actor );
153   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
154
155   END_TEST;
156 }
157
158 int UtcDaliRendererFactoryGetRadialGradientRenderer(void)
159 {
160   ToolkitTestApplication application;
161   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
162
163   RendererFactory factory = RendererFactory::Get();
164   DALI_TEST_CHECK( factory );
165
166   Property::Map propertyMap;
167   propertyMap.Insert("renderer-type", "gradient-renderer");
168
169   Vector2 center(100.f, 100.f);
170   float radius = 100.f;
171   propertyMap.Insert("gradient-units", "user-space");
172   propertyMap.Insert("gradient-center", center);
173   propertyMap.Insert("gradient-radius", radius);
174
175   Property::Array stopOffsets;
176   stopOffsets.PushBack( 0.0f );
177   stopOffsets.PushBack( 1.f );
178   propertyMap.Insert("gradient-stop-offset", stopOffsets);
179
180   Property::Array stopColors;
181   stopColors.PushBack( Color::RED );
182   stopColors.PushBack( Color::GREEN );
183   propertyMap.Insert("gradient-stop-color", stopColors);
184
185   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
186   DALI_TEST_CHECK( controlRenderer );
187
188   Actor actor = Actor::New();
189   Vector2 size(200.f, 200.f);
190   actor.SetSize(size);
191   Stage::GetCurrent().Add( actor );
192   controlRenderer.SetSize(size);
193   controlRenderer.SetOnStage( actor );
194
195   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
196
197   // A lookup texture is generated and pass to shader as sampler
198   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
199
200   TestGlAbstraction& gl = application.GetGlAbstraction();
201   application.SendNotification();
202   application.Render(0);
203
204   Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f );
205   alignMatrix.Invert();
206
207   Matrix3 actualValue( Matrix3::IDENTITY );
208   DALI_TEST_CHECK( gl.GetUniformValue<Matrix3>( "uAlignmentMatrix", actualValue ) );
209   DALI_TEST_EQUALS( actualValue, alignMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
210
211   Stage::GetCurrent().Remove( actor );
212   controlRenderer.SetOffStage( actor );
213   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
214
215   END_TEST;
216 }