FittingMode Refactoring 11/307711/8
authorsunghyun kim <scholb.kim@samsung.com>
Tue, 12 Mar 2024 10:03:05 +0000 (19:03 +0900)
committersunghyun kim <scholb.kim@samsung.com>
Tue, 21 May 2024 05:15:40 +0000 (14:15 +0900)
Calculate desired size in dali side

Change-Id: I7826fbf5fbbf48eb08846c2666d4748a84ef1f7d

dali/internal/imaging/common/image-operations.cpp
dali/internal/imaging/common/image-operations.h
dali/internal/imaging/common/loader-jpeg-turbo.cpp

index 93b23dd..d33b48b 100644 (file)
@@ -191,6 +191,7 @@ BoxDimensionTest DimensionTestForScalingMode(FittingMode::Type fittingMode)
     }
     // 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;
@@ -306,6 +307,7 @@ ImageDimensions FitToScalingMode(ImageDimensions requestedSize, ImageDimensions
       break;
     }
     case FittingMode::SCALE_TO_FILL:
+    case FittingMode::VISUAL_FITTING:
     {
       fitDimensions = FitForScaleToFill(requestedSize, sourceSize);
       break;
@@ -378,6 +380,7 @@ void CalculateBordersFromFittingMode(ImageDimensions sourceSize, FittingMode::Ty
     }
 
     case FittingMode::SCALE_TO_FILL:
+    case FittingMode::VISUAL_FITTING:
     {
       const float sourceAspect(static_cast<float>(sourceWidth) / static_cast<float>(sourceHeight));
       if(sourceAspect > targetAspect)
@@ -435,7 +438,7 @@ Dali::Devel::PixelBuffer MakePixelBuffer(const uint8_t* const pixels, Pixel::For
  * @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();
 
@@ -463,6 +466,28 @@ ImageDimensions CalculateDesiredDimensions(uint32_t bitmapWidth, uint32_t bitmap
   // 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);
@@ -894,9 +919,9 @@ void VerticalSkew(const uint8_t* const srcBufferPtr,
 }
 } // 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);
 }
 
 /**
@@ -936,7 +961,7 @@ Dali::Devel::PixelBuffer ApplyAttributesToBitmap(Dali::Devel::PixelBuffer bitmap
   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
index 228f710..0cee745 100644 (file)
@@ -59,7 +59,7 @@ typedef Uint16Pair ImageDimensions;
  * @param[in] requestedDimensions Width and 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(ImageDimensions rawDimensions, ImageDimensions requestedDimensions);
+ImageDimensions CalculateDesiredDimensions(ImageDimensions rawDimensions, ImageDimensions requestedDimensions, FittingMode::Type fittingMode);
 
 /**
  * @defgroup BitmapOperations Bitmap-to-Bitmap Image operations.
index 86daa1f..6cf24ce 100644 (file)
@@ -1180,7 +1180,7 @@ bool TransformSize(int requiredWidth, int requiredHeight, FittingMode::Type fitt
   }
 
   // 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();
 
@@ -1233,7 +1233,7 @@ bool TransformSize(int requiredWidth, int requiredHeight, FittingMode::Type fitt
         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;
         }