#define DALI_TOOLKIT_INTERNAL_TEXT_VISUAL_H
/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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/public-api/animation/constraint.h>
#include <dali/public-api/object/base-object.h>
#include <dali/public-api/object/weak-handle.h>
+#include <dali/public-api/rendering/visual-renderer.h>
// INTERNAL INCLUDES
+#include <dali-toolkit/internal/text/controller/text-controller.h>
#include <dali-toolkit/internal/text/rendering/text-typesetter.h>
-#include <dali-toolkit/internal/text/text-controller.h>
+#include <dali-toolkit/internal/visuals/text-visual-shader-factory.h>
#include <dali-toolkit/internal/visuals/visual-base-impl.h>
namespace Dali
* @brief Create a new text visual.
*
* @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
+ * @param[in] shaderFactory The TextVisualShaderFactory object
* @param[in] properties A Property::Map containing settings for this visual
* @return A smart-pointer to the newly allocated visual.
*/
- static TextVisualPtr New(VisualFactoryCache& factoryCache, const Property::Map& properties);
+ static TextVisualPtr New(VisualFactoryCache& factoryCache, TextVisualShaderFactory& shaderFactory, const Property::Map& properties);
/**
* @brief Converts all strings keys in property map to index keys. Property Map can then be merged correctly.
*/
void DoCreateInstancePropertyMap(Property::Map& map) const override;
+ /**
+ * @copydoc Visual::Base::EnablePreMultipliedAlpha
+ */
+ void EnablePreMultipliedAlpha(bool preMultiplied) override;
+
protected:
/**
* @brief Constructor.
*
* @param[in] factoryCache The VisualFactoryCache object
+ * @param[in] shaderFactory The TextVisualShaderFactory object
*/
- TextVisual(VisualFactoryCache& factoryCache);
+ TextVisual(VisualFactoryCache& factoryCache, TextVisualShaderFactory& shaderFactory);
/**
* @brief A reference counted object may only be deleted by calling Unreference().
private:
struct TilingInfo
{
- unsigned char* textBuffer;
- unsigned char* styleBuffer;
- unsigned char* maskBuffer;
- int width;
- int height;
- Pixel::Format textPixelFormat;
- int offsetPosition;
- Vector2 offSet;
-
- TilingInfo(int width, int height, Pixel::Format textPixelFormat)
- : textBuffer(NULL),
- styleBuffer(NULL),
- maskBuffer(NULL),
+ PixelData textPixelData;
+ PixelData stylePixelData;
+ PixelData overlayStylePixelData;
+ PixelData maskPixelData;
+ int32_t width;
+ int32_t height;
+ Pixel::Format textPixelFormat;
+ uint32_t offsetHeight;
+ Vector2 transformOffset;
+
+ TilingInfo(int32_t width, int32_t height, Pixel::Format textPixelFormat)
+ : textPixelData(),
+ stylePixelData(),
+ overlayStylePixelData(),
+ maskPixelData(),
width(width),
height(height),
textPixelFormat(textPixelFormat),
- offsetPosition(0),
- offSet(0.f, 0.f)
+ offsetHeight(0u),
+ transformOffset(0.f, 0.f)
{
}
~TilingInfo()
{
- if(textBuffer)
- {
- free(textBuffer);
- }
- if(styleBuffer)
- {
- free(styleBuffer);
- }
- if(maskBuffer)
- {
- free(maskBuffer);
- }
}
};
/**
* @brief Create a texture in textureSet and add it.
* @param[in] textureSet The textureSet to which the texture will be added.
- * @param[in] data The PixelData to be uploaded to texture
+ * @param[in] data The PixelData to be uploaded to texture.
* @param[in] sampler The sampler.
* @param[in] textureSetIndex The Index of TextureSet.
*/
void AddTexture(TextureSet& textureSet, PixelData& data, Sampler& sampler, unsigned int textureSetIndex);
/**
- * @brief Convert the buffer to pixelData.
- * @param[in] buffer The Buffer to be converted to pixelData.
- * @param[in] width The width of pixel data.
- * @param[in] height The height of pixel data.
- * @param[in] offsetPosition The The buffer's start position.
- * @param[in] textPixelFormat The PixelForma of text.
+ * @brief Create a texture in textureSet and add it.
+ * @param[in] textureSet The textureSet to which the texture will be added.
+ * @param[in] tilingInfo The tiling infomation to be uploaded to texture.
+ * @param[in] data The PixelData to be uploaded to texture.
+ * @param[in] sampler The sampler.
+ * @param[in] textureSetIndex The Index of TextureSet.
*/
- PixelData ConvertToPixelData(unsigned char* buffer, int width, int height, int offsetPosition, const Pixel::Format textPixelFormat);
+ void AddTilingTexture(TextureSet& textureSet, TilingInfo& tilingInfo, PixelData& data, Sampler& sampler, unsigned int textureSetIndex);
/**
- * @brief Create the text's texture.
+ * @brief Create the text's texture. It will use cached shader feature for text visual.
* @param[in] info This is the information you need to create a Tiling.
* @param[in] renderer The renderer to which the TextureSet will be added.
* @param[in] sampler The sampler.
- * @param[in] hasMultipleTextColors Whether the text contains multiple colors.
- * @param[in] containsColorGlyph Whether the text contains color glyph.
- * @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.).
*/
- void CreateTextureSet(TilingInfo& info, Renderer& renderer, Sampler& sampler, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled);
+ void CreateTextureSet(TilingInfo& info, VisualRenderer& renderer, Sampler& sampler);
/**
* Create renderer of the text for rendering.
* @param[in] hasMultipleTextColors Whether the text contains multiple colors.
* @param[in] containsColorGlyph Whether the text contains color glyph.
* @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.).
+ * @param[in] isOverlayStyle Whether the style needs to overlay on the text (e.g. strikethrough, underline, etc.).
*/
- void AddRenderer(Actor& actor, const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled);
+ void AddRenderer(Actor& actor, const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled, bool isOverlayStyle);
/**
- * Get the texture of the text for rendering.
+ * Get the texture of the text for rendering. It will use cached shader feature for text visual.
* @param[in] size The texture size.
- * @param[in] hasMultipleTextColors Whether the text contains multiple colors.
- * @param[in] containsColorGlyph Whether the text contains color glyph.
- * @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.).
*/
- TextureSet GetTextTexture(const Vector2& size, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled);
+ TextureSet GetTextTexture(const Vector2& size);
/**
* Get the text rendering shader.
* @param[in] factoryCache A pointer pointing to the VisualFactoryCache object
- * @param[in] hasMultipleTextColors Whether the text contains multiple colors.
- * @param[in] containsColorGlyph Whether the text contains color glyph.
- * @param[in] styleEnabled Whether the text contains any styles (e.g. shadow, underline, etc.).
+ * @param[in] featureBuilder Collection of current text shader's features. It will be cached as text visual.
*/
- Shader GetTextShader(VisualFactoryCache& factoryCache, bool hasMultipleTextColors, bool containsColorGlyph, bool styleEnabled);
+ Shader GetTextShader(VisualFactoryCache& factoryCache, const TextVisualShaderFeature::FeatureBuilder& featureBuilder);
/**
* @brief Retrieve the TextVisual object.
private:
typedef std::vector<Renderer> RendererContainer;
- /**
- * Used as an alternative to boolean so that it is obvious whether the text contains single or multiple text colors, and emoji and styles.
- */
- struct TextType
- {
- enum Type
- {
- SINGLE_COLOR_TEXT = 0, ///< The text contains single color only.
- MULTI_COLOR_TEXT = 1, ///< The text contains multiple colors.
- NO_EMOJI = 0, ///< The text contains no emoji.
- HAS_EMOJI = 1, ///< The text contains emoji.
- NO_STYLES = 0, ///< The text contains contains no styles.
- HAS_SYLES = 1 ///< The text contains contains styles.
- };
- };
-
private:
- Text::ControllerPtr mController; ///< The text's controller.
- Text::TypesetterPtr mTypesetter; ///< The text's typesetter.
- WeakHandle<Actor> mControl; ///< The control where the renderer is added.
- Constraint mColorConstraint{}; ///< Color constraint
- Constraint mOpacityConstraint{}; ///< Opacity constraint
- Property::Index mAnimatableTextColorPropertyIndex; ///< The index of animatable text color property registered by the control.
- bool mRendererUpdateNeeded : 1; ///< The flag to indicate whether the renderer needs to be updated.
- RendererContainer mRendererList;
+ Text::ControllerPtr mController; ///< The text's controller.
+ Text::TypesetterPtr mTypesetter; ///< The text's typesetter.
+
+ TextVisualShaderFactory& mTextVisualShaderFactory; ///< The shader factory for text visual.
+ TextVisualShaderFeature::FeatureBuilder mTextShaderFeatureCache; ///< The cached shader feature for text visual.
+
+ WeakHandle<Actor> mControl; ///< The control where the renderer is added.
+ Constraint mColorConstraint{}; ///< Color constraint
+ Constraint mOpacityConstraint{}; ///< Opacity constraint
+ Property::Index mAnimatableTextColorPropertyIndex; ///< The index of animatable text color property registered by the control.
+ Property::Index mTextColorAnimatableIndex; ///< The index of uTextColorAnimatable property.
+ bool mRendererUpdateNeeded : 1; ///< The flag to indicate whether the renderer needs to be updated.
+ RendererContainer mRendererList;
};
} // namespace Internal