CPU Alpha Masking for Animated Image Visual
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / animated-image / rolling-animated-image-cache.h
1 #ifndef DALI_TOOLKIT_INTERNAL_ROLLING_ANIMATED_IMAGE_CACHE_H
2 #define DALI_TOOLKIT_INTERNAL_ROLLING_ANIMATED_IMAGE_CACHE_H
3
4 /*
5  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 // EXTERNAL INCLUDES
21 #include <dali-toolkit/internal/texture-manager/texture-manager-impl.h>
22 #include <dali-toolkit/internal/visuals/animated-image/image-cache.h>
23 #include <dali/devel-api/adaptor-framework/animated-image-loading.h>
24 #include <dali/devel-api/common/circular-queue.h>
25
26 namespace Dali
27 {
28 namespace Toolkit
29 {
30 namespace Internal
31 {
32 /**
33  * Class to manage a rolling cache of Animated images, where the cache size
34  * is smaller than the total number of images.
35  *
36  * Frames are always ready, so the observer.FrameReady callback is never triggered;
37  * the FirstFrame and NextFrame APIs will always return a texture.
38  */
39 class RollingAnimatedImageCache : public ImageCache, public TextureUploadObserver
40 {
41 public:
42   /**
43    * @brief Constructor.
44    * @param[in] textureManager       The texture manager
45    * @param[in] animatedImageLoading  The loaded animated image
46    * @param[in] maskingData          Masking data to be applied.
47    * @param[in] observer             FrameReady observer
48    * @param[in] cacheSize            The size of the cache
49    * @param[in] batchSize            The size of a batch to load
50    * @param[in] isSynchronousLoading The flag to define whether to load first frame synchronously
51    *
52    * This will start loading textures immediately, according to the
53    * batch and cache sizes.
54    */
55   RollingAnimatedImageCache(TextureManager&                     textureManager,
56                             AnimatedImageLoading&               animatedImageLoading,
57                             TextureManager::MaskingDataPointer& maskingData,
58                             ImageCache::FrameReadyObserver&     observer,
59                             uint16_t                            cacheSize,
60                             uint16_t                            batchSize,
61                             bool                                isSynchronousLoading);
62
63   /**
64    * @brief Destructor
65    */
66   ~RollingAnimatedImageCache() override;
67
68   /**
69    * @copydoc Internal::ImageCache::Frame()
70    */
71   TextureSet Frame(uint32_t frameIndex) override;
72
73   /**
74    * @copydoc Internal::ImageCache::FirstFrame()
75    */
76   TextureSet FirstFrame() override;
77
78   /**
79    * @copydoc Internal::ImageCache::GetFrameInterval()
80    */
81   uint32_t GetFrameInterval(uint32_t frameIndex) const override;
82
83   /**
84    * @copydoc Internal::ImageCache::GetCurrentFrameIndex()
85    */
86   int32_t GetCurrentFrameIndex() const override;
87
88   /**
89    * @copydoc Internal::ImageCache::GetTotalFrameCount()
90    */
91   int32_t GetTotalFrameCount() const override;
92
93   /**
94    * @copydoc Internal::ImageCache::ClearCache()
95    */
96   void ClearCache() override;
97
98 private:
99   /**
100    * @brief Check whether the front frame is ready or not.
101    *
102    * @return true if the front frame is ready
103    */
104   bool IsFrontReady() const;
105
106   /**
107    * @brief Request to Load a frame
108    *
109    * @param[in] frameIndex          index of frame to be loaded.
110    * @param[in] useCache            true if this frame loading uses cache.
111    * @param[in] synchronousLoading  true if the frame should be loaded synchronously
112    *
113    * @return the texture set currently loaded.
114    */
115   TextureSet RequestFrameLoading(uint32_t frameIndex, bool useCache, bool synchronousLoading);
116
117   /**
118    * @brief Load the next batch of images
119    *
120    * @param[in] frameIndex starting frame index of batch to be loaded.
121    */
122   void LoadBatch(uint32_t frameIndex);
123
124   /**
125    * @brief Find the matching image frame, and set it to ready
126    *
127    * @param[in] textureId texture id to be marked as ready.
128    */
129   void SetImageFrameReady(TextureManager::TextureId textureId);
130
131   /**
132    * @brief Get the texture set of the front frame.
133    *
134    * @return the texture set of the front of Cache.
135    */
136   TextureSet GetFrontTextureSet() const;
137
138   /**
139    * @brief Get the texture id of the given index
140    *
141    * @param[in] index index of the queue.
142    */
143   TextureManager::TextureId GetCachedTextureId(int index) const;
144
145   /**
146    * @brief Make the loaded frame ready and notify it to the texture upload observer
147    *
148    * @param[in] loadSuccess whether the loading is succeded or not.
149    * @param[in] textureSet textureSet for this frame.
150    * @param[in] interval interval between this frame and next frame.
151    */
152   void MakeFrameReady(bool loadSuccess, TextureSet textureSet, uint32_t interval);
153
154   /**
155    * @brief Pop front entity of Cache.
156    */
157   void PopFrontCache();
158
159 protected:
160   /**
161    * @copydoc Toolkit::TextureUploadObserver::LoadComplete()
162    */
163   void LoadComplete(bool loadSuccess, TextureInformation textureInformation) override;
164
165 private:
166
167   /**
168    * Secondary class to hold readiness and index into url
169    */
170   struct ImageFrame
171   {
172     uint32_t mFrameNumber = 0u;
173     bool     mReady       = false;
174   };
175
176   Dali::AnimatedImageLoading mAnimatedImageLoading;
177   uint32_t                   mFrameCount;
178   uint32_t                   mFrameIndex;
179   uint32_t                   mCacheSize;
180   std::vector<UrlStore>      mImageUrls;
181   std::vector<int32_t>       mIntervals;
182   std::vector<uint32_t>      mLoadWaitingQueue;
183   CircularQueue<ImageFrame>  mQueue;
184   bool                       mIsSynchronousLoading;
185 };
186
187 } // namespace Internal
188
189 } // namespace Toolkit
190
191 } // namespace Dali
192
193 #endif //DALI_TOOLKIT_INTERNAL_ROLLING_ANIMATED_IMAGE_CACHE_H