Split bitmap text drawing routine into smaller functions (GAL).
This commit is contained in:
parent
a3a9641ae2
commit
59fe8df269
|
@ -694,22 +694,9 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( !IsTextMirrored(), "No support for mirrored text using bitmap fonts." );
|
wxASSERT_MSG( !IsTextMirrored(), "No support for mirrored text using bitmap fonts." );
|
||||||
|
|
||||||
const float TEX_X = bitmap_font.width;
|
|
||||||
const float TEX_Y = bitmap_font.height;
|
|
||||||
|
|
||||||
const int length = aText.length();
|
|
||||||
double cur_x = 0.0;
|
|
||||||
|
|
||||||
// Compute text size, so it can be properly justified
|
// Compute text size, so it can be properly justified
|
||||||
VECTOR2D textSize( 0.0, 0.0 );
|
VECTOR2D textSize = computeBitmapTextSize( aText );
|
||||||
|
|
||||||
for( int i = 0; i < length; ++i )
|
|
||||||
{
|
|
||||||
const bitmap_glyph& glyph = bitmap_chars[aText[i]];
|
|
||||||
textSize.x += ( glyph.x_off + glyph.width );
|
|
||||||
textSize.y = std::max( (unsigned int)( textSize.y ), glyph.y_off * 2 + glyph.height );
|
|
||||||
}
|
|
||||||
|
|
||||||
const double SCALE = GetGlyphSize().y / textSize.y * 2.0;
|
const double SCALE = GetGlyphSize().y / textSize.y * 2.0;
|
||||||
|
|
||||||
Save();
|
Save();
|
||||||
|
@ -759,9 +746,9 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
|
||||||
* v2 v3
|
* v2 v3
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for( int i = 0; i < length; ++i )
|
for( unsigned int i = 0; i < aText.length(); ++i )
|
||||||
{
|
{
|
||||||
const unsigned long c = aText[i];
|
const unsigned int c = aText[i];
|
||||||
|
|
||||||
wxASSERT_MSG( c < bitmap_chars_count, wxT( "Missing character in bitmap font atlas." ) );
|
wxASSERT_MSG( c < bitmap_chars_count, wxT( "Missing character in bitmap font atlas." ) );
|
||||||
|
|
||||||
|
@ -770,38 +757,13 @@ void OPENGL_GAL::BitmapText( const wxString& aText, const VECTOR2D& aPosition,
|
||||||
|
|
||||||
wxASSERT_MSG( c != '\n' && c != '\r', wxT( "No support for multiline bitmap text yet" ) );
|
wxASSERT_MSG( c != '\n' && c != '\r', wxT( "No support for multiline bitmap text yet" ) );
|
||||||
|
|
||||||
const bitmap_glyph& glyph = bitmap_chars[aText[i]];
|
|
||||||
const float x = glyph.x;
|
|
||||||
const float y = glyph.y;
|
|
||||||
const float xoff = glyph.x_off;
|
|
||||||
const float yoff = glyph.y_off;
|
|
||||||
const float w = glyph.width;
|
|
||||||
const float h = glyph.height;
|
|
||||||
|
|
||||||
currentManager->Reserve( 6 );
|
|
||||||
|
|
||||||
cur_x += xoff / 2;
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, x / TEX_X, y / TEX_Y );
|
|
||||||
currentManager->Vertex( cur_x, yoff, 0 ); // v0
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, y / TEX_Y );
|
|
||||||
currentManager->Vertex( cur_x + w, yoff, 0 ); // v1
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, x / TEX_X, ( y + h ) / TEX_Y );
|
|
||||||
currentManager->Vertex( cur_x, yoff + h, 0 ); // v2
|
|
||||||
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, y / TEX_Y );
|
|
||||||
currentManager->Vertex( cur_x + w, yoff, 0 ); // v1
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, x / TEX_X, ( y + h ) / TEX_Y );
|
drawBitmapChar( c );
|
||||||
currentManager->Vertex( cur_x, yoff + h, 0 ); // v2
|
|
||||||
|
|
||||||
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, ( y + h ) / TEX_Y );
|
|
||||||
currentManager->Vertex( cur_x + w, yoff + h, 0 ); // v3
|
|
||||||
|
|
||||||
cur_x += w + xoff / 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Restore();
|
Restore();
|
||||||
|
@ -1182,6 +1144,61 @@ void OPENGL_GAL::drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRa
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void OPENGL_GAL::drawBitmapChar( const unsigned long aChar )
|
||||||
|
{
|
||||||
|
const float TEX_X = bitmap_font.width;
|
||||||
|
const float TEX_Y = bitmap_font.height;
|
||||||
|
|
||||||
|
const bitmap_glyph& glyph = bitmap_chars[aChar];
|
||||||
|
const float x = glyph.x;
|
||||||
|
const float y = glyph.y;
|
||||||
|
const float xoff = glyph.x_off;
|
||||||
|
const float yoff = glyph.y_off;
|
||||||
|
const float w = glyph.width;
|
||||||
|
const float h = glyph.height;
|
||||||
|
|
||||||
|
currentManager->Reserve( 6 );
|
||||||
|
|
||||||
|
Translate( VECTOR2D( xoff / 2, 0 ) );
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, x / TEX_X, y / TEX_Y );
|
||||||
|
currentManager->Vertex( 0, yoff, 0 ); // v0
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, y / TEX_Y );
|
||||||
|
currentManager->Vertex( w, yoff, 0 ); // v1
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, x / TEX_X, ( y + h ) / TEX_Y );
|
||||||
|
currentManager->Vertex( 0, yoff + h, 0 ); // v2
|
||||||
|
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, y / TEX_Y );
|
||||||
|
currentManager->Vertex( w, yoff, 0 ); // v1
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, x / TEX_X, ( y + h ) / TEX_Y );
|
||||||
|
currentManager->Vertex( 0, yoff + h, 0 ); // v2
|
||||||
|
|
||||||
|
currentManager->Shader( SHADER_FONT, ( x + w ) / TEX_X, ( y + h ) / TEX_Y );
|
||||||
|
currentManager->Vertex( w, yoff + h, 0 ); // v3
|
||||||
|
|
||||||
|
Translate( VECTOR2D( w + xoff / 2, 0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VECTOR2D OPENGL_GAL::computeBitmapTextSize( const wxString& aText ) const
|
||||||
|
{
|
||||||
|
VECTOR2D textSize( 0, 0 );
|
||||||
|
|
||||||
|
for( unsigned int i = 0; i < aText.length(); ++i )
|
||||||
|
{
|
||||||
|
const bitmap_glyph& glyph = bitmap_chars[aText[i]];
|
||||||
|
textSize.x += ( glyph.x_off + glyph.width );
|
||||||
|
textSize.y = std::max( (unsigned int)( textSize.y ), glyph.y_off * 2 + glyph.height );
|
||||||
|
}
|
||||||
|
|
||||||
|
return textSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void OPENGL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
|
void OPENGL_GAL::onPaint( wxPaintEvent& WXUNUSED( aEvent ) )
|
||||||
{
|
{
|
||||||
PostPaint();
|
PostPaint();
|
||||||
|
|
|
@ -345,6 +345,22 @@ private:
|
||||||
*/
|
*/
|
||||||
void drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
|
void drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Draws a single character using bitmap font.
|
||||||
|
* Its main purpose is to be used in BitmapText() function.
|
||||||
|
*
|
||||||
|
* @param aCharacter is the character to be drawn.
|
||||||
|
*/
|
||||||
|
void drawBitmapChar( const unsigned long aChar );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Computes a size of text drawn using bitmap font with current text setting applied.
|
||||||
|
*
|
||||||
|
* @param aText is the text to be drawn.
|
||||||
|
* @return Text size expressed in world coordinates.
|
||||||
|
*/
|
||||||
|
VECTOR2D computeBitmapTextSize( const wxString& aText ) const;
|
||||||
|
|
||||||
// Event handling
|
// Event handling
|
||||||
/**
|
/**
|
||||||
* @brief This is the OnPaint event handler.
|
* @brief This is the OnPaint event handler.
|
||||||
|
|
Loading…
Reference in New Issue