Cache NPatch textures
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / npatch / npatch-visual.h
1 #ifndef DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H
2 #define DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H
3
4 /*
5  * Copyright (c) 2016 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
21 // EXTERNAL INCLUDES
22 #include <dali/public-api/common/intrusive-ptr.h>
23 #include <dali/public-api/images/image.h>
24 #include <dali/public-api/images/image-operations.h>
25 #include <dali/devel-api/images/nine-patch-image.h>
26 #include <dali/public-api/rendering/geometry.h>
27 #include <dali/public-api/rendering/sampler.h>
28 #include <dali/public-api/rendering/shader.h>
29
30 // INTERNAL INCLUDES
31 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
32
33 namespace Dali
34 {
35
36 namespace Toolkit
37 {
38
39 namespace Internal
40 {
41
42 class NPatchVisual;
43 typedef IntrusivePtr< NPatchVisual > NPatchVisualPtr;
44
45 /**
46  * The visual which renders an 9 patch image to the control's quad
47  *
48  * The following properties are optional
49  *
50  * | %Property Name           | Type             |
51  * |--------------------------|------------------|
52  * | url                      | STRING           |
53  * | borderOnly               | BOOLEAN
54  *
55  */
56 class NPatchVisual: public Visual::Base
57 {
58 public:
59
60   /**
61    * @brief Create an N-patch visual using an image URL.
62    *
63    * The visual will load the image synchronously when the associated actor is put on stage, and destroy the image when it is off stage
64    *
65    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
66    * @param[in] imageUrl The URL to 9 patch image resource to use
67    */
68   static NPatchVisualPtr New( VisualFactoryCache& factoryCache, const std::string& imageUrl );
69
70   /**
71    * @brief Create an N-patch visual with a NinePatchImage resource.
72    *
73    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
74    * @param[in] image The NinePatchImage to use
75    */
76   static NPatchVisualPtr New( VisualFactoryCache& factoryCache, NinePatchImage image );
77
78 public:  // from Visual
79
80   /**
81    * @copydoc Visual::Base::GetNaturalSize
82    */
83   virtual void GetNaturalSize( Vector2& naturalSize );
84
85   /**
86    * @copydoc Visual::Base::CreatePropertyMap
87    */
88   virtual void DoCreatePropertyMap( Property::Map& map ) const;
89
90   /**
91    * @copydoc Visual::Base::DoSetProperty
92    */
93   virtual void DoSetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue );
94
95   /**
96    * @copydoc Visual::Base::DoGetProperty
97    */
98   virtual Dali::Property::Value DoGetProperty( Dali::Property::Index index );
99
100 protected:
101
102   /**
103    * @brief Constructor.
104    *
105    * @param[in] factoryCache Reference to the VisualFactoryCache object
106    */
107   NPatchVisual( VisualFactoryCache& factoryCache );
108
109   /**
110    * @brief A reference counted object may only be deleted by calling Unreference().
111    */
112   virtual ~NPatchVisual();
113
114   /**
115    * @copydoc Visual::Base::DoSetProperties
116    */
117   virtual void DoSetProperties( const Property::Map& propertyMap );
118
119   /**
120    * @copydoc Visual::Base::DoSetOnStage
121    */
122   virtual void DoSetOnStage( Actor& actor );
123
124   /**
125    * @copydoc Visual::Base::DoSetOffStage
126    */
127   virtual void DoSetOffStage( Actor& actor );
128
129   /**
130    * @copydoc Visual::Base::OnSetTransform
131    */
132   virtual void OnSetTransform();
133
134 private:
135
136   /**
137    * @brief Creates a geometry for this renderer's grid size
138    *
139    * @return Returns the created geometry for this renderer's grid size
140    */
141   Geometry CreateGeometry();
142
143   /**
144    * @brief Creates a shader for this renderer's grid size
145    *
146    * @return Returns the created shader for this renderer's grid size
147    */
148   Shader CreateShader();
149
150   /**
151    * @brief Applies texture and related uniforms
152    */
153   void ApplyTextureAndUniforms();
154
155   /**
156    * Helper method to get the default Nine patch geometry from cache or create and store it there
157    * @param subType to use
158    * @return the geometry
159    */
160   Geometry GetNinePatchGeometry( VisualFactoryCache::GeometryType subType );
161
162   /**
163    * @brief Creates a geometry for the grid size to be used by this visuals' shaders
164    *
165    * @param[in] gridSize The grid size of the solid geometry to create
166    * @return Returns the created geometry for the grid size
167    */
168   Geometry CreateGridGeometry( Uint16Pair gridSize );
169
170   /**
171    * @brief Creates a geometry with the border only for the grid size to be used by this visuals' shaders
172    * e.g. a 5x4 grid would create a geometry that would look like:
173    *
174    *   ---------------------
175    *   |  /|  /|  /|  /|  /|
176    *   |/  |/  |/  |/  |/  |
177    *   ---------------------
178    *   |  /|           |  /|
179    *   |/  |           |/  |
180    *   -----           -----
181    *   |  /|           |  /|
182    *   |/  |           |/  |
183    *   ---------------------
184    *   |  /|  /|  /|  /|  /|
185    *   |/  |/  |/  |/  |/  |
186    *   ---------------------
187    *
188    * @param[in] gridSize The grid size of the solid geometry to create
189    * @return Returns the created geometry for the grid size
190    */
191   Geometry CreateBorderGeometry( Uint16Pair gridSize );
192
193 private:
194
195   NPatchLoader& mLoader;      ///< reference to N patch loader for fast access
196   std::string mImageUrl;      ///< The url to the N patch to load
197   std::size_t mId;            ///< id of the N patch (from loader/cache)
198   bool mBorderOnly;           ///< if only border is desired
199
200 };
201
202 } // namespace Internal
203
204 } // namespace Toolkit
205
206 } // namespace Dali
207
208 #endif // DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H