mLoadFailed(false),
mResourceReady(false),
mShaderChanged(false),
- mResourceReadyTriggered(false)
+ mResourceReadyTriggered(false),
+ mEnableFixedCache(false)
{
TizenVectorAnimationManager::Get().AddEventHandler(*this);
}
{
Dali::Mutex::ScopedLock lock(mMutex);
+ if(mEnableFixedCache)
+ {
+ if(mDecodedBuffers.size() < mTotalFrameNumber)
+ {
+ mDecodedBuffers.clear();
+ mDecodedBuffers.resize(mTotalFrameNumber, std::make_pair<std::vector<uint8_t>, bool>(std::vector<uint8_t>(), false));
+ }
+ }
+
if(!mTbmQueue || !mVectorRenderer || !mTargetSurface)
{
return false;
}
tbm_surface_info_s info;
- int ret = tbm_surface_map(tbmSurface, TBM_OPTION_WRITE, &info);
+ int ret = TBM_SURFACE_ERROR_NONE;
+ if(mEnableFixedCache && !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("TizenVectorAnimationRenderer::Render: tbm_surface_map is failed! [%d] [%p]\n", ret, this);
}
}
- if(!existing)
+ if(mEnableFixedCache && mDecodedBuffers[frameNumber].second)
+ {
+ const int bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+ memcpy(buffer, &mDecodedBuffers[frameNumber].first[0], bufferSize);
+ }
+ else
{
- tbm_surface_internal_ref(tbmSurface);
+ if(!existing)
+ {
+ tbm_surface_internal_ref(tbmSurface);
- // Create Surface object
- surface = rlottie::Surface(reinterpret_cast<uint32_t*>(buffer), mWidth, mHeight, static_cast<size_t>(info.planes[0].stride));
+ // Create Surface object
+ surface = rlottie::Surface(reinterpret_cast<uint32_t*>(buffer), mWidth, mHeight, static_cast<size_t>(info.planes[0].stride));
- // Push the buffer
- mBuffers.push_back(SurfacePair(tbmSurface, surface));
- }
+ // Push the buffer
+ mBuffers.push_back(SurfacePair(tbmSurface, surface));
+ }
+
+ // Render the frame
+ mVectorRenderer->renderSync(frameNumber, surface);
- // Render the frame
- mVectorRenderer->renderSync(frameNumber, surface);
+ if(mEnableFixedCache)
+ {
+ const uint32_t bufferSize = mWidth * mHeight * Dali::Pixel::GetBytesPerPixel(Dali::Pixel::RGBA8888);
+ std::vector<uint8_t> rasterizeBuffer(buffer, buffer + bufferSize);
+ mDecodedBuffers[frameNumber].first = std::move(rasterizeBuffer);
+ mDecodedBuffers[frameNumber].second = true;
+ }
+ }
tbm_surface_unmap(tbmSurface);
}
}
+void TizenVectorAnimationRenderer::KeepRasterizedBuffer()
+{
+ Dali::Mutex::ScopedLock lock(mMutex);
+ mEnableFixedCache = true;
+ mDecodedBuffers.clear();
+}
+
VectorAnimationRendererPlugin::UploadCompletedSignalType& TizenVectorAnimationRenderer::UploadCompletedSignal()
{
return mUploadCompletedSignal;
// EXTERNAL INCLUDES
#include <dali/devel-api/adaptor-framework/native-image-source-queue.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
#include <dali/devel-api/adaptor-framework/vector-animation-renderer-plugin.h>
#include <dali/devel-api/threading/mutex.h>
#include <dali/public-api/common/vector-wrapper.h>
*/
void AddPropertyValueCallback(const std::string& keyPath, VectorProperty property, CallbackBase* callback, int32_t id) override;
+ void KeepRasterizedBuffer();
+
/**
* @copydoc Dali::VectorAnimationRendererPlugin::UploadCompletedSignal()
*/
std::string mUrl; ///< The content file path
std::vector<SurfacePair> mBuffers; ///< EGL Image vector
std::vector<std::unique_ptr<CallbackBase>> mPropertyCallbacks; ///< Property callback list
+ std::vector<std::pair<std::vector<uint8_t>, bool>> mDecodedBuffers;
mutable Dali::Mutex mMutex; ///< Mutex
Dali::Renderer mRenderer; ///< Renderer
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