c94e5b4a5336a0af0294a012843422a0940fa5bd
[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) 2022 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-operations.h>
24 #include <dali/public-api/object/weak-handle.h>
25 #include <dali/public-api/rendering/geometry.h>
26 #include <dali/public-api/rendering/sampler.h>
27 #include <dali/public-api/rendering/shader.h>
28
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/internal/texture-manager/texture-upload-observer.h>
31 #include <dali-toolkit/internal/visuals/visual-base-impl.h>
32 #include <dali-toolkit/internal/visuals/visual-url.h>
33 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
34
35 namespace Dali
36 {
37 namespace Toolkit
38 {
39 namespace Internal
40 {
41 class ImageVisualShaderFactory;
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  * | border                   | RECTANGLE        |
55  * | auxiliaryImage           | STRING           |
56  * | auxiliaryImageAlpha      | FLOAT            |
57  */
58 class NPatchVisual : public Visual::Base, public TextureUploadObserver
59 {
60 public:
61   /**
62    * @brief Create an N-patch visual using an image URL.
63    *
64    * The visual will load the image synchronously when the associated actor is put on stage, and destroy the image when it is off stage
65    *
66    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
67    * @param[in] shaderFactory The ImageVisualShaderFactory object
68    * @param[in] imageUrl The URL to 9 patch image resource to use
69    * @param[in] properties A Property::Map containing settings for this visual
70    * @return A smart-pointer to the newly allocated visual.
71    */
72   static NPatchVisualPtr New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, const Property::Map& properties);
73
74   /**
75    * @brief Create an N-patch visual using an image URL.
76    *
77    * The visual will load the image synchronously when the associated actor is put on stage, and destroy the image when it is off stage
78    *
79    * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
80    * @param[in] shaderFactory The ImageVisualShaderFactory object
81    * @param[in] imageUrl The URL to 9 patch image resource to use
82    * @return A smart-pointer to the newly allocated visual.
83    */
84   static NPatchVisualPtr New(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl);
85
86 public: // from Visual
87   /**
88    * @copydoc Visual::Base::GetNaturalSize
89    */
90   void GetNaturalSize(Vector2& naturalSize) override;
91
92   /**
93    * @copydoc Visual::Base::CreatePropertyMap
94    */
95   void DoCreatePropertyMap(Property::Map& map) const override;
96
97   /**
98    * @copydoc Visual::Base::CreateInstancePropertyMap
99    */
100   void DoCreateInstancePropertyMap(Property::Map& map) const override;
101
102 protected:
103   /**
104    * @brief Constructor.
105    *
106    * @param[in] factoryCache Reference to the VisualFactoryCache object
107    */
108   NPatchVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory);
109
110   /**
111    * @brief A reference counted object may only be deleted by calling Unreference().
112    */
113   virtual ~NPatchVisual();
114
115   /**
116    * @copydoc Visual::Base::OnInitialize
117    */
118   void OnInitialize() override;
119
120   /**
121    * @copydoc Visual::Base::DoSetProperties
122    */
123   void DoSetProperties(const Property::Map& propertyMap) override;
124
125   /**
126    * @copydoc Visual::Base::DoSetOnScene
127    */
128   void DoSetOnScene(Actor& actor) override;
129
130   /**
131    * @copydoc Visual::Base::DoSetOffScene
132    */
133   void DoSetOffScene(Actor& actor) override;
134
135   /**
136    * @copydoc Visual::Base::OnSetTransform
137    */
138   void OnSetTransform() override;
139
140 private:
141   /**
142    * Loads the NPatch image and the Auxiliary image if needed
143    */
144   void LoadImages();
145
146   /**
147    * @brief Creates a geometry for this renderer's grid size
148    *
149    * @return Returns the created geometry for this renderer's grid size
150    */
151   Geometry CreateGeometry();
152
153   /**
154    * @brief Creates a shader for this renderer's grid size
155    *
156    * @return Returns the created shader for this renderer's grid size
157    */
158   Shader CreateShader();
159
160   /**
161    * @brief Applies texture and related uniforms
162    */
163   void ApplyTextureAndUniforms();
164
165   /**
166    * Helper method to get the default Nine patch geometry from cache or create and store it there
167    * @param subType to use
168    * @return the geometry
169    */
170   Geometry GetNinePatchGeometry(VisualFactoryCache::GeometryType subType);
171
172   /**
173    * @brief Creates a geometry for the grid size to be used by this visuals' shaders
174    *
175    * @param[in] gridSize The grid size of the solid geometry to create
176    * @return Returns the created geometry for the grid size
177    */
178   Geometry CreateGridGeometry(Uint16Pair gridSize);
179
180   /**
181    * @brief Creates a geometry with the border only for the grid size to be used by this visuals' shaders
182    * e.g. a 5x4 grid would create a geometry that would look like:
183    *
184    *   ---------------------
185    *   |  /|  /|  /|  /|  /|
186    *   |/  |/  |/  |/  |/  |
187    *   ---------------------
188    *   |  /|           |  /|
189    *   |/  |           |/  |
190    *   -----           -----
191    *   |  /|           |  /|
192    *   |/  |           |/  |
193    *   ---------------------
194    *   |  /|  /|  /|  /|  /|
195    *   |/  |/  |/  |/  |/  |
196    *   ---------------------
197    *
198    * @param[in] gridSize The grid size of the solid geometry to create
199    * @return Returns the created geometry for the grid size
200    */
201   Geometry CreateBorderGeometry(Uint16Pair gridSize);
202
203   /**
204    * @brief Creates a renderer by using loaded resource.
205    */
206   void SetResource();
207
208 private:
209   /**
210    * @copydoc TextureUploadObserver::LoadCompleted
211    *
212    * To avoid rendering garbage pixels, renderer should be added to actor after the resources are ready.
213    * This callback is the place to add the renderer as it would be called once the loading is finished.
214    */
215   void LoadComplete(bool loadSuccess, TextureInformation textureInformation) override;
216
217 private:
218   WeakHandle<Actor>                         mPlacementActor; ///< Weakhandle to contain Actor during texture loading
219   NPatchLoader&                             mLoader;         ///< reference to N patch loader for fast access
220   ImageVisualShaderFactory&                 mImageVisualShaderFactory;
221   VisualUrl                                 mImageUrl;                ///< The url to the N patch to load
222   VisualUrl                                 mAuxiliaryUrl;            ///< An auxiliary image that can be displayed on top of the N-Patch
223   NPatchData::NPatchDataId                  mId;                      ///< id of the N patch (from loader/cache)
224   TextureSet                                mAuxiliaryTextureSet;     ///< TextureSet of the auxiliary mask image
225   TextureManager::TextureId                 mAuxiliaryTextureId;      ///< id of the auxiliary mask image (from TextureManager)
226   Toolkit::Visual::ResourceStatus           mAuxiliaryResourceStatus; ///< resource status for auxiliary mask image
227   bool                                      mBorderOnly;              ///< if only border is desired
228   Rect<int>                                 mBorder;                  ///< The size of the border
229   float                                     mAuxiliaryImageAlpha;     ///< The alpha value for the auxiliary image only
230   Toolkit::ImageVisual::ReleasePolicy::Type mReleasePolicy;           ///< The release policy to determine when an image should no longer be cached.
231 };
232
233 } // namespace Internal
234
235 } // namespace Toolkit
236
237 } // namespace Dali
238
239 #endif // DALI_TOOLKIT_INTERNAL_N_PATCH_VISUAL_H