X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-ImageVisual.cpp;h=51b9923ebe2656cf6efff01432630da1f86f884f;hp=5cbfc8964301d40c279668ad198394306982e371;hb=e0c063be9e7ecde0e5665079289489d456828abf;hpb=9eecb41468197eb2fc03e55c151011ea387e1bed diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp index 5cbfc89..51b9923 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageVisual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +16,22 @@ #include #include +#include #include #include #include -#include #include #include #include #include +#include +#include +#include #include + +#include #include "dummy-control.h" +#include "test-native-image-source.h" using namespace Dali; using namespace Dali::Toolkit; @@ -43,6 +49,7 @@ void dali_image_visual_cleanup(void) namespace { const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/gallery-small-1.jpg"; +const char* TEST_BROKEN_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/a-random-nonimage.jpg"; const char* TEST_LARGE_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/tbcol.png"; const char* TEST_SMALL_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/icon-edit.png"; const char* TEST_REMOTE_IMAGE_FILE_NAME = "https://www.tizen.org/sites/all/themes/tizen_theme/logo.png"; @@ -53,10 +60,15 @@ const char* TEST_ROTATED_IMAGE = TEST_RESOURCE_DIR "/keyboard-Landscape.jpg"; bool gResourceReadySignalFired = false; - +std::vector gReadyIds = {}; void ResourceReadySignal( Control control ) { gResourceReadySignalFired = true; + gReadyIds.push_back(control.GetProperty< int >( Actor::Property::ID )); +} +void ClearReadyIds() +{ + gReadyIds.clear(); } Actor CreateActorWithImageVisual(const Property::Map& map) @@ -67,7 +79,7 @@ Actor CreateActorWithImageVisual(const Property::Map& map) Visual::Base visual = factory.CreateVisual( map ); DALI_TEST_CHECK( visual ); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); return actor; } @@ -105,10 +117,10 @@ void TestVisualRender( ToolkitTestApplication& application, application.GetPlatform().SetClosestImageSize( Vector2(imageDimensions.GetWidth(), imageDimensions.GetHeight()) ); } - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); // Send messages to update application.Render(); // process update and render @@ -174,10 +186,10 @@ int UtcDaliImageVisualPropertyMap(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); @@ -196,7 +208,7 @@ int UtcDaliImageVisualPropertyMap(void) DALI_TEST_EQUALS( preMultipliedAlpha2, true, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -230,10 +242,10 @@ int UtcDaliImageVisualNoPremultipliedAlpha01(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); @@ -254,7 +266,7 @@ int UtcDaliImageVisualNoPremultipliedAlpha01(void) DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -287,10 +299,10 @@ int UtcDaliImageVisualNoPremultipliedAlpha02(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); @@ -311,7 +323,56 @@ int UtcDaliImageVisualNoPremultipliedAlpha02(void) DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + int srcFactorRgb = renderer.GetProperty( Renderer::Property::BLEND_FACTOR_SRC_RGB ); + int destFactorRgb = renderer.GetProperty( Renderer::Property::BLEND_FACTOR_DEST_RGB ); + int srcFactorAlpha = renderer.GetProperty( Renderer::Property::BLEND_FACTOR_SRC_ALPHA ); + int destFactorAlpha = renderer.GetProperty( Renderer::Property::BLEND_FACTOR_DEST_ALPHA ); + DALI_TEST_CHECK( srcFactorRgb == BlendFactor::SRC_ALPHA ); + DALI_TEST_CHECK( destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA ); + DALI_TEST_CHECK( srcFactorAlpha == BlendFactor::ONE ); + DALI_TEST_CHECK( destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA ); + + textureTrace.Reset(); + + // Make a new visual with the same image + Visual::Base newVisual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( newVisual ); + + // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied. + // Image with a size smaller than 512*512 will be uploaded as a part of the atlas. + + DummyControl newActor = DummyControl::New(); + DummyControlImpl& newDummyImpl = static_cast< DummyControlImpl& >( newActor.GetImplementation() ); + newDummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, newVisual ); + + newActor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); + DALI_TEST_EQUALS( newActor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( newActor ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( newActor.GetRendererCount(), 1u, TEST_LOCATION ); + auto newRenderer = newActor.GetRendererAt( 0 ); + preMultipliedIndex = newRenderer.GetPropertyIndex( "preMultipliedAlpha" ); + DALI_TEST_CHECK( preMultipliedIndex != Property::INVALID_INDEX ); + preMultipliedAlpha = newRenderer.GetProperty< bool >( preMultipliedIndex ); + preMultipliedAlpha2 = newRenderer.GetProperty< bool >( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA ); + + DALI_TEST_EQUALS( preMultipliedAlpha, false, TEST_LOCATION ); + DALI_TEST_EQUALS( preMultipliedAlpha2, false, TEST_LOCATION ); + + srcFactorRgb = newRenderer.GetProperty( Renderer::Property::BLEND_FACTOR_SRC_RGB ); + destFactorRgb = newRenderer.GetProperty( Renderer::Property::BLEND_FACTOR_DEST_RGB ); + srcFactorAlpha = newRenderer.GetProperty( Renderer::Property::BLEND_FACTOR_SRC_ALPHA ); + destFactorAlpha = newRenderer.GetProperty( Renderer::Property::BLEND_FACTOR_DEST_ALPHA ); + DALI_TEST_CHECK( srcFactorRgb == BlendFactor::SRC_ALPHA ); + DALI_TEST_CHECK( destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA ); + DALI_TEST_CHECK( srcFactorAlpha == BlendFactor::ONE ); + DALI_TEST_CHECK( destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA ); + + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -341,10 +402,222 @@ int UtcDaliImageVisualRemoteImageLoad(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( actor ); + application.SendNotification(); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + application.GetScene().Remove( actor ); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + + END_TEST; +} + +int UtcDaliImageVisualWithNativeImage(void) +{ + ToolkitTestApplication application; + tet_infoline( "Use Native Image as url" ); + + NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT); + ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource); + std::string url = imageUrl.GetUrl(); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, url ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( actor ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + + Renderer renderer = actor.GetRendererAt(0); + Shader shader = renderer.GetShader(); + + Property::Value value = shader.GetProperty(Shader::Property::PROGRAM); + DALI_TEST_CHECK(value.GetType() == Property::MAP); + const Property::Map* outMap = value.GetMap(); + std::string fragmentShader = (*outMap)["fragment"].Get(); + + const char* fragmentPrefix = Dali::NativeImageSourceTest::GetCustomFragmentPrefix(); + size_t pos = fragmentShader.find(fragmentPrefix); + + DALI_TEST_EQUALS( pos != std::string::npos, true, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageVisualWithNativeImageCustomShader(void) +{ + ToolkitTestApplication application; + tet_infoline( "Use Native Image as url and Use custom shader" ); + + NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT); + ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource); + std::string url = imageUrl.GetUrl(); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + Property::Map shaderMap; + const std::string customVertexShaderSource = "Foobar"; + const std::string customFragmentShaderSource = "Foobar"; + shaderMap[Toolkit::Visual::Shader::Property::FRAGMENT_SHADER] = customFragmentShaderSource; + shaderMap[Toolkit::Visual::Shader::Property::VERTEX_SHADER] = customVertexShaderSource; + + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( Toolkit::Visual::Property::SHADER, shaderMap ); + propertyMap.Insert( ImageVisual::Property::URL, url ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( actor ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + + application.SendNotification(); + application.Render(16); + + Renderer renderer = actor.GetRendererAt(0); + Shader shader = renderer.GetShader(); + + Property::Value value = shader.GetProperty(Shader::Property::PROGRAM); + DALI_TEST_CHECK(value.GetType() == Property::MAP); + const Property::Map* outMap = value.GetMap(); + std::string fragmentShaderSource = (*outMap)["fragment"].Get(); + std::string vertexShaderSource = (*outMap)["vertex"].Get(); + + // Compare vertex shader is equal + DALI_TEST_EQUALS( customVertexShaderSource, vertexShaderSource, TEST_LOCATION ); + + // Check fragment shader changed + const char* fragmentPrefix = Dali::NativeImageSourceTest::GetCustomFragmentPrefix(); + size_t pos = fragmentShaderSource.find(fragmentPrefix); + + DALI_TEST_EQUALS( pos != std::string::npos, true, TEST_LOCATION ); + + DALI_TEST_EQUALS( std::string(fragmentPrefix) + customFragmentShaderSource, fragmentShaderSource, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageVisualWithNativeImageRemoved(void) +{ + ToolkitTestApplication application; + tet_infoline( "Use Native Image as url" ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + NativeImageSourcePtr nativeImageSource = NativeImageSource::New(500, 500, NativeImageSource::COLOR_DEPTH_DEFAULT); + ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSource); + std::string url = imageUrl.GetUrl(); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, url ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( actor ); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION ); + + tet_infoline( "No delete texture because reference count is not zero" ); + imageUrl.Reset(); + application.GetScene().Remove( actor ); + dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL ); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION ); + + tet_infoline( "Delete texture because reference count is zero" ); + visual.Reset(); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageVisualWithEncodedImageBuffer(void) +{ + ToolkitTestApplication application; + tet_infoline( "Use Encoded Image Buffer as url" ); + + EncodedImageBuffer rawBuffer = ConvertFileToEncodedImageBuffer(TEST_LARGE_IMAGE_FILE_NAME); + ImageUrl url = Dali::Toolkit::Image::GenerateUrl(rawBuffer); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, url.GetUrl() ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -355,12 +628,66 @@ int UtcDaliImageVisualRemoteImageLoad(void) DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; } +int UtcDaliImageVisualWithEncodedImageBufferRemoved(void) +{ + ToolkitTestApplication application; + tet_infoline( "Use Encoded Image Buffer as url" ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + EncodedImageBuffer rawBuffer = ConvertFileToEncodedImageBuffer(TEST_LARGE_IMAGE_FILE_NAME); + ImageUrl imageUrl = Dali::Toolkit::Image::GenerateUrl(rawBuffer); + std::string url = imageUrl.GetUrl(); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, url ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + application.GetScene().Add( actor ); + application.SendNotification(); + + // Wait for decode buffer and make texture. + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION ); + + tet_infoline( "Delete texture because there is no actor to use decoded texture" ); + imageUrl.Reset(); + application.GetScene().Remove( actor ); + dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL ); + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION ); + + END_TEST; +} + int UtcDaliImageVisualTextureReuse1(void) { ToolkitTestApplication application; @@ -378,7 +705,7 @@ int UtcDaliImageVisualTextureReuse1(void) drawTrace.Enable(true); Actor actor = CreateActorWithImageVisual( propertyMap ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); // Wait for image to load @@ -395,7 +722,7 @@ int UtcDaliImageVisualTextureReuse1(void) drawTrace.Reset(); Actor actor2 = CreateActorWithImageVisual( propertyMap ); - Stage::GetCurrent().Add(actor2); + application.GetScene().Add(actor2); application.SendNotification(); // Send messages to update application.Render(); // process update and render @@ -408,11 +735,12 @@ int UtcDaliImageVisualTextureReuse1(void) DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION ); - DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION ); + // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back. +// DALI_TEST_EQUALS( textureTrace.CountMethod("BindTexture"), 0, TEST_LOCATION ); tet_infoline("Test that removing 1 actor doesn't delete the texture\n"); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); application.SendNotification(); application.Render(); @@ -421,7 +749,7 @@ int UtcDaliImageVisualTextureReuse1(void) tet_infoline("Test that removing last actor does delete the texture\n"); - Stage::GetCurrent().Remove( actor2 ); // Detaches remaining ImageVisual + application.GetScene().Remove( actor2 ); // Detaches remaining ImageVisual application.SendNotification(); application.Render(); @@ -448,7 +776,7 @@ int UtcDaliImageVisualTextureReuse2(void) drawTrace.Enable(true); Actor actor = CreateActorWithImageVisual( propertyMap ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); // Wait for image to load @@ -468,7 +796,7 @@ int UtcDaliImageVisualTextureReuse2(void) propertyMap.Insert( ImageVisual::Property::DESIRED_WIDTH, 100 ); propertyMap.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100 ); Actor actor2 = CreateActorWithImageVisual( propertyMap ); - Stage::GetCurrent().Add(actor2); + application.GetScene().Add(actor2); application.SendNotification(); @@ -486,15 +814,15 @@ int UtcDaliImageVisualTextureReuse2(void) DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION ); DALI_TEST_EQUALS( drawTrace.CountMethod("DrawArrays"), 2, TEST_LOCATION ); TraceCallStack::NamedParams tex1; - tex1["texture"] = "1"; + tex1["texture"] << 1; TraceCallStack::NamedParams tex2; - tex1["texture"] = "2"; + tex2["texture"] << 2; DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex1), true, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethodAndParams("BindTexture", tex2), true, TEST_LOCATION ); tet_infoline("Test that removing 1 actor deletes it's texture\n"); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); application.SendNotification(); application.Render(); @@ -503,7 +831,7 @@ int UtcDaliImageVisualTextureReuse2(void) tet_infoline("Test that removing last actor deletes it's texture\n"); - Stage::GetCurrent().Remove( actor2 ); + application.GetScene().Remove( actor2 ); application.SendNotification(); application.Render(); @@ -514,44 +842,20 @@ int UtcDaliImageVisualTextureReuse2(void) } -int UtcDaliImageVisualImageHandle(void) -{ - ToolkitTestApplication application; - tet_infoline( "Request image visual with an image handle" ); - - VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); - - Image image = ResourceImage::New(TEST_IMAGE_FILE_NAME); - Visual::Base visual = factory.CreateVisual( image ); - - // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied. - // Image with a size smaller than 512*512 will be uploaded as a part of the atlas. - - const int width=512; - const int height=513; - - Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD ); - bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, width, height,width, height ); - - TestGlAbstraction& gl = application.GetGlAbstraction(); - TraceCallStack& textureTrace = gl.GetTextureTrace(); - textureTrace.Enable(true); - - DummyControl actor = DummyControl::New(); - TestVisualRender( application, actor, visual, 1u, - ImageDimensions(width, height), - Integration::ResourcePointer(bitmap) ); - - DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - END_TEST; -} - int UtcDaliImageVisualCustomWrapModePixelArea(void) { ToolkitTestApplication application; tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area with atlasing" ); + static std::vector customUniforms = + { + UniformData("pixelArea", Property::Type::VECTOR4), + UniformData("wrapMode", Property::Type::VECTOR2), + }; + + TestGraphicsController& graphics = application.GetGraphicsController(); + graphics.AddCustomUniforms(customUniforms); + VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); @@ -583,9 +887,9 @@ int UtcDaliImageVisualCustomWrapModePixelArea(void) DummyControl actor = DummyControl::New(); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - Stage::GetCurrent().Add( actor ); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + application.GetScene().Add( actor ); // loading started application.SendNotification(); @@ -597,10 +901,10 @@ int UtcDaliImageVisualCustomWrapModePixelArea(void) // WITH atlasing, the wrapping is handled manually in shader, so the following gl function should not be called std::stringstream out; - out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT; + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT; DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) ); out.str(""); - out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT; + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT; DALI_TEST_CHECK( !texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) ); // test the uniforms which used to handle the wrap mode @@ -631,6 +935,14 @@ int UtcDaliImageVisualCustomWrapModeNoAtlas(void) ToolkitTestApplication application; tet_infoline( "Request image visual with a Property::Map, test custom wrap mode and pixel area without atlasing" ); + static std::vector customUniforms = + { + UniformData("pixelArea", Property::Type::VECTOR4), + }; + + TestGraphicsController& graphics = application.GetGraphicsController(); + graphics.AddCustomUniforms(customUniforms); + VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); @@ -655,19 +967,22 @@ int UtcDaliImageVisualCustomWrapModeNoAtlas(void) TestGlAbstraction& gl = application.GetGlAbstraction(); TraceCallStack& textureTrace = gl.GetTextureTrace(); textureTrace.Enable(true); + textureTrace.EnableLogging(true); TraceCallStack& texParameterTrace = gl.GetTexParameterTrace(); texParameterTrace.Enable( true ); + texParameterTrace.EnableLogging( true ); DummyControl actor = DummyControl::New(); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - Stage::GetCurrent().Add( actor ); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + application.GetScene().Add( actor ); // loading started application.SendNotification(); application.Render(); + application.SendNotification(); DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); @@ -675,10 +990,10 @@ int UtcDaliImageVisualCustomWrapModeNoAtlas(void) // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters std::stringstream out; - out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT; + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_MIRRORED_REPEAT; DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) ); out.str(""); - out << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT; + out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_T << ", " << GL_REPEAT; DALI_TEST_CHECK( texParameterTrace.FindMethodAndParams("TexParameteri", out.str()) ); // test the uniforms which used to handle the wrap mode @@ -705,6 +1020,14 @@ int UtcDaliImageVisualAnimateMixColor(void) ToolkitTestApplication application; tet_infoline( "Animate mix color" ); + static std::vector customUniforms = + { + UniformData("mixColor", Property::Type::VECTOR3), + }; + + TestGraphicsController& graphics = application.GetGraphicsController(); + graphics.AddCustomUniforms(customUniforms); + application.GetPlatform().SetClosestImageSize( Vector2(100, 100) ); VisualFactory factory = VisualFactory::Get(); @@ -719,15 +1042,15 @@ int UtcDaliImageVisualAnimateMixColor(void) Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - actor.SetColor(Color::BLACK); - Stage::GetCurrent().Add(actor); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + actor.SetProperty( Actor::Property::COLOR,Color::BLACK); + application.GetScene().Add(actor); DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0); - Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::MIX_COLOR ); + Property::Index index = renderer.GetPropertyIndex( Visual::Property::MIX_COLOR ); Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::AUTO, TEST_LOCATION ); @@ -751,12 +1074,15 @@ int UtcDaliImageVisualAnimateMixColor(void) Animation animation = dummyImpl.CreateTransition( transition ); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); - animation.AnimateTo( Property(actor, Actor::Property::COLOR), Color::WHITE ); animation.Play(); + TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); + glAbstraction.EnableEnableDisableCallTrace( true ); + TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace(); + std::ostringstream blendStr; + blendStr << std::hex << GL_BLEND; + application.SendNotification(); application.Render(0); // Ensure animation starts application.Render(2000u); // Halfway point @@ -766,16 +1092,22 @@ int UtcDaliImageVisualAnimateMixColor(void) DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "uColor", Vector4( 0.5f, 0.5f, 0.5f, 0.75f ) ), true, TEST_LOCATION ); DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "mixColor", testColor ), true, TEST_LOCATION ); + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) ); + + glEnableStack.Reset(); + application.Render(2000u); // Halfway point between blue and white - DALI_TEST_EQUALS( actor.GetCurrentColor(), Color::WHITE, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.GetCurrentProperty< Vector4 >( Actor::Property::COLOR ), Color::WHITE, TEST_LOCATION ); DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "uColor", Vector4( 1.0f, 1.0f, 1.0f, 0.5f ) ), true, TEST_LOCATION ); DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "mixColor", Vector3( TARGET_MIX_COLOR ) ), true, TEST_LOCATION ); - TestMixColor( visual, Visual::Property::MIX_COLOR, TARGET_MIX_COLOR ); + // GL_BLEND should not be changed: Keep enabled + // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back. +// DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str().c_str() ) ); + DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) ); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); + TestMixColor( visual, Visual::Property::MIX_COLOR, TARGET_MIX_COLOR ); END_TEST; } @@ -799,16 +1131,23 @@ int UtcDaliImageVisualAnimateOpacity(void) Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - actor.SetColor(Color::BLACK); - Stage::GetCurrent().Add(actor); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + actor.SetProperty( Actor::Property::COLOR,Color::BLACK); + application.GetScene().Add(actor); DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); - Renderer renderer = actor.GetRendererAt(0); - Property::Value blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); + TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); + glAbstraction.EnableEnableDisableCallTrace( true ); + TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace(); + std::ostringstream blendStr; + blendStr << std::hex << GL_BLEND; + + application.SendNotification(); + application.Render(); + + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str()) ); { 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." ); @@ -827,6 +1166,8 @@ int UtcDaliImageVisualAnimateOpacity(void) Animation animation = dummyImpl.CreateTransition( transition ); animation.Play(); + glEnableStack.Reset(); + application.SendNotification(); application.Render(0); // Ensure animation starts application.Render(2000u); // Halfway point through animation @@ -842,8 +1183,9 @@ int UtcDaliImageVisualAnimateOpacity(void) DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) ); DALI_TEST_EQUALS( color.a, 1.0f, TEST_LOCATION ); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::AUTO, TEST_LOCATION ); + // TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back. +// DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str().c_str() ) ); + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) ); } @@ -864,8 +1206,7 @@ int UtcDaliImageVisualAnimateOpacity(void) Animation animation = dummyImpl.CreateTransition( transition ); animation.Play(); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); + glEnableStack.Reset(); application.SendNotification(); application.Render(0); // Ensure animation starts @@ -876,17 +1217,23 @@ int UtcDaliImageVisualAnimateOpacity(void) DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) ); DALI_TEST_EQUALS( color.a, 0.55f, TEST_LOCATION ); + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) ); + + glEnableStack.Reset(); + application.Render(2016u); // end application.SendNotification(); DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) ); DALI_TEST_EQUALS( color.a, 0.1f, TEST_LOCATION ); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); + // GL_BLEND should not be changed: Keep enabled +// @todo +// TODO: Temporarily commented out the line below when caching is disabled. Will need to add it back. +// DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) ); + DALI_TEST_CHECK( !glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) ); } - END_TEST; } @@ -911,9 +1258,9 @@ int UtcDaliImageVisualAnimateOpacity02(void) Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - actor.SetColor(Color::BLACK); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + actor.SetProperty( Actor::Property::COLOR,Color::BLACK); tet_infoline( "Test that the opacity doesn't animate when actor not staged" ); @@ -940,7 +1287,7 @@ int UtcDaliImageVisualAnimateOpacity02(void) Dali::Toolkit::TransitionData transition = TransitionData::New( array ); Animation animation = dummyImpl.CreateTransition( transition ); - Stage::GetCurrent().Add(actor); + application.GetScene().Add(actor); application.SendNotification(); application.Render(0); // Ensure animation starts @@ -953,26 +1300,32 @@ int UtcDaliImageVisualAnimateOpacity02(void) animation = dummyImpl.CreateTransition( transition ); animation.Play(); + TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); + glAbstraction.EnableEnableDisableCallTrace( true ); + TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace(); + std::ostringstream blendStr; + blendStr << std::hex << GL_BLEND; + application.SendNotification(); application.Render(0); // Ensure animation starts application.Render(2000u); // Halfway point through animation application.SendNotification(); // Handle any signals - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::ON, TEST_LOCATION ); + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) ); Vector4 color; DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) ); DALI_TEST_EQUALS( color.a, 0.5f, TEST_LOCATION ); + glEnableStack.Reset(); + application.Render(2001u); // end application.SendNotification(); // ensure animation finished signal is sent DALI_TEST_CHECK( application.GetGlAbstraction().GetUniformValue< Vector4 >( "uColor", color ) ); DALI_TEST_EQUALS( color.a, 1.0f, TEST_LOCATION ); - blendModeValue = renderer.GetProperty( Renderer::Property::BLEND_MODE ); - DALI_TEST_EQUALS( blendModeValue.Get(), (int)BlendMode::AUTO, TEST_LOCATION ); + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Disable", blendStr.str() ) ); END_TEST; } @@ -984,6 +1337,14 @@ int UtcDaliImageVisualAnimatePixelArea(void) ToolkitTestApplication application; tet_infoline( "ImageVisual animate pixel area" ); + static std::vector customUniforms = + { + UniformData("pixelArea", Property::Type::VECTOR4), + }; + + TestGraphicsController& graphics = application.GetGraphicsController(); + graphics.AddCustomUniforms(customUniforms); + application.GetPlatform().SetClosestImageSize( Vector2(100, 100) ); VisualFactory factory = VisualFactory::Get(); @@ -998,15 +1359,15 @@ int UtcDaliImageVisualAnimatePixelArea(void) Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); - actor.SetSize(2000, 2000); - actor.SetParentOrigin(ParentOrigin::CENTER); - actor.SetColor(Color::BLACK); - Stage::GetCurrent().Add(actor); + actor.SetProperty( Actor::Property::SIZE, Vector2(2000, 2000) ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN,ParentOrigin::CENTER); + actor.SetProperty( Actor::Property::COLOR,Color::BLACK); + application.GetScene().Add(actor); DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0); - Property::Index index = DevelHandle::GetPropertyIndex( renderer, Visual::Property::MIX_COLOR ); + Property::Index index = renderer.GetPropertyIndex( Visual::Property::MIX_COLOR ); tet_infoline("Test that the renderer has the mixColor property"); DALI_TEST_CHECK( index != Property::INVALID_INDEX ); @@ -1058,10 +1419,10 @@ int UtcDaliImageVisualTextureCancelRemoteLoad(void) drawTrace.Enable(true); Actor actor = CreateActorWithImageVisual( propertyMap ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); application.SendNotification(); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); @@ -1075,7 +1436,7 @@ int UtcDaliImageVisualTextureCancelRemoteLoad(void) int UtcDaliImageVisualTextureCancelAsyncLoad(void) { ToolkitTestApplication application; - tet_infoline( "Load image asynchronosly, cancel loading, then load again" ); + tet_infoline( "Load image asynchronously, cancel loading, then load again" ); VisualFactory factory = VisualFactory::Get(); DALI_TEST_CHECK( factory ); @@ -1097,12 +1458,12 @@ int UtcDaliImageVisualTextureCancelAsyncLoad(void) DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() ); dummyImpl.RegisterVisual( Control::Property::BACKGROUND, visual ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Cancel loading - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Create another visual with the same image visual = factory.CreateVisual( propertyMap ); @@ -1147,10 +1508,10 @@ int UtcDaliImageVisualSetInvalidAsyncImage(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1161,7 +1522,7 @@ int UtcDaliImageVisualSetInvalidAsyncImage(void) DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -1191,18 +1552,23 @@ int UtcDaliImageVisualSetInvalidSyncImage(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); + // Check resource status + Visual::ResourceStatus status = actor.GetVisualResourceStatus(Control::CONTROL_PROPERTY_END_INDEX + 1); + DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION); + + // The broken image should be shown. DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -1232,10 +1598,10 @@ int UtcDaliImageVisualSetInvalidRemoteImage(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1246,7 +1612,7 @@ int UtcDaliImageVisualSetInvalidRemoteImage(void) DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); - Stage::GetCurrent().Remove( actor ); + application.GetScene().Remove( actor ); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); END_TEST; @@ -1283,15 +1649,68 @@ int UtcDaliImageVisualAlphaMask(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.IsResourceReady(), true, TEST_LOCATION ); + + dummyImpl.UnregisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1 ); + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageVisualSynchronousLoadAlphaMask(void) +{ + ToolkitTestApplication application; + tet_infoline( "Request image visual with a Property::Map containing an Alpha mask with synchronous loading" ); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); + propertyMap.Insert( ImageVisual::Property::URL, TEST_LARGE_IMAGE_FILE_NAME ); + propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME ); + propertyMap.Insert( ImageVisual::Property::SYNCHRONOUS_LOADING, true ); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + DALI_TEST_CHECK( visual ); + + Property::Map testMap; + visual.CreatePropertyMap(testMap); + DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION ); + + // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied. + // Image with a size smaller than 512*512 will be uploaded as a part of the atlas. + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); + DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION ); + + application.GetScene().Add( actor ); + + // Do not wait for any EventThreadTrigger in synchronous alpha mask. application.SendNotification(); application.Render(); @@ -1319,13 +1738,14 @@ int UtcDaliImageVisualRemoteAlphaMask(void) Property::Map propertyMap; propertyMap.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); propertyMap.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME ); - propertyMap.Insert( "alphaMaskUrl", MASK_IMAGE ); + propertyMap.Insert( ImageVisual::Property::ALPHA_MASK_URL, MASK_IMAGE ); Visual::Base visual = factory.CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); Property::Map testMap; visual.CreatePropertyMap(testMap); + DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL),Property::Value(MASK_IMAGE), TEST_LOCATION ); // For tesing the LoadResourceFunc is called, a big image size should be set, so the atlasing is not applied. @@ -1338,16 +1758,17 @@ int UtcDaliImageVisualRemoteAlphaMask(void) DummyControl actor = DummyControl::New(); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); application.SendNotification(); application.Render(); @@ -1359,7 +1780,6 @@ int UtcDaliImageVisualRemoteAlphaMask(void) END_TEST; } - int UtcDaliImageVisualAlphaMaskCrop(void) { ToolkitTestApplication application; @@ -1395,15 +1815,15 @@ int UtcDaliImageVisualAlphaMaskCrop(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - actor.SetSize( 200.f, 200.f ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); DALI_TEST_EQUALS( actor.GetRendererCount(), 0u, TEST_LOCATION ); DALI_TEST_EQUALS( actor.IsResourceReady(), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 3 ), true, TEST_LOCATION ); application.SendNotification(); application.Render(); @@ -1438,14 +1858,14 @@ int UtcDaliImageVisualReleasePolicy01(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); application.SendNotification(); application.Render(0); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1488,14 +1908,14 @@ int UtcDaliImageVisualReleasePolicy02(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); application.SendNotification(); application.Render(0); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1539,14 +1959,14 @@ int UtcDaliImageVisualReleasePolicy03(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); application.SendNotification(); application.Render(0); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1594,7 +2014,7 @@ int UtcDaliImageVisualReleasePolicy04(void) imageVisualNever.Reset(); // reduce ref count so only the control keeps the visual alive. imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); // Test initially zero renderers application.SendNotification(); @@ -1602,7 +2022,7 @@ int UtcDaliImageVisualReleasePolicy04(void) DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1678,14 +2098,14 @@ int UtcDaliImageVisualReleasePolicy06(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); application.SendNotification(); application.Render(0); DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1744,7 +2164,7 @@ int UtcDaliImageVisualReleasePolicy07(void) imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive. imageVisualDetached.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); // Test initially zero renderers application.SendNotification(); @@ -1752,7 +2172,7 @@ int UtcDaliImageVisualReleasePolicy07(void) DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); // Wait for image to load DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1784,6 +2204,87 @@ int UtcDaliImageVisualReleasePolicy07(void) END_TEST; } +int UtcDaliImageVisualReleasePolicy08(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliImageVisualReleasePolicy08 Ensure TextureSet is same after detach/attach on stage when texture used the DESTROYED release policy" ); + + tet_infoline( "Create first visual with DESTROYED release policy" ); + Visual::Base imageVisualDestroyed = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED ); + + // Set up trace debug + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + tet_infoline( "Register visuals with control and ensure it has the only handles" ); + DummyControl actor = DummyControl::New(true); + Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisualDestroyed ); + imageVisualDestroyed.Reset(); // reduce ref count so only the control keeps the visual alive. + + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + + // Test initially zero renderers + application.SendNotification(); + application.Render(0); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION ); + textureTrace.Reset(); + + application.GetScene().Add( actor ); + + // Wait for image to load + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(0); + tet_infoline( "Ensure a texture is created" ); + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION ); + DALI_TEST_EQUALS( textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION ); + textureTrace.Reset(); + + // Ensure TextureSet is same after detach/attach on stage when texture used the DESTROYED release policy + // 1. Get TextureSet + TextureSet textureSetBefore = actor.GetRendererAt( 0u ).GetTextures(); + + // 2.Remove actor from stage. In this case, renderer also is deleted. + tet_infoline( "Remove actor from stage" ); + application.GetScene().Remove( actor ); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + application.SendNotification(); + application.Render(); + + tet_infoline( "Ensure a texture is not deleted as visual used the DESTROYED release policy" ); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 0, TEST_LOCATION ); + textureTrace.Reset(); + + // 3.Add actor in stage. In this case, renderer is created. + tet_infoline( "Add actor in stage" ); + application.GetScene().Add( actor ); + DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); + application.SendNotification(); + application.Render(); + tet_infoline( "Ensure a texture is not created again" ); + DALI_TEST_EQUALS( textureTrace.CountMethod("GenTextures"), 0, TEST_LOCATION ); + textureTrace.Reset(); + + // 4.Compare Texture with before and after. textureSet need to be same because release policy is the DESTROYED. + tet_infoline( "Ensure a textureSet is not deleted because it is used the DESTROYED release policy" ); + TextureSet textureSetAfter = actor.GetRendererAt( 0u ).GetTextures(); + DALI_TEST_CHECK( textureSetBefore == textureSetAfter ); + textureSetBefore.Reset(); + textureSetAfter.Reset(); + + dummyImpl.UnregisterVisual( DummyControl::Property::TEST_VISUAL ); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + application.SendNotification(); + application.Render(); + DALI_TEST_EQUALS( textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION ); + + END_TEST; +} + int UtcDaliImageVisualLoadPolicy01(void) { ToolkitTestApplication application; @@ -1827,8 +2328,8 @@ int UtcDaliImageVisualLoadPolicy01(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); - Stage::GetCurrent().Add( actor ); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + application.GetScene().Add( actor ); tet_infoline( "Ensure nothing triggers another load as texure already loaded" ); const unsigned int TIME_OUT_3_SECONDS = 3; DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1, TIME_OUT_3_SECONDS ), false, TEST_LOCATION ); @@ -1881,8 +2382,8 @@ int UtcDaliImageVisualLoadPolicy02(void) dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive. - actor.SetSize(200.f, 200.f); - Stage::GetCurrent().Add( actor ); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + application.GetScene().Add( actor ); tet_infoline( "Allow image time to load" ); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -1921,7 +2422,7 @@ int UtcDaliImageVisualLoadPolicy03(void) DummyControl actor = DummyControl::New(true); actor.ResourceReadySignal().Connect( &ResourceReadySignal); Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); tet_infoline( "Create visual with IMMEDIATE load policy" ); Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE ); @@ -1959,7 +2460,7 @@ int UtcDaliImageVisualLoadPolicy04(void) DummyControl actor = DummyControl::New(true); actor.ResourceReadySignal().Connect( &ResourceReadySignal); Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); - actor.SetSize(200.f, 200.f); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); tet_infoline( "Create visual with IMMEDIATE load policy" ); Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE ); @@ -1988,7 +2489,7 @@ int UtcDaliImageVisualLoadPolicy04(void) tet_infoline( "Registering visual this should trigger the loading signal as is already image loaded for previous control" ); dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 ); imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive. - actor2.SetSize(200.f, 200.f); + actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 0 ), true, TEST_LOCATION ); // Not expecting any further loading as texture is being reused. DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); @@ -2009,8 +2510,8 @@ int UtcDaliImageVisualLoadPolicy05(void) DummyControl actor = DummyControl::New(true); actor.ResourceReadySignal().Connect( &ResourceReadySignal); Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); - actor.SetSize(200.f, 200.f); - Stage::GetCurrent().Add( actor ); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + application.GetScene().Add( actor ); tet_infoline( "Create visual with ATTACHED load policy" ); Visual::Base imageVisual = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED ); @@ -2039,7 +2540,7 @@ int UtcDaliImageVisualLoadPolicy05(void) tet_infoline( "Registering visual this should trigger the loading signal as is already image loaded for previous control" ); dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 ); imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive. - actor2.SetSize(200.f, 200.f); + actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 0 ), true, TEST_LOCATION ); // Not expecting any further loading as texture is being reused. DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); @@ -2063,7 +2564,7 @@ int UtcDaliImageVisualOrientationCorrection(void) tet_infoline( "Create control for visual, need to loaded it" ); DummyControl actor = DummyControl::New(true); Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); - Stage::GetCurrent().Add( actor ); + application.GetScene().Add( actor ); dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); // Wait for image to load @@ -2104,3 +2605,171 @@ int UtcDaliImageVisualOrientationCorrection(void) END_TEST; } + +int UtcDaliImageVisualCustomShader(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliImageVisualCustomShader Test custom shader" ); + + VisualFactory factory = VisualFactory::Get(); + Property::Map properties; + Property::Map shader; + const std::string vertexShader = "Foobar"; + const std::string fragmentShader = "Foobar"; + shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader; + shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader; + + properties[Visual::Property::TYPE] = Visual::IMAGE; + properties[Visual::Property::SHADER] = shader; + properties[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + + Visual::Base visual = factory.CreateVisual( properties ); + + // trigger creation through setting on stage + DummyControl dummy = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + + dummy.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) ); + dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + application.GetScene().Add( dummy ); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + Renderer renderer = dummy.GetRendererAt( 0 ); + Shader shader2 = renderer.GetShader(); + Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM ); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK( map ); + + Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp + DALI_TEST_EQUALS( fragmentShader, fragment->Get< std::string >(), TEST_LOCATION ); + + Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp + DALI_TEST_EQUALS( vertexShader, vertex->Get< std::string >(), TEST_LOCATION ); + + shader.Clear(); + + shader[Visual::Shader::Property::HINTS] = Shader::Hint::OUTPUT_IS_TRANSPARENT; + properties[Visual::Property::SHADER] = shader; + + Visual::Base visual1 = factory.CreateVisual( properties ); + + // trigger creation through setting on stage + DummyControl dummy1 = DummyControl::New( true ); + Impl::DummyControl& dummyImpl1 = static_cast< Impl::DummyControl& >( dummy1.GetImplementation() ); + dummyImpl1.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual1 ); + dummy1.SetProperty( Actor::Property::SIZE, Vector2( 200, 200 ) ); + dummy1.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + application.GetScene().Add( dummy1 ); + + TestGlAbstraction& glAbstraction = application.GetGlAbstraction(); + glAbstraction.EnableEnableDisableCallTrace( true ); + + application.SendNotification(); + application.Render(); + + TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace(); + std::ostringstream blendStr; + blendStr << std::hex << GL_BLEND; + DALI_TEST_CHECK( glEnableStack.FindMethodAndParams( "Enable", blendStr.str() ) ); + + END_TEST; +} + + +void ResourceReadyLoadNext( Control control ) +{ + static int callNumber = 0; + + gResourceReadySignalFired = true; + gReadyIds.push_back(control.GetProperty< int >( Actor::Property::ID )); + + if( callNumber == 0 ) + { + DALI_TEST_EQUALS( control.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL), Toolkit::Visual::ResourceStatus::FAILED, TEST_LOCATION ); + + tet_infoline( "Create visual with loaded image from within the signal handler" ); + VisualFactory factory = VisualFactory::Get(); + Visual::Base imageVisual = factory.CreateVisual( TEST_IMAGE_FILE_NAME, ImageDimensions{20,30} ); + + Impl::DummyControl& controlImpl = static_cast(control.GetImplementation()); + controlImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual ); // This should trigger another signal. + callNumber = 1; + } + else + { + tet_infoline( "3rd signal called" ); + DALI_TEST_CHECK(true); + } +} + +int UtcDaliImageVisualLoadReady01(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliImageVisualLoadReady01"); + tet_infoline( "First part: Load an image visual for one resource, then another image visual for a second resource."); + tet_infoline( "Second part, In the ready signal for the second image visual, add a 3rd visual with the first URL" ); + tet_infoline( "Should get a ready signal for all three visuals"); + + ClearReadyIds(); + + tet_infoline( "Create a control and connect to resource ready signal" ); + DummyControl actor = DummyControl::New(true); + int actor1Id = actor.GetProperty< int >( Actor::Property::ID ); + actor.ResourceReadySignal().Connect( &ResourceReadySignal); + Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); + actor.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + application.GetScene().Add(actor); + + tet_infoline( "Create visual with IMMEDIATE load policy" ); + Visual::Base imageVisual1 = CreateVisualWithPolicy( TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE ); + + tet_infoline( "Registering visual allows control to get a signal once loaded even if visual not enabled( staged )" ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual1 ); + + + tet_infoline( "Allow image time to load" ); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); + application.Render(); + + tet_infoline( "Testing texture is loaded and resource ready signal fired" ); + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + DALI_TEST_EQUALS( gReadyIds[0], actor1Id, TEST_LOCATION ); + + + tet_infoline( "Original control correctly signalled, now testing failing image" ); + + gResourceReadySignalFired = false; // Reset signal check ready for testing next Control + ClearReadyIds(); + + Visual::Base imageVisual2 = CreateVisualWithPolicy( TEST_BROKEN_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE ); + + DummyControl actor2 = DummyControl::New(true); + int actor2Id = actor2.GetProperty< int >( Actor::Property::ID ); + Impl::DummyControl& dummyImpl2 = static_cast(actor2.GetImplementation()); + actor2.ResourceReadySignal().Connect( &ResourceReadyLoadNext); + + tet_infoline( "Registering visual this should trigger the ready signal when the image fails to load" ); + dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, imageVisual2 ); + + actor2.SetProperty( Actor::Property::SIZE, Vector2(200.f, 200.f) ); + application.GetScene().Add(actor2); + + tet_infoline( "Wait for loading thread to finish"); + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + DALI_TEST_EQUALS( gReadyIds[0], actor2Id, TEST_LOCATION); + + tet_infoline( "Check for 3rd signal"); + application.SendNotification(); + DALI_TEST_EQUALS( gReadyIds.size(), 2, TEST_LOCATION ); + DALI_TEST_EQUALS( gReadyIds[1], actor2Id, TEST_LOCATION); + + END_TEST; +}