#ifndef MICROTEX_UNI_CHAR_H #define MICROTEX_UNI_CHAR_H #include "otf/glyph.h" #include "utils/utils.h" namespace microtex { struct OtfFont; /** Represents a character-glyph to be measured and drawn with its font, glyph id and scale */ struct Char final { /** The original code point of the character */ const c32 code = 0; /** The mapped code point (by math style) of the character */ const c32 mappedCode = 0; /** The font id */ const i32 fontId = -1; /** The glyph id, -1 if no corresponding glyph in the font */ const i32 glyphId = -1; /** The glyph scale, can be modified during using */ float scale = 1.f; Char() = default; Char(c32 code, c32 mapped, i32 fid, i32 gid, float scale = 1.f); Char(const Char& chr); /** * Create a char-glyph with only font and glyph, the Unicode code-point is 0. *

* Notice that the char-glyph is valid even if its Unicode is 0, because many glyph has no * corresponding Unicode code-point. */ static inline Char onlyGlyph(i32 font, i32 glyph, float scale = 1.f) { return {0, 0, font, glyph, scale}; } /** Test if current glyph is valid, basically the #_glyph >= 0 */ inline bool isValid() const { return glyphId >= 0; } /** The otf font spec the char belongs to */ sptr otfFont() const; /** * The glyph of this char-glyph, NOT NULL. * If the char has no corresponding glyph was found, the '?' will be * returned instead. You should test the validity of this object before * call this function. */ const Glyph* glyph() const; /** The fallback glyph id if is invalid */ i32 fallbackGlyphId() const; /** The width of this char-glyph */ float width() const; /** The height of this char-glyph */ float height() const; /** The depth of this char-glyph, in positive */ float depth() const; /** The italic correction of this char-glyph */ float italic() const; /** Get the position (shift) to attach top accent */ float topAccentAttachment() const; /** Get the number of vertical larger variants */ u16 vLargerCount() const; /** * Get the vertical larger version of this char-glyph, return the copy of * this if no larger version was found. The index 0 is this itself. */ Char vLarger(u32 index) const; /** Get the number of horizontal larger variants */ u16 hLargerCount() const; /** * Get the horizontal larger version of this char-glyph, return the copy of * this if no larger version was found. The index 0 is this itself. */ Char hLarger(u32 index) const; /** * Get the script version of this char-glyph, return the copy of this if * no script version was found. */ Char script(u32 index) const; /** Get the glyph assembly in vertical direction */ const GlyphAssembly& vAssembly() const; /** Get the glyph assembly in horizontal direction */ const GlyphAssembly& hAssembly() const; /** Get the char of the assembly part */ const Char assemblyPart(i32 id) const; }; } // namespace microtex #endif // MICROTEX_UNI_CHAR_H