Implementation of ImageRenderer.
[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 namespace
29 {
30 const char* TEST_IMAGE_FILE_NAME =  "gallery_image_01.jpg";
31 } // namespace
32
33
34 void dali_renderer_factory_startup(void)
35 {
36   test_return_value = TET_UNDEF;
37 }
38
39 void dali_renderer_factory_cleanup(void)
40 {
41   test_return_value = TET_PASS;
42 }
43
44 int UtcDaliRendererFactoryGet(void)
45 {
46   ToolkitTestApplication application;
47   tet_infoline( "UtcDaliRendererFactory" );
48
49   //Register type
50   TypeInfo type;
51   type = TypeRegistry::Get().GetTypeInfo( "RendererFactory" );
52   DALI_TEST_CHECK( type );
53   BaseHandle handle = type.CreateInstance();
54   DALI_TEST_CHECK( handle );
55
56   RendererFactory factory;
57   factory = RendererFactory::Get();
58   DALI_TEST_CHECK( factory );
59
60   RendererFactory newFactory = RendererFactory::Get();
61   DALI_TEST_CHECK( newFactory );
62
63   // Check that renderer factory is a singleton
64   DALI_TEST_CHECK(factory == newFactory);
65
66   END_TEST;
67 }
68
69 int UtcDaliRendererFactoryCopyAndAssignment(void)
70 {
71   ToolkitTestApplication application;
72   tet_infoline( "UtcDaliRendererFactoryCopyAndAssignment" );
73   RendererFactory factory = RendererFactory::Get();
74
75   RendererFactory factoryCopy( factory );
76   DALI_TEST_CHECK(factory == factoryCopy);
77
78   RendererFactory emptyFactory;
79   RendererFactory emptyFactoryCopy( emptyFactory );
80   DALI_TEST_CHECK(emptyFactory == emptyFactoryCopy);
81
82   RendererFactory factoryEquals;
83   factoryEquals = factory;
84   DALI_TEST_CHECK(factory == factoryEquals);
85
86   RendererFactory emptyFactoryEquals;
87   emptyFactoryEquals = emptyFactory;
88   DALI_TEST_CHECK( emptyFactory == emptyFactoryEquals );
89
90   //self assignment
91   factory = factory;
92   DALI_TEST_CHECK( factory = factoryCopy );
93
94   END_TEST;
95 }
96
97 int UtcDaliRendererFactoryGetColorRenderer(void)
98 {
99   ToolkitTestApplication application;
100   tet_infoline( "UtcDaliRendererFactoryGetColorRenderer" );
101
102   RendererFactory factory = RendererFactory::Get();
103   DALI_TEST_CHECK( factory );
104
105   Property::Map propertyMap;
106   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
107   propertyMap.Insert("renderer-type", "color-renderer");
108   propertyMap.Insert("blend-color", testColor);
109
110   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
111   DALI_TEST_CHECK( controlRenderer );
112
113   Actor actor = Actor::New();
114   actor.SetSize(200.f, 200.f);
115   Stage::GetCurrent().Add( actor );
116   controlRenderer.SetSize(Vector2(200.f, 200.f));
117   controlRenderer.SetOnStage( actor );
118
119   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
120
121   TestGlAbstraction& gl = application.GetGlAbstraction();
122
123   application.SendNotification();
124   application.Render(0);
125
126   Vector4 actualValue(Vector4::ZERO);
127   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
128   DALI_TEST_EQUALS( actualValue, testColor, TEST_LOCATION );
129
130   END_TEST;
131 }
132
133 int UtcDaliRendererFactoryGetLinearGradientRenderer(void)
134 {
135   ToolkitTestApplication application;
136   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
137
138   RendererFactory factory = RendererFactory::Get();
139   DALI_TEST_CHECK( factory );
140
141   Property::Map propertyMap;
142   propertyMap.Insert("renderer-type", "gradient-renderer");
143
144   Vector2 start(-1.f, -1.f);
145   Vector2 end(1.f, 1.f);
146   propertyMap.Insert("gradient-start-position", start);
147   propertyMap.Insert("gradient-end-position", end);
148   propertyMap.Insert("gradient-spread-method", "repeat");
149
150   Property::Array stopOffsets;
151   stopOffsets.PushBack( 0.2f );
152   stopOffsets.PushBack( 0.8f );
153   propertyMap.Insert("gradient-stop-offset", stopOffsets);
154
155   Property::Array stopColors;
156   stopColors.PushBack( Color::RED );
157   stopColors.PushBack( Color::GREEN );
158   propertyMap.Insert("gradient-stop-color", stopColors);
159
160   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
161   DALI_TEST_CHECK( controlRenderer );
162
163   Actor actor = Actor::New();
164   Vector2 size(200.f, 200.f);
165   actor.SetSize(size);
166   Stage::GetCurrent().Add( actor );
167   controlRenderer.SetOnStage( actor );
168   controlRenderer.SetSize(size);
169
170   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
171
172   // A lookup texture is generated and pass to shader as sampler
173   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
174
175   application.SendNotification();
176   application.Render(0);
177
178   END_TEST;
179 }
180
181 int UtcDaliRendererFactoryGetRadialGradientRenderer(void)
182 {
183   ToolkitTestApplication application;
184   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
185
186   RendererFactory factory = RendererFactory::Get();
187   DALI_TEST_CHECK( factory );
188
189   Property::Map propertyMap;
190   propertyMap.Insert("renderer-type", "gradient-renderer");
191
192   Vector2 center(100.f, 100.f);
193   float radius = 100.f;
194   propertyMap.Insert("gradient-units", "user-space");
195   propertyMap.Insert("gradient-center", center);
196   propertyMap.Insert("gradient-radius", radius);
197
198   Property::Array stopOffsets;
199   stopOffsets.PushBack( 0.0f );
200   stopOffsets.PushBack( 1.f );
201   propertyMap.Insert("gradient-stop-offset", stopOffsets);
202
203   Property::Array stopColors;
204   stopColors.PushBack( Color::RED );
205   stopColors.PushBack( Color::GREEN );
206   propertyMap.Insert("gradient-stop-color", stopColors);
207
208   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
209   DALI_TEST_CHECK( controlRenderer );
210
211   Actor actor = Actor::New();
212   Vector2 size(200.f, 200.f);
213   actor.SetSize(size);
214   Stage::GetCurrent().Add( actor );
215   controlRenderer.SetSize(size);
216   controlRenderer.SetOnStage( actor );
217
218   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
219
220   // A lookup texture is generated and pass to shader as sampler
221   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
222
223   TestGlAbstraction& gl = application.GetGlAbstraction();
224   application.SendNotification();
225   application.Render(0);
226
227   Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f );
228   alignMatrix.Invert();
229
230   Matrix3 actualValue( Matrix3::IDENTITY );
231   DALI_TEST_CHECK( gl.GetUniformValue<Matrix3>( "uAlignmentMatrix", actualValue ) );
232   DALI_TEST_EQUALS( actualValue, alignMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
233
234   END_TEST;
235 }
236
237 int UtcDaliRendererFactoryGetImageRenderer(void)
238 {
239   ToolkitTestApplication application;
240   tet_infoline( "UtcDaliRendererFactoryGetImageRenderer" );
241
242   RendererFactory factory = RendererFactory::Get();
243   DALI_TEST_CHECK( factory );
244
245   Property::Map propertyMap;
246   propertyMap.Insert( "renderer-type", "image-renderer" );
247   propertyMap.Insert( "image-url", TEST_IMAGE_FILE_NAME );
248
249   ControlRenderer controlRenderer = factory.GetControlRenderer( propertyMap );
250   DALI_TEST_CHECK( controlRenderer );
251
252   Actor actor = Actor::New();
253   actor.SetSize( 200.f, 200.f );
254   Stage::GetCurrent().Add( actor );
255   controlRenderer.SetSize( Vector2(200.f, 200.f) );
256   controlRenderer.SetOnStage( actor );
257
258   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
259   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
260
261   TestGlAbstraction& gl = application.GetGlAbstraction();
262   application.SendNotification();
263   application.Render();
264
265   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
266   if(request)
267   {
268     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)));
269   }
270
271   application.Render();
272   application.SendNotification();
273
274   DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc));
275
276   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
277
278   int textureUnit = -1;
279   DALI_TEST_CHECK( gl.GetUniformValue< int >( "sTexture", textureUnit ) );
280   DALI_TEST_EQUALS( textureUnit, 0, TEST_LOCATION );
281
282   END_TEST;
283 }