blob: b721dd8d4b96b83377d8388758b1c4e1cf88ba87 [file] [log] [blame]
/*
* 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