From: Heeyong Song Date: Tue, 11 Jun 2019 05:04:24 +0000 (+0900) Subject: (Vector) Change properties to get frame numbers X-Git-Tag: dali_1.4.26~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=f241f4e0ee21b508d75e622db5f81e505ec1166d;ds=sidebyside (Vector) Change properties to get frame numbers - Get frame numbers instead of normalized progress Change-Id: I6a85b31ca1715e891c4302ddb5988d8052641446 --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index f47a656..2fc3dcd 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -133,11 +133,16 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void) ToolkitTestApplication application; tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" ); + int startFrame = 1, endFrame = 3; + Property::Array playRange; + playRange.PushBack( startFrame ); + playRange.PushBack( endFrame ); + Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) .Add( DevelImageVisual::Property::LOOP_COUNT, 3 ) - .Add( DevelImageVisual::Property::PLAY_RANGE, Vector2( 0.2f, 0.8f ) ); + .Add( DevelImageVisual::Property::PLAY_RANGE, playRange ); Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); @@ -207,7 +212,10 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) ToolkitTestApplication application; tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" ); - Vector2 playRange( 0.2f, 0.8f ); + int startFrame = 1, endFrame = 3; + Property::Array playRange; + playRange.PushBack( startFrame ); + playRange.PushBack( endFrame ); Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) @@ -235,9 +243,14 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) DALI_TEST_CHECK( value ); DALI_TEST_CHECK( value->Get< int >() == 3 ); - value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::VECTOR2 ); + value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY ); DALI_TEST_CHECK( value ); - DALI_TEST_CHECK( value->Get< Vector2 >() == playRange ); + + Property::Array* result = value->GetArray(); + DALI_TEST_CHECK( result ); + + DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame ); + DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame ); // request AnimatedVectorImageVisual with an URL Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() ); @@ -527,12 +540,15 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) ToolkitTestApplication application; tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" ); - Vector2 playRange( 0.8f, 0.2f ); + int startFrame = 3, endFrame = 1; + Property::Array array; + array.PushBack( startFrame ); + array.PushBack( endFrame ); Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) - .Add( DevelImageVisual::Property::PLAY_RANGE, playRange ); + .Add( DevelImageVisual::Property::PLAY_RANGE, array ); Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap ); DALI_TEST_CHECK( visual ); @@ -561,7 +577,36 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE ); - DALI_TEST_EQUALS( value->Get< Vector2 >(), playRange, TEST_LOCATION ); + + int resultStartFrame, resultEndFrame; + Property::Array* result = value->GetArray(); + result->GetElementAt( 0 ).Get( resultStartFrame ); + result->GetElementAt( 1 ).Get( resultEndFrame ); + + DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION ); + DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION ); + + // Set invalid play range + array.Clear(); + array.PushBack( -1 ); + array.PushBack( 100 ); + + attributes.Clear(); + attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array ); + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes ); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); + value = map.Find( DevelImageVisual::Property::PLAY_RANGE ); + + result = value->GetArray(); + result->GetElementAt( 0 ).Get( resultStartFrame ); + result->GetElementAt( 1 ).Get( resultEndFrame ); + + DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION ); // Should not be changed + DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION ); END_TEST; } @@ -608,10 +653,10 @@ int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void) END_TEST; } -int UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress(void) +int UtcDaliAnimatedVectorImageVisualJumpTo(void) { ToolkitTestApplication application; - tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress" ); + tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" ); Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) @@ -634,33 +679,40 @@ int UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress(void) DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION ); - DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 0.6f ); + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 ); application.SendNotification(); application.Render(); Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); - Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_PROGRESS ); - DALI_TEST_EQUALS( value->Get< float >(), 0.6f, TEST_LOCATION ); + Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER ); + DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION ); - Vector2 playRange( 0.0f, 0.4f ); + Property::Array array; + array.PushBack( 0 ); + array.PushBack( 2 ); Property::Map attributes; - attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange ); + attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array ); DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes ); - DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 0.8f ); + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 ); application.SendNotification(); application.Render(); map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); - value = map.Find( DevelImageVisual::Property::CURRENT_PROGRESS ); - DALI_TEST_EQUALS( value->Get< float >(), 0.4f, TEST_LOCATION ); + value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER ); + DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION ); // Change play range attributes.Clear(); - attributes.Add( DevelImageVisual::Property::PLAY_RANGE, Vector2( 0.0f, 1.0f ) ); + array.Clear(); + + array.PushBack( 0 ); + array.PushBack( 4 ); + + attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array ); DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes ); attributes.Clear(); @@ -669,17 +721,17 @@ int UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress(void) application.SendNotification(); application.Render(); - // Stop and jump to 0.2 + // Stop and jump to 3 DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes ); - DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 0.2f ); + DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 ); application.SendNotification(); application.Render(); map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); - value = map.Find( DevelImageVisual::Property::CURRENT_PROGRESS ); - DALI_TEST_EQUALS( value->Get< float >(), 0.2f, TEST_LOCATION ); + value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER ); + DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION ); END_TEST; } @@ -689,7 +741,10 @@ int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) ToolkitTestApplication application; tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpToCurrentProgress" ); - Vector2 playRange( 0.2f, 0.5f ); + int startFrame = 1, endFrame = 3; + Property::Array playRange; + playRange.PushBack( startFrame ); + playRange.PushBack( endFrame ); Property::Map propertyMap; propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE ) @@ -718,13 +773,21 @@ int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT ); DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION ); - value = map.Find( DevelImageVisual::Property::PLAY_RANGE ); - DALI_TEST_EQUALS( value->Get< Vector2 >(), playRange, TEST_LOCATION ); + value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY ); + DALI_TEST_CHECK( value ); - Vector2 newPlayRange( 0.6f, 1.0f ); + Property::Array* result = value->GetArray(); + DALI_TEST_CHECK( result ); + + DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame ); + DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame ); + + playRange.Clear(); + playRange.PushBack( 0 ); + playRange.PushBack( 2 ); Property::Map attributes; - attributes.Add( DevelImageVisual::Property::PLAY_RANGE, newPlayRange ); + attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange ); attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 ); DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes ); @@ -737,9 +800,18 @@ int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION ); value = map.Find( DevelImageVisual::Property::PLAY_RANGE ); - DALI_TEST_EQUALS( value->Get< Vector2 >(), newPlayRange, TEST_LOCATION ); + result = value->GetArray(); + DALI_TEST_CHECK( result ); + + DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 ); + DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 ); attributes.Clear(); + + playRange.Clear(); + playRange.PushBack( startFrame ); + playRange.PushBack( endFrame ); + attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange ); DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes ); @@ -749,7 +821,12 @@ int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL ); value = map.Find( DevelImageVisual::Property::PLAY_RANGE ); - DALI_TEST_EQUALS( value->Get< Vector2 >(), playRange, TEST_LOCATION ); + + result = value->GetArray(); + DALI_TEST_CHECK( result ); + + DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame ); + DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame ); END_TEST; } diff --git a/dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h b/dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h index 92d4e8e..82d463c 100644 --- a/dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h +++ b/dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h @@ -40,7 +40,7 @@ enum Type PLAY, ///< Play the animated vector image. PAUSE, ///< Pause the animated vector image. STOP, ///< Stop the animated vector image. This is also Default playback mode. - JUMP_TO, ///< Jump to the specified frame. Property::FLOAT value should be passed. + JUMP_TO, ///< Jump to the specified frame. Property::INTEGER value should be passed. UPDATE_PROPERTY ///< Update the properties of the animated vector image. }; diff --git a/dali-toolkit/devel-api/visuals/image-visual-properties-devel.h b/dali-toolkit/devel-api/visuals/image-visual-properties-devel.h index d48eea8..9968b5c 100644 --- a/dali-toolkit/devel-api/visuals/image-visual-properties-devel.h +++ b/dali-toolkit/devel-api/visuals/image-visual-properties-devel.h @@ -77,7 +77,7 @@ enum Type AUXILIARY_IMAGE_ALPHA = ORIENTATION_CORRECTION + 2, /** - * @brief The number of times the AnimatedImageVisual will be looped. + * @brief The number of times the AnimatedImageVisual or AnimatedVectorImageVisual will be looped. * @details Name "loopCount", type Property::INTEGER. * @note For Animated images only. Default -1. if < 0, loop unlimited. else, loop loopCount times. */ @@ -86,11 +86,12 @@ enum Type /** * @brief The playing range the AnimatedVectorImageVisual will use. * - * Animation will play between the values specified. Both values should be between 0-1, - * otherwise they will be ignored. If the range provided is not in proper order ( minimum,maximum ), it will be reordered. + * Animation will play between the values specified. The array can only have two values, and more will be ignored. + * Both values should be between 0 and the total frame number, otherwise they will be ignored. + * If the range provided is not in proper order ( minimum, maximum ), it will be reordered. * - * @details Name "playRange", Type Property::VECTOR2, between 0 and 1 - * @note Default 0 and 1 + * @details Name "playRange", Type Property::ARRAY of Property::INTEGER + * @note Default 0 and the total frame number. */ PLAY_RANGE = ORIENTATION_CORRECTION + 4, @@ -102,11 +103,18 @@ enum Type PLAY_STATE = ORIENTATION_CORRECTION + 5, /** - * @brief The animation progress the AnimatedVectorImageVisual will use. - * @details Name "currentProgress", Type Property::FLOAT, between [0, 1] or between the play range if specified + * @brief The current frame number the AnimatedVectorImageVisual will use. + * @details Name "currentFrameNumber", Type Property::INTEGER, between [0, the maximum frame number] or between the play range if specified * @note This property is read-only. */ - CURRENT_PROGRESS = ORIENTATION_CORRECTION + 6 + CURRENT_FRAME_NUMBER = ORIENTATION_CORRECTION + 6, + + /** + * @brief The total frame number the AnimatedVectorImageVisual will use. + * @details Name "totalFrameNumber", Type Property::INTEGER. + * @note This property is read-only. + */ + TOTAL_FRAME_NUMBER = ORIENTATION_CORRECTION + 7 }; } //namespace Property diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp index c4e2df0..fbb727b 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.cpp @@ -83,9 +83,10 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor mUrl( imageUrl ), mVectorRasterizeThread( imageUrl.GetUrl() ), mVisualSize(), - mPlayRange( 0.0f, 1.0f ), mPlacementActor(), mLoopCount( LOOP_FOREVER ), + mStartFrame( 0 ), + mEndFrame( 0 ), mResendFlag( 0 ), mActionStatus( DevelAnimatedVectorImageVisual::Action::STOP ) { @@ -134,9 +135,15 @@ void AnimatedVectorImageVisual::DoCreatePropertyMap( Property::Map& map ) const map.Insert( Toolkit::ImageVisual::Property::URL, mUrl.GetUrl() ); } map.Insert( Toolkit::DevelImageVisual::Property::LOOP_COUNT, mLoopCount ); - map.Insert( Toolkit::DevelImageVisual::Property::PLAY_RANGE, mPlayRange ); + + Property::Array playRange; + playRange.PushBack( mStartFrame ); + playRange.PushBack( mEndFrame ); + map.Insert( Toolkit::DevelImageVisual::Property::PLAY_RANGE, playRange ); + map.Insert( Toolkit::DevelImageVisual::Property::PLAY_STATE, static_cast< int >( mVectorRasterizeThread.GetPlayState() ) ); - map.Insert( Toolkit::DevelImageVisual::Property::CURRENT_PROGRESS, mVectorRasterizeThread.GetCurrentProgress() ); + map.Insert( Toolkit::DevelImageVisual::Property::CURRENT_FRAME_NUMBER, static_cast< int32_t >( mVectorRasterizeThread.GetCurrentFrameNumber() ) ); + map.Insert( Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, static_cast< int32_t >( mVectorRasterizeThread.GetTotalFrameNumber() ) ); } void AnimatedVectorImageVisual::DoCreateInstancePropertyMap( Property::Map& map ) const @@ -184,11 +191,28 @@ void AnimatedVectorImageVisual::DoSetProperty( Property::Index index, const Prop } case Toolkit::DevelImageVisual::Property::PLAY_RANGE: { - Vector2 range; - if( value.Get( range ) ) + Property::Array* array = value.GetArray(); + if( array ) { - mPlayRange = range; - mResendFlag |= RESEND_PLAY_RANGE; + size_t count = array->Count(); + if( count >= 2 ) + { + int startFrame, endFrame; + int totalFrame = mVectorRasterizeThread.GetTotalFrameNumber(); + array->GetElementAt( 0 ).Get( startFrame ); + array->GetElementAt( 1 ).Get( endFrame ); + + if( startFrame >= 0 && startFrame < totalFrame && endFrame >= 0 && endFrame < totalFrame ) + { + mStartFrame = startFrame; + mEndFrame = endFrame; + mResendFlag |= RESEND_PLAY_RANGE; + } + else + { + DALI_LOG_ERROR( "Invalid play range [%d, %d / %d]\n", startFrame, endFrame, totalFrame ); + } + } } break; } @@ -337,10 +361,10 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons } case DevelAnimatedVectorImageVisual::Action::JUMP_TO: { - float progress; - if( attributes.Get( progress ) ) + int32_t frameNumber; + if( attributes.Get( frameNumber ) ) { - mVectorRasterizeThread.SetCurrentProgress( progress ); + mVectorRasterizeThread.SetCurrentFrameNumber( frameNumber ); if( IsOnStage() && mVectorRasterizeThread.GetPlayState() != DevelImageVisual::PlayState::PLAYING ) { @@ -411,7 +435,7 @@ void AnimatedVectorImageVisual::SendAnimationData() if( mResendFlag & RESEND_PLAY_RANGE ) { - mVectorRasterizeThread.SetPlayRange( mPlayRange ); + mVectorRasterizeThread.SetPlayRange( mStartFrame, mEndFrame ); } if( IsOnStage() ) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h index 032bea2..8a8e7a9 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/animated-vector-image-visual.h @@ -172,9 +172,10 @@ private: VisualUrl mUrl; VectorRasterizeThread mVectorRasterizeThread; Vector2 mVisualSize; - Vector2 mPlayRange; WeakHandle< Actor > mPlacementActor; int32_t mLoopCount; + int32_t mStartFrame; + int32_t mEndFrame; uint32_t mResendFlag; DevelAnimatedVectorImageVisual::Action::Type mActionStatus; }; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp index 543ca0d..e20d23c 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.cpp @@ -61,10 +61,8 @@ VectorRasterizeThread::VectorRasterizeThread( const std::string& url ) mConditionalWait(), mResourceReadyTrigger(), mAnimationFinishedTrigger(), - mPlayRange( 0.0f, 1.0f ), mPlayState( DevelImageVisual::PlayState::STOPPED ), mFrameDurationNanoSeconds( 0 ), - mProgress( 0.0f ), mFrameRate( 60.0f ), mCurrentFrame( 0 ), mTotalFrame( 0 ), @@ -213,31 +211,25 @@ void VectorRasterizeThread::SetLoopCount( int32_t count ) } } -int32_t VectorRasterizeThread::GetLoopCount() const +void VectorRasterizeThread::SetPlayRange( uint32_t startFrame, uint32_t endFrame ) { - return mLoopCount; -} - -void VectorRasterizeThread::SetPlayRange( Vector2 range ) -{ - // Make sure the range specified is between 0.0 and 1.0 - if( range.x >= 0.0f && range.x <= 1.0f && range.y >= 0.0f && range.y <= 1.0f ) + // Make sure the range specified is between 0 and the total frame number + if( startFrame >= 0 && startFrame < mTotalFrame && endFrame >= 0 && endFrame < mTotalFrame ) { - Vector2 orderedRange( range ); // If the range is not in order swap values - if( range.x > range.y ) + if( startFrame > endFrame ) { - orderedRange = Vector2( range.y, range.x ); + uint32_t temp = startFrame; + startFrame = endFrame; + endFrame = temp; } - if( mPlayRange != orderedRange ) + if( startFrame != mStartFrame || endFrame != mEndFrame ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - mPlayRange = orderedRange; - - mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); - mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); + mStartFrame = startFrame; + mEndFrame = endFrame; // If the current frame is out of the range, change the current frame also. if( mStartFrame > mCurrentFrame ) @@ -255,36 +247,38 @@ void VectorRasterizeThread::SetPlayRange( Vector2 range ) mResourceReady = false; } - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetPlayRange: [%d, %d]\n", mStartFrame, mEndFrame ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetPlayRangeInFrame: [%d, %d]\n", mStartFrame, mEndFrame ); } } } -Vector2 VectorRasterizeThread::GetPlayRange() const -{ - return mPlayRange; -} - -void VectorRasterizeThread::SetCurrentProgress( float progress ) +void VectorRasterizeThread::SetCurrentFrameNumber( uint32_t frameNumber ) { ConditionalWait::ScopedLock lock( mConditionalWait ); - if( progress >= mPlayRange.x && progress <= mPlayRange.y ) + if( frameNumber >= mStartFrame && frameNumber <= mEndFrame ) { - mProgress = progress; - - mCurrentFrame = static_cast< uint32_t >( mTotalFrame * progress + 0.5f ); + mCurrentFrame = frameNumber; mCurrentFrameUpdated = true; mResourceReady = false; - DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetCurrentProgress: progress = %f (%d)\n", progress, mCurrentFrame ); + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "VectorRasterizeThread::SetCurrentFrameNumber: frame number = %f (%d)\n", mCurrentFrame ); + } + else + { + DALI_LOG_ERROR( "Invalid frame number [%d (%d, %d)]\n", frameNumber, mStartFrame, mEndFrame ); } } -float VectorRasterizeThread::GetCurrentProgress() const +uint32_t VectorRasterizeThread::GetCurrentFrameNumber() const { - return ( static_cast< float >( mCurrentFrame ) / static_cast< float >( mTotalFrame ) ); + return mCurrentFrame; +} + +uint32_t VectorRasterizeThread::GetTotalFrameNumber() const +{ + return mTotalFrame; } void VectorRasterizeThread::GetDefaultSize( uint32_t& width, uint32_t& height ) const @@ -308,10 +302,7 @@ void VectorRasterizeThread::Initialize() mTotalFrame = mVectorRenderer.GetTotalFrameNumber(); - mStartFrame = static_cast< uint32_t >( mPlayRange.x * mTotalFrame + 0.5f ); - mEndFrame = static_cast< uint32_t >( mPlayRange.y * mTotalFrame + 0.5f ); - - mCurrentFrame = std::max( static_cast< uint32_t >( mTotalFrame * mProgress + 0.5f ), mStartFrame ); + mEndFrame = mTotalFrame; mFrameRate = mVectorRenderer.GetFrameRate(); mFrameDurationNanoSeconds = NANOSECONDS_PER_SECOND / mFrameRate; diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h index c40e6e9..c1c9c0b 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-rasterize-thread.h @@ -112,23 +112,12 @@ public: void SetLoopCount( int32_t count ); /** - * @brief Gets the loop count. -1 means to repeat forever. - * @return The number of times to loop - */ - int32_t GetLoopCount() const; - - /** - * @brief Set the playing range. - * @param[in] range Two values between [0,1] to specify minimum and maximum progress. + * @brief Set the playing range in frame number. + * @param[in] startFrame The frame number to specify minimum progress. + * @param[in] endFrame The frame number to specify maximum progress. * The animation will play between those values. */ - void SetPlayRange( Vector2 range ); - - /** - * @brief Gets the playing range. - * @return The play range defined for the animation - */ - Vector2 GetPlayRange() const; + void SetPlayRange( uint32_t startFrame, uint32_t endFrame ); /** * @brief Get the play state @@ -143,16 +132,22 @@ public: bool IsResourceReady() const; /** - * @brief Sets the progress of the animation. - * @param[in] progress The new progress as a normalized value between [0,1] or between the play range if specified. + * @brief Sets the current frame number of the animation. + * @param[in] frameNumber The new frame number between [0, the maximum frame number] or between the play range if specified. + */ + void SetCurrentFrameNumber( uint32_t frameNumber ); + + /** + * @brief Retrieves the current frame number of the animation. + * @return The current frame number */ - void SetCurrentProgress( float progress ); + uint32_t GetCurrentFrameNumber() const; /** - * @brief Retrieves the current progress of the animation. - * @return The current progress as a normalized value between [0,1] + * @brief Retrieves the total frame number of the animation. + * @return The total frame number */ - float GetCurrentProgress() const; + uint32_t GetTotalFrameNumber() const; /** * @brief Gets the default size of the file,. @@ -196,7 +191,6 @@ private: Vector2 mPlayRange; DevelImageVisual::PlayState mPlayState; int64_t mFrameDurationNanoSeconds; - float mProgress; float mFrameRate; uint32_t mCurrentFrame; uint32_t mTotalFrame; diff --git a/dali-toolkit/internal/visuals/visual-string-constants.cpp b/dali-toolkit/internal/visuals/visual-string-constants.cpp index dfa8fef..71545cc 100644 --- a/dali-toolkit/internal/visuals/visual-string-constants.cpp +++ b/dali-toolkit/internal/visuals/visual-string-constants.cpp @@ -102,7 +102,8 @@ const char * const AUXILIARY_IMAGE_NAME("auxiliaryImage"); const char * const AUXILIARY_IMAGE_ALPHA_NAME("auxiliaryImageAlpha"); const char * const PLAY_RANGE_NAME( "playRange" ); const char * const PLAY_STATE_NAME( "playState" ); -const char * const CURRENT_PROGRESS_NAME( "currentProgress" ); +const char * const CURRENT_FRAME_NUMBER_NAME( "currentFrameNumber" ); +const char * const TOTAL_FRAME_NUMBER_NAME( "totalFrameNumber" ); // Text visual const char * const TEXT_PROPERTY( "text" ); diff --git a/dali-toolkit/internal/visuals/visual-string-constants.h b/dali-toolkit/internal/visuals/visual-string-constants.h index 7e20d3b..728a48e 100644 --- a/dali-toolkit/internal/visuals/visual-string-constants.h +++ b/dali-toolkit/internal/visuals/visual-string-constants.h @@ -87,7 +87,8 @@ extern const char * const AUXILLARY_IMAGE_NAME; extern const char * const AUXILLARY_IMAGE_ALPHA_NAME; extern const char * const PLAY_RANGE_NAME; extern const char * const PLAY_STATE_NAME; -extern const char * const CURRENT_PROGRESS_NAME; +extern const char * const CURRENT_FRAME_NUMBER_NAME; +extern const char * const TOTAL_FRAME_NUMBER_NAME; // Text visual extern const char * const TEXT_PROPERTY;