#include <dali/devel-api/common/stage.h>
#include <dali/devel-api/rendering/renderer-devel.h>
#include <dali/devel-api/adaptor-framework/window-devel.h>
-#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
#include <dali-toolkit/internal/visuals/visual-factory-cache.h>
#include <dali-toolkit/internal/visuals/visual-string-constants.h>
#include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
+#include <dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.h>
namespace Dali
{
mVisualScale( Vector2::ONE ),
mPlacementActor(),
mPlayState( DevelImageVisual::PlayState::STOPPED ),
+ mEventCallback( nullptr ),
mRendererAdded( false ),
- mRasterizationTriggered( false )
+ mCoreShutdown(false),
+ mRedrawInScalingDown(true)
{
// the rasterized image is with pre-multiplied alpha format
mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA;
mVectorAnimationTask->UploadCompletedSignal().Connect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
mVectorAnimationTask->SetAnimationFinishedCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnAnimationFinished ) ) );
+
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.AddObserver(*this);
}
AnimatedVectorImageVisual::~AnimatedVectorImageVisual()
{
- if( mRasterizationTriggered && Adaptor::IsAvailable() )
+ if( ! mCoreShutdown )
{
- Adaptor::Get().UnregisterProcessor( *this );
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.RemoveObserver(*this);
+
+ if( mEventCallback )
+ {
+ mFactoryCache.GetVectorAnimationManager().UnregisterEventCallback( mEventCallback );
+ }
+
+ // Finalize animation task and disconnect the signal in the main thread
+ mVectorAnimationTask->UploadCompletedSignal().Disconnect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
+ mVectorAnimationTask->Finalize();
}
+}
- // Finalize animation task and disconnect the signal in the main thread
- mVectorAnimationTask->UploadCompletedSignal().Disconnect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
- mVectorAnimationTask->Finalize();
+void AnimatedVectorImageVisual::VectorAnimationManagerDestroyed()
+{
+ // Core is shutting down. Don't talk to the plugin any more.
+ mCoreShutdown = true;
}
void AnimatedVectorImageVisual::GetNaturalSize( Vector2& naturalSize )
map.Insert( Toolkit::DevelImageVisual::Property::STOP_BEHAVIOR, mAnimationData.stopBehavior );
map.Insert( Toolkit::DevelImageVisual::Property::LOOPING_MODE, mAnimationData.loopingMode );
+ map.Insert( Toolkit::DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, mRedrawInScalingDown );
Property::Map layerInfo;
mVectorAnimationTask->GetLayerInfo( layerInfo );
{
DoSetProperty( Toolkit::DevelImageVisual::Property::LOOPING_MODE, keyValue.second );
}
+ else if( keyValue.first == REDRAW_IN_SCALING_DOWN_NAME )
+ {
+ DoSetProperty( Toolkit::DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, keyValue.second );
+ }
}
}
}
case Toolkit::DevelImageVisual::Property::PLAY_RANGE:
{
- Property::Array* array = value.GetArray();
+ const Property::Array* array = value.GetArray();
if( array )
{
mAnimationData.playRange = *array;
}
break;
}
+ case Toolkit::DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN:
+ {
+ bool redraw;
+ if( value.Get( redraw ) )
+ {
+ mRedrawInScalingDown = redraw;
+ }
+ break;
+ }
}
}
if( mImpl->mCustomShader )
{
- shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource() : mImpl->mCustomShader->mVertexShader,
- mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource() : mImpl->mCustomShader->mFragmentShader,
+ shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader,
+ mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader,
mImpl->mCustomShader->mHints );
shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT );
}
case DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY:
{
- Property::Map* map = attributes.GetMap();
+ const Property::Map* map = attributes.GetMap();
if( map )
{
DoSetProperties( *map );
TriggerVectorRasterization();
}
-void AnimatedVectorImageVisual::Process()
-{
- SendAnimationData();
-
- mRasterizationTriggered = false;
-
- Adaptor::Get().UnregisterProcessor( *this );
-}
-
void AnimatedVectorImageVisual::OnUploadCompleted()
{
// If weak handle is holding a placement actor, it is the time to add the renderer to actor.
void AnimatedVectorImageVisual::TriggerVectorRasterization()
{
- if( !mRasterizationTriggered )
+ if( !mEventCallback && !mCoreShutdown )
{
+ mEventCallback = MakeCallback( this, &AnimatedVectorImageVisual::OnProcessEvents );
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.RegisterEventCallback( mEventCallback );
Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger event processing
-
- Adaptor::Get().RegisterProcessor( *this );
- mRasterizationTriggered = true;
}
}
if( actor )
{
Vector3 scale = actor.GetProperty< Vector3 >( Actor::Property::WORLD_SCALE );
- mVisualScale.width = scale.width;
- mVisualScale.height = scale.height;
- DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnScaleNotification: scale = %f, %f [%p]\n", mVisualScale.width, mVisualScale.height, this );
+ if(mRedrawInScalingDown || scale.width >= 1.0f || scale.height >= 1.0f)
+ {
+ mVisualScale.width = scale.width;
+ mVisualScale.height = scale.height;
- SetVectorImageSize();
- SendAnimationData();
+ DALI_LOG_INFO( gVectorAnimationLogFilter, Debug::Verbose, "AnimatedVectorImageVisual::OnScaleNotification: scale = %f, %f [%p]\n", mVisualScale.width, mVisualScale.height, this );
- Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger event processing
+ SetVectorImageSize();
+ SendAnimationData();
+
+ Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger event processing
+ }
}
}
}
}
+void AnimatedVectorImageVisual::OnProcessEvents()
+{
+ SendAnimationData();
+
+ mEventCallback = nullptr; // The callback will be deleted in the VectorAnimationManager
+}
+
} // namespace Internal
} // namespace Toolkit