void DetailPage::CreateEffectsGraph()

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]));
            }
        }
    }