From 1583d4f20b7f746719efb0a44702f02560131bfd Mon Sep 17 00:00:00 2001 From: seungho baek Date: Thu, 26 Oct 2023 18:17:10 +0900 Subject: [PATCH] Fixed Cache for AnimatedVectorImageVisual Change-Id: I3b48cb16f221031157501834474a4298da661d5c Signed-off-by: seungho baek --- .../vector-animation-renderer-tizen.cpp | 48 ++++++++++++++++++---- .../vector-animation-renderer.cpp | 11 ++++- .../vector-animation-renderer.h | 9 +++- 3 files changed, 58 insertions(+), 10 deletions(-) diff --git a/dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp b/dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp index 6322935..8ce4542 100644 --- a/dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp +++ b/dali-extension/vector-animation-renderer/vector-animation-renderer-tizen.cpp @@ -70,6 +70,15 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber) { Dali::Mutex::ScopedLock lock(mMutex); + if(mEnableFixedCache) + { + if(mDecodedBuffers.size() < mTotalFrameNumber) + { + mDecodedBuffers.clear(); + mDecodedBuffers.resize(mTotalFrameNumber, std::make_pair, bool>(std::vector(), false)); + } + } + if(!mTbmQueue || !mVectorRenderer || !mTargetSurface) { return false; @@ -98,7 +107,16 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber) } tbm_surface_info_s info; - int ret = tbm_surface_map(tbmSurface, TBM_OPTION_WRITE, &info); + int ret = TBM_SURFACE_ERROR_NONE; + + if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()) && (!mDecodedBuffers[frameNumber].second)) + { + ret = tbm_surface_map(tbmSurface, TBM_SURF_OPTION_READ | TBM_SURF_OPTION_WRITE, &info); + } + else + { + ret = tbm_surface_map(tbmSurface, TBM_SURF_OPTION_WRITE, &info); + } if(ret != TBM_SURFACE_ERROR_NONE) { DALI_LOG_ERROR("VectorAnimationRendererTizen::Render: tbm_surface_map is failed! [%d] [%p]\n", ret, this); @@ -137,15 +155,31 @@ bool VectorAnimationRendererTizen::Render(uint32_t frameNumber) } } - if(!existing) + if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()) && mDecodedBuffers[frameNumber].second) { - tbm_surface_internal_ref(tbmSurface); + const int bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888); + memcpy(buffer, &mDecodedBuffers[frameNumber].first[0], bufferSize); + } + else + { + if(!existing) + { + tbm_surface_internal_ref(tbmSurface); - // Create Surface object - surface = rlottie::Surface(reinterpret_cast(buffer), mWidth, mHeight, static_cast(info.planes[0].stride)); + // Create Surface object + surface = rlottie::Surface(reinterpret_cast(buffer), mWidth, mHeight, static_cast(info.planes[0].stride)); - // Push the buffer - mBuffers.push_back(SurfacePair(tbmSurface, surface)); + // Push the buffer + mBuffers.push_back(SurfacePair(tbmSurface, surface)); + } + + if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size())) + { + const uint32_t bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888); + std::vector rasterizeBuffer(buffer, buffer + bufferSize); + mDecodedBuffers[frameNumber].first = std::move(rasterizeBuffer); + mDecodedBuffers[frameNumber].second = true; + } } // Render the frame diff --git a/dali-extension/vector-animation-renderer/vector-animation-renderer.cpp b/dali-extension/vector-animation-renderer/vector-animation-renderer.cpp index 6f85639..ff7d94f 100644 --- a/dali-extension/vector-animation-renderer/vector-animation-renderer.cpp +++ b/dali-extension/vector-animation-renderer/vector-animation-renderer.cpp @@ -21,6 +21,7 @@ // EXTERNAL INCLUDES #include #include +#include #include #include // for strlen() @@ -58,7 +59,8 @@ VectorAnimationRenderer::VectorAnimationRenderer() mLoadFailed(false), mResourceReady(false), mShaderChanged(false), - mResourceReadyTriggered(false) + mResourceReadyTriggered(false), + mEnableFixedCache(false) { VectorAnimationPluginManager::Get().AddEventHandler(*this); } @@ -421,6 +423,13 @@ void VectorAnimationRenderer::AddPropertyValueCallback(const std::string& keyPat } } +void VectorAnimationRenderer::KeepRasterizedBuffer() +{ + Dali::Mutex::ScopedLock lock(mMutex); + mEnableFixedCache = true; + mDecodedBuffers.clear(); +} + VectorAnimationRendererPlugin::UploadCompletedSignalType& VectorAnimationRenderer::UploadCompletedSignal() { return mUploadCompletedSignal; diff --git a/dali-extension/vector-animation-renderer/vector-animation-renderer.h b/dali-extension/vector-animation-renderer/vector-animation-renderer.h index bf2334c..0d1c22c 100644 --- a/dali-extension/vector-animation-renderer/vector-animation-renderer.h +++ b/dali-extension/vector-animation-renderer/vector-animation-renderer.h @@ -19,6 +19,7 @@ */ // EXTERNAL INCLUDES +#include #include #include #include @@ -113,6 +114,8 @@ public: */ void AddPropertyValueCallback(const std::string& keyPath, VectorProperty property, CallbackBase* callback, int32_t id) override; + void KeepRasterizedBuffer(); + /** * @copydoc Dali::VectorAnimationRendererPlugin::UploadCompletedSignal() */ @@ -171,8 +174,9 @@ protected: virtual Dali::Texture GetTargetTexture() = 0; protected: - std::string mUrl; ///< The content file path - std::vector> mPropertyCallbacks; ///< Property callback list + std::string mUrl; ///< The content file path + std::vector> mPropertyCallbacks; ///< Property callback list + std::vector, bool>> mDecodedBuffers; mutable Dali::Mutex mMutex; ///< Mutex Dali::Renderer mRenderer; ///< Renderer @@ -189,6 +193,7 @@ protected: bool mResourceReady; ///< Whether the resource is ready bool mShaderChanged; ///< Whether the shader is changed to support native image bool mResourceReadyTriggered; ///< Whether the resource ready is triggered + bool mEnableFixedCache; }; } // namespace Plugin -- 2.7.4