[dali_1.3.22] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-factory-impl.cpp
1  /*
2  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 // CLASS HEADER
18 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
19
20 // EXTERNAL INCLUDES
21 #include <dali/integration-api/debug.h>
22 #include <dali/public-api/images/image.h>
23 #include <dali/public-api/object/property-array.h>
24 #include <dali/public-api/object/type-registry.h>
25 #include <dali/public-api/object/type-registry-helper.h>
26 #include <dali/devel-api/scripting/scripting.h>
27
28 // INTERNAL INCLUDES
29 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
30 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
31 #include <dali-toolkit/public-api/visuals/text-visual-properties.h>
32 #include <dali-toolkit/public-api/visuals/visual-properties.h>
33 #include <dali-toolkit/internal/visuals/border/border-visual.h>
34 #include <dali-toolkit/internal/visuals/color/color-visual.h>
35 #include <dali-toolkit/internal/visuals/gradient/gradient-visual.h>
36 #include <dali-toolkit/internal/visuals/animated-gradient/animated-gradient-visual.h>
37 #include <dali-toolkit/internal/visuals/image/image-visual.h>
38 #include <dali-toolkit/internal/visuals/mesh/mesh-visual.h>
39 #include <dali-toolkit/internal/visuals/npatch/npatch-visual.h>
40 #include <dali-toolkit/internal/visuals/primitive/primitive-visual.h>
41 #include <dali-toolkit/internal/visuals/svg/svg-visual.h>
42 #include <dali-toolkit/internal/visuals/text/text-visual.h>
43 #include <dali-toolkit/internal/visuals/animated-image/animated-image-visual.h>
44 #include <dali-toolkit/internal/visuals/wireframe/wireframe-visual.h>
45 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
46 #include <dali-toolkit/internal/visuals/visual-url.h>
47 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
48
49 namespace Dali
50 {
51
52 namespace Toolkit
53 {
54
55 namespace Internal
56 {
57
58 namespace
59 {
60
61 BaseHandle Create()
62 {
63   BaseHandle handle = Toolkit::VisualFactory::Get();
64
65   return handle;
66 }
67
68 DALI_TYPE_REGISTRATION_BEGIN_CREATE( Toolkit::VisualFactory, Dali::BaseHandle, Create, true )
69 DALI_TYPE_REGISTRATION_END()
70 const char * const  BROKEN_IMAGE_URL( DALI_IMAGE_DIR "broken.png" ); ///< URL For the broken image
71
72 } // namespace
73
74 VisualFactory::VisualFactory( bool debugEnabled )
75 : mFactoryCache(),
76   mSlotDelegate(this),
77   mDebugEnabled( debugEnabled ),
78   mPreMultiplyOnLoad( true )
79 {
80 }
81
82 VisualFactory::~VisualFactory()
83 {
84 }
85
86 void VisualFactory::OnStyleChangedSignal( Toolkit::StyleManager styleManager, StyleChange::Type type)
87 {
88   if( type == StyleChange::THEME_CHANGE )
89   {
90     std::string brokenImageUrl(BROKEN_IMAGE_URL);
91
92     Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
93     config["brokenImageUrl"].Get( brokenImageUrl );
94
95     if( mFactoryCache )
96     {
97       mFactoryCache->SetBrokenImageUrl(brokenImageUrl);
98     }
99   }
100 }
101
102 Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& propertyMap )
103 {
104   Visual::BasePtr visualPtr;
105
106   Property::Value* typeValue = propertyMap.Find( Toolkit::Visual::Property::TYPE, VISUAL_TYPE );
107   Toolkit::DevelVisual::Type visualType = Toolkit::DevelVisual::IMAGE; // Default to IMAGE type.
108   if( typeValue )
109   {
110     Scripting::GetEnumerationProperty( *typeValue, VISUAL_TYPE_TABLE, VISUAL_TYPE_TABLE_COUNT, visualType );
111   }
112
113   switch( visualType )
114   {
115     case Toolkit::Visual::BORDER:
116     {
117       visualPtr = BorderVisual::New( GetFactoryCache(), propertyMap );
118       break;
119     }
120
121     case Toolkit::Visual::COLOR:
122     {
123       visualPtr = ColorVisual::New( GetFactoryCache(), propertyMap );
124       break;
125     }
126
127     case Toolkit::Visual::GRADIENT:
128     {
129       visualPtr = GradientVisual::New( GetFactoryCache(), propertyMap );
130       break;
131     }
132
133     case Toolkit::Visual::IMAGE:
134     {
135       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
136       std::string imageUrl;
137       if( imageURLValue )
138       {
139         if( imageURLValue->Get( imageUrl ) )
140         {
141           if( !imageUrl.empty() )
142           {
143             VisualUrl visualUrl( imageUrl );
144
145             switch( visualUrl.GetType() )
146             {
147               case VisualUrl::N_PATCH:
148               {
149                 visualPtr = NPatchVisual::New( GetFactoryCache(), visualUrl, propertyMap );
150                 break;
151               }
152               case VisualUrl::SVG:
153               {
154                 visualPtr = SvgVisual::New( GetFactoryCache(), visualUrl, propertyMap );
155                 break;
156               }
157               case VisualUrl::GIF:
158               {
159                 visualPtr = AnimatedImageVisual::New( GetFactoryCache(), visualUrl, propertyMap );
160                 break;
161               }
162               case VisualUrl::REGULAR_IMAGE:
163               {
164                 visualPtr = ImageVisual::New( GetFactoryCache(), visualUrl, propertyMap );
165                 break;
166               }
167             }
168           }
169         }
170         else
171         {
172           Property::Array* array = imageURLValue->GetArray();
173           if( array )
174           {
175             visualPtr = AnimatedImageVisual::New( GetFactoryCache(), *array, propertyMap );
176           }
177         }
178       }
179       break;
180     }
181
182     case Toolkit::Visual::MESH:
183     {
184       visualPtr = MeshVisual::New( GetFactoryCache(), propertyMap );
185       break;
186     }
187
188     case Toolkit::Visual::PRIMITIVE:
189     {
190       visualPtr = PrimitiveVisual::New( GetFactoryCache(), propertyMap );
191       break;
192     }
193
194     case Toolkit::Visual::WIREFRAME:
195     {
196       visualPtr = WireframeVisual::New( GetFactoryCache(), propertyMap );
197       break;
198     }
199
200     case Toolkit::Visual::TEXT:
201     {
202       visualPtr = TextVisual::New( GetFactoryCache(), propertyMap );
203       break;
204     }
205
206     case Toolkit::Visual::N_PATCH:
207     {
208       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
209       std::string imageUrl;
210       if( imageURLValue && imageURLValue->Get( imageUrl ) )
211       {
212         visualPtr = NPatchVisual::New( GetFactoryCache(), imageUrl, propertyMap );
213       }
214       break;
215     }
216
217     case Toolkit::Visual::SVG:
218     {
219       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
220       std::string imageUrl;
221       if( imageURLValue && imageURLValue->Get( imageUrl ) )
222       {
223         visualPtr = SvgVisual::New( GetFactoryCache(), imageUrl, propertyMap );
224       }
225       break;
226     }
227
228     case Toolkit::Visual::ANIMATED_IMAGE:
229     {
230       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
231       std::string imageUrl;
232       if( imageURLValue )
233       {
234         if( imageURLValue->Get( imageUrl ) )
235         {
236           visualPtr = AnimatedImageVisual::New( GetFactoryCache(), imageUrl, propertyMap );
237         }
238         else
239         {
240           Property::Array* array = imageURLValue->GetArray();
241           if( array )
242           {
243             visualPtr = AnimatedImageVisual::New( GetFactoryCache(), *array, propertyMap );
244           }
245         }
246       }
247       break;
248     }
249
250     case Toolkit::DevelVisual::ANIMATED_GRADIENT:
251     {
252       visualPtr = AnimatedGradientVisual::New( GetFactoryCache(), propertyMap );
253       break;
254     }
255   }
256
257   if( !visualPtr )
258   {
259     DALI_LOG_ERROR( "Renderer type unknown\n" );
260   }
261
262   if( mDebugEnabled && visualType !=  Toolkit::DevelVisual::WIREFRAME )
263   {
264     //Create a WireframeVisual if we have debug enabled
265     visualPtr = WireframeVisual::New(GetFactoryCache(), visualPtr, propertyMap );
266   }
267
268   return Toolkit::Visual::Base( visualPtr.Get() );
269 }
270
271 Toolkit::Visual::Base VisualFactory::CreateVisual( const Image& image )
272 {
273   Visual::BasePtr visualPtr;
274
275   if( image )
276   {
277     NinePatchImage npatchImage = NinePatchImage::DownCast( image );
278     if( npatchImage )
279     {
280       visualPtr = NPatchVisual::New( GetFactoryCache(), npatchImage );
281     }
282     else
283     {
284       visualPtr = ImageVisual::New(GetFactoryCache(), image );
285     }
286   }
287
288   if( mDebugEnabled )
289   {
290     //Create a WireframeVisual if we have debug enabled
291     visualPtr = WireframeVisual::New( GetFactoryCache(), visualPtr );
292   }
293
294   return Toolkit::Visual::Base( visualPtr.Get() );
295 }
296
297 Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, ImageDimensions size )
298 {
299   Visual::BasePtr visualPtr;
300
301   if( !url.empty() )
302   {
303     // first resolve url type to know which visual to create
304     VisualUrl visualUrl( url );
305     switch( visualUrl.GetType() )
306     {
307       case VisualUrl::N_PATCH:
308       {
309         visualPtr = NPatchVisual::New( GetFactoryCache(), visualUrl );
310         break;
311       }
312       case VisualUrl::SVG:
313       {
314         visualPtr = SvgVisual::New( GetFactoryCache(), visualUrl );
315         break;
316       }
317       case VisualUrl::GIF:
318       {
319         visualPtr = AnimatedImageVisual::New( GetFactoryCache(), visualUrl );
320         break;
321       }
322       case VisualUrl::REGULAR_IMAGE:
323       {
324         visualPtr = ImageVisual::New(GetFactoryCache(), visualUrl, size );
325         break;
326       }
327     }
328   }
329
330   if( mDebugEnabled )
331   {
332     //Create a WireframeVisual if we have debug enabled
333     visualPtr = WireframeVisual::New( GetFactoryCache(), visualPtr );
334   }
335
336   return Toolkit::Visual::Base( visualPtr.Get() );
337 }
338
339 void VisualFactory::SetPreMultiplyOnLoad( bool preMultiply )
340 {
341   if( mPreMultiplyOnLoad != preMultiply )
342   {
343     GetFactoryCache().SetPreMultiplyOnLoad( preMultiply );
344   }
345   mPreMultiplyOnLoad = preMultiply;
346 }
347
348 bool VisualFactory::GetPreMultiplyOnLoad() const
349 {
350   return mPreMultiplyOnLoad;
351 }
352
353 Internal::TextureManager& VisualFactory::GetTextureManager()
354 {
355   return GetFactoryCache().GetTextureManager();
356 }
357
358 Internal::VisualFactoryCache& VisualFactory::GetFactoryCache()
359 {
360   if( !mFactoryCache )
361   {
362     mFactoryCache = std::unique_ptr<VisualFactoryCache>( new VisualFactoryCache( mPreMultiplyOnLoad ) );
363
364     std::string brokenImageUrl(BROKEN_IMAGE_URL);
365     Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
366     if( styleManager )
367     {
368       Property::Map config = Toolkit::DevelStyleManager::GetConfigurations( styleManager );
369       config["brokenImageUrl"].Get( brokenImageUrl );
370       styleManager.StyleChangedSignal().Connect( mSlotDelegate, &VisualFactory::OnStyleChangedSignal );
371     }
372
373     mFactoryCache->SetBrokenImageUrl(brokenImageUrl);
374   }
375   return *mFactoryCache;
376 }
377
378 } // namespace Internal
379
380 } // namespace Toolkit
381
382 } // namespace Dali