Merge "Modified dali.i and dali-toolkit.i files to add support for the changes made...
[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 protected:
91
92   /**
93    * @brief Constructor.
94    *
95    * @param[in] factoryCache Reference to the VisualFactoryCache object
96    */
97   NPatchVisual( VisualFactoryCache& factoryCache );
98
99   /**
100    * @brief A reference counted object may only be deleted by calling Unreference().
101    */
102   virtual ~NPatchVisual();
103
104   /**
105    * @copydoc Visual::Base::DoSetProperties
106    */
107   virtual void DoSetProperties( const Property::Map& propertyMap );
108
109   /**
110    * @copydoc Visual::Base::DoSetOnStage
111    */
112   virtual void DoSetOnStage( Actor& actor );
113
114   /**
115    * @copydoc Visual::Base::DoSetOffStage
116    */
117   virtual void DoSetOffStage( Actor& actor );
118
119   /**
120    * @copydoc Visual::Base::OnSetTransform
121    */
122   virtual void OnSetTransform();
123
124 private:
125
126   /**
127    * @brief Creates a geometry for this renderer's grid size
128    *
129    * @return Returns the created geometry for this renderer's grid size
130    */
131   Geometry CreateGeometry();
132
133   /**
134    * @brief Creates a shader for this renderer's grid size
135    *
136    * @return Returns the created shader for this renderer's grid size
137    */
138   Shader CreateShader();
139
140   /**
141    * @brief Applies texture and related uniforms
142    */
143   void ApplyTextureAndUniforms();
144
145   /**
146    * Helper method to get the default Nine patch geometry from cache or create and store it there
147    * @param subType to use
148    * @return the geometry
149    */
150   Geometry GetNinePatchGeometry( VisualFactoryCache::GeometryType subType );
151
152   /**
153    * @brief Creates a geometry for the grid size to be used by this visuals' shaders
154    *
155    * @param[in] gridSize The grid size of the solid geometry to create
156    * @return Returns the created geometry for the grid size
157    */
158   Geometry CreateGridGeometry( Uint16Pair gridSize );
159
160   /**
161    * @brief Creates a geometry with the border only for the grid size to be used by this visuals' shaders
162    * e.g. a 5x4 grid would create a geometry that would look like:
163    *
164    *   ---------------------
165    *   |  /|  /|  /|  /|  /|
166    *   |/  |/  |/  |/  |/  |
167    *   ---------------------
168    *   |  /|           |  /|
169    *   |/  |           |/  |
170    *   -----           -----
171    *   |  /|           |  /|
172    *   |/  |           |/  |
173    *   ---------------------
174    *   |  /|  /|  /|  /|  /|
175    *   |/  |/  |/  |/  |/  |
176    *   ---------------------
177    *
178    * @param[in] gridSize The grid size of the solid geometry to create
179    * @return Returns the created geometry for the grid size
180    */
181   Geometry CreateBorderGeometry( Uint16Pair gridSize );
182
183 private:
184
185   NPatchLoader& mLoader;      ///< reference to N patch loader for fast access
186   std::string mImageUrl;      ///< The url to the N patch to load
187   std::size_t mId;            ///< id of the N patch (from loader/cache)
188   bool mBorderOnly;           ///< if only border is desired
189
190 };
191
192 } // namespace Internal
193
194 } // namespace Toolkit
195
196 } // namespace Dali
197
198 #endif // DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H