Remove useless iteration when debug mode
[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] maskingData    Masking data to be applied.
43    * @param[in] observer       FrameReady observer
44    * @param[in] cacheSize      The size of the cache
45    * @param[in] batchSize      The size of a batch to load
46    * @param[in] interval       Time interval between each frame
47    *
48    * This will start loading textures immediately, according to the
49    * batch and cache sizes.
50    */
51   RollingImageCache(TextureManager&                     textureManager,
52                     UrlList&                            urlList,
53                     TextureManager::MaskingDataPointer& maskingData,
54                     ImageCache::FrameReadyObserver&     observer,
55                     uint16_t                            cacheSize,
56                     uint16_t                            batchSize,
57                     uint32_t                            interval);
58
59   /**
60    * Destructor
61    */
62   ~RollingImageCache() override;
63
64   /**
65    * @copydoc Internal::ImageCache::Frame()
66    */
67   TextureSet Frame(uint32_t frameIndex) override;
68
69   /**
70    * @copydoc Internal::ImageCache::FirstFrame()
71    */
72   TextureSet FirstFrame() override;
73
74   /**
75    * @copydoc Internal::ImageCache::GetFrameInterval()
76    */
77   uint32_t GetFrameInterval(uint32_t frameIndex) const override;
78
79   /**
80    * @copydoc Internal::ImageCache::GetCurrentFrameIndex()
81    */
82   int32_t GetCurrentFrameIndex() const override;
83
84   /**
85    * @copydoc Internal::ImageCache::GetTotalFrameCount()
86    */
87   int32_t GetTotalFrameCount() const override;
88
89   /**
90    * @copydoc Internal::ImageCache::ClearCache()
91    */
92   void ClearCache() override;
93
94 private:
95   /**
96    * @brief Check whether the front frame is ready or not.
97    *
98    * @return true if the front frame is ready
99    */
100   bool IsFrontReady() const;
101
102   /**
103    * @brief Load the next batch of images
104    *
105    * @param[in] frameIndex starting frame index of batch to be loaded.
106    */
107   void LoadBatch(uint32_t frameIndex);
108
109   /**
110    * @brief Get the texture set of the front frame.
111    *
112    * @return the texture set of the front of Cache.
113    */
114   TextureSet GetFrontTextureSet() const;
115
116   /**
117    * @brief Get the texture id of the given index
118    *
119    * @param[in] index index of the queue.
120    */
121   TextureManager::TextureId GetCachedTextureId(int index) const;
122
123   /**
124    * @brief Pop front entity of Cache.
125    */
126   void PopFrontCache();
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