| #include "rive/text/glyph_lookup.hpp" |
| #include "rive/text_engine.hpp" |
| |
| using namespace rive; |
| |
| void GlyphLookup::compute(Span<const Unichar> text, const SimpleArray<Paragraph>& shape) |
| { |
| size_t codeUnitCount = text.size(); |
| m_glyphIndices.resize(codeUnitCount + 1); |
| // Build a mapping of codePoints to glyphs indices. |
| uint32_t glyphIndex = 0; |
| uint32_t lastTextIndex = 0; |
| for (const Paragraph& paragraph : shape) |
| { |
| for (const GlyphRun& run : paragraph.runs) |
| { |
| for (size_t i = 0; i < run.glyphs.size(); i++) |
| { |
| uint32_t textIndex = run.textIndices[i]; |
| for (uint32_t j = lastTextIndex; j < textIndex; j++) |
| { |
| assert(glyphIndex != 0); |
| m_glyphIndices[j] = glyphIndex - 1; |
| } |
| lastTextIndex = textIndex; |
| glyphIndex++; |
| } |
| } |
| } |
| for (size_t i = lastTextIndex; i < codeUnitCount; i++) |
| { |
| m_glyphIndices[i] = glyphIndex - 1; |
| } |
| |
| // Store a fake unreachable glyph at the end to allow selecting the last |
| // one. |
| m_glyphIndices[codeUnitCount] = codeUnitCount == 0 ? 0 : m_glyphIndices[codeUnitCount - 1] + 1; |
| } |
| |
| uint32_t GlyphLookup::count(uint32_t index) const |
| { |
| assert(index < (uint32_t)m_glyphIndices.size()); |
| |
| uint32_t value = m_glyphIndices[index]; |
| uint32_t count = 1; |
| uint32_t size = (uint32_t)m_glyphIndices.size(); |
| while (++index < size && m_glyphIndices[index] == value) |
| { |
| count++; |
| } |
| return count; |
| } |