| #include "rive/shapes/paint/shape_paint.hpp" | |
| #include "rive/shapes/paint/stroke_effect.hpp" | |
| using namespace rive; | |
| // This is only called from within a StrokeEffect. | |
| // Whenever a StrokeEffect needs to invalidate ITSELF | |
| // this method should be used (not invalidateEffect). | |
| // It calls invalidateEffects on its parent ShapePaint | |
| // which can result in invalidating other StrokeEffects. | |
| // It also calls invalidateEffect() to do the invalidation | |
| // work on itself | |
| void StrokeEffect::invalidateEffectFromLocal() | |
| { | |
| for (auto& effectPath : m_effectPaths) | |
| { | |
| effectPath.second->invalidateEffect(); | |
| } | |
| auto parentShapePaint = parentPaint(); | |
| if (parentShapePaint != nullptr) | |
| { | |
| parentShapePaint->invalidateEffects(this); | |
| } | |
| } | |
| // This is called from outside StrokeEffect. | |
| // This does the actual invalidation work. | |
| // This should NOT be called from inside StrokeEffect | |
| // directly (it is called indirectly via invalidateEffectFromLocal) | |
| void StrokeEffect::invalidateEffect(PathProvider* pathProvider) | |
| { | |
| if (pathProvider) | |
| { | |
| auto effectPathIt = m_effectPaths.find(pathProvider); | |
| if (effectPathIt != m_effectPaths.end()) | |
| { | |
| effectPathIt->second->invalidateEffect(); | |
| } | |
| } | |
| else | |
| { | |
| for (auto& effectPath : m_effectPaths) | |
| { | |
| effectPath.second->invalidateEffect(); | |
| } | |
| } | |
| } | |
| StrokeEffect::~StrokeEffect() | |
| { | |
| for (auto& effectPath : m_effectPaths) | |
| { | |
| delete effectPath.second; | |
| } | |
| } | |
| ShapePaintPath* StrokeEffect::effectPath(PathProvider* pathProvider) | |
| { | |
| auto it = m_effectPaths.find(pathProvider); | |
| if (it != m_effectPaths.end()) | |
| { | |
| return it->second->path(); | |
| } | |
| return nullptr; | |
| } |