[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / image-atlas-manager.cpp
index 9697e50..25fff39 100644 (file)
@@ -1,5 +1,5 @@
- /*
- * Copyright (c) 2016 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.
 #include "image-atlas-manager.h"
 
 // EXTERNAL HEADER
-#include <dali/devel-api/images/texture-set-image.h>
-#include <dali/public-api/images/resource-image.h>
+#include <dali/devel-api/adaptor-framework/image-loading.h>
+
+// INTERNAL HEADERS
+#include <dali-toolkit/internal/image-loader/image-atlas-impl.h>
 
 namespace Dali
 {
-
 namespace Toolkit
 {
-
 namespace Internal
 {
-
 namespace
 {
-const uint32_t DEFAULT_ATLAS_SIZE( 1024u ); // this size can fit 8 by 8 images of average size 128*128
-const uint32_t MAX_ITEM_SIZE( 512u  );
-const uint32_t MAX_ITEM_AREA( MAX_ITEM_SIZE*MAX_ITEM_SIZE  );
-}
+const uint32_t DEFAULT_ATLAS_SIZE(1024u); // this size can fit 8 by 8 images of average size 128*128
+const uint32_t MAX_ITEM_SIZE(512u);
+const uint32_t MAX_ITEM_AREA(MAX_ITEM_SIZE* MAX_ITEM_SIZE);
+} // namespace
 
 ImageAtlasManager::ImageAtlasManager()
-: mBrokenImageUrl( "" )
+: mBrokenImageUrl("")
 {
 }
 
@@ -47,31 +46,48 @@ ImageAtlasManager::~ImageAtlasManager()
 {
 }
 
-TextureSet ImageAtlasManager::Add( Vector4& textureRect,
-                                 const std::string& url,
-                                 ImageDimensions size,
-                                 FittingMode::Type fittingMode,
-                                 bool orientationCorrection )
+bool ImageAtlasManager::CheckAtlasAvailable(const VisualUrl& url, const ImageDimensions& size) const
 {
   ImageDimensions dimensions = size;
   ImageDimensions zero;
-  if( size == zero )
+  if(size == zero)
   {
-    dimensions = ResourceImage::GetImageSize( url );
+    dimensions = Dali::GetClosestImageSize(url.GetUrl());
   }
 
   // big image, atlasing is not applied
-  if( static_cast<uint32_t>(dimensions.GetWidth()) * static_cast<uint32_t>(dimensions.GetHeight()) > MAX_ITEM_AREA
-      || dimensions.GetWidth()>DEFAULT_ATLAS_SIZE
-      || dimensions.GetHeight()>DEFAULT_ATLAS_SIZE)
+  if(static_cast<uint32_t>(dimensions.GetWidth()) * static_cast<uint32_t>(dimensions.GetHeight()) > MAX_ITEM_AREA || dimensions.GetWidth() > DEFAULT_ATLAS_SIZE || dimensions.GetHeight() > DEFAULT_ATLAS_SIZE)
+  {
+    return false;
+  }
+  return true;
+}
+
+TextureSet ImageAtlasManager::Add(Vector4&             textureRect,
+                                  const VisualUrl&     url,
+                                  ImageDimensions&     size,
+                                  FittingMode::Type    fittingMode,
+                                  bool                 orientationCorrection,
+                                  AtlasUploadObserver* atlasUploadObserver)
+{
+  ImageDimensions dimensions = size;
+  ImageDimensions zero;
+  if(size == zero)
+  {
+    dimensions = Dali::GetClosestImageSize(url.GetUrl());
+  }
+
+  // big image, atlasing is not applied
+  if(static_cast<uint32_t>(dimensions.GetWidth()) * static_cast<uint32_t>(dimensions.GetHeight()) > MAX_ITEM_AREA || dimensions.GetWidth() > DEFAULT_ATLAS_SIZE || dimensions.GetHeight() > DEFAULT_ATLAS_SIZE)
   {
     return TextureSet();
   }
+  size = dimensions;
 
-  unsigned int i = 0;
-  for( AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
+  uint32_t i = 0;
+  for(AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
   {
-    if( (*iter).Upload( textureRect, url, size, fittingMode, orientationCorrection ) )
+    if(GetImplementation(*iter).Upload(textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver))
     {
       return mTextureSetList[i];
     }
@@ -79,26 +95,51 @@ TextureSet ImageAtlasManager::Add( Vector4& textureRect,
   }
 
   CreateNewAtlas();
-  mAtlasList.back().Upload( textureRect, url, size, fittingMode, orientationCorrection );
+  GetImplementation(mAtlasList.back()).Upload(textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver);
   return mTextureSetList.back();
 }
 
-TextureSet ImageAtlasManager::Add( Vector4& textureRect,
-                                 PixelData pixelData )
+TextureSet ImageAtlasManager::Add(Vector4&                  textureRect,
+                                  const EncodedImageBuffer& encodedImageBuffer,
+                                  const ImageDimensions&    size,
+                                  FittingMode::Type         fittingMode,
+                                  bool                      orientationCorrection,
+                                  AtlasUploadObserver*      atlasUploadObserver)
 {
+  // big image, atlasing is not applied
+  if(static_cast<uint32_t>(size.GetWidth()) * static_cast<uint32_t>(size.GetHeight()) > MAX_ITEM_AREA || size.GetWidth() > DEFAULT_ATLAS_SIZE || size.GetHeight() > DEFAULT_ATLAS_SIZE)
+  {
+    return TextureSet();
+  }
+
+  uint32_t i = 0;
+  for(AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
+  {
+    if(GetImplementation(*iter).Upload(textureRect, encodedImageBuffer, size, fittingMode, orientationCorrection, atlasUploadObserver))
+    {
+      return mTextureSetList[i];
+    }
+    i++;
+  }
+
+  CreateNewAtlas();
+  GetImplementation(mAtlasList.back()).Upload(textureRect, encodedImageBuffer, size, fittingMode, orientationCorrection, atlasUploadObserver);
+  return mTextureSetList.back();
+}
 
+TextureSet ImageAtlasManager::Add(Vector4&  textureRect,
+                                  PixelData pixelData)
+{
   // big buffer, atlasing is not applied
-  if( static_cast<uint32_t>(pixelData.GetWidth()) * static_cast<uint32_t>(pixelData.GetHeight()) > MAX_ITEM_AREA
-      || pixelData.GetWidth()>DEFAULT_ATLAS_SIZE
-      || pixelData.GetHeight()>DEFAULT_ATLAS_SIZE )
+  if(static_cast<uint32_t>(pixelData.GetWidth()) * static_cast<uint32_t>(pixelData.GetHeight()) > MAX_ITEM_AREA || pixelData.GetWidth() > DEFAULT_ATLAS_SIZE || pixelData.GetHeight() > DEFAULT_ATLAS_SIZE)
   {
     return TextureSet();
   }
 
-  unsigned int i = 0;
-  for( AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
+  uint32_t i = 0;
+  for(AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
   {
-    if( (*iter).Upload( textureRect, pixelData ) )
+    if((*iter).Upload(textureRect, pixelData))
     {
       return mTextureSetList[i];
     }
@@ -106,17 +147,16 @@ TextureSet ImageAtlasManager::Add( Vector4& textureRect,
   }
 
   CreateNewAtlas();
-  mAtlasList.back().Upload( textureRect, pixelData );
+  mAtlasList.back().Upload(textureRect, pixelData);
   return mTextureSetList.back();
-
 }
 
-void ImageAtlasManager::Remove( TextureSet textureSet, const Vector4& textureRect )
+void ImageAtlasManager::Remove(TextureSet textureSet, const Vector4& textureRect)
 {
-  unsigned int i = 0;
-  for( TextureSetContainer::iterator iter = mTextureSetList.begin(); iter != mTextureSetList.end(); ++iter)
+  uint32_t i = 0;
+  for(TextureSetContainer::iterator iter = mTextureSetList.begin(); iter != mTextureSetList.end(); ++iter)
   {
-    if( (*iter) == textureSet )
+    if((*iter) == textureSet)
     {
       mAtlasList[i].Remove(textureRect);
       return;
@@ -125,9 +165,9 @@ void ImageAtlasManager::Remove( TextureSet textureSet, const Vector4& textureRec
   }
 }
 
-void ImageAtlasManager::SetBrokenImage( const std::string& brokenImageUrl )
+void ImageAtlasManager::SetBrokenImage(const std::string& brokenImageUrl)
 {
-  if( !brokenImageUrl.empty() )
+  if(!brokenImageUrl.empty())
   {
     mBrokenImageUrl = brokenImageUrl;
   }
@@ -135,15 +175,15 @@ void ImageAtlasManager::SetBrokenImage( const std::string& brokenImageUrl )
 
 void ImageAtlasManager::CreateNewAtlas()
 {
-  Toolkit::ImageAtlas newAtlas = Toolkit::ImageAtlas::New( DEFAULT_ATLAS_SIZE, DEFAULT_ATLAS_SIZE  );
-  if( !mBrokenImageUrl.empty() )
+  Toolkit::ImageAtlas newAtlas = Toolkit::ImageAtlas::New(DEFAULT_ATLAS_SIZE, DEFAULT_ATLAS_SIZE);
+  if(!mBrokenImageUrl.empty())
   {
-    newAtlas.SetBrokenImage( mBrokenImageUrl );
+    newAtlas.SetBrokenImage(mBrokenImageUrl);
   }
-  mAtlasList.push_back( newAtlas );
+  mAtlasList.push_back(newAtlas);
   TextureSet textureSet = TextureSet::New();
-  TextureSetImage( textureSet, 0u, newAtlas.GetAtlas() );
-  mTextureSetList.push_back( textureSet );
+  textureSet.SetTexture(0u, newAtlas.GetAtlas());
+  mTextureSetList.push_back(textureSet);
 }
 
 } // namespace Internal