X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fanimated-vector-image%2Fanimated-vector-image-visual.cpp;h=fbb727b8332ac06725507d2e48b85b9d02845bc1;hp=886485bd365545223275cfb515640ba0c7a1a11d;hb=f241f4e0ee21b508d75e622db5f81e505ec1166d;hpb=46a27bd33d7dc6ef7844b63399dbdfcb2ebb55d7 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 886485b..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 @@ -56,6 +56,10 @@ enum Flags RESEND_LOOP_COUNT = 1 << 1 }; +#if defined(DEBUG_ENABLED) +Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" ); +#endif + } // unnamed namespace AnimatedVectorImageVisualPtr AnimatedVectorImageVisual::New( VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, const Property::Map& properties ) @@ -79,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 ) { @@ -100,7 +105,25 @@ AnimatedVectorImageVisual::~AnimatedVectorImageVisual() void AnimatedVectorImageVisual::GetNaturalSize( Vector2& naturalSize ) { - naturalSize = mVisualSize; + if( mImpl->mRenderer ) // Check if we have a rendered image + { + auto textureSet = mImpl->mRenderer.GetTextures(); + if( textureSet ) + { + if( textureSet.GetTextureCount() > 0 ) + { + auto texture = textureSet.GetTexture( 0 ); + naturalSize.x = texture.GetWidth(); + naturalSize.y = texture.GetHeight(); + return; + } + } + } + + uint32_t width, height; + mVectorRasterizeThread.GetDefaultSize( width, height ); + naturalSize.x = width; + naturalSize.y = height; } void AnimatedVectorImageVisual::DoCreatePropertyMap( Property::Map& map ) const @@ -112,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 @@ -162,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; } @@ -234,6 +280,8 @@ void AnimatedVectorImageVisual::OnSetTransform() if( IsOnStage() ) { + DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnSetTransform: width = %f, height = %f\n", visualSize.width, visualSize.height ); + if( visualSize != mVisualSize ) { mVisualSize = visualSize; @@ -279,7 +327,7 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons { case DevelAnimatedVectorImageVisual::Action::PLAY: { - if( IsOnStage() ) + if( IsOnStage() && mVisualSize != Vector2::ZERO ) { mVectorRasterizeThread.PlayAnimation(); @@ -313,10 +361,16 @@ 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 ) + { + mVectorRasterizeThread.RenderFrame(); + Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger rendering + } } break; } @@ -381,17 +435,20 @@ void AnimatedVectorImageVisual::SendAnimationData() if( mResendFlag & RESEND_PLAY_RANGE ) { - mVectorRasterizeThread.SetPlayRange( mPlayRange ); + mVectorRasterizeThread.SetPlayRange( mStartFrame, mEndFrame ); } - if( isPlaying ) - { - mVectorRasterizeThread.PlayAnimation(); - } - else + if( IsOnStage() ) { - mVectorRasterizeThread.RenderFrame(); - Stage::GetCurrent().KeepRendering( 0.0f ); + if( isPlaying ) + { + mVectorRasterizeThread.PlayAnimation(); + } + else + { + mVectorRasterizeThread.RenderFrame(); + Stage::GetCurrent().KeepRendering( 0.0f ); + } } mResendFlag = 0;