Fix for cursor position.
[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    * Create the grid geometry.
114    * @param[in] gridSize The size of the grid.
115    * @return The created grid geometry.
116    */
117   static Geometry CreateGridGeometry( Uint16Pair gridSize );
118
119 public:
120
121   /**
122    * @brief Request renderer from the url
123    *
124    * @return The cached renderer if exist in the cache. Otherwise an empty handle is returned.
125    */
126   Renderer GetRenderer( const std::string& key ) const;
127
128   /**
129    * @brief Cache the renderer based on the given key.
130    *
131    * If the key already exists in the cache, then the cache will save an additional renderer to the cache.
132    * RemoveRenderer will then need to be called twice to remove both items from the cache.
133    *
134    * @param[in] key The key to use for caching
135    * @param[in] renderer The Renderer to be cached
136    */
137   void SaveRenderer( const std::string& key, Renderer& renderer );
138
139   /**
140    * @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
141    *
142    * @param[in] key The key used for caching
143    *
144    * @return True if the renderer is no longer used anywhere, false otherwise
145    */
146   bool CleanRendererCache( const std::string& key );
147
148   /**
149    * @brief Cache the debug renderer
150    */
151   void CacheDebugRenderer( Renderer& renderer );
152
153   /**
154    * @brief Request the debug renderer;
155    */
156   Renderer GetDebugRenderer();
157
158   /**
159    * Get the SVG rasterization thread.
160    * @return A pointer pointing to the SVG rasterization thread.
161    */
162   SvgRasterizeThread* GetSVGRasterizationThread();
163
164 private: // for svg rasterization thread
165
166   /**
167    * Applies the rasterized image to material
168    */
169   void ApplyRasterizedSVGToSampler();
170
171 protected:
172
173   /**
174    * A reference counted object may only be deleted by calling Unreference()
175    */
176   virtual ~RendererFactoryCache();
177
178   /**
179    * Undefined copy constructor.
180    */
181   RendererFactoryCache(const RendererFactoryCache&);
182
183   /**
184    * Undefined assignment operator.
185    */
186   RendererFactoryCache& operator=(const RendererFactoryCache& rhs);
187
188 private:
189   struct CachedRenderer
190   {
191     std::string mKey;
192     WeakHandle< Renderer > mRenderer;
193
194     CachedRenderer( const std::string& key, Renderer& renderer )
195     : mKey( key ),
196       mRenderer( renderer)
197     {}
198   };
199
200   typedef Dali::Vector< std::size_t > HashVector;
201   typedef Dali::OwnerContainer< const CachedRenderer* > CachedRenderers;
202
203   /**
204    * @brief Finds the first index into the cached renderers from the url
205    *
206    * @return Returns the first index into the cached renderer from the url if it exists in the cache, otherwise returns -1
207    */
208   int FindRenderer( const std::string& key ) const;
209
210 private:
211   Geometry mGeometry[GEOMETRY_TYPE_MAX+1];
212   Shader mShader[SHADER_TYPE_MAX+1];
213
214   HashVector mRendererHashes;
215   CachedRenderers mRenderers;
216
217   Renderer mDebugRenderer;
218
219   SvgRasterizeThread*  mSvgRasterizeThread;
220 };
221
222 } // namespace Internal
223
224 } // namespace Toolkit
225
226 } // namespace Dali
227
228 #endif /*__DALI_TOOLKIT_RENDERER_FACTORY_CACHE_H__ */