+void TextVisual::AddTexture(TextureSet& textureSet, PixelData& data, Sampler& sampler, unsigned int textureSetIndex)
+{
+ Texture texture = Texture::New(Dali::TextureType::TEXTURE_2D,
+ data.GetPixelFormat(),
+ data.GetWidth(),
+ data.GetHeight());
+ texture.Upload(data);
+
+ textureSet.SetTexture(textureSetIndex, texture);
+ textureSet.SetSampler(textureSetIndex, sampler);
+}
+
+PixelData TextVisual::ConvertToPixelData(unsigned char* buffer, int width, int height, int offsetPosition, const Pixel::Format textPixelFormat)
+{
+ int bpp = Pixel::GetBytesPerPixel(textPixelFormat);
+ unsigned int bufferSize = width * height * bpp;
+ unsigned char* dstBuffer = static_cast<unsigned char*>(malloc(bufferSize));
+ memcpy(dstBuffer, buffer + offsetPosition * bpp, bufferSize);
+ PixelData pixelData = Dali::PixelData::New(dstBuffer,
+ bufferSize,
+ width,
+ height,
+ textPixelFormat,
+ Dali::PixelData::FREE);
+ return pixelData;
+}
+
+void TextVisual::CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& sampler, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled)
+{
+ TextureSet textureSet = TextureSet::New();
+ unsigned int textureSetIndex = 0u;
+
+ // Convert the buffer to pixel data to make it a texture.
+ if(info.textBuffer)
+ {
+ PixelData data = ConvertToPixelData(info.textBuffer, info.width, info.height, info.offsetPosition, info.textPixelFormat);
+ AddTexture(textureSet, data, sampler, textureSetIndex);
+ ++textureSetIndex;
+ }
+
+ if(styleEnabled && info.styleBuffer)
+ {
+ PixelData styleData = ConvertToPixelData(info.styleBuffer, info.width, info.height, info.offsetPosition, Pixel::RGBA8888);
+ AddTexture(textureSet, styleData, sampler, textureSetIndex);
+ ++textureSetIndex;
+ }
+
+ if(containsColorGlyph && !hasMultipleTextColors && info.maskBuffer)
+ {
+ PixelData maskData = ConvertToPixelData(info.maskBuffer, info.width, info.height, info.offsetPosition, Pixel::L8);
+ AddTexture(textureSet, maskData, sampler, textureSetIndex);
+ }
+
+ renderer.SetTextures(textureSet);
+
+ //Register transform properties
+ mImpl->mTransform.RegisterUniforms(renderer, Direction::LEFT_TO_RIGHT);
+
+ // Enable the pre-multiplied alpha to improve the text quality
+ renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true);
+ renderer.RegisterProperty(PREMULTIPLIED_ALPHA, 1.0f);
+
+ // Set size and offset for the tiling.
+ renderer.RegisterProperty(SIZE, Vector2(info.width, info.height));
+ renderer.RegisterProperty(OFFSET, Vector2(info.offSet.x, info.offSet.y));
+ renderer.RegisterProperty("uHasMultipleTextColors", static_cast<float>(hasMultipleTextColors));
+ renderer.SetProperty(Renderer::Property::BLEND_MODE, BlendMode::ON);
+
+ mRendererList.push_back(renderer);
+}
+
+void TextVisual::AddRenderer(Actor& actor, const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled)
+{
+ Shader shader = GetTextShader(mFactoryCache, hasMultipleTextColors, containsColorGlyph, styleEnabled);
+ mImpl->mRenderer.SetShader(shader);