From f0af424f8de127601c8bdf659e81959c5041f2cb Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Tue, 26 Sep 2023 09:48:45 +0900 Subject: [PATCH] Make NPatchData always use shared pointer Let we keep NPatchData user always use shared_ptr instead of raw pointer. In this case, NPatchData itself will be safe enought even if NPatchData removed from NPatchLoader cache. Change-Id: I27db855888bc21c7a7282a9e1114945f3f0e758d Signed-off-by: Eunki Hong --- dali-toolkit/devel-api/utility/npatch-helper.cpp | 2 +- dali-toolkit/devel-api/utility/npatch-helper.h | 3 ++- dali-toolkit/internal/visuals/npatch-loader.cpp | 4 ++-- dali-toolkit/internal/visuals/npatch-loader.h | 2 +- .../internal/visuals/npatch/npatch-visual.cpp | 22 +++++++++++----------- .../internal/visuals/visual-factory-cache.cpp | 16 ++++++++-------- 6 files changed, 25 insertions(+), 24 deletions(-) diff --git a/dali-toolkit/devel-api/utility/npatch-helper.cpp b/dali-toolkit/devel-api/utility/npatch-helper.cpp index b6c8151..382ef23 100644 --- a/dali-toolkit/devel-api/utility/npatch-helper.cpp +++ b/dali-toolkit/devel-api/utility/npatch-helper.cpp @@ -250,7 +250,7 @@ void RegisterStretchProperties(Renderer& renderer, const char* uniformName, cons } } -void ApplyTextureAndUniforms(Renderer& renderer, const Internal::NPatchData* data) +void ApplyTextureAndUniforms(Renderer& renderer, const std::shared_ptr data) { TextureSet textureSet; textureSet = data->GetTextures(); diff --git a/dali-toolkit/devel-api/utility/npatch-helper.h b/dali-toolkit/devel-api/utility/npatch-helper.h index 7a198fe..2427063 100644 --- a/dali-toolkit/devel-api/utility/npatch-helper.h +++ b/dali-toolkit/devel-api/utility/npatch-helper.h @@ -22,6 +22,7 @@ #include #include #include +#include ///< for std::shared_ptr // INTERNAL INCLUDES #include @@ -86,7 +87,7 @@ void RegisterStretchProperties(Renderer& renderer, const char* uniformName, cons * @param[in,out] renderer The renderer for broken image * @param[in] data The pointer of npatch-data */ -void ApplyTextureAndUniforms(Renderer& renderer, const Internal::NPatchData* data); +void ApplyTextureAndUniforms(Renderer& renderer, const std::shared_ptr data); } // namespace NPatchUtility diff --git a/dali-toolkit/internal/visuals/npatch-loader.cpp b/dali-toolkit/internal/visuals/npatch-loader.cpp index 2151822..24d919a 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.cpp +++ b/dali-toolkit/internal/visuals/npatch-loader.cpp @@ -127,12 +127,12 @@ int32_t NPatchLoader::GetCacheIndexFromId(const NPatchData::NPatchDataId id) return INVALID_CACHE_INDEX; } -bool NPatchLoader::GetNPatchData(const NPatchData::NPatchDataId id, const NPatchData*& data) +bool NPatchLoader::GetNPatchData(const NPatchData::NPatchDataId id, std::shared_ptr& data) { int32_t cacheIndex = GetCacheIndexFromId(id); if(cacheIndex != INVALID_CACHE_INDEX) { - data = mCache[cacheIndex].mData.get(); + data = mCache[cacheIndex].mData; return true; } data = nullptr; diff --git a/dali-toolkit/internal/visuals/npatch-loader.h b/dali-toolkit/internal/visuals/npatch-loader.h index 7e846e4..a55ab6f 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.h +++ b/dali-toolkit/internal/visuals/npatch-loader.h @@ -79,7 +79,7 @@ public: * @param [out] data const pointer to the NPatchData * @return true if data matching to id was really found */ - bool GetNPatchData(const NPatchData::NPatchDataId id, const NPatchData*& data); + bool GetNPatchData(const NPatchData::NPatchDataId id, std::shared_ptr& data); /** * @brief Request remove a texture matching id. diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index 090968c..606e040 100644 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -80,7 +80,7 @@ void NPatchVisual::LoadImages() bool preMultiplyOnLoad = IsPreMultipliedAlphaEnabled() && !mImpl->mCustomShader ? true : false; mId = mLoader.Load(textureManager, this, mImageUrl, mBorder, preMultiplyOnLoad, synchronousLoading); - const NPatchData* data; + std::shared_ptr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { EnablePreMultipliedAlpha(data->IsPreMultiplied()); @@ -126,7 +126,7 @@ void NPatchVisual::GetNaturalSize(Vector2& naturalSize) naturalSize.y = 0u; // load now if not already loaded - const NPatchData* data; + std::shared_ptr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { naturalSize.x = data->GetCroppedWidth(); @@ -223,7 +223,7 @@ void NPatchVisual::DoSetOnScene(Actor& actor) // at this case, we try to SetResouce to mPlaceActor twice. so, we should avoid that case. mPlacementActor = actor; - const NPatchData* data; + std::shared_ptr data; if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { // If mAuxiliaryUrl need to be loaded, we should wait it until LoadComplete called. @@ -353,8 +353,8 @@ void NPatchVisual::OnInitialize() Geometry NPatchVisual::CreateGeometry() { - Geometry geometry; - const NPatchData* data; + Geometry geometry; + std::shared_ptr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { if(data->GetStretchPixelsX().Size() == 1 && data->GetStretchPixelsY().Size() == 1) @@ -408,8 +408,8 @@ Geometry NPatchVisual::CreateGeometry() Shader NPatchVisual::CreateShader() { - Shader shader; - const NPatchData* data; + Shader shader; + std::shared_ptr data; // 0 is either no data (load failed?) or no stretch regions on image // for both cases we use the default shader NPatchUtility::StretchRanges::SizeType xStretchCount = 0; @@ -488,8 +488,8 @@ Shader NPatchVisual::CreateShader() void NPatchVisual::ApplyTextureAndUniforms() { - const NPatchData* data; - TextureSet textureSet; + std::shared_ptr data; + TextureSet textureSet; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { @@ -551,7 +551,7 @@ Geometry NPatchVisual::GetNinePatchGeometry(VisualFactoryCache::GeometryType sub void NPatchVisual::SetResource() { - const NPatchData* data; + std::shared_ptr data; if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data)) { Geometry geometry = CreateGeometry(); @@ -628,7 +628,7 @@ void NPatchVisual::LoadComplete(bool loadSuccess, TextureInformation textureInfo // If auxiliaryUrl didn't required OR auxiliaryUrl load done. if(!mAuxiliaryUrl.IsValid() || mAuxiliaryResourceStatus != Toolkit::Visual::ResourceStatus::PREPARING) { - const NPatchData* data; + std::shared_ptr data; // and.. If Url loading done. if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.cpp b/dali-toolkit/internal/visuals/visual-factory-cache.cpp index 7cf9d14..9437bdc 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-cache.cpp @@ -272,8 +272,8 @@ VisualUrl::Type VisualFactoryCache::GetBrokenImageVisualType(int index) Geometry VisualFactoryCache::GetNPatchGeometry(int index) { - Geometry geometry; - const NPatchData* data; + Geometry geometry; + std::shared_ptr data; if(mNPatchLoader.GetNPatchData(mBrokenImageInfoContainer[index].npatchId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { if(data->GetStretchPixelsX().Size() == 1 && data->GetStretchPixelsY().Size() == 1) @@ -306,8 +306,8 @@ Geometry VisualFactoryCache::GetNPatchGeometry(int index) Shader VisualFactoryCache::GetNPatchShader(int index) { - Shader shader; - const NPatchData* data; + Shader shader; + std::shared_ptr data; // 0 is either no data (load failed?) or no stretch regions on image // for both cases we use the default shader NPatchUtility::StretchRanges::SizeType xStretchCount = 0; @@ -344,8 +344,8 @@ Shader VisualFactoryCache::GetNPatchShader(int index) void VisualFactoryCache::ApplyTextureAndUniforms(Renderer& renderer, int index) { - const NPatchData* data; - TextureSet textureSet; + std::shared_ptr data; + TextureSet textureSet; if(mNPatchLoader.GetNPatchData(mBrokenImageInfoContainer[index].npatchId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { textureSet = data->GetTextures(); @@ -374,8 +374,8 @@ void VisualFactoryCache::UpdateBrokenImageRenderer(Renderer& renderer, const Vec mBrokenImageInfoContainer[index].visualType = visualUrl.GetType(); if(mBrokenImageInfoContainer[index].visualType == VisualUrl::Type::N_PATCH) { - const NPatchData* data; - Rect border; + std::shared_ptr data; + Rect border; mBrokenImageInfoContainer[index].npatchId = mNPatchLoader.Load(mTextureManager, NULL, mBrokenImageInfoContainer[index].url, border, mPreMultiplyOnLoad, true); if(mNPatchLoader.GetNPatchData(mBrokenImageInfoContainer[index].npatchId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { -- 2.7.4