X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Frendering%2Ftext-typesetter.h;h=296126e1ef450b70d29ad7bcae9fa012a2a2f038;hp=a5aab65dd4016ae9f805ff6d85e3371cd3de2fa4;hb=HEAD;hpb=0dba002791383a83d22f94e2584d85dbd67026d0 diff --git a/dali-toolkit/internal/text/rendering/text-typesetter.h b/dali-toolkit/internal/text/rendering/text-typesetter.h index a5aab65..296126e 100644 --- a/dali-toolkit/internal/text/rendering/text-typesetter.h +++ b/dali-toolkit/internal/text/rendering/text-typesetter.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_TYPESETTER_H /* - * Copyright (c) 2017 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. @@ -19,19 +19,20 @@ */ // EXTERNAL INCLUDES +#include +#include +#include #include -#include #include +#include +#include namespace Dali { - namespace Toolkit { - namespace Text { - class ModelInterface; class ViewModel; class Typesetter; @@ -43,6 +44,34 @@ typedef IntrusivePtr TypesetterPtr; */ class Typesetter : public RefObject { +public: + /** + * @brief Behaviours of how to render the text. + */ + enum RenderBehaviour + { + RENDER_TEXT_AND_STYLES, ///< Render both the text and its styles + RENDER_NO_TEXT, ///< Do not render the text itself but render the background styles such as outline and background. + RENDER_NO_STYLES, ///< Do not render any styles + RENDER_MASK, ///< Render an alpha mask (for color glyphs with no color animation, e.g. emoji) + RENDER_OVERLAY_STYLE ///< Do not render the text itself but render the style but overlay the style on the text (foreground styles such as strikethrough and underline) + }; + + /** + * @brief Styles of the text. + */ + enum Style + { + STYLE_NONE, ///< No style + STYLE_MASK, ///< Alpha mask + STYLE_SHADOW, ///< Hard shadow + STYLE_SOFT_SHADOW, ///< Soft shadow + STYLE_UNDERLINE, ///< Underline + STYLE_OUTLINE, ///< Outline + STYLE_BACKGROUND, ///< Text background + STYLE_STRIKETHROUGH ///< Strikethrough + }; + public: // Constructor. /** * @brief Creates a Typesetter instance. @@ -52,7 +81,7 @@ public: // Constructor. * * @param[in] model Pointer to the text's data model. */ - static TypesetterPtr New( const ModelInterface* const model ); + static TypesetterPtr New(const ModelInterface* const model); public: /** @@ -68,15 +97,18 @@ public: * Does the following operations: * - Finds the visible pages needed to be rendered. * - Elide glyphs if needed. - * - Retrieves the data buffers from the text model. - * - Creates the pixel data used to generate the final image with the given size. - * - Traverse the visible glyphs, retrieve their bitmaps and compose the final pixel data. + * - Creates image buffers for diffrent text styles with the given size. + * - Combines different image buffers to create the pixel data used to generate the final image * * @param[in] size The renderer size. + * @param[in] textDirection The direction of the text. + * @param[in] behaviour The behaviour of how to render the text (i.e. whether to render the text only or the styles only or both). + * @param[in] ignoreHorizontalAlignment Whether to ignore the horizontal alignment (i.e. always render as if HORIZONTAL_ALIGN_BEGIN). + * @param[in] pixelFormat The format of the pixel in the image that the text is rendered as (i.e. either Pixel::BGRA8888 or Pixel::L8). * * @return A pixel data with the text rendered. */ - PixelData Render( const Vector2& size ); + PixelData Render(const Vector2& size, Toolkit::DevelText::TextDirection::Type textDirection, RenderBehaviour behaviour = RENDER_TEXT_AND_STYLES, bool ignoreHorizontalAlignment = false, Pixel::Format pixelFormat = Pixel::RGBA8888); private: /** @@ -84,17 +116,80 @@ private: * * @param[in] model Pointer to the text's data model. */ - Typesetter( const ModelInterface* const model ); + Typesetter(const ModelInterface* const model); // Declared private and left undefined to avoid copies. - Typesetter( const Typesetter& handle ); + Typesetter(const Typesetter& handle); // Declared private and left undefined to avoid copies. - Typesetter& operator=( const Typesetter& handle ); + Typesetter& operator=(const Typesetter& handle); -protected: + /** + * @brief Create & draw the image buffer for the given range of the glyphs in the given style. + * + * Does the following operations: + * - Retrieves the data buffers from the text model. + * - Creates the pixel data used to generate the final image with the given size. + * - Traverse the visible glyphs, retrieve their bitmaps and compose the final pixel data. + * + * @param[in] bufferWidth The width of the image buffer. + * @param[in] bufferHeight The height of the image buffer. + * @param[in] style The style of the text. + * @param[in] ignoreHorizontalAlignment Whether to ignore the horizontal alignment, not ignored by default. + * @param[in] pixelFormat The format of the pixel in the image that the text is rendered as (i.e. either Pixel::BGRA8888 or Pixel::L8). + * @param[in] horizontalOffset The horizontal offset to be added to the glyph's position. + * @param[in] verticalOffset The vertical offset to be added to the glyph's position. + * @param[in] fromGlyphIndex The index of the first glyph within the text to be drawn + * @param[in] toGlyphIndex The index of the last glyph within the text to be drawn + * + * @return An image buffer with the text. + */ + Devel::PixelBuffer CreateImageBuffer(const uint32_t bufferWidth, const uint32_t bufferHeight, const Typesetter::Style style, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset, const TextAbstraction::GlyphIndex fromGlyphIndex, const TextAbstraction::GlyphIndex toGlyphIndex); /** + * @brief Apply markup underline tags. + * + * The properties on TextLabel override the behavior of Markup. + * Because the markup will be the bottom layer buffer + * - i.e: If you set property UNDERLINE to enabled and blue. + * And the TEXT is "Hello World Hello World". + * Then the output of the whole text is underlined by blue line. + * + * @param[in] topPixelBuffer The top layer buffer. + * @param[in] bufferWidth The width of the image buffer. + * @param[in] bufferHeight The height of the image buffer. + * @param[in] ignoreHorizontalAlignment Whether to ignore the horizontal alignment, not ignored by default. + * @param[in] pixelFormat The format of the pixel in the image that the text is rendered as (i.e. either Pixel::BGRA8888 or Pixel::L8). + * @param[in] horizontalOffset The horizontal offset to be added to the glyph's position. + * @param[in] verticalOffset The vertical offset to be added to the glyph's position. + * + * @return The image buffer with the markup. + */ + Devel::PixelBuffer ApplyUnderlineMarkupImageBuffer(Devel::PixelBuffer topPixelBuffer, const uint32_t bufferWidth, const uint32_t bufferHeight, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset); + + /** + * @brief Apply markup strikethrough tags. + * + * The properties on TextLabel override the behavior of Markup. + * Because the markup will be the bottom layer buffer + * - i.e: If you set property STRIKETHROUGH to enabled and blue. + * And the TEXT is "Hello World Hello World". + * Then the whole text will have a blue line strikethrough. + * + * @param[in] topPixelBuffer The top layer buffer. + * @param[in] bufferWidth The width of the image buffer. + * @param[in] bufferHeight The height of the image buffer. + * @param[in] ignoreHorizontalAlignment Whether to ignore the horizontal alignment, not ignored by default. + * @param[in] pixelFormat The format of the pixel in the image that the text is rendered as (i.e. either Pixel::BGRA8888 or Pixel::L8). + * @param[in] horizontalOffset The horizontal offset to be added to the glyph's position. + * @param[in] verticalOffset The vertical offset to be added to the glyph's position. + * + * @return The image buffer with the markup. + */ + Devel::PixelBuffer ApplyStrikethroughMarkupImageBuffer(Devel::PixelBuffer topPixelBuffer, const uint32_t bufferWidth, const uint32_t bufferHeight, const bool ignoreHorizontalAlignment, const Pixel::Format pixelFormat, const int32_t horizontalOffset, const int32_t verticalOffset); + +protected: + /** * @brief A reference counted object may only be deleted by calling Unreference(). * * Destroys the visual model. @@ -102,7 +197,7 @@ protected: virtual ~Typesetter(); private: - ViewModel* mModel; + ViewModel* mModel; }; } // namespace Text @@ -111,4 +206,4 @@ private: } // namespace Dali -#endif // DALI_TOOLKIT_TEXT_TYPESETTER_H +#endif // DALI_TOOLKIT_TEXT_TYPESETTER_H \ No newline at end of file