{
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 && (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);
}
}
- 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<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));
+ }
+
+ if(mEnableFixedCache && (frameNumber < mDecodedBuffers.size()))
+ {
+ 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;
+ }
}
// Render the frame
// EXTERNAL INCLUDES
#include <dali/devel-api/common/hash.h>
#include <dali/integration-api/debug.h>
+#include <dali/integration-api/texture-integ.h>
#include <dali/public-api/object/property-array.h>
#include <cstring> // for strlen()
mLoadFailed(false),
mResourceReady(false),
mShaderChanged(false),
- mResourceReadyTriggered(false)
+ mResourceReadyTriggered(false),
+ mEnableFixedCache(false)
{
VectorAnimationPluginManager::Get().AddEventHandler(*this);
}
}
}
+void VectorAnimationRenderer::KeepRasterizedBuffer()
+{
+ Dali::Mutex::ScopedLock lock(mMutex);
+ mEnableFixedCache = true;
+ mDecodedBuffers.clear();
+}
+
VectorAnimationRendererPlugin::UploadCompletedSignalType& VectorAnimationRenderer::UploadCompletedSignal()
{
return mUploadCompletedSignal;
*/
// EXTERNAL INCLUDES
+#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()
*/
virtual Dali::Texture GetTargetTexture() = 0;
protected:
- std::string mUrl; ///< The content file path
- std::vector<std::unique_ptr<CallbackBase>> mPropertyCallbacks; ///< Property callback list
+ std::string mUrl; ///< The content file path
+ 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