Make option to create ImageVisual even if we use webp / gif 77/311177/3
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 15 May 2024 23:31:03 +0000 (08:31 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 27 May 2024 00:38:21 +0000 (09:38 +0900)
Let we make some way to use ImageVisual forcibly even if url suffix is animated.

Change-Id: I60f63d55c386e64c82b41d74632af2889e2cb707
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp
dali-toolkit/devel-api/visual-factory/visual-factory.cpp
dali-toolkit/devel-api/visual-factory/visual-factory.h
dali-toolkit/internal/visuals/visual-factory-impl.cpp
dali-toolkit/internal/visuals/visual-factory-impl.h

index 726a7b8..0008729 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -28,8 +28,8 @@
 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
 #include <dali-toolkit/internal/visuals/npatch-loader.h>
 #include <dali/devel-api/adaptor-framework/image-loading.h>
-#include <dali/integration-api/debug.h>
 #include <dali/integration-api/adaptor-framework/shader-precompiler.h>
+#include <dali/integration-api/debug.h>
 
 using namespace Dali;
 using namespace Dali::Toolkit;
@@ -1625,6 +1625,8 @@ int UtcDaliVisualFactoryGetSvgVisualAtlas(void)
   END_TEST;
 }
 
+namespace
+{
 //Creates a mesh visual from the given propertyMap and tries to load it on stage in the given application.
 //This is expected to succeed, which will then pass the test.
 void MeshVisualLoadsCorrectlyTest(Property::Map& propertyMap, ToolkitTestApplication& application)
@@ -1706,6 +1708,7 @@ void MeshVisualDoesNotLoadCorrectlyTest(Property::Map& propertyMap, ToolkitTestA
   actor.Unparent();
   DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
 }
+} // namespace
 
 //Test if mesh loads correctly when supplied with only the bare minimum requirements, an object file.
 int UtcDaliVisualFactoryGetMeshVisual1(void)
@@ -2790,13 +2793,108 @@ int UtcDaliVisualFactoryGetAnimatedImageVisual2(void)
   END_TEST;
 }
 
