Marked new API's since 1.1.4
[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 UtcDaliRendererFactoryGetColorRenderer1(void)
98 {
99   ToolkitTestApplication application;
100   tet_infoline( "UtcDaliRendererFactoryGetColorRenderer1:  Request color renderer with a Property::Map" );
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 UtcDaliRendererFactoryGetColorRenderer2(void)
134 {
135   ToolkitTestApplication application;
136   tet_infoline( "UtcDaliRendererFactoryGetColorRenderer2: Request color renderer with a Vector4" );
137
138   RendererFactory factory = RendererFactory::Get();
139   DALI_TEST_CHECK( factory );
140
141   Vector4 testColor( 1.f, 0.5f, 0.3f, 0.2f );
142   ControlRenderer controlRenderer = factory.GetControlRenderer(testColor);
143   DALI_TEST_CHECK( controlRenderer );
144
145   Actor actor = Actor::New();
146   actor.SetSize(200.f, 200.f);
147   Stage::GetCurrent().Add( actor );
148   controlRenderer.SetSize(Vector2(200.f, 200.f));
149   controlRenderer.SetOnStage( actor );
150
151   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
152
153   TestGlAbstraction& gl = application.GetGlAbstraction();
154
155   application.SendNotification();
156   application.Render(0);
157
158   Vector4 actualValue(Vector4::ZERO);
159   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
160   DALI_TEST_EQUALS( actualValue, testColor, TEST_LOCATION );
161
162   END_TEST;
163 }
164
165 int UtcDaliRendererFactoryGetLinearGradientRenderer(void)
166 {
167   ToolkitTestApplication application;
168   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
169
170   RendererFactory factory = RendererFactory::Get();
171   DALI_TEST_CHECK( factory );
172
173   Property::Map propertyMap;
174   propertyMap.Insert("renderer-type", "gradient-renderer");
175
176   Vector2 start(-1.f, -1.f);
177   Vector2 end(1.f, 1.f);
178   propertyMap.Insert("gradient-start-position", start);
179   propertyMap.Insert("gradient-end-position", end);
180   propertyMap.Insert("gradient-spread-method", "repeat");
181
182   Property::Array stopOffsets;
183   stopOffsets.PushBack( 0.2f );
184   stopOffsets.PushBack( 0.8f );
185   propertyMap.Insert("gradient-stop-offset", stopOffsets);
186
187   Property::Array stopColors;
188   stopColors.PushBack( Color::RED );
189   stopColors.PushBack( Color::GREEN );
190   propertyMap.Insert("gradient-stop-color", stopColors);
191
192   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
193   DALI_TEST_CHECK( controlRenderer );
194
195   Actor actor = Actor::New();
196   Vector2 size(200.f, 200.f);
197   actor.SetSize(size);
198   Stage::GetCurrent().Add( actor );
199   controlRenderer.SetOnStage( actor );
200   controlRenderer.SetSize(size);
201
202   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
203
204   // A lookup texture is generated and pass to shader as sampler
205   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
206
207   application.SendNotification();
208   application.Render(0);
209
210   END_TEST;
211 }
212
213 int UtcDaliRendererFactoryGetRadialGradientRenderer(void)
214 {
215   ToolkitTestApplication application;
216   tet_infoline("UtcDaliRendererFactoryGetRadialGradientRenderer");
217
218   RendererFactory factory = RendererFactory::Get();
219   DALI_TEST_CHECK( factory );
220
221   Property::Map propertyMap;
222   propertyMap.Insert("renderer-type", "gradient-renderer");
223
224   Vector2 center(100.f, 100.f);
225   float radius = 100.f;
226   propertyMap.Insert("gradient-units", "user-space");
227   propertyMap.Insert("gradient-center", center);
228   propertyMap.Insert("gradient-radius", radius);
229
230   Property::Array stopOffsets;
231   stopOffsets.PushBack( 0.0f );
232   stopOffsets.PushBack( 1.f );
233   propertyMap.Insert("gradient-stop-offset", stopOffsets);
234
235   Property::Array stopColors;
236   stopColors.PushBack( Color::RED );
237   stopColors.PushBack( Color::GREEN );
238   propertyMap.Insert("gradient-stop-color", stopColors);
239
240   ControlRenderer controlRenderer = factory.GetControlRenderer(propertyMap);
241   DALI_TEST_CHECK( controlRenderer );
242
243   Actor actor = Actor::New();
244   Vector2 size(200.f, 200.f);
245   actor.SetSize(size);
246   Stage::GetCurrent().Add( actor );
247   controlRenderer.SetSize(size);
248   controlRenderer.SetOnStage( actor );
249
250   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
251
252   // A lookup texture is generated and pass to shader as sampler
253   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
254
255   TestGlAbstraction& gl = application.GetGlAbstraction();
256   application.SendNotification();
257   application.Render(0);
258
259   Matrix3 alignMatrix( radius, 0.f, 0.f, 0.f, radius, 0.f, center.x, center.y, 1.f );
260   alignMatrix.Invert();
261
262   Matrix3 actualValue( Matrix3::IDENTITY );
263   DALI_TEST_CHECK( gl.GetUniformValue<Matrix3>( "uAlignmentMatrix", actualValue ) );
264   DALI_TEST_EQUALS( actualValue, alignMatrix, Math::MACHINE_EPSILON_100, TEST_LOCATION );
265
266   END_TEST;
267 }
268
269 int UtcDaliRendererFactoryGetImageRenderer1(void)
270 {
271   ToolkitTestApplication application;
272   tet_infoline( "UtcDaliRendererFactoryGetImageRenderer1: Request image renderer with a Property::Map" );
273
274   RendererFactory factory = RendererFactory::Get();
275   DALI_TEST_CHECK( factory );
276
277   Property::Map propertyMap;
278   propertyMap.Insert( "renderer-type", "image-renderer" );
279   propertyMap.Insert( "image-url", TEST_IMAGE_FILE_NAME );
280
281   ControlRenderer controlRenderer = factory.GetControlRenderer( propertyMap );
282   DALI_TEST_CHECK( controlRenderer );
283
284   Actor actor = Actor::New();
285   actor.SetSize( 200.f, 200.f );
286   Stage::GetCurrent().Add( actor );
287   controlRenderer.SetSize( Vector2(200.f, 200.f) );
288   controlRenderer.SetOnStage( actor );
289
290   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
291   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
292
293   TestGlAbstraction& gl = application.GetGlAbstraction();
294   application.SendNotification();
295   application.Render();
296
297   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
298   if(request)
299   {
300     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)));
301   }
302
303   application.Render();
304   application.SendNotification();
305
306   DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc));
307
308   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
309
310   int textureUnit = -1;
311   DALI_TEST_CHECK( gl.GetUniformValue< int >( "sTexture", textureUnit ) );
312   DALI_TEST_EQUALS( textureUnit, 0, TEST_LOCATION );
313
314   END_TEST;
315 }
316
317 int UtcDaliRendererFactoryGetImageRenderer2(void)
318 {
319   ToolkitTestApplication application;
320   tet_infoline( "UtcDaliRendererFactoryGetImageRenderer2: Request image renderer with an image handle" );
321
322   RendererFactory factory = RendererFactory::Get();
323   DALI_TEST_CHECK( factory );
324
325   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
326   ControlRenderer controlRenderer = factory.GetControlRenderer( image );
327
328   Actor actor = Actor::New();
329   actor.SetSize( 200.f, 200.f );
330   Stage::GetCurrent().Add( actor );
331   controlRenderer.SetSize( Vector2(200.f, 200.f) );
332   controlRenderer.SetOnStage( actor );
333
334   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
335   DALI_TEST_CHECK( actor.GetRendererAt(0u).GetMaterial().GetNumberOfSamplers() == 1u );
336
337   TestGlAbstraction& gl = application.GetGlAbstraction();
338   application.SendNotification();
339   application.Render();
340
341   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
342   if(request)
343   {
344     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)));
345   }
346
347   application.Render();
348   application.SendNotification();
349
350   DALI_TEST_CHECK(application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc));
351
352   int textureUnit = -1;
353   DALI_TEST_CHECK( gl.GetUniformValue< int >( "sTexture", textureUnit ) );
354   DALI_TEST_EQUALS( textureUnit, 0, TEST_LOCATION );
355
356   END_TEST;
357 }
358
359 int UtcDaliRendererFactoryResetRenderer1(void)
360 {
361   ToolkitTestApplication application;
362   tet_infoline( "UtcDaliRendererFactoryResetRenderer1" );
363
364   Actor actor = Actor::New();
365   actor.SetSize(200.f, 200.f);
366   Stage::GetCurrent().Add( actor );
367
368   RendererFactory factory = RendererFactory::Get();
369   DALI_TEST_CHECK( factory );
370
371   ControlRenderer controlRenderer = factory.GetControlRenderer( Color::RED );
372   DALI_TEST_CHECK( controlRenderer );
373   controlRenderer.SetSize(Vector2(200.f, 200.f));
374   controlRenderer.SetOnStage( actor );
375   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
376
377   TestGlAbstraction& gl = application.GetGlAbstraction();
378   application.SendNotification();
379   application.Render(0);
380   Vector4 actualValue(Vector4::ZERO);
381   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
382   DALI_TEST_EQUALS( actualValue, Color::RED, TEST_LOCATION );
383
384   bool isNewRenderer = factory.ResetRenderer( controlRenderer, Color::GREEN );
385   DALI_TEST_CHECK( !isNewRenderer );
386   application.SendNotification();
387   application.Render(0);
388   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
389   DALI_TEST_EQUALS( actualValue, Color::GREEN, TEST_LOCATION );
390
391   Image bufferImage = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
392   isNewRenderer = factory.ResetRenderer( controlRenderer, bufferImage );
393   DALI_TEST_CHECK( isNewRenderer );
394
395   Actor actor2 = Actor::New();
396   actor2.SetSize(200.f, 200.f);
397   Stage::GetCurrent().Add( actor2 );
398   controlRenderer.SetSize(Vector2(200.f, 200.f));
399   controlRenderer.SetOnStage( actor2 );
400   application.SendNotification();
401   application.Render(0);
402   Image samplerImage = actor2.GetRendererAt(0u).GetMaterial().GetSamplerAt(0u).GetImage();
403   DALI_TEST_CHECK( BufferImage::DownCast( samplerImage ) );
404
405   END_TEST;
406 }
407
408 int UtcDaliRendererFactoryResetRenderer2(void)
409 {
410   ToolkitTestApplication application;
411   tet_infoline( "UtcDaliRendererFactoryResetRenderer2" );
412
413   Actor actor = Actor::New();
414   actor.SetSize(200.f, 200.f);
415   Stage::GetCurrent().Add( actor );
416   RendererFactory factory = RendererFactory::Get();
417   DALI_TEST_CHECK( factory );
418
419   Image resourceImage = ResourceImage::New(TEST_IMAGE_FILE_NAME);
420   ControlRenderer controlRenderer = factory.GetControlRenderer( resourceImage );
421   DALI_TEST_CHECK( controlRenderer );
422   controlRenderer.SetSize(Vector2(200.f, 200.f));
423   controlRenderer.SetOnStage( actor );
424   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
425
426   application.SendNotification();
427   application.Render(0);
428   Image samplerImage = actor.GetRendererAt(0u).GetMaterial().GetSamplerAt(0u).GetImage();
429   DALI_TEST_CHECK( ResourceImage::DownCast( samplerImage ) );
430
431   Image bufferImage = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
432   bool isNewRenderer = factory.ResetRenderer( controlRenderer, bufferImage );
433   DALI_TEST_CHECK( !isNewRenderer );
434   application.SendNotification();
435   application.Render(0);
436   samplerImage = actor.GetRendererAt(0u).GetMaterial().GetSamplerAt(0u).GetImage();
437   DALI_TEST_CHECK( BufferImage::DownCast( samplerImage ) );
438
439   isNewRenderer = factory.ResetRenderer( controlRenderer, Color::RED );
440   DALI_TEST_CHECK( isNewRenderer );
441
442   Actor actor2 = Actor::New();
443   actor2.SetSize(200.f, 200.f);
444   Stage::GetCurrent().Add( actor2 );
445   controlRenderer.SetSize(Vector2(200.f, 200.f));
446   controlRenderer.SetOnStage( actor2 );
447   TestGlAbstraction& gl = application.GetGlAbstraction();
448   application.SendNotification();
449   application.Render(0);
450   Vector4 actualValue(Vector4::ZERO);
451   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "uBlendColor", actualValue ) );
452   DALI_TEST_EQUALS( actualValue, Color::RED, TEST_LOCATION );
453
454   END_TEST;
455 }