summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/font/text_metrics.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/font/text_metrics.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/font/text_metrics.cpp221
1 files changed, 25 insertions, 196 deletions
diff --git a/3rdparty/bgfx/examples/common/font/text_metrics.cpp b/3rdparty/bgfx/examples/common/font/text_metrics.cpp
index 835c9e14187..d32447c9b84 100644
--- a/3rdparty/bgfx/examples/common/font/text_metrics.cpp
+++ b/3rdparty/bgfx/examples/common/font/text_metrics.cpp
@@ -3,8 +3,6 @@
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
-#include <wchar.h> // wcslen
-
#include "text_metrics.h"
#include "utf8.h"
@@ -47,9 +45,9 @@ void TextMetrics::appendText(FontHandle _fontHandle, const char* _string)
{
if (codepoint == L'\n')
{
- m_height += m_lineGap + font.ascender - font.descender;
+ m_height += m_lineGap + font.ascender - font.descender;
m_lineGap = font.lineGap;
- m_lineHeight = font.ascender - font.descender;
+ m_lineHeight = font.ascender - font.descender;
m_x = 0;
}
@@ -69,65 +67,22 @@ void TextMetrics::appendText(FontHandle _fontHandle, const char* _string)
BX_CHECK(state == UTF8_ACCEPT, "The string is not well-formed");
}
-void TextMetrics::appendText(FontHandle _fontHandle, const wchar_t* _string)
-{
- const FontInfo& font = m_fontManager->getFontInfo(_fontHandle);
-
- if (font.lineGap > m_lineGap)
- {
- m_lineGap = font.lineGap;
- }
-
- if ( (font.ascender - font.descender) > m_lineHeight)
- {
- m_height -= m_lineHeight;
- m_lineHeight = font.ascender - font.descender;
- m_height += m_lineHeight;
- }
-
- for (uint32_t ii = 0, end = (uint32_t)wcslen(_string); ii < end; ++ii)
- {
- uint32_t codepoint = _string[ii];
- const GlyphInfo* glyph = m_fontManager->getGlyphInfo(_fontHandle, codepoint);
- if (NULL != glyph)
- {
- if (codepoint == L'\n')
- {
- m_height += m_lineGap + font.ascender - font.descender;
- m_lineGap = font.lineGap;
- m_lineHeight = font.ascender - font.descender;
- m_x = 0;
- }
-
- m_x += glyph->advance_x;
- if(m_x > m_width)
- {
- m_width = m_x;
- }
- }
- else
- {
- BX_CHECK(false, "Glyph not found");
- }
- }
-}
-
TextLineMetrics::TextLineMetrics(const FontInfo& _fontInfo)
{
m_lineHeight = _fontInfo.ascender - _fontInfo.descender + _fontInfo.lineGap;
}
-uint32_t TextLineMetrics::getLineCount(const char* _string) const
+uint32_t TextLineMetrics::getLineCount(const bx::StringView& _str) const
{
CodePoint codepoint = 0;
uint32_t state = 0;
uint32_t lineCount = 1;
- for (; *_string; ++_string)
+ for (const char* ptr = _str.getPtr(); ptr != _str.getTerm(); ++ptr)
{
- if (utf8_decode(&state, (uint32_t*)&codepoint, *_string) == UTF8_ACCEPT)
+ if (utf8_decode(&state, (uint32_t*)&codepoint, *ptr) == UTF8_ACCEPT)
{
- if(codepoint == L'\n')
- {
+ if (codepoint == L'\n')
+ {
++lineCount;
}
}
@@ -137,113 +92,26 @@ uint32_t TextLineMetrics::getLineCount(const char* _string) const
return lineCount;
}
-uint32_t TextLineMetrics::getLineCount(const wchar_t* _string) const
-{
- uint32_t lineCount = 1;
- for ( ;*_string != L'\0'; ++_string)
- {
- if(*_string == L'\n')
- {
- ++lineCount;
- }
- }
- return lineCount;
-}
-
-
-void TextLineMetrics::getSubText(const char* _string, uint32_t _firstLine, uint32_t _lastLine, const char*& _begin, const char*& _end)
+void TextLineMetrics::getSubText(const bx::StringView& _str, uint32_t _firstLine, uint32_t _lastLine, const char*& _begin, const char*& _end)
{
CodePoint codepoint = 0;
uint32_t state = 0;
// y is bottom of a text line
uint32_t currentLine = 0;
- while(*_string && (currentLine < _firstLine) )
- {
- for (; *_string; ++_string)
- {
- if (utf8_decode(&state, (uint32_t*)&codepoint, *_string) == UTF8_ACCEPT)
- {
- if (codepoint == L'\n')
- {
- ++currentLine;
- ++_string;
- break;
- }
- }
- }
- }
- BX_CHECK(state == UTF8_ACCEPT, "The string is not well-formed");
- _begin = _string;
+ const char* ptr = _str.getPtr();
- while ( (*_string) && (currentLine < _lastLine) )
+ while (ptr != _str.getTerm()
+ && (currentLine < _firstLine) )
{
- for (; *_string; ++_string)
- {
- if(utf8_decode(&state, (uint32_t*)&codepoint, *_string) == UTF8_ACCEPT)
+ for (; ptr != _str.getTerm(); ++ptr)
+ {
+ if (utf8_decode(&state, (uint32_t*)&codepoint, *ptr) == UTF8_ACCEPT)
{
- if(codepoint == L'\n')
+ if (codepoint == L'\n')
{
++currentLine;
- ++_string;
- break;
- }
- }
- }
- }
-
- BX_CHECK(state == UTF8_ACCEPT, "The string is not well-formed");
- _end = _string;
-}
-
-void TextLineMetrics::getSubText(const wchar_t* _string, uint32_t _firstLine, uint32_t _lastLine, const wchar_t*& _begin, const wchar_t*& _end)
-{
- uint32_t currentLine = 0;
- while ( (*_string != L'\0') && (currentLine < _firstLine) )
- {
- for ( ;*_string != L'\0'; ++_string)
- {
- if(*_string == L'\n')
- {
- ++currentLine;
- ++_string;
- break;
- }
- }
- }
- _begin = _string;
-
- while ( (*_string != L'\0') && (currentLine < _lastLine) )
- {
- for ( ;*_string != L'\0'; ++_string)
- {
- if(*_string == L'\n')
- {
- ++currentLine;
- ++_string;
- break;
- }
- }
- }
- _end = _string;
-}
-
-void TextLineMetrics::getVisibleText(const char* _string, float _top, float _bottom, const char*& _begin, const char*& _end)
-{
- CodePoint codepoint = 0;
- uint32_t state = 0;
- // y is bottom of a text line
- float y = m_lineHeight;
- while (*_string && (y < _top) )
- {
- for (; *_string; ++_string)
- {
- if(utf8_decode(&state, (uint32_t*)&codepoint, *_string) == UTF8_ACCEPT)
- {
- if(codepoint == L'\n')
- {
- y += m_lineHeight;
- ++_string;
+ ++ptr;
break;
}
}
@@ -251,20 +119,19 @@ void TextLineMetrics::getVisibleText(const char* _string, float _top, float _bot
}
BX_CHECK(state == UTF8_ACCEPT, "The string is not well-formed");
- _begin = _string;
+ _begin = ptr;
- // y is now top of a text line
- y -= m_lineHeight;
- while ( (*_string) && (y < _bottom) )
+ while (ptr != _str.getTerm()
+ && (currentLine < _lastLine) )
{
- for (; *_string; ++_string)
- {
- if(utf8_decode(&state, (uint32_t*)&codepoint, *_string) == UTF8_ACCEPT)
+ for (; ptr != _str.getTerm(); ++ptr)
+ {
+ if(utf8_decode(&state, (uint32_t*)&codepoint, *ptr) == UTF8_ACCEPT)
{
if(codepoint == L'\n')
{
- y += m_lineHeight;
- ++_string;
+ ++currentLine;
+ ++ptr;
break;
}
}
@@ -272,43 +139,5 @@ void TextLineMetrics::getVisibleText(const char* _string, float _top, float _bot
}
BX_CHECK(state == UTF8_ACCEPT, "The string is not well-formed");
- _end = _string;
-}
-
-void TextLineMetrics::getVisibleText(const wchar_t* _string, float _top, float _bottom, const wchar_t*& _begin, const wchar_t*& _end)
-{
- // y is bottom of a text line
- float y = m_lineHeight;
-
- const wchar_t* _textEnd = _string + wcslen(_string);
-
- while (y < _top)
- {
- for (const wchar_t* _current = _string; _current < _textEnd; ++_current)
- {
- if(*_current == L'\n')
- {
- y += m_lineHeight;
- ++_string;
- break;
- }
- }
- }
- _begin = _string;
-
- // y is now top of a text line
- y -= m_lineHeight;
- while (y < _bottom )
- {
- for (const wchar_t* _current = _string; _current < _textEnd; ++_current)
- {
- if(*_current == L'\n')
- {
- y += m_lineHeight;
- ++_string;
- break;
- }
- }
- }
- _end = _string;
+ _end = ptr;
}