Loading common/gal/stroke_font.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ void STROKE_FONT::LoadAttributes( const EDA_TEXT* aText ) } BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) BOX2D STROKE_FONT::computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const { BOX2D boundingBox; Loading @@ -134,9 +134,9 @@ BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, 0 ) ); boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.y, 0 ) ); for( Glyph::iterator pointListIt = aGlyph.begin(); pointListIt != aGlyph.end(); ++pointListIt ) for( Glyph::const_iterator pointListIt = aGlyph.begin(); pointListIt != aGlyph.end(); ++pointListIt ) { for( std::deque<VECTOR2D>::iterator pointIt = pointListIt->begin(); for( std::deque<VECTOR2D>::const_iterator pointIt = pointListIt->begin(); pointIt != pointListIt->end(); ++pointIt ) { boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, pointIt->y ) ); Loading @@ -149,11 +149,26 @@ BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) } void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationAngle ) void STROKE_FONT::Draw( std::string aText, const VECTOR2D& aPosition, double aRotationAngle ) { // Split multiline strings into separate ones and draw line by line size_t newlinePos = aText.find( '\n' ); if( newlinePos != std::string::npos ) { VECTOR2D nextlinePosition( aPosition ); nextlinePosition += VECTOR2D( 0.0, m_glyphSize.y * 1.6 ); // FIXME remove magic number Draw( aText.substr( newlinePos + 1 ), nextlinePosition, aRotationAngle ); aText = aText.substr( 0, newlinePos ); } // Compute the text size VECTOR2D textsize = computeTextSize( aText ); // By default overbar is turned off m_overbar = false; // Context needs to be saved before any transformations m_gal->Save(); Loading Loading @@ -221,8 +236,14 @@ void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationA m_gal->SetLineWidth( m_gal->GetLineWidth() * 1.3 ); } for( std::string::iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) for( std::string::const_iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) { if( *chIt == '~' ) { m_overbar = !m_overbar; continue; } GlyphList::iterator glyphIt = m_glyphs.begin(); std::deque<BOX2D>::iterator bbIt = m_glyphBoundingBoxes.begin(); Loading Loading @@ -254,26 +275,34 @@ void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationA m_gal->DrawPolyline( pointListScaled ); } xOffset += m_scaleFactor * glyphSizeX * ( bbIt->GetEnd().x - bbIt->GetOrigin().x ); if( m_overbar ) { VECTOR2D startOverbar( xOffset, -textsize.y * 1.2 ); VECTOR2D endOverbar( xOffset + m_scaleFactor * glyphSizeX * bbIt->GetEnd().x, -textsize.y * 1.2 ); m_gal->DrawLine( startOverbar, endOverbar ); } xOffset += m_scaleFactor * glyphSizeX * bbIt->GetEnd().x; } m_gal->Restore(); } VECTOR2D STROKE_FONT::computeTextSize( std::string aText ) VECTOR2D STROKE_FONT::computeTextSize( const std::string& aText ) const { VECTOR2D result = VECTOR2D( 0.0, 0.0 ); VECTOR2D result = VECTOR2D( 0.0, m_glyphSize.y ); for( std::string::iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) for( std::string::const_iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) { std::deque<BOX2D>::iterator bbIt = m_glyphBoundingBoxes.begin(); if( *chIt == '~' ) continue; std::deque<BOX2D>::const_iterator bbIt = m_glyphBoundingBoxes.begin(); advance( bbIt, (int) ( *chIt ) - (int) ' ' ); result.x += m_scaleFactor * m_glyphSize.x * ( bbIt->GetEnd().x - bbIt->GetOrigin().x ); result.x += m_scaleFactor * m_glyphSize.x * bbIt->GetEnd().x; } result.y = m_glyphSize.y; return result; } include/gal/stroke_font.h +11 −12 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ public: * @param aPosition is the text position in world coordinates. * @param aRotationAngle is the text rotation angle. */ void Draw( std::string aText, VECTOR2D aPosition, double aRotationAngle ); void Draw( std::string aText, const VECTOR2D& aPosition, double aRotationAngle ); /** * @brief Set the scale factor of the font for the glyph size. Loading Loading @@ -154,14 +154,13 @@ public: private: GAL* m_gal; ///< Pointer to the GAL GlyphList m_glyphs; ///< Glyph list std::deque<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs double m_scaleFactor; ///< Scale factor for the glyph VECTOR2D m_glyphSize; ///< Size of the glyphs EDA_TEXT_HJUSTIFY_T m_horizontalJustify; ///< Horizontal justification EDA_TEXT_VJUSTIFY_T m_verticalJustify; ///< Vertical justification bool m_bold, m_italic, m_mirrored; ///< Properties of text bool m_bold, m_italic, m_mirrored, m_overbar; ///< Properties of text /** * @brief Compute the bounding box of a given glyph. Loading @@ -170,7 +169,7 @@ private: * @param aGlyphBoundingX is the x-component of the bounding box size. * @return is the complete bounding box size. */ BOX2D computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ); BOX2D computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const; /** * @brief Compute the size of a given text. Loading @@ -178,7 +177,7 @@ private: * @param aText is the text string. * @return is the text size. */ VECTOR2D computeTextSize( const std::string aText ); VECTOR2D computeTextSize( const std::string& aText ) const; }; } // namespace KiGfx Loading Loading
common/gal/stroke_font.cpp +43 −14 Original line number Diff line number Diff line Loading @@ -125,7 +125,7 @@ void STROKE_FONT::LoadAttributes( const EDA_TEXT* aText ) } BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) BOX2D STROKE_FONT::computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const { BOX2D boundingBox; Loading @@ -134,9 +134,9 @@ BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, 0 ) ); boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.y, 0 ) ); for( Glyph::iterator pointListIt = aGlyph.begin(); pointListIt != aGlyph.end(); ++pointListIt ) for( Glyph::const_iterator pointListIt = aGlyph.begin(); pointListIt != aGlyph.end(); ++pointListIt ) { for( std::deque<VECTOR2D>::iterator pointIt = pointListIt->begin(); for( std::deque<VECTOR2D>::const_iterator pointIt = pointListIt->begin(); pointIt != pointListIt->end(); ++pointIt ) { boundingPoints.push_back( VECTOR2D( aGlyphBoundingX.x, pointIt->y ) ); Loading @@ -149,11 +149,26 @@ BOX2D STROKE_FONT::computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ) } void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationAngle ) void STROKE_FONT::Draw( std::string aText, const VECTOR2D& aPosition, double aRotationAngle ) { // Split multiline strings into separate ones and draw line by line size_t newlinePos = aText.find( '\n' ); if( newlinePos != std::string::npos ) { VECTOR2D nextlinePosition( aPosition ); nextlinePosition += VECTOR2D( 0.0, m_glyphSize.y * 1.6 ); // FIXME remove magic number Draw( aText.substr( newlinePos + 1 ), nextlinePosition, aRotationAngle ); aText = aText.substr( 0, newlinePos ); } // Compute the text size VECTOR2D textsize = computeTextSize( aText ); // By default overbar is turned off m_overbar = false; // Context needs to be saved before any transformations m_gal->Save(); Loading Loading @@ -221,8 +236,14 @@ void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationA m_gal->SetLineWidth( m_gal->GetLineWidth() * 1.3 ); } for( std::string::iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) for( std::string::const_iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) { if( *chIt == '~' ) { m_overbar = !m_overbar; continue; } GlyphList::iterator glyphIt = m_glyphs.begin(); std::deque<BOX2D>::iterator bbIt = m_glyphBoundingBoxes.begin(); Loading Loading @@ -254,26 +275,34 @@ void STROKE_FONT::Draw( std::string aText, VECTOR2D aPosition, double aRotationA m_gal->DrawPolyline( pointListScaled ); } xOffset += m_scaleFactor * glyphSizeX * ( bbIt->GetEnd().x - bbIt->GetOrigin().x ); if( m_overbar ) { VECTOR2D startOverbar( xOffset, -textsize.y * 1.2 ); VECTOR2D endOverbar( xOffset + m_scaleFactor * glyphSizeX * bbIt->GetEnd().x, -textsize.y * 1.2 ); m_gal->DrawLine( startOverbar, endOverbar ); } xOffset += m_scaleFactor * glyphSizeX * bbIt->GetEnd().x; } m_gal->Restore(); } VECTOR2D STROKE_FONT::computeTextSize( std::string aText ) VECTOR2D STROKE_FONT::computeTextSize( const std::string& aText ) const { VECTOR2D result = VECTOR2D( 0.0, 0.0 ); VECTOR2D result = VECTOR2D( 0.0, m_glyphSize.y ); for( std::string::iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) for( std::string::const_iterator chIt = aText.begin(); chIt != aText.end(); chIt++ ) { std::deque<BOX2D>::iterator bbIt = m_glyphBoundingBoxes.begin(); if( *chIt == '~' ) continue; std::deque<BOX2D>::const_iterator bbIt = m_glyphBoundingBoxes.begin(); advance( bbIt, (int) ( *chIt ) - (int) ' ' ); result.x += m_scaleFactor * m_glyphSize.x * ( bbIt->GetEnd().x - bbIt->GetOrigin().x ); result.x += m_scaleFactor * m_glyphSize.x * bbIt->GetEnd().x; } result.y = m_glyphSize.y; return result; }
include/gal/stroke_font.h +11 −12 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ public: * @param aPosition is the text position in world coordinates. * @param aRotationAngle is the text rotation angle. */ void Draw( std::string aText, VECTOR2D aPosition, double aRotationAngle ); void Draw( std::string aText, const VECTOR2D& aPosition, double aRotationAngle ); /** * @brief Set the scale factor of the font for the glyph size. Loading Loading @@ -154,14 +154,13 @@ public: private: GAL* m_gal; ///< Pointer to the GAL GlyphList m_glyphs; ///< Glyph list std::deque<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs double m_scaleFactor; ///< Scale factor for the glyph VECTOR2D m_glyphSize; ///< Size of the glyphs EDA_TEXT_HJUSTIFY_T m_horizontalJustify; ///< Horizontal justification EDA_TEXT_VJUSTIFY_T m_verticalJustify; ///< Vertical justification bool m_bold, m_italic, m_mirrored; ///< Properties of text bool m_bold, m_italic, m_mirrored, m_overbar; ///< Properties of text /** * @brief Compute the bounding box of a given glyph. Loading @@ -170,7 +169,7 @@ private: * @param aGlyphBoundingX is the x-component of the bounding box size. * @return is the complete bounding box size. */ BOX2D computeBoundingBox( Glyph aGlyph, VECTOR2D aGlyphBoundingX ); BOX2D computeBoundingBox( const Glyph& aGlyph, const VECTOR2D& aGlyphBoundingX ) const; /** * @brief Compute the size of a given text. Loading @@ -178,7 +177,7 @@ private: * @param aText is the text string. * @return is the text size. */ VECTOR2D computeTextSize( const std::string aText ); VECTOR2D computeTextSize( const std::string& aText ) const; }; } // namespace KiGfx Loading