Refactoring ImageVisualShaderFactory::GetShader
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ImageVisual.cpp
1 /*
2  * Copyright (c) 2021 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 <vector>
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <toolkit-timer.h>
22 #include <toolkit-event-thread-callback.h>
23 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
24 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
25 #include <dali-toolkit/devel-api/controls/control-devel.h>
26 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
27 #include <dali-toolkit/devel-api/image-loader/texture-manager.h>
28 #include <dali-toolkit/public-api/image-loader/image.h>
29 #include <dali-toolkit/public-api/image-loader/image-url.h>
30 #include <dali-toolkit/dali-toolkit.h>
31
32 #include <test-encoded-image-buffer.h>
33 #include "dummy-control.h"
34 #include "test-native-image-source.h"
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void dali_image_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_image_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 namespace
50 {
51 const char* TEST_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/gallery-small-1.jpg";
52 const char* TEST_BROKEN_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/a-random-nonimage.jpg";
53 const char* TEST_LARGE_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/tbcol.png";
54 const char* TEST_SMALL_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/icon-edit.png";
55 const char* TEST_REMOTE_IMAGE_FILE_NAME = "https://www.tizen.org/sites/all/themes/tizen_theme/logo.png";
56 const char* TEST_INVALID_FILE_NAME =  TEST_RESOURCE_DIR  "/invalid.jpg";
57 const char* TEST_REMOTE_INVALID_FILE_NAME = "https://www.tizen.org/invalid.png";
58 const char* TEST_MASK_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/mask.png";
59 const char* TEST_ROTATED_IMAGE =  TEST_RESOURCE_DIR  "/keyboard-Landscape.jpg";
60
61
62 bool gResourceReadySignalFired = false;
63 std::vector<int> gReadyIds = {};
64 void ResourceReadySignal( Control control )
65 {
66   gResourceReadySignalFired = true;
67   gReadyIds.push_back(control.GetProperty< int >( Actor::Property::ID ));
68 }
69 void ClearReadyIds()
70 {
71   gReadyIds.clear();
72 }
73
74 Actor CreateActorWithImageVisual(const Property::Map& map)
75 {
76   VisualFactory factory = VisualFactory::Get();
77   DummyControl actor = DummyControl::New();
78   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
79   Visual::Base visual = factory.CreateVisual( map );
80   DALI_TEST_CHECK( visual );
81   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
82   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
83   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
84   return actor;
85 }
86
87
88 Visual::Base CreateVisualWithPolicy( const char* url, Property::Index key, const Property::Value& value )
89 {
90   VisualFactory factory = VisualFactory::Get();
91
92   Property::Map propertyMap;
93   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
94   propertyMap.Insert( ImageVisual::Property::URL,  url );
95   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
96   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
97   propertyMap.Insert( key , value );
98
99   return factory.CreateVisual( propertyMap );
100 }
101
102 } // namespace
103
104 void TestVisualRender( ToolkitTestApplication& application,
105                        DummyControl& actor,
106                        Visual::Base& visual,
107                        std::size_t expectedSamplers = 0,
108                        ImageDimensions imageDimensions = ImageDimensions(),
109                        Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
110 {
111   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
112   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
113
114   if( resourcePtr )
115   {
116     // set the image size, for test case, this needs to be set before loading started
117     application.GetPlatform().SetClosestImageSize(  Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) );
118   }
119
120   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
121   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
122
123   application.GetScene().Add( actor );
124
125   application.SendNotification(); // Send messages to update
126   application.Render();           // process update and render
127   application.SendNotification(); // process any signals to event
128
129   if( resourcePtr )
130   {
131     DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION);
132   }
133
134   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
135 }
136
137 static void TestMixColor( Visual::Base visual, Property::Index mixColorIndex, const Vector4& testColor )
138 {
139   Property::Map map;
140   visual.CreatePropertyMap(map);
141   Property::Value* value = map.Find( mixColorIndex );
142   DALI_TEST_CHECK( value );
143   Vector3 mixColor1;
144   DALI_TEST_CHECK( value->Get( mixColor1 ) );
145   DALI_TEST_EQUALS( mixColor1, Vector3(testColor), 0.001, TEST_LOCATION );
146
147   value = map.Find( Visual::Property::MIX_COLOR );
148   DALI_TEST_CHECK( value );
149   Vector4 mixColor2;
150   DALI_TEST_CHECK( value->Get( mixColor2 ) );
151   DALI_TEST_EQUALS( mixColor2, testColor, 0.001, TEST_LOCATION );
152
153   value = map.Find( Visual::Property::OPACITY );
154   DALI_TEST_CHECK( value );
155   float opacity;
156   DALI_TEST_CHECK( value->Get( opacity ) );
157   DALI_TEST_EQUALS( opacity, testColor.a, 0.001, TEST_LOCATION );
158 }
159
160
161
162 int UtcDaliImageVisualPropertyMap(void)
163 {
164   ToolkitTestApplication application;
165   tet_infoline( "Request image visual with a Property::Map" );
166
167   VisualFactory factory = VisualFactory::Get();
168   DALI_TEST_CHECK( factory );
169   factory.SetPreMultiplyOnLoad( true );
170
171   Property::Map propertyMap;
172   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
173   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
174
175   Visual::Base visual = factory.CreateVisual( propertyMap );
176   DALI_TEST_CHECK( visual );
177
178   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
179   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
180
181   TestGlAbstraction& gl = application.GetGlAbstraction();
182   TraceCallStack& textureTrace = gl.GetTextureTrace();
183   textureTrace.Enable(true);
184
185   DummyControl actor = DummyControl::New();
186   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
187   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
188
189   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
190   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
191
192   application.GetScene().Add( actor );
193   application.SendNotification();
194   application.Render();
195
196   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
197
198   application.SendNotification();
199   application.Render();
200
201   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
202   auto renderer = actor.GetRendererAt(0);
203   auto preMultipliedIndex = renderer.GetPropertyIndex( "preMultipliedAlpha" );
204   DALI_TEST_CHECK( preMultipliedIndex != Property::INVALID_INDEX );
205   auto preMultipliedAlpha = renderer.GetProperty<float>( preMultipliedIndex );
206   auto preMultipliedAlpha2 = renderer.GetProperty<bool>( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
207   DALI_TEST_EQUALS( preMultipliedAlpha, 1.0f, TEST_LOCATION );
208   DALI_TEST_EQUALS( preMultipliedAlpha2, true, TEST_LOCATION );
209   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
210
211   application.GetScene().Remove( actor );
212   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
213
214   END_TEST;
215 }
216
217
218 int UtcDaliImageVisualNoPremultipliedAlpha01(void)
219 {
220   ToolkitTestApplication application;
221   tet_infoline( "Request image visual without pre-multiplied alpha" );
222
223   VisualFactory factory = VisualFactory::Get();
224   DALI_TEST_CHECK( factory );
225   factory.SetPreMultiplyOnLoad( false );
226
227   Property::Map propertyMap;
228   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
229   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
230
231   Visual::Base visual = factory.CreateVisual( propertyMap );
232   DALI_TEST_CHECK( visual );
233
234   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
235   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
236
237   TestGlAbstraction& gl = application.GetGlAbstraction();
238   TraceCallStack& textureTrace = gl.GetTextureTrace();
239   textureTrace.Enable(true);
240
241   DummyControl actor = DummyControl::New();
242   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
243   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
244
245   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
246   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
247
248   application.GetScene().Add( actor );
249   application.SendNotification();
250   application.Render();
251
252   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
253
254   application.SendNotification();
255   application.Render();
256
257   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
258   auto renderer = actor.GetRendererAt(0);
259   auto preMultipliedIndex = renderer.GetPropertyIndex( "preMultipliedAlpha" );
260   DALI_TEST_CHECK( preMultipliedIndex != Property::INVALID_INDEX );
261   auto preMultipliedAlpha = renderer.GetProperty<bool>( preMultipliedIndex );
262   auto preMultipliedAlpha2 = renderer.GetProperty<bool>( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
263
264   DALI_TEST_EQUALS( preMultipliedAlpha, false, TEST_LOCATION );
265   DALI_TEST_EQUALS( preMultipliedAlpha2, false, TEST_LOCATION );
266
267   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
268
269   application.GetScene().Remove( actor );
270   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
271
272   END_TEST;
273 }
274
275
276 int UtcDaliImageVisualNoPremultipliedAlpha02(void)
277 {
278   ToolkitTestApplication application;
279   tet_infoline( "Request image visual with no alpha channel" );
280
281   VisualFactory factory = VisualFactory::Get();
282   DALI_TEST_CHECK( factory );
283
284   Property::Map propertyMap;
285   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
286   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
287
288   Visual::Base visual = factory.CreateVisual( propertyMap );
289   DALI_TEST_CHECK( visual );
290
291   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
292   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
293
294   TestGlAbstraction& gl = application.GetGlAbstraction();
295   TraceCallStack& textureTrace = gl.GetTextureTrace();
296   textureTrace.Enable(true);
297
298   DummyControl actor = DummyControl::New();
299   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
300   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
301
302   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
303   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
304
305   application.GetScene().Add( actor );
306   application.SendNotification();
307   application.Render();
308
309   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
310
311   application.SendNotification();
312   application.Render();
313
314   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
315   auto renderer = actor.GetRendererAt(0);
316   auto preMultipliedIndex = renderer.GetPropertyIndex( "preMultipliedAlpha" );
317   DALI_TEST_CHECK( preMultipliedIndex != Property::INVALID_INDEX );
318   auto preMultipliedAlpha = renderer.GetProperty<bool>( preMultipliedIndex );
319   auto preMultipliedAlpha2 = renderer.GetProperty<bool>( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
320
321   DALI_TEST_EQUALS( preMultipliedAlpha, false, TEST_LOCATION );
322   DALI_TEST_EQUALS( preMultipliedAlpha2, false, TEST_LOCATION );
323
324   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
325
326   int srcFactorRgb    = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_RGB );
327   int destFactorRgb   = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_RGB );
328   int srcFactorAlpha  = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_ALPHA );
329   int destFactorAlpha = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_ALPHA );
330   DALI_TEST_CHECK( srcFactorRgb == BlendFactor::SRC_ALPHA );
331   DALI_TEST_CHECK( destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA );
332   DALI_TEST_CHECK( srcFactorAlpha == BlendFactor::ONE );
333   DALI_TEST_CHECK( destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA );
334
335   textureTrace.Reset();
336
337   // Make a new visual with the same image
338   Visual::Base newVisual = factory.CreateVisual( propertyMap );
339   DALI_TEST_CHECK( newVisual );
340
341   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
342   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
343
344   DummyControl newActor = DummyControl::New();
345   DummyControlImpl& newDummyImpl = static_cast< DummyControlImpl& >( newActor.GetImplementation() );
346   newDummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, newVisual );
347
348   newActor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
349   DALI_TEST_EQUALS( newActor.GetRendererCount(), 0u, TEST_LOCATION );
350
351   application.GetScene().Add( newActor );
352
353   application.SendNotification();
354   application.Render();
355
356   DALI_TEST_EQUALS( newActor.GetRendererCount(), 1u, TEST_LOCATION );
357   auto newRenderer = newActor.GetRendererAt( 0 );
358   preMultipliedIndex = newRenderer.GetPropertyIndex( "preMultipliedAlpha" );
359   DALI_TEST_CHECK( preMultipliedIndex != Property::INVALID_INDEX );
360   preMultipliedAlpha = newRenderer.GetProperty< bool >( preMultipliedIndex );
361   preMultipliedAlpha2 = newRenderer.GetProperty< bool >( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
362
363   DALI_TEST_EQUALS( preMultipliedAlpha, false, TEST_LOCATION );
364   DALI_TEST_EQUALS( preMultipliedAlpha2, false, TEST_LOCATION );
365
366   srcFactorRgb    = newRenderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_RGB );
367   destFactorRgb   = newRenderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_RGB );
368   srcFactorAlpha  = newRenderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_ALPHA );
369   destFactorAlpha = newRenderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_ALPHA );
370   DALI_TEST_CHECK( srcFactorRgb == BlendFactor::SRC_ALPHA );
371   DALI_TEST_CHECK( destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA );
372   DALI_TEST_CHECK( srcFactorAlpha == BlendFactor::ONE );
373   DALI_TEST_CHECK( destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA );
374
375   application.GetScene().Remove( actor );
376   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
377
378   END_TEST;
379 }
380
381
382 int UtcDaliImageVisualRemoteImageLoad(void)
383 {
384   ToolkitTestApplication application;
385   tet_infoline( "Request remote image visual with a Property::Map" );
386
387   VisualFactory factory = VisualFactory::Get();
388   DALI_TEST_CHECK( factory );
389
390   Property::Map propertyMap;
391   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
392   propertyMap.Insert( ImageVisual::Property::URL,  TEST_REMOTE_IMAGE_FILE_NAME );
393
394   Visual::Base visual = factory.CreateVisual( propertyMap );
395   DALI_TEST_CHECK( visual );
396
397   TestGlAbstraction& gl = application.GetGlAbstraction();
398   TraceCallStack& textureTrace = gl.GetTextureTrace();
399   textureTrace.Enable(true);
400
401   DummyControl actor = DummyControl::New();
402   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
403   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
404
405   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
406   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
407
408   application.GetScene().Add( actor );
409   application.SendNotification();
410
411   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
412
413   application.SendNotification();
414   application.Render();
415
416   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
417   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
418
419   application.GetScene().Remove( actor );
420   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
421
422   END_TEST;
423 }
424
425 int UtcDaliImageVisualWithNativeImage(void)
426 {
427   ToolkitTestApplication application;
428   tet_infoline( "Use Native Image as url" );
429
430   NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT);
431   ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource);
432   std::string url = imageUrl.GetUrl();
433
434   VisualFactory factory = VisualFactory::Get();
435   DALI_TEST_CHECK( factory );
436
437   Property::Map propertyMap;
438   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
439   propertyMap.Insert( ImageVisual::Property::URL,  url );
440
441   Visual::Base visual = factory.CreateVisual( propertyMap );
442   DALI_TEST_CHECK( visual );
443
444   DummyControl actor = DummyControl::New();
445   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
446   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
447
448   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
449
450   application.GetScene().Add( actor );
451
452   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
453
454   Renderer renderer = actor.GetRendererAt(0);
455   Shader shader = renderer.GetShader();
456
457   Property::Value value = shader.GetProperty(Shader::Property::PROGRAM);
458   DALI_TEST_CHECK(value.GetType() == Property::MAP);
459   const Property::Map* outMap = value.GetMap();
460   std::string fragmentShader = (*outMap)["fragment"].Get<std::string>();
461
462   const char* fragmentPrefix = Dali::NativeImageSourceTest::GetCustomFragmentPrefix();
463   size_t pos = fragmentShader.find(fragmentPrefix);
464
465   DALI_TEST_EQUALS( pos != std::string::npos, true, TEST_LOCATION );
466
467   END_TEST;
468 }
469
470 int UtcDaliImageVisualWithNativeImageCustomShader(void)
471 {
472   ToolkitTestApplication application;
473   tet_infoline( "Use Native Image as url and Use custom shader" );
474
475   NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT);
476   ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource);
477   std::string url = imageUrl.GetUrl();
478
479   VisualFactory factory = VisualFactory::Get();
480   DALI_TEST_CHECK( factory );
481
482   Property::Map propertyMap;
483   Property::Map shaderMap;
484   const std::string customVertexShaderSource = "Foobar";
485   const std::string customFragmentShaderSource = "Foobar";
486   shaderMap[Toolkit::Visual::Shader::Property::FRAGMENT_SHADER] = customFragmentShaderSource;
487   shaderMap[Toolkit::Visual::Shader::Property::VERTEX_SHADER] = customVertexShaderSource;
488
489   propertyMap.Insert( Toolkit::Visual::Property::TYPE,   Visual::IMAGE );
490   propertyMap.Insert( Toolkit::Visual::Property::SHADER, shaderMap );
491   propertyMap.Insert( ImageVisual::Property::URL,        url );
492
493   Visual::Base visual = factory.CreateVisual( propertyMap );
494   DALI_TEST_CHECK( visual );
495
496   DummyControl actor = DummyControl::New();
497   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
498   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
499
500   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
501   actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
502
503   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
504
505   application.GetScene().Add( actor );
506
507   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
508
509   application.SendNotification();
510   application.Render(16);
511
512   Renderer renderer = actor.GetRendererAt(0);
513   Shader shader = renderer.GetShader();
514
515   Property::Value value = shader.GetProperty(Shader::Property::PROGRAM);
516   DALI_TEST_CHECK(value.GetType() == Property::MAP);
517   const Property::Map* outMap = value.GetMap();
518   std::string fragmentShaderSource = (*outMap)["fragment"].Get<std::string>();
519   std::string vertexShaderSource = (*outMap)["vertex"].Get<std::string>();
520
521   // Compare vertex shader is equal
522   DALI_TEST_EQUALS( customVertexShaderSource, vertexShaderSource, TEST_LOCATION );
523
524   // Check fragment shader changed
525   const char* fragmentPrefix = Dali::NativeImageSourceTest::GetCustomFragmentPrefix();
526   size_t pos = fragmentShaderSource.find(fragmentPrefix);
527
528   DALI_TEST_EQUALS( pos != std::string::npos, true, TEST_LOCATION );
529
530   DALI_TEST_EQUALS( std::string(fragmentPrefix) + customFragmentShaderSource, fragmentShaderSource, TEST_LOCATION );
531
532   END_TEST;
533 }
534
535 int UtcDaliImageVisualWithNativeImageRemoved(void)
536 {
537   ToolkitTestApplication application;
538   tet_infoline( "Use Native Image as url" );
539
540   TestGlAbstraction& gl = application.GetGlAbstraction();
541   TraceCallStack& textureTrace = gl.GetTextureTrace();
542   textureTrace.Enable(true);
543
544   NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT);
545   ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource);
546   std::string url = imageUrl.GetUrl();
547
548   VisualFactory factory = VisualFactory::Get();
549   DALI_TEST_CHECK( factory );
550
551   Property::Map propertyMap;
552   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
553   propertyMap.Insert( ImageVisual::Property::URL,  url );
554
555   Visual::Base visual = factory.CreateVisual( propertyMap );
556   DALI_TEST_CHECK( visual );
557
558   DummyControl actor = DummyControl::New();
559   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
560   dummyImpl.RegisterVisual(  DummyControl::Property::TEST_VISUAL, visual );
561
562   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
563
564   application.GetScene().Add( actor );
565   application.SendNotification();
566   application.Render();
567
568   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
569   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
570
571   tet_infoline( "No delete texture because reference count is not zero" );
572   imageUrl.Reset();
573   application.GetScene().Remove( actor );
574   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
575   application.SendNotification();
576   application.Render();
577
578   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
579   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
580
581   tet_infoline( "Delete texture because reference count is zero" );
582   visual.Reset();
583   application.SendNotification();
584   application.Render();
585
586   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
587
588   END_TEST;
589 }
590
591 int UtcDaliImageVisualWithEncodedImageBuffer(void)
592 {
593   ToolkitTestApplication application;
594   tet_infoline( "Use Encoded Image Buffer as url" );
595
596   EncodedImageBuffer rawBuffer = ConvertFileToEncodedImageBuffer(TEST_LARGE_IMAGE_FILE_NAME);
597   ImageUrl url = Dali::Toolkit::Image::GenerateUrl(rawBuffer);
598
599   VisualFactory factory = VisualFactory::Get();
600   DALI_TEST_CHECK( factory );
601
602   Property::Map propertyMap;
603   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
604   propertyMap.Insert( ImageVisual::Property::URL, url.GetUrl() );
605
606   Visual::Base visual = factory.CreateVisual( propertyMap );
607   DALI_TEST_CHECK( visual );
608
609   TestGlAbstraction& gl = application.GetGlAbstraction();
610   TraceCallStack& textureTrace = gl.GetTextureTrace();
611   textureTrace.Enable(true);
612
613   DummyControl actor = DummyControl::New();
614   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
615   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
616
617   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
618   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
619
620   application.GetScene().Add( actor );
621   application.SendNotification();
622
623   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
624
625   application.SendNotification();
626   application.Render();
627
628   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
629   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
630
631   application.GetScene().Remove( actor );
632   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
633
634   END_TEST;
635 }
636
637 int UtcDaliImageVisualWithEncodedImageBufferRemoved(void)
638 {
639   ToolkitTestApplication application;
640   tet_infoline( "Use Encoded Image Buffer as url" );
641
642   TestGlAbstraction& gl = application.GetGlAbstraction();
643   TraceCallStack& textureTrace = gl.GetTextureTrace();
644   textureTrace.Enable(true);
645
646   EncodedImageBuffer rawBuffer = ConvertFileToEncodedImageBuffer(TEST_LARGE_IMAGE_FILE_NAME);
647   ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(rawBuffer);
648   std::string url = imageUrl.GetUrl();
649
650   VisualFactory factory = VisualFactory::Get();
651   DALI_TEST_CHECK( factory );
652
653   Property::Map propertyMap;
654   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
655   propertyMap.Insert( ImageVisual::Property::URL,  url );
656
657   Visual::Base visual = factory.CreateVisual( propertyMap );
658   DALI_TEST_CHECK( visual );
659
660   DummyControl actor = DummyControl::New();
661   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
662   dummyImpl.RegisterVisual(  DummyControl::Property::TEST_VISUAL, visual );
663
664   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
665
666   application.GetScene().Add( actor );
667   application.SendNotification();
668
669   // Wait for decode buffer and make texture.
670   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
671
672   application.SendNotification();
673   application.Render();
674
675   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
676   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
677
678   tet_infoline( "Delete texture because there is no actor to use decoded texture" );
679   imageUrl.Reset();
680   application.GetScene().Remove( actor );
681   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
682   application.SendNotification();
683   application.Render();
684
685   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
686   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
687
688   END_TEST;
689 }
690
691 int UtcDaliImageVisualTextureReuse1(void)
692 {
693   ToolkitTestApplication application;
694   tet_infoline( "Request remote image visual with a Property::Map; request a second visual with the same property map - should reuse texture" );
695
696   Property::Map propertyMap;
697   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
698   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
699   propertyMap.Insert( ImageVisual::Property::RELEASE_POLICY,  ImageVisual::ReleasePolicy::DETACHED );
700
701   TestGlAbstraction& gl = application.GetGlAbstraction();
702   TraceCallStack& textureTrace = gl.GetTextureTrace();
703   textureTrace.Enable(true);
704   TraceCallStack& drawTrace = gl.GetDrawTrace();
705   drawTrace.Enable(true);
706
707   Actor actor = CreateActorWithImageVisual( propertyMap );
708   application.GetScene().Add( actor );
709   application.SendNotification();
710
711   // Wait for image to load
712   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
713
714   application.SendNotification();
715   application.Render();
716
717   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
718   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
719   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
720   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
721   textureTrace.Reset();
722   drawTrace.Reset();
723
724   Actor actor2 = CreateActorWithImageVisual( propertyMap );
725   application.GetScene().Add(actor2);
726
727   application.SendNotification(); // Send messages to update
728   application.Render();           // process update and render
729   application.SendNotification(); // process any signals to event
730
731   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
732
733   tet_infoline("Test that 2 draw calls occur with no new texture gens/binds, i.e. both\n"
734                "draw calls use the same texture as the previous draw call\n" );
735
736   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
737   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
738   // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back.
739 //  DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION );
740
741   tet_infoline("Test that removing 1 actor doesn't delete the texture\n");
742
743   application.GetScene().Remove( actor );
744   application.SendNotification();
745   application.Render();
746
747   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
748   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
749
750   tet_infoline("Test that removing last actor does delete the texture\n");
751
752   application.GetScene().Remove( actor2 ); // Detaches remaining ImageVisual
753   application.SendNotification();
754   application.Render();
755
756   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
757   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
758
759   END_TEST;
760 }
761
762
763 int UtcDaliImageVisualTextureReuse2(void)
764 {
765   ToolkitTestApplication application;
766   tet_infoline( "Request remote image visual with a Property::Map; request a second visual with the same url but different property map - should create new texture" );
767
768   Property::Map propertyMap;
769   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
770   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
771
772   TestGlAbstraction& gl = application.GetGlAbstraction();
773   TraceCallStack& textureTrace = gl.GetTextureTrace();
774   textureTrace.Enable(true);
775   TraceCallStack& drawTrace = gl.GetDrawTrace();
776   drawTrace.Enable(true);
777
778   Actor actor = CreateActorWithImageVisual( propertyMap );
779   application.GetScene().Add( actor );
780   application.SendNotification();
781
782   // Wait for image to load
783   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
784
785   application.SendNotification();
786   application.Render();
787
788   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
789   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
790   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
791   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
792   textureTrace.Reset();
793   drawTrace.Reset();
794
795   propertyMap.Insert( ImageVisual::Property::SAMPLING_MODE, Dali::SamplingMode::NEAREST );
796   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 100 );
797   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100 );
798   Actor actor2 = CreateActorWithImageVisual( propertyMap );
799   application.GetScene().Add(actor2);
800
801   application.SendNotification();
802
803   // Wait for image to load
804   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
805
806   application.SendNotification();
807   application.Render();
808
809   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
810
811   tet_infoline("Test that 2 draw calls occur with 1 new texture gen/bind, i.e. both "
812                "renderers are using different textures\n" );
813
814   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
815   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
816   TraceCallStack::NamedParams tex1;
817   tex1["texture"] << 1;
818   TraceCallStack::NamedParams tex2;
819   tex2["texture"] << 2;
820   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex1), true, TEST_LOCATION );
821   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex2), true, TEST_LOCATION );
822
823   tet_infoline("Test that removing 1 actor deletes it's texture\n");
824
825   application.GetScene().Remove( actor );
826   application.SendNotification();
827   application.Render();
828
829   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
830   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
831
832   tet_infoline("Test that removing last actor deletes it's texture\n");
833
834   application.GetScene().Remove( actor2 );
835   application.SendNotification();
836   application.Render();
837
838   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
839   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 2, TEST_LOCATION );
840
841   END_TEST;
842 }
843
844
845 int UtcDaliImageVisualCustomWrapModePixelArea(void)
846 {
847   ToolkitTestApplication application;
848   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" );
849
850   static std::vector<UniformData> customUniforms =
851   {
852     UniformData("pixelArea", Property::Type::VECTOR4),
853     UniformData("wrapMode", Property::Type::VECTOR2),
854   };
855
856   TestGraphicsController& graphics = application.GetGraphicsController();
857   graphics.AddCustomUniforms(customUniforms);
858
859   VisualFactory factory = VisualFactory::Get();
860   DALI_TEST_CHECK( factory );
861
862   // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
863   const int width=34;
864   const int height=34;
865   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
866
867   Property::Map propertyMap;
868   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
869   propertyMap.Insert( ImageVisual::Property::URL, TEST_SMALL_IMAGE_FILE_NAME );
870   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
871   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
872   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
873   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
874   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
875   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
876   propertyMap.Insert( ImageVisual::Property::ATLASING, true );
877
878   Visual::Base visual = factory.CreateVisual( propertyMap );
879   DALI_TEST_CHECK( visual );
880
881   TestGlAbstraction& gl = application.GetGlAbstraction();
882   TraceCallStack& textureTrace = gl.GetTextureTrace();
883   textureTrace.Enable(true);
884   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
885   texParameterTrace.Enable( true );
886
887   DummyControl actor = DummyControl::New();
888   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
889   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
890   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
891   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
892   application.GetScene().Add( actor );
893
894   // loading started
895   application.SendNotification();
896   application.Render();
897
898   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
899
900   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
901
902   // WITH atlasing, the wrapping is handled manually in shader, so the following gl function should not be called
903   std::stringstream out;
904   out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
905   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
906   out.str("");
907   out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
908   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
909
910   // test the uniforms which used to handle the wrap mode
911   Renderer renderer = actor.GetRendererAt( 0u );
912   DALI_TEST_CHECK( renderer );
913
914   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
915   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
916   Vector4 pixelAreaUniform;
917   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
918   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
919
920   Property::Value wrapModeValue = renderer.GetProperty( renderer.GetPropertyIndex( "wrapMode" ) );
921   Vector2 wrapMode( WrapMode::MIRRORED_REPEAT-1, WrapMode::REPEAT-1 );
922   DALI_TEST_EQUALS( wrapModeValue.Get<Vector2>(), wrapMode, TEST_LOCATION );
923   Vector2 wrapModeUniform;
924   DALI_TEST_CHECK( gl.GetUniformValue<Vector2>( "wrapMode", wrapModeUniform ) );
925   DALI_TEST_EQUALS( wrapMode, wrapModeUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
926
927   actor.Unparent( );
928   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
929
930   END_TEST;
931 }
932
933 int UtcDaliImageVisualCustomWrapModeNoAtlas(void)
934 {
935   ToolkitTestApplication application;
936   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" );
937
938   static std::vector<UniformData> customUniforms =
939   {
940     UniformData("pixelArea", Property::Type::VECTOR4),
941   };
942
943   TestGraphicsController& graphics = application.GetGraphicsController();
944   graphics.AddCustomUniforms(customUniforms);
945
946   VisualFactory factory = VisualFactory::Get();
947   DALI_TEST_CHECK( factory );
948
949   // Test wrap mode without atlasing. Image with a size bigger than 512*512 will NOT be uploaded as a part of the atlas.
950   const int width=600;
951   const int height=600;
952   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
953
954   Property::Map propertyMap;
955   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
956   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
957   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
958   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
959   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
960   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
961   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
962   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
963
964   Visual::Base visual = factory.CreateVisual( propertyMap );
965   DALI_TEST_CHECK( visual );
966
967   TestGlAbstraction& gl = application.GetGlAbstraction();
968   TraceCallStack& textureTrace = gl.GetTextureTrace();
969   textureTrace.Enable(true);
970   textureTrace.EnableLogging(true);
971   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
972   texParameterTrace.Enable( true );
973   texParameterTrace.EnableLogging( true );
974
975   DummyControl actor = DummyControl::New();
976   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
977   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
978   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
979   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
980   application.GetScene().Add( actor );
981
982   // loading started
983   application.SendNotification();
984   application.Render();
985   application.SendNotification();
986
987   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
988
989   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
990
991   // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters
992   std::stringstream out;
993   out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
994   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
995   out.str("");
996   out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
997   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
998
999   // test the uniforms which used to handle the wrap mode
1000   Renderer renderer = actor.GetRendererAt( 0u );
1001   DALI_TEST_CHECK( renderer );
1002
1003   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
1004   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
1005   Vector4 pixelAreaUniform;
1006   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
1007   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
1008
1009   Property::Index wrapModeIndex = renderer.GetPropertyIndex( "wrapMode" );
1010   DALI_TEST_CHECK(wrapModeIndex == Property::INVALID_INDEX);
1011
1012   actor.Unparent();
1013   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1014
1015   END_TEST;
1016 }
1017
1018 int UtcDaliImageVisualAnimateMixColor(void)
1019 {
1020   ToolkitTestApplication application;
1021   tet_infoline( "Animate mix color" );
1022
1023   static std::vector<UniformData> customUniforms =
1024   {
1025     UniformData("mixColor", Property::Type::VECTOR3),
1026   };
1027
1028   TestGraphicsController& graphics = application.GetGraphicsController();
1029   graphics.AddCustomUniforms(customUniforms);
1030
1031   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
1032
1033   VisualFactory factory = VisualFactory::Get();
1034   Property::Map propertyMap;
1035   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
1036   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1037   propertyMap.Insert("mixColor", Color::BLUE);
1038   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
1039   Visual::Base visual = factory.CreateVisual( propertyMap );
1040
1041   DummyControl actor = DummyControl::New(true);
1042   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1043   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1044
1045   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
1046   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
1047   actor.SetProperty( Actor::Property::COLOR,Color::BLACK);
1048   application.GetScene().Add(actor);
1049
1050   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
1051
1052   Renderer renderer = actor.GetRendererAt(0);
1053   Property::Index index = renderer.GetPropertyIndex( Visual::Property::MIX_COLOR );
1054   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
1055   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
1056
1057   tet_infoline("Test that the renderer has the mixColor property");
1058   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
1059
1060   const Vector4 TARGET_MIX_COLOR( 1.0f, 0.0f, 0.0f, 0.5f );
1061
1062   Property::Map map;
1063   map["target"] = "testVisual";
1064   map["property"] = "mixColor";
1065   map["initialValue"] = Color::MAGENTA;
1066   map["targetValue"] = TARGET_MIX_COLOR;
1067   map["animator"] = Property::Map()
1068     .Add("alphaFunction", "LINEAR")
1069     .Add("timePeriod", Property::Map()
1070          .Add("delay", 0.0f)
1071          .Add("duration", 4.0f));
1072
1073   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
1074
1075   Animation animation = dummyImpl.CreateTransition( transition );
1076
1077   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
1078   animation.Play();
1079
1080   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1081   glAbstraction.EnableEnableDisableCallTrace( true );
1082   TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace();
1083   std::ostringstream blendStr;
1084   blendStr << std::hex << GL_BLEND;
1085
1086   application.SendNotification();
1087   application.Render(0); // Ensure animation starts
1088   application.Render(2000u); // Halfway point
1089   Vector3 testColor( 1.0f, 0.0f, 0.5f );
1090
1091   // uColor.a should be actor's alpha * mixColor.a.
1092   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>( "uColor", Vector4( 0.5f, 0.5f, 0.5f, 0.75f ) ), true, TEST_LOCATION );
1093   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>( "mixColor", testColor ), true, TEST_LOCATION );
1094
1095   DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) );
1096
1097   glEnableStack.Reset();
1098
1099   application.Render(2000u); // Halfway point between blue and white
1100
1101   DALI_TEST_EQUALS( actor.GetCurrentProperty< Vector4 >( Actor::Property::COLOR ), Color::WHITE, TEST_LOCATION );
1102   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>( "uColor", Vector4( 1.0f, 1.0f, 1.0f, 0.5f ) ), true, TEST_LOCATION );
1103   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>( "mixColor", Vector3( TARGET_MIX_COLOR ) ), true, TEST_LOCATION );
1104
1105   // GL_BLEND should not be changed: Keep enabled
1106   // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back.
1107 //  DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str().c_str() ) );
1108   DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) );
1109
1110   TestMixColor( visual, Visual::Property::MIX_COLOR, TARGET_MIX_COLOR );
1111
1112   END_TEST;
1113 }
1114
1115 int UtcDaliImageVisualAnimateOpacity(void)
1116 {
1117   ToolkitTestApplication application;
1118   tet_infoline( "Animate image visual opacity" );
1119
1120   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
1121
1122   VisualFactory factory = VisualFactory::Get();
1123   Property::Map propertyMap;
1124   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
1125   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1126   propertyMap.Insert("opacity", 0.5f);
1127   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
1128   Visual::Base visual = factory.CreateVisual( propertyMap );
1129
1130   DummyControl actor = DummyControl::New(true);
1131   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1132   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1133
1134   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
1135   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
1136   actor.SetProperty( Actor::Property::COLOR,Color::BLACK);
1137   application.GetScene().Add(actor);
1138
1139   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
1140
1141   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1142   glAbstraction.EnableEnableDisableCallTrace( true );
1143   TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace();
1144   std::ostringstream blendStr;
1145   blendStr << std::hex << GL_BLEND;
1146
1147   application.SendNotification();
1148   application.Render();
1149
1150   DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str()) );
1151
1152   {
1153     tet_infoline( "Test that the opacity can be increased to full via animation, and that the blend mode is set appropriately at the start and end of the animation." );
1154
1155     Property::Map map;
1156     map["target"] = "testVisual";
1157     map["property"] = "opacity";
1158     map["targetValue"] = 1.0f;
1159     map["animator"] = Property::Map()
1160       .Add("alphaFunction", "LINEAR")
1161       .Add("timePeriod", Property::Map()
1162            .Add("delay", 0.0f)
1163            .Add("duration", 4.0f));
1164
1165     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
1166     Animation animation = dummyImpl.CreateTransition( transition );
1167     animation.Play();
1168
1169     glEnableStack.Reset();
1170
1171     application.SendNotification();
1172     application.Render(0);     // Ensure animation starts
1173     application.Render(2000u); // Halfway point through animation
1174     application.SendNotification(); // Handle any signals
1175
1176     Vector4 color;
1177     DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1178     DALI_TEST_EQUALS( color.a, 0.75f, TEST_LOCATION );
1179
1180     application.Render(2001u); // end
1181     application.SendNotification(); // ensure animation finished signal is sent
1182
1183     DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1184     DALI_TEST_EQUALS( color.a, 1.0f, TEST_LOCATION );
1185
1186     // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back.
1187 //    DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str().c_str() ) );
1188     DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) );
1189   }
1190
1191
1192   {
1193     tet_infoline( "Test that the opacity can be reduced via animation, and that the blend mode is set appropriately at the start and end of the animation." );
1194
1195     Property::Map map;
1196     map["target"] = "testVisual";
1197     map["property"] = Visual::Property::OPACITY;
1198     map["targetValue"] = 0.1f;
1199     map["animator"] = Property::Map()
1200       .Add("alphaFunction", "LINEAR")
1201       .Add("timePeriod", Property::Map()
1202            .Add("delay", 0.0f)
1203            .Add("duration", 4.0f));
1204
1205     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
1206     Animation animation = dummyImpl.CreateTransition( transition );
1207     animation.Play();
1208
1209     glEnableStack.Reset();
1210
1211     application.SendNotification();
1212     application.Render(0);     // Ensure animation starts
1213     application.Render(2000u); // Halfway point
1214     application.SendNotification();
1215
1216     Vector4 color;
1217     DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1218     DALI_TEST_EQUALS( color.a, 0.55f, TEST_LOCATION );
1219
1220     DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) );
1221
1222     glEnableStack.Reset();
1223
1224     application.Render(2016u); // end
1225     application.SendNotification();
1226
1227     DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1228     DALI_TEST_EQUALS( color.a, 0.1f, TEST_LOCATION );
1229
1230     // GL_BLEND should not be changed: Keep enabled
1231 // @todo
1232 // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back.
1233 //    DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) );
1234     DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) );
1235   }
1236
1237   END_TEST;
1238 }
1239
1240
1241
1242 int UtcDaliImageVisualAnimateOpacity02(void)
1243 {
1244   ToolkitTestApplication application;
1245   tet_infoline( "Animate image visual opacity" );
1246
1247   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
1248
1249   VisualFactory factory = VisualFactory::Get();
1250   Property::Map propertyMap;
1251   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
1252   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1253   propertyMap.Insert("opacity", 0.5f);
1254   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
1255   Visual::Base visual = factory.CreateVisual( propertyMap );
1256
1257   DummyControl actor = DummyControl::New(true);
1258   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1259   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1260
1261   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
1262   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
1263   actor.SetProperty( Actor::Property::COLOR,Color::BLACK);
1264
1265   tet_infoline( "Test that the opacity doesn't animate when actor not staged" );
1266
1267   Property::Array array;
1268
1269   Property::Map map;
1270   map["target"] = "testVisual";
1271   map["property"] = "opacity";
1272   map["initialValue"] = 0.0f;
1273   map["targetValue"] = 1.0f;
1274   map["animator"] = Property::Map()
1275     .Add("alphaFunction", "LINEAR")
1276     .Add("timePeriod", Property::Map()
1277          .Add("delay", 0.0f)
1278          .Add("duration", 4.0f));
1279
1280   Property::Map map2;
1281   map2["target"] = "testVisual";
1282   map2["property"] = "size";
1283   map2["targetValue"] = Vector2(1.0f, 1.0f);
1284
1285   array.Add( map ).Add(map2);
1286
1287   Dali::Toolkit::TransitionData transition = TransitionData::New( array );
1288   Animation animation = dummyImpl.CreateTransition( transition );
1289
1290   application.GetScene().Add(actor);
1291   application.SendNotification();
1292   application.Render(0);     // Ensure animation starts
1293
1294   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
1295
1296   Renderer renderer = actor.GetRendererAt(0);
1297   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
1298   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
1299
1300   animation = dummyImpl.CreateTransition( transition );
1301   animation.Play();
1302
1303   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1304   glAbstraction.EnableEnableDisableCallTrace( true );
1305   TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace();
1306   std::ostringstream blendStr;
1307   blendStr << std::hex << GL_BLEND;
1308
1309   application.SendNotification();
1310   application.Render(0);     // Ensure animation starts
1311   application.Render(2000u); // Halfway point through animation
1312   application.SendNotification(); // Handle any signals
1313
1314   DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) );
1315
1316   Vector4 color;
1317   DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1318   DALI_TEST_EQUALS( color.a, 0.5f, TEST_LOCATION );
1319
1320   glEnableStack.Reset();
1321
1322   application.Render(2001u); // end
1323   application.SendNotification(); // ensure animation finished signal is sent
1324
1325   DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) );
1326   DALI_TEST_EQUALS( color.a, 1.0f, TEST_LOCATION );
1327
1328   DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) );
1329
1330   END_TEST;
1331 }
1332
1333
1334
1335 int UtcDaliImageVisualAnimatePixelArea(void)
1336 {
1337   ToolkitTestApplication application;
1338   tet_infoline( "ImageVisual animate pixel area" );
1339
1340   static std::vector<UniformData> customUniforms =
1341   {
1342     UniformData("pixelArea", Property::Type::VECTOR4),
1343   };
1344
1345   TestGraphicsController& graphics = application.GetGraphicsController();
1346   graphics.AddCustomUniforms(customUniforms);
1347
1348   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
1349
1350   VisualFactory factory = VisualFactory::Get();
1351   Property::Map propertyMap;
1352   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
1353   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1354   propertyMap.Insert("mixColor", Color::BLUE);
1355   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
1356   Visual::Base visual = factory.CreateVisual( propertyMap );
1357
1358   DummyControl actor = DummyControl::New(true);
1359   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1360   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1361
1362   actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) );
1363   actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER);
1364   actor.SetProperty( Actor::Property::COLOR,Color::BLACK);
1365   application.GetScene().Add(actor);
1366
1367   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
1368
1369   Renderer renderer = actor.GetRendererAt(0);
1370   Property::Index index = renderer.GetPropertyIndex( Visual::Property::MIX_COLOR );
1371
1372   tet_infoline("Test that the renderer has the mixColor property");
1373   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
1374
1375   // TransitionData only takes string keys
1376   Property::Map map;
1377   map["target"] = "testVisual";
1378   map["property"] = "pixelArea";
1379   map["initialValue"] = Vector4( 0,0,0,1 );
1380   map["targetValue"] = Vector4( 0,0,1,1 ); // Animate width from zero to full
1381   map["animator"] = Property::Map()
1382     .Add("alphaFunction", "LINEAR")
1383     .Add("timePeriod", Property::Map()
1384          .Add("delay", 0.0f)
1385          .Add("duration", 4.0f));
1386
1387   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
1388
1389   Animation animation = dummyImpl.CreateTransition( transition );
1390   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
1391   animation.Play();
1392
1393   application.SendNotification();
1394   application.Render(0);     // Ensure animation starts
1395   application.Render(2000u); // Halfway point
1396
1397   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4(0.0f, 0.0f, 0.5f, 1.0f )), true, TEST_LOCATION );
1398
1399   application.Render(2000u); // End of animation
1400
1401   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4( 0.0f, 0.0f, 1.0f, 1.0f )), true, TEST_LOCATION );
1402
1403   END_TEST;
1404 }
1405
1406 int UtcDaliImageVisualTextureCancelRemoteLoad(void)
1407 {
1408   ToolkitTestApplication application;
1409   tet_infoline( "Request remote image visual, then destroy visual to cancel load" );
1410
1411   Property::Map propertyMap;
1412   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1413   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
1414
1415   TestGlAbstraction& gl = application.GetGlAbstraction();
1416   TraceCallStack& textureTrace = gl.GetTextureTrace();
1417   textureTrace.Enable(true);
1418   TraceCallStack& drawTrace = gl.GetDrawTrace();
1419   drawTrace.Enable(true);
1420
1421   Actor actor = CreateActorWithImageVisual( propertyMap );
1422   application.GetScene().Add( actor );
1423   application.SendNotification();
1424
1425   application.GetScene().Remove( actor );
1426   application.SendNotification();
1427
1428   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1429   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1430   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), false, TEST_LOCATION );
1431   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION );
1432
1433   END_TEST;
1434 }
1435
1436 int UtcDaliImageVisualTextureCancelAsyncLoad(void)
1437 {
1438   ToolkitTestApplication application;
1439   tet_infoline( "Load image asynchronously, cancel loading, then load again" );
1440
1441   VisualFactory factory = VisualFactory::Get();
1442   DALI_TEST_CHECK( factory );
1443
1444   Property::Map propertyMap;
1445   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1446   propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1447
1448   Visual::Base visual = factory.CreateVisual( propertyMap );
1449   DALI_TEST_CHECK( visual );
1450
1451   TestGlAbstraction& gl = application.GetGlAbstraction();
1452   TraceCallStack& textureTrace = gl.GetTextureTrace();
1453   textureTrace.Enable( true );
1454   TraceCallStack& drawTrace = gl.GetDrawTrace();
1455   drawTrace.Enable( true );
1456
1457   DummyControl actor = DummyControl::New();
1458   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1459   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
1460
1461   application.GetScene().Add( actor );
1462
1463   // Cancel loading
1464   application.GetScene().Remove( actor );
1465
1466   application.GetScene().Add( actor );
1467
1468   // Create another visual with the same image
1469   visual = factory.CreateVisual( propertyMap );
1470   DALI_TEST_CHECK( visual );
1471
1472   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
1473
1474   application.SendNotification();
1475   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1476
1477   application.SendNotification();
1478   application.Render();
1479
1480   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1481   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1482   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1483   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
1484
1485   END_TEST;
1486 }
1487
1488 int UtcDaliImageVisualSetInvalidAsyncImage(void)
1489 {
1490   ToolkitTestApplication application;
1491   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
1492
1493   VisualFactory factory = VisualFactory::Get();
1494   DALI_TEST_CHECK( factory );
1495
1496   Property::Map propertyMap;
1497   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
1498   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
1499
1500   Visual::Base visual = factory.CreateVisual( propertyMap );
1501   DALI_TEST_CHECK( visual );
1502
1503   TestGlAbstraction& gl = application.GetGlAbstraction();
1504   TraceCallStack& textureTrace = gl.GetTextureTrace();
1505   textureTrace.Enable(true);
1506
1507   DummyControl actor = DummyControl::New();
1508   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1509   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1510
1511   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1512   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1513
1514   application.GetScene().Add( actor );
1515
1516   application.SendNotification();
1517   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1518
1519   application.SendNotification();
1520   application.Render();
1521
1522   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1523   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1524
1525   application.GetScene().Remove( actor );
1526   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1527
1528   END_TEST;
1529 }
1530
1531 int UtcDaliImageVisualSetInvalidSyncImage(void)
1532 {
1533   ToolkitTestApplication application;
1534   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
1535
1536   VisualFactory factory = VisualFactory::Get();
1537   DALI_TEST_CHECK( factory );
1538
1539   Property::Map propertyMap;
1540   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
1541   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
1542   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
1543
1544   Visual::Base visual = factory.CreateVisual( propertyMap );
1545   DALI_TEST_CHECK( visual );
1546
1547   TestGlAbstraction& gl = application.GetGlAbstraction();
1548   TraceCallStack& textureTrace = gl.GetTextureTrace();
1549   textureTrace.Enable(true);
1550
1551   DummyControl actor = DummyControl::New();
1552   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1553   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1554
1555   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1556   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1557
1558   application.GetScene().Add( actor );
1559
1560   application.SendNotification();
1561   application.Render();
1562
1563   // Check resource status
1564   Visual::ResourceStatus status = actor.GetVisualResourceStatus(Control::CONTROL_PROPERTY_END_INDEX + 1);
1565   DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION);
1566
1567   // The broken image should be shown.
1568   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1569   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1570
1571   application.GetScene().Remove( actor );
1572   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1573
1574   END_TEST;
1575 }
1576
1577 int UtcDaliImageVisualSetInvalidRemoteImage(void)
1578 {
1579   ToolkitTestApplication application;
1580   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
1581
1582   VisualFactory factory = VisualFactory::Get();
1583   DALI_TEST_CHECK( factory );
1584
1585   // Local invalid file, asynchronous loading
1586   Property::Map propertyMap;
1587   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
1588   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_INVALID_FILE_NAME );
1589
1590   Visual::Base visual = factory.CreateVisual( propertyMap );
1591   DALI_TEST_CHECK( visual );
1592
1593   TestGlAbstraction& gl = application.GetGlAbstraction();
1594   TraceCallStack& textureTrace = gl.GetTextureTrace();
1595   textureTrace.Enable(true);
1596
1597   DummyControl actor = DummyControl::New();
1598   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1599   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1600
1601   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1602   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1603
1604   application.GetScene().Add( actor );
1605
1606   application.SendNotification();
1607   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1608
1609   application.SendNotification();
1610   application.Render();
1611
1612   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1613   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1614
1615   application.GetScene().Remove( actor );
1616   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1617
1618   END_TEST;
1619 }
1620
1621 int UtcDaliImageVisualAlphaMask(void)
1622 {
1623   ToolkitTestApplication application;
1624   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1625
1626   VisualFactory factory = VisualFactory::Get();
1627   DALI_TEST_CHECK( factory );
1628
1629   Property::Map propertyMap;
1630   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1631   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1632   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1633
1634   Visual::Base visual = factory.CreateVisual( propertyMap );
1635   DALI_TEST_CHECK( visual );
1636
1637   Property::Map testMap;
1638   visual.CreatePropertyMap(testMap);
1639   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1640
1641   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1642   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1643
1644   TestGlAbstraction& gl = application.GetGlAbstraction();
1645   TraceCallStack& textureTrace = gl.GetTextureTrace();
1646   textureTrace.Enable(true);
1647
1648   DummyControl actor = DummyControl::New();
1649   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1650   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1651
1652   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1653   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1654   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1655
1656   application.GetScene().Add( actor );
1657   application.SendNotification();
1658   application.Render();
1659
1660   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION );
1661
1662   application.SendNotification();
1663   application.Render();
1664
1665   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1666   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1667   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1668
1669   dummyImpl.UnregisterVisual(  Control::CONTROL_PROPERTY_END_INDEX + 1 );
1670   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1671
1672   END_TEST;
1673 }
1674
1675 int UtcDaliImageVisualSynchronousLoadAlphaMask(void)
1676 {
1677   ToolkitTestApplication application;
1678   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask with synchronous loading" );
1679
1680   VisualFactory factory = VisualFactory::Get();
1681   DALI_TEST_CHECK( factory );
1682
1683   Property::Map propertyMap;
1684   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1685   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1686   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1687   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
1688
1689   Visual::Base visual = factory.CreateVisual( propertyMap );
1690   DALI_TEST_CHECK( visual );
1691
1692   Property::Map testMap;
1693   visual.CreatePropertyMap(testMap);
1694   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1695
1696   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1697   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1698
1699   TestGlAbstraction& gl = application.GetGlAbstraction();
1700   TraceCallStack& textureTrace = gl.GetTextureTrace();
1701   textureTrace.Enable(true);
1702
1703   DummyControl actor = DummyControl::New();
1704   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1705   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1706
1707   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1708   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1709   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1710
1711   application.GetScene().Add( actor );
1712
1713   // Do not wait for any EventThreadTrigger in synchronous alpha mask.
1714
1715   application.SendNotification();
1716   application.Render();
1717
1718   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1719   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1720   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1721
1722   dummyImpl.UnregisterVisual(  Control::CONTROL_PROPERTY_END_INDEX + 1 );
1723   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1724
1725   END_TEST;
1726 }
1727
1728 int UtcDaliImageVisualRemoteAlphaMask(void)
1729 {
1730   ToolkitTestApplication application;
1731   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1732
1733   VisualFactory factory = VisualFactory::Get();
1734   DALI_TEST_CHECK( factory );
1735
1736   const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1737
1738   Property::Map propertyMap;
1739   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1740   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1741   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, MASK_IMAGE );
1742
1743   Visual::Base visual = factory.CreateVisual( propertyMap );
1744   DALI_TEST_CHECK( visual );
1745
1746   Property::Map testMap;
1747   visual.CreatePropertyMap(testMap);
1748
1749   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION );
1750
1751   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1752   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1753
1754   TestGlAbstraction& gl = application.GetGlAbstraction();
1755   TraceCallStack& textureTrace = gl.GetTextureTrace();
1756   textureTrace.Enable(true);
1757
1758   DummyControl actor = DummyControl::New();
1759   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1760   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1761
1762   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1763
1764   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1765   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1766
1767   application.GetScene().Add( actor );
1768   application.SendNotification();
1769   application.Render();
1770
1771   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION );
1772
1773   application.SendNotification();
1774   application.Render();
1775
1776   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1777   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1778   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1779
1780   END_TEST;
1781 }
1782
1783 int UtcDaliImageVisualAlphaMaskCrop(void)
1784 {
1785   ToolkitTestApplication application;
1786   tet_infoline( "Request image visual with an Alpha mask and scale/cropping" );
1787
1788   VisualFactory factory = VisualFactory::Get();
1789   DALI_TEST_CHECK( factory );
1790
1791   Property::Map propertyMap;
1792   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1793   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1794   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1795   propertyMap.Insert( ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f );
1796   propertyMap.Insert( ImageVisual::Property::CROP_TO_MASK, true );
1797
1798   Visual::Base visual = factory.CreateVisual( propertyMap );
1799   DALI_TEST_CHECK( visual );
1800
1801   Property::Map testMap;
1802   visual.CreatePropertyMap(testMap);
1803   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1804   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE), Property::Value(1.6f), TEST_LOCATION );
1805   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::CROP_TO_MASK),Property::Value(true), TEST_LOCATION );
1806
1807   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1808   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1809
1810   TestGlAbstraction& gl = application.GetGlAbstraction();
1811   TraceCallStack& textureTrace = gl.GetTextureTrace();
1812   textureTrace.Enable(true);
1813
1814   DummyControl actor = DummyControl::New();
1815   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1816   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1817
1818   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
1819   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1820   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1821
1822   application.GetScene().Add( actor );
1823   application.SendNotification();
1824   application.Render();
1825
1826   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION );
1827
1828   application.SendNotification();
1829   application.Render();
1830
1831   Vector2 size;
1832   visual.GetNaturalSize(size);
1833
1834   DALI_TEST_EQUALS( size, Vector2( 100.0f, 100.0f ), 0.001f, TEST_LOCATION );
1835   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1836   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1837   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1838
1839   END_TEST;
1840 }
1841
1842 int UtcDaliImageVisualReleasePolicy01(void)
1843 {
1844   ToolkitTestApplication application;
1845   tet_infoline( "UtcDaliImageVisualReleasePolicy01 Detached Policy, disabling visual with this policy deletes texture" );
1846
1847   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DETACHED );
1848   DALI_TEST_CHECK( imageVisual );
1849
1850   // Set up debug trace
1851   TestGlAbstraction& gl = application.GetGlAbstraction();
1852   TraceCallStack& textureTrace = gl.GetTextureTrace();
1853   textureTrace.Enable(true);
1854
1855   tet_infoline( "Register visual with control and ensure it has the only handle" );
1856   DummyControl actor = DummyControl::New(true);
1857   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1858   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1859   imageVisual.Reset();
1860
1861   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
1862
1863   application.SendNotification();
1864   application.Render(0);
1865   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1866   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1867
1868   application.GetScene().Add( actor );
1869
1870   // Wait for image to load
1871   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1872
1873   application.SendNotification();
1874   application.Render(0);
1875   // Test renderer and texture created
1876   tet_infoline( "Confirm texture created" );
1877   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1878   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1879
1880   tet_infoline( "Disable visual causing the texture to be deleted" );
1881   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1882
1883   application.SendNotification();
1884   application.Render(0);
1885   // Test renderer and textures removed.
1886   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1887   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1888
1889   END_TEST;
1890 }
1891
1892 int UtcDaliImageVisualReleasePolicy02(void)
1893 {
1894   ToolkitTestApplication application;
1895   tet_infoline( "UtcDaliImageVisualReleasePolicy02 Destroyed Policy, Texture should be deleted when visual destroyed" );
1896
1897   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED );
1898   DALI_TEST_CHECK( imageVisual );
1899
1900   // Setup debug trace
1901   TestGlAbstraction& gl = application.GetGlAbstraction();
1902   TraceCallStack& textureTrace = gl.GetTextureTrace();
1903   textureTrace.Enable(true);
1904
1905   tet_infoline( "Register visual with control and ensure it has the only handle" );
1906   DummyControl actor = DummyControl::New(true);
1907   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1908   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1909   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1910
1911   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
1912
1913   application.SendNotification();
1914   application.Render(0);
1915   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1916   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1917
1918   application.GetScene().Add( actor );
1919
1920   // Wait for image to load
1921   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1922
1923   application.SendNotification();
1924   application.Render(0);
1925   // Test renderer and texture created
1926   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1927   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1928
1929
1930   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1931   tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1932   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1933   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1934   application.SendNotification();
1935   application.Render();
1936
1937   // Test texture removed after visual destroyed.
1938   tet_infoline( "Ensure texture is deleted after visual destroyed" );
1939   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1940
1941   END_TEST;
1942 }
1943
1944 int UtcDaliImageVisualReleasePolicy03(void)
1945 {
1946   ToolkitTestApplication application;
1947   tet_infoline( "UtcDaliImageVisualReleasePolicy03 Never Policy, texture should not be deleted after visual destroyed" );
1948
1949   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::NEVER );
1950   DALI_TEST_CHECK( imageVisual );
1951
1952   TestGlAbstraction& gl = application.GetGlAbstraction();
1953   TraceCallStack& textureTrace = gl.GetTextureTrace();
1954   textureTrace.Enable(true);
1955
1956   tet_infoline( "Register visual with control and ensure it has the only handle" );
1957   DummyControl actor = DummyControl::New(true);
1958   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1959   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1960   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1961
1962   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
1963
1964   application.SendNotification();
1965   application.Render(0);
1966   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1967   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1968
1969   application.GetScene().Add( actor );
1970
1971   // Wait for image to load
1972   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1973
1974   application.SendNotification();
1975   application.Render(0);
1976   // Test renderer and texture created
1977   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1978   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1979
1980   tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1981   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1982   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1983   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1984   application.SendNotification();
1985   application.Render();
1986
1987   tet_infoline( "Ensure texture is not deleted as policy is set to NEVER" );
1988   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1989
1990   END_TEST;
1991 }
1992
1993 int UtcDaliImageVisualReleasePolicy04(void)
1994 {
1995   ToolkitTestApplication application;
1996   tet_infoline( "UtcDaliImageVisualReleasePolicy04 Two visuals with different policies sharing a texture" );
1997
1998   tet_infoline( "Create first visual with Never release policy" );
1999   Visual::Base imageVisualNever = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::NEVER );
2000
2001   tet_infoline( "Create second visual with Destroyed release policy");
2002     Visual::Base imageVisualDestroyed = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED );
2003
2004   // Set up trace debug
2005   TestGlAbstraction& gl = application.GetGlAbstraction();
2006   TraceCallStack& textureTrace = gl.GetTextureTrace();
2007   textureTrace.Enable(true);
2008
2009   tet_infoline( "Register visuals with control and ensure it has the only handles" );
2010   DummyControl actor = DummyControl::New(true);
2011   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2012   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualNever );
2013   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDestroyed );
2014   imageVisualNever.Reset(); // reduce ref count so only the control keeps the visual alive.
2015   imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
2016
2017   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2018
2019   // Test initially zero renderers
2020   application.SendNotification();
2021   application.Render(0);
2022   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2023   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2024
2025   application.GetScene().Add( actor );
2026
2027   // Wait for image to load
2028   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2029
2030   application.SendNotification();
2031   application.Render(0);
2032   tet_infoline( "Ensure a texture is created, shared amongst both visuals.  Each visual has its own renderer" );
2033   DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
2034   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2035
2036   // Test renderer removed when visual destroyed
2037   DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
2038   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL2 );  // TEST_VISUAL2 no longer requires the texture as release policy DESTROYED
2039   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
2040   application.SendNotification();
2041   application.Render();
2042
2043   // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
2044   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2045
2046   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
2047   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2048   application.SendNotification();
2049   application.Render();
2050
2051   tet_infoline( "Ensure a texture is not deleted as second visual used the NEVER release policy" );
2052   // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
2053   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2054
2055   END_TEST;
2056 }
2057
2058 int UtcDaliImageVisualReleasePolicy05(void)
2059 {
2060   ToolkitTestApplication application;
2061   tet_infoline( "UtcDaliImageVisualReleasePolicy05 Testing settung by string currents correct enum" );
2062
2063   VisualFactory factory = VisualFactory::Get();
2064
2065   Property::Map propertyMapNeverReleasePolicy;
2066   propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
2067   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
2068   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
2069   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
2070   propertyMapNeverReleasePolicy.Insert( "releasePolicy" , "never" );
2071
2072   Visual::Base imageVisualNever = factory.CreateVisual( propertyMapNeverReleasePolicy );
2073
2074   Property::Map resultMap;
2075   imageVisualNever.CreatePropertyMap( resultMap );
2076   DALI_TEST_CHECK( ! resultMap.Empty() );
2077
2078   DALI_TEST_EQUALS( ( resultMap.Find( ImageVisual::Property::RELEASE_POLICY ) )->Get<int>(), (int)ImageVisual::ReleasePolicy::NEVER, TEST_LOCATION );
2079
2080   END_TEST;
2081 }
2082
2083 int UtcDaliImageVisualReleasePolicy06(void)
2084 {
2085   ToolkitTestApplication application;
2086   tet_infoline( "UtcDaliImageVisualReleasePolicy06 Never Policy, texture should not be affected by Disabling and Enabling visual" );
2087
2088   Visual::Base imageVisual= CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::NEVER );
2089   DALI_TEST_CHECK( imageVisual );
2090
2091   TestGlAbstraction& gl = application.GetGlAbstraction();
2092   TraceCallStack& textureTrace = gl.GetTextureTrace();
2093   textureTrace.Enable(true);
2094
2095   tet_infoline( "Register visual with control and ensure it has the only handle" );
2096   DummyControl actor = DummyControl::New(true);
2097   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2098   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2099   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2100
2101   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2102
2103   application.SendNotification();
2104   application.Render(0);
2105   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2106   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2107
2108   application.GetScene().Add( actor );
2109
2110   // Wait for image to load
2111   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2112
2113   application.SendNotification();
2114   application.Render(0);
2115   // Test renderer and texture created
2116   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
2117   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2118   textureTrace.Reset();
2119
2120   tet_infoline( "Disable Visual and check texture not affected" );
2121   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
2122   application.SendNotification();
2123   application.Render(0);
2124   tet_infoline( "Check renderer is destroyed when visual off stage" );
2125   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2126   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2127   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2128   textureTrace.Reset();
2129
2130   tet_infoline( "Re-enable Visual and check texture not affected" );
2131   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, true );
2132   application.SendNotification();
2133   application.Render(0);
2134   tet_infoline( "Check texture not affected and renderer is destroyed when visual off stage" );
2135   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
2136   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2137   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2138
2139   END_TEST;
2140 }
2141
2142 int UtcDaliImageVisualReleasePolicy07(void)
2143 {
2144   ToolkitTestApplication application;
2145   tet_infoline( "UtcDaliImageVisualReleasePolicy07 Two visuals with different policies sharing a texture DETACHED and DESTROYED" );
2146
2147   tet_infoline( "Create first visual with DESTROYED release policy" );
2148   Visual::Base imageVisualDestroyed = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED );
2149
2150
2151   tet_infoline( "Create second visual with DETACHED release policy");
2152   Visual::Base imageVisualDetached = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DETACHED );
2153
2154   // Set up trace debug
2155   TestGlAbstraction& gl = application.GetGlAbstraction();
2156   TraceCallStack& textureTrace = gl.GetTextureTrace();
2157   textureTrace.Enable(true);
2158
2159   tet_infoline( "Register visuals with control and ensure it has the only handles" );
2160   DummyControl actor = DummyControl::New(true);
2161   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2162   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualDestroyed );
2163   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDetached );
2164   imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
2165   imageVisualDetached.Reset(); // reduce ref count so only the control keeps the visual alive.
2166
2167   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2168
2169   // Test initially zero renderers
2170   application.SendNotification();
2171   application.Render(0);
2172   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2173   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2174
2175   application.GetScene().Add( actor );
2176
2177   // Wait for image to load
2178   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2179
2180   application.SendNotification();
2181   application.Render(0);
2182   tet_infoline( "Ensure a texture is created, shared amongst both visuals.  Each visual has its own renderer" );
2183   DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
2184   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2185
2186   // Test renderer removed when visual destroyed
2187   DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
2188   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL2, false );  // TEST_VISUAL2 no longer requires the texture as release policy DETACHED
2189   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
2190   application.SendNotification();
2191   application.Render();
2192
2193   // Test texture was not deleted as TEST_VISUAL release policy is DESTROYED and is still required.
2194   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2195
2196   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
2197   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2198   application.SendNotification();
2199   application.Render();
2200
2201   tet_infoline( "Ensure a texture is not deleted as second visual used the DESTROYED release policy" );
2202   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2203
2204   END_TEST;
2205 }
2206
2207 int UtcDaliImageVisualReleasePolicy08(void)
2208 {
2209   ToolkitTestApplication application;
2210   tet_infoline( "UtcDaliImageVisualReleasePolicy08 Ensure TextureSet is same after detach/attach on stage when texture used the DESTROYED release policy" );
2211
2212   tet_infoline( "Create first visual with DESTROYED release policy" );
2213   Visual::Base imageVisualDestroyed = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED );
2214
2215   // Set up trace debug
2216   TestGlAbstraction& gl = application.GetGlAbstraction();
2217   TraceCallStack& textureTrace = gl.GetTextureTrace();
2218   textureTrace.Enable(true);
2219
2220   tet_infoline( "Register visuals with control and ensure it has the only handles" );
2221   DummyControl actor = DummyControl::New(true);
2222   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2223   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualDestroyed );
2224   imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
2225
2226   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2227
2228   // Test initially zero renderers
2229   application.SendNotification();
2230   application.Render(0);
2231   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2232   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2233   textureTrace.Reset();
2234
2235   application.GetScene().Add( actor );
2236
2237   // Wait for image to load
2238   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2239
2240   application.SendNotification();
2241   application.Render(0);
2242   tet_infoline( "Ensure a texture is created" );
2243   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
2244   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2245   textureTrace.Reset();
2246
2247   // Ensure TextureSet is same after detach/attach on stage when texture used the DESTROYED release policy
2248   // 1. Get TextureSet
2249   TextureSet textureSetBefore = actor.GetRendererAt( 0u ).GetTextures();
2250
2251   // 2.Remove actor from stage. In this case, renderer also is deleted.
2252   tet_infoline( "Remove actor from stage" );
2253   application.GetScene().Remove( actor );
2254   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2255   application.SendNotification();
2256   application.Render();
2257
2258   tet_infoline( "Ensure a texture is not deleted as visual used the DESTROYED release policy" );
2259   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
2260   textureTrace.Reset();
2261
2262   // 3.Add actor in stage. In this case, renderer is created.
2263   tet_infoline( "Add actor in stage" );
2264   application.GetScene().Add( actor );
2265   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
2266   application.SendNotification();
2267   application.Render();
2268   tet_infoline( "Ensure a texture is not created again" );
2269   DALI_TEST_EQUALS( textureTrace.CountMethod("GenTextures"), 0, TEST_LOCATION );
2270   textureTrace.Reset();
2271
2272   // 4.Compare Texture with before and after. textureSet need to be same because release policy is the DESTROYED.
2273   tet_infoline( "Ensure a textureSet is not deleted because it is used the DESTROYED release policy" );
2274   TextureSet textureSetAfter = actor.GetRendererAt( 0u ).GetTextures();
2275   DALI_TEST_CHECK( textureSetBefore == textureSetAfter );
2276   textureSetBefore.Reset();
2277   textureSetAfter.Reset();
2278
2279   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
2280   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
2281   application.SendNotification();
2282   application.Render();
2283   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
2284
2285   END_TEST;
2286 }
2287
2288 int UtcDaliImageVisualLoadPolicy01(void)
2289 {
2290   ToolkitTestApplication application;
2291   tet_infoline( "UtcDaliImageVisualLoadPolicy01 Load a visual image before attaching to stage" );
2292
2293   // Set up trace debug
2294   TestGlAbstraction& gl = application.GetGlAbstraction();
2295   TraceCallStack& textureTrace = gl.GetTextureTrace();
2296   textureTrace.Enable(true);
2297
2298   tet_infoline( "Create visual with IMMEDIATE load policy" );
2299   VisualFactory factory = VisualFactory::Get();
2300
2301   Property::Map propertyMap;
2302   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
2303   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
2304   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
2305   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
2306   propertyMap.Insert( "loadPolicy" , ImageVisual::LoadPolicy::IMMEDIATE );
2307
2308   Visual::Base imageVisual = factory.CreateVisual( propertyMap );
2309
2310   Property::Map resultMap;
2311   imageVisual.CreatePropertyMap( resultMap );
2312   DALI_TEST_CHECK( ! resultMap.Empty() );
2313   DALI_TEST_EQUALS( ( resultMap.Find( ImageVisual::Property::LOAD_POLICY ) )->Get<int>(), (int)ImageVisual::LoadPolicy::IMMEDIATE, TEST_LOCATION );
2314
2315   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2316
2317   // Ensure texture has been uploaded
2318   application.SendNotification();
2319   application.Render();
2320
2321   tet_infoline( "Ensure texture loading starts after visual created" );
2322   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2323   textureTrace.Reset();
2324
2325   tet_infoline( "Register visuals with control and ensure it has the only handles" );
2326   DummyControl actor = DummyControl::New(true);
2327   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2328   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2329   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2330
2331   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2332   application.GetScene().Add( actor );
2333   tet_infoline( "Ensure nothing triggers another load as texure already loaded" );
2334   const unsigned int TIME_OUT_3_SECONDS = 3;
2335   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1, TIME_OUT_3_SECONDS ), false, TEST_LOCATION );
2336
2337   application.SendNotification();
2338   application.Render();
2339
2340   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
2341   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2342
2343   // Ensure texture is deleted when no longer needed (ref count was correct )
2344   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
2345
2346   application.SendNotification();
2347   application.Render();
2348
2349   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
2350   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
2351
2352   END_TEST;
2353 }
2354
2355 int UtcDaliImageVisualLoadPolicy02(void)
2356 {
2357   ToolkitTestApplication application;
2358   tet_infoline( "UtcDaliImageVisualLoadPolicy01 Load a visual image only after attached to stage" );
2359
2360   // Set up trace debug
2361   TestGlAbstraction& gl = application.GetGlAbstraction();
2362   TraceCallStack& textureTrace = gl.GetTextureTrace();
2363   textureTrace.Enable(true);
2364
2365   tet_infoline( "Create visual with IMMEDIATE load policy" );
2366   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED );
2367
2368   const unsigned int TIME_OUT_3_SECONDS = 3;
2369   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1, TIME_OUT_3_SECONDS ), false, TEST_LOCATION );
2370
2371   // Act on meeage queue even although nothing expected to load
2372   application.SendNotification();
2373   application.Render();
2374
2375   tet_infoline( "Ensure texture is not generated yet" );
2376   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
2377   textureTrace.Reset();
2378
2379   tet_infoline( "Register visuals with control and ensure it has the only handles" );
2380   DummyControl actor = DummyControl::New(true);
2381   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2382   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2383   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2384
2385   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2386   application.GetScene().Add( actor );
2387   tet_infoline( "Allow image time to load" );
2388   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2389
2390   application.SendNotification();
2391   application.Render();
2392
2393   tet_infoline( "Ensure texture generated and renderer created" );
2394   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
2395   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2396
2397   // Ensure texture is delete when no longer needed
2398   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
2399
2400   application.SendNotification();
2401   application.Render();
2402
2403   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
2404   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
2405
2406   END_TEST;
2407 }
2408
2409 int UtcDaliImageVisualLoadPolicy03(void)
2410 {
2411   ToolkitTestApplication application;
2412   tet_infoline( "UtcDaliImageVisualLoadPolicy03 Load a visual image and receive ResourceReady Signal when loaded" );
2413
2414   const bool VISUAL_NOT_ENABLED( false ); // Instead of just passing 'false' into an API.
2415
2416   // Set up trace debug
2417   TestGlAbstraction& gl = application.GetGlAbstraction();
2418   TraceCallStack& textureTrace = gl.GetTextureTrace();
2419   textureTrace.Enable(true);
2420
2421   tet_infoline( "Create a control and connect to resource ready signal without adding to stage" );
2422   DummyControl actor = DummyControl::New(true);
2423   actor.ResourceReadySignal().Connect( &ResourceReadySignal);
2424   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2425   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2426
2427   tet_infoline( "Create visual with IMMEDIATE load policy" );
2428   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE );
2429
2430   tet_infoline( "Registering visual allows control to get a signal once loaded even if visual not enabled( not staged )" );
2431   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual, VISUAL_NOT_ENABLED );
2432   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2433
2434   tet_infoline( "Allow image time to load resource" );
2435   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2436   application.SendNotification();
2437   application.Render();
2438
2439   // Ensure texture has been uploaded
2440   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2441   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2442
2443   END_TEST;
2444 }
2445
2446 int UtcDaliImageVisualLoadPolicy04(void)
2447 {
2448   ToolkitTestApplication application;
2449   tet_infoline( "UtcDaliImageVisualLoadPolicy04 First part  Load a visual image before attaching to stage");
2450   tet_infoline( "Second part, Reuse the same image in aonther control and check resource ready signal fired" );
2451
2452   const bool VISUAL_NOT_ENABLED( false ); // Instead of just passing false into an API.
2453
2454   // Set up trace debug
2455   TestGlAbstraction& gl = application.GetGlAbstraction();
2456   TraceCallStack& textureTrace = gl.GetTextureTrace();
2457   textureTrace.Enable(true);
2458
2459   tet_infoline( "Create a control and connect to resource ready signal" );
2460   DummyControl actor = DummyControl::New(true);
2461   actor.ResourceReadySignal().Connect( &ResourceReadySignal);
2462   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2463   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2464
2465   tet_infoline( "Create visual with IMMEDIATE load policy" );
2466   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE );
2467
2468   tet_infoline( "Registering visual allows control to get a signal once loaded even if visual not enabled( staged )" );
2469   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual, VISUAL_NOT_ENABLED );
2470   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2471
2472   tet_infoline( "Allow image time to load" );
2473   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2474   application.SendNotification();
2475   application.Render();
2476
2477   tet_infoline( "Testing texture is loaded and resource ready signal fired" );
2478   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2479   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2480
2481   tet_infoline( "Original control correctly signalled, now testing for signal with new Control reusing the image" );
2482
2483   gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
2484   Visual::Base imageVisual2 = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE );
2485   DummyControl actor2 = DummyControl::New(true);
2486   Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2487   actor2.ResourceReadySignal().Connect( &ResourceReadySignal);
2488
2489   tet_infoline( "Registering visual this should trigger the loading signal as is already image loaded for previous control" );
2490   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 );
2491   imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive.
2492   actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2493   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 0 ), true, TEST_LOCATION ); // Not expecting any further loading as texture is being reused.
2494   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2495
2496   END_TEST;
2497 }
2498
2499 int UtcDaliImageVisualLoadPolicy05(void)
2500 {
2501   ToolkitTestApplication application;
2502   tet_infoline( "UtcDaliImageVisualLoadPolicy05 LoadPolicy::ATTACHED (default) First part  Load a visual image before attaching to stage");
2503   tet_infoline( "Second part, Reuse the same image in aonther control and check resource ready signal fired" );
2504   // Set up trace debug
2505   TestGlAbstraction& gl = application.GetGlAbstraction();
2506   TraceCallStack& textureTrace = gl.GetTextureTrace();
2507   textureTrace.Enable(true);
2508
2509   tet_infoline( "Create a control and connect to resource ready signal" );
2510   DummyControl actor = DummyControl::New(true);
2511   actor.ResourceReadySignal().Connect( &ResourceReadySignal);
2512   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2513   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2514   application.GetScene().Add( actor );
2515
2516   tet_infoline( "Create visual with ATTACHED load policy" );
2517   Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED );
2518
2519   tet_infoline( "Registering visual allows control to get a signal once loaded" );
2520   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2521   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
2522
2523   tet_infoline( "Allow image time to load" );
2524   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2525   application.SendNotification();
2526   application.Render();
2527
2528   tet_infoline( "Testing texture is loaded and resource ready signal fired" );
2529   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
2530   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2531
2532   tet_infoline( "Original control correctly signalled, now testing for signal with new Control reusing the image" );
2533
2534   gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
2535   Visual::Base imageVisual2 = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED );
2536   DummyControl actor2 = DummyControl::New(true);
2537   Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2538   actor2.ResourceReadySignal().Connect( &ResourceReadySignal);
2539
2540   tet_infoline( "Registering visual this should trigger the loading signal as is already image loaded for previous control" );
2541   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 );
2542   imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive.
2543   actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2544   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 0 ), true, TEST_LOCATION ); // Not expecting any further loading as texture is being reused.
2545   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2546
2547   END_TEST;
2548 }
2549
2550
2551 int UtcDaliImageVisualOrientationCorrection(void)
2552 {
2553   ToolkitTestApplication application;
2554   tet_infoline( "UtcDaliImageVisualOrientationCorrection Enabling OrientationCorrection should rotate an image with exif (90deg) orientation data with requested" );
2555
2556   VisualFactory factory = VisualFactory::Get();
2557   tet_infoline( "Create visual with Orientation correction set OFF" );
2558   Property::Map propertyMap;
2559   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
2560   propertyMap.Insert( ImageVisual::Property::URL, TEST_ROTATED_IMAGE );
2561   propertyMap.Insert( "orientationCorrection", false );
2562   Visual::Base imageVisual = factory.CreateVisual( propertyMap );
2563
2564   tet_infoline( "Create control for visual, need to loaded it" );
2565   DummyControl actor = DummyControl::New(true);
2566   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2567   application.GetScene().Add( actor );
2568
2569   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2570   // Wait for image to load
2571   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2572
2573   Vector2 originalImageSize;
2574   tet_infoline( "Get size of original visual to compare later with rotated image" );
2575   imageVisual.GetNaturalSize( originalImageSize );
2576   DALI_TEST_GREATER( originalImageSize.width, originalImageSize.height, TEST_LOCATION ); // Width and Height must be different for this test.
2577   imageVisual.Reset();  // remove handle so can unregister it and remove from cache
2578   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
2579   application.SendNotification();
2580   application.Render();
2581
2582   tet_infoline( "Create visual with Orientation correction set ON " );
2583   propertyMap.Clear();
2584   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
2585   propertyMap.Insert( ImageVisual::Property::URL, TEST_ROTATED_IMAGE );
2586   propertyMap.Insert( ImageVisual::Property::ORIENTATION_CORRECTION, true );
2587   imageVisual = factory.CreateVisual( propertyMap );
2588
2589   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
2590   // Wait for image to load
2591   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2592
2593   Vector2 rotatedImageSize;
2594   imageVisual.GetNaturalSize( rotatedImageSize );
2595   tet_infoline( "Confirm that visual has rotated" );
2596   DALI_TEST_EQUALS( originalImageSize.width, rotatedImageSize.height , TEST_LOCATION );
2597   DALI_TEST_EQUALS( originalImageSize.height, rotatedImageSize.width , TEST_LOCATION );
2598
2599   Property::Map resultMap;
2600   imageVisual.CreatePropertyMap( resultMap );
2601
2602   // check the Property::ORIENTATION_CORRECTION value from the returned map
2603   Property::Value* typeValue = resultMap.Find( ImageVisual::Property::ORIENTATION_CORRECTION,  Property::BOOLEAN );
2604   DALI_TEST_EQUALS( typeValue->Get<bool>(), true, TEST_LOCATION );
2605
2606   END_TEST;
2607 }
2608
2609 int UtcDaliImageVisualCustomShader(void)
2610 {
2611   ToolkitTestApplication application;
2612   tet_infoline( "UtcDaliImageVisualCustomShader Test custom shader" );
2613
2614   VisualFactory factory = VisualFactory::Get();
2615   Property::Map properties;
2616   Property::Map shader;
2617   const std::string vertexShader = "Foobar";
2618   const std::string fragmentShader = "Foobar";
2619   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2620   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2621
2622   properties[Visual::Property::TYPE] = Visual::IMAGE;
2623   properties[Visual::Property::SHADER] = shader;
2624   properties[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
2625
2626   Visual::Base visual = factory.CreateVisual( properties );
2627
2628   // trigger creation through setting on stage
2629   DummyControl dummy = DummyControl::New( true );
2630   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
2631   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
2632
2633   dummy.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
2634   dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
2635   application.GetScene().Add( dummy );
2636
2637   application.SendNotification();
2638   application.Render();
2639
2640   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2641
2642   Renderer renderer = dummy.GetRendererAt( 0 );
2643   Shader shader2 = renderer.GetShader();
2644   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
2645   Property::Map* map = value.GetMap();
2646   DALI_TEST_CHECK( map );
2647
2648   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
2649   DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION );
2650
2651   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
2652   DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION );
2653
2654   shader.Clear();
2655
2656   shader[Visual::Shader::Property::HINTS] = Shader::Hint::OUTPUT_IS_TRANSPARENT;
2657   properties[Visual::Property::SHADER] = shader;
2658
2659   Visual::Base visual1 = factory.CreateVisual( properties );
2660
2661   // trigger creation through setting on stage
2662   DummyControl dummy1 = DummyControl::New( true );
2663   Impl::DummyControl& dummyImpl1 = static_cast< Impl::DummyControl& >( dummy1.GetImplementation() );
2664   dummyImpl1.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual1 );
2665   dummy1.SetProperty( Actor::Property::SIZE, Vector2( 200, 200 ) );
2666   dummy1.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
2667   application.GetScene().Add( dummy1 );
2668
2669   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
2670   glAbstraction.EnableEnableDisableCallTrace( true );
2671
2672   application.SendNotification();
2673   application.Render();
2674
2675   TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace();
2676   std::ostringstream blendStr;
2677   blendStr << std::hex << GL_BLEND;
2678   DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) );
2679
2680   END_TEST;
2681 }
2682
2683
2684 void ResourceReadyLoadNext( Control control )
2685 {
2686   static int callNumber = 0;
2687
2688   gResourceReadySignalFired = true;
2689   gReadyIds.push_back(control.GetProperty< int >( Actor::Property::ID ));
2690
2691   if( callNumber == 0 )
2692   {
2693     DALI_TEST_EQUALS( control.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL), Toolkit::Visual::ResourceStatus::FAILED, TEST_LOCATION );
2694
2695     tet_infoline( "Create visual with loaded image from within the signal handler" );
2696     VisualFactory factory = VisualFactory::Get();
2697     Visual::Base imageVisual = factory.CreateVisual( TEST_IMAGE_FILE_NAME, ImageDimensions{20,30} );
2698
2699     Impl::DummyControl& controlImpl = static_cast<Impl::DummyControl&>(control.GetImplementation());
2700     controlImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); // This should trigger another signal.
2701     callNumber = 1;
2702   }
2703   else
2704   {
2705     tet_infoline( "3rd signal called" );
2706     DALI_TEST_CHECK(true);
2707   }
2708 }
2709
2710 int UtcDaliImageVisualLoadReady01(void)
2711 {
2712   ToolkitTestApplication application;
2713   tet_infoline( "UtcDaliImageVisualLoadReady01");
2714   tet_infoline( "First part:  Load an image visual for one resource, then another image visual for a second resource.");
2715   tet_infoline( "Second part, In the ready signal for the second image visual, add a 3rd visual with the first URL" );
2716   tet_infoline( "Should get a ready signal for all three visuals");
2717
2718   ClearReadyIds();
2719
2720   tet_infoline( "Create a control and connect to resource ready signal" );
2721   DummyControl actor = DummyControl::New(true);
2722   int actor1Id = actor.GetProperty< int >( Actor::Property::ID );
2723   actor.ResourceReadySignal().Connect( &ResourceReadySignal);
2724   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
2725   actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2726   application.GetScene().Add(actor);
2727
2728   tet_infoline( "Create visual with IMMEDIATE load policy" );
2729   Visual::Base imageVisual1 = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE );
2730
2731   tet_infoline( "Registering visual allows control to get a signal once loaded even if visual not enabled( staged )" );
2732   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual1 );
2733
2734
2735   tet_infoline( "Allow image time to load" );
2736   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2737   application.SendNotification();
2738   application.Render();
2739
2740   tet_infoline( "Testing texture is loaded and resource ready signal fired" );
2741   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2742   DALI_TEST_EQUALS( gReadyIds[0], actor1Id, TEST_LOCATION );
2743
2744
2745   tet_infoline( "Original control correctly signalled, now testing failing image" );
2746
2747   gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
2748   ClearReadyIds();
2749
2750   Visual::Base imageVisual2 = CreateVisualWithPolicy( TEST_BROKEN_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE );
2751
2752   DummyControl actor2 = DummyControl::New(true);
2753   int actor2Id = actor2.GetProperty< int >( Actor::Property::ID );
2754   Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor2.GetImplementation());
2755   actor2.ResourceReadySignal().Connect( &ResourceReadyLoadNext);
2756
2757   tet_infoline( "Registering visual this should trigger the ready signal when the image fails to load" );
2758   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 );
2759
2760   actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) );
2761   application.GetScene().Add(actor2);
2762
2763   tet_infoline( "Wait for loading thread to finish");
2764   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
2765   DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
2766
2767   DALI_TEST_EQUALS( gReadyIds[0], actor2Id, TEST_LOCATION);
2768
2769   tet_infoline( "Check for 3rd signal");
2770   application.SendNotification();
2771   DALI_TEST_EQUALS( gReadyIds.size(), 2, TEST_LOCATION );
2772   DALI_TEST_EQUALS( gReadyIds[1], actor2Id, TEST_LOCATION);
2773
2774   END_TEST;
2775 }