blob: 99c021b1ba208d78c1f4544145d1323ae885fb6e [file] [log] [blame]
#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