Merge "Ensured disabled batching reverts to ImageVisual" into devel/master
[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           bool batchingEnabled( false );
153           Property::Value* batchingEnabledValue = propertyMap.Find( Toolkit::ImageVisual::Property::BATCHING_ENABLED, BATCHING_ENABLED );
154           if( batchingEnabledValue  )
155           {
156             batchingEnabledValue->Get( batchingEnabled );
157           }
158
159           if( batchingEnabled )
160           {
161             visualPtr = new BatchImageVisual( *( mFactoryCache.Get() ) );
162             break;
163           }
164           else
165           {
166             visualPtr = new ImageVisual( *( mFactoryCache.Get() ) );
167           }
168         }
169       }
170
171       break;
172     }
173
174     case Toolkit::Visual::MESH:
175     {
176       visualPtr = new MeshVisual( *( mFactoryCache.Get() ) );
177       break;
178     }
179
180     case Toolkit::Visual::PRIMITIVE:
181     {
182       visualPtr = new PrimitiveVisual( *( mFactoryCache.Get() ) );
183       break;
184     }
185
186     case Toolkit::Visual::WIREFRAME:
187     {
188       visualPtr = new WireframeVisual( *( mFactoryCache.Get() ) );
189       break;
190     }
191
192   }
193
194   if( visualPtr )
195   {
196     Actor actor;
197     visualPtr->Initialize( actor, propertyMap );
198   }
199   else
200   {
201     DALI_LOG_ERROR( "Renderer type unknown\n" );
202   }
203
204   return Toolkit::Visual::Base( visualPtr );
205 }
206
207 Toolkit::Visual::Base VisualFactory::CreateVisual( const Image& image )
208 {
209   if( !mFactoryCache )
210   {
211     mFactoryCache = new VisualFactoryCache();
212   }
213
214   if( mDebugEnabled )
215   {
216     return Toolkit::Visual::Base( new WireframeVisual( *( mFactoryCache.Get() ) ) );
217   }
218
219   NinePatchImage npatchImage = NinePatchImage::DownCast( image );
220   if( npatchImage )
221   {
222     NPatchVisual* visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
223     visualPtr->SetImage( npatchImage );
224
225     return Toolkit::Visual::Base( visualPtr );
226   }
227   else
228   {
229     ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ) );
230     Actor actor;
231     visualPtr->SetImage( actor, image );
232
233     return Toolkit::Visual::Base( visualPtr );
234   }
235 }
236
237 Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, ImageDimensions size )
238 {
239   if( !mFactoryCache )
240   {
241     mFactoryCache = new VisualFactoryCache();
242   }
243
244   if( mDebugEnabled )
245   {
246     return Toolkit::Visual::Base( new WireframeVisual( *( mFactoryCache.Get() ) ) );
247   }
248
249   // first resolve url type to know which visual to create
250   UrlType::Type type = ResolveUrlType( url );
251   if( UrlType::N_PATCH == type )
252   {
253     NPatchVisual* visualPtr = new NPatchVisual( *( mFactoryCache.Get() ) );
254     visualPtr->SetImage( url );
255
256     return Toolkit::Visual::Base( visualPtr );
257   }
258   else if( UrlType::SVG == type )
259   {
260     SvgVisual* visualPtr = new SvgVisual( *( mFactoryCache.Get() ) );
261     visualPtr->SetImage( url, size );
262     return Toolkit::Visual::Base( visualPtr );
263   }
264   else // Regular image
265   {
266     ImageVisual* visualPtr = new ImageVisual( *( mFactoryCache.Get() ));
267     Actor actor;
268     visualPtr->SetImage( actor, url, size );
269
270     return Toolkit::Visual::Base( visualPtr );
271   }
272 }
273
274 } // namespace Internal
275
276 } // namespace Toolkit
277
278 } // namespace Dali