blob: cfb779db649c9fbf919f7a198377c33c4914e29e [file] [log] [blame] [edit]
#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;
}