m_maxHeight = fHeight;
m_textWidth = 0;
m_textHeight = 0;
+ m_lastUpdateW = false;
}
void CGUITextLayout::SetWrap(bool bWrap)
bool CGUITextLayout::Update(const CStdString &text, float maxWidth, bool forceUpdate /*= false*/, bool forceLTRReadingOrder /*= false*/)
{
- // convert to utf16
+ if (text == m_lastUtf8Text && !forceUpdate && !m_lastUpdateW)
+ return false;
+
+ m_lastUtf8Text = text;
+ m_lastUpdateW = false;
CStdStringW utf16;
utf8ToW(text, utf16);
-
- // update
- return UpdateW(utf16, maxWidth, forceUpdate, forceLTRReadingOrder);
+ UpdateCommon(utf16, maxWidth, forceLTRReadingOrder);
+ return true;
}
bool CGUITextLayout::UpdateW(const CStdStringW &text, float maxWidth /*= 0*/, bool forceUpdate /*= false*/, bool forceLTRReadingOrder /*= false*/)
{
- if (text.Equals(m_lastText) && !forceUpdate)
+ if (text == m_lastText && !forceUpdate && m_lastUpdateW)
return false;
+ m_lastText = text;
+ m_lastUpdateW = true;
+ UpdateCommon(text, maxWidth, forceLTRReadingOrder);
+ return true;
+}
+
+void CGUITextLayout::UpdateCommon(const CStdStringW &text, float maxWidth, bool forceLTRReadingOrder)
+{
// parse the text for style information
vecText parsedText;
vecColors colors;
// and update
UpdateStyled(parsedText, colors, maxWidth, forceLTRReadingOrder);
- m_lastText = text;
- return true;
}
void CGUITextLayout::UpdateStyled(const vecText &text, const vecColors &colors, float maxWidth, bool forceLTRReadingOrder)
character_t style = *it & 0xffff0000;
if (style != sectionStyle)
{
- if (!sectionText.IsEmpty())
+ if (!sectionText.empty())
{ // style has changed, bidi flip text
CStdStringW sectionFlipped = BidiFlip(sectionText, forceLTRReadingOrder);
for (unsigned int j = 0; j < sectionFlipped.size(); j++)
}
// handle the last section
- if (!sectionText.IsEmpty())
+ if (!sectionText.empty())
{
CStdStringW sectionFlipped = BidiFlip(sectionText, forceLTRReadingOrder);
for (unsigned int j = 0; j < sectionFlipped.size(); j++)
vecColors colors;
vecText parsedText;
ParseText(utf16, 0, 0xffffffff, colors, parsedText);
- utf16.Empty();
+ utf16.clear();
for (unsigned int i = 0; i < parsedText.size(); i++)
utf16 += (wchar_t)(0xffff & parsedText[i]);
g_charsetConverter.wToUTF8(utf16, text);
// but [LOWERCASE]Glah[UPPERCASE]FReD[/UPPERCASE]Georeg[/LOWERCASE] won't
int startPos = 0;
- size_t pos = text.Find(L'[');
- while (pos != CStdString::npos && pos + 1 < text.size())
+ size_t pos = text.find(L'[');
+ while (pos != std::string::npos && pos + 1 < text.size())
{
uint32_t newStyle = 0;
color_t newColor = currentColor;
bool newLine = false;
// have a [ - check if it's an ON or OFF switch
bool on(true);
- int endPos = pos++; // finish of string
+ size_t endPos = pos++; // finish of string
if (text[pos] == L'/')
{
on = false;
pos++;
}
// check for each type
- if (text.Mid(pos,2) == L"B]")
+ if (text.compare(pos, 2, L"B]") == 0)
{ // bold - finish the current text block and assign the bold state
pos += 2;
- if ((on && text.Find(L"[/B]",pos) >= 0) || // check for a matching end point
+ if ((on && text.find(L"[/B]",pos) != std::string::npos) || // check for a matching end point
(!on && (currentStyle & FONT_STYLE_BOLD))) // or matching start point
newStyle = FONT_STYLE_BOLD;
}
- else if (text.Mid(pos,2) == L"I]")
+ else if (text.compare(pos, 2, L"I]") == 0)
{ // italics
pos += 2;
- if ((on && text.Find(L"[/I]",pos) >= 0) || // check for a matching end point
+ if ((on && text.find(L"[/I]", pos) != std::string::npos) || // check for a matching end point
(!on && (currentStyle & FONT_STYLE_ITALICS))) // or matching start point
newStyle = FONT_STYLE_ITALICS;
}
- else if (text.Mid(pos,10) == L"UPPERCASE]")
+ else if (text.compare(pos, 10, L"UPPERCASE]") == 0)
{
pos += 10;
- if ((on && text.Find(L"[/UPPERCASE]",pos) >= 0) || // check for a matching end point
+ if ((on && text.find(L"[/UPPERCASE]", pos) != std::string::npos) || // check for a matching end point
(!on && (currentStyle & FONT_STYLE_UPPERCASE))) // or matching start point
newStyle = FONT_STYLE_UPPERCASE;
}
- else if (text.Mid(pos,10) == L"LOWERCASE]")
+ else if (text.compare(pos, 10, L"LOWERCASE]") == 0)
{
pos += 10;
- if ((on && text.Find(L"[/LOWERCASE]",pos) >= 0) || // check for a matching end point
+ if ((on && text.find(L"[/LOWERCASE]", pos) != std::string::npos) || // check for a matching end point
(!on && (currentStyle & FONT_STYLE_LOWERCASE))) // or matching start point
newStyle = FONT_STYLE_LOWERCASE;
}
- else if (text.Mid(pos,3) == L"CR]" && on)
+ else if (text.compare(pos, 3, L"CR]") == 0 && on)
{
newLine = true;
pos += 3;
}
- else if (text.Mid(pos,5) == L"COLOR")
+ else if (text.compare(pos,5, L"COLOR") == 0)
{ // color
- size_t finish = text.Find(L']', pos + 5);
- if (on && finish != CStdString::npos && (size_t)text.Find(L"[/COLOR]",finish) != CStdString::npos)
+ size_t finish = text.find(L']', pos + 5);
+ if (on && finish != std::string::npos && text.find(L"[/COLOR]",finish) != std::string::npos)
{
- color_t color = g_colorManager.GetColor(text.Mid(pos + 5, finish - pos - 5));
+ std::string t;
+ g_charsetConverter.wToUTF8(text.substr(pos + 5, finish - pos - 5), t);
+ color_t color = g_colorManager.GetColor(t);
vecColors::const_iterator it = std::find(colors.begin(), colors.end(), color);
if (it == colors.end())
{ // create new color
if (newStyle || colorTagChange || newLine)
{ // we have a new style or a new color, so format up the previous segment
- CStdStringW subText = text.Mid(startPos, endPos - startPos);
+ CStdStringW subText = text.substr(startPos, endPos - startPos);
if (currentStyle & FONT_STYLE_UPPERCASE)
- subText.ToUpper();
+ StringUtils::ToUpper(subText);
if (currentStyle & FONT_STYLE_LOWERCASE)
- subText.ToLower();
+ StringUtils::ToLower(subText);
AppendToUTF32(subText, ((currentStyle & 3) << 24) | (currentColor << 16), parsedText);
if (newLine)
parsedText.push_back(L'\n');
else
currentStyle &= ~newStyle;
}
- pos = text.Find(L'[',pos);
+ pos = text.find(L'[', pos);
}
// now grab the remainder of the string
- CStdStringW subText = text.Mid(startPos, text.GetLength() - startPos);
+ CStdStringW subText = text.substr(startPos);
if (currentStyle & FONT_STYLE_UPPERCASE)
- subText.ToUpper();
+ StringUtils::ToUpper(subText);
if (currentStyle & FONT_STYLE_LOWERCASE)
- subText.ToLower();
+ StringUtils::ToLower(subText);
AppendToUTF32(subText, ((currentStyle & 3) << 24) | (currentColor << 16), parsedText);
}
void CGUITextLayout::Reset()
{
m_lines.clear();
- m_lastText.Empty();
+ m_lastText.clear();
+ m_lastUtf8Text.clear();
m_textWidth = m_textHeight = 0;
}