2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali-toolkit-test-suite-utils.h>
20 #include <toolkit-timer.h>
21 #include <toolkit-event-thread-callback.h>
22 #include <dali/devel-api/object/handle-devel.h>
23 #include <dali-toolkit/devel-api/visual-factory/transition-data.h>
24 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
25 #include <dali-toolkit/devel-api/controls/control-devel.h>
26 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
27 #include <dali-toolkit/dali-toolkit.h>
28 #include "dummy-control.h"
31 using namespace Dali::Toolkit;
33 void dali_image_visual_startup(void)
35 test_return_value = TET_UNDEF;
38 void dali_image_visual_cleanup(void)
40 test_return_value = TET_PASS;
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";
55 Actor CreateActorWithImageVisual(const Property::Map& map)
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 );
68 void TestVisualRender( ToolkitTestApplication& application,
71 std::size_t expectedSamplers = 0,
72 ImageDimensions imageDimensions = ImageDimensions(),
73 Integration::ResourcePointer resourcePtr = Integration::ResourcePointer())
75 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
76 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
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()) );
84 actor.SetSize( 200.f, 200.f );
85 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
87 Stage::GetCurrent().Add( actor );
89 application.SendNotification(); // Send messages to update
90 application.Render(); // process update and render
91 application.SendNotification(); // process any signals to event
95 DALI_TEST_EQUALS( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceSynchronouslyFunc ), true, TEST_LOCATION);
98 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
101 static void TestMixColor( Visual::Base visual, Property::Index mixColorIndex, const Vector4& testColor )
104 visual.CreatePropertyMap(map);
105 Property::Value* value = map.Find( mixColorIndex );
106 DALI_TEST_CHECK( value );
108 DALI_TEST_CHECK( value->Get( mixColor1 ) );
109 DALI_TEST_EQUALS( mixColor1, Vector3(testColor), 0.001, TEST_LOCATION );
111 value = map.Find( Visual::Property::MIX_COLOR );
112 DALI_TEST_CHECK( value );
114 DALI_TEST_CHECK( value->Get( mixColor2 ) );
115 DALI_TEST_EQUALS( mixColor2, testColor, 0.001, TEST_LOCATION );
117 value = map.Find( Visual::Property::OPACITY );
118 DALI_TEST_CHECK( value );
120 DALI_TEST_CHECK( value->Get( opacity ) );
121 DALI_TEST_EQUALS( opacity, testColor.a, 0.001, TEST_LOCATION );
126 int UtcDaliImageVisualPropertyMap(void)
128 ToolkitTestApplication application;
129 tet_infoline( "Request image visual with a Property::Map" );
131 VisualFactory factory = VisualFactory::Get();
132 DALI_TEST_CHECK( factory );
134 Property::Map propertyMap;
135 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
136 propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
138 Visual::Base visual = factory.CreateVisual( propertyMap );
139 DALI_TEST_CHECK( visual );
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.
144 TestGlAbstraction& gl = application.GetGlAbstraction();
145 TraceCallStack& textureTrace = gl.GetTextureTrace();
146 textureTrace.Enable(true);
148 DummyControl actor = DummyControl::New();
149 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
150 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
152 actor.SetSize( 200.f, 200.f );
153 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
155 Stage::GetCurrent().Add( actor );
156 application.SendNotification();
157 application.Render();
159 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
161 application.SendNotification();
162 application.Render();
164 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
166 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
168 Stage::GetCurrent().Remove( actor );
169 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
175 int UtcDaliImageVisualRemoteImageLoad(void)
177 ToolkitTestApplication application;
178 tet_infoline( "Request remote image visual with a Property::Map" );
180 VisualFactory factory = VisualFactory::Get();
181 DALI_TEST_CHECK( factory );
183 Property::Map propertyMap;
184 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
185 propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
187 Visual::Base visual = factory.CreateVisual( propertyMap );
188 DALI_TEST_CHECK( visual );
190 TestGlAbstraction& gl = application.GetGlAbstraction();
191 TraceCallStack& textureTrace = gl.GetTextureTrace();
192 textureTrace.Enable(true);
194 DummyControl actor = DummyControl::New();
195 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
196 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
198 actor.SetSize( 200.f, 200.f );
199 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
201 Stage::GetCurrent().Add( actor );
202 application.SendNotification();
204 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
206 application.SendNotification();
207 application.Render();
209 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
210 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
212 Stage::GetCurrent().Remove( actor );
213 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
218 int UtcDaliImageVisualTextureReuse1(void)
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" );
223 Property::Map propertyMap;
224 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
225 propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
227 TestGlAbstraction& gl = application.GetGlAbstraction();
228 TraceCallStack& textureTrace = gl.GetTextureTrace();
229 textureTrace.Enable(true);
230 TraceCallStack& drawTrace = gl.GetDrawTrace();
231 drawTrace.Enable(true);
233 Actor actor = CreateActorWithImageVisual( propertyMap );
234 Stage::GetCurrent().Add( actor );
235 application.SendNotification();
237 // Wait for image to load
238 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
240 application.SendNotification();
241 application.Render();
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();
250 Actor actor2 = CreateActorWithImageVisual( propertyMap );
251 Stage::GetCurrent().Add(actor2);
253 application.SendNotification(); // Send messages to update
254 application.Render(); // process update and render
255 application.SendNotification(); // process any signals to event
257 DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
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" );
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 );
266 tet_infoline("Test that removing 1 actor doesn't delete the texture\n");
268 Stage::GetCurrent().Remove( actor );
269 application.SendNotification();
270 application.Render();
272 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
273 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
275 tet_infoline("Test that removing last actor does delete the texture\n");
277 Stage::GetCurrent().Remove( actor2 );
278 application.SendNotification();
279 application.Render();
281 DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
282 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
288 int UtcDaliImageVisualTextureReuse2(void)
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" );
293 Property::Map propertyMap;
294 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
295 propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
297 TestGlAbstraction& gl = application.GetGlAbstraction();
298 TraceCallStack& textureTrace = gl.GetTextureTrace();
299 textureTrace.Enable(true);
300 TraceCallStack& drawTrace = gl.GetDrawTrace();
301 drawTrace.Enable(true);
303 Actor actor = CreateActorWithImageVisual( propertyMap );
304 Stage::GetCurrent().Add( actor );
305 application.SendNotification();
307 // Wait for image to load
308 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
310 application.SendNotification();
311 application.Render();
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();
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);
326 application.SendNotification();
328 // Wait for image to load
329 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
331 application.SendNotification();
332 application.Render();
334 DALI_TEST_EQUALS( actor2.GetRendererCount(), 1u, TEST_LOCATION );
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" );
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 );
348 tet_infoline("Test that removing 1 actor deletes it's texture\n");
350 Stage::GetCurrent().Remove( actor );
351 application.SendNotification();
352 application.Render();
354 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
355 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
357 tet_infoline("Test that removing last actor deletes it's texture\n");
359 Stage::GetCurrent().Remove( actor2 );
360 application.SendNotification();
361 application.Render();
363 DALI_TEST_CHECK( actor2.GetRendererCount() == 0u );
364 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 2, TEST_LOCATION );
370 int UtcDaliImageVisualImageHandle(void)
372 ToolkitTestApplication application;
373 tet_infoline( "Request image visual with an image handle" );
375 VisualFactory factory = VisualFactory::Get();
376 DALI_TEST_CHECK( factory );
378 Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME);
379 Visual::Base visual = factory.CreateVisual( image );
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.
385 const int height=513;
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 );
390 TestGlAbstraction& gl = application.GetGlAbstraction();
391 TraceCallStack& textureTrace = gl.GetTextureTrace();
392 textureTrace.Enable(true);
394 DummyControl actor = DummyControl::New();
395 TestVisualRender( application, actor, visual, 1u,
396 ImageDimensions(width, height),
397 Integration::ResourcePointer(bitmap) );
399 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
403 int UtcDaliImageVisualCustomWrapModePixelArea(void)
405 ToolkitTestApplication application;
406 tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" );
408 VisualFactory factory = VisualFactory::Get();
409 DALI_TEST_CHECK( factory );
411 // Test wrap mode with atlasing. Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
414 const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
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 );
427 Visual::Base visual = factory.CreateVisual( propertyMap );
428 DALI_TEST_CHECK( visual );
430 TestGlAbstraction& gl = application.GetGlAbstraction();
431 TraceCallStack& textureTrace = gl.GetTextureTrace();
432 textureTrace.Enable(true);
433 TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
434 texParameterTrace.Enable( true );
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 );
444 application.SendNotification();
445 application.Render();
447 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
449 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
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()) );
456 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
457 DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
459 // test the uniforms which used to handle the wrap mode
460 Renderer renderer = actor.GetRendererAt( 0u );
461 DALI_TEST_CHECK( renderer );
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 );
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 );
477 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
482 int UtcDaliImageVisualCustomWrapModeNoAtlas(void)
484 ToolkitTestApplication application;
485 tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" );
487 VisualFactory factory = VisualFactory::Get();
488 DALI_TEST_CHECK( factory );
490 // Test wrap mode without atlasing. Image with a size bigger than 512*512 will NOT be uploaded as a part of the atlas.
492 const int height=600;
493 const Vector4 pixelArea(-0.5f, -0.5f, 2.f, 2.f);
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 );
505 Visual::Base visual = factory.CreateVisual( propertyMap );
506 DALI_TEST_CHECK( visual );
508 TestGlAbstraction& gl = application.GetGlAbstraction();
509 TraceCallStack& textureTrace = gl.GetTextureTrace();
510 textureTrace.Enable(true);
511 TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
512 texParameterTrace.Enable( true );
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 );
522 application.SendNotification();
523 application.Render();
525 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
527 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
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()) );
534 out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT;
535 DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) );
537 // test the uniforms which used to handle the wrap mode
538 Renderer renderer = actor.GetRendererAt( 0u );
539 DALI_TEST_CHECK( renderer );
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 );
547 Property::Index wrapModeIndex = renderer.GetPropertyIndex( "wrapMode" );
548 DALI_TEST_CHECK(wrapModeIndex == Property::INVALID_INDEX);
551 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
556 int UtcDaliImageVisualAnimateMixColor(void)
558 ToolkitTestApplication application;
559 tet_infoline( "Animate mix color" );
561 application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
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 );
571 DummyControl actor = DummyControl::New(true);
572 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
573 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
575 actor.SetSize(2000, 2000);
576 actor.SetParentOrigin(ParentOrigin::CENTER);
577 actor.SetColor(Color::BLACK);
578 Stage::GetCurrent().Add(actor);
580 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
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 );
587 tet_infoline("Test that the renderer has the mixColor property");
588 DALI_TEST_CHECK( index != Property::INVALID_INDEX );
590 const Vector4 TARGET_MIX_COLOR( 1.0f, 0.0f, 0.0f, 0.5f );
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()
601 .Add("duration", 4.0f));
603 Dali::Toolkit::TransitionData transition = TransitionData::New( map );
605 Animation animation = dummyImpl.CreateTransition( transition );
607 blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
608 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
610 animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
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 );
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 );
622 application.Render(2000u); // Halfway point between blue and white
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 );
629 TestMixColor( visual, Visual::Property::MIX_COLOR, TARGET_MIX_COLOR );
631 blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
632 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
637 int UtcDaliImageVisualAnimateOpacity(void)
639 ToolkitTestApplication application;
640 tet_infoline( "Animate image visual opacity" );
642 application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
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 );
652 DummyControl actor = DummyControl::New(true);
653 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
654 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
656 actor.SetSize(2000, 2000);
657 actor.SetParentOrigin(ParentOrigin::CENTER);
658 actor.SetColor(Color::BLACK);
659 Stage::GetCurrent().Add(actor);
661 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
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 );
669 Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
670 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
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." );
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()
683 .Add("duration", 4.0f));
685 Dali::Toolkit::TransitionData transition = TransitionData::New( map );
686 Animation animation = dummyImpl.CreateTransition( transition );
689 application.SendNotification();
690 application.Render(0); // Ensure animation starts
691 application.Render(2000u); // Halfway point through animation
692 application.SendNotification(); // Handle any signals
694 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.75f), true, TEST_LOCATION );
696 application.Render(2001u); // end
697 application.SendNotification(); // ensure animation finished signal is sent
699 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 1.0f), true, TEST_LOCATION );
701 blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
702 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::AUTO, TEST_LOCATION );
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." );
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()
717 .Add("duration", 4.0f));
719 Dali::Toolkit::TransitionData transition = TransitionData::New( map );
720 Animation animation = dummyImpl.CreateTransition( transition );
723 blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
724 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
726 application.SendNotification();
727 application.Render(0); // Ensure animation starts
728 application.Render(2000u); // Halfway point
729 application.SendNotification();
731 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.55f), true, TEST_LOCATION );
733 application.Render(2016u); // end
734 application.SendNotification();
736 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<float>("opacity", 0.1f), true, TEST_LOCATION );
738 blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE );
739 DALI_TEST_EQUALS( blendModeValue.Get<int>(), (int)BlendMode::ON, TEST_LOCATION );
746 int UtcDaliImageVisualAnimatePixelArea(void)
748 ToolkitTestApplication application;
749 tet_infoline( "ImageVisual animate pixel area" );
751 application.GetPlatform().SetClosestImageSize( Vector2(100, 100) );
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 );
761 DummyControl actor = DummyControl::New(true);
762 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
763 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
765 actor.SetSize(2000, 2000);
766 actor.SetParentOrigin(ParentOrigin::CENTER);
767 actor.SetColor(Color::BLACK);
768 Stage::GetCurrent().Add(actor);
770 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION);
772 Renderer renderer = actor.GetRendererAt(0);
773 Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::MIX_COLOR );
775 tet_infoline("Test that the renderer has the mixColor property");
776 DALI_TEST_CHECK( index != Property::INVALID_INDEX );
778 // TransitionData only takes string keys
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()
788 .Add("duration", 4.0f));
790 Dali::Toolkit::TransitionData transition = TransitionData::New( map );
792 Animation animation = dummyImpl.CreateTransition( transition );
793 animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE );
796 application.SendNotification();
797 application.Render(0); // Ensure animation starts
798 application.Render(2000u); // Halfway point
800 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4(0.0f, 0.0f, 0.5f, 1.0f )), true, TEST_LOCATION );
802 application.Render(2000u); // End of animation
804 DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue<Vector4>("pixelArea", Vector4( 0.0f, 0.0f, 1.0f, 1.0f )), true, TEST_LOCATION );
809 int UtcDaliImageVisualTextureCancelRemoteLoad(void)
811 ToolkitTestApplication application;
812 tet_infoline( "Request remote image visual, then destroy visual to cancel load" );
814 Property::Map propertyMap;
815 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
816 propertyMap.Insert( ImageVisual::Property::URL, TEST_REMOTE_IMAGE_FILE_NAME );
818 TestGlAbstraction& gl = application.GetGlAbstraction();
819 TraceCallStack& textureTrace = gl.GetTextureTrace();
820 textureTrace.Enable(true);
821 TraceCallStack& drawTrace = gl.GetDrawTrace();
822 drawTrace.Enable(true);
824 Actor actor = CreateActorWithImageVisual( propertyMap );
825 Stage::GetCurrent().Add( actor );
826 application.SendNotification();
828 Stage::GetCurrent().Remove( actor );
829 application.SendNotification();
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 );
839 int UtcDaliImageVisualTextureCancelAsyncLoad(void)
841 ToolkitTestApplication application;
842 tet_infoline( "Load image asynchronosly, cancel loading, then load again" );
844 VisualFactory factory = VisualFactory::Get();
845 DALI_TEST_CHECK( factory );
847 Property::Map propertyMap;
848 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
849 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
851 Visual::Base visual = factory.CreateVisual( propertyMap );
852 DALI_TEST_CHECK( visual );
854 TestGlAbstraction& gl = application.GetGlAbstraction();
855 TraceCallStack& textureTrace = gl.GetTextureTrace();
856 textureTrace.Enable( true );
857 TraceCallStack& drawTrace = gl.GetDrawTrace();
858 drawTrace.Enable( true );
860 DummyControl actor = DummyControl::New();
861 DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
862 dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
864 Stage::GetCurrent().Add( actor );
867 Stage::GetCurrent().Remove( actor );
869 Stage::GetCurrent().Add( actor );
871 // Create another visual with the same image
872 visual = factory.CreateVisual( propertyMap );
873 DALI_TEST_CHECK( visual );
875 dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual );
877 application.SendNotification();
878 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
880 application.SendNotification();
881 application.Render();
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 );
891 int UtcDaliImageVisualSetInvalidAsyncImage(void)
893 ToolkitTestApplication application;
894 tet_infoline( "Request image visual with invalid images - should draw broken.png" );
896 VisualFactory factory = VisualFactory::Get();
897 DALI_TEST_CHECK( factory );
899 Property::Map propertyMap;
900 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
901 propertyMap.Insert( ImageVisual::Property::URL, TEST_INVALID_FILE_NAME );
903 Visual::Base visual = factory.CreateVisual( propertyMap );
904 DALI_TEST_CHECK( visual );
906 TestGlAbstraction& gl = application.GetGlAbstraction();
907 TraceCallStack& textureTrace = gl.GetTextureTrace();
908 textureTrace.Enable(true);
910 DummyControl actor = DummyControl::New();
911 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
912 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
914 actor.SetSize( 200.f, 200.f );
915 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
917 Stage::GetCurrent().Add( actor );
919 application.SendNotification();
920 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
922 application.SendNotification();
923 application.Render();
925 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
926 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
928 Stage::GetCurrent().Remove( actor );
929 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
934 int UtcDaliImageVisualSetInvalidSyncImage(void)
936 ToolkitTestApplication application;
937 tet_infoline( "Request image visual with invalid images - should draw broken.png" );
939 VisualFactory factory = VisualFactory::Get();
940 DALI_TEST_CHECK( factory );
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 );
947 Visual::Base visual = factory.CreateVisual( propertyMap );
948 DALI_TEST_CHECK( visual );
950 TestGlAbstraction& gl = application.GetGlAbstraction();
951 TraceCallStack& textureTrace = gl.GetTextureTrace();
952 textureTrace.Enable(true);
954 DummyControl actor = DummyControl::New();
955 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
956 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
958 actor.SetSize( 200.f, 200.f );
959 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
961 Stage::GetCurrent().Add( actor );
963 application.SendNotification();
964 application.Render();
966 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
967 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
969 Stage::GetCurrent().Remove( actor );
970 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
975 int UtcDaliImageVisualSetInvalidRemoteImage(void)
977 ToolkitTestApplication application;
978 tet_infoline( "Request image visual with invalid images - should draw broken.png" );
980 VisualFactory factory = VisualFactory::Get();
981 DALI_TEST_CHECK( factory );
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 );
988 Visual::Base visual = factory.CreateVisual( propertyMap );
989 DALI_TEST_CHECK( visual );
991 TestGlAbstraction& gl = application.GetGlAbstraction();
992 TraceCallStack& textureTrace = gl.GetTextureTrace();
993 textureTrace.Enable(true);
995 DummyControl actor = DummyControl::New();
996 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
997 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
999 actor.SetSize( 200.f, 200.f );
1000 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1002 Stage::GetCurrent().Add( actor );
1004 application.SendNotification();
1005 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1007 application.SendNotification();
1008 application.Render();
1010 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1011 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1013 Stage::GetCurrent().Remove( actor );
1014 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1019 int UtcDaliImageVisualAlphaMask(void)
1021 ToolkitTestApplication application;
1022 tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1024 VisualFactory factory = VisualFactory::Get();
1025 DALI_TEST_CHECK( factory );
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 );
1032 Visual::Base visual = factory.CreateVisual( propertyMap );
1033 DALI_TEST_CHECK( visual );
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 );
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.
1042 TestGlAbstraction& gl = application.GetGlAbstraction();
1043 TraceCallStack& textureTrace = gl.GetTextureTrace();
1044 textureTrace.Enable(true);
1046 DummyControl actor = DummyControl::New();
1047 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1048 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
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 );
1054 Stage::GetCurrent().Add( actor );
1055 application.SendNotification();
1056 application.Render();
1058 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1060 application.SendNotification();
1061 application.Render();
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 );
1067 dummyImpl.UnregisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1 );
1068 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1073 int UtcDaliImageVisualRemoteAlphaMask(void)
1075 ToolkitTestApplication application;
1076 tet_infoline( "Request image visual with a Property::Map containing an Alpha mask" );
1078 VisualFactory factory = VisualFactory::Get();
1079 DALI_TEST_CHECK( factory );
1081 const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1083 Property::Map propertyMap;
1084 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
1085 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1086 propertyMap.Insert( "alphaMaskUrl", MASK_IMAGE );
1088 Visual::Base visual = factory.CreateVisual( propertyMap );
1089 DALI_TEST_CHECK( visual );
1091 Property::Map testMap;
1092 visual.CreatePropertyMap(testMap);
1093 DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION );
1095 // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1096 // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1098 TestGlAbstraction& gl = application.GetGlAbstraction();
1099 TraceCallStack& textureTrace = gl.GetTextureTrace();
1100 textureTrace.Enable(true);
1102 DummyControl actor = DummyControl::New();
1103 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1104 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1105 DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1107 actor.SetSize( 200.f, 200.f );
1108 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1110 Stage::GetCurrent().Add( actor );
1111 application.SendNotification();
1112 application.Render();
1114 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1116 application.SendNotification();
1117 application.Render();
1119 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1120 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1121 DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1127 int UtcDaliImageVisualAlphaMaskCrop(void)
1129 ToolkitTestApplication application;
1130 tet_infoline( "Request image visual with an Alpha mask and scale/cropping" );
1132 VisualFactory factory = VisualFactory::Get();
1133 DALI_TEST_CHECK( factory );
1135 Property::Map propertyMap;
1136 propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE );
1137 propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME );
1138 propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME );
1139 propertyMap.Insert( ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f );
1140 propertyMap.Insert( ImageVisual::Property::CROP_TO_MASK, true );
1142 Visual::Base visual = factory.CreateVisual( propertyMap );
1143 DALI_TEST_CHECK( visual );
1145 Property::Map testMap;
1146 visual.CreatePropertyMap(testMap);
1147 DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION );
1148 DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE), Property::Value(1.6f), TEST_LOCATION );
1149 DALI_TEST_EQUALS( *testMap.Find(ImageVisual::Property::CROP_TO_MASK),Property::Value(true), TEST_LOCATION );
1151 // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied.
1152 // Image with a size smaller than 512*512 will be uploaded as a part of the atlas.
1154 TestGlAbstraction& gl = application.GetGlAbstraction();
1155 TraceCallStack& textureTrace = gl.GetTextureTrace();
1156 textureTrace.Enable(true);
1158 DummyControl actor = DummyControl::New();
1159 DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1160 dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual );
1162 actor.SetSize( 200.f, 200.f );
1163 DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION );
1164 DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION );
1166 Stage::GetCurrent().Add( actor );
1167 application.SendNotification();
1168 application.Render();
1170 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1172 application.SendNotification();
1173 application.Render();
1176 visual.GetNaturalSize(size);
1178 DALI_TEST_EQUALS( size, Vector2( 100.0f, 100.0f ), 0.001f, TEST_LOCATION );
1179 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1180 DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION );
1181 DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION );
1186 int UtcDaliImageVisualReleasePolicy01(void)
1188 ToolkitTestApplication application;
1189 tet_infoline( "UtcDaliImageVisualReleasePolicy01 Detached Policy, disabling visual with this policy deletes texture" );
1191 VisualFactory factory = VisualFactory::Get();
1193 Property::Map propertyMap;
1194 propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
1195 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1196 propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1197 propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1198 propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY, DevelImageVisual::ReleasePolicy::DETACHED );
1200 Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1201 DALI_TEST_CHECK( imageVisual );
1203 // Set up debug trace
1204 TestGlAbstraction& gl = application.GetGlAbstraction();
1205 TraceCallStack& textureTrace = gl.GetTextureTrace();
1206 textureTrace.Enable(true);
1208 tet_infoline( "Register visual with control and ensure it has the only handle" );
1209 DummyControl actor = DummyControl::New(true);
1210 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1211 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1212 imageVisual.Reset();
1214 actor.SetSize(200.f, 200.f);
1216 application.SendNotification();
1217 application.Render(0);
1218 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1219 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1221 Stage::GetCurrent().Add( actor );
1223 // Wait for image to load
1224 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1226 application.SendNotification();
1227 application.Render(0);
1228 // Test renderer and texture created
1229 tet_infoline( "Confirm texture created" );
1230 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1231 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1233 tet_infoline( "Disable visual causing the texture to be deleted" );
1234 dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1236 application.SendNotification();
1237 application.Render(0);
1238 // Test renderer and textures removed.
1239 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1240 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1245 int UtcDaliImageVisualReleasePolicy02(void)
1247 ToolkitTestApplication application;
1248 tet_infoline( "UtcDaliImageVisualReleasePolicy02 Destroyed Policy, Texture should be deleted when visual destroyed" );
1250 VisualFactory factory = VisualFactory::Get();
1251 const std::string MASK_IMAGE = TEST_REMOTE_IMAGE_FILE_NAME;
1253 Property::Map propertyMap;
1254 propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
1255 propertyMap.Insert( Visual::Property::MIX_COLOR, Color::MAGENTA );
1256 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1257 propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1258 propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1259 propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1261 Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1262 DALI_TEST_CHECK( imageVisual );
1264 // Setup debug trace
1265 TestGlAbstraction& gl = application.GetGlAbstraction();
1266 TraceCallStack& textureTrace = gl.GetTextureTrace();
1267 textureTrace.Enable(true);
1269 tet_infoline( "Register visual with control and ensure it has the only handle" );
1270 DummyControl actor = DummyControl::New(true);
1271 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1272 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1273 imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1275 actor.SetSize(200.f, 200.f);
1277 application.SendNotification();
1278 application.Render(0);
1279 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1280 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1282 Stage::GetCurrent().Add( actor );
1284 // Wait for image to load
1285 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1287 application.SendNotification();
1288 application.Render(0);
1289 // Test renderer and texture created
1290 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1291 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1294 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1295 tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1296 dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1297 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1298 application.SendNotification();
1299 application.Render();
1301 // Test texture removed after visual destroyed.
1302 tet_infoline( "Ensure texture is deleted after visual destroyed" );
1303 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION );
1308 int UtcDaliImageVisualReleasePolicy03(void)
1310 ToolkitTestApplication application;
1311 tet_infoline( "UtcDaliImageVisualReleasePolicy03 Never Policy, texture should not be deleted after visual destroyed" );
1313 VisualFactory factory = VisualFactory::Get();
1315 Property::Map propertyMap;
1316 propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
1317 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1318 propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1319 propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1320 propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1322 Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1323 DALI_TEST_CHECK( imageVisual );
1325 TestGlAbstraction& gl = application.GetGlAbstraction();
1326 TraceCallStack& textureTrace = gl.GetTextureTrace();
1327 textureTrace.Enable(true);
1329 tet_infoline( "Register visual with control and ensure it has the only handle" );
1330 DummyControl actor = DummyControl::New(true);
1331 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1332 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1333 imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1335 actor.SetSize(200.f, 200.f);
1337 application.SendNotification();
1338 application.Render(0);
1339 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1340 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1342 Stage::GetCurrent().Add( actor );
1344 // Wait for image to load
1345 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1347 application.SendNotification();
1348 application.Render(0);
1349 // Test renderer and texture created
1350 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1351 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1353 tet_infoline( "Destroy visual by UnRegistering visual with control, check renderer is destroyed" );
1354 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1355 dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1356 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1357 application.SendNotification();
1358 application.Render();
1360 tet_infoline( "Ensure texture is not deleted as policy is set to NEVER" );
1361 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1366 int UtcDaliImageVisualReleasePolicy04(void)
1368 ToolkitTestApplication application;
1369 tet_infoline( "UtcDaliImageVisualReleasePolicy04 Two visuals with different policies sharing a texture" );
1371 VisualFactory factory = VisualFactory::Get();
1373 tet_infoline( "Create first visual with Never release policy" );
1374 Property::Map propertyMapNeverReleasePolicy;
1375 propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE, Visual::IMAGE );
1376 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1377 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1378 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1379 propertyMapNeverReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1380 Visual::Base imageVisualNever = factory.CreateVisual( propertyMapNeverReleasePolicy );
1382 tet_infoline( "Create second visual with Destroyed release policy");
1383 Property::Map propertyMapDestroyedReleasePolicy;
1384 propertyMapDestroyedReleasePolicy.Insert( Visual::Property::TYPE, Visual::IMAGE );
1385 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1386 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1387 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1388 propertyMapDestroyedReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1389 Visual::Base imageVisualDestroyed = factory.CreateVisual( propertyMapDestroyedReleasePolicy );
1391 // Set up trace debug
1392 TestGlAbstraction& gl = application.GetGlAbstraction();
1393 TraceCallStack& textureTrace = gl.GetTextureTrace();
1394 textureTrace.Enable(true);
1396 tet_infoline( "Register visuals with control and ensure it has the only handles" );
1397 DummyControl actor = DummyControl::New(true);
1398 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1399 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualNever );
1400 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDestroyed );
1401 imageVisualNever.Reset(); // reduce ref count so only the control keeps the visual alive.
1402 imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
1404 actor.SetSize(200.f, 200.f);
1406 // Test initially zero renderers
1407 application.SendNotification();
1408 application.Render(0);
1409 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1410 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1412 Stage::GetCurrent().Add( actor );
1414 // Wait for image to load
1415 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1417 application.SendNotification();
1418 application.Render(0);
1419 tet_infoline( "Ensure a texture is created, shared amongst both visuals. Each visual has its own renderer" );
1420 DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
1421 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1423 // Test renderer removed when visual destroyed
1424 DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
1425 dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL2 ); // TEST_VISUAL2 no longer requires the texture as release policy DESTROYED
1426 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1427 application.SendNotification();
1428 application.Render();
1430 // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
1431 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1433 dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL );
1434 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1435 application.SendNotification();
1436 application.Render();
1438 tet_infoline( "Ensure a texture is not deleted as second visual used the NEVER release policy" );
1439 // Test texture was not deleted as TEST_VISUAL release policy is NEVER so it is still required.
1440 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1445 int UtcDaliImageVisualReleasePolicy05(void)
1447 ToolkitTestApplication application;
1448 tet_infoline( "UtcDaliImageVisualReleasePolicy05 Testing settung by string currents correct enum" );
1450 VisualFactory factory = VisualFactory::Get();
1452 Property::Map propertyMapNeverReleasePolicy;
1453 propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE, Visual::IMAGE );
1454 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1455 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1456 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1457 propertyMapNeverReleasePolicy.Insert( "releasePolicy" , "never" );
1459 Visual::Base imageVisualNever = factory.CreateVisual( propertyMapNeverReleasePolicy );
1461 Property::Map resultMap;
1462 imageVisualNever.CreatePropertyMap( resultMap );
1463 DALI_TEST_CHECK( ! resultMap.Empty() );
1465 DALI_TEST_EQUALS( ( resultMap.Find( DevelImageVisual::Property::RELEASE_POLICY ) )->Get<int>(), (int)DevelImageVisual::ReleasePolicy::NEVER, TEST_LOCATION );
1470 int UtcDaliImageVisualReleasePolicy06(void)
1472 ToolkitTestApplication application;
1473 tet_infoline( "UtcDaliImageVisualReleasePolicy06 Never Policy, texture should not be affected by Disabling and Enabling visual" );
1475 VisualFactory factory = VisualFactory::Get();
1477 Property::Map propertyMap;
1478 propertyMap.Insert( Visual::Property::TYPE, Visual::IMAGE );
1479 propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1480 propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1481 propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1482 propertyMap.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::NEVER );
1484 Visual::Base imageVisual = factory.CreateVisual(propertyMap);
1485 DALI_TEST_CHECK( imageVisual );
1487 TestGlAbstraction& gl = application.GetGlAbstraction();
1488 TraceCallStack& textureTrace = gl.GetTextureTrace();
1489 textureTrace.Enable(true);
1491 tet_infoline( "Register visual with control and ensure it has the only handle" );
1492 DummyControl actor = DummyControl::New(true);
1493 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1494 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual );
1495 imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
1497 actor.SetSize(200.f, 200.f);
1499 application.SendNotification();
1500 application.Render(0);
1501 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1502 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1504 Stage::GetCurrent().Add( actor );
1506 // Wait for image to load
1507 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1509 application.SendNotification();
1510 application.Render(0);
1511 // Test renderer and texture created
1512 DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION );
1513 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1514 textureTrace.Reset();
1516 tet_infoline( "Disable Visual and check texture not affected" );
1517 dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1518 application.SendNotification();
1519 application.Render(0);
1520 tet_infoline( "Check renderer is destroyed when visual off stage" );
1521 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1522 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1523 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1524 textureTrace.Reset();
1526 tet_infoline( "Re-enable Visual and check texture not affected" );
1527 dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, true );
1528 application.SendNotification();
1529 application.Render(0);
1530 tet_infoline( "Check texture not affected and renderer is destroyed when visual off stage" );
1531 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1532 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1533 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1538 int UtcDaliImageVisualReleasePolicy07(void)
1540 ToolkitTestApplication application;
1541 tet_infoline( "UtcDaliImageVisualReleasePolicy07 Two visuals with different policies sharing a texture DETACHED and DESTROYED" );
1543 VisualFactory factory = VisualFactory::Get();
1545 tet_infoline( "Create first visual with DESTROYED release policy" );
1546 Property::Map propertyMapNeverReleasePolicy;
1547 propertyMapNeverReleasePolicy.Insert( Visual::Property::TYPE, Visual::IMAGE );
1548 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1549 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1550 propertyMapNeverReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1551 propertyMapNeverReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DESTROYED );
1552 Visual::Base imageVisualDestroyed = factory.CreateVisual( propertyMapNeverReleasePolicy );
1554 tet_infoline( "Create second visual with DETACHED release policy");
1555 Property::Map propertyMapDestroyedReleasePolicy;
1556 propertyMapDestroyedReleasePolicy.Insert( Visual::Property::TYPE, Visual::IMAGE );
1557 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME );
1558 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_WIDTH, 20 );
1559 propertyMapDestroyedReleasePolicy.Insert( ImageVisual::Property::DESIRED_HEIGHT, 30 );
1560 propertyMapDestroyedReleasePolicy.Insert( DevelImageVisual::Property::RELEASE_POLICY , DevelImageVisual::ReleasePolicy::DETACHED );
1561 Visual::Base imageVisualDetached = factory.CreateVisual( propertyMapDestroyedReleasePolicy );
1563 // Set up trace debug
1564 TestGlAbstraction& gl = application.GetGlAbstraction();
1565 TraceCallStack& textureTrace = gl.GetTextureTrace();
1566 textureTrace.Enable(true);
1568 tet_infoline( "Register visuals with control and ensure it has the only handles" );
1569 DummyControl actor = DummyControl::New(true);
1570 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
1571 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualDestroyed );
1572 dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL2, imageVisualDetached );
1573 imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive.
1574 imageVisualDetached.Reset(); // reduce ref count so only the control keeps the visual alive.
1576 actor.SetSize(200.f, 200.f);
1578 // Test initially zero renderers
1579 application.SendNotification();
1580 application.Render(0);
1581 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1582 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION );
1584 Stage::GetCurrent().Add( actor );
1586 // Wait for image to load
1587 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1589 application.SendNotification();
1590 application.Render(0);
1591 tet_infoline( "Ensure a texture is created, shared amongst both visuals. Each visual has its own renderer" );
1592 DALI_TEST_EQUALS( actor.GetRendererCount(), 2u, TEST_LOCATION );
1593 DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION );
1595 // Test renderer removed when visual destroyed
1596 DALI_TEST_CHECK( actor.GetRendererCount() == 2u );
1597 dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL2, false ); // TEST_VISUAL2 no longer requires the texture as release policy DETACHED
1598 DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1599 application.SendNotification();
1600 application.Render();
1602 // Test texture was not deleted as TEST_VISUAL release policy is DESTROYED and is still required.
1603 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );
1605 dummyImpl.EnableVisual( DummyControl::Property::TEST_VISUAL, false );
1606 DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
1607 application.SendNotification();
1608 application.Render();
1610 tet_infoline( "Ensure a texture is not deleted as second visual used the DESTROYED release policy" );
1611 DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION );