| #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); } |