Refactoring Animated image visual
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / animated-image / rolling-image-cache.h
1 #ifndef DALI_TOOLKIT_INTERNAL_ROLLING_IMAGE_CACHE_H
2 #define DALI_TOOLKIT_INTERNAL_ROLLING_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/common/circular-queue.h>
24
25 namespace Dali
26 {
27 namespace Toolkit
28 {
29 namespace Internal
30 {
31 /**
32  * Class to manage a rolling cache of images, where the cache size
33  * is smaller than the total number of images.
34  */
35 class RollingImageCache : public ImageCache, public TextureUploadObserver
36 {
37 public:
38   /**
39    * Constructor.
40    * @param[in] textureManager The texture manager
41    * @param[in] urlList List of urls to cache
42    * @param[in] observer FrameReady observer
43    * @param[in] cacheSize The size of the cache
44    * @param[in] batchSize The size of a batch to load
45    * @param[in] interval Time interval between each frame
46    *
47    * This will start loading textures immediately, according to the
48    * batch and cache sizes.
49    */
50   RollingImageCache(TextureManager&                 textureManager,
51                     UrlList&                        urlList,
52                     ImageCache::FrameReadyObserver& observer,
53                     uint16_t                        cacheSize,
54                     uint16_t                        batchSize,
55                     uint32_t                        interval);
56
57   /**
58    * Destructor
59    */
60   ~RollingImageCache() override;
61
62   /**
63    * @copydoc Internal::ImageCache::Frame()
64    */
65   TextureSet Frame(uint32_t frameIndex) override;
66
67   /**
68    * @copydoc Internal::ImageCache::FirstFrame()
69    */
70   TextureSet FirstFrame() override;
71
72   /**
73    * @copydoc Internal::ImageCache::GetFrameInterval()
74    */
75   uint32_t GetFrameInterval(uint32_t frameIndex) const override;
76
77   /**
78    * @copydoc Internal::ImageCache::GetCurrentFrameIndex()
79    */
80   int32_t GetCurrentFrameIndex() const override;
81
82   /**
83    * @copydoc Internal::ImageCache::GetTotalFrameCount()
84    */
85   int32_t GetTotalFrameCount() const override;
86
87   /**
88    * @copydoc Internal::ImageCache::ClearCache()
89    */
90   void ClearCache() override;
91
92 private:
93   /**
94    * @brief Check whether the front frame is ready or not.
95    *
96    * @return true if the front frame is ready
97    */
98   bool IsFrontReady() const;
99
100   /**
101    * @brief Load the next batch of images
102    *
103    * @param[in] frameIndex starting frame index of batch to be loaded.
104    */
105   void LoadBatch(uint32_t frameIndex);
106
107   /**
108    * @brief Get the texture set of the front frame.
109    *
110    * @return the texture set of the front of Cache.
111    */
112   TextureSet GetFrontTextureSet() const;
113
114   /**
115    * @brief Get the texture id of the given index
116    *
117    * @param[in] index index of the queue.
118    */
119   TextureManager::TextureId GetCachedTextureId(int index) const;
120
121   /**
122    * @brief Check if the front frame has become ready - if so, inform observer
123    *
124    * @param[in] wasReady Readiness before call.
125    */
126   void CheckFrontFrame(bool wasReady);
127
128 protected:
129   /**
130    * @copydoc Toolkit::TextureUploadObserver::LoadComplete()
131    */
132   void LoadComplete(bool loadSuccess, TextureInformation textureInformation) override;
133
134 private:
135   /**
136    * Secondary class to hold readiness and index into url
137    */
138   struct ImageFrame
139   {
140     unsigned int mUrlIndex = 0u;
141     bool         mReady    = false;
142   };
143
144   std::vector<UrlStore>&                 mImageUrls;
145   CircularQueue<ImageFrame>              mQueue;
146 };
147
148 } // namespace Internal
149 } // namespace Toolkit
150 } // namespace Dali
151
152 #endif