| #include "rive/shapes/paint/effects_container.hpp" | |
| #include "rive/shapes/paint/stroke_effect.hpp" | |
| #include "rive/shapes/paint/shape_paint.hpp" | |
| #include "rive/shapes/paint/fill.hpp" | |
| #include "rive/shapes/paint/stroke.hpp" | |
| #include "rive/shapes/paint/group_effect.hpp" | |
| using namespace rive; | |
| void EffectsContainer::addStrokeEffect(StrokeEffect* effect) | |
| { | |
| m_effects.push_back(effect); | |
| } | |
| EffectsContainer* EffectsContainer::from(Component* component) | |
| { | |
| if (component) | |
| { | |
| switch (component->coreType()) | |
| { | |
| case ShapePaintBase::typeKey: | |
| case FillBase::typeKey: | |
| case StrokeBase::typeKey: | |
| return component->as<ShapePaint>(); | |
| case GroupEffectBase::typeKey: | |
| return component->as<GroupEffect>(); | |
| } | |
| } | |
| return nullptr; | |
| } | |
| void EffectsContainer::invalidateEffects(StrokeEffect* invalidatingEffect) | |
| { | |
| auto found = invalidatingEffect == nullptr; | |
| for (auto& effect : m_effects) | |
| { | |
| if (found) | |
| { | |
| effect->invalidateEffect(nullptr); | |
| } | |
| if (invalidatingEffect && invalidatingEffect == effect) | |
| { | |
| found = true; | |
| } | |
| } | |
| } | |
| ShapePaintPath* EffectsContainer::lastEffectPath(PathProvider* pathProvider) | |
| { | |
| if (m_effects.size() > 0) | |
| { | |
| size_t effectIndex = m_effects.size() - 1; | |
| while (effectIndex >= 0) | |
| { | |
| auto effect = m_effects[effectIndex]->effectPath(pathProvider); | |
| if (effect) | |
| { | |
| return effect; | |
| } | |
| if (effectIndex == 0) | |
| { | |
| break; | |
| } | |
| effectIndex -= 1; | |
| } | |
| } | |
| return nullptr; | |
| } | |
| void EffectsContainer::invalidateEffects() { invalidateEffects(nullptr); } |