void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle ) { // Context needs to be saved before any transformations m_gal->Save(); m_gal->Translate( aPosition ); m_gal->Rotate( -aRotationAngle ); // Single line height int lineHeight = getInterline(); // The overall height of all lines of text double textBlockHeight = lineHeight * ( linesCount( aText ) - 1 ); switch( m_verticalJustify ) { case GR_TEXT_VJUSTIFY_CENTER: m_gal->Translate( VECTOR2D( 0, -textBlockHeight / 2.0 ) ); break; case GR_TEXT_VJUSTIFY_BOTTOM: m_gal->Translate( VECTOR2D( 0, -textBlockHeight ) ); break; case GR_TEXT_VJUSTIFY_TOP: break; default: break; } m_gal->SetIsStroke( true ); m_gal->SetIsFill( false ); if( m_bold ) m_gal->SetLineWidth( m_gal->GetLineWidth() * BOLD_FACTOR ); // Split multiline strings into separate ones and draw them line by line size_t begin = 0; size_t newlinePos = aText.find( '\n' ); while( newlinePos != aText.npos ) { size_t length = newlinePos - begin; drawSingleLineText( aText.substr( begin, length ) ); m_gal->Translate( VECTOR2D( 0.0, lineHeight ) ); begin = newlinePos + 1; newlinePos = aText.find( '\n', begin ); } // Draw the last (or the only one) line if( !aText.empty() ) drawSingleLineText( aText.substr( begin ) ); m_gal->Restore(); }
void STROKE_FONT::Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle ) { if( aText.empty() ) return; // Context needs to be saved before any transformations m_gal->Save(); m_gal->Translate( aPosition ); m_gal->Rotate( -aRotationAngle ); // Single line height int lineHeight = getInterline( ); int lineCount = linesCount( aText ); const VECTOR2D& glyphSize = m_gal->GetGlyphSize(); // align the 1st line of text switch( m_gal->GetVerticalJustify() ) { case GR_TEXT_VJUSTIFY_TOP: m_gal->Translate( VECTOR2D( 0, glyphSize.y ) ); break; case GR_TEXT_VJUSTIFY_CENTER: m_gal->Translate( VECTOR2D( 0, glyphSize.y / 2.0 ) ); break; case GR_TEXT_VJUSTIFY_BOTTOM: break; default: break; } if( lineCount > 1 ) { switch( m_gal->GetVerticalJustify() ) { case GR_TEXT_VJUSTIFY_TOP: break; case GR_TEXT_VJUSTIFY_CENTER: m_gal->Translate( VECTOR2D(0, -( lineCount - 1 ) * lineHeight / 2) ); break; case GR_TEXT_VJUSTIFY_BOTTOM: m_gal->Translate( VECTOR2D(0, -( lineCount - 1 ) * lineHeight ) ); break; } } m_gal->SetIsStroke( true ); //m_gal->SetIsFill( false ); if( m_gal->IsFontBold() ) m_gal->SetLineWidth( m_gal->GetLineWidth() * BOLD_FACTOR ); // Split multiline strings into separate ones and draw them line by line size_t begin = 0; size_t newlinePos = aText.find( '\n' ); while( newlinePos != aText.npos ) { size_t length = newlinePos - begin; drawSingleLineText( aText.substr( begin, length ) ); m_gal->Translate( VECTOR2D( 0.0, lineHeight ) ); begin = newlinePos + 1; newlinePos = aText.find( '\n', begin ); } // Draw the last (or the only one) line if( !aText.empty() ) drawSingleLineText( aText.substr( begin ) ); m_gal->Restore(); }