Stop using ImageActor in PageTurnView
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / renderers / renderer-factory-cache.h
1 #ifndef __DALI_TOOLKIT_RENDERER_FACTORY_CACHE_H__
2 #define __DALI_TOOLKIT_RENDERER_FACTORY_CACHE_H__
3
4 /*
5  * Copyright (c) 2015 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 // INTERNAL INCLUDES
21 #include "svg/svg-rasterize-thread.h"
22
23 // EXTERNAL INCLUDES
24 #include <dali/public-api/math/uint-16-pair.h>
25 #include <dali/public-api/object/ref-object.h>
26 #include <dali/devel-api/rendering/geometry.h>
27 #include <dali/devel-api/rendering/shader.h>
28 #include <dali/devel-api/rendering/renderer.h>
29 #include <dali/devel-api/common/owner-container.h>
30 #include <dali/devel-api/object/weak-handle.h>
31
32
33 namespace Dali
34 {
35
36 namespace Toolkit
37 {
38
39 namespace Internal
40 {
41
42 /**
43  * Caches shaders and geometries. Owned by RenderFactory.
44  */
45 class RendererFactoryCache : public RefObject
46 {
47 public:
48
49   /**
50    * Type of shader for caching.
51    */
52   enum ShaderType
53   {
54     COLOR_SHADER,
55     BORDER_SHADER,
56     BORDER_SHADER_ANTI_ALIASING,
57     GRADIENT_SHADER_LINEAR_USER_SPACE,
58     GRADIENT_SHADER_LINEAR_BOUNDING_BOX,
59     GRADIENT_SHADER_RADIAL_USER_SPACE,
60     GRADIENT_SHADER_RADIAL_BOUNDING_BOX,
61     IMAGE_SHADER,
62     NINE_PATCH_SHADER,
63     SVG_SHADER,
64     SHADER_TYPE_MAX = SVG_SHADER
65   };
66
67   /**
68    * Type of geometry for caching.
69    */
70   enum GeometryType
71   {
72     QUAD_GEOMETRY,
73     BORDER_GEOMETRY,
74     NINE_PATCH_GEOMETRY,
75     NINE_PATCH_BORDER_GEOMETRY,
76     GEOMETRY_TYPE_MAX = NINE_PATCH_BORDER_GEOMETRY
77   };
78
79 public:
80
81   /**
82    * @brief Constructor
83    */
84   RendererFactoryCache();
85
86   /**
87    * Request geometry of the given type.
88    * @return The geometry of the required type if it exist in the cache. Otherwise, an empty handle is returned.
89    */
90   Geometry GetGeometry( GeometryType type );
91
92   /**
93    * Cache the geometry of the give type.
94    * @param[in] type The geometry type.
95    * @param[in] geometry The geometry for caching.
96    */
97   void SaveGeometry( GeometryType type, Geometry geometry);
98
99   /**
100    * Request shader of the given type.
101    * @return The shader of the required type if it exist in the cache. Otherwise, an empty handle is returned.
102    */
103   Shader GetShader( ShaderType type );
104
105   /**
106    * Cache the geometry of the give type.
107    * @param[in] type The geometry type.
108    * @param[in] geometry The geometry for caching.
109    */
110   void SaveShader( ShaderType type, Shader shader );
111
112   /*
113    * Greate the quad geometry.
114    * Quad geometry is shared by multiple kind of Renderer, so implement it in the factory-cache.
115    */
116   static Geometry CreateQuadGeometry();
117
118   /**
119    * Create the grid geometry.
120    * @param[in] gridSize The size of the grid.
121    * @return The created grid geometry.
122    */
123   static Geometry CreateGridGeometry( Uint16Pair gridSize );
124
125 public:
126
127   /**
128    * @brief Request renderer from the url
129    *
130    * @return The cached renderer if exist in the cache. Otherwise an empty handle is returned.
131    */
132   Renderer GetRenderer( const std::string& key ) const;
133
134   /**
135    * @brief Cache the renderer based on the given key.
136    *
137    * If the key already exists in the cache, then the cache will save an additional renderer to the cache.
138    * RemoveRenderer will then need to be called twice to remove both items from the cache.
139    *
140    * @param[in] key The key to use for caching
141    * @param[in] renderer The Renderer to be cached
142    */
143   void SaveRenderer( const std::string& key, Renderer& renderer );
144
145   /**
146    * @brief Cleans the renderer cache by removing the renderer from the cache based on the given key if there are no longer any references to it
147    *
148    * @param[in] key The key used for caching
149    *
150    * @return True if the renderer is no longer used anywhere, false otherwise
151    */
152   bool CleanRendererCache( const std::string& key );
153
154   /**
155    * @brief Cache the debug renderer
156    */
157   void CacheDebugRenderer( Renderer& renderer );
158
159   /**
160    * @brief Request the debug renderer;
161    */
162   Renderer GetDebugRenderer();
163
164   /**
165    * Get the SVG rasterization thread.
166    * @return A pointer pointing to the SVG rasterization thread.
167    */
168   SvgRasterizeThread* GetSVGRasterizationThread();
169
170 private: // for svg rasterization thread
171
172   /**
173    * Applies the rasterized image to material
174    */
175   void ApplyRasterizedSVGToSampler();
176
177 protected:
178
179   /**
180    * A reference counted object may only be deleted by calling Unreference()
181    */
182   virtual ~RendererFactoryCache();
183
184   /**
185    * Undefined copy constructor.
186    */
187   RendererFactoryCache(const RendererFactoryCache&);
188
189   /**
190    * Undefined assignment operator.
191    */
192   RendererFactoryCache& operator=(const RendererFactoryCache& rhs);
193
194 private:
195   struct CachedRenderer
196   {
197     std::string mKey;
198     WeakHandle< Renderer > mRenderer;
199
200     CachedRenderer( const std::string& key, Renderer& renderer )
201     : mKey( key ),
202       mRenderer( renderer)
203     {}
204   };
205
206   typedef Dali::Vector< std::size_t > HashVector;
207   typedef Dali::OwnerContainer< const CachedRenderer* > CachedRenderers;
208
209   /**
210    * @brief Finds the first index into the cached renderers from the url
211    *
212    * @return Returns the first index into the cached renderer from the url if it exists in the cache, otherwise returns -1
213    */
214   int FindRenderer( const std::string& key ) const;
215
216 private:
217   Geometry mGeometry[GEOMETRY_TYPE_MAX+1];
218   Shader mShader[SHADER_TYPE_MAX+1];
219
220   HashVector mRendererHashes;
221   CachedRenderers mRenderers;
222
223   Renderer mDebugRenderer;
224
225   SvgRasterizeThread*  mSvgRasterizeThread;
226 };
227
228 } // namespace Internal
229
230 } // namespace Toolkit
231
232 } // namespace Dali
233
234 #endif /*__DALI_TOOLKIT_RENDERER_FACTORY_CACHE_H__ */