Merge "Changed all property & signal names to lowerCamelCase" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / renderers / renderer-factory-impl.cpp
1  /*
2  * Copyright (c) 2015 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 "renderer-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/devel-api/object/type-registry-helper.h>
26
27 // Internal HEADER
28 #include <dali-toolkit/internal/controls/renderers/border/border-renderer.h>
29 #include <dali-toolkit/internal/controls/renderers/color/color-renderer.h>
30 #include <dali-toolkit/internal/controls/renderers/gradient/gradient-renderer.h>
31 #include <dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h>
32 #include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
33 #include <dali-toolkit/internal/controls/renderers/renderer-factory-cache.h>
34
35 namespace
36 {
37 const char * const RENDERER_TYPE_NAME( "rendererType" );
38
39 const char * const COLOR_RENDERER("colorRenderer");
40 const char * const BORDER_RENDERER("borderRenderer");
41 const char * const GRADIENT_RENDERER("gradientRenderer");
42 const char * const IMAGE_RENDERER("imageRenderer");
43 const char * const N_PATCH_RENDERER("nPatchRenderer");
44
45 const char * const BROKEN_RENDERER_IMAGE_URL( DALI_IMAGE_DIR "broken.png");
46 }
47
48 namespace Dali
49 {
50
51 namespace Toolkit
52 {
53
54 namespace Internal
55 {
56
57 namespace
58 {
59
60 BaseHandle Create()
61 {
62   BaseHandle handle = Toolkit::RendererFactory::Get();
63
64   return handle;
65 }
66
67 DALI_TYPE_REGISTRATION_BEGIN_CREATE( Toolkit::RendererFactory, Dali::BaseHandle, Create, true )
68 DALI_TYPE_REGISTRATION_END()
69
70 } // namespace
71
72 RendererFactory::RendererFactory()
73 {
74 }
75
76 RendererFactory::~RendererFactory()
77 {
78 }
79
80 Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Property::Map& propertyMap )
81 {
82   ControlRenderer* rendererPtr = NULL;
83
84   Property::Value* type = propertyMap.Find( RENDERER_TYPE_NAME );
85   std::string typeValue ;
86   if( type && type->Get( typeValue ))
87   {
88     if( !mFactoryCache )
89     {
90       mFactoryCache = new RendererFactoryCache();
91     }
92
93     if( typeValue ==  COLOR_RENDERER )
94     {
95       rendererPtr = new ColorRenderer( *( mFactoryCache.Get() ) );
96     }
97     else if( typeValue ==  GRADIENT_RENDERER )
98     {
99       rendererPtr = new GradientRenderer( *( mFactoryCache.Get() ) );
100     }
101     else if( typeValue ==  IMAGE_RENDERER )
102     {
103       rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) );
104     }
105     else if( typeValue ==  N_PATCH_RENDERER )
106     {
107       rendererPtr = new NPatchRenderer( *( mFactoryCache.Get() ) );
108     }
109     else if( typeValue == BORDER_RENDERER )
110     {
111       rendererPtr = new BorderRenderer( *( mFactoryCache.Get() ) );
112     }
113   }
114
115   if( rendererPtr )
116   {
117     Actor actor;
118     rendererPtr->Initialize( actor, propertyMap );
119   }
120   else
121   {
122     DALI_LOG_ERROR( "Renderer type unknown" );
123   }
124
125   return Toolkit::ControlRenderer( rendererPtr );
126 }
127
128 Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& color )
129 {
130   if( !mFactoryCache )
131   {
132     mFactoryCache = new RendererFactoryCache();
133   }
134
135   ColorRenderer* rendererPtr = new ColorRenderer( *( mFactoryCache.Get() ) );
136   rendererPtr->SetColor( color );
137
138   return Toolkit::ControlRenderer( rendererPtr );
139 }
140
141 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Vector4& color )
142 {
143   ColorRenderer* rendererPtr = dynamic_cast< ColorRenderer* >( &GetImplementation( renderer ) );
144   if( rendererPtr )
145   {
146     rendererPtr->SetColor( color );
147   }
148   else
149   {
150     renderer.RemoveAndReset( actor );
151     renderer = GetControlRenderer( color );
152
153     if( actor.OnStage() )
154     {
155       renderer.SetOnStage( actor );
156     }
157   }
158 }
159
160 Toolkit::ControlRenderer RendererFactory::GetControlRenderer( float borderSize, const Vector4& borderColor )
161 {
162   if( !mFactoryCache )
163   {
164     mFactoryCache = new RendererFactoryCache();
165   }
166   BorderRenderer* rendererPtr = new BorderRenderer( *mFactoryCache.Get() );
167
168   if( !mFactoryCache )
169   {
170     mFactoryCache = new RendererFactoryCache();
171   }
172
173   rendererPtr->SetBorderSize( borderSize );
174   rendererPtr->SetBorderColor( borderColor );
175
176   return Toolkit::ControlRenderer( rendererPtr );
177 }
178
179 Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Image& image )
180 {
181   if( !mFactoryCache )
182   {
183     mFactoryCache = new RendererFactoryCache();
184   }
185
186   NinePatchImage npatchImage = NinePatchImage::DownCast( image );
187   if( npatchImage )
188   {
189     NPatchRenderer* rendererPtr = new NPatchRenderer( *( mFactoryCache.Get() ) );
190     rendererPtr->SetImage( npatchImage );
191
192     return Toolkit::ControlRenderer( rendererPtr );
193   }
194   else
195   {
196     ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) );
197     Actor actor;
198     rendererPtr->SetImage( actor, image );
199
200     return Toolkit::ControlRenderer( rendererPtr );
201   }
202 }
203
204 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Image& image )
205 {
206   if( renderer )
207   {
208     NinePatchImage npatchImage = NinePatchImage::DownCast( image );
209     if( npatchImage )
210     {
211       NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) );
212       if( rendererPtr )
213       {
214         rendererPtr->SetImage( npatchImage );
215         return;
216       }
217     }
218     else
219     {
220       ImageRenderer* rendererPtr = dynamic_cast< ImageRenderer* >( &GetImplementation( renderer ) );
221       if( rendererPtr )
222       {
223         rendererPtr->SetImage( actor, image );
224         return;
225       }
226     }
227   }
228
229   renderer.RemoveAndReset( actor );
230   renderer = GetControlRenderer( image );
231   if( actor.OnStage() )
232   {
233     renderer.SetOnStage( actor );
234   }
235 }
236
237 Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string& url )
238 {
239   if( !mFactoryCache )
240   {
241     mFactoryCache = new RendererFactoryCache();
242   }
243
244   if( NinePatchImage::IsNinePatchUrl( url ) )
245   {
246     NPatchRenderer* rendererPtr = new NPatchRenderer( *( mFactoryCache.Get() ) );
247     rendererPtr->SetImage( url );
248
249     return Toolkit::ControlRenderer( rendererPtr );
250   }
251   else
252   {
253     ImageRenderer* rendererPtr = new ImageRenderer( *( mFactoryCache.Get() ) );
254     Actor actor;
255     rendererPtr->SetImage( actor, url );
256
257     return Toolkit::ControlRenderer( rendererPtr );
258   }
259 }
260
261 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const std::string& url )
262 {
263   if( renderer )
264   {
265     if( NinePatchImage::IsNinePatchUrl( url ) )
266     {
267       NPatchRenderer* rendererPtr = dynamic_cast< NPatchRenderer* >( &GetImplementation( renderer ) );
268       if( rendererPtr )
269       {
270         rendererPtr->SetImage( url );
271         return;
272       }
273     }
274     else
275     {
276       ImageRenderer* rendererPtr = dynamic_cast< ImageRenderer* >( &GetImplementation( renderer ) );
277       if( rendererPtr )
278       {
279         rendererPtr->SetImage( actor, url );
280         return;
281       }
282     }
283   }
284
285   renderer.RemoveAndReset( actor );
286   renderer = GetControlRenderer( url );
287   if( actor.OnStage() )
288   {
289     renderer.SetOnStage( actor );
290   }
291 }
292
293 void RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, Actor& actor, const Property::Map& propertyMap )
294 {
295   if( renderer )
296   {
297     Property::Value* type = propertyMap.Find( RENDERER_TYPE_NAME );
298     std::string typeValue ;
299     if( type && type->Get( typeValue ))
300     {
301       //If there's been a renderer type change then we have to return a new shader
302       if( typeValue ==  COLOR_RENDERER && typeid( renderer ) != typeid( ColorRenderer ) )
303       {
304         renderer = GetControlRenderer( propertyMap );
305         return;
306       }
307       else if( typeValue ==  GRADIENT_RENDERER && typeid( renderer ) != typeid( GradientRenderer ) )
308       {
309         renderer = GetControlRenderer( propertyMap );
310         return;
311       }
312       else if( typeValue ==  IMAGE_RENDERER && typeid( renderer ) != typeid( ImageRenderer ) )
313       {
314         renderer = GetControlRenderer( propertyMap );
315         return;
316       }
317       else if( typeValue ==  N_PATCH_RENDERER && typeid( renderer ) != typeid( NPatchRenderer ) )
318       {
319         renderer = GetControlRenderer( propertyMap );
320         return;
321       }
322       else if( typeValue ==  BORDER_RENDERER && typeid( renderer ) != typeid( BorderRenderer ) )
323       {
324         renderer = GetControlRenderer( propertyMap );
325         return;
326       }
327     }
328
329     GetImplementation( renderer ).Initialize( actor, propertyMap );
330   }
331   else
332   {
333     renderer = GetControlRenderer( propertyMap );
334   }
335
336 }
337
338 Image RendererFactory::GetBrokenRendererImage()
339 {
340   return ResourceImage::New( BROKEN_RENDERER_IMAGE_URL );
341 }
342
343 } // namespace Internal
344
345 } // namespace Toolkit
346
347 } // namespace Dali
348