+int UtcDaliVisualFactoryGetAnimatedImageVisualWithOption(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliVisualFactoryGetAnimatedImageVisualWithOption: Request animated image with option that we will use regular image visual even if gif url");
+
+  DummyControl actor = DummyControl::New(true);
+
+  Property::Map    map;
+  Property::Value* valuePtr = nullptr;
+
+  VisualFactory factory = VisualFactory::Get();
+  Visual::Base  visual;
+
+  tet_printf("Test CreateVisual(url, size) with options\n");
+  visual = factory.CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions(), VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY);
+  DALI_TEST_CHECK(visual);
+
+  TestVisualAsynchronousRender(application, actor, visual);
+
+  visual.CreatePropertyMap(map);
+  valuePtr = map.Find(Dali::Toolkit::Visual::Property::TYPE);
+  DALI_TEST_CHECK(valuePtr);
+  DALI_TEST_CHECK(valuePtr->Get<int>() == Dali::Toolkit::Visual::Type::IMAGE);
+
+  tet_printf("Test CreateVisual(propertyMap) with options\n");
+  map.Clear();
+  map.Add(Toolkit::Visual::Property::TYPE, Visual::IMAGE)
+    .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
+
+  // Change actor and visual as new reference.
+  actor  = DummyControl::New(true);
+  visual = factory.CreateVisual(map, VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY);
+
+  // We will use cached image.
+  TestVisualRender(application, actor, visual);
+
+  visual.CreatePropertyMap(map);
+  valuePtr = map.Find(Dali::Toolkit::Visual::Property::TYPE);
+  DALI_TEST_CHECK(valuePtr);
+  DALI_TEST_CHECK(valuePtr->Get<int>() == Dali::Toolkit::Visual::Type::IMAGE);
+
+  END_TEST;
+}
+
+int UtcDaliVisualFactorySetGetDefaultCreationOptions(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline("UtcDaliVisualFactorySetGetDefaultCreationOptions");
+
+  VisualFactory factory = VisualFactory::Get();
+
+  tet_printf("Check default creation options is NONE\n");
+  DALI_TEST_EQUALS(factory.GetDefaultCreationOptions(), VisualFactory::CreationOptions::NONE, TEST_LOCATION);
+  factory.SetDefaultCreationOptions(VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY);
+
+  tet_printf("Check default creation options changed\n");
+  DALI_TEST_EQUALS(factory.GetDefaultCreationOptions(), VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY, TEST_LOCATION);
+
+  tet_printf("Check default creation options applied\n");
+  DummyControl actor = DummyControl::New(true);
+
+  Property::Map    map;
+  Property::Value* valuePtr = nullptr;
+
+  Visual::Base visual;
+
+  tet_printf("Test CreateVisual(url, size) with options\n");
+  visual = factory.CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions());
+  DALI_TEST_CHECK(visual);
+
+  TestVisualAsynchronousRender(application, actor, visual);
+
+  visual.CreatePropertyMap(map);
+  valuePtr = map.Find(Dali::Toolkit::Visual::Property::TYPE);
+  DALI_TEST_CHECK(valuePtr);
+  DALI_TEST_CHECK(valuePtr->Get<int>() == Dali::Toolkit::Visual::Type::IMAGE);
+
+  tet_printf("Test CreateVisual(propertyMap) with options\n");
+  map.Clear();
+  map.Add(Toolkit::Visual::Property::TYPE, Visual::IMAGE)
+    .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
+
+  // Change actor and visual as new reference.
+  actor  = DummyControl::New(true);
+  visual = factory.CreateVisual(map);
+
+  // We will use cached image.
+  TestVisualRender(application, actor, visual);
+
+  visual.CreatePropertyMap(map);
+  valuePtr = map.Find(Dali::Toolkit::Visual::Property::TYPE);
+  DALI_TEST_CHECK(valuePtr);
+  DALI_TEST_CHECK(valuePtr->Get<int>() == Dali::Toolkit::Visual::Type::IMAGE);
+
+  END_TEST;
+}
 
 int UtcDaliVisualFactoryGetPreCompiler(void)
 {
   ToolkitTestApplication application;
   tet_infoline("UtcDaliVisualFactoryGetAnimatedImageVisual2: Request animated image visual with a Property::Map, test custom wrap mode and pixel area");
 
-
   std::vector<RawShaderData> precompiledShaderList;
   DALI_TEST_CHECK(precompiledShaderList.size() == 0u); // before Get Shader
   ShaderPreCompiler::Get().GetPreCompileShaderList(precompiledShaderList);
index 368f8d5..24f4f7a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -96,11 +96,21 @@ Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyMap)
   return GetImplementation(*this).CreateVisual(propertyMap);
 }
 
+Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyMap, CreationOptions creationOptions)
+{
+  return GetImplementation(*this).CreateVisual(propertyMap, creationOptions);
+}
+
 Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageDimensions size)
 {
   return GetImplementation(*this).CreateVisual(url, size);
 }
 
+Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageDimensions size, CreationOptions creationOptions)
+{
+  return GetImplementation(*this).CreateVisual(url, size, creationOptions);
+}
+
 void VisualFactory::SetPreMultiplyOnLoad(bool preMultiply)
 {
   GetImplementation(*this).SetPreMultiplyOnLoad(preMultiply);
@@ -111,6 +121,16 @@ bool VisualFactory::GetPreMultiplyOnLoad() const
   return GetImplementation(*this).GetPreMultiplyOnLoad();
 }
 
