From: Heeyong Song Date: Tue, 18 Aug 2020 08:54:01 +0000 (+0000) Subject: Merge "(Vector) Change event processing" into devel/master X-Git-Tag: dali_1.9.26~6 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=ef15505c94dffeb0639c91d9d3cd374918c21c4f;hp=bf58973c37b31d52707463a1e9cdecdbe91099f6 Merge "(Vector) Change event processing" into devel/master --- diff --git a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp index f252318..80314dc 100644 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace Dali { diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index 246ba89..f35ae3f 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -19,6 +19,7 @@ SET( toolkit_src_files ${toolkit_src_dir}/visuals/animated-image/rolling-image-cache.cpp ${toolkit_src_dir}/visuals/animated-image/rolling-animated-image-cache.cpp ${toolkit_src_dir}/visuals/animated-vector-image/animated-vector-image-visual.cpp + ${toolkit_src_dir}/visuals/animated-vector-image/vector-animation-manager.cpp ${toolkit_src_dir}/visuals/animated-vector-image/vector-animation-task.cpp ${toolkit_src_dir}/visuals/animated-vector-image/vector-animation-thread.cpp ${toolkit_src_dir}/visuals/animated-vector-image/vector-rasterize-thread.cpp diff --git a/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h index e937c27..70419d0 100755 --- a/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h +++ b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace Dali { 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 7b263e1..453f14e 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 @@ -22,7 +22,6 @@ #include #include #include -#include #include // INTERNAL INCLUDES @@ -34,6 +33,7 @@ #include #include #include +#include namespace Dali { @@ -93,8 +93,8 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor mVisualScale( Vector2::ONE ), mPlacementActor(), mPlayState( DevelImageVisual::PlayState::STOPPED ), - mRendererAdded( false ), - mRasterizationTriggered( false ) + mEventCallback( nullptr ), + mRendererAdded( false ) { // the rasterized image is with pre-multiplied alpha format mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA; @@ -105,9 +105,9 @@ AnimatedVectorImageVisual::AnimatedVectorImageVisual( VisualFactoryCache& factor AnimatedVectorImageVisual::~AnimatedVectorImageVisual() { - if( mRasterizationTriggered && Adaptor::IsAvailable() ) + if( mEventCallback ) { - Adaptor::Get().UnregisterProcessor( *this ); + mFactoryCache.GetVectorAnimationManager().UnregisterEventCallback( mEventCallback ); } // Finalize animation task and disconnect the signal in the main thread @@ -418,15 +418,6 @@ void AnimatedVectorImageVisual::OnDoAction( const Property::Index actionId, cons 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. @@ -509,12 +500,11 @@ void AnimatedVectorImageVisual::StopAnimation() void AnimatedVectorImageVisual::TriggerVectorRasterization() { - if( !mRasterizationTriggered ) + if( !mEventCallback ) { + mEventCallback = MakeCallback( this, &AnimatedVectorImageVisual::OnProcessEvents ); + mFactoryCache.GetVectorAnimationManager().RegisterEventCallback( mEventCallback ); Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger event processing - - Adaptor::Get().RegisterProcessor( *this ); - mRasterizationTriggered = true; } } @@ -576,6 +566,13 @@ void AnimatedVectorImageVisual::OnWindowVisibilityChanged( Window window, bool v } } +void AnimatedVectorImageVisual::OnProcessEvents() +{ + SendAnimationData(); + + mEventCallback = nullptr; // The callback will be deleted in the VectorAnimationManager +} + } // namespace Internal } // namespace Toolkit 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 11b3b1c..e7ba945 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 @@ -24,7 +24,6 @@ #include #include #include -#include // INTERNAL INCLUDES #include @@ -56,7 +55,7 @@ using AnimatedVectorImageVisualPtr = IntrusivePtr< AnimatedVectorImageVisual >; * | url | STRING | * */ -class AnimatedVectorImageVisual: public Visual::Base, public ConnectionTracker, public Integration::Processor +class AnimatedVectorImageVisual: public Visual::Base, public ConnectionTracker { public: @@ -139,13 +138,6 @@ protected: */ void OnDoAction( const Property::Index actionId, const Property::Value& attributes ) override; -protected: // Implementation of Processor - - /** - * @copydoc Dali::Integration::Processor::Process() - */ - void Process() override; - private: /** @@ -205,6 +197,11 @@ private: */ void OnWindowVisibilityChanged( Window window, bool visible ); + /** + * @brief Callback when the event is processed. + */ + void OnProcessEvents(); + // Undefined AnimatedVectorImageVisual( const AnimatedVectorImageVisual& visual ) = delete; @@ -222,8 +219,8 @@ private: Vector2 mVisualScale; WeakHandle< Actor > mPlacementActor; DevelImageVisual::PlayState::Type mPlayState; + CallbackBase* mEventCallback; // Not owned bool mRendererAdded; - bool mRasterizationTriggered; }; } // namespace Internal diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.cpp new file mode 100644 index 0000000..8e47d81 --- /dev/null +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include + +// EXTERNAL INCLUDES +#include +#include + +// INTERNAL INCLUDES +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +namespace +{ + +#if defined(DEBUG_ENABLED) +Debug::Filter* gVectorAnimationLogFilter = Debug::Filter::New( Debug::NoLogging, false, "LOG_VECTOR_ANIMATION" ); +#endif + +} // unnamed namespace + +VectorAnimationManager::VectorAnimationManager() +: mEventCallbacks(), + mVectorAnimationThread( nullptr ), + mProcessorRegistered( false ) +{ +} + +VectorAnimationManager::~VectorAnimationManager() +{ + for( auto&& iter : mEventCallbacks ) + { + delete iter; + } + mEventCallbacks.clear(); + + if( mProcessorRegistered ) + { + Adaptor::Get().UnregisterProcessor( *this ); + } +} + +VectorAnimationThread& VectorAnimationManager::GetVectorAnimationThread() +{ + if( !mVectorAnimationThread ) + { + mVectorAnimationThread = std::unique_ptr< VectorAnimationThread >( new VectorAnimationThread() ); + mVectorAnimationThread->Start(); + } + return *mVectorAnimationThread; +} + +void VectorAnimationManager::RegisterEventCallback( CallbackBase* callback ) +{ + mEventCallbacks.push_back( callback ); + + if( !mProcessorRegistered ) + { + Adaptor::Get().RegisterProcessor( *this ); + mProcessorRegistered = true; + } +} + +void VectorAnimationManager::UnregisterEventCallback( CallbackBase* callback ) +{ + auto iter = std::find( mEventCallbacks.begin(), mEventCallbacks.end(), callback ); + if( iter != mEventCallbacks.end() ) + { + mEventCallbacks.erase( iter ); + + if( mEventCallbacks.empty() ) + { + if( Adaptor::IsAvailable() ) + { + Adaptor::Get().UnregisterProcessor( *this ); + mProcessorRegistered = false; + } + } + } +} + +void VectorAnimationManager::Process() +{ + for( auto&& iter : mEventCallbacks ) + { + CallbackBase::Execute( *iter ); + delete iter; + } + mEventCallbacks.clear(); + + Adaptor::Get().UnregisterProcessor( *this ); + mProcessorRegistered = false; +} + +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.h new file mode 100644 index 0000000..2b36c7d --- /dev/null +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.h @@ -0,0 +1,106 @@ +#ifndef DALI_TOOLKIT_INTERNAL_VECTOR_ANIMATION_MANAGER_H +#define DALI_TOOLKIT_INTERNAL_VECTOR_ANIMATION_MANAGER_H + +/* + * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// EXTERNAL INCLUDES +#include +#include +#include +#include + +// INTERNAL INCLUDES + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +class VectorAnimationThread; + +/** + * @brief Vector animation manager + */ +class VectorAnimationManager: public Integration::Processor +{ +public: + + /** + * @brief Constructor. + */ + VectorAnimationManager(); + + /** + * @brief Destructor. + */ + virtual ~VectorAnimationManager(); + + /** + * Get the vector animation thread. + * @return A raw pointer pointing to the vector animation thread. + */ + VectorAnimationThread& GetVectorAnimationThread(); + + /** + * @brief Register a callback. + * + * @param callback The callback to register + * @note Ownership of the callback is passed onto this class. + */ + void RegisterEventCallback( CallbackBase* callback ); + + /** + * @brief Unregister a previously registered callback + * + * @param callback The callback to unregister + */ + void UnregisterEventCallback( CallbackBase* callback ); + +protected: // Implementation of Processor + + /** + * @copydoc Dali::Integration::Processor::Process() + */ + void Process() override; + +private: + + // Undefined + VectorAnimationManager( const VectorAnimationManager& manager ) = delete; + + // Undefined + VectorAnimationManager& operator=( const VectorAnimationManager& manager ) = delete; + +private: + + std::vector< CallbackBase* > mEventCallbacks; + std::unique_ptr< VectorAnimationThread > mVectorAnimationThread; + bool mProcessorRegistered; +}; + +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali + +#endif // DALI_TOOLKIT_INTERNAL_VECTOR_ANIMATION_MANAGER_H diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp index bae4fbc..c5978d6 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.cpp @@ -26,6 +26,7 @@ // INTERNAL INCLUDES #include #include +#include namespace Dali { @@ -52,7 +53,7 @@ VectorAnimationTask::VectorAnimationTask( VisualFactoryCache& factoryCache, cons : mUrl( url ), mVectorRenderer(), mAnimationData(), - mVectorAnimationThread( factoryCache.GetVectorAnimationThread() ), + mVectorAnimationThread( factoryCache.GetVectorAnimationManager().GetVectorAnimationThread() ), mConditionalWait(), mAnimationFinishedTrigger(), mPlayState( PlayState::STOPPED ), diff --git a/dali-toolkit/internal/visuals/svg/svg-visual.cpp b/dali-toolkit/internal/visuals/svg/svg-visual.cpp index 27ca01c..a9989c0 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -26,10 +26,11 @@ #include #include #include -#include +#include // EXTERNAL INCLUDES #include +#include #include namespace Dali @@ -209,6 +210,7 @@ void SvgVisual::DoCreatePropertyMap( Property::Map& map ) const map.Insert( Toolkit::ImageVisual::Property::URL, mImageUrl.GetUrl() ); map.Insert( Toolkit::ImageVisual::Property::ATLASING, mAttemptAtlasing ); } + map.Insert( Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, IsSynchronousLoadingRequired() ); } void SvgVisual::DoCreateInstancePropertyMap( Property::Map& map ) const diff --git a/dali-toolkit/internal/visuals/visual-base-impl.cpp b/dali-toolkit/internal/visuals/visual-base-impl.cpp index 69e859b..c47cfca 100755 --- a/dali-toolkit/internal/visuals/visual-base-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-base-impl.cpp @@ -368,7 +368,6 @@ void Visual::Base::CreatePropertyMap( Property::Map& map ) const // which is ok, because they have a different key value range. map.Insert( Toolkit::Visual::Property::MIX_COLOR, mImpl->mMixColor ); // vec4 map.Insert( Toolkit::Visual::Property::OPACITY, mImpl->mMixColor.a ); - map.Insert( Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, IsSynchronousLoadingRequired() ); auto fittingModeString = Scripting::GetLinearEnumerationName< FittingMode >( mImpl->mFittingMode, VISUAL_FITTING_MODE_TABLE, VISUAL_FITTING_MODE_TABLE_COUNT ); diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.cpp b/dali-toolkit/internal/visuals/visual-factory-cache.cpp index 2db3a57..7044e6d 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-cache.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace Dali { @@ -37,7 +38,7 @@ namespace Internal VisualFactoryCache::VisualFactoryCache( bool preMultiplyOnLoad ) : mSvgRasterizeThread( NULL ), - mVectorAnimationThread(), + mVectorAnimationManager(), mBrokenImageUrl(""), mPreMultiplyOnLoad( preMultiplyOnLoad ) { @@ -130,14 +131,13 @@ SvgRasterizeThread* VisualFactoryCache::GetSVGRasterizationThread() return mSvgRasterizeThread; } -VectorAnimationThread& VisualFactoryCache::GetVectorAnimationThread() +VectorAnimationManager& VisualFactoryCache::GetVectorAnimationManager() { - if( !mVectorAnimationThread ) + if( !mVectorAnimationManager ) { - mVectorAnimationThread = std::unique_ptr< VectorAnimationThread >( new VectorAnimationThread() ); - mVectorAnimationThread->Start(); + mVectorAnimationManager = std::unique_ptr< VectorAnimationManager >( new VectorAnimationManager() ); } - return *mVectorAnimationThread; + return *mVectorAnimationManager; } void VisualFactoryCache::ApplyRasterizedSVGToSampler() diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.h b/dali-toolkit/internal/visuals/visual-factory-cache.h index 18d4abc..5fab354 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.h +++ b/dali-toolkit/internal/visuals/visual-factory-cache.h @@ -28,7 +28,6 @@ #include #include #include -#include namespace Dali { @@ -42,6 +41,7 @@ namespace Internal class ImageAtlasManager; class NPatchLoader; class TextureManager; +class VectorAnimationManager; typedef IntrusivePtr ImageAtlasManagerPtr; @@ -215,10 +215,10 @@ public: SvgRasterizeThread* GetSVGRasterizationThread(); /** - * Get the vector animation thread. - * @return A raw pointer pointing to the vector animation thread. + * Get the vector animation manager. + * @return A reference to the vector animation manager. */ - VectorAnimationThread& GetVectorAnimationThread(); + VectorAnimationManager& GetVectorAnimationManager(); private: // for svg rasterization thread @@ -243,14 +243,14 @@ private: Geometry mGeometry[GEOMETRY_TYPE_MAX+1]; Shader mShader[SHADER_TYPE_MAX+1]; - ImageAtlasManagerPtr mAtlasManager; - TextureManager mTextureManager; - NPatchLoader mNPatchLoader; - Texture mBrokenImageTexture; - SvgRasterizeThread* mSvgRasterizeThread; - std::unique_ptr< VectorAnimationThread > mVectorAnimationThread; - std::string mBrokenImageUrl; - bool mPreMultiplyOnLoad; + ImageAtlasManagerPtr mAtlasManager; + TextureManager mTextureManager; + NPatchLoader mNPatchLoader; + Texture mBrokenImageTexture; + SvgRasterizeThread* mSvgRasterizeThread; + std::unique_ptr< VectorAnimationManager > mVectorAnimationManager; + std::string mBrokenImageUrl; + bool mPreMultiplyOnLoad; }; } // namespace Internal