in PhotoEditor/DetailPage.cpp [431:479]
void DetailPage::CreateEffectsGraph()
{
auto as_source = [](auto&& arg) -> IGraphicsEffectSource
{
return arg;
};
// Create effects chain from list of effects.
// The CompositeEffect is always the end of the chain and gets some special handling.
for (size_t i = 0; i < m_effectsList.size(); i++)
{
const auto& effect = m_effectsList[i];
if (i == 0)
{
std::visit([&graphicsEffect = m_graphicsEffect](auto&& effect)
{
CompositionEffectSourceParameter source{ L"Backdrop" };
if constexpr (std::is_same_v<CompositeEffect, std::decay_t<decltype(effect)>>)
{
auto const& sources = graphicsEffect.Sources();
sources.Clear();
sources.Append(source);
}
else
{
effect.Source(source);
}
}, effect);
}
else if (i < m_effectsList.size() - 1)
{
std::visit([source = std::visit(as_source, m_effectsList[i - 1])](auto&& effect)
{
if constexpr (!std::is_same_v<CompositeEffect, std::decay_t<decltype(effect)>>)
{
effect.Source(source);
}
}, effect);
}
else
{
// CompositeEffect is the last effect in the chain.
auto const& sources = m_graphicsEffect.Sources();
sources.Clear();
sources.Append(std::visit(as_source, m_effectsList[i - 1]));
}
}
}