add functionality to measure text without rendering it

This commit is contained in:
Jeremie Roy
2013-05-21 14:45:14 +02:00
parent 4ade0981f1
commit 292b021e0e
2 changed files with 92 additions and 3 deletions

View File

@@ -248,8 +248,7 @@ void TextBuffer::appendText(FontHandle _fontHandle, const char* _string)
if (state != UTF8_ACCEPT)
{
// assert(false && "The string is not well-formed");
return; //"The string is not well-formed\n"
BX_CHECK(false, "The string is not well-formed");
}
}
@@ -280,6 +279,7 @@ void TextBuffer::appendText(FontHandle _fontHandle, const wchar_t* _string)
}
}
}
void TextBuffer::appendAtlasFace(uint16_t _faceIndex)
{
float x0 = m_penX;
@@ -841,6 +841,88 @@ void TextBufferManager::clearTextBuffer(TextBufferHandle _handle)
bc.textBuffer->clearTextBuffer();
}
TextRectangle TextBufferManager::measureText(FontHandle _fontHandle, const char* _string) const
{
GlyphInfo glyph;
const FontInfo& font = m_fontManager->getFontInfo(_fontHandle);
TextRectangle rect;
rect.width = 0;
rect.height = font.ascender - font.descender; //should I put lineGap here ?
CodePoint codepoint = 0;
uint32_t state = 0;
float w = 0;
for (; *_string; ++_string)
{
if (!utf8_decode(&state, (uint32_t*)&codepoint, *_string) )
{
if (m_fontManager->getGlyphInfo(_fontHandle, codepoint, glyph) )
{
if (codepoint == L'\n')
{
rect.height += font.lineGap + font.ascender - font.descender;
w=0;
break;
}
//TODO kerning
if((w + glyph.advance_x) > rect.width)
{
rect.width = w + glyph.advance_x;
}
}
else
{
BX_CHECK(false, "Glyph not found");
}
}
}
if (state != UTF8_ACCEPT)
{
BX_CHECK(false, "The string is not well-formed");
}
return rect;
}
TextRectangle TextBufferManager::measureText(FontHandle _fontHandle, const wchar_t* _string) const
{
GlyphInfo glyph;
const FontInfo& font = m_fontManager->getFontInfo(_fontHandle);
TextRectangle rect;
rect.width = 0;
rect.height = font.ascender - font.descender; //should I put lineGap here ?
float w = 0;
for (uint32_t ii = 0, end = wcslen(_string); ii < end; ++ii)
{
uint32_t codepoint = _string[ii];
if (m_fontManager->getGlyphInfo(_fontHandle, codepoint, glyph) )
{
if (codepoint == L'\n')
{
rect.height += font.lineGap + font.ascender - font.descender;
w=0;
break;
}
//TODO kerning
if((w + glyph.advance_x) > rect.width)
{
rect.width = w + glyph.advance_x;
}
}
else
{
BX_CHECK(false, "Glyph not found");
}
}
return rect;
}
TextRectangle TextBufferManager::getRectangle(TextBufferHandle _handle) const
{
BX_CHECK(bgfx::invalidHandle != _handle.idx, "Invalid handle used");