Move ColorBitmapText to SNetSelectBase since this is very specific to the SMO code. This should probably be done in a general way in BitmapText and the string parsing to color code should be kept where it is used instead of part of the bitmap text class.
This commit is contained in:
@@ -14,6 +14,8 @@
|
||||
#include "GameState.h"
|
||||
#include "InputEventPlus.h"
|
||||
#include "RageInput.h"
|
||||
#include "Font.h"
|
||||
#include "RageDisplay.h"
|
||||
|
||||
#define CHATINPUT_WIDTH THEME->GetMetricF(m_sName,"ChatInputBoxWidth")
|
||||
#define CHATINPUT_HEIGHT THEME->GetMetricF(m_sName,"ChatInputBoxHeight")
|
||||
@@ -218,6 +220,245 @@ void ScreenNetSelectBase::UpdateUsers()
|
||||
}
|
||||
}
|
||||
|
||||
void ColorBitmapText::SetText( const RString& _sText, const RString& _sAlternateText, int iWrapWidthPixels )
|
||||
{
|
||||
ASSERT( m_pFont );
|
||||
|
||||
RString sNewText = StringWillUseAlternate(_sText,_sAlternateText) ? _sAlternateText : _sText;
|
||||
|
||||
if( iWrapWidthPixels == -1 ) // wrap not specified
|
||||
iWrapWidthPixels = m_iWrapWidthPixels;
|
||||
|
||||
if( m_sText == sNewText && iWrapWidthPixels==m_iWrapWidthPixels )
|
||||
return;
|
||||
m_sText = sNewText;
|
||||
m_iWrapWidthPixels = iWrapWidthPixels;
|
||||
|
||||
// Set up the first color.
|
||||
m_vColors.clear();
|
||||
ColorChange change;
|
||||
change.c = RageColor ( 1, 1, 1, 1 );
|
||||
change.l = 0;
|
||||
m_vColors.push_back( change );
|
||||
|
||||
m_wTextLines.clear();
|
||||
|
||||
RString sCurrentLine = "";
|
||||
int iLineWidth = 0;
|
||||
|
||||
RString sCurrentWord = "";
|
||||
int iWordWidth = 0;
|
||||
int iGlyphsSoFar = 0;
|
||||
|
||||
for( unsigned i = 0; i < m_sText.length(); i++ )
|
||||
{
|
||||
int iCharsLeft = m_sText.length() - i - 1;
|
||||
|
||||
// First: Check for the special (color) case.
|
||||
|
||||
RString FirstThree = m_sText.substr( i, 3 );
|
||||
if( FirstThree.CompareNoCase("|c0") == 0 && iCharsLeft > 8 )
|
||||
{
|
||||
ColorChange change;
|
||||
int r, g, b;
|
||||
sscanf( m_sText, "|%*c0%2x%2x%2x", &r, &g, &b );
|
||||
change.c = RageColor( r/255.f, g/255.f, b/255.f, 1.f );
|
||||
change.l = iGlyphsSoFar;
|
||||
if( iGlyphsSoFar == 0 )
|
||||
m_vColors[0] = change;
|
||||
else
|
||||
m_vColors.push_back( change );
|
||||
i+=8;
|
||||
continue;
|
||||
}
|
||||
|
||||
char curChar = m_sText[0];
|
||||
int iCharLen = m_pFont->GetLineWidthInSourcePixels( wstring(1, curChar) );
|
||||
|
||||
switch( curChar )
|
||||
{
|
||||
case ' ':
|
||||
if( /* iLineWidth == 0 &&*/ iWordWidth == 0 )
|
||||
break;
|
||||
sCurrentLine += sCurrentWord + " ";
|
||||
iLineWidth += iWordWidth + iCharLen;
|
||||
sCurrentWord = "";
|
||||
iWordWidth = 0;
|
||||
iGlyphsSoFar++;
|
||||
break;
|
||||
case '\n':
|
||||
if( iLineWidth + iWordWidth > iWrapWidthPixels )
|
||||
{
|
||||
SimpleAddLine( sCurrentLine, iLineWidth );
|
||||
if( iWordWidth > 0 )
|
||||
iLineWidth = iWordWidth + //Add the width of a space
|
||||
m_pFont->GetLineWidthInSourcePixels( RStringToWstring( " " ) );
|
||||
sCurrentLine = sCurrentWord + " ";
|
||||
iWordWidth = 0;
|
||||
sCurrentWord = "";
|
||||
iGlyphsSoFar++;
|
||||
}
|
||||
else
|
||||
{
|
||||
SimpleAddLine( sCurrentLine + sCurrentWord, iLineWidth + iWordWidth );
|
||||
sCurrentLine = ""; iLineWidth = 0;
|
||||
sCurrentWord = ""; iWordWidth = 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if( iWordWidth + iCharLen > iWrapWidthPixels && iLineWidth == 0 )
|
||||
{
|
||||
SimpleAddLine( sCurrentWord, iWordWidth );
|
||||
sCurrentWord = curChar; iWordWidth = iCharLen;
|
||||
}
|
||||
else if( iWordWidth + iLineWidth + iCharLen > iWrapWidthPixels )
|
||||
{
|
||||
SimpleAddLine( sCurrentLine, iLineWidth );
|
||||
sCurrentLine = "";
|
||||
iLineWidth = 0;
|
||||
sCurrentWord += curChar;
|
||||
iWordWidth += iCharLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
sCurrentWord += curChar;
|
||||
iWordWidth += iCharLen;
|
||||
}
|
||||
iGlyphsSoFar++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( iWordWidth > 0 )
|
||||
{
|
||||
sCurrentLine += sCurrentWord;
|
||||
iLineWidth += iWordWidth;
|
||||
}
|
||||
|
||||
if( iLineWidth > 0 )
|
||||
SimpleAddLine( sCurrentLine, iLineWidth );
|
||||
|
||||
BuildChars();
|
||||
UpdateBaseZoom();
|
||||
}
|
||||
|
||||
void ColorBitmapText::SimpleAddLine( const RString &sAddition, const int iWidthPixels)
|
||||
{
|
||||
m_wTextLines.push_back( RStringToWstring( sAddition ) );
|
||||
m_iLineWidths.push_back( iWidthPixels );
|
||||
}
|
||||
|
||||
void ColorBitmapText::DrawPrimitives( )
|
||||
{
|
||||
Actor::SetGlobalRenderStates(); // set Actor-specified render states
|
||||
DISPLAY->SetTextureMode( TextureUnit_1, TextureMode_Modulate );
|
||||
|
||||
/* Draw if we're not fully transparent or the zbuffer is enabled */
|
||||
if( m_pTempState->diffuse[0].a != 0 )
|
||||
{
|
||||
//
|
||||
// render the shadow
|
||||
//
|
||||
if( m_fShadowLength != 0 )
|
||||
{
|
||||
DISPLAY->PushMatrix();
|
||||
DISPLAY->TranslateWorld( m_fShadowLength, m_fShadowLength, 0 ); // shift by 5 units
|
||||
|
||||
RageColor dim(0,0,0,0.5f*m_pTempState->diffuse[0].a); // semi-transparent black
|
||||
|
||||
for( unsigned i=0; i<m_aVertices.size(); i++ )
|
||||
m_aVertices[i].c = dim;
|
||||
DrawChars();
|
||||
|
||||
DISPLAY->PopMatrix();
|
||||
}
|
||||
|
||||
//
|
||||
// render the diffuse pass
|
||||
//
|
||||
int loc = 0, cur = 0;
|
||||
RageColor c = m_pTempState->diffuse[0];
|
||||
|
||||
for( unsigned i=0; i<m_aVertices.size(); i+=4 )
|
||||
{
|
||||
loc++;
|
||||
if( cur < (int)m_vColors.size() )
|
||||
{
|
||||
if ( loc > m_vColors[cur].l )
|
||||
{
|
||||
c = m_vColors[cur].c;
|
||||
cur++;
|
||||
}
|
||||
}
|
||||
for( unsigned j=0; j<4; j++ )
|
||||
m_aVertices[i+j].c = c;
|
||||
}
|
||||
|
||||
DrawChars();
|
||||
}
|
||||
|
||||
/* render the glow pass */
|
||||
if( m_pTempState->glow.a > 0.0001f )
|
||||
{
|
||||
DISPLAY->SetTextureMode( TextureUnit_1, TextureMode_Glow );
|
||||
|
||||
for( unsigned i=0; i<m_aVertices.size(); i++ )
|
||||
m_aVertices[i].c = m_pTempState->glow;
|
||||
DrawChars();
|
||||
}
|
||||
}
|
||||
|
||||
void ColorBitmapText::SetMaxLines( int iNumLines, int iDirection )
|
||||
{
|
||||
iNumLines = max( 0, iNumLines );
|
||||
iNumLines = min( (int)m_wTextLines.size(), iNumLines );
|
||||
if( iDirection == 0 )
|
||||
{
|
||||
// Crop all bottom lines
|
||||
m_wTextLines.resize( iNumLines );
|
||||
m_iLineWidths.resize( iNumLines );
|
||||
}
|
||||
else
|
||||
{
|
||||
// Because colors are relative to the beginning, we have to crop them back
|
||||
unsigned shift = 0;
|
||||
|
||||
for( unsigned i = 0; i < m_wTextLines.size() - iNumLines; i++ )
|
||||
shift += m_wTextLines[i].length();
|
||||
|
||||
|
||||
// When we're cutting out text, we need to maintain the last
|
||||
// color, so our text at the top doesn't become colorless.
|
||||
RageColor LastColor;
|
||||
|
||||
for( unsigned i = 0; i < m_vColors.size(); i++ )
|
||||
{
|
||||
m_vColors[i].l -= shift;
|
||||
if( m_vColors[i].l < 0 )
|
||||
{
|
||||
LastColor = m_vColors[i].c;
|
||||
m_vColors.erase( m_vColors.begin() + i );
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
// If we already have a color set for the first char
|
||||
// do not override it.
|
||||
if( m_vColors.size() > 0 && m_vColors[0].l > 0 )
|
||||
{
|
||||
ColorChange tmp;
|
||||
tmp.c = LastColor;
|
||||
tmp.l = 0;
|
||||
m_vColors.insert( m_vColors.begin(), tmp );
|
||||
}
|
||||
|
||||
m_wTextLines.erase( m_wTextLines.begin(), m_wTextLines.end() - iNumLines );
|
||||
m_iLineWidths.erase( m_iLineWidths.begin(), m_iLineWidths.end() - iNumLines );
|
||||
}
|
||||
BuildChars();
|
||||
}
|
||||
|
||||
|
||||
void UtilSetQuadInit( Actor& actor, const RString &sClassName )
|
||||
{
|
||||
ActorUtil::LoadAllCommandsAndSetXYAndOnCommand( actor, sClassName );
|
||||
|
||||
Reference in New Issue
Block a user