a7437930950564e60dc322554ac5edfc677c1aea
[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/public-api/rendering/renderer.h>
23 #include <dali/public-api/rendering/texture-set.h>
24 #include <dali/public-api/rendering/shader.h>
25 #include <dali/devel-api/images/nine-patch-image.h>
26 #include <dali/devel-api/object/handle-devel.h>
27 #include <dali-toolkit/devel-api/align-enums.h>
28 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali-toolkit/devel-api/controls/control-devel.h>
33 #include <dali-toolkit/dali-toolkit.h>
34 #include "dummy-control.h"
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void dali_image_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_image_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 namespace
50 {
51 const char* TEST_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/gallery-small-1.jpg";
52 const char* TEST_LARGE_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/tbcol.png";
53 const char* TEST_SMALL_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/icon-edit.png";
54 const char* TEST_REMOTE_IMAGE_FILE_NAME = "https://www.tizen.org/sites/all/themes/tizen_theme/logo.png";
55 const char* TEST_INVALID_FILE_NAME =  TEST_RESOURCE_DIR  "/invalid.jpg";
56 const char* TEST_REMOTE_INVALID_FILE_NAME = "https://www.tizen.org/invalid.png";
57 const char* TEST_MASK_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR "/mask.png";
58 }
59
60
61 Actor CreateActorWithImageVisual(const Property::Map& map)
62 {
63   VisualFactory factory = VisualFactory::Get();
64   DummyControl actor = DummyControl::New();
65   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
66   Visual::Base visual = factory.CreateVisual( map );
67   DALI_TEST_CHECK( visual );
68   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
69   actor.SetSize( 200.f, 200.f );
70   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
71   return actor;
72 }
73
74 void TestVisualRender( ToolkitTestApplication& application,
75                        DummyControl& actor,
76                        Visual::Base& visual,
77                        std::size_t expectedSamplers = 0,
78                        ImageDimensions imageDimensions = ImageDimensions(),
79                        Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
80 {
81   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
82   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
83
84   if( resourcePtr )
85   {
86     // set the image size, for test case, this needs to be set before loading started
87     application.GetPlatform().SetClosestImageSize(  Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) );
88   }
89
90   actor.SetSize( 200.f, 200.f );
91   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
92
93   Stage::GetCurrent().Add( actor );
94
95   application.SendNotification(); // Send messages to update
96   application.Render();           // process update and render
97   application.SendNotification(); // process any signals to event
98
99   if( resourcePtr )
100   {
101     DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION);
102   }
103
104   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
105 }
106
107 static void TestMixColor( Visual::Base visual, Property::Index mixColorIndex, const Vector4& testColor )
108 {
109   Property::Map map;
110   visual.CreatePropertyMap(map);
111   Property::Value* value = map.Find( mixColorIndex );
112   DALI_TEST_CHECK( value );
113   Vector3 mixColor1;
114   DALI_TEST_CHECK( value->Get( mixColor1 ) );
115   DALI_TEST_EQUALS( mixColor1, Vector3(testColor), 0.001, TEST_LOCATION );
116
117   value = map.Find( DevelVisual::Property::MIX_COLOR );
118   DALI_TEST_CHECK( value );
119   Vector4 mixColor2;
120   DALI_TEST_CHECK( value->Get( mixColor2 ) );
121   DALI_TEST_EQUALS( mixColor2, testColor, 0.001, TEST_LOCATION );
122
123   value = map.Find( DevelVisual::Property::OPACITY );
124   DALI_TEST_CHECK( value );
125   float opacity;
126   DALI_TEST_CHECK( value->Get( opacity ) );
127   DALI_TEST_EQUALS( opacity, testColor.a, 0.001, TEST_LOCATION );
128 }
129
130
131
132 int UtcDaliImageVisualPropertyMap(void)
133 {
134   ToolkitTestApplication application;
135   tet_infoline( "Request image visual with a Property::Map" );
136
137   VisualFactory factory = VisualFactory::Get();
138   DALI_TEST_CHECK( factory );
139
140   Property::Map propertyMap;
141   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
142   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
143
144   Visual::Base visual = factory.CreateVisual( propertyMap );
145   DALI_TEST_CHECK( visual );
146
147   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
148   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
149
150   TestGlAbstraction& gl = application.GetGlAbstraction();
151   TraceCallStack& textureTrace = gl.GetTextureTrace();
152   textureTrace.Enable(true);
153
154   DummyControl actor = DummyControl::New();
155   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
156   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
157
158   actor.SetSize( 200.f, 200.f );
159   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
160
161   Stage::GetCurrent().Add( actor );
162   application.SendNotification();
163   application.Render();
164
165   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
166
167   application.SendNotification();
168   application.Render();
169
170   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
171
172   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
173
174   Stage::GetCurrent().Remove( actor );
175   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
176
177   END_TEST;
178 }
179
180
181 int UtcDaliImageVisualRemoteImageLoad(void)
182 {
183   ToolkitTestApplication application;
184   tet_infoline( "Request remote image visual with a Property::Map" );
185
186   VisualFactory factory = VisualFactory::Get();
187   DALI_TEST_CHECK( factory );
188
189   Property::Map propertyMap;
190   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
191   propertyMap.Insert( ImageVisual::Property::URL,  TEST_REMOTE_IMAGE_FILE_NAME );
192
193   Visual::Base visual = factory.CreateVisual( propertyMap );
194   DALI_TEST_CHECK( visual );
195
196   TestGlAbstraction& gl = application.GetGlAbstraction();
197   TraceCallStack& textureTrace = gl.GetTextureTrace();
198   textureTrace.Enable(true);
199
200   DummyControl actor = DummyControl::New();
201   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
202   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
203
204   actor.SetSize( 200.f, 200.f );
205   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
206
207   Stage::GetCurrent().Add( actor );
208   application.SendNotification();
209
210   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
211
212   application.SendNotification();
213   application.Render();
214
215   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
216   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
217
218   Stage::GetCurrent().Remove( actor );
219   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
220
221   END_TEST;
222 }
223
224 int UtcDaliImageVisualTextureReuse1(void)
225 {
226   ToolkitTestApplication application;
227   tet_infoline( "Request remote image visual with a Property::Map; request a second visual with the same property map - should reuse texture" );
228
229   Property::Map propertyMap;
230   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
231   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
232
233   TestGlAbstraction& gl = application.GetGlAbstraction();
234   TraceCallStack& textureTrace = gl.GetTextureTrace();
235   textureTrace.Enable(true);
236   TraceCallStack& drawTrace = gl.GetDrawTrace();
237   drawTrace.Enable(true);
238
239   Actor actor = CreateActorWithImageVisual( propertyMap );
240   Stage::GetCurrent().Add( actor );
241   application.SendNotification();
242
243   // Wait for image to load
244   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
245
246   application.SendNotification();
247   application.Render();
248
249   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
250   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
251   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
252   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
253   textureTrace.Reset();
254   drawTrace.Reset();
255
256   Actor actor2 = CreateActorWithImageVisual( propertyMap );
257   Stage::GetCurrent().Add(actor2);
258
259   application.SendNotification(); // Send messages to update
260   application.Render();           // process update and render
261   application.SendNotification(); // process any signals to event
262
263   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
264
265   tet_infoline("Test that 2 draw calls occur with no new texture gens/binds, i.e. both\n"
266                "draw calls use the same texture as the previous draw call\n" );
267
268   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
269   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
270   DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION );
271
272   tet_infoline("Test that removing 1 actor doesn't delete the texture\n");
273
274   Stage::GetCurrent().Remove( actor );
275   application.SendNotification();
276   application.Render();
277
278   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
279   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
280
281   tet_infoline("Test that removing last actor does delete the texture\n");
282
283   Stage::GetCurrent().Remove( actor2 );
284   application.SendNotification();
285   application.Render();
286
287   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
288   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
289
290   END_TEST;
291 }
292
293
294 int UtcDaliImageVisualTextureReuse2(void)
295 {
296   ToolkitTestApplication application;
297   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" );
298
299   Property::Map propertyMap;
300   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
301   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
302
303   TestGlAbstraction& gl = application.GetGlAbstraction();
304   TraceCallStack& textureTrace = gl.GetTextureTrace();
305   textureTrace.Enable(true);
306   TraceCallStack& drawTrace = gl.GetDrawTrace();
307   drawTrace.Enable(true);
308
309   Actor actor = CreateActorWithImageVisual( propertyMap );
310   Stage::GetCurrent().Add( actor );
311   application.SendNotification();
312
313   // Wait for image to load
314   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
315
316   application.SendNotification();
317   application.Render();
318
319   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
320   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
321   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
322   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
323   textureTrace.Reset();
324   drawTrace.Reset();
325
326   propertyMap.Insert( ImageVisual::Property::SAMPLING_MODE, Dali::SamplingMode::NEAREST );
327   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 100 );
328   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100 );
329   Actor actor2 = CreateActorWithImageVisual( propertyMap );
330   Stage::GetCurrent().Add(actor2);
331
332   application.SendNotification();
333
334   // Wait for image to load
335   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
336
337   application.SendNotification();
338   application.Render();
339
340   DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
341
342   tet_infoline("Test that 2 draw calls occur with 1 new texture gen/bind, i.e. both "
343                "renderers are using different textures\n" );
344
345   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
346   DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION );
347   TraceCallStack::NamedParams tex1;
348   tex1["texture"] = "1";
349   TraceCallStack::NamedParams tex2;
350   tex1["texture"] = "2";
351   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex1), true, TEST_LOCATION );
352   DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex2), true, TEST_LOCATION );
353
354   tet_infoline("Test that removing 1 actor deletes it's texture\n");
355
356   Stage::GetCurrent().Remove( actor );
357   application.SendNotification();
358   application.Render();
359
360   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
361   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
362
363   tet_infoline("Test that removing last actor deletes it's texture\n");
364
365   Stage::GetCurrent().Remove( actor2 );
366   application.SendNotification();
367   application.Render();
368
369   DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
370   DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 2, TEST_LOCATION );
371
372   END_TEST;
373 }
374
375
376 int UtcDaliImageVisualImageHandle(void)
377 {
378   ToolkitTestApplication application;
379   tet_infoline( "Request image visual with an image handle" );
380
381   VisualFactory factory = VisualFactory::Get();
382   DALI_TEST_CHECK( factory );
383
384   Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
385   Visual::Base visual = factory.CreateVisual( image );
386
387   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
388   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
389
390   const int width=512;
391   const int height=513;
392
393   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD );
394   bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, width, height,width, height );
395
396   TestGlAbstraction& gl = application.GetGlAbstraction();
397   TraceCallStack& textureTrace = gl.GetTextureTrace();
398   textureTrace.Enable(true);
399
400   DummyControl actor = DummyControl::New();
401   TestVisualRender( application, actor, visual, 1u,
402                     ImageDimensions(width, height),
403                     Integration::ResourcePointer(bitmap) );
404
405   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
406   END_TEST;
407 }
408
409 int UtcDaliImageVisualCustomWrapModePixelArea(void)
410 {
411   ToolkitTestApplication application;
412   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" );
413
414   VisualFactory factory = VisualFactory::Get();
415   DALI_TEST_CHECK( factory );
416
417   // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
418   const int width=34;
419   const int height=34;
420   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
421
422   Property::Map propertyMap;
423   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
424   propertyMap.Insert( ImageVisual::Property::URL, TEST_SMALL_IMAGE_FILE_NAME );
425   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
426   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
427   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
428   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
429   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
430   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
431   propertyMap.Insert( DevelImageVisual::Property::ATLASING, true );
432
433   Visual::Base visual = factory.CreateVisual( propertyMap );
434   DALI_TEST_CHECK( visual );
435
436   TestGlAbstraction& gl = application.GetGlAbstraction();
437   TraceCallStack& textureTrace = gl.GetTextureTrace();
438   textureTrace.Enable(true);
439   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
440   texParameterTrace.Enable( true );
441
442   DummyControl actor = DummyControl::New();
443   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
444   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
445   actor.SetSize(2000, 2000);
446   actor.SetParentOrigin(ParentOrigin::CENTER);
447   Stage::GetCurrent().Add( actor );
448
449   // loading started
450   application.SendNotification();
451   application.Render();
452
453   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
454
455   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
456
457   // WITH atlasing, the wrapping is handled manually in shader, so the following gl function should not be called
458   std::stringstream out;
459   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
460   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
461   out.str("");
462   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
463   DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
464
465   // test the uniforms which used to handle the wrap mode
466   Renderer renderer = actor.GetRendererAt( 0u );
467   DALI_TEST_CHECK( renderer );
468
469   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
470   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
471   Vector4 pixelAreaUniform;
472   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
473   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
474
475   Property::Value wrapModeValue = renderer.GetProperty( renderer.GetPropertyIndex( "wrapMode" ) );
476   Vector2 wrapMode( WrapMode::MIRRORED_REPEAT-1, WrapMode::REPEAT-1 );
477   DALI_TEST_EQUALS( wrapModeValue.Get<Vector2>(), wrapMode, TEST_LOCATION );
478   Vector2 wrapModeUniform;
479   DALI_TEST_CHECK( gl.GetUniformValue<Vector2>( "wrapMode", wrapModeUniform ) );
480   DALI_TEST_EQUALS( wrapMode, wrapModeUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
481
482   actor.Unparent( );
483   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
484
485   END_TEST;
486 }
487
488 int UtcDaliImageVisualCustomWrapModeNoAtlas(void)
489 {
490   ToolkitTestApplication application;
491   tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" );
492
493   VisualFactory factory = VisualFactory::Get();
494   DALI_TEST_CHECK( factory );
495
496   // Test wrap mode without atlasing. Image with a size bigger than 512*512 will NOT be uploaded as a part of the atlas.
497   const int width=600;
498   const int height=600;
499   const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
500
501   Property::Map propertyMap;
502   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
503   propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
504   propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, width );
505   propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, height );
506   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
507   propertyMap.Insert( ImageVisual::Property::PIXEL_AREA, pixelArea );
508   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_U, WrapMode::MIRRORED_REPEAT );
509   propertyMap.Insert( ImageVisual::Property::WRAP_MODE_V, WrapMode::REPEAT );
510
511   Visual::Base visual = factory.CreateVisual( propertyMap );
512   DALI_TEST_CHECK( visual );
513
514   TestGlAbstraction& gl = application.GetGlAbstraction();
515   TraceCallStack& textureTrace = gl.GetTextureTrace();
516   textureTrace.Enable(true);
517   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
518   texParameterTrace.Enable( true );
519
520   DummyControl actor = DummyControl::New();
521   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
522   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
523   actor.SetSize(2000, 2000);
524   actor.SetParentOrigin(ParentOrigin::CENTER);
525   Stage::GetCurrent().Add( actor );
526
527   // loading started
528   application.SendNotification();
529   application.Render();
530
531   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
532
533   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
534
535   // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters
536   std::stringstream out;
537   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT;
538   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
539   out.str("");
540   out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
541   DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
542
543   // test the uniforms which used to handle the wrap mode
544   Renderer renderer = actor.GetRendererAt( 0u );
545   DALI_TEST_CHECK( renderer );
546
547   Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
548   DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION );
549   Vector4 pixelAreaUniform;
550   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
551   DALI_TEST_EQUALS( pixelArea, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
552
553   Property::Index wrapModeIndex = renderer.GetPropertyIndex( "wrapMode" );
554   DALI_TEST_CHECK(wrapModeIndex == Property::INVALID_INDEX);
555
556   actor.Unparent();
557   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
558
559   END_TEST;
560 }
561
562 int UtcDaliImageVisualAnimateMixColor(void)
563 {
564   ToolkitTestApplication application;
565   tet_infoline( "Animate mix color" );
566
567   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
568
569   VisualFactory factory = VisualFactory::Get();
570   Property::Map propertyMap;
571   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
572   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
573   propertyMap.Insert("mixColor", Color::BLUE);
574   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
575   Visual::Base visual = factory.CreateVisual( propertyMap );
576
577   DummyControl actor = DummyControl::New(true);
578   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
579   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
580
581   actor.SetSize(2000, 2000);
582   actor.SetParentOrigin(ParentOrigin::CENTER);
583   actor.SetColor(Color::BLACK);
584   Stage::GetCurrent().Add(actor);
585
586   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
587
588   Renderer renderer = actor.GetRendererAt(0);
589   Property::Index index = DevelHandle::GetPropertyIndex( renderer, DevelVisual::Property::MIX_COLOR );
590   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
591   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
592
593   tet_infoline("Test that the renderer has the mixColor property");
594   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
595
596   const Vector4 TARGET_MIX_COLOR( 1.0f, 0.0f, 0.0f, 0.5f );
597
598   Property::Map map;
599   map["target"] = "testVisual";
600   map["property"] = "mixColor";
601   map["initialValue"] = Color::MAGENTA;
602   map["targetValue"] = TARGET_MIX_COLOR;
603   map["animator"] = Property::Map()
604     .Add("alphaFunction", "LINEAR")
605     .Add("timePeriod", Property::Map()
606          .Add("delay", 0.0f)
607          .Add("duration", 4.0f));
608
609   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
610
611   Animation animation = dummyImpl.CreateTransition( transition );
612
613   blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
614   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
615
616   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
617   animation.Play();
618
619   application.SendNotification();
620   application.Render(0); // Ensure animation starts
621   application.Render(2000u); // Halfway point
622   Vector4 testColor(1.0f, 0.0f, 0.5f, 0.75f );
623
624   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("uColor", Vector4(0.5f, 0.5f, 0.5f, 1.0f )), true, TEST_LOCATION );
625   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", Vector3(testColor)), true, TEST_LOCATION );
626   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", testColor.a), true, TEST_LOCATION );
627
628   application.Render(2000u); // Halfway point between blue and white
629
630   DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION );
631   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("uColor", Color::WHITE ), true, TEST_LOCATION );
632   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector3>("mixColor", Vector3(TARGET_MIX_COLOR)), true, TEST_LOCATION );
633   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", TARGET_MIX_COLOR.a), true, TEST_LOCATION );
634
635   TestMixColor( visual, DevelVisual::Property::MIX_COLOR, TARGET_MIX_COLOR );
636
637   blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
638   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
639
640   END_TEST;
641 }
642
643 int UtcDaliImageVisualAnimateOpacity(void)
644 {
645   ToolkitTestApplication application;
646   tet_infoline( "Animate image visual opacity" );
647
648   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
649
650   VisualFactory factory = VisualFactory::Get();
651   Property::Map propertyMap;
652   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
653   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
654   propertyMap.Insert("opacity", 0.5f);
655   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
656   Visual::Base visual = factory.CreateVisual( propertyMap );
657
658   DummyControl actor = DummyControl::New(true);
659   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
660   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
661
662   actor.SetSize(2000, 2000);
663   actor.SetParentOrigin(ParentOrigin::CENTER);
664   actor.SetColor(Color::BLACK);
665   Stage::GetCurrent().Add(actor);
666
667   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
668
669   Renderer renderer = actor.GetRendererAt(0);
670   tet_infoline("Test that the renderer has the opacity property");
671   Property::Index index = DevelHandle::GetPropertyIndex( renderer, DevelVisual::Property::OPACITY );
672   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
673
674
675   Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
676   DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
677
678   {
679     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." );
680
681     Property::Map map;
682     map["target"] = "testVisual";
683     map["property"] = "opacity";
684     map["targetValue"] = 1.0f;
685     map["animator"] = Property::Map()
686       .Add("alphaFunction", "LINEAR")
687       .Add("timePeriod", Property::Map()
688            .Add("delay", 0.0f)
689            .Add("duration", 4.0f));
690
691     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
692     Animation animation = dummyImpl.CreateTransition( transition );
693     animation.Play();
694
695     application.SendNotification();
696     application.Render(0);     // Ensure animation starts
697     application.Render(2000u); // Halfway point through animation
698     application.SendNotification(); // Handle any signals
699
700     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.75f), true, TEST_LOCATION );
701
702     application.Render(2001u); // end
703     application.SendNotification(); // ensure animation finished signal is sent
704
705     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 1.0f), true, TEST_LOCATION );
706
707     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
708     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
709   }
710
711
712   {
713     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." );
714
715     Property::Map map;
716     map["target"] = "testVisual";
717     map["property"] = DevelVisual::Property::OPACITY;
718     map["targetValue"] = 0.1f;
719     map["animator"] = Property::Map()
720       .Add("alphaFunction", "LINEAR")
721       .Add("timePeriod", Property::Map()
722            .Add("delay", 0.0f)
723            .Add("duration", 4.0f));
724
725     Dali::Toolkit::TransitionData transition = TransitionData::New( map );
726     Animation animation = dummyImpl.CreateTransition( transition );
727     animation.Play();
728
729     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
730     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
731
732     application.SendNotification();
733     application.Render(0);     // Ensure animation starts
734     application.Render(2000u); // Halfway point
735     application.SendNotification();
736
737     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.55f), true, TEST_LOCATION );
738
739     application.Render(2016u); // end
740     application.SendNotification();
741
742     DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.1f), true, TEST_LOCATION );
743
744     blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
745     DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
746   }
747
748
749   END_TEST;
750 }
751
752 int UtcDaliImageVisualAnimatePixelArea(void)
753 {
754   ToolkitTestApplication application;
755   tet_infoline( "ImageVisual animate pixel area" );
756
757   application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
758
759   VisualFactory factory = VisualFactory::Get();
760   Property::Map propertyMap;
761   propertyMap.Insert(Visual::Property::TYPE,  Visual::IMAGE);
762   propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
763   propertyMap.Insert("mixColor", Color::BLUE);
764   propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
765   Visual::Base visual = factory.CreateVisual( propertyMap );
766
767   DummyControl actor = DummyControl::New(true);
768   Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
769   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
770
771   actor.SetSize(2000, 2000);
772   actor.SetParentOrigin(ParentOrigin::CENTER);
773   actor.SetColor(Color::BLACK);
774   Stage::GetCurrent().Add(actor);
775
776   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
777
778   Renderer renderer = actor.GetRendererAt(0);
779   Property::Index index = DevelHandle::GetPropertyIndex( renderer, DevelVisual::Property::MIX_COLOR );
780
781   tet_infoline("Test that the renderer has the mixColor property");
782   DALI_TEST_CHECK( index != Property::INVALID_INDEX );
783
784   // TransitionData only takes string keys
785   Property::Map map;
786   map["target"] = "testVisual";
787   map["property"] = "pixelArea";
788   map["initialValue"] = Vector4( 0,0,0,1 );
789   map["targetValue"] = Vector4( 0,0,1,1 ); // Animate width from zero to full
790   map["animator"] = Property::Map()
791     .Add("alphaFunction", "LINEAR")
792     .Add("timePeriod", Property::Map()
793          .Add("delay", 0.0f)
794          .Add("duration", 4.0f));
795
796   Dali::Toolkit::TransitionData transition = TransitionData::New( map );
797
798   Animation animation = dummyImpl.CreateTransition( transition );
799   animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
800   animation.Play();
801
802   application.SendNotification();
803   application.Render(0);     // Ensure animation starts
804   application.Render(2000u); // Halfway point
805
806   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4(0.0f, 0.0f, 0.5f, 1.0f )), true, TEST_LOCATION );
807
808   application.Render(2000u); // End of animation
809
810   DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4( 0.0f, 0.0f, 1.0f, 1.0f )), true, TEST_LOCATION );
811
812   END_TEST;
813 }
814
815 int UtcDaliImageVisualTextureCancelRemoteLoad(void)
816 {
817   ToolkitTestApplication application;
818   tet_infoline( "Request remote image visual, then destroy visual to cancel load" );
819
820   Property::Map propertyMap;
821   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
822   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
823
824   TestGlAbstraction& gl = application.GetGlAbstraction();
825   TraceCallStack& textureTrace = gl.GetTextureTrace();
826   textureTrace.Enable(true);
827   TraceCallStack& drawTrace = gl.GetDrawTrace();
828   drawTrace.Enable(true);
829
830   Actor actor = CreateActorWithImageVisual( propertyMap );
831   Stage::GetCurrent().Add( actor );
832   application.SendNotification();
833
834   Stage::GetCurrent().Remove( actor );
835   application.SendNotification();
836
837   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
838   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
839   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), false, TEST_LOCATION );
840   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), false, TEST_LOCATION );
841
842   END_TEST;
843 }
844
845 int UtcDaliImageVisualTextureCancelAsyncLoad(void)
846 {
847   ToolkitTestApplication application;
848   tet_infoline( "Load image asynchronosly, cancel loading, then load again" );
849
850   VisualFactory factory = VisualFactory::Get();
851   DALI_TEST_CHECK( factory );
852
853   Property::Map propertyMap;
854   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
855   propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
856
857   Visual::Base visual = factory.CreateVisual( propertyMap );
858   DALI_TEST_CHECK( visual );
859
860   TestGlAbstraction& gl = application.GetGlAbstraction();
861   TraceCallStack& textureTrace = gl.GetTextureTrace();
862   textureTrace.Enable( true );
863   TraceCallStack& drawTrace = gl.GetDrawTrace();
864   drawTrace.Enable( true );
865
866   DummyControl actor = DummyControl::New();
867   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
868   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
869
870   Stage::GetCurrent().Add( actor );
871
872   // Cancel loading
873   Stage::GetCurrent().Remove( actor );
874
875   Stage::GetCurrent().Add( actor );
876
877   // Create another visual with the same image
878   visual = factory.CreateVisual( propertyMap );
879   DALI_TEST_CHECK( visual );
880
881   dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
882
883   application.SendNotification();
884   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
885
886   application.SendNotification();
887   application.Render();
888
889   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
890   DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
891   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
892   DALI_TEST_EQUALS( drawTrace.FindMethod("DrawArrays"), true, TEST_LOCATION );
893
894   END_TEST;
895 }
896
897 int UtcDaliImageVisualSetInvalidAsyncImage(void)
898 {
899   ToolkitTestApplication application;
900   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
901
902   VisualFactory factory = VisualFactory::Get();
903   DALI_TEST_CHECK( factory );
904
905   Property::Map propertyMap;
906   propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
907   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
908
909   Visual::Base visual = factory.CreateVisual( propertyMap );
910   DALI_TEST_CHECK( visual );
911
912   TestGlAbstraction& gl = application.GetGlAbstraction();
913   TraceCallStack& textureTrace = gl.GetTextureTrace();
914   textureTrace.Enable(true);
915
916   DummyControl actor = DummyControl::New();
917   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
918   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
919
920   actor.SetSize( 200.f, 200.f );
921   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
922
923   Stage::GetCurrent().Add( actor );
924
925   application.SendNotification();
926   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
927
928   application.SendNotification();
929   application.Render();
930
931   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
932   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
933
934   Stage::GetCurrent().Remove( actor );
935   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
936
937   END_TEST;
938 }
939
940 int UtcDaliImageVisualSetInvalidSyncImage(void)
941 {
942   ToolkitTestApplication application;
943   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
944
945   VisualFactory factory = VisualFactory::Get();
946   DALI_TEST_CHECK( factory );
947
948   Property::Map propertyMap;
949   propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
950   propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
951   propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true );
952
953   Visual::Base visual = factory.CreateVisual( propertyMap );
954   DALI_TEST_CHECK( visual );
955
956   TestGlAbstraction& gl = application.GetGlAbstraction();
957   TraceCallStack& textureTrace = gl.GetTextureTrace();
958   textureTrace.Enable(true);
959
960   DummyControl actor = DummyControl::New();
961   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
962   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
963
964   actor.SetSize( 200.f, 200.f );
965   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
966
967   Stage::GetCurrent().Add( actor );
968
969   application.SendNotification();
970   application.Render();
971
972   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
973   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
974
975   Stage::GetCurrent().Remove( actor );
976   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
977
978   END_TEST;
979 }
980
981 int UtcDaliImageVisualSetInvalidRemoteImage(void)
982 {
983   ToolkitTestApplication application;
984   tet_infoline( "Request image visual with invalid images - should draw broken.png" );
985
986   VisualFactory factory = VisualFactory::Get();
987   DALI_TEST_CHECK( factory );
988
989   // Local invalid file, asynchronous loading
990   Property::Map propertyMap;
991   propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
992   propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_INVALID_FILE_NAME );
993
994   Visual::Base visual = factory.CreateVisual( propertyMap );
995   DALI_TEST_CHECK( visual );
996
997   TestGlAbstraction& gl = application.GetGlAbstraction();
998   TraceCallStack& textureTrace = gl.GetTextureTrace();
999   textureTrace.Enable(true);
1000
1001   DummyControl actor = DummyControl::New();
1002   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1003   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1004
1005   actor.SetSize( 200.f, 200.f );
1006   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1007
1008   Stage::GetCurrent().Add( actor );
1009
1010   application.SendNotification();
1011   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1012
1013   application.SendNotification();
1014   application.Render();
1015
1016   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1017   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1018
1019   Stage::GetCurrent().Remove( actor );
1020   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1021
1022   END_TEST;
1023 }
1024
1025 int UtcDaliImageVisualAlphaMask(void)
1026 {
1027   ToolkitTestApplication application;
1028   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1029
1030   VisualFactory factory = VisualFactory::Get();
1031   DALI_TEST_CHECK( factory );
1032
1033   Property::Map propertyMap;
1034   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1035   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1036   propertyMap.Insert( DevelImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1037
1038   Visual::Base visual = factory.CreateVisual( propertyMap );
1039   DALI_TEST_CHECK( visual );
1040
1041   Property::Map testMap;
1042   visual.CreatePropertyMap(testMap);
1043   DALI_TEST_EQUALS(*testMap.Find(DevelImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1044
1045   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1046   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1047
1048   TestGlAbstraction& gl = application.GetGlAbstraction();
1049   TraceCallStack& textureTrace = gl.GetTextureTrace();
1050   textureTrace.Enable(true);
1051
1052   DummyControl actor = DummyControl::New();
1053   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1054   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1055
1056   actor.SetSize( 200.f, 200.f );
1057   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1058   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1059
1060   Stage::GetCurrent().Add( actor );
1061   application.SendNotification();
1062   application.Render();
1063
1064   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1065
1066   application.SendNotification();
1067   application.Render();
1068
1069   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1070   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1071   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1072
1073   END_TEST;
1074 }
1075
1076 int UtcDaliImageVisualRemoteAlphaMask(void)
1077 {
1078   ToolkitTestApplication application;
1079   tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1080
1081   VisualFactory factory = VisualFactory::Get();
1082   DALI_TEST_CHECK( factory );
1083
1084   const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1085
1086   Property::Map propertyMap;
1087   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1088   propertyMap.Insert( ImageVisual::Property::URL,  TEST_IMAGE_FILE_NAME );
1089   propertyMap.Insert( "alphaMaskUrl", MASK_IMAGE );
1090
1091   Visual::Base visual = factory.CreateVisual( propertyMap );
1092   DALI_TEST_CHECK( visual );
1093
1094   Property::Map testMap;
1095   visual.CreatePropertyMap(testMap);
1096   DALI_TEST_EQUALS(*testMap.Find(DevelImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION );
1097
1098   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1099   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1100
1101   TestGlAbstraction& gl = application.GetGlAbstraction();
1102   TraceCallStack& textureTrace = gl.GetTextureTrace();
1103   textureTrace.Enable(true);
1104
1105   DummyControl actor = DummyControl::New();
1106   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1107   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1108   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1109
1110   actor.SetSize( 200.f, 200.f );
1111   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1112
1113   Stage::GetCurrent().Add( actor );
1114   application.SendNotification();
1115   application.Render();
1116
1117   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1118
1119   application.SendNotification();
1120   application.Render();
1121
1122   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1123   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1124   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1125
1126   END_TEST;
1127 }
1128
1129
1130 int UtcDaliImageVisualAlphaMaskCrop(void)
1131 {
1132   ToolkitTestApplication application;
1133   tet_infoline( "Request image visual with an Alpha mask and scale/cropping" );
1134
1135   VisualFactory factory = VisualFactory::Get();
1136   DALI_TEST_CHECK( factory );
1137
1138   Property::Map propertyMap;
1139   propertyMap.Insert( Visual::Property::TYPE,  Visual::IMAGE );
1140   propertyMap.Insert( ImageVisual::Property::URL,  TEST_LARGE_IMAGE_FILE_NAME );
1141   propertyMap.Insert( DevelImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1142   propertyMap.Insert( DevelImageVisual::Property::MASK_CONTENT_SCALE, 1.6f );
1143   propertyMap.Insert( DevelImageVisual::Property::CROP_TO_MASK, true );
1144
1145   Visual::Base visual = factory.CreateVisual( propertyMap );
1146   DALI_TEST_CHECK( visual );
1147
1148   Property::Map testMap;
1149   visual.CreatePropertyMap(testMap);
1150   DALI_TEST_EQUALS( *testMap.Find(DevelImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1151   DALI_TEST_EQUALS( *testMap.Find(DevelImageVisual::Property::MASK_CONTENT_SCALE), Property::Value(1.6f), TEST_LOCATION );
1152   DALI_TEST_EQUALS( *testMap.Find(DevelImageVisual::Property::CROP_TO_MASK),Property::Value(true), TEST_LOCATION );
1153
1154   // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1155   // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1156
1157   TestGlAbstraction& gl = application.GetGlAbstraction();
1158   TraceCallStack& textureTrace = gl.GetTextureTrace();
1159   textureTrace.Enable(true);
1160
1161   DummyControl actor = DummyControl::New();
1162   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1163   dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1164
1165   actor.SetSize( 200.f, 200.f );
1166   DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1167   DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1168
1169   Stage::GetCurrent().Add( actor );
1170   application.SendNotification();
1171   application.Render();
1172
1173   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1174
1175   application.SendNotification();
1176   application.Render();
1177
1178   Vector2 size;
1179   visual.GetNaturalSize(size);
1180
1181   DALI_TEST_EQUALS( size, Vector2( 100.0f, 100.0f ), 0.001f, TEST_LOCATION );
1182   DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1183   DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1184   DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1185
1186   END_TEST;
1187 }