From 8eb657e8cc2c66a09b45aab293a983459b396b33 Mon Sep 17 00:00:00 2001 From: "Eunki, Hong" Date: Wed, 2 Mar 2022 22:34:48 +0900 Subject: [PATCH] Do not create visual when URL or array is empty When we try to create ImageVisual with empty string, it will be failed. But when we try to create AnimatedImageVisual with empty string, it will try to create new AnimatedImageVisual. AnimatedImageVisual is weak when mFrameCount is zero. So we try to guard that case before creation-level. Moreover, we also don't create visual for SVG, N_PATCH, ANIMATED_VECTOR_IMAGE Change-Id: Ibd7a3db825473958bbe51e6fb909572464b21da6 Signed-off-by: Eunki, Hong --- .../utc-Dali-DebugRendering.cpp | 385 ++++++++++++--------- .../internal/visuals/visual-factory-impl.cpp | 34 +- 2 files changed, 242 insertions(+), 177 deletions(-) diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp index 9b733f2..d39b00c 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-DebugRendering.cpp @@ -18,9 +18,9 @@ #include #include -#include -#include #include +#include +#include #include @@ -37,45 +37,49 @@ using namespace Dali::Toolkit; namespace { -const char* TEST_IMAGE_FILE_NAME = "image_01.jpg"; -const char* TEST_NPATCH_FILE_NAME = "image_01.9.jpg"; -const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg"; -const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; +const char* TEST_IMAGE_FILE_NAME = "image_01.jpg"; +const char* TEST_NPATCH_FILE_NAME = "image_01.9.jpg"; +const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg"; +const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; -const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); +const std::string DEFAULT_FONT_DIR("/resources/fonts"); -void TestDebugVisual( Integration::Scene scene, Visual::Base& visual, Visual::Type actualType, Vector2 expectedNaturalSize ) +void TestDebugVisual(Integration::Scene scene, Visual::Base& visual, DevelVisual::Type actualType, Vector2 expectedNaturalSize) { { - auto& impl = GetImplementation( visual ); - DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) ); + auto& impl = GetImplementation(visual); + DALI_TEST_CHECK(&typeid(Toolkit::Internal::WireframeVisual) == &typeid(impl)); } Vector2 naturalSize; - visual.GetNaturalSize( naturalSize ); - DALI_TEST_EQUALS( naturalSize, expectedNaturalSize, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + visual.GetNaturalSize(naturalSize); + DALI_TEST_EQUALS(naturalSize, expectedNaturalSize, Math::MACHINE_EPSILON_1000, TEST_LOCATION); Property::Map propertyMap; - visual.CreatePropertyMap( propertyMap ); - Property::Value* typeValue = propertyMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER ); - if ( typeValue ) + visual.CreatePropertyMap(propertyMap); + Property::Value* typeValue = propertyMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER); + if(typeValue) { - DALI_TEST_CHECK( typeValue->Get() == actualType ); + DALI_TEST_CHECK(typeValue->Get() == actualType); } - DummyControl actor = DummyControl::New(); + DummyControl actor = DummyControl::New(); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); - dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); - scene.Add( actor ); + dummyImpl.RegisterVisual(Control::CONTROL_PROPERTY_END_INDEX + 1, visual); + scene.Add(actor); - DALI_TEST_EQUALS( actor.GetRendererCount(), 1, TEST_LOCATION ); - if( actor.GetRendererCount() > 0 ) + DALI_TEST_EQUALS(actor.GetRendererCount(), 1, TEST_LOCATION); + if(actor.GetRendererCount() > 0) { - Geometry geometry = actor.GetRendererAt( 0 ).GetGeometry(); - DALI_TEST_CHECK( geometry.GetType() == Geometry::LINES ); + Geometry geometry = actor.GetRendererAt(0).GetGeometry(); + DALI_TEST_CHECK(geometry.GetType() == Geometry::LINES); } } +void TestDebugVisual(Integration::Scene scene, Visual::Base& visual, Visual::Type actualType, Vector2 expectedNaturalSize) +{ + TestDebugVisual(scene, visual, (DevelVisual::Type)actualType, expectedNaturalSize); } +} // namespace void dali_debug_rendering_startup(void) { @@ -94,57 +98,57 @@ int UtcDaliDebugRenderingGetVisual1(void) { EnvironmentVariable::SetTestingEnvironmentVariable(true); ToolkitTestApplication application; - tet_infoline( "UtcDaliDebugRenderingGetVisual1: Request visual with a Property::Map" ); + tet_infoline("UtcDaliDebugRenderingGetVisual1: Request visual with a Property::Map"); VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); // Test that color visual is replaced with debug visual Property::Map propertyMap1; - propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR); - propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE); + propertyMap1.Insert(Visual::Property::TYPE, Visual::COLOR); + propertyMap1.Insert(ColorVisual::Property::MIX_COLOR, Color::BLUE); Visual::Base colorVisual = factory.CreateVisual(propertyMap1); - DALI_TEST_CHECK( colorVisual ); - TestDebugVisual( application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO ); + DALI_TEST_CHECK(colorVisual); + TestDebugVisual(application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO); // Test that border visual is replaced with debug visual Property::Map propertyMap2; - propertyMap2.Insert(Visual::Property::TYPE, Visual::BORDER); - propertyMap2.Insert(BorderVisual::Property::COLOR, Color::BLUE); - propertyMap2.Insert(BorderVisual::Property::SIZE, 2.f); + propertyMap2.Insert(Visual::Property::TYPE, Visual::BORDER); + propertyMap2.Insert(BorderVisual::Property::COLOR, Color::BLUE); + propertyMap2.Insert(BorderVisual::Property::SIZE, 2.f); Visual::Base borderVisual = factory.CreateVisual(propertyMap2); - DALI_TEST_CHECK( borderVisual ); - TestDebugVisual( application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO ); + DALI_TEST_CHECK(borderVisual); + TestDebugVisual(application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO); // Test that gradient visual is replaced with debug visual Property::Map propertyMap3; - propertyMap3.Insert(Visual::Property::TYPE, Visual::GRADIENT); + propertyMap3.Insert(Visual::Property::TYPE, Visual::GRADIENT); Vector2 start(-1.f, -1.f); Vector2 end(1.f, 1.f); propertyMap3.Insert(GradientVisual::Property::START_POSITION, start); propertyMap3.Insert(GradientVisual::Property::END_POSITION, end); propertyMap3.Insert(GradientVisual::Property::SPREAD_METHOD, GradientVisual::SpreadMethod::REPEAT); Property::Array stopOffsets; - stopOffsets.PushBack( 0.2f ); - stopOffsets.PushBack( 0.8f ); + stopOffsets.PushBack(0.2f); + stopOffsets.PushBack(0.8f); propertyMap3.Insert(GradientVisual::Property::STOP_OFFSET, stopOffsets); Property::Array stopColors; - stopColors.PushBack( Color::RED ); - stopColors.PushBack( Color::GREEN ); + stopColors.PushBack(Color::RED); + stopColors.PushBack(Color::GREEN); propertyMap3.Insert(GradientVisual::Property::STOP_COLOR, stopColors); Visual::Base gradientVisual = factory.CreateVisual(propertyMap3); - DALI_TEST_CHECK( gradientVisual ); - TestDebugVisual( application.GetScene(), gradientVisual, Visual::GRADIENT, Vector2::ZERO ); + DALI_TEST_CHECK(gradientVisual); + TestDebugVisual(application.GetScene(), gradientVisual, Visual::GRADIENT, Vector2::ZERO); // Test that image visual is replaced with debug visual Property::Map propertyMap4; - propertyMap4.Insert( Toolkit::Visual::Property::TYPE, Visual::IMAGE ); - propertyMap4.Insert( ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME ); - propertyMap4.Insert( ImageVisual::Property::DESIRED_WIDTH, 50.f ); - propertyMap4.Insert( ImageVisual::Property::DESIRED_HEIGHT, 100.f ); - Visual::Base imageVisual = factory.CreateVisual( propertyMap4 ); - DALI_TEST_CHECK( imageVisual ); - TestDebugVisual( application.GetScene(), imageVisual, Visual::IMAGE, Vector2( 50.f, 100.f ) ); + propertyMap4.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE); + propertyMap4.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME); + propertyMap4.Insert(ImageVisual::Property::DESIRED_WIDTH, 50.f); + propertyMap4.Insert(ImageVisual::Property::DESIRED_HEIGHT, 100.f); + Visual::Base imageVisual = factory.CreateVisual(propertyMap4); + DALI_TEST_CHECK(imageVisual); + TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(50.f, 100.f)); // Test that SVG visual is replaced with debug visual // TEST_SVG_FILE: @@ -152,62 +156,62 @@ int UtcDaliDebugRenderingGetVisual1(void) // // Property::Map propertyMap5; - propertyMap5.Insert( Toolkit::Visual::Property::TYPE, Visual::SVG ); - propertyMap5.Insert( ImageVisual::Property::URL, TEST_SVG_FILE_NAME ); - Visual::Base svgVisual = factory.CreateVisual( propertyMap5 ); - DALI_TEST_CHECK( svgVisual ); - TestDebugVisual( application.GetScene(), svgVisual, Visual::SVG, Vector2(100.f, 100.f) ); + propertyMap5.Insert(Toolkit::Visual::Property::TYPE, Visual::SVG); + propertyMap5.Insert(ImageVisual::Property::URL, TEST_SVG_FILE_NAME); + Visual::Base svgVisual = factory.CreateVisual(propertyMap5); + DALI_TEST_CHECK(svgVisual); + TestDebugVisual(application.GetScene(), svgVisual, Visual::SVG, Vector2(100.f, 100.f)); // Test that AnimatedImageVisual is replaced with debug visual // TEST_GIF_FILE: anim.gif // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame Property::Map propertyMap6; - propertyMap6.Insert( Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE ); - propertyMap6.Insert( ImageVisual::Property::URL, TEST_GIF_FILE_NAME ); - Visual::Base animatedImageVisual = factory.CreateVisual( propertyMap6 ); - DALI_TEST_CHECK( animatedImageVisual ); - TestDebugVisual( application.GetScene(), animatedImageVisual, Visual::ANIMATED_IMAGE, Vector2(50.f, 50.f) ); + propertyMap6.Insert(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE); + propertyMap6.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME); + Visual::Base animatedImageVisual = factory.CreateVisual(propertyMap6); + DALI_TEST_CHECK(animatedImageVisual); + TestDebugVisual(application.GetScene(), animatedImageVisual, Visual::ANIMATED_IMAGE, Vector2(50.f, 50.f)); // Test that text visual is replaced with debug visual // Load some fonts to get the same metrics on different platforms. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); Property::Map propertyMap7; - propertyMap7.Insert( Toolkit::Visual::Property::TYPE, Visual::TEXT ); - propertyMap7.Insert( TextVisual::Property::ENABLE_MARKUP, true ); - propertyMap7.Insert( TextVisual::Property::TEXT, "Hello world" ); - propertyMap7.Insert( TextVisual::Property::MULTI_LINE, true ); + propertyMap7.Insert(Toolkit::Visual::Property::TYPE, Visual::TEXT); + propertyMap7.Insert(TextVisual::Property::ENABLE_MARKUP, true); + propertyMap7.Insert(TextVisual::Property::TEXT, "Hello world"); + propertyMap7.Insert(TextVisual::Property::MULTI_LINE, true); - Visual::Base textVisual = factory.CreateVisual( propertyMap7 ); - DALI_TEST_CHECK( textVisual ); + Visual::Base textVisual = factory.CreateVisual(propertyMap7); + DALI_TEST_CHECK(textVisual); { - auto&& impl = GetImplementation( textVisual ); - DALI_TEST_CHECK( &typeid( Toolkit::Internal::WireframeVisual ) == &typeid( impl ) ); + auto&& impl = GetImplementation(textVisual); + DALI_TEST_CHECK(&typeid(Toolkit::Internal::WireframeVisual) == &typeid(impl)); } Vector2 naturalSize; - textVisual.GetNaturalSize( naturalSize ); - DALI_TEST_EQUALS( naturalSize, Vector2( 82.f, 20.f ), Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + textVisual.GetNaturalSize(naturalSize); + DALI_TEST_EQUALS(naturalSize, Vector2(82.f, 20.f), Math::MACHINE_EPSILON_1000, TEST_LOCATION); - const float height = textVisual.GetHeightForWidth( 40.f ); - DALI_TEST_EQUALS( height, 60.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + const float height = textVisual.GetHeightForWidth(40.f); + DALI_TEST_EQUALS(height, 60.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION); // Test that NPatchVisual is replaced with debug visual // TEST_NPATCH_FILE_NAME: image_01.9.jpg Property::Map propertyMap8; - propertyMap8.Insert( Toolkit::Visual::Property::TYPE, Visual::N_PATCH ); - propertyMap8.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME ); - Visual::Base nPatchVisual = factory.CreateVisual( propertyMap8 ); - DALI_TEST_CHECK( nPatchVisual ); - TestDebugVisual( application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO ); + propertyMap8.Insert(Toolkit::Visual::Property::TYPE, Visual::N_PATCH); + propertyMap8.Insert(ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME); + Visual::Base nPatchVisual = factory.CreateVisual(propertyMap8); + DALI_TEST_CHECK(nPatchVisual); + TestDebugVisual(application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO); EnvironmentVariable::SetTestingEnvironmentVariable(false); END_TEST; @@ -217,78 +221,77 @@ int UtcDaliDebugRenderingGetVisual2(void) { EnvironmentVariable::SetTestingEnvironmentVariable(true); ToolkitTestApplication application; - tet_infoline( "UtcDaliDebugRenderingGetVisual2: Request visual with various parameters" ); + tet_infoline("UtcDaliDebugRenderingGetVisual2: Request visual with various parameters"); VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); // Test that color visual is replaced with debug visual Dali::Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Visual::COLOR; - map[ ColorVisual::Property::MIX_COLOR ] = Color::CYAN; + map[Toolkit::Visual::Property::TYPE] = Visual::COLOR; + map[ColorVisual::Property::MIX_COLOR] = Color::CYAN; - Visual::Base colorVisual = factory.CreateVisual( map); - DALI_TEST_CHECK( colorVisual ); - TestDebugVisual( application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO ); + Visual::Base colorVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(colorVisual); + TestDebugVisual(application.GetScene(), colorVisual, Visual::COLOR, Vector2::ZERO); // Test that border visual is replaced with debug visual map.Clear(); - map[ Toolkit::Visual::Property::TYPE ] = Visual::BORDER; - map[ BorderVisual::Property::COLOR ] = Color::GREEN; - map[ BorderVisual::Property::SIZE ] = 2.f; - Visual::Base borderVisual = factory.CreateVisual( map ); - DALI_TEST_CHECK( borderVisual ); - TestDebugVisual( application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO ); + map[Toolkit::Visual::Property::TYPE] = Visual::BORDER; + map[BorderVisual::Property::COLOR] = Color::GREEN; + map[BorderVisual::Property::SIZE] = 2.f; + Visual::Base borderVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(borderVisual); + TestDebugVisual(application.GetScene(), borderVisual, Visual::BORDER, Vector2::ZERO); // Test that image visual is replaced with debug visual map.Clear(); - map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE; - map[ ImageVisual::Property::URL ] = TEST_IMAGE_FILE_NAME; - Visual::Base imageVisual = factory.CreateVisual( map ); - DALI_TEST_CHECK( imageVisual ); - TestDebugVisual( application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */ )); + map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE; + map[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + Visual::Base imageVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(imageVisual); + TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */)); // Test that n patch visual is replaced with debug visual - Visual::Base nPatchVisual = factory.CreateVisual( TEST_NPATCH_FILE_NAME, ImageDimensions() ); - DALI_TEST_CHECK( nPatchVisual ); - TestDebugVisual( application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO ); + Visual::Base nPatchVisual = factory.CreateVisual(TEST_NPATCH_FILE_NAME, ImageDimensions()); + DALI_TEST_CHECK(nPatchVisual); + TestDebugVisual(application.GetScene(), nPatchVisual, Visual::N_PATCH, Vector2::ZERO); EnvironmentVariable::SetTestingEnvironmentVariable(false); END_TEST; } - int UtcDaliDebugRenderingGetVisual3(void) { - EnvironmentVariable::SetTestingEnvironmentVariable( true ); + EnvironmentVariable::SetTestingEnvironmentVariable(true); ToolkitTestApplication application; - tet_infoline( "UtcDaliDebugRenderingGetVisual3: Request visual with various parameters" ); + tet_infoline("UtcDaliDebugRenderingGetVisual3: Request visual with various parameters"); VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); // Test that image visual is replaced with debug visual Dali::Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE; - map[ ImageVisual::Property::URL ] = TEST_IMAGE_FILE_NAME; - Visual::Base imageVisual = factory.CreateVisual( map ); - DALI_TEST_CHECK( imageVisual ); - TestDebugVisual( application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */ )); + map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE; + map[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + Visual::Base imageVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(imageVisual); + TestDebugVisual(application.GetScene(), imageVisual, Visual::IMAGE, Vector2(64.0f, 64.0f /* Broken Image Size */)); // Test that image visual with null string don't make visual map.Clear(); - map[ Toolkit::Visual::Property::TYPE ] = Visual::IMAGE; - map[ ImageVisual::Property::URL ] = ""; - Visual::Base emptyVisual = factory.CreateVisual( map ); - DALI_TEST_CHECK( emptyVisual ); - TestDebugVisual( application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO); + map[Toolkit::Visual::Property::TYPE] = Visual::IMAGE; + map[ImageVisual::Property::URL] = ""; + Visual::Base emptyVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(emptyVisual); + TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO); - tet_infoline( "Check that GetVisualObject returns the actual WireframeVisual" ); - Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( emptyVisual ).GetVisualObject(); - DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::WireframeVisual* >( &visualImpl ) ); + tet_infoline("Check that GetVisualObject returns the actual WireframeVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); - tet_infoline( "Compare the returned emptyVisual with the visual implementation, should be the same" ); - DALI_TEST_CHECK( emptyVisual.GetObjectPtr() == &visualImpl ); + tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same"); + DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl); // Test that image view with empty property map don't make visual even DebugRendering is enabled. map.Clear(); @@ -298,13 +301,13 @@ int UtcDaliDebugRenderingGetVisual3(void) // Test that image view with empty property value don't make visual even DebugRendering is enabled. Property::Value emptyValue; - ImageView imageView2 = ImageView::New(); + ImageView imageView2 = ImageView::New(); imageView2.SetProperty(Control::Property::BACKGROUND, emptyValue); imageView2.SetProperty(ImageView::Property::IMAGE, emptyValue); // Test that image view with invalid property value don't make visual even DebugRendering is enabled. Property::Value invalidValue(static_cast(3)); - ImageView imageView3 = ImageView::New(); + ImageView imageView3 = ImageView::New(); imageView3.SetProperty(Control::Property::BACKGROUND, invalidValue); imageView3.SetProperty(ImageView::Property::IMAGE, invalidValue); @@ -315,40 +318,89 @@ int UtcDaliDebugRenderingGetVisual3(void) application.SendNotification(); application.Render(); - DALI_TEST_EQUALS( imageView1.GetRendererCount(), 0u, TEST_LOCATION ); - DALI_TEST_EQUALS( imageView2.GetRendererCount(), 0u, TEST_LOCATION ); - DALI_TEST_EQUALS( imageView3.GetRendererCount(), 0u, TEST_LOCATION ); + DALI_TEST_EQUALS(imageView1.GetRendererCount(), 0u, TEST_LOCATION); + DALI_TEST_EQUALS(imageView2.GetRendererCount(), 0u, TEST_LOCATION); + DALI_TEST_EQUALS(imageView3.GetRendererCount(), 0u, TEST_LOCATION); EnvironmentVariable::SetTestingEnvironmentVariable(false); END_TEST; } +int UtcDaliDebugRenderingGetVisual4(void) +{ + EnvironmentVariable::SetTestingEnvironmentVariable(true); + ToolkitTestApplication application; + tet_infoline("UtcDaliDebugRenderingGetVisual4: Request visual with empty URL and empty Array"); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK(factory); + + // Test that image visual with null string don't make visual + for(auto type : {DevelVisual::IMAGE, DevelVisual::ANIMATED_IMAGE, DevelVisual::SVG, DevelVisual::N_PATCH, DevelVisual::ANIMATED_VECTOR_IMAGE}) + { + Dali::Property::Map map; + map[Toolkit::Visual::Property::TYPE] = type; + map[ImageVisual::Property::URL] = ""; + Visual::Base emptyVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(emptyVisual); + TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO); + + tet_infoline("Check that GetVisualObject returns the actual WireframeVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); + + tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same"); + DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl); + } + + // Test that image visual with empty array don't make visual + for(auto type : {Visual::IMAGE, Visual::ANIMATED_IMAGE}) + { + Dali::Property::Map map; + Dali::Property::Array emptyArray; + map[Toolkit::Visual::Property::TYPE] = type; + map[ImageVisual::Property::URL] = emptyArray; + Visual::Base emptyVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(emptyVisual); + TestDebugVisual(application.GetScene(), emptyVisual, Visual::WIREFRAME, Vector2::ZERO); + + tet_infoline("Check that GetVisualObject returns the actual WireframeVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(emptyVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); + + tet_infoline("Compare the returned emptyVisual with the visual implementation, should be the same"); + DALI_TEST_CHECK(emptyVisual.GetObjectPtr() == &visualImpl); + } + + EnvironmentVariable::SetTestingEnvironmentVariable(false); + END_TEST; +} int UtcDaliDebugRenderingGetVisualObject01(void) { - EnvironmentVariable::SetTestingEnvironmentVariable( true ); + EnvironmentVariable::SetTestingEnvironmentVariable(true); ToolkitTestApplication application; VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); - tet_infoline( "Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual" ); + tet_infoline("Create a TextVisual when debugging is enabled, thus creating a proxy Wireframe Visual"); Dali::Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT; - map[ TextVisual::Property::TEXT ] = "Hello"; + map[Toolkit::Visual::Property::TYPE] = Visual::TEXT; + map[TextVisual::Property::TEXT] = "Hello"; - Visual::Base textVisual = factory.CreateVisual( map); - DALI_TEST_CHECK( textVisual ); + Visual::Base textVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(textVisual); - tet_infoline( "Check that GetVisualObject returns the actual TextVisual" ); - Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); - DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) ); + tet_infoline("Check that GetVisualObject returns the actual TextVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); - tet_infoline( "Compare the returned TextVisual with the visual implementation, should differ" ); - DALI_TEST_CHECK( textVisual.GetObjectPtr() != &visualImpl ); + tet_infoline("Compare the returned TextVisual with the visual implementation, should differ"); + DALI_TEST_CHECK(textVisual.GetObjectPtr() != &visualImpl); - EnvironmentVariable::SetTestingEnvironmentVariable( false ); + EnvironmentVariable::SetTestingEnvironmentVariable(false); END_TEST; } @@ -357,23 +409,23 @@ int UtcDaliDebugRenderingGetVisualObject02(void) ToolkitTestApplication application; VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); - tet_infoline( "Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual" ); + tet_infoline("Create a TextVisual without debugging enabled, thus no proxy Wireframe Visual"); Dali::Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Visual::TEXT; - map[ TextVisual::Property::TEXT ] = "Hello"; + map[Toolkit::Visual::Property::TYPE] = Visual::TEXT; + map[TextVisual::Property::TEXT] = "Hello"; - Visual::Base textVisual = factory.CreateVisual( map); - DALI_TEST_CHECK( textVisual ); + Visual::Base textVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(textVisual); - tet_infoline( "Check that GetVisualObject returns the actual TextVisual" ); - Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); - DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::TextVisual* >( &visualImpl ) ); + tet_infoline("Check that GetVisualObject returns the actual TextVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); - tet_infoline( "Compare the returned TextVisual with the visual implementation, should be the same" ); - DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl ); + tet_infoline("Compare the returned TextVisual with the visual implementation, should be the same"); + DALI_TEST_CHECK(textVisual.GetObjectPtr() == &visualImpl); END_TEST; } @@ -383,40 +435,41 @@ int UtcDaliDebugRenderingGetVisualObject03(void) ToolkitTestApplication application; VisualFactory factory = VisualFactory::Get(); - DALI_TEST_CHECK( factory ); + DALI_TEST_CHECK(factory); - tet_infoline( "Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either" ); + tet_infoline("Create a WireframeVisual without debugging enabled, thus no proxy Wireframe Visual either"); Dali::Property::Map map; - map[ Toolkit::Visual::Property::TYPE ] = Visual::WIREFRAME; + map[Toolkit::Visual::Property::TYPE] = Visual::WIREFRAME; - Visual::Base textVisual = factory.CreateVisual( map); - DALI_TEST_CHECK( textVisual ); + Visual::Base textVisual = factory.CreateVisual(map); + DALI_TEST_CHECK(textVisual); - tet_infoline( "Check that GetVisualObject returns the WireframeVisual" ); - Toolkit::Internal::Visual::Base& visualImpl = GetImplementation( textVisual ).GetVisualObject(); - DALI_TEST_CHECK( dynamic_cast< Toolkit::Internal::WireframeVisual* >( &visualImpl ) ); + tet_infoline("Check that GetVisualObject returns the WireframeVisual"); + Toolkit::Internal::Visual::Base& visualImpl = GetImplementation(textVisual).GetVisualObject(); + DALI_TEST_CHECK(dynamic_cast(&visualImpl)); - tet_infoline( "Compare the returned Visual with the visual implementation, should be the same" ); - DALI_TEST_CHECK( textVisual.GetObjectPtr() == &visualImpl ); + tet_infoline("Compare the returned Visual with the visual implementation, should be the same"); + DALI_TEST_CHECK(textVisual.GetObjectPtr() == &visualImpl); END_TEST; } int UtcDaliDebugRenderingRenderText(void) { - EnvironmentVariable::SetTestingEnvironmentVariable( true ); + EnvironmentVariable::SetTestingEnvironmentVariable(true); ToolkitTestApplication application; - tet_infoline( "Ensure we can render text when in debug mode" ); + tet_infoline("Ensure we can render text when in debug mode"); try { - Toolkit::TextLabel label = TextLabel::New( "Hello" ); - application.GetScene().Add( label ); - DALI_TEST_CHECK( true ); - } catch( ... ) + Toolkit::TextLabel label = TextLabel::New("Hello"); + application.GetScene().Add(label); + DALI_TEST_CHECK(true); + } + catch(...) { - DALI_TEST_CHECK( false ); + DALI_TEST_CHECK(false); } END_TEST; diff --git a/dali-toolkit/internal/visuals/visual-factory-impl.cpp b/dali-toolkit/internal/visuals/visual-factory-impl.cpp index 4220b00..ce19a6b 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -178,7 +178,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM else { Property::Array* array = imageURLValue->GetArray(); - if(array) + if(array && array->Count() > 0) { visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), *array, propertyMap); } @@ -217,7 +217,10 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM std::string imageUrl; if(imageURLValue && imageURLValue->Get(imageUrl)) { - visualPtr = NPatchVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + if(!imageUrl.empty()) + { + visualPtr = NPatchVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + } } break; } @@ -228,7 +231,10 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM std::string imageUrl; if(imageURLValue && imageURLValue->Get(imageUrl)) { - visualPtr = SvgVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + if(!imageUrl.empty()) + { + visualPtr = SvgVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + } } break; } @@ -241,12 +247,15 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM { if(imageURLValue->Get(imageUrl)) { - visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + if(!imageUrl.empty()) + { + visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + } } else { Property::Array* array = imageURLValue->GetArray(); - if(array) + if(array && array->Count() > 0) { visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), *array, propertyMap); } @@ -267,7 +276,10 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM std::string imageUrl; if(imageURLValue && imageURLValue->Get(imageUrl)) { - visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + if(!imageUrl.empty()) + { + visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); + } } break; } @@ -370,14 +382,14 @@ Internal::TextureManager& VisualFactory::GetTextureManager() void VisualFactory::SetBrokenImageUrl(Toolkit::StyleManager& styleManager) { - const std::string imageDirPath = AssetManager::GetDaliImagePath(); - std::string brokenImageUrl = imageDirPath + BROKEN_IMAGE_FILE_NAME; + const std::string imageDirPath = AssetManager::GetDaliImagePath(); + std::string brokenImageUrl = imageDirPath + BROKEN_IMAGE_FILE_NAME; std::vector customBrokenImageUrlList; if(styleManager) { customBrokenImageUrlList = Toolkit::DevelStyleManager::GetBrokenImageUrlList(styleManager); - Property::Map config = Toolkit::DevelStyleManager::GetConfigurations(styleManager); + Property::Map config = Toolkit::DevelStyleManager::GetConfigurations(styleManager); config["brokenImageUrl"].Get(brokenImageUrl); } @@ -389,7 +401,7 @@ Internal::VisualFactoryCache& VisualFactory::GetFactoryCache() { if(!mFactoryCache) { - mFactoryCache = std::unique_ptr(new VisualFactoryCache(mPreMultiplyOnLoad)); + mFactoryCache = std::unique_ptr(new VisualFactoryCache(mPreMultiplyOnLoad)); Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get(); if(styleManager) { -- 2.7.4