[dali_1.2.60] Merge branch 'devel/master'
[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/images/nine-patch-image.h>
23 #include <dali/devel-api/object/handle-devel.h>
24 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
25 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
26 #include <dali-toolkit/devel-api/controls/control-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   END_TEST;
1068 }
1069
1070 int UtcDaliImageVisualRemoteAlphaMask(void)
1071 {
1072   ToolkitTestApplication application;
1073   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1074
1075   VisualFactory factory = VisualFactory::Get();
1076   DALI_TEST_CHECK( factory );
1077
1078   const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1079
1080   Property::Map propertyMap;
1081   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1082   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1083   propertyMap.Insert( "alphaMaskUrl", MASK_IMAGE );
1084
1085   Visual::Base visual = factory.CreateVisual( propertyMap );
1086   DALI_TEST_CHECK( visual );
1087
1088   Property::Map testMap;
1089   visual.CreatePropertyMap(testMap);
1090   DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION );
1091
1092   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1093   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1094
1095   TestGlAbstraction& gl = application.GetGlAbstraction();
1096   TraceCallStack& textureTrace = gl.GetTextureTrace();
1097   textureTrace.Enable(true);
1098
1099   DummyControl actor = DummyControl::New();
1100   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1101   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1102   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1103
1104   actor.SetSize( 200.f, 200.f );
1105   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1106
1107   Stage::GetCurrent().Add( actor );
1108   application.SendNotification();
1109   application.Render();
1110
1111   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1112
1113   application.SendNotification();
1114   application.Render();
1115
1116   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1117   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1118   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1119
1120   END_TEST;
1121 }
1122
1123
1124 int UtcDaliImageVisualAlphaMaskCrop(void)
1125 {
1126   ToolkitTestApplication application;
1127   tet_infoline( "Request image visual with an Alpha mask and scale/cropping" );
1128
1129   VisualFactory factory = VisualFactory::Get();
1130   DALI_TEST_CHECK( factory );
1131
1132   Property::Map propertyMap;
1133   propertyMap.Insert( Toolkit::Visual::Property::TYPE,  Visual::IMAGE );
1134   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1135   propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1136   propertyMap.Insert( ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f );
1137   propertyMap.Insert( ImageVisual::Property::CROP_TO_MASK, true );
1138
1139   Visual::Base visual = factory.CreateVisual( propertyMap );
1140   DALI_TEST_CHECK( visual );
1141
1142   Property::Map testMap;
1143   visual.CreatePropertyMap(testMap);
1144   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1145   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE), Property::Value(1.6f), TEST_LOCATION );
1146   DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::CROP_TO_MASK),Property::Value(true), TEST_LOCATION );
1147
1148   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1149   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1150
1151   TestGlAbstraction& gl = application.GetGlAbstraction();
1152   TraceCallStack& textureTrace = gl.GetTextureTrace();
1153   textureTrace.Enable(true);
1154
1155   DummyControl actor = DummyControl::New();
1156   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1157   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1158
1159   actor.SetSize( 200.f, 200.f );
1160   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1161   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1162
1163   Stage::GetCurrent().Add( actor );
1164   application.SendNotification();
1165   application.Render();
1166
1167   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1168
1169   application.SendNotification();
1170   application.Render();
1171
1172   Vector2 size;
1173   visual.GetNaturalSize(size);
1174
1175   DALI_TEST_EQUALS( size, Vector2( 100.0f, 100.0f ), 0.001f, TEST_LOCATION );
1176   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1177   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1178   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1179
1180   END_TEST;
1181 }