+ Property::Map transformMap = Property::Map();
+
+ // Don't transform if fitting mode is FILL
+ if(Toolkit::GetImplementation(mVisual).GetFittingMode() == Visual::FittingMode::FIT_KEEP_ASPECT_RATIO)
+ {
+ Extents padding;
+ padding = Self().GetProperty<Extents>( Toolkit::Control::Property::PADDING );
+
+ Dali::LayoutDirection::Type layoutDirection = static_cast<Dali::LayoutDirection::Type>(
+ Self().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get<int>());
+
+ if (Dali::LayoutDirection::RIGHT_TO_LEFT == layoutDirection)
+ {
+ std::swap(padding.start, padding.end);
+ }
+
+ // remove padding from the size to know how much is left for the visual
+ auto paddedSize = size - Vector2(padding.start + padding.end, padding.top + padding.bottom);
+
+ Vector2 naturalSize;
+ mVisual.GetNaturalSize(naturalSize);
+
+ // scale to fit the padded area
+ auto finalSize =
+ naturalSize * std::min( ( naturalSize.width ? ( paddedSize.width / naturalSize.width ) : 0 ),
+ ( naturalSize.height ? ( paddedSize.height / naturalSize.height ) : 0 ) );
+
+ // calculate final offset within the padded area
+ auto finalOffset = Vector2(padding.start, padding.top) + (paddedSize - finalSize) * .5f;