/*
 * Copyright 2022 Rive
 */

#ifndef _RIVE_RENDERFONT_CORETEXT_HPP_
#define _RIVE_RENDERFONT_CORETEXT_HPP_

#include "rive/factory.hpp"
#include "rive/render_text.hpp"

#if defined(RIVE_BUILD_FOR_OSX)
#include <ApplicationServices/ApplicationServices.h>
#elif defined(RIVE_BUILD_FOR_IOS)
#include <CoreText/CoreText.h>
#endif

class CoreTextRenderFont : public rive::RenderFont {
public:
    CTFontRef m_font;
    const std::vector<Axis> m_axes;
    const std::vector<Coord> m_coords;

    // We assume ownership of font!
    CoreTextRenderFont(CTFontRef, std::vector<Axis>);
    ~CoreTextRenderFont() override;

    std::vector<Axis> getAxes() const override { return m_axes; }
    std::vector<Coord> getCoords() const override { return m_coords; }
    rive::rcp<rive::RenderFont> makeAtCoords(rive::Span<const Coord>) const override;
    rive::RawPath getPath(rive::GlyphID) const override;
    std::vector<rive::RenderGlyphRun>
        onShapeText(rive::Span<const rive::Unichar>,
                    rive::Span<const rive::RenderTextRun>) const override;

    static rive::rcp<rive::RenderFont> Decode(rive::Span<const uint8_t>);
    static rive::rcp<rive::RenderFont> FromCT(CTFontRef);
};

#endif
