From 188ea1f59f9d7636e8e8738816cf50cb1c8de0fa Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 17 Apr 2013 12:30:21 +0200 Subject: [PATCH] More accurate rendering display of ZONE_CONTAINERs. --- pcbnew/pcb_painter.cpp | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 3effc25d75..17664e814f 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -495,33 +495,47 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer ) void PCB_PAINTER::draw( const ZONE_CONTAINER* aContainer ) { + std::vector polyPoints = aContainer->GetFilledPolysList(); + if( polyPoints.size() == 0 ) // Nothing to draw + return; + COLOR4D fillColor = getLayerColor( aContainer->GetLayer(), aContainer->GetNet() ); std::vector::iterator polyIterator; - std::vector polyPoints = aContainer->GetFilledPolysList(); std::deque corners; + VECTOR2D startPoint; + int fillMode = aContainer->GetFillMode(); - m_gal->SetLineCap( LINE_CAP_BUTT ); - m_gal->SetLineJoin( LINE_JOIN_ROUND ); m_gal->SetFillColor( fillColor ); m_gal->SetStrokeColor( fillColor ); - m_gal->SetIsFill( aContainer->IsFilled() ); + m_gal->SetIsFill( !fillMode ); m_gal->SetIsStroke( true ); m_gal->SetLineWidth( aContainer->GetThermalReliefCopperBridge() / 2.0 ); + m_gal->SetLineCap( LINE_CAP_ROUND ); + m_gal->SetLineJoin( LINE_JOIN_ROUND ); // FIXME implement hatch mode - for( polyIterator = polyPoints.begin(); polyIterator != polyPoints.end(); polyIterator++ ) + if( fillMode == 0 ) { - // Find out all of polygons and then draw them - if( !polyIterator->end_contour ) + startPoint = VECTOR2D( polyPoints.front() ); + for( polyIterator = polyPoints.begin(); polyIterator != polyPoints.end(); polyIterator++ ) { - corners.push_back( VECTOR2D( *polyIterator ) ); - } - else - { - m_gal->DrawPolygon( corners ); - m_gal->DrawPolyline( corners ); - corners.clear(); + // Find out all of polygons and then draw them + if( !polyIterator->end_contour ) + { + corners.push_back( VECTOR2D( *polyIterator ) ); + } + else + { + m_gal->DrawPolygon( corners ); + + // Closing point for polyline + corners.push_back( VECTOR2D( startPoint ) ); + m_gal->DrawPolyline( corners ); + startPoint = VECTOR2D( *( polyIterator + 1 ) ); + + corners.clear(); + } } } }