blob: 270c773286d5fa3530f8d113fde673ea2294ba5f [file] [log] [blame]
#ifndef _RIVE_RENDER_TEXT_HPP_
#define _RIVE_RENDER_TEXT_HPP_
#ifdef WITH_RIVE_TEXT
#include "rive/text/text.hpp"
namespace rive
{
class Factory;
class RawText
{
public:
RawText(Factory* factory);
/// Returns true if the text object contains no text.
bool empty() const;
/// Appends a run to the text object. The foregroundColor is used for
/// color glyphs (emoji) that reference the text's foreground color.
void append(const std::string& text,
rcp<RenderPaint> paint,
rcp<Font> font,
float size = 16.0f,
float lineHeight = -1.0f,
float letterSpacing = 0.0f,
ColorInt foregroundColor = 0xFF000000);
/// Resets the text object to empty state (no text).
void clear();
/// Draw the text using renderer. Second argument is optional to override
/// all paints provided with run styles
void render(Renderer* renderer, rcp<RenderPaint> paint = nullptr);
TextSizing sizing() const;
TextOverflow overflow() const;
TextAlign align() const;
float maxWidth() const;
float maxHeight() const;
float paragraphSpacing() const;
void sizing(TextSizing value);
/// How text that overflows when TextSizing::fixed is used.
void overflow(TextOverflow value);
/// How text aligns within the bounds.
void align(TextAlign value);
/// The width at which the text will wrap when using any sizing but
/// TextSizing::auto.
void maxWidth(float value);
/// The height at which the text will overflow when using TextSizing::fixed.
void maxHeight(float value);
/// The vertical space between paragraphs delineated by a return character.
void paragraphSpacing(float value);
/// Returns the bounds of the text object (helpful for aligning multiple
/// text objects/procredurally drawn shapes).
AABB bounds();
private:
void update();
struct RenderStyle
{
rcp<RenderPaint> paint;
bool isEmpty;
ShapePaintPath path;
ColorInt foregroundColor = 0xFF000000;
};
SimpleArray<Paragraph> m_shape;
SimpleArray<SimpleArray<GlyphLine>> m_lines;
StyledText m_styled;
Factory* m_factory;
std::vector<RenderStyle> m_styles;
std::vector<RenderStyle*> m_renderStyles;
bool m_dirty = false;
float m_paragraphSpacing = 0.0f;
TextOrigin m_origin = TextOrigin::top;
TextSizing m_sizing = TextSizing::autoWidth;
TextOverflow m_overflow = TextOverflow::visible;
TextAlign m_align = TextAlign::left;
TextWrap m_wrap = TextWrap::wrap;
float m_maxWidth = 0.0f;
float m_maxHeight = 0.0f;
std::vector<OrderedLine> m_orderedLines;
GlyphRun m_ellipsisRun;
AABB m_bounds;
rcp<RenderPath> m_clipRenderPath;
// Color glyph draw commands for interleaving with style paths.
struct RawTextDrawCommand
{
enum Type
{
kStylePath,
kColorGlyph
};
Type type;
RenderStyle* style = nullptr;
struct ColorGlyphInfo
{
rcp<Font> font;
GlyphID glyphId;
Mat2D transform;
ColorInt foregroundColor;
};
ColorGlyphInfo colorGlyph;
};
std::vector<RawTextDrawCommand> m_drawCommands;
};
} // namespace rive
#endif // WITH_RIVE_TEXT
#endif