Remove/Move experimental features
[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 // INTERNAL INCLUDES
22 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
23
24 // EXTERNAL INCLUDES
25 #include <dali/public-api/images/image.h>
26 #include <dali/public-api/images/image-operations.h>
27 #include <dali/devel-api/images/nine-patch-image.h>
28 #include <dali/public-api/rendering/geometry.h>
29 #include <dali/public-api/rendering/sampler.h>
30 #include <dali/public-api/rendering/shader.h>
31
32 namespace Dali
33 {
34
35 namespace Toolkit
36 {
37
38 namespace Internal
39 {
40
41 /**
42  * The visual which renders an 9 patch image to the control's quad
43  *
44  * The following properties are optional
45  *
46  * | %Property Name           | Type             |
47  * |--------------------------|------------------|
48  * | url                      | STRING           |
49  * | borderOnly               | BOOLEAN
50  *
51  */
52 class NPatchVisual: public Visual::Base
53 {
54 public:
55
56   /**
57    * @brief Constructor.
58    *
59    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
60    */
61   NPatchVisual( VisualFactoryCache& factoryCache );
62
63   /**
64    * @brief A reference counted object may only be deleted by calling Unreference().
65    */
66   ~NPatchVisual();
67
68 public:  // from Visual
69
70   /**
71    * @copydoc Visual::Base::GetNaturalSize
72    */
73   virtual void GetNaturalSize( Vector2& naturalSize ) const;
74
75   /**
76    * @copydoc Visual::Base::CreatePropertyMap
77    */
78   virtual void DoCreatePropertyMap( Property::Map& map ) const;
79
80 protected:
81
82   /**
83    * @copydoc Visual::Base::DoInitialize
84    */
85   virtual void DoInitialize( Actor& actor, const Property::Map& propertyMap );
86
87   /**
88    * @copydoc Visual::Base::DoSetOnStage
89    */
90   virtual void DoSetOnStage( Actor& actor );
91
92   /**
93    * @copydoc Visual::Base::DoSetOffStage
94    */
95   virtual void DoSetOffStage( Actor& actor );
96
97 public:
98
99   /**
100    * @brief Sets the 9 patch image of this visual to the resource at imageUrl
101    * The visual will load the image synchronously when the associated actor is put on stage, and destroy the image when it is off stage
102    *
103    * @param[in] imageUrl The URL to 9 patch image resource to use
104    * @param[in] borderOnly A Flag to indicate if the image should omit the centre of the n-patch and only render the border
105    */
106   void SetImage( const std::string& imageUrl, bool borderOnly = false );
107
108   /**
109    * @brief Sets the 9 patch image of this viusal to the 9 patch image
110    *
111    * @param[in] image The NinePatchImage to use
112    * @param[in] borderOnly A Flag to indicate if the image should omit the centre of the n-patch and only render the border
113    */
114   void SetImage( NinePatchImage image, bool borderOnly = false );
115
116 private:
117
118   /**
119    * @brief Initialize the renderer with the geometry and shader from the cache, if not available, create and save to the cache for sharing.
120    */
121   void InitializeRenderer();
122
123   /**
124    * @brief Creates a geometry for this renderer's grid size
125    *
126    * @return Returns the created geometry for this renderer's grid size
127    */
128   Geometry CreateGeometry();
129
130   /**
131    * @brief Creates a shader for this renderer's grid size
132    *
133    * @return Returns the created shader for this renderer's grid size
134    */
135   Shader CreateShader();
136
137   /**
138    * @brief Creates a geometry for the grid size to be used by this visuals' shaders
139    *
140    * @param[in] gridSize The grid size of the solid geometry to create
141    * @return Returns the created geometry for the grid size
142    */
143   Geometry CreateGeometry( Uint16Pair gridSize );
144
145   /**
146    * @brief Creates a geometry with the border only for the grid size to be used by this visuals' shaders
147    * e.g. a 5x4 grid would create a geometry that would look like:
148    *
149    *   ---------------------
150    *   |  /|  /|  /|  /|  /|
151    *   |/  |/  |/  |/  |/  |
152    *   ---------------------
153    *   |  /|           |  /|
154    *   |/  |           |/  |
155    *   -----           -----
156    *   |  /|           |  /|
157    *   |/  |           |/  |
158    *   ---------------------
159    *   |  /|  /|  /|  /|  /|
160    *   |/  |/  |/  |/  |/  |
161    *   ---------------------
162    *
163    * @param[in] gridSize The grid size of the solid geometry to create
164    * @return Returns the created geometry for the grid size
165    */
166   Geometry CreateGeometryBorder( Uint16Pair gridSize );
167
168   /**
169    * @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
170    *
171    * @param[in] nPatchImage The NinePatchImage to base our cropped images and stretch borders from
172    */
173   void InitializeFromImage( NinePatchImage nPatchImage );
174
175   /**
176    * @brief Creates an error Image to indicate that there was an error in either the image url or the parsing of the image
177    *
178    */
179   void InitializeFromBrokenImage();
180
181   /**
182    * @brief Applies this renderer's image to the sampler to the texture set used for this renderer
183    */
184   void ApplyImageToSampler();
185
186   /**
187    * @brief Changes the current renderer if the n-patch meta data has changed
188    *
189    * @param[in] oldBorderOnly The old flag indicating if the image should omit the centre of the n-patch and only render the border
190    * @param[in] oldGridX The old horizontal grid size of the solid geometry
191    * @param[in] oldGridY The old vertical grid size of the solid geometry
192    */
193   void ChangeRenderer( bool oldBorderOnly, size_t oldGridX, size_t oldGridY );
194
195 private:
196
197   NinePatchImage mImage; ///< The image to render if the visual was set from an NinePatchImage, empty otherwise
198   Image mCroppedImage;
199
200   std::string mImageUrl; ///< The url to the image resource to render if the visual was set from an image resource url, empty otherwise
201   NinePatchImage::StretchRanges mStretchPixelsX;
202   NinePatchImage::StretchRanges mStretchPixelsY;
203   ImageDimensions mImageSize;
204   bool mBorderOnly;
205 };
206
207 } // namespace Internal
208
209 } // namespace Toolkit
210
211 } // namespace Dali
212
213 #endif // DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H