| #ifndef _RIVE_TEXT_MODIFIER_GROUP_HPP_ | |
| #define _RIVE_TEXT_MODIFIER_GROUP_HPP_ | |
| #include "rive/generated/text/text_modifier_group_base.hpp" | |
| #include "rive/text/text_modifier_flags.hpp" | |
| #include "rive/text_engine.hpp" | |
| #include <vector> | |
| namespace rive | |
| { | |
| class TextModifierRange; | |
| class TextModifier; | |
| class TextShapeModifier; | |
| class GlyphLookup; | |
| class Text; | |
| class StyledText; | |
| class TextModifierGroup : public TextModifierGroupBase | |
| { | |
| public: | |
| StatusCode onAddedDirty(CoreContext* context) override; | |
| void addModifierRange(TextModifierRange* range); | |
| void addModifier(TextModifier* modifier); | |
| void rangeChanged(); | |
| void rangeTypeChanged(); | |
| void shapeModifierChanged(); | |
| void clearRangeMaps(); | |
| void computeRangeMap(Span<const Unichar> text, | |
| const rive::SimpleArray<rive::Paragraph>& shape, | |
| const SimpleArray<SimpleArray<GlyphLine>>& lines, | |
| const GlyphLookup& glyphLookup); | |
| void computeCoverage(uint32_t textSize); | |
| float glyphCoverage(uint32_t textIndex, uint32_t codePointCount); | |
| float coverage(uint32_t textIndex) | |
| { | |
| assert(textIndex < m_coverage.size()); | |
| return m_coverage[textIndex]; | |
| } | |
| void transform(float amount, Mat2D& ctm); | |
| TextRun modifyShape(const Text& text, TextRun run, float strength); | |
| void applyShapeModifiers(const Text& text, StyledText& styledText); | |
| bool modifiesTransform() const | |
| { | |
| return (modifierFlags() & | |
| (uint32_t)(TextModifierFlags::modifyTranslation | | |
| TextModifierFlags::modifyRotation | TextModifierFlags::modifyScale | | |
| TextModifierFlags::modifyOrigin)) != 0; | |
| } | |
| bool modifiesOpacity() const | |
| { | |
| return (modifierFlags() & (uint32_t)TextModifierFlags::modifyOpacity) != 0; | |
| } | |
| bool modifiesRotation() const | |
| { | |
| return (modifierFlags() & (uint32_t)TextModifierFlags::modifyRotation) != 0; | |
| } | |
| bool modifiesTranslation() const | |
| { | |
| return (modifierFlags() & (uint32_t)TextModifierFlags::modifyTranslation) != 0; | |
| } | |
| bool modifiesScale() const | |
| { | |
| return (modifierFlags() & (uint32_t)TextModifierFlags::modifyScale) != 0; | |
| } | |
| bool modifiesOrigin() const | |
| { | |
| return (modifierFlags() & (uint32_t)TextModifierFlags::modifyOrigin) != 0; | |
| } | |
| float computeOpacity(float current, float t) const; | |
| bool needsShape() const; | |
| #ifdef TESTING | |
| const std::vector<TextModifierRange*>& ranges() const { return m_ranges; } | |
| const std::vector<TextModifier*>& modifiers() const { return m_modifiers; } | |
| #endif | |
| protected: | |
| void modifierFlagsChanged() override; | |
| void originXChanged() override; | |
| void originYChanged() override; | |
| void opacityChanged() override; | |
| void xChanged() override; | |
| void yChanged() override; | |
| void rotationChanged() override; | |
| void scaleXChanged() override; | |
| void scaleYChanged() override; | |
| private: | |
| std::vector<TextModifierRange*> m_ranges; | |
| std::vector<TextModifier*> m_modifiers; | |
| std::vector<TextShapeModifier*> m_shapeModifiers; | |
| std::vector<float> m_coverage; | |
| rcp<Font> m_variableFont; | |
| std::vector<Font::Coord> m_variationCoords; | |
| std::vector<TextRun> m_nextTextRuns; | |
| }; | |
| } // namespace rive | |
| #endif |