Stop trying to find the URL parameter multiple times from property map
[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 ) const;
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 Initialize the renderer with the geometry and shader from the cache, if not available, create and save to the cache for sharing.
138    */
139   void InitializeRenderer();
140
141   /**
142    * @brief Creates a geometry for this renderer's grid size
143    *
144    * @return Returns the created geometry for this renderer's grid size
145    */
146   Geometry CreateGeometry();
147
148   /**
149    * @brief Creates a shader for this renderer's grid size
150    *
151    * @return Returns the created shader for this renderer's grid size
152    */
153   Shader CreateShader();
154
155   /**
156    * @brief Creates a geometry for the grid size to be used by this visuals' shaders
157    *
158    * @param[in] gridSize The grid size of the solid geometry to create
159    * @return Returns the created geometry for the grid size
160    */
161   Geometry CreateGeometry( Uint16Pair gridSize );
162
163   /**
164    * @brief Creates a geometry with the border only for the grid size to be used by this visuals' shaders
165    * e.g. a 5x4 grid would create a geometry that would look like:
166    *
167    *   ---------------------
168    *   |  /|  /|  /|  /|  /|
169    *   |/  |/  |/  |/  |/  |
170    *   ---------------------
171    *   |  /|           |  /|
172    *   |/  |           |/  |
173    *   -----           -----
174    *   |  /|           |  /|
175    *   |/  |           |/  |
176    *   ---------------------
177    *   |  /|  /|  /|  /|  /|
178    *   |/  |/  |/  |/  |/  |
179    *   ---------------------
180    *
181    * @param[in] gridSize The grid size of the solid geometry to create
182    * @return Returns the created geometry for the grid size
183    */
184   Geometry CreateGeometryBorder( Uint16Pair gridSize );
185
186   /**
187    * @brief Creates Image from the image url and parses the image for the stretch borders. Will create a error image if the n patch image is invalid
188    *
189    * @param[in] nPatchImage The NinePatchImage to base our cropped images and stretch borders from
190    */
191   void InitializeFromImage( NinePatchImage nPatchImage );
192
193   /**
194    * @brief Creates an error Image to indicate that there was an error in either the image url or the parsing of the image
195    *
196    */
197   void InitializeFromBrokenImage();
198
199   /**
200    * @brief Applies this renderer's image to the sampler to the texture set used for this renderer
201    */
202   void ApplyImageToSampler();
203
204   /**
205    * @brief Changes the current renderer if the n-patch meta data has changed
206    *
207    * @param[in] oldBorderOnly The old flag indicating if the image should omit the centre of the n-patch and only render the border
208    * @param[in] oldGridX The old horizontal grid size of the solid geometry
209    * @param[in] oldGridY The old vertical grid size of the solid geometry
210    */
211   void ChangeRenderer( bool oldBorderOnly, size_t oldGridX, size_t oldGridY );
212
213 private:
214
215   NinePatchImage mImage; ///< The image to render if the visual was set from an NinePatchImage, empty otherwise
216   Image mCroppedImage;
217
218   std::string mImageUrl; ///< The url to the image resource to render if the visual was set from an image resource url, empty otherwise
219   NinePatchImage::StretchRanges mStretchPixelsX;
220   NinePatchImage::StretchRanges mStretchPixelsY;
221   ImageDimensions mImageSize;
222   bool mBorderOnly;
223 };
224
225 } // namespace Internal
226
227 } // namespace Toolkit
228
229 } // namespace Dali
230
231 #endif // DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H