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