+ customBrokenImageUrlList = Toolkit::DevelStyleManager::GetBrokenImageUrlList(styleManager);
+ const auto brokenImageUrlValue = Toolkit::DevelStyleManager::GetConfigurations(styleManager).Find("brokenImageUrl", Property::Type::STRING);
+ if(brokenImageUrlValue)
+ {
+ brokenImageUrlValue->Get(brokenImageUrl);
+ }
+ }
+
+ // Add default image
+ mFactoryCache->SetBrokenImageUrl(brokenImageUrl, customBrokenImageUrlList);
+}
+
+void VisualFactory::GetPreCompiledShader(RawShaderData& shaders)
+{
+ std::vector<std::string_view> vertexPrefix;
+ std::vector<std::string_view> fragmentPrefix;
+ std::vector<std::string_view> shaderName;
+ int shaderCount = 0;
+ shaders.shaderCount = 0;
+ for(uint32_t i = 0u; i < SHADER_TYPE_COUNT; ++i)
+ {
+ vertexPrefix.push_back(VertexPredefines[i]);
+ fragmentPrefix.push_back(FragmentPredefines[i]);
+ shaderName.push_back(Scripting::GetLinearEnumerationName<VisualFactoryCache::ShaderType>(ShaderTypePredefines[i], VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT));
+ shaderCount++;
+ }
+
+ shaders.vertexPrefix = vertexPrefix;
+ shaders.fragmentPrefix = fragmentPrefix;
+ shaders.shaderName = shaderName;
+ shaders.vertexShader = SHADER_COLOR_VISUAL_SHADER_VERT;
+ shaders.fragmentShader = SHADER_COLOR_VISUAL_SHADER_FRAG;
+ shaders.shaderCount = shaderCount;
+}
+
+Internal::VisualFactoryCache& VisualFactory::GetFactoryCache()
+{
+ if(!mFactoryCache)
+ {
+ mFactoryCache = std::unique_ptr<VisualFactoryCache>(new VisualFactoryCache(mPreMultiplyOnLoad));
+ Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
+ if(styleManager)
+ {
+ styleManager.StyleChangedSignal().Connect(mSlotDelegate, &VisualFactory::OnStyleChangedSignal);
+ Toolkit::DevelStyleManager::BrokenImageChangedSignal(styleManager).Connect(mSlotDelegate, &VisualFactory::OnBrokenImageChangedSignal);
+ }
+ SetBrokenImageUrl(styleManager);
+ }
+
+ return *mFactoryCache;
+}
+
+ImageVisualShaderFactory& VisualFactory::GetImageVisualShaderFactory()
+{
+ if(!mImageVisualShaderFactory)
+ {
+ mImageVisualShaderFactory = std::unique_ptr<ImageVisualShaderFactory>(new ImageVisualShaderFactory());
+ }
+ return *mImageVisualShaderFactory;
+}
+
+TextVisualShaderFactory& VisualFactory::GetTextVisualShaderFactory()
+{
+ if(!mTextVisualShaderFactory)
+ {
+ mTextVisualShaderFactory = std::unique_ptr<TextVisualShaderFactory>(new TextVisualShaderFactory());
+ }
+ return *mTextVisualShaderFactory;
+}
+
+void VisualFactory::OnDiscardCallback()
+{
+ mIdleCallback = nullptr;
+
+ // Discard visual now.
+ mDiscardedVisuals.clear();
+}
+
+void VisualFactory::RegisterDiscardCallback()
+{
+ if(!mIdleCallback && Adaptor::IsAvailable())
+ {
+ // The callback manager takes the ownership of the callback object.
+ mIdleCallback = MakeCallback(this, &VisualFactory::OnDiscardCallback);
+
+ Adaptor& adaptor = Adaptor::Get();
+
+ if(DALI_UNLIKELY(!adaptor.AddIdle(mIdleCallback, false)))
+ {
+ DALI_LOG_ERROR("Fail to add idle callback for visual factory. Call it synchronously.\n");
+ OnDiscardCallback();
+ }