d0e1561bd829ab7073995b465abe292be57ff191
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ImageVisual.cpp
1 /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <toolkit-timer.h>
21 #include <toolkit-event-thread-callback.h>
22 #include <dali/devel-api/object/handle-devel.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/dali-toolkit.h>
28 #include "dummy-control.h"
29
30 using namespace Dali;
31 using namespace Dali::Toolkit;
32
33 void dali_image_visual_startup(void)
34 {
35   test_return_value = TET_UNDEF;
36 }
37
38 void dali_image_visual_cleanup(void)
39 {
40   test_return_value = TET_PASS;
41 }
42
43 namespace
44 {
45 const char* TEST_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/gallery-small-1.jpg";
46 const char* TEST_LARGE_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/tbcol.png";
47 const char* TEST_SMALL_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/icon-edit.png";
48 const char* TEST_REMOTE_IMAGE_FILE_NAME = "https://www.tizen.org/sites/all/themes/tizen_theme/logo.png";
49 const char* TEST_INVALID_FILE_NAME =  TEST_RESOURCE_DIR  "/invalid.jpg";
50 const char* TEST_REMOTE_INVALID_FILE_NAME = "https://www.tizen.org/invalid.png";
51 const char* TEST_MASK_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/mask.png";
52 }
53
54
55 Actor CreateActorWithImageVisual(const Property::Map& map)
56 {
57   VisualFactory factory = VisualFactory::Get();
58   DummyControl actor = DummyControl::New();
59   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
60   Visual::Base visual = factory.CreateVisual( map );
61   DALI_TEST_CHECK( visual );
62   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
63   actor.SetSize( 200.f, 200.f );
64   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
65   return actor;
66 }
67
68 void TestVisualRender( ToolkitTestApplication& application,
69                        DummyControl& actor,
70                        Visual::Base& visual,
71                        std::size_t expectedSamplers = 0,
72                        ImageDimensions imageDimensions = ImageDimensions(),
73                        Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
74 {
75   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
76   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
77
78   if( resourcePtr )
79   {
80     // set the image size, for test case, this needs to be set before loading started
81     application.GetPlatform().SetClosestImageSize(  Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) );
82   }
83
84   actor.SetSize( 200.f, 200.f );
85   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
86
87   Stage::GetCurrent().Add( actor );
88
89   application.SendNotification(); // Send messages to update
90   application.Render();           // process update and render
91   application.SendNotification(); // process any signals to event
92
93   if( resourcePtr )
94   {
95     DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION);
96   }
97
98   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
99 }
100
101 static void TestMixColor( Visual::Base visual, Property::Index mixColorIndex, const Vector4& testColor )
102 {
103   Property::Map map;
104   visual.CreatePropertyMap(map);
105   Property::Value* value = map.Find( mixColorIndex );
106   DALI_TEST_CHECK( value );
107   Vector3 mixColor1;
108   DALI_TEST_CHECK( value->Get( mixColor1 ) );
109   DALI_TEST_EQUALS( mixColor1, Vector3(testColor), 0.001, TEST_LOCATION );
110
111   value = map.Find( Visual::Property::MIX_COLOR );
112   DALI_TEST_CHECK( value );
113   Vector4 mixColor2;
114   DALI_TEST_CHECK( value->Get( mixColor2 ) );
115   DALI_TEST_EQUALS( mixColor2, testColor, 0.001, TEST_LOCATION );
116
117   value = map.Find( Visual::Property::OPACITY );
118   DALI_TEST_CHECK( value );
119   float opacity;
120   DALI_TEST_CHECK( value->Get( opacity ) );
121   DALI_TEST_EQUALS( opacity, testColor.a, 0.001, TEST_LOCATION );
122 }
123
124
125
126 int UtcDaliImageVisualPropertyMap(void)
127 {
128   ToolkitTestApplication application;
129   tet_infoline( "Request image visual with a Property::Map" );
130
131   VisualFactory factory = VisualFactory::Get();
132   DALI_TEST_CHECK( factory );
133
134   Property::Map propertyMap;
135   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
136   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
137
138   Visual::Base visual = factory.CreateVisual( propertyMap );
139   DALI_TEST_CHECK( visual );
140
141   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
142   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
143
144   TestGlAbstraction& gl = application.GetGlAbstraction();
145   TraceCallStack& textureTrace = gl.GetTextureTrace();
146   textureTrace.Enable(true);
147
148   DummyControl actor = DummyControl::New();
149   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
150   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
151
152   actor.SetSize( 200.f, 200.f );
153   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
154
155   Stage::GetCurrent().Add( actor );
156   application.SendNotification();
157   application.Render();
158
159   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
160
161   application.SendNotification();
162   application.Render();
163
164   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
165
166   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
167
168   Stage::GetCurrent().Remove( actor );
169   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
170
171   END_TEST;
172 }
173
174
175 int UtcDaliImageVisualRemoteImageLoad(void)
176 {
177   ToolkitTestApplication application;
178   tet_infoline( "Request remote image visual with a Property::Map" );
179
180   VisualFactory factory = VisualFactory::Get();
181   DALI_TEST_CHECK( factory );
182
183   Property::Map propertyMap;
184   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
185   propertyMap.Insert( ImageVisual::Property::URL,  TEST_REMOTE_IMAGE_FILE_NAME );
186
187   Visual::Base visual = factory.CreateVisual( propertyMap );
188   DALI_TEST_CHECK( visual );
189
190   TestGlAbstraction& gl = application.GetGlAbstraction();
191   TraceCallStack& textureTrace = gl.GetTextureTrace();
192   textureTrace.Enable(true);
193
194   DummyControl actor = DummyControl::New();
195   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
196   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
197
198   actor.SetSize( 200.f, 200.f );
199   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
200
201   Stage::GetCurrent().Add( actor );
202   application.SendNotification();
203
204   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
205
206   application.SendNotification();
207   application.Render();
208
209   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
210   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
211
212   Stage::GetCurrent().Remove( actor );
213   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
214
215   END_TEST;
216 }
217
218 int UtcDaliImageVisualTextureReuse1(void)
219 {
220   ToolkitTestApplication application;
221   tet_infoline( "Request remote image visual with a Property::Map; request a second visual with the same property map - should reuse texture" );
222
223   Property::Map propertyMap;
224   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
225   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
226
227   TestGlAbstraction& gl = application.GetGlAbstraction();
228   TraceCallStack& textureTrace = gl.GetTextureTrace();
229   textureTrace.Enable(true);
230   TraceCallStack& drawTrace = gl.GetDrawTrace();
231   drawTrace.Enable(true);
232
233   Actor actor = CreateActorWithImageVisual( propertyMap );
234   Stage::GetCurrent().Add( actor );
235   application.SendNotification();
236
237   // Wait for image to load
238   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
239
240   application.SendNotification();
241   application.Render();
242
243   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
244   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
245   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
246   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
247   textureTrace.Reset();
248   drawTrace.Reset();
249
250   Actor actor2 = CreateActorWithImageVisual( propertyMap );
251   Stage::GetCurrent().Add(actor2);
252
253   application.SendNotification(); // Send messages to update
254   application.Render();           // process update and render
255   application.SendNotification(); // process any signals to event
256
257   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
258
259   tet_infoline("Test that 2 draw calls occur with no new texture gens/binds, i.e. both\n"
260                "draw calls use the same texture as the previous draw call\n" );
261
262   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
263   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
264   DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION );
265
266   tet_infoline("Test that removing 1 actor doesn't delete the texture\n");
267
268   Stage::GetCurrent().Remove( actor );
269   application.SendNotification();
270   application.Render();
271
272   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
273   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
274
275   tet_infoline("Test that removing last actor does delete the texture\n");
276
277   Stage::GetCurrent().Remove( actor2 );
278   application.SendNotification();
279   application.Render();
280
281   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
282   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
283
284   END_TEST;
285 }
286
287
288 int UtcDaliImageVisualTextureReuse2(void)
289 {
290   ToolkitTestApplication application;
291   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" );
292
293   Property::Map propertyMap;
294   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
295   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
296
297   TestGlAbstraction& gl = application.GetGlAbstraction();
298   TraceCallStack& textureTrace = gl.GetTextureTrace();
299   textureTrace.Enable(true);
300   TraceCallStack& drawTrace = gl.GetDrawTrace();
301   drawTrace.Enable(true);
302
303   Actor actor = CreateActorWithImageVisual( propertyMap );
304   Stage::GetCurrent().Add( actor );
305   application.SendNotification();
306
307   // Wait for image to load
308   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
309
310   application.SendNotification();
311   application.Render();
312
313   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
314   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
315   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
316   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
317   textureTrace.Reset();
318   drawTrace.Reset();
319
320   propertyMap.Insert( ImageVisual::Property::SAMPLING_MODE, Dali::SamplingMode::NEAREST );
321   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 100 );
322   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100 );
323   Actor actor2 = CreateActorWithImageVisual( propertyMap );
324   Stage::GetCurrent().Add(actor2);
325
326   application.SendNotification();
327
328   // Wait for image to load
329   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
330
331   application.SendNotification();
332   application.Render();
333
334   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
335
336   tet_infoline("Test that 2 draw calls occur with 1 new texture gen/bind, i.e. both "
337                "renderers are using different textures\n" );
338
339   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
340   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
341   TraceCallStack::NamedParams tex1;
342   tex1["texture"] = "1";
343   TraceCallStack::NamedParams tex2;
344   tex1["texture"] = "2";
345   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex1), true, TEST_LOCATION );
346   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex2), true, TEST_LOCATION );
347
348   tet_infoline("Test that removing 1 actor deletes it's texture\n");
349
350   Stage::GetCurrent().Remove( actor );
351   application.SendNotification();
352   application.Render();
353
354   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
355   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
356
357   tet_infoline("Test that removing last actor deletes it's texture\n");
358
359   Stage::GetCurrent().Remove( actor2 );
360   application.SendNotification();
361   application.Render();
362
363   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
364   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 2, TEST_LOCATION );
365
366   END_TEST;
367 }
368
369
370 int UtcDaliImageVisualImageHandle(void)
371 {
372   ToolkitTestApplication application;
373   tet_infoline( "Request image visual with an image handle" );
374
375   VisualFactory factory = VisualFactory::Get();
376   DALI_TEST_CHECK( factory );
377
378   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
379   Visual::Base visual = factory.CreateVisual( image );
380
381   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
382   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
383
384   const int width=512;
385   const int height=513;
386
387   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD );
388   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, width, height,width, height );
389
390   TestGlAbstraction& gl = application.GetGlAbstraction();
391   TraceCallStack& textureTrace = gl.GetTextureTrace();
392   textureTrace.Enable(true);
393
394   DummyControl actor = DummyControl::New();
395   TestVisualRender( application, actor, visual, 1u,
396                     ImageDimensions(width, height),
397                     Integration::ResourcePointer(bitmap) );
398
399   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
400   END_TEST;
401 }
402
403 int UtcDaliImageVisualCustomWrapModePixelArea(void)
404 {
405   ToolkitTestApplication application;
406   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" );
407
408   VisualFactory factory = VisualFactory::Get();
409   DALI_TEST_CHECK( factory );
410
411   // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
412   const int width=34;
413   const int height=34;
414   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
415
416   Property::Map propertyMap;
417   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
418   propertyMap.Insert( ImageVisual::Property::URL, TEST_SMALL_IMAGE_FILE_NAME );
419   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
420   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
421   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
422   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
423   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
424   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
425   propertyMap.Insert( ImageVisual::Property::ATLASING, true );
426
427   Visual::Base visual = factory.CreateVisual( propertyMap );
428   DALI_TEST_CHECK( visual );
429
430   TestGlAbstraction& gl = application.GetGlAbstraction();
431   TraceCallStack& textureTrace = gl.GetTextureTrace();
432   textureTrace.Enable(true);
433   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
434   texParameterTrace.Enable( true );
435
436   DummyControl actor = DummyControl::New();
437   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
438   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
439   actor.SetSize(2000, 2000);
440   actor.SetParentOrigin(ParentOrigin::CENTER);
441   Stage::GetCurrent().Add( actor );
442
443   // loading started
444   application.SendNotification();
445   application.Render();
446
447   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
448
449   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
450
451   // WITH atlasing, the wrapping is handled manually in shader, so the following gl function should not be called
452   std::stringstream out;
453   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
454   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
455   out.str("");
456   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
457   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
458
459   // test the uniforms which used to handle the wrap mode
460   Renderer renderer = actor.GetRendererAt( 0u );
461   DALI_TEST_CHECK( renderer );
462
463   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
464   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
465   Vector4 pixelAreaUniform;
466   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
467   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
468
469   Property::Value wrapModeValue = renderer.GetProperty( renderer.GetPropertyIndex( "wrapMode" ) );
470   Vector2 wrapMode( WrapMode::MIRRORED_REPEAT-1, WrapMode::REPEAT-1 );
471   DALI_TEST_EQUALS( wrapModeValue.Get<Vector2>(), wrapMode, TEST_LOCATION );
472   Vector2 wrapModeUniform;
473   DALI_TEST_CHECK( gl.GetUniformValue<Vector2>( "wrapMode", wrapModeUniform ) );
474   DALI_TEST_EQUALS( wrapMode, wrapModeUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
475
476   actor.Unparent( );
477   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
478
479   END_TEST;
480 }
481
482 int UtcDaliImageVisualCustomWrapModeNoAtlas(void)
483 {
484   ToolkitTestApplication application;
485   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" );
486
487   VisualFactory factory = VisualFactory::Get();
488   DALI_TEST_CHECK( factory );
489
490   // Test wrap mode without atlasing. Image with a size bigger than 512*512 will NOT be uploaded as a part of the atlas.
491   const int width=600;
492   const int height=600;
493   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
494
495   Property::Map propertyMap;
496   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
497   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
498   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
499   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
500   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
501   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
502   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
503   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
504
505   Visual::Base visual = factory.CreateVisual( propertyMap );
506   DALI_TEST_CHECK( visual );
507
508   TestGlAbstraction& gl = application.GetGlAbstraction();
509   TraceCallStack& textureTrace = gl.GetTextureTrace();
510   textureTrace.Enable(true);
511   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
512   texParameterTrace.Enable( true );
513
514   DummyControl actor = DummyControl::New();
515   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
516   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
517   actor.SetSize(2000, 2000);
518   actor.SetParentOrigin(ParentOrigin::CENTER);
519   Stage::GetCurrent().Add( actor );
520
521   // loading started
522   application.SendNotification();
523   application.Render();
524
525   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
526
527   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
528
529   // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters
530   std::stringstream out;
531   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
532   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
533   out.str("");
534   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
535   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
536
537   // test the uniforms which used to handle the wrap mode
538   Renderer renderer = actor.GetRendererAt( 0u );
539   DALI_TEST_CHECK( renderer );
540
541   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
542   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
543   Vector4 pixelAreaUniform;
544   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
545   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
546
547   Property::Index wrapModeIndex = renderer.GetPropertyIndex( "wrapMode" );
548   DALI_TEST_CHECK(wrapModeIndex == Property::INVALID_INDEX);
549
550   actor.Unparent();
551   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
552
553   END_TEST;
554 }
555
556 int UtcDaliImageVisualAnimateMixColor(void)
557 {
558   ToolkitTestApplication application;
559   tet_infoline( "Animate mix color" );
560
561   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
562
563   VisualFactory factory = VisualFactory::Get();
564   Property::Map propertyMap;
565   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
566   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
567   propertyMap.Insert("mixColor", Color::BLUE);
568   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
569   Visual::Base visual = factory.CreateVisual( propertyMap );
570
571   DummyControl actor = DummyControl::New(true);
572   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
573   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
574
575   actor.SetSize(2000, 2000);
576   actor.SetParentOrigin(ParentOrigin::CENTER);
577   actor.SetColor(Color::BLACK);
578   Stage::GetCurrent().Add(actor);
579
580   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
581
582   Renderer renderer = actor.GetRendererAt(0);
583   Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::MIX_COLOR );
584   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
585   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
586
587   tet_infoline("Test that the renderer has the mixColor property");
588   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
589
590   const Vector4 TARGET_MIX_COLOR( 1.0f, 0.0f, 0.0f, 0.5f );
591
592   Property::Map map;
593   map["target"] = "testVisual";
594   map["property"] = "mixColor";
595   map["initialValue"] = Color::MAGENTA;
596   map["targetValue"] = TARGET_MIX_COLOR;
597   map["animator"] = Property::Map()
598     .Add("alphaFunction", "LINEAR")
599     .Add("timePeriod", Property::Map()
600          .Add("delay", 0.0f)
601          .Add("duration", 4.0f));
602
603   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
604
605   Animation animation = dummyImpl.CreateTransition( transition );
606
607   blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
608   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
609
610   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
611   animation.Play();
612
613   application.SendNotification();
614   application.Render(0); // Ensure animation starts
615   application.Render(2000u); // Halfway point
616   Vector4 testColor(1.0f, 0.0f, 0.5f, 0.75f );
617
618   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("uColor", Vector4(0.5f, 0.5f, 0.5f, 1.0f )), true, TEST_LOCATION );
619   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", Vector3(testColor)), true, TEST_LOCATION );
620   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", testColor.a), true, TEST_LOCATION );
621
622   application.Render(2000u); // Halfway point between blue and white
623
624   DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
625   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("uColor", Color::WHITE ), true, TEST_LOCATION );
626   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", Vector3(TARGET_MIX_COLOR)), true, TEST_LOCATION );
627   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", TARGET_MIX_COLOR.a), true, TEST_LOCATION );
628
629   TestMixColor( visual, Visual::Property::MIX_COLOR, TARGET_MIX_COLOR );
630
631   blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
632   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
633
634   END_TEST;
635 }
636
637 int UtcDaliImageVisualAnimateOpacity(void)
638 {
639   ToolkitTestApplication application;
640   tet_infoline( "Animate image visual opacity" );
641
642   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
643
644   VisualFactory factory = VisualFactory::Get();
645   Property::Map propertyMap;
646   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
647   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
648   propertyMap.Insert("opacity", 0.5f);
649   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
650   Visual::Base visual = factory.CreateVisual( propertyMap );
651
652   DummyControl actor = DummyControl::New(true);
653   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
654   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
655
656   actor.SetSize(2000, 2000);
657   actor.SetParentOrigin(ParentOrigin::CENTER);
658   actor.SetColor(Color::BLACK);
659   Stage::GetCurrent().Add(actor);
660
661   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
662
663   Renderer renderer = actor.GetRendererAt(0);
664   tet_infoline("Test that the renderer has the opacity property");
665   Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::OPACITY );
666   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
667
668
669   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
670   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
671
672   {
673     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." );
674
675     Property::Map map;
676     map["target"] = "testVisual";
677     map["property"] = "opacity";
678     map["targetValue"] = 1.0f;
679     map["animator"] = Property::Map()
680       .Add("alphaFunction", "LINEAR")
681       .Add("timePeriod", Property::Map()
682            .Add("delay", 0.0f)
683            .Add("duration", 4.0f));
684
685     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
686     Animation animation = dummyImpl.CreateTransition( transition );
687     animation.Play();
688
689     application.SendNotification();
690     application.Render(0);     // Ensure animation starts
691     application.Render(2000u); // Halfway point through animation
692     application.SendNotification(); // Handle any signals
693
694     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.75f), true, TEST_LOCATION );
695
696     application.Render(2001u); // end
697     application.SendNotification(); // ensure animation finished signal is sent
698
699     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 1.0f), true, TEST_LOCATION );
700
701     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
702     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
703   }
704
705
706   {
707     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." );
708
709     Property::Map map;
710     map["target"] = "testVisual";
711     map["property"] = Visual::Property::OPACITY;
712     map["targetValue"] = 0.1f;
713     map["animator"] = Property::Map()
714       .Add("alphaFunction", "LINEAR")
715       .Add("timePeriod", Property::Map()
716            .Add("delay", 0.0f)
717            .Add("duration", 4.0f));
718
719     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
720     Animation animation = dummyImpl.CreateTransition( transition );
721     animation.Play();
722
723     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
724     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
725
726     application.SendNotification();
727     application.Render(0);     // Ensure animation starts
728     application.Render(2000u); // Halfway point
729     application.SendNotification();
730
731     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.55f), true, TEST_LOCATION );
732
733     application.Render(2016u); // end
734     application.SendNotification();
735
736     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.1f), true, TEST_LOCATION );
737
738     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
739     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
740   }
741
742
743   END_TEST;
744 }
745
746 int UtcDaliImageVisualAnimatePixelArea(void)
747 {
748   ToolkitTestApplication application;
749   tet_infoline( "ImageVisual animate pixel area" );
750
751   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
752
753   VisualFactory factory = VisualFactory::Get();
754   Property::Map propertyMap;
755   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
756   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
757   propertyMap.Insert("mixColor", Color::BLUE);
758   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
759   Visual::Base visual = factory.CreateVisual( propertyMap );
760
761   DummyControl actor = DummyControl::New(true);
762   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
763   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
764
765   actor.SetSize(2000, 2000);
766   actor.SetParentOrigin(ParentOrigin::CENTER);
767   actor.SetColor(Color::BLACK);
768   Stage::GetCurrent().Add(actor);
769
770   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
771
772   Renderer renderer = actor.GetRendererAt(0);
773   Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::MIX_COLOR );
774
775   tet_infoline("Test that the renderer has the mixColor property");
776   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
777
778   // TransitionData only takes string keys
779   Property::Map map;
780   map["target"] = "testVisual";
781   map["property"] = "pixelArea";
782   map["initialValue"] = Vector4( 0,0,0,1 );
783   map["targetValue"] = Vector4( 0,0,1,1 ); // Animate width from zero to full
784   map["animator"] = Property::Map()
785     .Add("alphaFunction", "LINEAR")
786     .Add("timePeriod", Property::Map()
787          .Add("delay", 0.0f)
788          .Add("duration", 4.0f));
789
790   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
791
792   Animation animation = dummyImpl.CreateTransition( transition );
793   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
794   animation.Play();
795
796   application.SendNotification();
797   application.Render(0);     // Ensure animation starts
798   application.Render(2000u); // Halfway point
799
800   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4(0.0f, 0.0f, 0.5f, 1.0f )), true, TEST_LOCATION );
801
802   application.Render(2000u); // End of animation
803
804   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4( 0.0f, 0.0f, 1.0f, 1.0f )), true, TEST_LOCATION );
805
806   END_TEST;
807 }
808
809 int UtcDaliImageVisualTextureCancelRemoteLoad(void)
810 {
811   ToolkitTestApplication application;
812   tet_infoline( "Request remote image visual, then destroy visual to cancel load" );
813
814   Property::Map propertyMap;
815   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
816   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
817
818   TestGlAbstraction& gl = application.GetGlAbstraction();
819   TraceCallStack& textureTrace = gl.GetTextureTrace();
820   textureTrace.Enable(true);
821   TraceCallStack& drawTrace = gl.GetDrawTrace();
822   drawTrace.Enable(true);
823
824   Actor actor = CreateActorWithImageVisual( propertyMap );
825   Stage::GetCurrent().Add( actor );
826   application.SendNotification();
827
828   Stage::GetCurrent().Remove( actor );
829   application.SendNotification();
830
831   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
832   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
833   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), false, TEST_LOCATION );
834   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION );
835
836   END_TEST;
837 }
838
839 int UtcDaliImageVisualTextureCancelAsyncLoad(void)
840 {
841   ToolkitTestApplication application;
842   tet_infoline( "Load image asynchronosly, cancel loading, then load again" );
843
844   VisualFactory factory = VisualFactory::Get();
845   DALI_TEST_CHECK( factory );
846
847   Property::Map propertyMap;
848   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
849   propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
850
851   Visual::Base visual = factory.CreateVisual( propertyMap );
852   DALI_TEST_CHECK( visual );
853
854   TestGlAbstraction& gl = application.GetGlAbstraction();
855   TraceCallStack& textureTrace = gl.GetTextureTrace();
856   textureTrace.Enable( true );
857   TraceCallStack& drawTrace = gl.GetDrawTrace();
858   drawTrace.Enable( true );
859
860   DummyControl actor = DummyControl::New();
861   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
862   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
863
864   Stage::GetCurrent().Add( actor );
865
866   // Cancel loading
867   Stage::GetCurrent().Remove( actor );
868
869   Stage::GetCurrent().Add( actor );
870
871   // Create another visual with the same image
872   visual = factory.CreateVisual( propertyMap );
873   DALI_TEST_CHECK( visual );
874
875   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
876
877   application.SendNotification();
878   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
879
880   application.SendNotification();
881   application.Render();
882
883   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
884   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
885   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
886   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
887
888   END_TEST;
889 }
890
891 int UtcDaliImageVisualSetInvalidAsyncImage(void)
892 {
893   ToolkitTestApplication application;
894   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
895
896   VisualFactory factory = VisualFactory::Get();
897   DALI_TEST_CHECK( factory );
898
899   Property::Map propertyMap;
900   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
901   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
902
903   Visual::Base visual = factory.CreateVisual( propertyMap );
904   DALI_TEST_CHECK( visual );
905
906   TestGlAbstraction& gl = application.GetGlAbstraction();
907   TraceCallStack& textureTrace = gl.GetTextureTrace();
908   textureTrace.Enable(true);
909
910   DummyControl actor = DummyControl::New();
911   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
912   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
913
914   actor.SetSize( 200.f, 200.f );
915   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
916
917   Stage::GetCurrent().Add( actor );
918
919   application.SendNotification();
920   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
921
922   application.SendNotification();
923   application.Render();
924
925   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
926   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
927
928   Stage::GetCurrent().Remove( actor );
929   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
930
931   END_TEST;
932 }
933
934 int UtcDaliImageVisualSetInvalidSyncImage(void)
935 {
936   ToolkitTestApplication application;
937   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
938
939   VisualFactory factory = VisualFactory::Get();
940   DALI_TEST_CHECK( factory );
941
942   Property::Map propertyMap;
943   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
944   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
945   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
946
947   Visual::Base visual = factory.CreateVisual( propertyMap );
948   DALI_TEST_CHECK( visual );
949
950   TestGlAbstraction& gl = application.GetGlAbstraction();
951   TraceCallStack& textureTrace = gl.GetTextureTrace();
952   textureTrace.Enable(true);
953
954   DummyControl actor = DummyControl::New();
955   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
956   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
957
958   actor.SetSize( 200.f, 200.f );
959   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
960
961   Stage::GetCurrent().Add( actor );
962
963   application.SendNotification();
964   application.Render();
965
966   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
967   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
968
969   Stage::GetCurrent().Remove( actor );
970   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
971
972   END_TEST;
973 }
974
975 int UtcDaliImageVisualSetInvalidRemoteImage(void)
976 {
977   ToolkitTestApplication application;
978   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
979
980   VisualFactory factory = VisualFactory::Get();
981   DALI_TEST_CHECK( factory );
982
983   // Local invalid file, asynchronous loading
984   Property::Map propertyMap;
985   propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
986   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_INVALID_FILE_NAME );
987
988   Visual::Base visual = factory.CreateVisual( propertyMap );
989   DALI_TEST_CHECK( visual );
990
991   TestGlAbstraction& gl = application.GetGlAbstraction();
992   TraceCallStack& textureTrace = gl.GetTextureTrace();
993   textureTrace.Enable(true);
994
995   DummyControl actor = DummyControl::New();
996   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
997   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
998
999   actor.SetSize( 200.f, 200.f );
1000   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1001
1002   Stage::GetCurrent().Add( actor );
1003
1004   application.SendNotification();
1005   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1006
1007   application.SendNotification();
1008   application.Render();
1009
1010   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1011   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1012
1013   Stage::GetCurrent().Remove( actor );
1014   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1015
1016   END_TEST;
1017 }
1018
1019 int UtcDaliImageVisualAlphaMask(void)
1020 {
1021   ToolkitTestApplication application;
1022   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1023
1024   VisualFactory factory = VisualFactory::Get();
1025   DALI_TEST_CHECK( factory );
1026
1027   Property::Map propertyMap;
1028   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1029   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1030   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1031
1032   Visual::Base visual = factory.CreateVisual( propertyMap );
1033   DALI_TEST_CHECK( visual );
1034
1035   Property::Map testMap;
1036   visual.CreatePropertyMap(testMap);
1037   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1038
1039   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1040   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1041
1042   TestGlAbstraction& gl = application.GetGlAbstraction();
1043   TraceCallStack& textureTrace = gl.GetTextureTrace();
1044   textureTrace.Enable(true);
1045
1046   DummyControl actor = DummyControl::New();
1047   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1048   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1049
1050   actor.SetSize( 200.f, 200.f );
1051   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1052   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1053
1054   Stage::GetCurrent().Add( actor );
1055   application.SendNotification();
1056   application.Render();
1057
1058   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1059
1060   application.SendNotification();
1061   application.Render();
1062
1063   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1064   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1065   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1066
1067   dummyImpl.UnregisterVisual(  Control::CONTROL_PROPERTY_END_INDEX + 1 );
1068   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1069
1070   END_TEST;
1071 }
1072
1073 int UtcDaliImageVisualRemoteAlphaMask(void)
1074 {
1075   ToolkitTestApplication application;
1076   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1077
1078   VisualFactory factory = VisualFactory::Get();
1079   DALI_TEST_CHECK( factory );
1080
1081   const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1082
1083   Property::Map propertyMap;
1084   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1085   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1086   propertyMap.Insert( "alphaMaskUrl", MASK_IMAGE );
1087
1088   Visual::Base visual = factory.CreateVisual( propertyMap );
1089   DALI_TEST_CHECK( visual );
1090
1091   Property::Map testMap;
1092   visual.CreatePropertyMap(testMap);
1093   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION );
1094
1095   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1096   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1097
1098   TestGlAbstraction& gl = application.GetGlAbstraction();
1099   TraceCallStack& textureTrace = gl.GetTextureTrace();
1100   textureTrace.Enable(true);
1101
1102   DummyControl actor = DummyControl::New();
1103   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1104   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1105   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1106
1107   actor.SetSize( 200.f, 200.f );
1108   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1109
1110   Stage::GetCurrent().Add( actor );
1111   application.SendNotification();
1112   application.Render();
1113
1114   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1115
1116   application.SendNotification();
1117   application.Render();
1118
1119   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1120   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1121   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1122
1123   END_TEST;
1124 }
1125
1126
1127 int UtcDaliImageVisualAlphaMaskCrop(void)
1128 {
1129   ToolkitTestApplication application;
1130   tet_infoline( "Request image visual with an Alpha mask and scale/cropping" );
1131
1132   VisualFactory factory = VisualFactory::Get();
1133   DALI_TEST_CHECK( factory );
1134
1135   Property::Map propertyMap;
1136   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1137   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1138   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1139   propertyMap.Insert( ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f );
1140   propertyMap.Insert( ImageVisual::Property::CROP_TO_MASK, true );
1141
1142   Visual::Base visual = factory.CreateVisual( propertyMap );
1143   DALI_TEST_CHECK( visual );
1144
1145   Property::Map testMap;
1146   visual.CreatePropertyMap(testMap);
1147   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1148   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE), Property::Value(1.6f), TEST_LOCATION );
1149   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::CROP_TO_MASK),Property::Value(true), TEST_LOCATION );
1150
1151   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1152   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1153
1154   TestGlAbstraction& gl = application.GetGlAbstraction();
1155   TraceCallStack& textureTrace = gl.GetTextureTrace();
1156   textureTrace.Enable(true);
1157
1158   DummyControl actor = DummyControl::New();
1159   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1160   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1161
1162   actor.SetSize( 200.f, 200.f );
1163   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1164   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1165
1166   Stage::GetCurrent().Add( actor );
1167   application.SendNotification();
1168   application.Render();
1169
1170   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1171
1172   application.SendNotification();
1173   application.Render();
1174
1175   Vector2 size;
1176   visual.GetNaturalSize(size);
1177
1178   DALI_TEST_EQUALS( size, Vector2( 100.0f, 100.0f ), 0.001f, TEST_LOCATION );
1179   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1180   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1181   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1182
1183   END_TEST;
1184 }
1185
1186 int UtcDaliImageVisualReleasePolicy01(void)
1187 {
1188   ToolkitTestApplication application;
1189   tet_infoline( "UtcDaliImageVisualReleasePolicy01 Detached Policy, disabling visual with this policy deletes texture" );
1190
1191   VisualFactory factory = VisualFactory::Get();
1192
1193   Property::Map propertyMap;
1194   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1195   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1196   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1197   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1198   propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY, DevelImageVisual::ReleasePolicy::DETACHED );
1199
1200   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1201   DALI_TEST_CHECK( imageVisual );
1202
1203   // Set up debug trace
1204   TestGlAbstraction& gl = application.GetGlAbstraction();
1205   TraceCallStack& textureTrace = gl.GetTextureTrace();
1206   textureTrace.Enable(true);
1207
1208   tet_infoline( "Register visual with control and ensure it has the only handle" );
1209   DummyControl actor = DummyControl::New(true);
1210   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1211   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1212   imageVisual.Reset();
1213
1214   actor.SetSize(200.f, 200.f);
1215
1216   application.SendNotification();
1217   application.Render(0);
1218   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1219   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1220
1221   Stage::GetCurrent().Add( actor );
1222
1223   // Wait for image to load
1224   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1225
1226   application.SendNotification();
1227   application.Render(0);
1228   // Test renderer and texture created
1229   tet_infoline( "Confirm texture created" );
1230   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1231   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1232
1233   tet_infoline( "Disable visual causing the texture to be deleted" );
1234   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1235
1236   application.SendNotification();
1237   application.Render(0);
1238   // Test renderer and textures removed.
1239   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1240   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1241
1242   END_TEST;
1243 }
1244
1245 int UtcDaliImageVisualReleasePolicy02(void)
1246 {
1247   ToolkitTestApplication application;
1248   tet_infoline( "UtcDaliImageVisualReleasePolicy02 Destroyed Policy, Texture should be deleted when visual destroyed" );
1249
1250   VisualFactory factory = VisualFactory::Get();
1251   const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1252
1253   Property::Map propertyMap;
1254   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1255   propertyMap.Insert( Visual::Property::MIX_COLOR, Color::MAGENTA );
1256   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1257   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1258   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1259   propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1260
1261   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1262   DALI_TEST_CHECK( imageVisual );
1263
1264   // Setup debug trace
1265   TestGlAbstraction& gl = application.GetGlAbstraction();
1266   TraceCallStack& textureTrace = gl.GetTextureTrace();
1267   textureTrace.Enable(true);
1268
1269   tet_infoline( "Register visual with control and ensure it has the only handle" );
1270   DummyControl actor = DummyControl::New(true);
1271   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1272   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1273   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1274
1275   actor.SetSize(200.f, 200.f);
1276
1277   application.SendNotification();
1278   application.Render(0);
1279   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1280   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1281
1282   Stage::GetCurrent().Add( actor );
1283
1284   // Wait for image to load
1285   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1286
1287   application.SendNotification();
1288   application.Render(0);
1289   // Test renderer and texture created
1290   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1291   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1292
1293
1294   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1295   tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1296   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1297   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1298   application.SendNotification();
1299   application.Render();
1300
1301   // Test texture removed after visual destroyed.
1302   tet_infoline( "Ensure texture is deleted after visual destroyed" );
1303   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1304
1305   END_TEST;
1306 }
1307
1308 int UtcDaliImageVisualReleasePolicy03(void)
1309 {
1310   ToolkitTestApplication application;
1311   tet_infoline( "UtcDaliImageVisualReleasePolicy03 Never Policy, texture should not be deleted after visual destroyed" );
1312
1313   VisualFactory factory = VisualFactory::Get();
1314
1315   Property::Map propertyMap;
1316   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1317   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1318   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1319   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1320   propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1321
1322   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1323   DALI_TEST_CHECK( imageVisual );
1324
1325   TestGlAbstraction& gl = application.GetGlAbstraction();
1326   TraceCallStack& textureTrace = gl.GetTextureTrace();
1327   textureTrace.Enable(true);
1328
1329   tet_infoline( "Register visual with control and ensure it has the only handle" );
1330   DummyControl actor = DummyControl::New(true);
1331   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1332   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1333   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1334
1335   actor.SetSize(200.f, 200.f);
1336
1337   application.SendNotification();
1338   application.Render(0);
1339   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1340   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1341
1342   Stage::GetCurrent().Add( actor );
1343
1344   // Wait for image to load
1345   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1346
1347   application.SendNotification();
1348   application.Render(0);
1349   // Test renderer and texture created
1350   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1351   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1352
1353   tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1354   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1355   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1356   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1357   application.SendNotification();
1358   application.Render();
1359
1360   tet_infoline( "Ensure texture is not deleted as policy is set to NEVER" );
1361   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1362
1363   END_TEST;
1364 }
1365
1366 int UtcDaliImageVisualReleasePolicy04(void)
1367 {
1368   ToolkitTestApplication application;
1369   tet_infoline( "UtcDaliImageVisualReleasePolicy04 Two visuals with different policies sharing a texture" );
1370
1371   VisualFactory factory = VisualFactory::Get();
1372
1373   tet_infoline( "Create first visual with Never release policy" );
1374   Property::Map propertyMapNeverReleasePolicy;
1375   propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1376   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1377   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1378   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1379   propertyMapNeverReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1380   Visual::Base imageVisualNever = factory.CreateVisual( propertyMapNeverReleasePolicy );
1381
1382   tet_infoline( "Create second visual with Destroyed release policy");
1383   Property::Map propertyMapDestroyedReleasePolicy;
1384   propertyMapDestroyedReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1385   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1386   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1387   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1388   propertyMapDestroyedReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1389   Visual::Base imageVisualDestroyed = factory.CreateVisual( propertyMapDestroyedReleasePolicy );
1390
1391   // Set up trace debug
1392   TestGlAbstraction& gl = application.GetGlAbstraction();
1393   TraceCallStack& textureTrace = gl.GetTextureTrace();
1394   textureTrace.Enable(true);
1395
1396   tet_infoline( "Register visuals with control and ensure it has the only handles" );
1397   DummyControl actor = DummyControl::New(true);
1398   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1399   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualNever );
1400   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDestroyed );
1401   imageVisualNever.Reset(); // reduce ref count so only the control keeps the visual alive.
1402   imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
1403
1404   actor.SetSize(200.f, 200.f);
1405
1406   // Test initially zero renderers
1407   application.SendNotification();
1408   application.Render(0);
1409   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1410   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1411
1412   Stage::GetCurrent().Add( actor );
1413
1414   // Wait for image to load
1415   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1416
1417   application.SendNotification();
1418   application.Render(0);
1419   tet_infoline( "Ensure a texture is created, shared amongst both visuals.  Each visual has its own renderer" );
1420   DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
1421   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1422
1423   // Test renderer removed when visual destroyed
1424   DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
1425   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL2 );  // TEST_VISUAL2 no longer requires the texture as release policy DESTROYED
1426   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1427   application.SendNotification();
1428   application.Render();
1429
1430   // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
1431   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1432
1433   dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1434   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1435   application.SendNotification();
1436   application.Render();
1437
1438   tet_infoline( "Ensure a texture is not deleted as second visual used the NEVER release policy" );
1439   // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
1440   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1441
1442   END_TEST;
1443 }
1444
1445 int UtcDaliImageVisualReleasePolicy05(void)
1446 {
1447   ToolkitTestApplication application;
1448   tet_infoline( "UtcDaliImageVisualReleasePolicy05 Testing settung by string currents correct enum" );
1449
1450   VisualFactory factory = VisualFactory::Get();
1451
1452   Property::Map propertyMapNeverReleasePolicy;
1453   propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1454   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1455   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1456   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1457   propertyMapNeverReleasePolicy.Insert( "releasePolicy" , "never" );
1458
1459   Visual::Base imageVisualNever = factory.CreateVisual( propertyMapNeverReleasePolicy );
1460
1461   Property::Map resultMap;
1462   imageVisualNever.CreatePropertyMap( resultMap );
1463   DALI_TEST_CHECK( ! resultMap.Empty() );
1464
1465   DALI_TEST_EQUALS( ( resultMap.Find( DevelImageVisual::Property::RELEASE_POLICY ) )->Get<int>(), (int)DevelImageVisual::ReleasePolicy::NEVER, TEST_LOCATION );
1466
1467   END_TEST;
1468 }
1469
1470 int UtcDaliImageVisualReleasePolicy06(void)
1471 {
1472   ToolkitTestApplication application;
1473   tet_infoline( "UtcDaliImageVisualReleasePolicy06 Never Policy, texture should not be affected by Disabling and Enabling visual" );
1474
1475   VisualFactory factory = VisualFactory::Get();
1476
1477   Property::Map propertyMap;
1478   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1479   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1480   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1481   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1482   propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1483
1484   Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1485   DALI_TEST_CHECK( imageVisual );
1486
1487   TestGlAbstraction& gl = application.GetGlAbstraction();
1488   TraceCallStack& textureTrace = gl.GetTextureTrace();
1489   textureTrace.Enable(true);
1490
1491   tet_infoline( "Register visual with control and ensure it has the only handle" );
1492   DummyControl actor = DummyControl::New(true);
1493   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1494   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1495   imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1496
1497   actor.SetSize(200.f, 200.f);
1498
1499   application.SendNotification();
1500   application.Render(0);
1501   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1502   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1503
1504   Stage::GetCurrent().Add( actor );
1505
1506   // Wait for image to load
1507   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1508
1509   application.SendNotification();
1510   application.Render(0);
1511   // Test renderer and texture created
1512   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1513   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1514   textureTrace.Reset();
1515
1516   tet_infoline( "Disable Visual and check texture not affected" );
1517   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1518   application.SendNotification();
1519   application.Render(0);
1520   tet_infoline( "Check renderer is destroyed when visual off stage" );
1521   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1522   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1523   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1524   textureTrace.Reset();
1525
1526   tet_infoline( "Re-enable Visual and check texture not affected" );
1527   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, true );
1528   application.SendNotification();
1529   application.Render(0);
1530   tet_infoline( "Check texture not affected and renderer is destroyed when visual off stage" );
1531   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1532   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1533   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1534
1535   END_TEST;
1536 }
1537
1538 int UtcDaliImageVisualReleasePolicy07(void)
1539 {
1540   ToolkitTestApplication application;
1541   tet_infoline( "UtcDaliImageVisualReleasePolicy07 Two visuals with different policies sharing a texture DETACHED and DESTROYED" );
1542
1543   VisualFactory factory = VisualFactory::Get();
1544
1545   tet_infoline( "Create first visual with DESTROYED release policy" );
1546   Property::Map propertyMapNeverReleasePolicy;
1547   propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1548   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1549   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1550   propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1551   propertyMapNeverReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1552   Visual::Base imageVisualDestroyed = factory.CreateVisual( propertyMapNeverReleasePolicy );
1553
1554   tet_infoline( "Create second visual with DETACHED release policy");
1555   Property::Map propertyMapDestroyedReleasePolicy;
1556   propertyMapDestroyedReleasePolicy.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1557   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1558   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH,   20 );
1559   propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT,   30 );
1560   propertyMapDestroyedReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DETACHED );
1561   Visual::Base imageVisualDetached = factory.CreateVisual( propertyMapDestroyedReleasePolicy );
1562
1563   // Set up trace debug
1564   TestGlAbstraction& gl = application.GetGlAbstraction();
1565   TraceCallStack& textureTrace = gl.GetTextureTrace();
1566   textureTrace.Enable(true);
1567
1568   tet_infoline( "Register visuals with control and ensure it has the only handles" );
1569   DummyControl actor = DummyControl::New(true);
1570   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1571   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualDestroyed );
1572   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDetached );
1573   imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
1574   imageVisualDetached.Reset(); // reduce ref count so only the control keeps the visual alive.
1575
1576   actor.SetSize(200.f, 200.f);
1577
1578   // Test initially zero renderers
1579   application.SendNotification();
1580   application.Render(0);
1581   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1582   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1583
1584   Stage::GetCurrent().Add( actor );
1585
1586   // Wait for image to load
1587   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1588
1589   application.SendNotification();
1590   application.Render(0);
1591   tet_infoline( "Ensure a texture is created, shared amongst both visuals.  Each visual has its own renderer" );
1592   DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
1593   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1594
1595   // Test renderer removed when visual destroyed
1596   DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
1597   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL2, false );  // TEST_VISUAL2 no longer requires the texture as release policy DETACHED
1598   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1599   application.SendNotification();
1600   application.Render();
1601
1602   // Test texture was not deleted as TEST_VISUAL release policy is DESTROYED and is still required.
1603   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1604
1605   dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1606   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1607   application.SendNotification();
1608   application.Render();
1609
1610   tet_infoline( "Ensure a texture is not deleted as second visual used the DESTROYED release policy" );
1611   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1612
1613   END_TEST;
1614 }