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>
/*
- * 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.
#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;
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)
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)
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);
/*
- * 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.
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);
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);
#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.
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.
*
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.
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.
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.
mTextVisualShaderFactory(),
mSlotDelegate(this),
mIdleCallback(nullptr),
+ mDefaultCreationOptions(Toolkit::VisualFactory::CreationOptions::NONE),
mDebugEnabled(debugEnabled),
mPreMultiplyOnLoad(true),
mPrecompiledShaderRequested(false)
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);
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);
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())
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);
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);
#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.
*/
// 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>
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);
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);
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;
};
/**