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