[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-factory-cache.h
1 #ifndef DALI_TOOLKIT_VISUAL_FACTORY_CACHE_H
2 #define DALI_TOOLKIT_VISUAL_FACTORY_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/devel-api/common/owner-container.h>
22 #include <dali/public-api/math/uint-16-pair.h>
23 #include <dali/public-api/object/ref-object.h>
24 #include <dali/public-api/rendering/geometry.h>
25 #include <dali/public-api/rendering/shader.h>
26
27 // INTERNAL INCLUDES
28 #include <dali-toolkit/internal/texture-manager/texture-manager-impl.h>
29 #include <dali-toolkit/internal/visuals/npatch-loader.h>
30 #include <dali/devel-api/rendering/renderer-devel.h>
31
32 namespace Dali
33 {
34 class Texture;
35
36 namespace Toolkit
37 {
38 namespace Internal
39 {
40 class ImageAtlasManager;
41 class NPatchLoader;
42 class TextureManager;
43 class VectorAnimationManager;
44
45 typedef IntrusivePtr<ImageAtlasManager> ImageAtlasManagerPtr;
46
47 /**
48  * Caches shaders and geometries. Owned by VisualFactory.
49  */
50 class VisualFactoryCache
51 {
52 public:
53   /**
54    * Type of shader for caching.
55    */
56   enum ShaderType
57   {
58     COLOR_SHADER,
59     COLOR_SHADER_ROUNDED_CORNER,
60     COLOR_SHADER_BORDERLINE,
61     COLOR_SHADER_ROUNDED_BORDERLINE,
62     COLOR_SHADER_BLUR_EDGE,
63     COLOR_SHADER_ROUNDED_CORNER_BLUR_EDGE,
64     BORDER_SHADER,
65     BORDER_SHADER_ANTI_ALIASING,
66     GRADIENT_SHADER_LINEAR_BOUNDING_BOX,
67     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_CORNER,
68     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_BORDERLINE,
69     GRADIENT_SHADER_LINEAR_BOUNDING_BOX_ROUNDED_BORDERLINE,
70     GRADIENT_SHADER_LINEAR_USER_SPACE,
71     GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_CORNER,
72     GRADIENT_SHADER_LINEAR_USER_SPACE_BORDERLINE,
73     GRADIENT_SHADER_LINEAR_USER_SPACE_ROUNDED_BORDERLINE,
74     GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
75     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_CORNER,
76     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_BORDERLINE,
77     GRADIENT_SHADER_RADIAL_BOUNDING_BOX_ROUNDED_BORDERLINE,
78     GRADIENT_SHADER_RADIAL_USER_SPACE,
79     GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_CORNER,
80     GRADIENT_SHADER_RADIAL_USER_SPACE_BORDERLINE,
81     GRADIENT_SHADER_RADIAL_USER_SPACE_ROUNDED_BORDERLINE,
82     IMAGE_SHADER,
83     IMAGE_SHADER_ROUNDED_CORNER,
84     IMAGE_SHADER_BORDERLINE,
85     IMAGE_SHADER_ROUNDED_BORDERLINE,
86     IMAGE_SHADER_MASKING,
87     IMAGE_SHADER_ROUNDED_CORNER_MASKING,
88     IMAGE_SHADER_BORDERLINE_MASKING,
89     IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
90     IMAGE_SHADER_ATLAS_DEFAULT_WRAP,
91     IMAGE_SHADER_ATLAS_CUSTOM_WRAP,
92     IMAGE_SHADER_YUV_TO_RGB,
93     IMAGE_SHADER_ROUNDED_CORNER_YUV_TO_RGB,
94     IMAGE_SHADER_BORDERLINE_YUV_TO_RGB,
95     IMAGE_SHADER_ROUNDED_BORDERLINE_YUV_TO_RGB,
96     NATIVE_IMAGE_SHADER,
97     NATIVE_IMAGE_SHADER_ROUNDED_CORNER,
98     NATIVE_IMAGE_SHADER_BORDERLINE,
99     NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE,
100     NATIVE_IMAGE_SHADER_MASKING,
101     NATIVE_IMAGE_SHADER_ROUNDED_CORNER_MASKING,
102     NATIVE_IMAGE_SHADER_BORDERLINE_MASKING,
103     NATIVE_IMAGE_SHADER_ROUNDED_BORDERLINE_MASKING,
104     NINE_PATCH_SHADER,
105     NINE_PATCH_MASK_SHADER,
106     TEXT_SHADER_SINGLE_COLOR_TEXT,
107     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE,
108     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_OVERLAY,
109     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_OVERLAY,
110     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI,
111     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI,
112     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_OVERLAY_AND_EMOJI,
113     TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_OVERLAY_AND_EMOJI,
114     TEXT_SHADER_MULTI_COLOR_TEXT,
115     TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE,
116     TEXT_SHADER_MULTI_COLOR_TEXT_WITH_OVERLAY,
117     TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE_AND_OVERLAY,
118     ANIMATED_GRADIENT_SHADER_LINEAR_BOUNDING_REFLECT,
119     ANIMATED_GRADIENT_SHADER_LINEAR_BOUNDING_REPEAT,
120     ANIMATED_GRADIENT_SHADER_LINEAR_BOUNDING_CLAMP,
121     ANIMATED_GRADIENT_SHADER_LINEAR_USER_REFLECT,
122     ANIMATED_GRADIENT_SHADER_LINEAR_USER_REPEAT,
123     ANIMATED_GRADIENT_SHADER_LINEAR_USER_CLAMP,
124     ANIMATED_GRADIENT_SHADER_RADIAL_BOUNDING_REFLECT,
125     ANIMATED_GRADIENT_SHADER_RADIAL_BOUNDING_REPEAT,
126     ANIMATED_GRADIENT_SHADER_RADIAL_BOUNDING_CLAMP,
127     ANIMATED_GRADIENT_SHADER_RADIAL_USER_REFLECT,
128     ANIMATED_GRADIENT_SHADER_RADIAL_USER_REPEAT,
129     ANIMATED_GRADIENT_SHADER_RADIAL_USER_CLAMP,
130     WIREFRAME_SHADER,
131     ARC_BUTT_CAP_SHADER,
132     ARC_ROUND_CAP_SHADER,
133     SHADER_TYPE_MAX = ARC_ROUND_CAP_SHADER
134   };
135
136   /**
137    * Type of geometry for caching.
138    */
139   enum GeometryType
140   {
141     QUAD_GEOMETRY,
142     BORDER_GEOMETRY,
143     NINE_PATCH_GEOMETRY,
144     NINE_PATCH_BORDER_GEOMETRY,
145     WIREFRAME_GEOMETRY,
146     GEOMETRY_TYPE_MAX = WIREFRAME_GEOMETRY
147   };
148
149 public:
150   /**
151    * @brief Constructor
152    *
153    * @param[in] preMultiplyOnLoad True if image visuals should pre-multiply alpha on image load.
154    */
155   VisualFactoryCache(bool preMultiplyOnLoad);
156
157   /**
158    * @brief Destructor
159    */
160   ~VisualFactoryCache();
161
162   /**
163    * Request geometry of the given type.
164    * @return The geometry of the required type if it exist in the cache. Otherwise, an empty handle is returned.
165    */
166   Geometry GetGeometry(GeometryType type);
167
168   /**
169    * Cache the geometry of the give type.
170    * @param[in] type The geometry type.
171    * @param[in] geometry The geometry for caching.
172    */
173   void SaveGeometry(GeometryType type, Geometry geometry);
174
175   /**
176    * Request shader of the given type.
177    * @return The shader of the required type if it exist in the cache. Otherwise, an empty handle is returned.
178    */
179   Shader GetShader(ShaderType type);
180
181   /**
182    * Cache the geometry of the give type.
183    * @param[in] type The geometry type.
184    * @param[in] geometry The geometry for caching.
185    */
186   void SaveShader(ShaderType type, Shader shader);
187
188   /*
189    * Greate the quad geometry.
190    * Quad geometry is shared by multiple kind of Renderer, so implement it in the factory-cache.
191    */
192   static Geometry CreateQuadGeometry();
193
194   /**
195    * Create the grid geometry.
196    * @param[in] gridSize The size of the grid.
197    * @return The created grid geometry.
198    */
199   static Geometry CreateGridGeometry(Uint16Pair gridSize);
200
201   /**
202    * @copydoc Toolkit::VisualFactory::SetPreMultiplyOnLoad()
203    */
204   void SetPreMultiplyOnLoad(bool preMultiply);
205
206   /**
207    * @copydoc Toolkit::VisualFactory::GetPreMultiplyOnLoad()
208    */
209   bool GetPreMultiplyOnLoad();
210
211   /**
212    * @brief Set an image to be used when a visual has failed to correctly render
213    * @param[in] brokenImageUrlList The broken image url list
214    */
215   void SetBrokenImageUrl(std::string& defaultBrokenUrl, const std::vector<std::string>& brokenImageUrlList);
216
217   /**
218    * @brief Update the broken image Renderer object
219    * @param[in,out] renderer renderer for broken image
220    * @param[in] size the size of actor
221    * @param[in] rendererIsImage True if input renderer use image shader already.
222    *                            If true, we don't need to create new renderer when broken image is single image.
223    *                            Most of user experience use normal images. So It can reduce runtime.
224    */
225   void UpdateBrokenImageRenderer(Renderer& renderer, const Vector2& size, const bool& rendererIsImage = true);
226
227 public:
228   /**
229    * Get the image atlas manager.
230    * @return A pointer to the atlas manager
231    */
232   ImageAtlasManagerPtr GetAtlasManager();
233
234   /**
235    * Get the texture manager
236    * @return A reference to the texture manager
237    */
238   TextureManager& GetTextureManager();
239
240   /**
241    * Get the N-Patch texture cache.
242    * @return A reference to the N patch loader
243    */
244   NPatchLoader& GetNPatchLoader();
245
246   /**
247    * Get the vector animation manager.
248    * @return A reference to the vector animation manager.
249    */
250   VectorAnimationManager& GetVectorAnimationManager();
251
252 protected:
253   /**
254    * Undefined copy constructor.
255    */
256   VisualFactoryCache(const VisualFactoryCache&);
257
258   /**
259    * Undefined assignment operator.
260    */
261   VisualFactoryCache& operator=(const VisualFactoryCache& rhs);
262
263 private:
264   /**
265    * @brief Returns a cached Texture to use when a visual has failed to correctly render
266    * @param[in] brokenIndex The index of broken image
267    *
268    * @return The broken image texture.
269    */
270   Texture GetBrokenVisualImage(uint32_t brokenIndex);
271
272   /**
273    * @brief Gets the Proper broken image index
274    * @param[in] size The size of actor
275    *
276    * @return The index of broken image
277    */
278   int32_t GetProperBrokenImageIndex(const Vector2& size);
279
280   /**
281    * @brief Apply a texture and uniforms
282    *
283    * @param[in,out] renderer The renderer for broken image
284    * @param[in] index The index of broken image
285    */
286   void ApplyTextureAndUniforms(Renderer& renderer, int index);
287
288   /**
289    * @brief Gets a geometry for npatch image
290    *
291    * @param[in] index the index of broken image
292    * @return The Geometry for NPatch
293    */
294   Geometry GetNPatchGeometry(int index);
295
296   /**
297    * @brief Gets the Npatch Shader object
298    *
299    * @param[in] index The index of broken image
300    * @return The Shader for NPatch
301    */
302   Shader GetNPatchShader(int index);
303
304   /**
305    * @brief Returns a broken image type
306    * @param[in] index BrokenImage index
307    * @return The broken image type.
308    */
309   VisualUrl::Type GetBrokenImageVisualType(int index);
310
311 private:
312   struct BrokenImageInfo
313   {
314     BrokenImageInfo()
315     : visualType(),
316       url(""),
317       npatchId(NPatchData::INVALID_NPATCH_DATA_ID),
318       texture(),
319       width(0),
320       height(0)
321     {
322     }
323
324     ~BrokenImageInfo()
325     {
326     }
327
328     // Data
329     VisualUrl::Type          visualType;
330     std::string              url;
331     NPatchData::NPatchDataId npatchId;
332     Texture                  texture;
333     uint32_t                 width;
334     uint32_t                 height;
335   };
336
337   Geometry mGeometry[GEOMETRY_TYPE_MAX + 1];
338   Shader   mShader[SHADER_TYPE_MAX + 1];
339
340   ImageAtlasManagerPtr mAtlasManager;
341   TextureManager       mTextureManager;
342   NPatchLoader         mNPatchLoader;
343
344   std::unique_ptr<VectorAnimationManager> mVectorAnimationManager;
345   bool                                    mPreMultiplyOnLoad;
346   std::vector<BrokenImageInfo>            mBrokenImageInfoContainer;
347   std::string                             mDefaultBrokenImageUrl;
348   bool                                    mUseDefaultBrokenImageOnly;
349 };
350
351 } // namespace Internal
352
353 } // namespace Toolkit
354
355 } // namespace Dali
356
357 #endif // DALI_TOOLKIT_VISUAL_FACTORY_CACHE_H