X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fnpatch-loader.h;h=539009b8fb198fead2a5b5a1a9d8d18b3adfea91;hp=48301a6d7b336f796cf4abef00bc2d75de572646;hb=HEAD;hpb=f318729b87f970b094aa4f0def903cbd38d1ee8f diff --git a/dali-toolkit/internal/visuals/npatch-loader.h b/dali-toolkit/internal/visuals/npatch-loader.h index 48301a6..fb66fcc 100644 --- a/dali-toolkit/internal/visuals/npatch-loader.h +++ b/dali-toolkit/internal/visuals/npatch-loader.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_NPATCH_LOADER_H /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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. @@ -19,8 +19,10 @@ // EXTERNAL INCLUDES #include +#include #include #include +#include // for std::pair // INTERNAL INCLUDES #include @@ -43,7 +45,7 @@ namespace Internal * small space and there's not usually a lot of them. Usually N patches are specified in * toolkit default style and there is 1-2 per control that are shared across the whole application. */ -class NPatchLoader +class NPatchLoader : public Integration::Processor { public: /** @@ -68,16 +70,7 @@ public: * @param [in] synchronousLoading True if the image will be loaded in synchronous time. * @return id of the texture. */ - std::size_t Load(TextureManager& textureManager, TextureUploadObserver* textureObserver, const VisualUrl& url, const Rect& border, bool& preMultiplyOnLoad, bool synchronousLoading); - - /** - * @brief Set loaded PixelBuffer and its information - * - * @param [in] id cache data id - * @param [in] pixelBuffer of loaded image - * @param [in] preMultiplied True if the image had pre-multiplied alpha applied - */ - void SetNPatchData(std::size_t id, Devel::PixelBuffer& pixelBuffer, bool preMultiplied); + NPatchData::NPatchDataId Load(TextureManager& textureManager, TextureUploadObserver* textureObserver, const VisualUrl& url, const Rect& border, bool& preMultiplyOnLoad, bool synchronousLoading); /** * @brief Retrieve N patch data matching to an id @@ -85,24 +78,47 @@ 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, NPatchDataPtr& data); /** - * @brief Remove a texture matching id. + * @brief Request remove a texture matching id. * Erase the observer from the observer list of cache if we need. - * This API decrease cached NPatchInfo reference. - * If the NPatchInfo reference become 0, the textureSet will be reset. * * @param [in] id cache data id * @param [in] textureObserver The NPatchVisual that requested loading. */ - void Remove(std::size_t id, TextureUploadObserver* textureObserver); + void RequestRemove(NPatchData::NPatchDataId id, TextureUploadObserver* textureObserver); + +protected: // Implementation of Processor + /** + * @copydoc Dali::Integration::Processor::Process() + */ + void Process(bool postProcessor) override; + + /** + * @copydoc Dali::Integration::Processor::GetProcessorName() + */ + std::string_view GetProcessorName() const override + { + return "NPatchLoader"; + } private: NPatchData::NPatchDataId GenerateUniqueNPatchDataId(); int32_t GetCacheIndexFromId(const NPatchData::NPatchDataId id); + /** + * @brief Remove a texture matching id. + * Erase the observer from the observer list of cache if we need. + * This API decrease cached NPatchInfo reference. + * If the NPatchInfo reference become 0, the textureSet will be reset. + * + * @param [in] id cache data id + * @param [in] textureObserver The NPatchVisual that requested loading. + */ + void Remove(NPatchData::NPatchDataId id, TextureUploadObserver* textureObserver); + private: /** * @brief Information of NPatchData @@ -110,39 +126,34 @@ private: */ struct NPatchInfo { - NPatchInfo(NPatchData* data) + NPatchInfo(NPatchDataPtr data) : mData(data), mReferenceCount(1u) { } ~NPatchInfo() { - if(mData) - { - delete mData; - } } - NPatchInfo(NPatchInfo&& info) // move constructor + NPatchInfo(NPatchInfo&& info) noexcept // move constructor { mData = std::move(info.mData); mReferenceCount = info.mReferenceCount; - info.mData = nullptr; info.mReferenceCount = 0u; } - NPatchInfo& operator=(NPatchInfo&& info) // move operator + NPatchInfo& operator=(NPatchInfo&& info) noexcept // move operator { mData = std::move(info.mData); mReferenceCount = info.mReferenceCount; - info.mData = nullptr; info.mReferenceCount = 0u; return *this; } - NPatchInfo() = delete; // Do not use default constructor - NPatchInfo(const NPatchInfo& info) = delete; // Do not use copy constructor + NPatchInfo() = delete; // Do not use default constructor + NPatchInfo(const NPatchInfo& info) = delete; // Do not use copy constructor + NPatchInfo& operator=(const NPatchInfo& info) = delete; // Do not use copy assign - NPatchData* mData; - std::int16_t mReferenceCount; ///< The number of N-patch visuals that use this data. + NPatchDataPtr mData; + std::int16_t mReferenceCount; ///< The number of N-patch visuals that use this data. }; /** @@ -155,7 +166,7 @@ private: * image has no alpha channel * @return NPatchData pointer that Load function will used. */ - NPatchData* GetNPatchData(const VisualUrl& url, const Rect& border, bool& preMultiplyOnLoad); + NPatchDataPtr GetNPatchData(const VisualUrl& url, const Rect& border, bool& preMultiplyOnLoad); protected: /** @@ -171,6 +182,10 @@ protected: private: NPatchData::NPatchDataId mCurrentNPatchDataId; std::vector mCache; + + std::vector> mRemoveQueue; ///< Queue of textures to remove at PostProcess. It will be cleared after PostProcess. + + bool mRemoveProcessorRegistered : 1; ///< Flag if remove processor registered or not. }; } // namespace Internal