/*
 * Copyright 2022 Rive
 */

#ifndef _RIVE_RENDER_TEXT_HPP_
#define _RIVE_RENDER_TEXT_HPP_

#include "rive/math/raw_path.hpp"
#include "rive/refcnt.hpp"
#include "rive/span.hpp"

namespace rive {

using Unichar = uint32_t;
using GlyphID = uint16_t;

struct RenderTextRun;
struct RenderGlyphRun;

class RenderFont : public RefCnt {
public:
    struct LineMetrics {
        float ascent, descent;
    };

    const LineMetrics& lineMetrics() const { return m_LineMetrics; }

    // This is experimental
    // -- may only be needed by Editor
    // -- so it may be removed from here later
    //
    struct Axis {
        uint32_t tag;
        float min;
        float def; // default value
        float max;
    };

    // Returns the canonical set of Axes for this font. Use this to know
    // what variations are possible. If you want to know the specific
    // coordinate within that variations space for *this* font, call
    // getCoords().
    //
    virtual std::vector<Axis> getAxes() const = 0;

    struct Coord {
        uint32_t axis;
        float value;
    };

    // Returns the specific coords in variation space for this font.
    // If you want to have a description of the entire variation space,
    // call getAxes().
    //
    virtual std::vector<Coord> getCoords() const = 0;

    virtual rcp<RenderFont> makeAtCoords(Span<const Coord>) const = 0;

    rcp<RenderFont> makeAtCoord(Coord c) { return this->makeAtCoords(Span<const Coord>(&c, 1)); }

    // Returns a 1-point path for this glyph. It will be positioned
    // relative to (0,0) with the typographic baseline at y = 0.
    //
    virtual RawPath getPath(GlyphID) const = 0;

    std::vector<RenderGlyphRun> shapeText(rive::Span<const rive::Unichar> text,
                                          rive::Span<const rive::RenderTextRun> runs) const;

protected:
    RenderFont(const LineMetrics& lm) : m_LineMetrics(lm) {}

    virtual std::vector<RenderGlyphRun>
    onShapeText(rive::Span<const rive::Unichar> text,
                rive::Span<const rive::RenderTextRun> runs) const = 0;

private:
    const LineMetrics m_LineMetrics;
};

struct RenderTextRun {
    rcp<RenderFont> font;
    float size;
    uint32_t unicharCount;
};

struct RenderGlyphRun {
    rcp<RenderFont> font;
    float size;

    std::vector<GlyphID> glyphs;       // [#glyphs]
    std::vector<uint32_t> textOffsets; // [#glyphs]
    std::vector<float> xpos;           // [#glyphs + 1]
};

} // namespace rive
#endif
