Fix issue in cairo_gal when drawing a 360 deg arc (in fact a circle).

It was due to a angle normalization between -360 and 360 degrees.
So, in arcs, if the start angle and end angle diff is n*360 deg,
this normalization gives start angle = end angle.
The fix forces end angle = start angle+360deg in this case.

Fixes: lp:1832096
https://bugs.launchpad.net/kicad/+bug/1832096
This commit is contained in:
jean-pierre charras 2019-06-09 11:06:00 +02:00
parent b75017830f
commit 63eb552e0a
2 changed files with 21 additions and 11 deletions

View File

@ -146,8 +146,18 @@ void CAIRO_GAL_BASE::arc_angles_xform_and_normalize( double& aStartAngle, double
SWAP( startAngle, >, endAngle ); SWAP( startAngle, >, endAngle );
// now rotate arc according to the rotation transform matrix // now rotate arc according to the rotation transform matrix
// Remark:
// We call angle_xform() to calculate angles according to the flip/rotation
// transform and normatize between -2M_PI and +2M_PI.
// Therefore, if aStartAngle = aEndAngle + 2*n*M_PI, the transform gives
// aEndAngle = aStartAngle
// So, if this is the case, force the aEndAngle value to draw a circle.
aStartAngle = angle_xform( startAngle ); aStartAngle = angle_xform( startAngle );
aEndAngle = angle_xform( endAngle );
if( std::abs( aEndAngle - aStartAngle ) >= 2*M_PI ) // arc is a full circle
aEndAngle = aStartAngle + 2*M_PI;
else
aEndAngle = angle_xform( endAngle );
} }

View File

@ -2,7 +2,7 @@
* This program source code file is part of KiCad, a free EDA CAD application. * This program source code file is part of KiCad, a free EDA CAD application.
* *
* Copyright (C) 2017 Jon Evans <jon@craftyjon.com> * Copyright (C) 2017 Jon Evans <jon@craftyjon.com>
* Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors. * Copyright (C) 2019 KiCad Developers, see AUTHORS.txt for contributors.
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the * under the terms of the GNU General Public License as published by the
@ -315,21 +315,21 @@ void GERBVIEW_PAINTER::draw( /*const*/ GERBER_DRAW_ITEM* aItem, int aLayer )
if( startAngle > endAngle ) if( startAngle > endAngle )
endAngle += (2 * M_PI); endAngle += (2 * M_PI);
// 360-degree arcs are stored in the file with start equal to end // In Gerber, 360-degree arcs are stored in the file with start equal to end
if( arcStart == arcEnd ) if( arcStart == arcEnd )
{ {
startAngle = 0; endAngle = startAngle + 2*M_PI;
endAngle = 2 * M_PI;
} }
m_gal->DrawArcSegment( center, radius, startAngle, endAngle, width ); m_gal->DrawArcSegment( center, radius, startAngle, endAngle, width );
// Arc Debugging #if 0 // Arc Debugging only
// m_gal->SetLineWidth( 5 ); m_gal->SetLineWidth( 5 );
// m_gal->SetStrokeColor( COLOR4D( 0.0, 1.0, 0.0, 1.0 ) ); m_gal->SetStrokeColor( COLOR4D( 0.0, 1.0, 0.0, 1.0 ) );
// m_gal->DrawLine( center, aItem->GetABPosition( arcStart ) ); m_gal->DrawLine( center, aItem->GetABPosition( arcStart ) );
// m_gal->SetStrokeColor( COLOR4D( 1.0, 0.0, 0.0, 1.0 ) ); m_gal->SetStrokeColor( COLOR4D( 1.0, 0.0, 0.0, 1.0 ) );
// m_gal->DrawLine( center, aItem->GetABPosition( arcEnd ) ); m_gal->DrawLine( center, aItem->GetABPosition( arcEnd ) );
#endif
break; break;
} }