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