+void VisualFactory::SetDefaultCreationOptions(VisualFactory::CreationOptions creationOptions)
+{
+  GetImplementation(*this).SetDefaultCreationOptions(creationOptions);
+}
+
+VisualFactory::CreationOptions VisualFactory::GetDefaultCreationOptions() const
+{
+  return GetImplementation(*this).GetDefaultCreationOptions();
+}
+
 void VisualFactory::DiscardVisual(Visual::Base visual)
 {
   GetImplementation(*this).DiscardVisual(visual);
index cc62c2b..13697d2 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_VISUAL_FACTORY_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -53,6 +53,13 @@ class VisualFactory;
 class DALI_TOOLKIT_API VisualFactory : public BaseHandle
 {
 public:
+  enum CreationOptions
+  {
+    NONE = 0,
+
+    IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY = 1 << 0, ///< Load static images only when we use the image visual.
+  };
+
   /**
    * @brief Create or retrieve VisualFactory singleton.
    *
@@ -99,6 +106,16 @@ public:
   Visual::Base CreateVisual(const Property::Map& propertyMap);
 
   /**
+   * @brief Request the visual with some options
+   *
+   * @param[in] propertyMap The map contains the properties required by the visual.
+   *            The content of the map determines the type of visual that will be returned.
+   * @param[in] creationOptions The creation option.
+   * @return The handle to the created visual
+   */
+  Visual::Base CreateVisual(const Property::Map& propertyMap, CreationOptions creationOptions);
+
+  /**
    * @brief Request the visual to render the given resource at the url.
    *
    * @param[in] url The URL to the resource to be rendered.
@@ -108,6 +125,16 @@ public:
   Visual::Base CreateVisual(const std::string& url, ImageDimensions size);
 
   /**
+   * @brief Request the visual to render the given resource at the url with some options.
+   *
+   * @param[in] url The URL to the resource to be rendered.
+   * @param[in] size The width and height to fit the loaded image to.
+   * @param[in] creationOptions The creation option.
+   * @return The pointer pointing to the visual
+   */
+  Visual::Base CreateVisual(const std::string& url, ImageDimensions size, CreationOptions creationOptions);
+
+  /**
    * @brief Enable or disable premultiplying alpha in images and image visuals.
    *
    * The default is to enable pre-multiplication on load.
@@ -127,6 +154,20 @@ public:
   bool GetPreMultiplyOnLoad() const;
 
   /**
+   * @brief Set the default creation options when we skip the creation options parameter.
+   *
+   * @param[in] creationOptions The default creation options for the visual factory.
+   */
+  void SetDefaultCreationOptions(CreationOptions creationOptions);
+
+  /**
+   * @brief Set the default creation options when we skip the creation options parameter.
+   *
+   * @return The default creation options for the visual factory.
+   */
+  CreationOptions GetDefaultCreationOptions() const;
+
+  /**
    * @brief Discard visual base. It will keep reference of visual until idle callback called.
    *
    * @param[in] visual Discarded visual base.
index 91584eb..e788199 100644 (file)
@@ -99,6 +99,7 @@ VisualFactory::VisualFactory(bool debugEnabled)
   mTextVisualShaderFactory(),
   mSlotDelegate(this),
   mIdleCallback(nullptr),
+  mDefaultCreationOptions(Toolkit::VisualFactory::CreationOptions::NONE),
   mDebugEnabled(debugEnabled),
   mPreMultiplyOnLoad(true),
   mPrecompiledShaderRequested(false)
@@ -130,6 +131,11 @@ void VisualFactory::OnBrokenImageChangedSignal(Toolkit::StyleManager styleManage
 
 Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyMap)
 {
+  return CreateVisual(propertyMap, mDefaultCreationOptions);
+}
+
+Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyMap, Toolkit::VisualFactory::CreationOptions creationOptions)
+{
   Visual::BasePtr visualPtr;
 
   Property::Value*           typeValue  = propertyMap.Find(Toolkit::Visual::Property::TYPE, VISUAL_TYPE);
@@ -184,17 +190,21 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM
                 visualPtr = SvgVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap);
                 break;
               }
-              case VisualUrl::GIF:
-              case VisualUrl::WEBP:
-              {
-                visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap);
-                break;
-              }
               case VisualUrl::JSON:
               {
                 visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), imageUrl, propertyMap);
                 break;
               }
+              case VisualUrl::GIF:
+              case VisualUrl::WEBP:
+              {
+                if(!(creationOptions & Toolkit::VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY))
+                {
+                  visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap);
+                  break;
+                }
+                DALI_FALLTHROUGH;
+              }
               case VisualUrl::REGULAR_IMAGE:
               {
                 visualPtr = ImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, propertyMap);
@@ -342,6 +352,11 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const Property::Map& propertyM
 
 Toolkit::Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageDimensions size)
 {
+  return CreateVisual(url, size, mDefaultCreationOptions);
+}
+
+Toolkit::Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageDimensions size, Toolkit::VisualFactory::CreationOptions creationOptions)
+{
   Visual::BasePtr visualPtr;
 
   if(!url.empty())
@@ -361,17 +376,21 @@ Toolkit::Visual::Base VisualFactory::CreateVisual(const std::string& url, ImageD
         visualPtr = SvgVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size);
         break;
       }
-      case VisualUrl::GIF:
-      case VisualUrl::WEBP:
-      {
-        visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size);
-        break;
-      }
       case VisualUrl::JSON:
       {
         visualPtr = AnimatedVectorImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size);
         break;
       }
+      case VisualUrl::GIF:
+      case VisualUrl::WEBP:
+      {
+        if(!(creationOptions & Toolkit::VisualFactory::CreationOptions::IMAGE_VISUAL_LOAD_STATIC_IMAGES_ONLY))
+        {
+          visualPtr = AnimatedImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size);
+          break;
+        }
+        DALI_FALLTHROUGH;
+      }
       case VisualUrl::REGULAR_IMAGE:
       {
         visualPtr = ImageVisual::New(GetFactoryCache(), GetImageVisualShaderFactory(), visualUrl, size);
@@ -403,6 +422,16 @@ bool VisualFactory::GetPreMultiplyOnLoad() const
   return mPreMultiplyOnLoad;
 }
 
+void VisualFactory::SetDefaultCreationOptions(Toolkit::VisualFactory::CreationOptions creationOptions)
+{
+  mDefaultCreationOptions = creationOptions;
+}
+
+Toolkit::VisualFactory::CreationOptions VisualFactory::GetDefaultCreationOptions() const
+{
+  return mDefaultCreationOptions;
+}
+
 void VisualFactory::DiscardVisual(Toolkit::Visual::Base visual)
 {
   mDiscardedVisuals.emplace_back(visual);
index 76bacf9..daecbb0 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_VISUAL_FACTORY_IMPL_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 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.
@@ -18,9 +18,9 @@
  */
 
 // EXTERNAL INCLUDES
+#include <dali/integration-api/adaptor-framework/shader-precompiler.h>
 #include <dali/public-api/common/vector-wrapper.h>
 #include <dali/public-api/object/base-object.h>
-#include <dali/integration-api/adaptor-framework/shader-precompiler.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
@@ -72,11 +72,21 @@ public:
   Toolkit::Visual::Base CreateVisual(const Property::Map& propertyMap);
 
   /**
+   * @copydoc Toolkit::VisualFactory::CreateVisual( const Property::Map&, Toolkit::VisualFactory::CreationOptions )
+   */
+  Toolkit::Visual::Base CreateVisual(const Property::Map& propertyMap, Toolkit::VisualFactory::CreationOptions creationOptions);
+
+  /**
    * @copydoc Toolkit::VisualFactory::CreateVisual( const std::string&, ImageDimensions )
    */
   Toolkit::Visual::Base CreateVisual(const std::string& image, ImageDimensions size);
 
   /**
+   * @copydoc Toolkit::VisualFactory::CreateVisual( const std::string&, ImageDimensions, Toolkit::VisualFactory::CreationOptions )
+   */
+  Toolkit::Visual::Base CreateVisual(const std::string& image, ImageDimensions size, Toolkit::VisualFactory::CreationOptions creationOptions);
+
+  /**
    * @copydoc Toolkit::VisualFactory::SetPreMultiplyOnLoad()
    */
   void SetPreMultiplyOnLoad(bool preMultiply);
@@ -87,6 +97,16 @@ public:
   bool GetPreMultiplyOnLoad() const;
 
   /**
+   * @copydoc Toolkit::VisualFactory::SetDefaultCreationOptions( Toolkit::VisualFactory::CreationOptions )
+   */
+  void SetDefaultCreationOptions(Toolkit::VisualFactory::CreationOptions creationOptions);
+
+  /**
+   * @copydoc Toolkit::VisualFactory::GetDefaultCreationOptions()
+   */
+  Toolkit::VisualFactory::CreationOptions GetDefaultCreationOptions() const;
+
+  /**
    * @copydoc Toolkit::VisualFactory::DiscardVisual()
    */
   void DiscardVisual(Toolkit::Visual::Base visual);
@@ -157,9 +177,12 @@ private:
   CallbackBase*                             mIdleCallback;
   using DiscardedVisualContainer = std::vector<Toolkit::Visual::Base>;
   DiscardedVisualContainer mDiscardedVisuals{};
-  bool                                      mDebugEnabled : 1;
-  bool                                      mPreMultiplyOnLoad : 1; ///< Local store for this flag
-  bool                                      mPrecompiledShaderRequested : 1;
+
+  Toolkit::VisualFactory::CreationOptions mDefaultCreationOptions : 2;
+
+  bool mDebugEnabled : 1;
+  bool mPreMultiplyOnLoad : 1; ///< Local store for this flag
+  bool mPrecompiledShaderRequested : 1;
 };
 
 /**