/*
 * Copyright 2019 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkottieTextAdapter_DEFINED
#define SkottieTextAdapter_DEFINED

#include "modules/skottie/src/SkottieAdapter.h"
#include "modules/skottie/src/text/SkottieShaper.h"
#include "modules/skottie/src/text/TextAnimator.h"
#include "modules/skottie/src/text/TextValue.h"

#include <vector>

class SkFontMgr;

namespace skottie {
namespace internal {

class TextAdapter final : public SkNVRefCnt<TextAdapter> {
public:
    TextAdapter(sk_sp<sksg::Group> root, sk_sp<SkFontMgr>, sk_sp<Logger>, bool hasAnimators);
    ~TextAdapter();

    ADAPTER_PROPERTY(Text, TextValue, TextValue())

    const sk_sp<sksg::Group>& root() const { return fRoot; }

    void applyAnimators(const std::vector<sk_sp<TextAnimator>>&);

private:
    struct FragmentRec {
        SkPoint                       fOrigin; // fragment position

        sk_sp<sksg::Matrix<SkMatrix>> fMatrixNode;
        sk_sp<sksg::Color>            fFillColorNode,
                                      fStrokeColorNode;
    };

    void addFragment(const Shaper::Fragment&);
    void buildDomainMaps(const Shaper::Result&);

    void apply();

    void pushPropsToFragment(const TextAnimator::AnimatedProps&, const FragmentRec&) const;

    void adjustLineTracking(const TextAnimator::ModulatorBuffer&,
                            const TextAnimator::DomainSpan&,
                            float line_tracking) const;

    const sk_sp<sksg::Group> fRoot;
    const sk_sp<SkFontMgr>   fFontMgr;
    sk_sp<Logger>            fLogger;
    const bool               fHasAnimators;

    std::vector<FragmentRec> fFragments;
    TextAnimator::DomainMaps fMaps;
};

} // namespace internal
} // namespace skottie

#endif // SkottieTextAdapter_DEFINED