From ef1f2122e3825ec5fa1d2d3b568caec69ecd3d0c Mon Sep 17 00:00:00 2001 From: Taehyub Kim Date: Fri, 2 Apr 2021 21:36:42 +0900 Subject: [PATCH] visual: Implements rive animation Change-Id: I6c6db8ff53493ad164142805d2655cb34b9ce10e --- automated-tests/resources/juice.riv | Bin 0 -> 9106 bytes .../toolkit-vector-animation-renderer.cpp | 2 +- .../utc-Dali-AnimatedVectorImageVisual.cpp | 199 +++++++++++++++++++++ .../internal/visuals/visual-factory-impl.cpp | 2 + dali-toolkit/internal/visuals/visual-url.cpp | 10 ++ dali-toolkit/internal/visuals/visual-url.h | 3 +- 6 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 automated-tests/resources/juice.riv diff --git a/automated-tests/resources/juice.riv b/automated-tests/resources/juice.riv new file mode 100644 index 0000000000000000000000000000000000000000..80003ec72f52576baf0c040ca6065554daf3c41a GIT binary patch literal 9106 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 R$~~IR@ccxz8J-`i@^8olquu}j literal 0 HcmV?d00001 diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp index 33a27b5..474706f 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-vector-animation-renderer.cpp @@ -71,7 +71,7 @@ public: bool Load(const std::string& url) { mUrl = url; - if(mUrl == "invalid.json") + if(mUrl == "invalid.json" || mUrl == "invalid.riv") { return false; } diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index edd3a86..9565d09 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -53,6 +53,9 @@ const char* TEST_VECTOR_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/insta_camera.jso const char* TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP = "framedrop.json"; const char* TEST_VECTOR_IMAGE_INVALID_FILE_NAME = "invalid.json"; +const char* TEST_VECTOR_IMAGE_RIVE_FILE_NAME = TEST_RESOURCE_DIR "/juice.riv"; +const char* TEST_VECTOR_IMAGE_INVALID_RIVE_FILE_NAME = "invalid.riv"; + bool gAnimationFinishedSignalFired = false; void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId ) @@ -1576,3 +1579,199 @@ int UtcDaliAnimatedVectorImageVisualFrameDrops(void) END_TEST; } + +int UtcDaliAnimatedVectorImageVisualLoadRiveFileP(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedVectorImageVisualLoadRiveFile: Request animated vector image visual with a rive url" ); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_RIVE_FILE_NAME, ImageDimensions() ); + DALI_TEST_CHECK( visual ); + + DummyControl actor = DummyControl::New( true ); + DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) ); + application.GetScene().Add( actor ); + + application.SendNotification(); + application.Render(); + + // renderer is added to actor + DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); + Renderer renderer = actor.GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + + // Test SetOffScene(). + actor.Unparent(); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualLoadRiveFileN(void) +{ + ToolkitTestApplication application; + tet_infoline("Request loading with invalid rive file - should draw broken image"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_RIVE_FILE_NAME); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Check resource status + Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL); + 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); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualPlaybackRiveFile(void) +{ + ToolkitTestApplication application; + + tet_infoline( "UtcDaliAnimatedVectorImageVisualPlaybackRiveFile" ); + + { + // request AnimatedVectorImageVisual for Rive with a property map + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual( + Property::Map() + .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) + .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_RIVE_FILE_NAME ) ); + + DummyControl dummyControl = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + + Property::Map attributes; + tet_infoline( "Test Play action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + application.GetScene().Add( dummyControl ); + application.SendNotification(); + application.Render( 16 ); + + Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING ); + + tet_infoline( "Test Pause action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED ); + + tet_infoline( "Test Play action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING ); + + tet_infoline( "Test Stop action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED ); + + tet_infoline( "Test Stop action again" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED ); + + tet_infoline( "Test Play action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING ); + + tet_infoline( "Off stage" ); + dummyControl.Unparent(); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED ); + + tet_infoline( "On stage again" ); + application.GetScene().Add( dummyControl ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED ); + + tet_infoline( "Test Play action" ); + DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes ); + + application.SendNotification(); + application.Render(16); + + map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_STATE ); + DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING ); + + // Change Size + Vector3 newSize( 100.0f, 100.0f, 0.0f ); + dummyControl.SetProperty( Actor::Property::SIZE, newSize ); + + application.SendNotification(); + application.Render(16); + + // Size should be changed + Vector3 naturalSize = dummyControl.GetNaturalSize(); + DALI_TEST_CHECK( naturalSize == newSize ); + + dummyControl.Unparent(); + } + + END_TEST; +} \ No newline at end of file diff --git a/dali-toolkit/internal/visuals/visual-factory-impl.cpp b/dali-toolkit/internal/visuals/visual-factory-impl.cpp index 8c4b2f8..6bbc2df 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-impl.cpp @@ -166,6 +166,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM break; } case VisualUrl::JSON: + case VisualUrl::RIVE: { visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap); break; @@ -330,6 +331,7 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageD break; } case VisualUrl::JSON: + case VisualUrl::RIVE: { visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl); break; diff --git a/dali-toolkit/internal/visuals/visual-url.cpp b/dali-toolkit/internal/visuals/visual-url.cpp index e498313..97bc9b9 100644 --- a/dali-toolkit/internal/visuals/visual-url.cpp +++ b/dali-toolkit/internal/visuals/visual-url.cpp @@ -103,10 +103,12 @@ VisualUrl::Type ResolveType(const std::string& url) char GIF[4] = {'f', 'i', 'g', '.'}; char WEBP[5] = {'p', 'b', 'e', 'w', '.'}; char JSON[5] = {'n', 'o', 's', 'j', '.'}; + char RIVE[4] = {'v', 'i', 'r', '.'}; unsigned int svgScore = 0; unsigned int gifScore = 0; unsigned int webpScore = 0; unsigned int jsonScore = 0; + unsigned int riveScore = 0; int index = count; while(--index >= 0) { @@ -144,6 +146,14 @@ VisualUrl::Type ResolveType(const std::string& url) return VisualUrl::JSON; } } + if((offsetFromEnd < sizeof(RIVE)) && (currentChar == RIVE[offsetFromEnd])) + { + // early out if RIVE as can't be used in N patch for now + if(++riveScore == sizeof(RIVE)) + { + return VisualUrl::RIVE; + } + } switch(state) { case SUFFIX: diff --git a/dali-toolkit/internal/visuals/visual-url.h b/dali-toolkit/internal/visuals/visual-url.h index 8857184..827dfce 100644 --- a/dali-toolkit/internal/visuals/visual-url.h +++ b/dali-toolkit/internal/visuals/visual-url.h @@ -38,7 +38,8 @@ public: SVG, GIF, WEBP, - JSON + JSON, + RIVE }; enum ProtocolType -- 2.7.4