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