Commit 48f9ea22 authored by jean-pierre charras's avatar jean-pierre charras
Browse files

eeschema, Pcbnew: fix Bug #1255822 (incorrect position of multiline texts when plotting them)

parent a105a1ea
Loading
Loading
Loading
Loading
+49 −36
Original line number Diff line number Diff line
@@ -265,8 +265,38 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
{
    if( m_MultilineAllowed )
    {
        std::vector<wxPoint> positions;
        wxArrayString* list = wxStringSplit( m_Text, '\n' );
        positions.reserve( list->Count() );

        GetPositionsOfLinesOfMultilineText(positions, list->Count() );

        for( unsigned ii = 0; ii < list->Count(); ii++ )
        {
            wxString& txt = list->Item( ii );
            drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
                               aDrawMode, aFillMode, txt, positions[ii] );
        }

        delete (list);
    }
    else
        drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
                           aDrawMode, aFillMode, m_Text, m_Pos );

    // Draw text anchor, if requested
    if( aAnchor_color != UNSPECIFIED_COLOR )
    {
        GRDrawAnchor( aClipBox, aDC,
                      m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
                      DIM_ANCRE_TEXTE, aAnchor_color );
    }
}


void EDA_TEXT::GetPositionsOfLinesOfMultilineText(
        std::vector<wxPoint>& aPositions, int aLineCount )
{
    wxPoint        pos  = m_Pos;  // Position of first line of the
                                  // multiline text according to
                                  // the center of the multiline text block
@@ -276,7 +306,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
    offset.y = GetInterline();

#ifdef FIX_MULTILINE_VERT_JUSTIF
        if( list->Count() > 1 )
    if( aLineCount > 1 )
    {
        switch( m_VJustify )
        {
@@ -284,11 +314,11 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
            break;

        case GR_TEXT_VJUSTIFY_CENTER:
                pos.y -= ( list->Count() - 1 ) * offset.y / 2;
            pos.y -= ( aLineCount - 1 ) * offset.y / 2;
            break;

        case GR_TEXT_VJUSTIFY_BOTTOM:
                pos.y -= ( list->Count() - 1 ) * offset.y;
            pos.y -= ( aLineCount - 1 ) * offset.y;
            break;
        }
    }
@@ -300,29 +330,12 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
    // Rotate the offset lines to increase happened in the right direction
    RotatePoint( &offset, m_Orient );

        for( unsigned i = 0; i<list->Count(); i++ )
    for( int ii = 0; ii < aLineCount; ii++ )
    {
            wxString txt = list->Item( i );
            drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
                               aDrawMode, aFillMode, txt, pos );
        aPositions.push_back( pos );
        pos += offset;
    }

        delete (list);
}
    else
        drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
                           aDrawMode, aFillMode, m_Text, m_Pos );

    // Draw text anchor, if requested
    if( aAnchor_color != UNSPECIFIED_COLOR )
    {
        GRDrawAnchor( aClipBox, aDC,
                      m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
                      DIM_ANCRE_TEXTE, aAnchor_color );
    }
}


void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC,
                                  const wxPoint& aOffset, EDA_COLOR_T aColor,
+6 −9
Original line number Diff line number Diff line
@@ -673,20 +673,17 @@ void SCH_TEXT::Plot( PLOTTER* aPlotter )

    if( m_MultilineAllowed )
    {
        wxPoint        pos  = textpos;
        std::vector<wxPoint> positions;
        wxArrayString* list = wxStringSplit( m_Text, '\n' );
        wxPoint        offset;
        positions.reserve( list->Count() );

        offset.y = GetInterline();
        GetPositionsOfLinesOfMultilineText(positions, list->Count() );

        RotatePoint( &offset, m_Orient );

        for( unsigned i = 0; i<list->Count(); i++ )
        for( unsigned ii = 0; ii < list->Count(); ii++ )
        {
            wxString txt = list->Item( i );
            aPlotter->Text( pos, color, txt, m_Orient, m_Size, m_HJustify,
            wxString& txt = list->Item( ii );
            aPlotter->Text( positions[ii], color, txt, m_Orient, m_Size, m_HJustify,
                            m_VJustify, thickness, m_Italic, m_Bold );
            pos += offset;
        }

        delete (list);
+11 −0
Original line number Diff line number Diff line
@@ -265,6 +265,17 @@ public:
    void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType )   { m_HJustify = aType; };
    void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType )    { m_VJustify = aType; };

    /**
     * Function GetPositionsOfLinesOfMultilineText
     * Populates aPositions with the position of each line of
     * a multiline text, according to the vertical justification and the
     * rotation of the whole text
     * @param aPositions is the list to populate by the wxPoint positions
     * @param aLineCount is the number of lines (not recalculated here
     * for efficiency reasons
     */
    void GetPositionsOfLinesOfMultilineText(
                std::vector<wxPoint>& aPositions, int aLineCount );
    /**
     * Function Format
     * outputs the object to \a aFormatter in s-expression form.
+6 −8
Original line number Diff line number Diff line
@@ -477,20 +477,18 @@ void BRDITEMS_PLOTTER::PlotTextePcb( TEXTE_PCB* pt_texte )

    if( pt_texte->IsMultilineAllowed() )
    {
        std::vector<wxPoint> positions;
        wxArrayString* list = wxStringSplit( pt_texte->GetText(), '\n' );
        wxPoint        offset;
        positions.reserve( list->Count() );

        offset.y = pt_texte->GetInterline();
        pt_texte->GetPositionsOfLinesOfMultilineText( positions, list->Count() );

        RotatePoint( &offset, orient );

        for( unsigned i = 0; i < list->Count(); i++ )
        for( unsigned ii = 0; ii < list->Count(); ii++ )
        {
            wxString txt = list->Item( i );
            m_plotter->Text( pos, UNSPECIFIED_COLOR, txt, orient, size,
            wxString& txt = list->Item( ii );
            m_plotter->Text( positions[ii], UNSPECIFIED_COLOR, txt, orient, size,
                             pt_texte->GetHorizJustify(), pt_texte->GetVertJustify(),
                             thickness, pt_texte->IsItalic(), allow_bold );
            pos += offset;
        }

        delete list;