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-ImageView.cpp;h=97a4b1d0afb004875ffeb5603cf6de4c25f9e4a1;hp=d1beb09bf0fdbe98f80c701bccbff152b137474a;hb=5e351965bad7e1de2e94027548b022bac692603c;hpb=d375dceca213569317d81d17cd2d2a4b45122cda diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index d1beb09..97a4b1d 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -18,17 +18,21 @@ // Need to override adaptor classes for toolkit test harness, so include // test harness headers before dali headers. #include -#include #include #include #include -#include #include -#include +#include +#include +#include #include #include +#include + + +#include "dummy-control.h" using namespace Dali; using namespace Toolkit; @@ -77,6 +81,9 @@ const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER( const char* TEST_IMAGE_FILE_NAME = "gallery_image_01.jpg"; const char* TEST_IMAGE_FILE_NAME2 = "gallery_image_02.jpg"; +const char* TEST_IMAGE_1 = TEST_RESOURCE_DIR "/TB-gloss.png"; +const char* TEST_IMAGE_2 = TEST_RESOURCE_DIR "/tb-norm.png"; + // resolution: 34*34, pixel format: RGBA8888 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png"; // resolution: 600*600, pixel format: RGB888 @@ -427,20 +434,28 @@ int UtcDaliImageViewPixelArea(void) int UtcDaliImageViewAsyncLoadingWithoutAltasing(void) { ToolkitTestApplication application; + TestGlAbstraction& gl = application.GetGlAbstraction(); + const std::vector& textures = gl.GetBoundTextures(); + size_t numTextures = textures.size(); // Async loading, no atlasing for big size image ImageView imageView = ImageView::New( gImage_600_RGB ); // By default, Aysnc loading is used Stage::GetCurrent().Add( imageView ); + imageView.SetSize(100, 100); + imageView.SetParentOrigin( ParentOrigin::CENTER ); + + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + application.SendNotification(); application.Render(16); - application.Render(16); application.SendNotification(); - // BitmapLoader is not used - BitmapLoader loader = BitmapLoader::GetLatestCreated(); - DALI_TEST_CHECK( !loader ); + const std::vector& textures2 = gl.GetBoundTextures(); + DALI_TEST_GREATER( textures2.size(), numTextures, TEST_LOCATION ); + + END_TEST; } @@ -459,10 +474,11 @@ int UtcDaliImageViewAsyncLoadingWithAtlasing(void) imageMap[ ImageVisual::Property::URL ] = gImage_34_RGBA; imageMap[ ImageVisual::Property::DESIRED_HEIGHT ] = 34; imageMap[ ImageVisual::Property::DESIRED_WIDTH ] = 34; - imageMap[ DevelImageVisual::Property::ATLASING] = true; + imageMap[ ImageVisual::Property::ATLASING] = true; ImageView imageView = ImageView::New(); imageView.SetProperty( ImageView::Property::IMAGE, imageMap ); + imageView.SetProperty( Toolkit::Control::Property::PADDING, Extents( 10u, 10u, 10u, 10u ) ); // By default, Aysnc loading is used // loading is not started if the actor is offStage @@ -473,6 +489,12 @@ int UtcDaliImageViewAsyncLoadingWithAtlasing(void) application.Render(16); application.SendNotification(); + imageView.SetProperty( Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT ); + application.SendNotification(); + application.Render(16); + application.Render(16); + application.SendNotification(); + // loading started, this waits for the loader thread for max 30 seconds DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); @@ -538,7 +560,7 @@ int UtcDaliImageViewSyncLoading(void) Property::Map syncLoadingMap; syncLoadingMap[ ImageVisual::Property::SYNCHRONOUS_LOADING ] = true; - syncLoadingMap[ DevelImageVisual::Property::ATLASING ] = true; + syncLoadingMap[ ImageVisual::Property::ATLASING ] = true; // Sync loading, no atlasing for big size image { @@ -547,35 +569,22 @@ int UtcDaliImageViewSyncLoading(void) // Sync loading is used syncLoadingMap[ ImageVisual::Property::URL ] = gImage_600_RGB; imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap ); - - - // BitmapLoader is used, and the loading is started immediately even the actor is not on stage. - BitmapLoader loader = BitmapLoader::GetLatestCreated(); - DALI_TEST_CHECK( loader ); } // Sync loading, automatic atlasing for small size image { - BitmapLoader::ResetLatestCreated(); TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace(); callStack.Reset(); callStack.Enable(true); ImageView imageView = ImageView::New( ); + // Sync loading is used syncLoadingMap[ ImageVisual::Property::URL ] = gImage_34_RGBA; syncLoadingMap[ ImageVisual::Property::DESIRED_HEIGHT ] = 34; syncLoadingMap[ ImageVisual::Property::DESIRED_WIDTH ] = 34; imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap ); - // loading is started even if the actor is offStage - BitmapLoader loader = BitmapLoader::GetLatestCreated(); - DALI_TEST_CHECK( loader ); - - loader.WaitForLoading(); - - DALI_TEST_CHECK( loader.IsLoaded() ); - Stage::GetCurrent().Add( imageView ); application.SendNotification(); application.Render(16); @@ -589,7 +598,6 @@ int UtcDaliImageViewSyncLoading(void) END_TEST; } - int UtcDaliImageViewSyncLoading02(void) { ToolkitTestApplication application; @@ -598,7 +606,6 @@ int UtcDaliImageViewSyncLoading02(void) // Sync loading, automatic atlasing for small size image { - BitmapLoader::ResetLatestCreated(); TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace(); callStack.Reset(); callStack.Enable(true); @@ -614,14 +621,6 @@ int UtcDaliImageViewSyncLoading02(void) syncLoadingMap[ "atlasing" ] = true; imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap ); - // loading is started even if the actor is offStage - BitmapLoader loader = BitmapLoader::GetLatestCreated(); - DALI_TEST_CHECK( loader ); - - loader.WaitForLoading(); - - DALI_TEST_CHECK( loader.IsLoaded() ); - Stage::GetCurrent().Add( imageView ); application.SendNotification(); application.Render(16); @@ -635,6 +634,30 @@ int UtcDaliImageViewSyncLoading02(void) END_TEST; } +int UtcDaliImageViewAddedTexture(void) +{ + ToolkitTestApplication application; + + tet_infoline("ImageView Testing image view with texture provided manager url"); + + ImageView imageView = ImageView::New(); + + // empty texture is ok, though pointless from app point of view + TextureSet empty; + std::string url = TextureManager::AddTexture(empty); + DALI_TEST_CHECK(url.size() > 0u); + + Property::Map propertyMap; + propertyMap[ImageVisual::Property::URL] = url; + imageView.SetProperty(ImageView::Property::IMAGE, propertyMap); + + Stage::GetCurrent().Add( imageView ); + application.SendNotification(); + application.Render(); + + END_TEST; +} + int UtcDaliImageViewSizeWithBackground(void) { ToolkitTestApplication application; @@ -842,6 +865,7 @@ int UtcDaliImageViewSetImageOffstageP(void) } bool gResourceReadySignalFired = false; +Vector3 gNaturalSize; void ResourceReadySignal( Control control ) { @@ -864,9 +888,9 @@ int UtcDaliImageViewCheckResourceReady(void) imageView.SetBackgroundImage( image ); - DALI_TEST_EQUALS( Toolkit::DevelControl::IsResourceReady( imageView ), false, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.IsResourceReady(), false, TEST_LOCATION ); - Toolkit::DevelControl::ResourceReadySignal( imageView ).Connect( &ResourceReadySignal); + imageView.ResourceReadySignal().Connect( &ResourceReadySignal); Stage::GetCurrent().Add( imageView ); @@ -874,7 +898,7 @@ int UtcDaliImageViewCheckResourceReady(void) application.Render(16); - DALI_TEST_EQUALS( Toolkit::DevelControl::IsResourceReady( imageView ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( imageView.IsResourceReady(), true, TEST_LOCATION ); DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); @@ -940,43 +964,119 @@ int UtcDaliImageViewSetImageTypeChangesP(void) ToolkitTestApplication application; ImageView imageView = ImageView::New(); + Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation( imageView ); + Stage::GetCurrent().Add( imageView ); std::string url; Property::Map map; + Toolkit::Visual::Base visual; Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); + + application.SendNotification(); + application.Render( 16 ); + DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + DALI_TEST_CHECK( ! visual ); // Visual should be invalid // Set a URL imageView.SetImage( "TEST_URL" ); + + application.SendNotification(); + application.Render( 16 ); + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( value.Get( url ) ); // Value should NOT be empty DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + DALI_TEST_CHECK( visual ); // Visual should be valid // Set an empty Image imageView.SetImage( Image() ); + + application.SendNotification(); + application.Render( 16 ); + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + DALI_TEST_CHECK( ! visual ); // Visual should be invalid // Set an Image ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME ); imageView.SetImage( image1 ); + + application.SendNotification(); + application.Render( 16 ); + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty DALI_TEST_CHECK( value.Get( map ) ); // Value should NOT be empty + DALI_TEST_CHECK( visual ); // Visual should be valid // Set an empty URL imageView.SetImage( "" ); + + application.SendNotification(); + application.Render( 16 ); + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty + DALI_TEST_CHECK( ! visual ); // Visual should be invalid + + // Set a URL in property map + Property::Map propertyMap; + propertyMap[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME; + imageView.SetProperty( ImageView::Property::IMAGE, propertyMap ); + + application.SendNotification(); + application.Render( 16 ); + + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); + + DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty + DALI_TEST_CHECK( value.Get( map ) ); // Value should NOT be empty + DALI_TEST_CHECK( visual ); // Visual should be valid + + // Set a URL in property map again + propertyMap[ImageVisual::Property::URL] = gImage_34_RGBA; + imageView.SetProperty( ImageView::Property::IMAGE, propertyMap ); + + application.SendNotification(); + application.Render( 16 ); + + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); + + DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty + DALI_TEST_CHECK( value.Get( map ) ); // Value should NOT be empty + DALI_TEST_CHECK( visual ); // Visual should be valid + + // Set an empty URL in property map + propertyMap[ImageVisual::Property::URL] = std::string(); + imageView.SetProperty( ImageView::Property::IMAGE, propertyMap ); + + application.SendNotification(); + application.Render( 16 ); + + value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) ); + visual = DevelControl::GetVisual( controlImpl, ImageView::Property::IMAGE ); + + DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty + DALI_TEST_CHECK( value.Get( map ) ); // Value should NOT be empty + DALI_TEST_CHECK( ! visual ); // Visual should be invalid END_TEST; } @@ -1316,3 +1416,206 @@ int UtcDaliImageViewGetImageN(void) END_TEST; } + + +int UtcDaliImageViewReplaceImage(void) +{ + ToolkitTestApplication application; + + gResourceReadySignalFired = false; + + int width = 100; + int height = 200; + Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) ); + + // Check ImageView with background and main image, to ensure both visuals are marked as loaded + ImageView imageView = ImageView::New( TEST_IMAGE_1 ); + + DALI_TEST_EQUALS( imageView.IsResourceReady(), false, TEST_LOCATION ); + + imageView.ResourceReadySignal().Connect( &ResourceReadySignal); + + Stage::GetCurrent().Add( imageView ); + + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + DALI_TEST_EQUALS( imageView.GetRendererCount(), 1u, TEST_LOCATION ); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + gResourceReadySignalFired = false; + + imageView.SetImage(TEST_IMAGE_2); + + application.SendNotification(); + application.Render(16); + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + DALI_TEST_EQUALS( imageView.GetRendererCount(), 1u, TEST_LOCATION ); + + DALI_TEST_EQUALS( imageView.IsResourceReady(), true, TEST_LOCATION ); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + END_TEST; +} + +void OnRelayoutOverride( Size size ) +{ + gNaturalSize = size; // Size Relayout is using +} + +int UtcDaliImageViewReplaceImageAndGetNaturalSize(void) +{ + ToolkitTestApplication application; + + // Check ImageView with background and main image, to ensure both visuals are marked as loaded + ImageView imageView = ImageView::New( TEST_IMAGE_1 ); + imageView.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS ); + + DummyControl dummyControl = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); + dummyControl.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS ); + + dummyControl.Add( imageView ); + dummyImpl.SetRelayoutCallback( &OnRelayoutOverride ); + Stage::GetCurrent().Add( dummyControl ); + + application.SendNotification(); + application.Render(); + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + DALI_TEST_EQUALS( gNaturalSize.width, 1024.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( gNaturalSize.height, 1024.0f, TEST_LOCATION ); + + gNaturalSize = Vector3::ZERO; + + imageView.SetImage(gImage_600_RGB); + + // Waiting for resourceReady so SendNotifcation not called here. + + // loading started, this waits for the loader thread for max 30 seconds + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + // Trigger a potential relayout + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( gNaturalSize.width, 600.0f, TEST_LOCATION ); + DALI_TEST_EQUALS( gNaturalSize.height, 600.0f, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageViewResourceReadySignalWithImmediateLoad(void) +{ + tet_infoline("Test Setting Image with IMMEDIATE load and receving ResourceReadySignal before staged."); + + ToolkitTestApplication application; + + gResourceReadySignalFired = false; + + Property::Map imageMap; + + imageMap[ ImageVisual::Property::URL ] = gImage_34_RGBA; + imageMap[ DevelImageVisual::Property::LOAD_POLICY ] = DevelImageVisual::LoadPolicy::IMMEDIATE; + + tet_infoline("Creating ImageView without URL so image does not start loading"); + ImageView imageView = ImageView::New(); + tet_infoline("Connect to image loaded signal before setting image"); + imageView.ResourceReadySignal().Connect( &ResourceReadySignal); + tet_infoline("Setting Image with IMMEDIATE load, signal already connected so will be triggered."); + imageView.SetProperty( ImageView::Property::IMAGE, imageMap ); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageViewResourceReadySignalWithReusedImage(void) +{ + tet_infoline("Test Setting Image that was already loaded by another ImageView and still getting ResourceReadySignal."); + + ToolkitTestApplication application; + + gResourceReadySignalFired = false; + + Property::Map imageMap; + + imageMap[ ImageVisual::Property::URL ] = gImage_34_RGBA; + imageMap[ DevelImageVisual::Property::LOAD_POLICY ] = DevelImageVisual::LoadPolicy::IMMEDIATE; + + ImageView imageView = ImageView::New(); + imageView.ResourceReadySignal().Connect( &ResourceReadySignal); + imageView.SetProperty( ImageView::Property::IMAGE, imageMap ); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(16); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + gResourceReadySignalFired = false; + + ImageView imageViewWithExistingImage = ImageView::New(); + imageViewWithExistingImage.ResourceReadySignal().Connect( &ResourceReadySignal); + imageViewWithExistingImage.SetProperty( ImageView::Property::IMAGE, imageMap ); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliImageViewResourceReadySignalWithReusedImage02(void) +{ + tet_infoline("Test Setting Image that was already loaded by another ImageView and still getting ResourceReadySignal when staged."); + + ToolkitTestApplication application; + + gResourceReadySignalFired = false; + + Property::Map imageImmediateLoadingMap; + imageImmediateLoadingMap[ ImageVisual::Property::URL ] = gImage_34_RGBA; + imageImmediateLoadingMap[ DevelImageVisual::Property::LOAD_POLICY ] = DevelImageVisual::LoadPolicy::IMMEDIATE; + + tet_infoline("Immediate load an image"); + ImageView imageView = ImageView::New(); + imageView.ResourceReadySignal().Connect( &ResourceReadySignal); + imageView.SetProperty( ImageView::Property::IMAGE, imageImmediateLoadingMap ); + + // loading started, this waits for the loader thread + DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); + + application.SendNotification(); + application.Render(16); + + tet_infoline("Check image loaded"); + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + gResourceReadySignalFired = false; + + tet_infoline("Create another ImageView with the same URL"); + ImageView imageViewWithExistingImage = ImageView::New( gImage_34_RGBA ); + tet_infoline("Connect to ResourceReady signal for second ImageView, it should still fire as resource is ready"); + imageViewWithExistingImage.ResourceReadySignal().Connect( &ResourceReadySignal); + + Stage::GetCurrent().Add( imageViewWithExistingImage ); + + DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION ); + + END_TEST; +}