1 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 #include "image-view-impl.h"
7 #include <dali/public-api/images/resource-image.h>
8 #include <dali/public-api/object/type-registry.h>
9 #include <dali/devel-api/object/type-registry-helper.h>
10 #include <dali/devel-api/scripting/scripting.h>
13 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
14 #include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
15 #include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
31 return Toolkit::ImageView::New();
34 // Setup properties, signals and actions using the type-registry.
35 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create );
36 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "resourceUrl", STRING, RESOURCE_URL )
37 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "image", MAP, IMAGE )
38 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "preMultipliedAlpha", BOOLEAN, PRE_MULTIPLIED_ALPHA )
40 DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT( Toolkit, ImageView, "pixelArea", Vector4(0.f, 0.f, 1.f, 1.f), PIXEL_AREA )
41 DALI_TYPE_REGISTRATION_END()
43 } // anonymous namespace
47 ImageView::ImageView()
48 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ),
49 mPremultipledAlphaEnabled( false )
53 ImageView::~ImageView()
57 Toolkit::ImageView ImageView::New()
59 ImageView* impl = new ImageView();
61 Toolkit::ImageView handle = Toolkit::ImageView( *impl );
63 // Second-phase init of the implementation
64 // This can only be done after the CustomActor connection has been made...
70 /////////////////////////////////////////////////////////////
72 void ImageView::SetImage( Image image )
74 if( ( mImage != image ) ||
75 ! mUrl.empty() || // If we're changing from a URL type to an Image type
76 ! mPropertyMap.Empty() ) // If we're changing from a property map type to an Image type
84 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, image );
85 mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
91 void ImageView::SetImage( Property::Map map )
98 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mPropertyMap );
100 Property::Value* widthValue = mPropertyMap.Find( "width" );
104 if( widthValue->Get( width ) )
106 mImageSize = ImageDimensions( width, mImageSize.GetHeight() );
110 Property::Value* heightValue = mPropertyMap.Find( "height" );
114 if( heightValue->Get( height ) )
116 mImageSize = ImageDimensions( mImageSize.GetWidth(), height );
123 void ImageView::SetImage( const std::string& url, ImageDimensions size )
125 if( ( mUrl != url ) ||
126 mImage || // If we're changing from an Image type to a URL type
127 ! mPropertyMap.Empty() ) // If we're changing from a property map type to a URL type
130 mPropertyMap.Clear();
134 if( size.GetWidth() == 0u && size.GetHeight() == 0u )
136 mImageSize = ResourceImage::GetImageSize( mUrl );
144 Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, self, mUrl, mImageSize );
150 void ImageView::EnablePreMultipliedAlpha( bool preMultipled )
152 mPremultipledAlphaEnabled = preMultipled;
156 ControlRenderer& rendererImpl = GetImplementation( mRenderer );
157 if (&typeid( rendererImpl ) == &typeid(ImageRenderer) )
159 ImageRenderer* imageRenderer = static_cast<ImageRenderer*>( &rendererImpl );
160 imageRenderer->EnablePreMultipliedAlpha( preMultipled );
165 bool ImageView::IsPreMultipliedAlphaEnabled() const
167 return mPremultipledAlphaEnabled;
170 void ImageView::SetDepthIndex( int depthIndex )
174 mRenderer.SetDepthIndex( depthIndex );
178 Vector3 ImageView::GetNaturalSize()
182 size.x = mImageSize.GetWidth();
183 size.y = mImageSize.GetHeight();
185 if( size.x > 0 && size.y > 0 )
187 size.z = std::min(size.x, size.y);
192 // if no image then use Control's natural size
193 return Control::GetNaturalSize();
197 float ImageView::GetHeightForWidth( float width )
199 if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
201 return GetHeightForWidthBase( width );
205 return Control::GetHeightForWidth( width );
209 float ImageView::GetWidthForHeight( float height )
211 if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
213 return GetWidthForHeightBase( height );
217 return Control::GetWidthForHeight( height );
222 ///////////////////////////////////////////////////////////
227 void ImageView::OnStageConnection( int depth )
229 Control::OnStageConnection( depth );
233 CustomActor self = Self();
234 mRenderer.SetOnStage( self );
238 void ImageView::OnStageDisconnection()
242 CustomActor self = Self();
243 mRenderer.SetOffStage( self );
246 Control::OnStageDisconnection();
249 ///////////////////////////////////////////////////////////
254 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
256 Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
262 case Toolkit::ImageView::Property::RESOURCE_URL:
264 std::string imageUrl;
265 if( value.Get( imageUrl ) )
267 GetImpl( imageView ).SetImage( imageUrl, ImageDimensions() );
272 case Toolkit::ImageView::Property::IMAGE:
274 std::string imageUrl;
275 if( value.Get( imageUrl ) )
277 ImageView& impl = GetImpl( imageView );
278 impl.SetImage( imageUrl, ImageDimensions() );
281 // if its not a string then get a Property::Map from the property if possible.
283 if( value.Get( map ) )
285 ImageView& impl = GetImpl( imageView );
286 impl.SetImage( map );
292 case Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA:
295 if( value.Get( IsPre ) )
297 GetImpl(imageView).EnablePreMultipliedAlpha( IsPre );
305 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
307 Property::Value value;
309 Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
313 ImageView& impl = GetImpl( imageview );
314 switch ( propertyIndex )
316 case Toolkit::ImageView::Property::RESOURCE_URL:
318 if ( !impl.mUrl.empty() )
325 case Toolkit::ImageView::Property::IMAGE:
327 if ( !impl.mUrl.empty() )
331 else if( impl.mImage )
334 Scripting::CreatePropertyMap( impl.mImage, map );
337 else if( !impl.mPropertyMap.Empty() )
339 value = impl.mPropertyMap;
344 case Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA:
346 value = impl.IsPreMultipliedAlphaEnabled();
355 } // namespace Internal
356 } // namespace Toolkit