71152d9beb84a995cbf7549199e181eb96249e75
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-factory-impl.cpp
1  /*
2  * Copyright (c) 2016 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/enum-helper.h>
27 #include <dali/devel-api/scripting/scripting.h>
28
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/public-api/visuals/image-visual-properties.h>
31 #include <dali-toolkit/public-api/visuals/visual-properties.h>
32 #include <dali-toolkit/internal/visuals/border/border-visual.h>
33 #include <dali-toolkit/internal/visuals/color/color-visual.h>
34 #include <dali-toolkit/internal/visuals/gradient/gradient-visual.h>
35 #include <dali-toolkit/internal/visuals/image/image-visual.h>
36 #include <dali-toolkit/internal/visuals/mesh/mesh-visual.h>
37 #include <dali-toolkit/internal/visuals/npatch/npatch-visual.h>
38 #include <dali-toolkit/internal/visuals/primitive/primitive-visual.h>
39 #include <dali-toolkit/internal/visuals/svg/svg-visual.h>
40 #include <dali-toolkit/internal/visuals/wireframe/wireframe-visual.h>
41 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
42 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
43
44 namespace
45 {
46 const char * const BROKEN_VISUAL_IMAGE_URL( DALI_IMAGE_DIR "broken.png");
47 }
48  
49 namespace Dali
50 {
51
52 namespace Toolkit
53 {
54
55 namespace Internal
56 {
57
58 namespace
59 {
60
61 DALI_ENUM_TO_STRING_TABLE_BEGIN( VISUAL_TYPE )
62 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, BORDER )
63 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, COLOR )
64 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, GRADIENT )
65 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, IMAGE )
66 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, MESH )
67 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, PRIMITIVE )
68 DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::Visual, WIREFRAME )
69 DALI_ENUM_TO_STRING_TABLE_END( VISUAL_TYPE )
70
71 const char * const VISUAL_TYPE( "visualType" );
72
73 BaseHandle Create()
74 {
75   BaseHandle handle = Toolkit::VisualFactory::Get();
76
77   return handle;
78 }
79
80 DALI_TYPE_REGISTRATION_BEGIN_CREATE( Toolkit::VisualFactory, Dali::BaseHandle, Create, true )
81 DALI_TYPE_REGISTRATION_END()
82
83 } // namespace
84
85 VisualFactory::VisualFactory( bool debugEnabled )
86 :mDebugEnabled( debugEnabled )
87 {
88 }
89
90 VisualFactory::~VisualFactory()
91 {
92 }
93
94 Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& propertyMap )
95 {
96   // Create factory cache if it hasn't already been
97   if( !mFactoryCache )
98   {
99     mFactoryCache = new VisualFactoryCache();
100   }
101
102   // Return a new WireframeVisual if we have debug enabled
103   if( mDebugEnabled )
104   {
105     return Toolkit::Visual::Base( new WireframeVisual( *( mFactoryCache.Get() ) ) );
106   }
107
108   Visual::Base* visualPtr = NULL;
109
110   Property::Value* typeValue = propertyMap.Find( Toolkit::Visual::Property::TYPE, VISUAL_TYPE );
111   Toolkit::Visual::Type visualType = Toolkit::Visual::IMAGE; // Default to IMAGE type
112   if( typeValue )
113   {
114     Scripting::GetEnumerationProperty( *typeValue, VISUAL_TYPE_TABLE, VISUAL_TYPE_TABLE_COUNT, visualType );
115   }
116
117   switch( visualType )
118   {
119     case Toolkit::Visual::BORDER:
120     {
121       visualPtr = new BorderVisual( *( mFactoryCache.Get() ) );
122       break;
123     }
124
125     case Toolkit::Visual::COLOR:
126     {
127       visualPtr = new ColorVisual( *( mFactoryCache.Get() ) );
128       break;
129     }
130
131     case Toolkit::Visual::GRADIENT:
132     {
133       visualPtr = new GradientVisual( *( mFactoryCache.Get() ) );
134       break;
135     }
136
137     case Toolkit::Visual::IMAGE:
138     {
139       Property::Value* imageURLValue = propertyMap.Find( Toolkit::ImageVisual::Property::URL, IMAGE_URL_NAME );
140       std::string imageUrl;
141       if( imageURLValue && imageURLValue->Get( imageUrl ) )
142       {
143         if( NinePatchImage::IsNinePatchUrl( imageUrl ) )
144         {
145           visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
146         }
147         else
148         {
149           CreateAtlasManager();
150
151           if( SvgVisual::IsSvgUrl( imageUrl ) )
152           {
153             visualPtr = new SvgVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
154           }
155           else
156           {
157             visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
158           }
159         }
160       }
161       break;
162     }
163
164     case Toolkit::Visual::MESH:
165     {
166       visualPtr = new MeshVisual( *( mFactoryCache.Get() ) );
167       break;
168     }
169
170     case Toolkit::Visual::PRIMITIVE:
171     {
172       visualPtr = new PrimitiveVisual( *( mFactoryCache.Get() ) );
173       break;
174     }
175
176     case Toolkit::Visual::WIREFRAME:
177     {
178       visualPtr = new WireframeVisual( *( mFactoryCache.Get() ) );
179       break;
180     }
181   }
182
183   if( visualPtr )
184   {
185     Actor actor;
186     visualPtr->Initialize( actor, propertyMap );
187   }
188   else
189   {
190     DALI_LOG_ERROR( "Renderer type unknown\n" );
191   }
192
193   return Toolkit::Visual::Base( visualPtr );
194 }
195
196 Toolkit::Visual::Base VisualFactory::CreateVisual( const Image& image )
197 {
198   if( !mFactoryCache )
199   {
200     mFactoryCache = new VisualFactoryCache();
201   }
202
203   if( mDebugEnabled )
204   {
205     return Toolkit::Visual::Base( new WireframeVisual( *( mFactoryCache.Get() ) ) );
206   }
207
208   NinePatchImage npatchImage = NinePatchImage::DownCast( image );
209   if( npatchImage )
210   {
211     NPatchVisual* visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
212     visualPtr->SetImage( npatchImage );
213
214     return Toolkit::Visual::Base( visualPtr );
215   }
216   else
217   {
218     CreateAtlasManager();
219     ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
220     Actor actor;
221     visualPtr->SetImage( actor, image );
222
223     return Toolkit::Visual::Base( visualPtr );
224   }
225 }
226
227 Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, ImageDimensions size )
228 {
229   if( !mFactoryCache )
230   {
231     mFactoryCache = new VisualFactoryCache();
232   }
233
234   if( mDebugEnabled )
235   {
236     return Toolkit::Visual::Base( new WireframeVisual( *( mFactoryCache.Get() ) ) );
237   }
238
239   if( NinePatchImage::IsNinePatchUrl( url ) )
240   {
241     NPatchVisual* visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
242     visualPtr->SetImage( url );
243
244     return Toolkit::Visual::Base( visualPtr );
245   }
246   else if( SvgVisual::IsSvgUrl( url ) )
247   {
248     CreateAtlasManager();
249     SvgVisual* visualPtr = new SvgVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
250     visualPtr->SetImage( url, size );
251     return Toolkit::Visual::Base( visualPtr );
252   }
253   else
254   {
255     CreateAtlasManager();
256     ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ), *( mAtlasManager.Get() ) );
257     Actor actor;
258     visualPtr->SetImage( actor, url, size );
259
260     return Toolkit::Visual::Base( visualPtr );
261   }
262 }
263
264 Image VisualFactory::GetBrokenVisualImage()
265 {
266   return ResourceImage::New( BROKEN_VISUAL_IMAGE_URL );
267 }
268
269 void VisualFactory::CreateAtlasManager()
270 {
271   if( !mAtlasManager )
272   {
273     Shader shader = ImageVisual::GetImageShader( *( mFactoryCache.Get() ) );
274     mAtlasManager = new ImageAtlasManager();
275     mAtlasManager->SetBrokenImage( BROKEN_VISUAL_IMAGE_URL );
276   }
277 }
278
279 } // namespace Internal
280
281 } // namespace Toolkit
282
283 } // namespace Dali