Fix colors when unicode characters are in chat box (Online).

This is just hanubeki's patch which calculates accurate widths of
characters so colors don't get offset.

Signed-off-by: Sandon Van Ness <sandon@inktank.com>
This commit is contained in:
Sandon Van Ness
2014-03-11 22:06:19 -07:00
parent 3291ecc553
commit 27e393e1c6
+17 -14
View File
@@ -103,7 +103,7 @@ bool ScreenNetSelectBase::Input( const InputEventPlus &input )
wchar_t c;
c = INPUTMAN->DeviceInputToChar(input.DeviceI, true);
if( (c >= ' ') && (!bHoldingCtrl) )
if( (c >= L' ') && (!bHoldingCtrl) )
{
m_sTextInput += WStringToRString(wstring()+c);
UpdateTextInput();
@@ -169,7 +169,7 @@ void ScreenNetSelectBase::UpdateUsers()
for( unsigned i=0; i < NSMAN->m_ActivePlayer.size(); i++)
{
m_textUsers[i].LoadFromFont( THEME->GetPathF(m_sName,"users") );
m_textUsers[i].LoadFromFont( THEME->GetPathF(m_sName,"chat") );
m_textUsers[i].SetHorizAlign( align_center );
m_textUsers[i].SetVertAlign( align_top );
m_textUsers[i].SetShadowLength( 0 );
@@ -250,21 +250,24 @@ void ColorBitmapText::SetText( const RString& _sText, const RString& _sAlternate
}
}
char curChar = m_sText[i];
int iCharLen = m_pFont->GetLineWidthInSourcePixels( wstring(1, curChar) );
int iCharLength = min( utf8_get_char_len(m_sText[i]), iCharsLeft + 1 );
RString curCharStr = m_sText.substr( i, iCharLength );
wchar_t curChar = utf8_get_char( curCharStr );
i += iCharLength - 1;
int iCharWidth = m_pFont->GetLineWidthInSourcePixels( wstring() + curChar );
switch( curChar )
{
case ' ':
case L' ':
if( /* iLineWidth == 0 &&*/ iWordWidth == 0 )
break;
sCurrentLine += sCurrentWord + " ";
iLineWidth += iWordWidth + iCharLen;
iLineWidth += iWordWidth + iCharWidth;
sCurrentWord = "";
iWordWidth = 0;
iGlyphsSoFar++;
break;
case '\n':
case L'\n':
if( iLineWidth + iWordWidth > iWrapWidthPixels )
{
SimpleAddLine( sCurrentLine, iLineWidth );
@@ -284,23 +287,23 @@ void ColorBitmapText::SetText( const RString& _sText, const RString& _sAlternate
}
break;
default:
if( iWordWidth + iCharLen > iWrapWidthPixels && iLineWidth == 0 )
if( iWordWidth + iCharWidth > iWrapWidthPixels && iLineWidth == 0 )
{
SimpleAddLine( sCurrentWord, iWordWidth );
sCurrentWord = curChar; iWordWidth = iCharLen;
sCurrentWord = curCharStr; iWordWidth = iCharWidth;
}
else if( iWordWidth + iLineWidth + iCharLen > iWrapWidthPixels )
else if( iWordWidth + iLineWidth + iCharWidth > iWrapWidthPixels )
{
SimpleAddLine( sCurrentLine, iLineWidth );
sCurrentLine = "";
iLineWidth = 0;
sCurrentWord += curChar;
iWordWidth += iCharLen;
sCurrentWord += curCharStr;
iWordWidth += iCharWidth;
}
else
{
sCurrentWord += curChar;
iWordWidth += iCharLen;
sCurrentWord += curCharStr;
iWordWidth += iCharWidth;
}
iGlyphsSoFar++;
break;