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