X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fimage-view%2Fimage-view-impl.cpp;h=0011c0200066ba3e300b19089aba51386f4dbec6;hp=7f92138eead81b7871e58d0431948dfb5dd8a0a8;hb=3a6adcbec75784b051cb9ebaf204d72b553ea355;hpb=49d793abda445643e4b3b270c10af70aed3d2f52 diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp old mode 100755 new mode 100644 index 7f92138..0011c02 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,31 +19,29 @@ #include "image-view-impl.h" // EXTERNAL INCLUDES -#include -#include #include +#include +#include // INTERNAL INCLUDES -#include +#include #include -#include #include -#include -#include +#include #include +#include +#include +#include +#include namespace Dali { - namespace Toolkit { - namespace Internal { - namespace { - const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); BaseHandle Create() @@ -52,11 +50,11 @@ BaseHandle Create() } // Setup properties, signals and actions using the type-registry. -DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create ); -DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "image", MAP, IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "preMultipliedAlpha", BOOLEAN, PRE_MULTIPLIED_ALPHA ) +DALI_TYPE_REGISTRATION_BEGIN(Toolkit::ImageView, Toolkit::Control, Create); +DALI_PROPERTY_REGISTRATION(Toolkit, ImageView, "image", MAP, IMAGE) +DALI_PROPERTY_REGISTRATION(Toolkit, ImageView, "preMultipliedAlpha", BOOLEAN, PRE_MULTIPLIED_ALPHA) -DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT( Toolkit, ImageView, "pixelArea", Vector4(0.f, 0.f, 1.f, 1.f), PIXEL_AREA ) +DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT(Toolkit, ImageView, "pixelArea", Vector4(0.f, 0.f, 1.f, 1.f), PIXEL_AREA) DALI_TYPE_REGISTRATION_END() } // anonymous namespace @@ -64,10 +62,10 @@ DALI_TYPE_REGISTRATION_END() using namespace Dali; ImageView::ImageView() -: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), +: Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), mImageSize(), - mImageVisualPaddingSetByTransform( false ), - mImageViewPixelAreaSetByFittingMode( false ) + mImageVisualPaddingSetByTransform(false), + mImageViewPixelAreaSetByFittingMode(false) { } @@ -79,7 +77,7 @@ Toolkit::ImageView ImageView::New() { ImageView* impl = new ImageView(); - Toolkit::ImageView handle = Toolkit::ImageView( *impl ); + Toolkit::ImageView handle = Toolkit::ImageView(*impl); // Second-phase init of the implementation // This can only be done after the CustomActor connection has been made... @@ -93,37 +91,42 @@ Toolkit::ImageView ImageView::New() void ImageView::OnInitialize() { // ImageView can relayout in the OnImageReady, alternative to a signal would be to have a upcall from the Control to ImageView - Dali::Toolkit::Control handle( GetOwner() ); - handle.ResourceReadySignal().Connect( this, &ImageView::OnResourceReady ); + Dali::Toolkit::Control handle(GetOwner()); + handle.ResourceReadySignal().Connect(this, &ImageView::OnResourceReady); + + DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) { + return std::unique_ptr( + new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::IMAGE)); + }); } -void ImageView::SetImage( const Property::Map& map ) +void ImageView::SetImage(const Property::Map& map) { // Comparing a property map is too expensive so just creating a new visual mPropertyMap = map; mUrl.clear(); - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( mPropertyMap ); - if( visual ) + Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual(mPropertyMap); + if(visual) { // Don't set mVisual until it is ready and shown. Getters will still use current visual. - if( !mVisual ) + if(!mVisual) { mVisual = visual; } - if( !mShaderMap.Empty() ) + if(!mShaderMap.Empty()) { - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); - visualImpl.SetCustomShader( mShaderMap ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + visualImpl.SetCustomShader(mShaderMap); } - DevelControl::RegisterVisual( *this, Toolkit::ImageView::Property::IMAGE, visual ); + DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual); } else { // Unregister the exsiting visual - DevelControl::UnregisterVisual( *this, Toolkit::ImageView::Property::IMAGE ); + DevelControl::UnregisterVisual(*this, Toolkit::ImageView::Property::IMAGE); // Trigger a size negotiation request that may be needed when unregistering a visual. RelayoutRequest(); @@ -132,34 +135,34 @@ void ImageView::SetImage( const Property::Map& map ) // Signal that a Relayout may be needed } -void ImageView::SetImage( const std::string& url, ImageDimensions size ) +void ImageView::SetImage(const std::string& url, ImageDimensions size) { // Don't bother comparing if we had a visual previously, just drop old visual and create new one - mUrl = url; + mUrl = url; mImageSize = size; mPropertyMap.Clear(); // Don't set mVisual until it is ready and shown. Getters will still use current visual. - Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual( url, size ); - if( visual ) + Toolkit::Visual::Base visual = Toolkit::VisualFactory::Get().CreateVisual(url, size); + if(visual) { - if( !mVisual ) + if(!mVisual) { mVisual = visual; } - if( !mShaderMap.Empty() ) + if(!mShaderMap.Empty()) { - Internal::Visual::Base& visualImpl = Toolkit::GetImplementation( visual ); - visualImpl.SetCustomShader( mShaderMap ); + Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual); + visualImpl.SetCustomShader(mShaderMap); } - DevelControl::RegisterVisual( *this, Toolkit::ImageView::Property::IMAGE, visual ); + DevelControl::RegisterVisual(*this, Toolkit::ImageView::Property::IMAGE, visual); } else { // Unregister the exsiting visual - DevelControl::UnregisterVisual( *this, Toolkit::ImageView::Property::IMAGE ); + DevelControl::UnregisterVisual(*this, Toolkit::ImageView::Property::IMAGE); // Trigger a size negotiation request that may be needed when unregistering a visual. RelayoutRequest(); @@ -168,128 +171,174 @@ void ImageView::SetImage( const std::string& url, ImageDimensions size ) // Signal that a Relayout may be needed } -void ImageView::EnablePreMultipliedAlpha( bool preMultipled ) +void ImageView::ClearImageVisual() { - if( mVisual ) + // Clear cached properties + mPropertyMap.Clear(); + mUrl.clear(); + + // Unregister the exsiting visual + DevelControl::UnregisterVisual(*this, Toolkit::ImageView::Property::IMAGE); + + // Trigger a size negotiation request that may be needed when unregistering a visual. + RelayoutRequest(); +} + +void ImageView::EnablePreMultipliedAlpha(bool preMultipled) +{ + if(mVisual) { - Toolkit::GetImplementation( mVisual ).EnablePreMultipliedAlpha( preMultipled ); + Toolkit::GetImplementation(mVisual).EnablePreMultipliedAlpha(preMultipled); } } bool ImageView::IsPreMultipliedAlphaEnabled() const { - if( mVisual ) + if(mVisual) { - return Toolkit::GetImplementation( mVisual ).IsPreMultipliedAlphaEnabled(); + return Toolkit::GetImplementation(mVisual).IsPreMultipliedAlphaEnabled(); } return false; } -void ImageView::SetDepthIndex( int depthIndex ) +void ImageView::SetDepthIndex(int depthIndex) { - if( mVisual ) + if(mVisual) { - mVisual.SetDepthIndex( depthIndex ); + mVisual.SetDepthIndex(depthIndex); } } Vector3 ImageView::GetNaturalSize() { - if( mVisual ) + if(mVisual) { Vector2 rendererNaturalSize; - mVisual.GetNaturalSize( rendererNaturalSize ); + mVisual.GetNaturalSize(rendererNaturalSize); Extents padding; - padding = Self().GetProperty( Toolkit::Control::Property::PADDING ); + padding = Self().GetProperty(Toolkit::Control::Property::PADDING); - rendererNaturalSize.width += ( padding.start + padding.end ); - rendererNaturalSize.height += ( padding.top + padding.bottom ); - return Vector3( rendererNaturalSize ); + rendererNaturalSize.width += (padding.start + padding.end); + rendererNaturalSize.height += (padding.top + padding.bottom); + return Vector3(rendererNaturalSize); } // if no visual then use Control's natural size return Control::GetNaturalSize(); } -float ImageView::GetHeightForWidth( float width ) +float ImageView::GetHeightForWidth(float width) { Extents padding; - padding = Self().GetProperty( Toolkit::Control::Property::PADDING ); + padding = Self().GetProperty(Toolkit::Control::Property::PADDING); - if( mVisual ) + if(mVisual) { - return mVisual.GetHeightForWidth( width ) + padding.top + padding.bottom; + return mVisual.GetHeightForWidth(width) + padding.top + padding.bottom; } else { - return Control::GetHeightForWidth( width ) + padding.top + padding.bottom; + return Control::GetHeightForWidth(width) + padding.top + padding.bottom; } } -float ImageView::GetWidthForHeight( float height ) +float ImageView::GetWidthForHeight(float height) { Extents padding; - padding = Self().GetProperty( Toolkit::Control::Property::PADDING ); + padding = Self().GetProperty(Toolkit::Control::Property::PADDING); - if( mVisual ) + if(mVisual) { - return mVisual.GetWidthForHeight( height ) + padding.start + padding.end; + return mVisual.GetWidthForHeight(height) + padding.start + padding.end; } else { - return Control::GetWidthForHeight( height ) + padding.start + padding.end; + return Control::GetWidthForHeight(height) + padding.start + padding.end; } } -void ImageView::OnRelayout( const Vector2& size, RelayoutContainer& container ) +void ImageView::OnRelayout(const Vector2& size, RelayoutContainer& container) { - Control::OnRelayout( size, container ); - if( mVisual ) + Control::OnRelayout(size, container); + if(mVisual) { Property::Map transformMap = Property::Map(); - Extents padding = Self().GetProperty( Toolkit::Control::Property::PADDING ); + Extents padding = Self().GetProperty(Toolkit::Control::Property::PADDING); - bool zeroPadding = ( padding == Extents() ); + bool zeroPadding = (padding == Extents()); Vector2 naturalSize; - mVisual.GetNaturalSize( naturalSize ); + mVisual.GetNaturalSize(naturalSize); Dali::LayoutDirection::Type layoutDirection = static_cast( - Self().GetProperty( Dali::Actor::Property::LAYOUT_DIRECTION ).Get() ); - if( Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection ) + Self().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); + if(Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection) { - std::swap( padding.start, padding.end ); + std::swap(padding.start, padding.end); } // remove padding from the size to know how much is left for the visual - Vector2 finalSize = size - Vector2( padding.start + padding.end, padding.top + padding.bottom ); - Vector2 finalOffset = Vector2( padding.start, padding.top ); + Vector2 finalSize = size - Vector2(padding.start + padding.end, padding.top + padding.bottom); + Vector2 finalOffset = Vector2(padding.start, padding.top); - ApplyFittingMode( finalSize, naturalSize, finalOffset, zeroPadding , transformMap ); + ApplyFittingMode(finalSize, naturalSize, finalOffset, zeroPadding, transformMap); - mVisual.SetTransformAndSize( transformMap, size ); + mVisual.SetTransformAndSize(transformMap, size); // mVisual is not updated util the resource is ready in the case of visual replacement. // in this case, the Property Map must be initialized so that the previous value is not reused. // after mVisual is updated, the correct value will be reset. - Toolkit::Visual::Base visual = DevelControl::GetVisual( *this, Toolkit::ImageView::Property::IMAGE ); - if( visual && visual != mVisual ) + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE); + if(visual && visual != mVisual) + { + visual.SetTransformAndSize(Property::Map(), size); + } + } +} + +void ImageView::OnCreateTransitions(std::vector>& sourceProperties, + std::vector>& destinationProperties, + Dali::Toolkit::Control source, + Dali::Toolkit::Control destination) +{ + // Retrieves image properties to be transitioned. + Dali::Property::Map imageSourcePropertyMap, imageDestinationPropertyMap; + MakeVisualTransition(imageSourcePropertyMap, imageDestinationPropertyMap, source, destination, Toolkit::ImageView::Property::IMAGE); + if(imageSourcePropertyMap.Count() > 0) + { + sourceProperties.push_back(std::pair(Toolkit::ImageView::Property::IMAGE, imageSourcePropertyMap)); + destinationProperties.push_back(std::pair(Toolkit::ImageView::Property::IMAGE, imageDestinationPropertyMap)); + } +} + +void ImageView::OnUpdateVisualProperties(const std::vector>& properties) +{ + Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE); + if(visual) + { + Dali::Toolkit::Control handle(GetOwner()); + + for(auto&& data : properties) { - visual.SetTransformAndSize( Property::Map(), size ); + if(data.first == Toolkit::ImageView::Property::IMAGE) + { + DevelControl::DoAction(handle, Toolkit::ImageView::Property::IMAGE, DevelVisual::Action::UPDATE_PROPERTY, data.second); + break; + } } } } -void ImageView::OnResourceReady( Toolkit::Control control ) +void ImageView::OnResourceReady(Toolkit::Control control) { // Visual ready so update visual attached to this ImageView, following call to RelayoutRequest will use this visual. - mVisual = DevelControl::GetVisual( *this, Toolkit::ImageView::Property::IMAGE ); + mVisual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE); // Signal that a Relayout may be needed } -void ImageView::SetTransformMapForFittingMode( Vector2 finalSize, Vector2 naturalSize, Vector2 finalOffset, Visual::FittingMode fittingMode, Property::Map& transformMap ) +void ImageView::SetTransformMapForFittingMode(Vector2 finalSize, Vector2 naturalSize, Vector2 finalOffset, Visual::FittingMode fittingMode, Property::Map& transformMap) { switch(fittingMode) { @@ -298,63 +347,63 @@ void ImageView::SetTransformMapForFittingMode( Vector2 finalSize, Vector2 natura auto availableVisualSize = finalSize; // scale to fit the padded area - finalSize = naturalSize * std::min( ( naturalSize.width ? ( availableVisualSize.width / naturalSize.width ) : 0 ), - ( naturalSize.height ? ( availableVisualSize.height / naturalSize.height ) : 0 ) ); + finalSize = naturalSize * std::min((naturalSize.width ? (availableVisualSize.width / naturalSize.width) : 0), + (naturalSize.height ? (availableVisualSize.height / naturalSize.height) : 0)); // calculate final offset within the padded area - finalOffset += ( availableVisualSize - finalSize ) * .5f; + finalOffset += (availableVisualSize - finalSize) * .5f; // populate the transform map - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET, finalOffset ) - .Add( Toolkit::Visual::Transform::Property::SIZE, finalSize ); + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET, finalOffset) + .Add(Toolkit::Visual::Transform::Property::SIZE, finalSize); break; } case Visual::FittingMode::OVER_FIT_KEEP_ASPECT_RATIO: { mImageViewPixelAreaSetByFittingMode = true; - auto availableVisualSize = finalSize; - finalSize = naturalSize * std::max( ( naturalSize.width ? ( availableVisualSize.width / naturalSize.width ) : 0 ), - ( naturalSize.height ? ( availableVisualSize.height / naturalSize.height ) : 0 ) ); + auto availableVisualSize = finalSize; + finalSize = naturalSize * std::max((naturalSize.width ? (availableVisualSize.width / naturalSize.width) : 0), + (naturalSize.height ? (availableVisualSize.height / naturalSize.height) : 0)); auto originalOffset = finalOffset; - finalOffset += ( availableVisualSize - finalSize ) * .5f; + finalOffset += (availableVisualSize - finalSize) * .5f; - float x = abs( (availableVisualSize.width - finalSize.width ) / finalSize.width )* .5f; - float y = abs( (availableVisualSize.height - finalSize.height ) / finalSize.height ) * .5f; - float widthRatio = 1.f - abs( (availableVisualSize.width - finalSize.width ) / finalSize.width ); - float heightRatio = 1.f - abs( (availableVisualSize.height - finalSize.height ) / finalSize.height ); - Vector4 pixelArea = Vector4( x, y, widthRatio, heightRatio); - Self().SetProperty( Toolkit::ImageView::Property::PIXEL_AREA, pixelArea ); + float x = abs((availableVisualSize.width - finalSize.width) / finalSize.width) * .5f; + float y = abs((availableVisualSize.height - finalSize.height) / finalSize.height) * .5f; + float widthRatio = 1.f - abs((availableVisualSize.width - finalSize.width) / finalSize.width); + float heightRatio = 1.f - abs((availableVisualSize.height - finalSize.height) / finalSize.height); + Vector4 pixelArea = Vector4(x, y, widthRatio, heightRatio); + Self().SetProperty(Toolkit::ImageView::Property::PIXEL_AREA, pixelArea); // populate the transform map - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET, originalOffset ) - .Add( Toolkit::Visual::Transform::Property::SIZE, availableVisualSize ); + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET, originalOffset) + .Add(Toolkit::Visual::Transform::Property::SIZE, availableVisualSize); break; } case Visual::FittingMode::CENTER: { auto availableVisualSize = finalSize; - if( availableVisualSize.width > naturalSize.width && availableVisualSize.height > naturalSize.height ) + if(availableVisualSize.width > naturalSize.width && availableVisualSize.height > naturalSize.height) { finalSize = naturalSize; } else { - finalSize = naturalSize * std::min( ( naturalSize.width ? ( availableVisualSize.width / naturalSize.width ) : 0 ), - ( naturalSize.height ? ( availableVisualSize.height / naturalSize.height ) : 0 ) ); + finalSize = naturalSize * std::min((naturalSize.width ? (availableVisualSize.width / naturalSize.width) : 0), + (naturalSize.height ? (availableVisualSize.height / naturalSize.height) : 0)); } - finalOffset += ( availableVisualSize - finalSize ) * .5f; + finalOffset += (availableVisualSize - finalSize) * .5f; // populate the transform map - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET, finalOffset ) - .Add( Toolkit::Visual::Transform::Property::SIZE, finalSize ); + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET, finalOffset) + .Add(Toolkit::Visual::Transform::Property::SIZE, finalSize); break; } case Visual::FittingMode::FILL: { - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET, finalOffset ) - .Add( Toolkit::Visual::Transform::Property::SIZE, finalSize ); + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET, finalOffset) + .Add(Toolkit::Visual::Transform::Property::SIZE, finalSize); break; } case Visual::FittingMode::FIT_WIDTH: @@ -366,53 +415,53 @@ void ImageView::SetTransformMapForFittingMode( Vector2 finalSize, Vector2 natura } } -void ImageView::ApplyFittingMode( Vector2 finalSize, Vector2 naturalSize, Vector2 finalOffset, bool zeroPadding , Property::Map& transformMap ) +void ImageView::ApplyFittingMode(Vector2 finalSize, Vector2 naturalSize, Vector2 finalOffset, bool zeroPadding, Property::Map& transformMap) { - Visual::FittingMode fittingMode = Toolkit::GetImplementation(mVisual).GetFittingMode(); + Visual::FittingMode fittingMode = Toolkit::GetImplementation(mVisual).GetFittingMode(); - // Reset PIXEL_AREA after using OVER_FIT_KEEP_ASPECT_RATIO - if( mImageViewPixelAreaSetByFittingMode ) - { - Self().SetProperty( Toolkit::ImageView::Property::PIXEL_AREA, FULL_TEXTURE_RECT ); - mImageViewPixelAreaSetByFittingMode = false; - } - - if( ( !zeroPadding ) || // If padding is not zero - ( fittingMode != Visual::FittingMode::FILL ) ) - { - mImageVisualPaddingSetByTransform = true; - - // If FittingMode use FIT_WIDTH or FIT_HEIGTH, it need to change proper fittingMode - if( fittingMode == Visual::FittingMode::FIT_WIDTH ) - { - fittingMode = ( finalSize.height / naturalSize.height ) < ( finalSize.width / naturalSize.width ) ? Visual::FittingMode::OVER_FIT_KEEP_ASPECT_RATIO : Visual::FittingMode::FIT_KEEP_ASPECT_RATIO; - } - else if( fittingMode == Visual::FittingMode::FIT_HEIGHT ) - { - fittingMode = ( finalSize.height / naturalSize.height ) < ( finalSize.width / naturalSize.width ) ? Visual::FittingMode::FIT_KEEP_ASPECT_RATIO : Visual::FittingMode::OVER_FIT_KEEP_ASPECT_RATIO; - } + // Reset PIXEL_AREA after using OVER_FIT_KEEP_ASPECT_RATIO + if(mImageViewPixelAreaSetByFittingMode) + { + Self().SetProperty(Toolkit::ImageView::Property::PIXEL_AREA, FULL_TEXTURE_RECT); + mImageViewPixelAreaSetByFittingMode = false; + } - SetTransformMapForFittingMode( finalSize, naturalSize, finalOffset, fittingMode, transformMap ); + if((!zeroPadding) || // If padding is not zero + (fittingMode != Visual::FittingMode::FILL)) + { + mImageVisualPaddingSetByTransform = true; - // Set extra value for applying transformMap - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, - Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ) - .Add( Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN ) - .Add( Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN ) - .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, - Vector2( Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE ) ); + // If FittingMode use FIT_WIDTH or FIT_HEIGTH, it need to change proper fittingMode + if(fittingMode == Visual::FittingMode::FIT_WIDTH) + { + fittingMode = (finalSize.height / naturalSize.height) < (finalSize.width / naturalSize.width) ? Visual::FittingMode::OVER_FIT_KEEP_ASPECT_RATIO : Visual::FittingMode::FIT_KEEP_ASPECT_RATIO; } - else if ( mImageVisualPaddingSetByTransform && zeroPadding ) // Reset offset to zero only if padding applied previously + else if(fittingMode == Visual::FittingMode::FIT_HEIGHT) { - mImageVisualPaddingSetByTransform = false; - // Reset the transform map - transformMap.Add( Toolkit::Visual::Transform::Property::OFFSET, Vector2::ZERO ) - .Add( Toolkit::Visual::Transform::Property::OFFSET_POLICY, - Vector2( Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE ) ) - .Add( Toolkit::Visual::Transform::Property::SIZE, Vector2::ONE ) - .Add( Toolkit::Visual::Transform::Property::SIZE_POLICY, - Vector2( Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE ) ); + fittingMode = (finalSize.height / naturalSize.height) < (finalSize.width / naturalSize.width) ? Visual::FittingMode::FIT_KEEP_ASPECT_RATIO : Visual::FittingMode::OVER_FIT_KEEP_ASPECT_RATIO; } + + SetTransformMapForFittingMode(finalSize, naturalSize, finalOffset, fittingMode, transformMap); + + // Set extra value for applying transformMap + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, + Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)) + .Add(Toolkit::Visual::Transform::Property::ORIGIN, Toolkit::Align::TOP_BEGIN) + .Add(Toolkit::Visual::Transform::Property::ANCHOR_POINT, Toolkit::Align::TOP_BEGIN) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, + Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE)); + } + else if(mImageVisualPaddingSetByTransform && zeroPadding) // Reset offset to zero only if padding applied previously + { + mImageVisualPaddingSetByTransform = false; + // Reset the transform map + transformMap.Add(Toolkit::Visual::Transform::Property::OFFSET, Vector2::ZERO) + .Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY, + Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE)) + .Add(Toolkit::Visual::Transform::Property::SIZE, Vector2::ONE) + .Add(Toolkit::Visual::Transform::Property::SIZE_POLICY, + Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE)); + } } /////////////////////////////////////////////////////////// @@ -420,54 +469,67 @@ void ImageView::ApplyFittingMode( Vector2 finalSize, Vector2 naturalSize, Vector // Properties // -void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value ) +void ImageView::SetProperty(BaseObject* object, Property::Index index, const Property::Value& value) { - Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) ); + Toolkit::ImageView imageView = Toolkit::ImageView::DownCast(Dali::BaseHandle(object)); - if ( imageView ) + if(imageView) { - ImageView& impl = GetImpl( imageView ); - switch ( index ) + ImageView& impl = GetImpl(imageView); + switch(index) { case Toolkit::ImageView::Property::IMAGE: { - std::string imageUrl; - Property::Map* map; - if( value.Get( imageUrl ) ) + std::string imageUrl; + const Property::Map* map; + if(value.Get(imageUrl)) { - impl.SetImage( imageUrl, ImageDimensions() ); + impl.SetImage(imageUrl, ImageDimensions()); } // if its not a string then get a Property::Map from the property if possible. else { map = value.GetMap(); - if( map ) + if(DALI_LIKELY(map)) { - Property::Value* shaderValue = map->Find( Toolkit::Visual::Property::SHADER, CUSTOM_SHADER ); - // set image only if property map contains image information other than custom shader - if( map->Count() > 1u || !shaderValue ) + // the property map is emtpy map. Unregister visual. + if(DALI_UNLIKELY(map->Count() == 0u)) { - impl.SetImage( *map ); + impl.ClearImageVisual(); } - // the property map contains only the custom shader - else if( ( map->Count() == 1u )&&( shaderValue ) ) + else { - Property::Map* shaderMap = shaderValue->GetMap(); - if( shaderMap ) + Property::Value* shaderValue = map->Find(Toolkit::Visual::Property::SHADER, CUSTOM_SHADER); + // set image only if property map contains image information other than custom shader + if(map->Count() > 1u || !shaderValue) { - impl.mShaderMap = *shaderMap; - - if( !impl.mUrl.empty() ) - { - impl.SetImage( impl.mUrl, impl.mImageSize ); - } - else if( !impl.mPropertyMap.Empty() ) + impl.SetImage(*map); + } + // the property map contains only the custom shader + else if((map->Count() == 1u) && (shaderValue)) + { + Property::Map* shaderMap = shaderValue->GetMap(); + if(shaderMap) { - impl.SetImage( impl.mPropertyMap ); + impl.mShaderMap = *shaderMap; + + if(!impl.mUrl.empty()) + { + impl.SetImage(impl.mUrl, impl.mImageSize); + } + else if(!impl.mPropertyMap.Empty()) + { + impl.SetImage(impl.mPropertyMap); + } } } } } + else + { + // invalid property value comes. Unregister visual. + impl.ClearImageVisual(); + } } break; } @@ -475,9 +537,9 @@ void ImageView::SetProperty( BaseObject* object, Property::Index index, const Pr case Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA: { bool isPre; - if( value.Get( isPre ) ) + if(value.Get(isPre)) { - impl.EnablePreMultipliedAlpha( isPre ); + impl.EnablePreMultipliedAlpha(isPre); } break; } @@ -485,30 +547,30 @@ void ImageView::SetProperty( BaseObject* object, Property::Index index, const Pr } } -Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex ) +Property::Value ImageView::GetProperty(BaseObject* object, Property::Index propertyIndex) { Property::Value value; - Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) ); + Toolkit::ImageView imageview = Toolkit::ImageView::DownCast(Dali::BaseHandle(object)); - if ( imageview ) + if(imageview) { - ImageView& impl = GetImpl( imageview ); - switch ( propertyIndex ) + ImageView& impl = GetImpl(imageview); + switch(propertyIndex) { case Toolkit::ImageView::Property::IMAGE: { - if ( !impl.mUrl.empty() ) + if(!impl.mUrl.empty()) { value = impl.mUrl; } else { - Property::Map map; - Toolkit::Visual::Base visual = DevelControl::GetVisual( impl, Toolkit::ImageView::Property::IMAGE ); - if( visual ) + Property::Map map; + Toolkit::Visual::Base visual = DevelControl::GetVisual(impl, Toolkit::ImageView::Property::IMAGE); + if(visual) { - visual.CreatePropertyMap( map ); + visual.CreatePropertyMap(map); } value = map; }