Replace STROKE_FONT performance fix, this time with correct type.

Also this time with a fixed Cairo implementation and an implemented
BASIC_GAL implementation.

Fixes https://gitlab.com/kicad/code/kicad/issues/6447
This commit is contained in:
Jeff Young
2020-11-20 11:24:52 +00:00
parent e5daac97c2
commit 0a7ef25453
4 changed files with 57 additions and 28 deletions
+45 -24
View File
@@ -44,6 +44,7 @@ KIGFX::GAL_DISPLAY_OPTIONS basic_displayOptions;
// the basic GAL doesn't get an external display option object
BASIC_GAL basic_gal( basic_displayOptions );
const VECTOR2D BASIC_GAL::transform( const VECTOR2D& aPoint ) const
{
VECTOR2D point = aPoint + m_transform.m_moveOffset - m_transform.m_rotCenter;
@@ -51,57 +52,77 @@ const VECTOR2D BASIC_GAL::transform( const VECTOR2D& aPoint ) const
return point;
}
void BASIC_GAL::DrawPolyline( const std::deque<VECTOR2D>& aPointList )
// Draws a polyline given a list of points already transformed into the local coordinate
// system.
void BASIC_GAL::doDrawPolyline( const std::vector<wxPoint>& aLocalPointList )
{
if( aPointList.empty() )
return;
std::deque<VECTOR2D>::const_iterator it = aPointList.begin();
std::vector <wxPoint> polyline_corners;
for( ; it != aPointList.end(); ++it )
{
VECTOR2D corner = transform(*it);
polyline_corners.emplace_back( corner.x, corner.y );
}
if( m_DC )
{
if( isFillEnabled )
{
GRPoly( m_isClipped ? &m_clipBox : NULL, m_DC, polyline_corners.size(),
&polyline_corners[0], 0, GetLineWidth(), m_Color, m_Color );
GRPoly( m_isClipped ? &m_clipBox : NULL, m_DC, aLocalPointList.size(),
&aLocalPointList[0], 0, GetLineWidth(), m_Color, m_Color );
}
else
{
for( unsigned ii = 1; ii < polyline_corners.size(); ++ii )
for( unsigned ii = 1; ii < aLocalPointList.size(); ++ii )
{
GRCSegm( m_isClipped ? &m_clipBox : NULL, m_DC, polyline_corners[ii-1],
polyline_corners[ii], GetLineWidth(), m_Color );
GRCSegm( m_isClipped ? &m_clipBox : NULL, m_DC, aLocalPointList[ ii - 1],
aLocalPointList[ii], GetLineWidth(), m_Color );
}
}
}
else if( m_plotter )
{
m_plotter->MoveTo( polyline_corners[0] );
m_plotter->MoveTo( aLocalPointList[0] );
for( unsigned ii = 1; ii < polyline_corners.size(); ii++ )
for( unsigned ii = 1; ii < aLocalPointList.size(); ii++ )
{
m_plotter->LineTo( polyline_corners[ii] );
m_plotter->LineTo( aLocalPointList[ii] );
}
m_plotter->PenFinish();
}
else if( m_callback )
{
for( unsigned ii = 1; ii < polyline_corners.size(); ii++ )
for( unsigned ii = 1; ii < aLocalPointList.size(); ii++ )
{
m_callback( polyline_corners[ii-1].x, polyline_corners[ii-1].y,
polyline_corners[ii].x, polyline_corners[ii].y, m_callbackData );
m_callback( aLocalPointList[ ii - 1].x, aLocalPointList[ ii - 1].y,
aLocalPointList[ii].x, aLocalPointList[ii].y, m_callbackData );
}
}
}
void BASIC_GAL::DrawPolyline( const std::deque<VECTOR2D>& aPointList )
{
if( aPointList.size() < 2 )
return;
std::vector<wxPoint> polyline_corners;
for( const VECTOR2D& pt : aPointList )
polyline_corners.emplace_back( (wxPoint) transform( pt ) );
doDrawPolyline( polyline_corners );
}
void BASIC_GAL::DrawPolyline( const VECTOR2D aPointList[], int aListSize )
{
if( aListSize < 2 )
return;
std::vector<wxPoint> polyline_corners;
for( int ii = 0; ii < aListSize; ++ii )
polyline_corners.emplace_back( (wxPoint) transform( aPointList[ ii ] ) );
doDrawPolyline( polyline_corners );
}
void BASIC_GAL::DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint )
{
VECTOR2D startVector = transform( aStartPoint );