2 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dali-toolkit/internal/visuals/text-visual-shader-factory.h>
21 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
22 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
23 #include <dali/integration-api/debug.h>
33 // enum of required list when we select shader
34 enum class TextVisualRequireFlag : uint32_t
43 const VisualFactoryCache::ShaderType SHADER_TYPE_TABLE[] =
45 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT,
46 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE,
47 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_OVERLAY,
48 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_OVERLAY,
49 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_EMOJI,
50 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_EMOJI,
51 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_OVERLAY_AND_EMOJI,
52 VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT_WITH_STYLE_AND_OVERLAY_AND_EMOJI,
53 VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT,
54 VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE,
55 VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_OVERLAY,
56 VisualFactoryCache::TEXT_SHADER_MULTI_COLOR_TEXT_WITH_STYLE_AND_OVERLAY,
59 static constexpr auto SHADER_TYPE_COUNT = 1u;
60 constexpr std::string_view VertexPredefines[SHADER_TYPE_COUNT]{
61 "", // VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT
63 constexpr std::string_view FragmentPredefines[SHADER_TYPE_COUNT]{
64 "", // VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT
66 constexpr VisualFactoryCache::ShaderType ShaderTypePredefines[SHADER_TYPE_COUNT]{
67 VisualFactoryCache::ShaderType::TEXT_SHADER_SINGLE_COLOR_TEXT,
70 } // unnamed namespace
72 namespace TextVisualShaderFeature
74 FeatureBuilder& FeatureBuilder::EnableMultiColor(bool enableMultiColor)
76 mTextMultiColor = enableMultiColor ? TextMultiColor::MULTI_COLOR_TEXT : TextMultiColor::SINGLE_COLOR_TEXT;
79 FeatureBuilder& FeatureBuilder::EnableEmoji(bool enableEmoji)
81 mTextEmoji = enableEmoji ? TextEmoji::HAS_EMOJI : TextEmoji::NO_EMOJI;
84 FeatureBuilder& FeatureBuilder::EnableStyle(bool enableStyle)
86 mTextStyle = enableStyle ? TextStyle::HAS_STYLES : TextStyle::NO_STYLES;
89 FeatureBuilder& FeatureBuilder::EnableOverlay(bool enableOverlay)
91 mTextOverlay = enableOverlay ? TextOverlay::HAS_OVERLAY : TextOverlay::NO_OVERLAY;
94 } // namespace TextVisualShaderFeature
96 TextVisualShaderFactory::TextVisualShaderFactory()
100 TextVisualShaderFactory::~TextVisualShaderFactory()
104 Shader TextVisualShaderFactory::GetShader(VisualFactoryCache& factoryCache, const TextVisualShaderFeature::FeatureBuilder& featureBuilder)
107 uint32_t shaderTypeFlag = static_cast<uint32_t>(TextVisualRequireFlag::DEFAULT);
108 VisualFactoryCache::ShaderType shaderType = VisualFactoryCache::TEXT_SHADER_SINGLE_COLOR_TEXT;
110 const auto& multiColor = featureBuilder.mTextMultiColor;
111 const auto& emoji = featureBuilder.mTextEmoji;
112 const auto& style = featureBuilder.mTextStyle;
113 const auto& overlay = featureBuilder.mTextOverlay;
115 if(style == TextVisualShaderFeature::TextStyle::HAS_STYLES)
117 shaderTypeFlag |= static_cast<uint32_t>(TextVisualRequireFlag::STYLES);
119 if(overlay == TextVisualShaderFeature::TextOverlay::HAS_OVERLAY)
121 shaderTypeFlag |= static_cast<uint32_t>(TextVisualRequireFlag::OVERLAY);
123 // multi color can also render emoji. If multi color text, dont consider emoji
124 if(multiColor != TextVisualShaderFeature::TextMultiColor::MULTI_COLOR_TEXT && emoji == TextVisualShaderFeature::TextEmoji::HAS_EMOJI)
126 shaderTypeFlag |= static_cast<uint32_t>(TextVisualRequireFlag::EMOJI);
128 if(multiColor == TextVisualShaderFeature::TextMultiColor::MULTI_COLOR_TEXT)
130 shaderTypeFlag |= static_cast<uint32_t>(TextVisualRequireFlag::MULTI_COLOR);
133 shaderType = SHADER_TYPE_TABLE[shaderTypeFlag];
134 shader = factoryCache.GetShader(shaderType);
138 std::string vertexShaderPrefixList;
139 std::string fragmentShaderPrefixList;
141 if(style == TextVisualShaderFeature::TextStyle::HAS_STYLES)
143 fragmentShaderPrefixList += "#define IS_REQUIRED_STYLE\n";
145 if(overlay == TextVisualShaderFeature::TextOverlay::HAS_OVERLAY)
147 fragmentShaderPrefixList += "#define IS_REQUIRED_OVERLAY\n";
149 // multi color can also render emoji. If multi color text, dont consider emoji
150 if(multiColor != TextVisualShaderFeature::TextMultiColor::MULTI_COLOR_TEXT && emoji == TextVisualShaderFeature::TextEmoji::HAS_EMOJI)
152 fragmentShaderPrefixList += "#define IS_REQUIRED_EMOJI\n";
154 if(multiColor == TextVisualShaderFeature::TextMultiColor::MULTI_COLOR_TEXT)
156 fragmentShaderPrefixList += "#define IS_REQUIRED_MULTI_COLOR\n";
159 std::string vertexShader = std::string(Dali::Shader::GetVertexShaderPrefix() + vertexShaderPrefixList + SHADER_TEXT_VISUAL_SHADER_VERT.data());
160 std::string fragmentShader = std::string(Dali::Shader::GetFragmentShaderPrefix() + fragmentShaderPrefixList + SHADER_TEXT_VISUAL_SHADER_FRAG.data());
162 shader = factoryCache.GenerateAndSaveShader(shaderType, vertexShader, fragmentShader);
167 void TextVisualShaderFactory::GetPreCompiledShader(RawShaderData& shaders)
169 std::vector<std::string_view> vertexPrefix;
170 std::vector<std::string_view> fragmentPrefix;
171 std::vector<std::string_view> shaderName;
173 for(uint32_t i = 0; i < SHADER_TYPE_COUNT; ++i)
175 vertexPrefix.push_back(VertexPredefines[i]);
176 fragmentPrefix.push_back(FragmentPredefines[i]);
177 shaderName.push_back(Scripting::GetLinearEnumerationName<VisualFactoryCache::ShaderType>(ShaderTypePredefines[i], VISUAL_SHADER_TYPE_TABLE, VISUAL_SHADER_TYPE_TABLE_COUNT));
181 shaders.vertexPrefix = vertexPrefix;
182 shaders.fragmentPrefix = fragmentPrefix;
183 shaders.shaderName = shaderName;
184 shaders.vertexShader = SHADER_TEXT_VISUAL_SHADER_VERT;
185 shaders.fragmentShader = SHADER_TEXT_VISUAL_SHADER_FRAG;
186 shaders.shaderCount = shaderCount;
189 } // namespace Internal
191 } // namespace Toolkit