}
// Scale to fill mode keeps both dimensions at least as large as desired:
case FittingMode::SCALE_TO_FILL:
+ case FittingMode::VISUAL_FITTING:
{
dimensionTest = BoxDimensionTestBoth;
break;
break;
}
case FittingMode::SCALE_TO_FILL:
+ case FittingMode::VISUAL_FITTING:
{
fitDimensions = FitForScaleToFill(requestedSize, sourceSize);
break;
}
case FittingMode::SCALE_TO_FILL:
+ case FittingMode::VISUAL_FITTING:
{
const float sourceAspect(static_cast<float>(sourceWidth) / static_cast<float>(sourceHeight));
if(sourceAspect > targetAspect)
* @param[in] requestedHeight Height of area to scale image into. Can be zero.
* @return Dimensions of area to scale image into after special rules are applied.
*/
-ImageDimensions CalculateDesiredDimensions(uint32_t bitmapWidth, uint32_t bitmapHeight, uint32_t requestedWidth, uint32_t requestedHeight)
+ImageDimensions CalculateDesiredDimensions(uint32_t bitmapWidth, uint32_t bitmapHeight, uint32_t requestedWidth, uint32_t requestedHeight, FittingMode::Type fittingMode)
{
uint32_t maxSize = Dali::GetMaxTextureSize();
// If both dimensions have values requested, use them both:
if(requestedWidth != 0 && requestedHeight != 0)
{
+ DALI_ASSERT_DEBUG( (bitmapWidth > 0 && bitmapHeight > 0) && "Bitmap dimensions are zero");
+
+ if(fittingMode == FittingMode::VISUAL_FITTING)
+ {
+ uint32_t adjustedDesiredWidth, adjustedDesiredHeight;
+ float aspectOfDesiredSize = (float)requestedHeight / (float)requestedWidth;
+ float aspectOfImageSize = (float)bitmapHeight / (float)bitmapWidth;
+ if (aspectOfImageSize > aspectOfDesiredSize)
+ {
+ adjustedDesiredWidth = requestedWidth;
+ adjustedDesiredHeight = static_cast<uint64_t>(bitmapHeight) * requestedWidth / bitmapWidth;
+ }
+ else
+ {
+ adjustedDesiredWidth = static_cast<uint64_t>(bitmapWidth) * requestedHeight / bitmapHeight;
+ adjustedDesiredHeight = requestedHeight;
+ }
+
+ requestedWidth = adjustedDesiredWidth;
+ requestedHeight = adjustedDesiredHeight;
+ }
+
if(requestedWidth <= maxSize && requestedHeight <= maxSize)
{
return ImageDimensions(requestedWidth, requestedHeight);
}
} // namespace
-ImageDimensions CalculateDesiredDimensions(ImageDimensions rawDimensions, ImageDimensions requestedDimensions)
+ImageDimensions CalculateDesiredDimensions(ImageDimensions rawDimensions, ImageDimensions requestedDimensions, FittingMode::Type fittingMode)
{
- return CalculateDesiredDimensions(rawDimensions.GetWidth(), rawDimensions.GetHeight(), requestedDimensions.GetWidth(), requestedDimensions.GetHeight());
+ return CalculateDesiredDimensions(rawDimensions.GetWidth(), rawDimensions.GetHeight(), requestedDimensions.GetWidth(), requestedDimensions.GetHeight(), fittingMode);
}
/**
if(bitmap)
{
// Calculate the desired box, accounting for a possible zero component:
- const ImageDimensions desiredDimensions = CalculateDesiredDimensions(bitmap.GetWidth(), bitmap.GetHeight(), dimensions.GetWidth(), dimensions.GetHeight());
+ const ImageDimensions desiredDimensions = CalculateDesiredDimensions(bitmap.GetWidth(), bitmap.GetHeight(), dimensions.GetWidth(), dimensions.GetHeight(), fittingMode);
// If a different size than the raw one has been requested, resize the image
// maximally using a repeated box filter without making it smaller than the
}
// Apply the special rules for when there are one or two zeros in requested dimensions:
- const ImageDimensions correctedDesired = Internal::Platform::CalculateDesiredDimensions(ImageDimensions(postXformImageWidth, postXformImageHeight), ImageDimensions(requiredWidth, requiredHeight));
+ const ImageDimensions correctedDesired = Internal::Platform::CalculateDesiredDimensions(ImageDimensions(postXformImageWidth, postXformImageHeight), ImageDimensions(requiredWidth, requiredHeight), fittingMode);
requiredWidth = correctedDesired.GetWidth();
requiredHeight = correctedDesired.GetHeight();
bool widthLessRequired = scaledWidth < requiredWidth;
bool heightLessRequired = scaledHeight < requiredHeight;
// If either scaled dimension is smaller than the desired one, we were done at the last iteration
- if((fittingMode == FittingMode::SCALE_TO_FILL) && (widthLessRequired || heightLessRequired))
+ if(((fittingMode == FittingMode::SCALE_TO_FILL) || (fittingMode == FittingMode::VISUAL_FITTING)) && (widthLessRequired || heightLessRequired))
{
break;
}