118    draw( item, aLayer, 
false );
 
 
  127#ifdef CONNECTIVITY_DEBUG 
  129    auto sch_item = 
dynamic_cast<const SCH_ITEM*
>( aItem );
 
  130    auto conn = sch_item ? sch_item->
Connection( *g_CurrentSheet ) : 
nullptr;
 
  135        auto label = conn->Name( 
true );
 
  140        m_gal->SetLineWidth( Mils2ui( 2 ) );
 
  141        m_gal->SetGlyphSize( 
VECTOR2D( Mils2ui( 20 ), Mils2ui( 20 ) ) );
 
  142        m_gal->StrokeText( *
m_gal, conn->Name( 
true ), pos, 0.0, 0 );
 
  150    switch( aItem->
Type() )
 
  156        drawBoundingBox = 
false;
 
  157        draw( 
static_cast<const SCH_PIN*
>( aItem ), aLayer, aDimmed  );
 
  169        draw( 
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
 
  172        draw( 
static_cast<const SCH_SHAPE*
>( aItem ), aLayer, aDimmed );
 
  175        draw( 
static_cast<const SCH_TEXT*
>( aItem ), aLayer, aDimmed );
 
  181        draw( 
static_cast<const SCH_TABLE*
>( aItem ), aLayer, aDimmed );
 
  184        draw( 
static_cast<const SCH_LABEL*
>( aItem ), aLayer, aDimmed );
 
  190        draw( 
static_cast<const SCH_FIELD*
>( aItem ), aLayer, aDimmed );
 
  226    if( drawBoundingBox )
 
 
  242        box = 
static_cast<const SCH_SYMBOL*
>( aItem )->GetBodyBoundingBox();
 
  244    m_gal->SetIsFill( 
false );
 
  245    m_gal->SetIsStroke( 
true );
 
  247                                              : 
COLOR4D( 0.2, 0.2, 0.2, 1 ) );
 
 
  299    return (
float) std::fabs( matrix.
GetScale().
x * milsWidth ) + 
schIUScale.MilsToIU( milsWidth );
 
 
  304                                     bool aDimmed, 
bool aIgnoreNets )
 const 
  306    auto isBackgroundLayer =
 
  323            color = 
static_cast<const SCH_LINE*
>( aItem )->GetLineColor();
 
  337            if( isBackgroundLayer( aLayer ) )
 
  346            if( isBackgroundLayer( aLayer ) )
 
  369                    wxFAIL_MSG( wxT( 
"Unsupported fill type" ) );
 
  378                    else if( isSymbolChild )
 
  389        else if( aItem->
IsType( { SCH_LABEL_LOCATE_ANY_T } ) )
 
  395            else if( aIgnoreNets )
 
  408            if( isBackgroundLayer( aLayer ) )
 
  413        else if( 
const EDA_TEXT* otherTextItem = 
dynamic_cast<const EDA_TEXT*
>( aItem ) )
 
  416                color = otherTextItem->GetTextColor();
 
  424        if( isBackgroundLayer( aLayer) )
 
  449        if( aDrawingShadows )
 
  456        else if( isBackgroundLayer( aLayer ) )
 
  461    else if( aItem->
IsSelected() && aDrawingShadows )
 
  465    else if( aItem->
IsSelected() && isBackgroundLayer( aLayer ) )
 
  478    if( aDimmed && !( aItem->
IsSelected() && aDrawingShadows ) )
 
 
  493                                 bool aDrawingWireColorHighlights )
 const 
  506    if( aDrawingWireColorHighlights )
 
  508        float              colorHighlightWidth = 
schIUScale.MilsToIU( 15.0 );
 
  517        width += colorHighlightWidth;
 
 
  528    switch( aItem->
Type() )
 
  531        pen = 
static_cast<const SCH_FIELD*
>( aItem )->GetEffectiveTextPenWidth( pen );
 
  535        pen = 
static_cast<const SCH_TEXT*
>( aItem )->GetEffectiveTextPenWidth( pen );
 
  543        pen = 
static_cast<const SCH_LABEL_BASE*
>( aItem )->GetEffectiveTextPenWidth( pen );
 
  548        pen = 
static_cast<const SCH_TEXTBOX*
>( aItem )->GetEffectiveTextPenWidth( pen );
 
 
  562    int screenTextSize = 
std::abs( (
int) 
m_gal->GetScreenWorldMatrix().GetScale().y * 7 );
 
  565    return KiROUND( ( docTextSize + screenTextSize * 2 ) / 3.0 );
 
 
  627    font->
Draw( &aGal, aText, aPosition, aAttrs, aFontMetrics );
 
 
  669    callback_gal.SetIsStroke( 
true );
 
  671    font->
Draw( &callback_gal, aText, aPosition, attrs, aFontMetrics );
 
 
  716    m_gal->DrawLine( a, b );
 
  717    m_gal->DrawLine( b, c );
 
 
  722                        int aBodyStyle, 
bool aDimmed )
 
  730    std::unique_ptr< LIB_SYMBOL > tmpSymbol;
 
  735        tmpSymbol = aSymbol->
Flatten();
 
  736        drawnSymbol = tmpSymbol.get();
 
  742            []( 
const SCH_ITEM& item, 
int layer )
 
  752        if( !childOnLayer( item, aLayer ) )
 
  761        draw( &item, aLayer, aDimmed );
 
 
  788                                            bool aDrawingShadows, 
bool aBrightened )
 
  800    m_gal->SetIsFill( 
false );
 
  801    m_gal->SetIsStroke( 
true );
 
  802    m_gal->SetLineWidth( lineWidth );
 
 
  811                                      const COLOR4D& aColor, 
bool aDrawingShadows,
 
  814    double lineWidth = aSize / 10.0;
 
  816    if( aDrawingShadows )
 
  819    std::vector<SCH_SHAPE> shapeList;
 
  822    m_gal->SetLineWidth( lineWidth );
 
  823    m_gal->SetIsStroke( 
true );
 
  824    m_gal->SetStrokeColor( aColor );
 
  825    m_gal->SetFillColor( aColor );
 
  827    for( 
const SCH_SHAPE& shape : shapeList )
 
  833            m_gal->DrawCurve( shape.GetStart(), shape.GetBezierC1(), shape.GetBezierC2(), shape.GetEnd() );
 
  835            m_gal->DrawCircle( shape.getCenter(), shape.GetRadius() );
 
 
  844                                 bool aRotate, 
int aExtraLineWidth, 
const COLOR4D& aColor )
 
  872    const double lineYOffset = aSize / 4;
 
  873    const double arrowHead = aSize / 8;
 
  889                       topLineREnd - 
VECTOR2D{ aSize * 0.7, 0 } );
 
  892    aGal.
DrawLine( topLineREnd, topLineREnd - 
VECTOR2D{ arrowHead * 1.2, arrowHead } );
 
  893    aGal.
DrawLine( topLineREnd, topLineREnd - 
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
 
  897    aGal.
DrawLine( btmLineREnd, btmLineREnd - 
VECTOR2D{ arrowHead * 1.2, arrowHead } );
 
  898    aGal.
DrawLine( btmLineREnd, btmLineREnd - 
VECTOR2D{ arrowHead * 1.2, -arrowHead } );
 
  907    aGal.
DrawArc( topLineREnd - 
VECTOR2D{ aSize - lineYOffset * 2, -lineYOffset },
 
 
  928    if( 
m_schSettings.IsPrinting() && ( drawingShadows || drawingDangling ) )
 
  960    if( drawingDangling )
 
  979        int             textOffset = 
KiROUND( textSize * 0.22 );
 
  986                mid.
x += 
KiROUND( textOffset * 1.2 );
 
  991                mid.
y -= 
KiROUND( textOffset * 1.2 );
 
 1012    m_gal->SetIsStroke( 
true );
 
 1013    m_gal->SetIsFill( 
false );
 
 1016    m_gal->SetFontBold( 
false );
 
 1017    m_gal->SetFontUnderlined( 
false );
 
 1018    m_gal->SetFontItalic( 
false );
 
 1021    const int diam = 
radius*2;
 
 1026        m_gal->DrawLine( p0, pos );
 
 1039            m_gal->DrawLine( p0, pos );
 
 1044            m_gal->DrawLine( p0 + dir * ( diam ), pos );
 
 1048            pc = p0 - dir * clock_size ;
 
 1052                     p0 + 
VECTOR2D( -dir.
y, dir.
x) * clock_size );
 
 1055            m_gal->DrawLine( p0 + dir * ( diam ), pos );
 
 1060            pc = p0 - dir * clock_size ;
 
 1064                     p0 + 
VECTOR2D( -dir.
y, dir.
x) * clock_size );
 
 1079            m_gal->DrawLine( p0, pos );
 
 1083            m_gal->DrawLine( p0, pos );
 
 1088                         p0 + 
VECTOR2D( -dir.
x * clock_size, 0 ),
 
 1094                         p0 + 
VECTOR2D( 0, -dir.
y * clock_size ),
 
 1100            m_gal->DrawLine( p0, pos );
 
 1117            m_gal->DrawLine( p0, pos );
 
 1126            m_gal->DrawLine( p0, pos );
 
 1136    if( drawingShadows && !
eeconfig()->m_Selection.draw_selected_children )
 
 1146    float shadowWidth = 0.0f;
 
 1148    if( drawingShadows )
 
 1158    const auto textRendersAsBitmap =
 
 1172    const auto drawBrace =
 
 1177                VECTOR2D mid = ( aTop + aBottom ) / 2.0;
 
 1195                    double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
 
 1196                    p2.
y += braceOffset / 2;
 
 1197                    p3.
y += braceOffset;
 
 1198                    p4.
y += braceOffset / 2;
 
 1203                    double braceOffset = aLeftBrace ? -aBraceWidth : aBraceWidth;
 
 1204                    p2.
x += braceOffset / 2;
 
 1205                    p3.
x += braceOffset;
 
 1206                    p4.
x += braceOffset / 2;
 
 1216    const auto drawBracesAroundText =
 
 1220                if( aLines.size() <= 1 )
 
 1224                int braceWidth = aAttrs.m_Size.x / 3;  
 
 1227                int maxLineWidth = 0;
 
 1232                for( 
const wxString& line : aLines )
 
 1234                    wxString trimmedLine = line;
 
 1235                    trimmedLine.Trim( 
true ).Trim( 
false );
 
 1237                                                                      aAttrs.m_StrokeWidth, 
false, 
false,
 
 1239                    maxLineWidth = std::max( maxLineWidth, lineExtents.
x );
 
 1247                int textHeight = aAttrs.m_Size.y;
 
 1248                int extraHeight = textHeight / 3;  
 
 1253                    braceEnd.
x += ( aLines.size() - 1 ) * aLineSpacing;
 
 1256                    braceStart.
x -= 2 * extraHeight;
 
 1259                    int braceSpacing = maxLineWidth / 2 + braceWidth;
 
 1261                    VECTOR2D topBraceStart = braceStart;
 
 1262                    topBraceStart.
y -= braceSpacing;
 
 1265                    topBraceEnd.
y -= braceSpacing;
 
 1267                    drawBrace( aGal, topBraceStart, topBraceEnd, braceWidth, 
true, aAttrs );
 
 1269                    VECTOR2D bottomBraceStart = braceStart;
 
 1270                    bottomBraceStart.
y += braceSpacing;
 
 1272                    VECTOR2D bottomBraceEnd = braceEnd;
 
 1273                    bottomBraceEnd.
y += braceSpacing;
 
 1275                    drawBrace( aGal, bottomBraceStart, bottomBraceEnd, braceWidth, 
false, aAttrs );
 
 1280                    braceEnd.
y += ( aLines.size() - 1 ) * aLineSpacing;
 
 1283                    braceStart.
y -= 2 * extraHeight;
 
 1286                    int braceSpacing = maxLineWidth / 2 + braceWidth;
 
 1290                    leftTop.
x -= braceSpacing;
 
 1293                    leftBottom.
x -= braceSpacing;
 
 1295                    drawBrace( aGal, leftTop, leftBottom, braceWidth, 
true, aAttrs );
 
 1299                    rightTop.
x += braceSpacing;
 
 1302                    rightBottom.
x += braceSpacing;
 
 1304                    drawBrace( aGal, rightTop, rightBottom, braceWidth, 
false, aAttrs );
 
 1308    const auto drawBracesAroundTextBitmap =
 
 1313                if( aLines.size() <= 1 )
 
 1316                int braceWidth = aAttrs.m_Size.x / 4;
 
 1319                int maxLineWidth = aAttrs.m_Size.x * 4;  
 
 1325                int textHalfHeight = aAttrs.m_Size.y / 2;
 
 1330                    braceEnd.
x += ( aLines.size() - 1 ) * aLineSpacing;
 
 1333                    leftStart.
y -= maxLineWidth / 2 + braceWidth / 2;
 
 1336                    leftEnd.
y -= maxLineWidth / 2 + braceWidth / 2;
 
 1338                    drawBrace( aGal, leftStart, leftEnd, braceWidth, 
true, aAttrs );
 
 1341                    rightStart.
y += maxLineWidth / 2 + braceWidth / 2;
 
 1344                    rightEnd.
y += maxLineWidth / 2 + braceWidth / 2;
 
 1346                    drawBrace( aGal, rightStart, rightEnd, braceWidth, 
false, aAttrs );
 
 1351                    braceEnd.
y += ( aLines.size() - 1 ) * aLineSpacing;
 
 1354                    braceTop.
y -= textHalfHeight;
 
 1357                    braceBottom.
y += textHalfHeight;
 
 1360                    leftTop.
x -= maxLineWidth / 2 + braceWidth / 2;
 
 1363                    leftBottom.
x -= maxLineWidth / 2 + braceWidth / 2;
 
 1365                    drawBrace( aGal, leftTop, leftBottom, braceWidth, 
true, aAttrs );
 
 1368                    rightTop.
x += maxLineWidth / 2 + braceWidth / 2;
 
 1370                    VECTOR2D rightBottom = braceBottom;
 
 1371                    rightBottom.
x += maxLineWidth / 2 + braceWidth / 2;
 
 1373                    drawBrace( aGal, rightTop, rightBottom, braceWidth, 
false, aAttrs );
 
 1378    const auto drawMultiLineText =
 
 1383                if( aText.StartsWith( 
"[" ) && aText.EndsWith( 
"]" ) && aText.Contains( 
"\n" ) )
 
 1386                    wxString content = aText.Mid( 1, aText.Length() - 2 );
 
 1387                    wxArrayString lines;
 
 1390                    if( lines.size() > 1 )
 
 1393                        int lineSpacing = 
KiROUND( aAttrs.m_Size.y * 1.3 );  
 
 1404                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1405                                startPos.
x -= totalWidth;
 
 1409                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1410                                startPos.
x -= totalWidth / 2;
 
 1414                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1417                                linePos.
x += i * lineSpacing;
 
 1419                                wxString line = lines[i];
 
 1420                                line.Trim( 
true ).Trim( 
false );
 
 1422                                strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
 
 1431                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1432                                startPos.
y -= totalHeight;
 
 1436                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1437                                startPos.
y -= totalHeight / 2;
 
 1441                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1444                                linePos.
y += i * lineSpacing;
 
 1446                                wxString line = lines[i];
 
 1447                                line.Trim( 
true ).Trim( 
false );
 
 1449                                strokeText( aGal, line, linePos, aAttrs, aFontMetrics );
 
 1454                        drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
 
 1460                strokeText( aGal, aText, aPosition, aAttrs, aFontMetrics );
 
 1463    const auto drawMultiLineTextBox =
 
 1468                if( aText.StartsWith( 
"[" ) && aText.EndsWith( 
"]" ) && aText.Contains( 
"\n" ) )
 
 1470                    wxString content = aText.Mid( 1, aText.Length() - 2 );
 
 1471                    wxArrayString lines;
 
 1474                    if( lines.size() > 1 )
 
 1476                        int lineSpacing = 
KiROUND( aAttrs.m_Size.y * 1.3 );
 
 1484                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1485                                startPos.
x -= totalWidth;
 
 1489                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1490                                startPos.
x -= totalWidth / 2;
 
 1493                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1496                                linePos.
x += i * lineSpacing;
 
 1498                                wxString line = lines[i];
 
 1499                                line.Trim( 
true ).Trim( 
false );
 
 1501                                boxText( aGal, line, linePos, aAttrs, aFontMetrics );
 
 1509                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1510                                startPos.
y -= totalHeight;
 
 1514                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1515                                startPos.
y -= totalHeight / 2;
 
 1518                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1521                                linePos.
y += i * lineSpacing;
 
 1523                                wxString line = lines[i];
 
 1524                                line.Trim( 
true ).Trim( 
false );
 
 1526                                boxText( aGal, line, linePos, aAttrs, aFontMetrics );
 
 1530                        drawBracesAroundText( aGal, lines, startPos, lineSpacing, aAttrs );
 
 1535                boxText( aGal, aText, aPosition, aAttrs, aFontMetrics );
 
 1538    const auto drawMultiLineBitmapText =
 
 1543                if( aText.StartsWith( 
"[" ) && aText.EndsWith( 
"]" ) && aText.Contains( 
"\n" ) )
 
 1545                    wxString content = aText.Mid( 1, aText.Length() - 2 );
 
 1546                    wxArrayString lines;
 
 1549                    if( lines.size() > 1 )
 
 1551                        int lineSpacing = 
KiROUND( aAttrs.m_Size.y * 1.3 );
 
 1559                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1560                                startPos.
x -= totalWidth;
 
 1564                                int totalWidth = ( lines.size() - 1 ) * lineSpacing;
 
 1565                                startPos.
x -= totalWidth / 2;
 
 1568                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1571                                linePos.
x += i * lineSpacing;
 
 1573                                wxString line = lines[i];
 
 1574                                line.Trim( 
true ).Trim( 
false );
 
 1584                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1585                                startPos.
y -= totalHeight;
 
 1589                                int totalHeight = ( lines.size() - 1 ) * lineSpacing;
 
 1590                                startPos.
y -= totalHeight / 2;
 
 1593                            for( 
size_t i = 0; i < lines.size(); i++ )
 
 1596                                linePos.
y += i * lineSpacing;
 
 1598                                wxString line = lines[i];
 
 1599                                line.Trim( 
true ).Trim( 
false );
 
 1606                        drawBracesAroundTextBitmap( aGal, lines, startPos, lineSpacing, aAttrs );
 
 1611                bitmapText( aGal, aText, aPosition, aAttrs );
 
 1614    const auto drawTextInfo =
 
 1618                const bool renderTextAsBitmap = textRendersAsBitmap( *
m_gal, aTextInfo.
m_TextSize );
 
 1621                m_gal->SetStrokeColor( aColor );
 
 1622                m_gal->SetFillColor( aColor );
 
 1632                if( drawingShadows )
 
 1647                else if( 
nonCached( aPin ) && renderTextAsBitmap )
 
 1660    const auto getColorForLayer =
 
 1661            [&]( 
int aDrawnLayer )
 
 1666                return getRenderColor( aPin, aDrawnLayer, drawingShadows, aDimmed );
 
 1671    if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> numInfo = cache.
GetPinNumberInfo( shadowWidth ) )
 
 1673        drawTextInfo( *numInfo, getColorForLayer( 
LAYER_PINNUM ) );
 
 1676    if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> nameInfo = cache.
GetPinNameInfo( shadowWidth ) )
 
 1678        drawTextInfo( *nameInfo, getColorForLayer( 
LAYER_PINNAM ) );
 
 1690    if( std::optional<PIN_LAYOUT_CACHE::TEXT_INFO> elecTypeInfo =
 
 
 1713    m_gal->SetIsStroke( 
true );
 
 
 1723                                         bool aDangling, 
bool aDrawingShadows, 
bool aBrightened )
 
 1739    m_gal->SetIsStroke( 
true );
 
 1740    m_gal->SetIsFill( 
false );
 
 
 1750    bool highlightNetclassColors = 
false;
 
 1768    if( highlightNetclassColors && aLayer == aJct->
GetLayer() )
 
 1775    if( junctionSize > 1 )
 
 1777        m_gal->SetIsStroke( drawingShadows );
 
 1780        m_gal->SetIsFill( !drawingShadows );
 
 
 1792    bool drawingBusses = aLayer == 
LAYER_BUS;
 
 1796    bool highlightNetclassColors = 
false;
 
 1797    double             highlightAlpha = 0.6;
 
 1799    double             hopOverScale = 0.0;
 
 1810    if( !highlightNetclassColors && drawingNetColorHighlights )
 
 1813    if( drawingNetColorHighlights && !( aLine->
IsWire() || aLine->
IsBus() ) )
 
 1816    if( 
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
 
 1827    if( aLine->
IsNew() && drawingDangling )
 
 1831    float      width = 
getLineWidth( aLine, drawingShadows, drawingNetColorHighlights );
 
 1834    if( highlightNetclassColors )
 
 1839        else if( drawingBusses )
 
 1843    if( drawingNetColorHighlights )
 
 1855    if( ( drawingDangling || drawingShadows ) && !aLine->
IsNew() )
 
 1884    if( drawingDangling )
 
 1891        int             textOffset = 
KiROUND( textSize * 0.22 );
 
 1896            pos.
y -= textOffset;
 
 1902            pos.
x += 
KiROUND( textOffset * 1.2 );
 
 1918    m_gal->SetIsStroke( 
true );
 
 1919    m_gal->SetIsFill( 
false );
 
 1921    m_gal->SetLineWidth( width );
 
 1923    std::vector<VECTOR3I> curr_wire_shape;
 
 1925    if( aLine->
IsWire() && hopOverScale > 0.0 )
 
 1927        double   lineWidth = 
getLineWidth( aLine, 
false, drawingNetColorHighlights );
 
 1928        double   arcRadius = lineWidth * hopOverScale;
 
 1937    for( 
size_t ii = 1; ii < curr_wire_shape.size(); ii++ )
 
 1939        VECTOR2I start( curr_wire_shape[ii-1].x, curr_wire_shape[ii-1].y );
 
 1941        if( curr_wire_shape[ii-1].z == 0 )  
 
 1944            VECTOR2I end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
 1951            VECTOR2I arc_middle( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
 1953            VECTOR2I arc_end( curr_wire_shape[ii].x, curr_wire_shape[ii].y );
 
 1965            EDA_ANGLE angle1 = midAngle - startAngle;
 
 1970            m_gal->DrawArc( 
center, ( dstart - 
center ).EuclideanNorm(), startAngle, angle );
 
 
 1998                switch( shape->GetShape() )
 
 2002                    VECTOR2D start = shape->GetStart();
 
 2011                    EDA_ANGLE angle1 = midAngle - startAngle;
 
 2016                    m_gal->DrawArc( 
center, ( start - 
center ).EuclideanNorm(), startAngle, angle );
 
 2021                    m_gal->DrawCircle( shape->GetPosition(), shape->GetRadius() );
 
 2025                    if( shape->GetCornerRadius() > 0 )
 
 2030                                                  shape->GetRectangleWidth(),
 
 2031                                                  shape->GetRectangleHeight() ),
 
 2032                                      shape->GetCornerRadius(), 
true  );
 
 2035                        m_gal->DrawPolygon( poly );
 
 2039                        m_gal->DrawRectangle( shape->GetPosition(), shape->GetEnd() );
 
 2045                    const std::vector<SHAPE*> polySegments = shape->MakeEffectiveShapes( 
true );
 
 2047                    if( !polySegments.empty() )
 
 2049                        std::deque<VECTOR2D> pts;
 
 2051                        for( 
SHAPE* polySegment : polySegments )
 
 2052                            pts.push_back( 
static_cast<SHAPE_SEGMENT*
>( polySegment )->GetSeg().
A );
 
 2056                        for( 
SHAPE* polySegment : polySegments )
 
 2059                        m_gal->DrawPolygon( pts );
 
 2066                    m_gal->DrawCurve( shape->GetStart(), shape->GetBezierC1(),
 
 2067                                      shape->GetBezierC2(), shape->GetEnd() );
 
 2078        if( 
eeconfig()->m_Selection.fill_shapes )
 
 2085                m_gal->SetIsFill( 
true );
 
 2091            m_gal->SetIsFill( 
false );
 
 2096        m_gal->SetIsStroke( 
true );
 
 2100        drawShape( aShape );
 
 2117            m_gal->SetIsFill( 
true );
 
 2118            m_gal->SetIsStroke( 
false );
 
 2128                m_gal->SetIsFill( 
true );
 
 2129                m_gal->SetIsStroke( 
false );
 
 2132                drawShape( aShape );
 
 2137            wxFAIL_MSG( wxT( 
"Unsupported fill type" ) );
 
 2146            m_gal->SetIsFill( 
true );
 
 2147            m_gal->SetIsStroke( 
false );
 
 2150            drawShape( aShape );
 
 2153        float lineWidth = 
getLineWidth( aShape, drawingShadows );
 
 2157            m_gal->SetIsFill( 
false );
 
 2158            m_gal->SetIsStroke( 
true );
 
 2159            m_gal->SetLineWidth( lineWidth );
 
 2164                drawShape( aShape );
 
 2170                for( 
SHAPE* shape : shapes )
 
 2177                                    m_gal->DrawLine( a+1, b );
 
 2179                                    m_gal->DrawLine( a, b );
 
 2183                for( 
SHAPE* shape : shapes )
 
 
 2207    switch( aText->
Type() )
 
 2228        if( conn && conn->
IsBus() )
 
 2257        int      adjust = 
KiROUND( sizeDiff * 0.35 );
 
 2258        VECTOR2I adjust_offset( 0, adjust );
 
 2261        text_offset += adjust_offset;
 
 2264    if( drawingShadows && font->
IsOutline() )
 
 2269        m_gal->SetIsStroke( 
false );
 
 2270        m_gal->SetIsFill( 
true );
 
 2282        double shadowOffset = 0.0;
 
 2284        if( drawingShadows )
 
 2289            const double adjust = 1.2f;      
 
 2290            shadowOffset = shadowWidth/2.0f * adjust;
 
 2304                pos.
y = bBox.
GetTop() - shadowOffset;
 
 2307                wxFAIL_MSG( wxT( 
"Indeterminate state legal only in dialogs." ) );
 
 2316                pos.
x = bBox.
GetLeft() - shadowOffset;
 
 2325                wxFAIL_MSG( wxT( 
"Indeterminate state legal only in dialogs." ) );
 
 2336    else if( drawingShadows )
 
 2338        m_gal->SetIsFill( 
false );
 
 2339        m_gal->SetIsStroke( 
true );
 
 2349            text_offset.
x -= fudge;
 
 2351            text_offset.
y -= fudge;
 
 2353            text_offset.
x += fudge;
 
 2355            text_offset.
y += fudge;
 
 2370                               && !shownText.Contains( wxT( 
"\n" ) ) )
 
 2377            std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache = 
nullptr;
 
 2385                m_gal->DrawGlyphs( *cache );
 
 2402        switch( aText->
Type() )
 
 2410            showAnchor = !
static_cast<const SCH_LABEL*
>( aText )->IsDangling();
 
 
 2455    float         borderWidth = 
getLineWidth( aTextBox, drawingShadows );
 
 2474                std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache = 
nullptr;
 
 2482                    m_gal->DrawGlyphs( *cache );
 
 2499        m_gal->SetIsFill( 
true );
 
 2500        m_gal->SetIsStroke( 
false );
 
 2501        m_gal->SetLineWidth( borderWidth );
 
 2512            m_gal->SetIsFill( 
true );
 
 2513            m_gal->SetIsStroke( 
false );
 
 2514            m_gal->SetLineWidth( borderWidth );
 
 2535            if( transparency > 0.0 )
 
 2536                borderColor = borderColor.
WithAlpha( borderColor.
a * ( 1.0 - transparency ) );
 
 2540                borderColor = borderColor.
Mix( bg, 0.5f );
 
 2544            m_gal->SetIsFill( 
false );
 
 2545            m_gal->SetIsStroke( 
true );
 
 2546            m_gal->SetStrokeColor( borderColor );
 
 2547            m_gal->SetLineWidth( borderWidth );
 
 2557                for( 
SHAPE* shape : shapes )
 
 2565                                    m_gal->DrawLine( a+1, b );
 
 2567                                    m_gal->DrawLine( a, b );
 
 2571                for( 
SHAPE* shape : shapes )
 
 
 2585        draw( cell, aLayer, aDimmed );
 
 2597                if( lineWidth == 0 )
 
 2606                m_gal->SetIsFill( 
false );
 
 2607                m_gal->SetIsStroke( 
true );
 
 2609                m_gal->SetLineWidth( (
float) lineWidth );
 
 2613                    m_gal->DrawLine( ptA, ptB );
 
 2623                                    m_gal->DrawLine( a+1, b );
 
 2625                                    m_gal->DrawLine( a, b );
 
 
 2635    std::function<bool( wxString* )> symbolResolver =
 
 2636            [&]( wxString* token ) -> 
bool 
 
 2652    std::optional<SCH_SHEET_PATH> optSheetPath;
 
 2658                   "SCH_PAINTER::draw symbol %s: Current sheet path='%s', size=%zu, empty=%d",
 
 2660                   optSheetPath->Path().AsString(),
 
 2661                   optSheetPath->size(),
 
 2662                   optSheetPath->empty() ? 1 : 0 );
 
 2665    bool DNP = aSymbol->
GetDNP( 
nullptr );
 
 2671    if( !drawingShadows || 
eeconfig()->m_Selection.draw_selected_children )
 
 2674            draw( &field, aLayer, DNP );
 
 2692    std::vector<SCH_PIN*> originalPins = originalSymbol->
GetGraphicalPins( unit, bodyStyle );
 
 2696    std::vector<SCH_PIN*> tempPins = tempSymbol.
GetGraphicalPins( unit, bodyStyle );
 
 2704        tempItem.SetFlags( aSymbol->
GetFlags() );     
 
 2724    for( 
unsigned i = 0; i < tempPins.size(); ++ i )
 
 2727        SCH_PIN* tempPin = tempPins[ i ];
 
 2747    for( 
unsigned i = 0; i < tempPins.size(); ++i )
 
 2750        SCH_PIN* tempPin = tempPins[ i ];
 
 2767                          std::max( bbox.
GetY() - pins.
GetY(),
 
 2771        margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
 
 2772        margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
 
 2779        m_gal->AdvanceDepth();
 
 2780        m_gal->SetIsStroke( 
true );
 
 2781        m_gal->SetIsFill( 
true );
 
 2782        m_gal->SetStrokeColor( marker_color );
 
 2783        m_gal->SetFillColor( marker_color );
 
 2785        m_gal->DrawSegment( pt1, pt2, strokeWidth );
 
 2786        std::swap( pt1.
x, pt2.
x );
 
 2787        m_gal->DrawSegment( pt1, pt2, strokeWidth );
 
 2799        m_gal->AdvanceDepth();
 
 2800        m_gal->SetIsStroke( 
true );
 
 2801        m_gal->SetIsFill( 
true );
 
 2802        m_gal->SetStrokeColor( marker_color );
 
 2803        m_gal->SetFillColor( marker_color );
 
 2810        int offset = 2 * strokeWidth;
 
 2819        m_gal->AdvanceDepth();
 
 2820        m_gal->SetFillColor( marker_color );
 
 
 2846    if( std::find( layers.begin(), layers.end(), aLayer ) == layers.end() )
 
 2866    if( shownText.IsEmpty() )
 
 2908    if( drawingShadows && 
getFont( aField )->IsOutline() )
 
 2910        BOX2I shadow_box = bbox;
 
 2913        m_gal->SetIsStroke( 
false );
 
 2914        m_gal->SetIsFill( 
true );
 
 2927        if( drawingShadows )
 
 2944            std::vector<std::unique_ptr<KIFONT::GLYPH>>* cache = 
nullptr;
 
 2947                cache = aField->
GetRenderCache( shownText, textpos, attributes );
 
 2952                m_gal->DrawGlyphs( *cache );
 
 
 3012    if( !drawingShadows || 
eeconfig()->m_Selection.draw_selected_children )
 
 3015            draw( &field, aLayer, 
false );
 
 3026    if( drawingDangling )
 
 3038    std::vector<VECTOR2I> pts;
 
 3039    std::deque<VECTOR2D> pts2;
 
 3044        pts2.emplace_back( 
VECTOR2D( p.x, p.y ) );
 
 3046    m_gal->SetIsStroke( 
true );
 
 3050    if( drawingShadows )
 
 3054        m_gal->DrawPolygon( pts2 );
 
 3058        m_gal->SetIsFill( 
false );
 
 3059        m_gal->DrawPolyline( pts2 );
 
 3062    draw( 
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, 
false );
 
 
 3075    if( !drawingShadows || 
eeconfig()->m_Selection.draw_selected_children )
 
 3078            draw( &field, aLayer, 
false );
 
 3089    if( drawingDangling )
 
 3101    draw( 
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, 
false );
 
 
 3114    if( !( drawingShadows || drawingDangling ) || 
eeconfig()->m_Selection.draw_selected_children )
 
 3117            draw( &field, aLayer, 
false );
 
 3128    if( drawingDangling )
 
 3140    std::vector<VECTOR2I> i_pts;
 
 3141    std::deque<VECTOR2D>  d_pts;
 
 3145    for( 
const VECTOR2I& i_pt : i_pts )
 
 3146        d_pts.emplace_back( 
VECTOR2D( i_pt.x, i_pt.y ) );
 
 3148    m_gal->SetIsFill( 
true );
 
 3150    m_gal->SetIsStroke( 
true );
 
 3153    m_gal->DrawPolyline( d_pts );
 
 3155    draw( 
static_cast<const SCH_TEXT*
>( aLabel ), aLayer, 
false );
 
 
 3169    if( !drawingShadows || 
eeconfig()->m_Selection.draw_selected_children )
 
 3172            draw( &field, aLayer, 
false );
 
 3195    std::vector<VECTOR2I> pts;
 
 3196    std::deque<VECTOR2D> pts2;
 
 3201        pts2.emplace_back( 
VECTOR2D( p.x, p.y ) );
 
 3203    m_gal->SetIsFill( 
false );
 
 3205    m_gal->SetIsStroke( 
true );
 
 3211        m_gal->DrawLine( pts2[0], pts2[1] );
 
 3212        m_gal->SetIsFill( 
true );
 
 3213        m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
 
 3217        m_gal->DrawLine( pts2[0], pts2[1] );
 
 3218        m_gal->DrawCircle( pts2[2], ( pts2[2] - pts2[1] ).EuclideanNorm() );
 
 3222        m_gal->DrawPolyline( pts2 );
 
 
 3230    bool DNP = aSheet->
GetDNP();
 
 3237    if( !drawingShadows || 
eeconfig()->m_Selection.draw_selected_children )
 
 3240            draw( &field, aLayer, DNP );
 
 3259            m_gal->SetIsFill( 
true );
 
 3260            m_gal->SetIsStroke( 
false );
 
 3262            m_gal->DrawRectangle( pos, pos + size );
 
 3269        m_gal->SetIsStroke( 
true );
 
 3271        m_gal->SetIsFill( 
false );
 
 3273        m_gal->DrawRectangle( pos, pos + size );
 
 3282                          std::max( bbox.
GetY() - pins.
GetY(),
 
 3286        margins.
x = std::max( margins.
x * 0.6, margins.
y * 0.3 );
 
 3287        margins.
y = std::max( margins.
y * 0.6, margins.
x * 0.3 );
 
 3294        m_gal->SetIsStroke( 
true );
 
 3295        m_gal->SetIsFill( 
true );
 
 3299        m_gal->DrawSegment( pt1, pt2, strokeWidth );
 
 3300        std::swap( pt1.
x, pt2.
x );
 
 3301        m_gal->DrawSegment( pt1, pt2, strokeWidth );
 
 3313        m_gal->AdvanceDepth();
 
 3314        m_gal->SetIsStroke( 
true );
 
 3315        m_gal->SetIsFill( 
true );
 
 3324        int offset = 2 * strokeWidth;
 
 3333        m_gal->AdvanceDepth();
 
 
 3350    m_gal->SetIsStroke( 
true );
 
 3353    m_gal->SetIsFill( 
false );
 
 
 3371    bool         drawingBusses = aLayer == 
LAYER_BUS;
 
 3376    bool highlightNetclassColors = 
false;
 
 3384    if( !highlightNetclassColors && drawingNetColorHighlights )
 
 3387    if( 
m_schSettings.m_OverrideItemColors && drawingNetColorHighlights )
 
 3415    if( highlightNetclassColors )
 
 3420        else if( drawingBusses )
 
 3424    if( drawingNetColorHighlights )
 
 3436    if( drawingDangling )
 
 3438        m_gal->SetIsFill( 
false );
 
 3439        m_gal->SetIsStroke( 
true );
 
 3440        m_gal->SetStrokeColor( 
color.Brightened( 0.3 ) );
 
 3460        draw( &line, aLayer );
 
 
 3476    if( img_scale != 1.0 )
 
 3489            m_gal->SetIsStroke( 
true );
 
 3492            m_gal->SetIsFill( 
false );
 
 3500            bm_size.
x /= img_scale;
 
 3501            bm_size.
y /= img_scale;
 
 3502            const VECTOR2D origin( -bm_size.
x / 2.0, -bm_size.
y / 2.0 );
 
 3505            m_gal->DrawRectangle( origin, 
end );
 
 
 3527    m_gal->SetIsFill( !drawingShadows );
 
 3529    m_gal->SetIsStroke( drawingShadows );
 
 3536    m_gal->DrawPolygon( polygon );
 
 
 3543    const bool drawingShadows = 
false;
 
 3572        m_gal->DrawLine( topLeft, topLeft + width );
 
 3573        m_gal->DrawLine( topLeft + width, topLeft + width + height );
 
 3574        m_gal->DrawLine( topLeft + width + height, topLeft + height );
 
 3575        m_gal->DrawLine( topLeft + height, topLeft );
 
 3579        if( 
name.IsEmpty() )
 
 3583        int scaledSize = abs( 
KiROUND( 
m_gal->GetScreenWorldMatrix().GetScale().x * ptSize ) );
 
 3584        int unscaledSize = 
schIUScale.MilsToIU( ptSize );
 
 3587        int      textSize = ( scaledSize + ( unscaledSize * 2 ) ) / 3;
 
 3593            m_gal->DrawLine( topLeft, topLeft - titleHeight );
 
 3594            m_gal->DrawLine( topLeft - titleHeight, topLeft + width - titleHeight );
 
 3595            m_gal->DrawLine( topLeft + width - titleHeight, topLeft + width );
 
 
 3612                            LINE_STYLE aLineStyle, 
bool aDrawDirectLine, 
int aWidth )
 
 3614    if( aDrawDirectLine )
 
 3616        m_gal->DrawLine( aStartPoint, aEndPoint );
 
 
constexpr EDA_IU_SCALE schIUScale
 
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
 
std::optional< BOX2I > OPT_BOX2I
 
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
 
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
 
constexpr const Vec & GetPosition() const
 
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
 
constexpr const Vec GetEnd() const
 
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
 
constexpr coord_type GetY() const
 
constexpr size_type GetWidth() const
 
constexpr Vec Centre() const
 
constexpr coord_type GetX() const
 
constexpr size_type GetHeight() const
 
constexpr coord_type GetLeft() const
 
constexpr void SetX(coord_type val)
 
constexpr const Vec & GetOrigin() const
 
constexpr void SetY(coord_type val)
 
const BOX2< Vec > GetBoundingBoxRotated(const VECTOR2I &aRotCenter, const EDA_ANGLE &aAngle) const
Useful to calculate bounding box of rotated items, when rotation is not cardinal.
 
constexpr coord_type GetRight() const
 
constexpr coord_type GetTop() const
 
constexpr void Offset(coord_type dx, coord_type dy)
 
constexpr coord_type GetBottom() const
 
Represent basic circle geometry with utility geometry functions.
 
VECTOR2I Center
Public to make access simpler.
 
int Radius
Public to make access simpler.
 
bool IsHorizontal() const
 
A base class for most all the KiCad significant classes used in schematics and boards.
 
virtual const BOX2I GetBoundingBox() const
Return the orthogonal bounding box of this object for display purposes.
 
void SetFlags(EDA_ITEM_FLAGS aMask)
 
KICAD_T Type() const
Returns the type of object.
 
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
 
EDA_ITEM * GetParent() const
 
bool HasFlag(EDA_ITEM_FLAGS aFlag) const
 
bool IsBrightened() const
 
bool IsForceVisible() const
 
EDA_ITEM_FLAGS GetFlags() const
 
const SHAPE_POLY_SET & GetHatching() const
 
FILL_T GetFillMode() const
 
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
 
COLOR4D GetFillColor() const
 
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
 
const VECTOR2I & GetTextPos() const
 
COLOR4D GetTextColor() const
 
const EDA_ANGLE & GetTextAngle() const
 
virtual const wxString & GetText() const
Return the string associated with the text object.
 
virtual bool IsVisible() const
 
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const KIFONT::FONT *aFont, const wxString &forResolvedText, const VECTOR2I &aOffset={ 0, 0 }) const
 
virtual EDA_ANGLE GetDrawRotation() const
 
virtual VECTOR2I GetDrawPos() const
 
BOX2I GetTextBox(const RENDER_SETTINGS *aSettings, int aLine=-1) const
Useful in multiline texts to calculate the full text or a line area (for zones filling,...
 
virtual KIFONT::FONT * GetDrawFont(const RENDER_SETTINGS *aSettings) const
 
bool HasTextVars() const
Indicates the ShownText has text var references which need to be processed.
 
const TEXT_ATTRIBUTES & GetAttributes() const
 
virtual void SetText(const wxString &aText)
 
VECTOR2I GetTextSize() const
 
APP_SETTINGS_BASE * KifaceSettings() const
 
FONT is an abstract base class for both outline and stroke fonts.
 
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=false)
 
virtual bool IsStroke() const
 
void Draw(KIGFX::GAL *aGal, const wxString &aText, const VECTOR2I &aPosition, const VECTOR2I &aCursor, const TEXT_ATTRIBUTES &aAttributes, const METRICS &aFontMetrics) const
Draw a string.
 
virtual bool IsOutline() const
 
VECTOR2I StringBoundaryLimits(const wxString &aText, const VECTOR2I &aSize, int aThickness, bool aBold, bool aItalic, const METRICS &aFontMetrics) const
Compute the boundary limits of aText (the bounding box of all shapes).
 
A color representation with 4 components: red, green, blue, alpha.
 
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
 
COLOR4D & Invert()
Makes the color inverted, alpha remains the same.
 
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
 
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
 
COLOR4D & Desaturate()
Removes color (in HSL model)
 
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
 
Attribute save/restore for GAL attributes.
 
Abstract interface for drawing on a 2D-surface.
 
virtual void DrawPolygon(const std::deque< VECTOR2D > &aPointList)
Draw a polygon.
 
virtual void SetIsFill(bool aIsFillEnabled)
Enable/disable fill.
 
virtual void Rotate(double aAngle)
Rotate the context.
 
virtual void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a rectangle.
 
void SetVerticalJustify(const GR_TEXT_V_ALIGN_T aVerticalJustify)
 
void SetHorizontalJustify(const GR_TEXT_H_ALIGN_T aHorizontalJustify)
 
virtual void SetFillColor(const COLOR4D &aColor)
Set the fill color.
 
virtual void Translate(const VECTOR2D &aTranslation)
Translate the context.
 
virtual void Restore()
Restore the context.
 
virtual void SetLineWidth(float aLineWidth)
Set the line width.
 
virtual void SetStrokeColor(const COLOR4D &aColor)
Set the stroke color.
 
virtual void SetIsStroke(bool aIsStrokeEnabled)
Enable/disable stroked outlines.
 
virtual void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint)
Draw a line.
 
void SetGlyphSize(const VECTOR2I aSize)
 
virtual void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle)
Draw an arc.
 
virtual void BitmapText(const wxString &aText, const VECTOR2I &aPosition, const EDA_ANGLE &aAngle)
Draw a text using a bitmap font.
 
virtual void Save()
Save the context.
 
double GetWorldScale() const
Get the world scale.
 
GAL * m_gal
Instance of graphic abstraction layer that gives an interface to call commands used to draw (eg.
 
PAINTER(GAL *aGal)
Initialize this object for painting on any of the polymorphic GRAPHICS_ABSTRACTION_LAYER* derivatives...
 
virtual bool Draw(const VIEW_ITEM *, int) override
Takes an instance of VIEW_ITEM and passes it to a function that knows how to draw the item.
 
void drawPinDanglingIndicator(const SCH_PIN &aPin, const COLOR4D &aColor, bool aDrawingShadows, bool aBrightened)
 
float getTextThickness(const SCH_ITEM *aItem) const
 
void drawLocalPowerIcon(const VECTOR2D &aPos, double aSize, bool aRotate, const COLOR4D &aColor, bool aDrawingShadows, bool aBrightened)
Draw an local power pin indicator icon.
 
float getShadowWidth(bool aForHighlight) const
 
COLOR4D getRenderColor(const SCH_ITEM *aItem, int aLayer, bool aDrawingShadows, bool aDimmed=false, bool aIgnoreNets=false) const
 
int externalPinDecoSize(const SCH_PIN &aPin)
 
KIFONT::FONT * getFont(const EDA_TEXT *aText) const
 
void draw(const EDA_ITEM *, int, bool aDimmed)
 
wxString expandLibItemTextVars(const wxString &aSourceText, const SCH_SYMBOL *aSymbolContext)
 
static std::vector< KICAD_T > g_ScaledSelectionTypes
 
void drawLine(const VECTOR2I &aStartPoint, const VECTOR2I &aEndPoint, LINE_STYLE aLineStyle, bool aDrawDirectLine=false, int aWidth=0)
 
int getOperatingPointTextSize() const
 
float getLineWidth(const SCH_ITEM *aItem, bool aDrawingShadows, bool aDrawingWireColorHighlights=false) const
 
void triLine(const VECTOR2D &a, const VECTOR2D &b, const VECTOR2D &c)
 
SCH_RENDER_SETTINGS m_schSettings
 
void drawAnchor(const VECTOR2I &aPos, bool aDrawingShadows)
Draw anchor indicating the anchor position of text objects, local labels, or fields.
 
bool nonCached(const EDA_ITEM *aItem)
Indicates the item is drawn on a non-cached layer in OpenGL.
 
void drawDanglingIndicator(const VECTOR2I &aPos, const COLOR4D &aColor, int aWidth, bool aDangling, bool aDrawingShadows, bool aBrightened)
Draw the target (an open square) for a wire or label which has no connection or is being moved.
 
void drawItemBoundingBox(const EDA_ITEM *aItem)
 
int internalPinDecoSize(const SCH_PIN &aPin)
 
bool isUnitAndConversionShown(const SCH_ITEM *aItem) const
 
An abstract base class for deriving all objects that can be added to a VIEW.
 
double GetForcedTransparency() const
 
wxString AsString() const
 
Define a library symbol object.
 
static LIB_SYMBOL * GetDummy()
Returns a dummy LIB_SYMBOL, used when one is missing in the schematic.
 
LIB_ITEMS_CONTAINER & GetDrawItems()
Return a reference to the draw item list.
 
std::vector< SCH_PIN * > GetGraphicalPins(int aUnit=0, int aBodyStyle=0) const
Graphical pins: Return schematic pin objects as drawn (unexpanded), filtered by unit/body.
 
std::unique_ptr< LIB_SYMBOL > Flatten() const
Return a flattened symbol inheritance to the caller.
 
void ShapeToPolygon(SHAPE_LINE_CHAIN &aPolygon, int aScale=-1) const
Return the shape polygon in internal units in a SHAPE_LINE_CHAIN the coordinates are relatives to the...
 
VECTOR2< T > GetScale() const
Get the scale components of the matrix.
 
A pin layout helper is a class that manages the layout of the parts of a pin on a schematic symbol:
 
OPT_BOX2I GetAltIconBBox()
Get the box of the alt mode icon, if there is one.
 
std::optional< TEXT_INFO > GetPinNameInfo(int aShadowWidth)
Get the text info for the pin name.
 
std::optional< TEXT_INFO > GetPinElectricalTypeInfo(int aShadowWidth)
 
CIRCLE GetDanglingIndicator() const
Gets the dangling indicator geometry for this pin, if the pin were to be dangling.
 
std::optional< TEXT_INFO > GetPinNumberInfo(int aShadowWidth)
 
void SetRenderParameters(int aNameThickness, int aNumberThickness, bool aShowElectricalType, bool aShowAltIcons)
 
A REFERENCE_IMAGE is a wrapper around a BITMAP_IMAGE that is displayed in an editor as a reference fo...
 
const BITMAP_BASE & GetImage() const
Get the underlying image.
 
double GetImageScale() const
 
A round rectangle shape, based on a rectangle and a radius.
 
void TransformToPolygon(SHAPE_POLY_SET &aBuffer, int aMaxError) const
Get the polygonal representation of the roundrect.
 
SCHEMATIC_SETTINGS & Settings() const
 
Object to handle a bitmap image that can be inserted in a schematic.
 
VECTOR2I GetPosition() const override
 
REFERENCE_IMAGE & GetReferenceImage()
 
Base class for a bus or wire entry.
 
bool IsStartDangling() const
 
VECTOR2I GetPosition() const override
 
bool IsEndDangling() const
 
virtual STROKE_PARAMS GetStroke() const override
 
int GetPenWidth() const override
 
LINE_STYLE GetEffectiveLineStyle() const
 
Class for a wire to bus entry.
 
Each graphical item can have a SCH_CONNECTION describing its logical connection (to a bus or net).
 
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
 
virtual bool IsDangling() const override
Determines dangling state from connectivity and cached connected rule areas.
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
VECTOR2I GetPosition() const override
 
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
 
std::vector< int > ViewGetLayers() const override
Return the all the layers within the VIEW the object is painted on.
 
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
std::vector< std::unique_ptr< KIFONT::GLYPH > > * GetRenderCache(const wxString &forResolvedText, const VECTOR2I &forPosition, TEXT_ATTRIBUTES &aAttrs) const
 
VECTOR2I GetParentPosition() const
 
void CreateGraphicShape(const RENDER_SETTINGS *aRenderSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
 
VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const override
This offset depends on the orientation, the type of text, and the area required to draw the associate...
 
A set of SCH_ITEMs (i.e., without duplicates).
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
 
Base class for any item which can be embedded within the SCHEMATIC container class,...
 
const SYMBOL * GetParentSymbol() const
 
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
 
std::vector< int > ViewGetLayers() const override
Return the layers the item is drawn on (which may be more than its "home" layer)
 
SCH_LAYER_ID GetLayer() const
Return the layer this item is on.
 
bool RenderAsBitmap(double aWorldScale) const override
 
bool IsConnectivityDirty() const
 
SCH_CONNECTION * Connection(const SCH_SHEET_PATH *aSheet=nullptr) const
Retrieve the connection associated with this object in the given sheet.
 
wxString GetClass() const override
Return the class name.
 
const KIFONT::METRICS & GetFontMetrics() const
 
int GetEffectivePenWidth(const SCH_RENDER_SETTINGS *aSettings) const
 
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
 
int GetEffectiveDiameter() const
 
VECTOR2I GetPosition() const override
 
bool IsDangling() const override
 
COLOR4D GetLabelColor() const
 
LABEL_FLAG_SHAPE GetShape() const
 
std::vector< SCH_FIELD > & GetFields()
 
Segment description base class to describe items which have 2 end points (track, wire,...
 
void SetStartPoint(const VECTOR2I &aPosition)
 
std::vector< VECTOR3I > BuildWireWithHopShape(const SCH_SCREEN *aScreen, double aArcRadius) const
For wires only: build the list of points to draw the shape using segments and 180 deg arcs Points are...
 
bool IsWire() const
Return true if the line is a wire.
 
bool IsStartDangling() const
 
void SetLineColor(const COLOR4D &aColor)
 
void SetLineWidth(const int aSize)
 
LINE_STYLE GetEffectiveLineStyle() const
 
VECTOR2I GetMidPoint() const
 
VECTOR2I GetEndPoint() const
 
VECTOR2I GetStartPoint() const
 
bool IsEndDangling() const
 
bool IsBus() const
Return true if the line is a bus.
 
void SetLineStyle(const LINE_STYLE aStyle)
 
virtual void SetStroke(const STROKE_PARAMS &aStroke) override
 
void SetEndPoint(const VECTOR2I &aPosition)
 
const wxString & GetOperatingPoint() const
 
SCH_LAYER_ID GetColorLayer() const
 
VECTOR2I GetPosition() const override
 
VECTOR2I GetPosition() const override
 
int GetNumberTextSize() const
 
const wxString & GetOperatingPoint() const
 
void SetName(const wxString &aName)
 
bool IsGlobalPower() const
Return whether this pin forms a global power connection: i.e., is part of a power symbol and of type ...
 
VECTOR2I GetPinRoot() const
 
bool IsDangling() const override
 
void SetShape(GRAPHIC_PINSHAPE aShape)
 
VECTOR2I GetPosition() const override
 
int GetNameTextSize() const
 
wxString GetShownName() const
 
PIN_LAYOUT_CACHE & GetLayoutCache() const
Get the layout cache associated with this pin.
 
void SetOperatingPoint(const wxString &aText)
 
void SetType(ELECTRICAL_PINTYPE aType)
 
GRAPHIC_PINSHAPE GetShape() const
 
ELECTRICAL_PINTYPE GetType() const
 
std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const override
Make a set of SHAPE objects representing the SCH_SHAPE.
 
LINE_STYLE GetEffectiveLineStyle() const
 
STROKE_PARAMS GetStroke() const override
 
VECTOR2I GetPosition() const override
 
Define a sheet pin (label) used in sheets to create hierarchical schematics.
 
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
 
std::vector< SCH_FIELD > & GetFields()
Return a reference to the vector holding the sheet's fields.
 
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
 
VECTOR2I GetPosition() const override
 
const BOX2I GetBodyBoundingBox() const
Return a bounding box for the sheet body but not the fields.
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
KIGFX::COLOR4D GetBorderColor() const
 
bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flags.
 
std::vector< SCH_SHEET_PIN * > & GetPins()
 
KIGFX::COLOR4D GetBackgroundColor() const
 
bool GetExcludedFromSim(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
 
BOX2I GetBodyAndPinsBoundingBox() const override
Return a bounding box for the symbol body and pins but not the fields.
 
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
 
VECTOR2I GetPosition() const override
 
bool ResolveTextVar(const SCH_SHEET_PATH *aPath, wxString *token, int aDepth=0) const
Resolve any references to system tokens supported by the symbol.
 
static void BuildLocalPowerIconShape(std::vector< SCH_SHAPE > &aShapeList, const VECTOR2D &aPos, double aSize, double aLineWidth, bool aHorizontal)
Build the local power pin indicator icon shape, at coordinate aPos.
 
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
 
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
 
int GetOrientation() const override
Get the display symbol orientation.
 
bool IsSymbolLikePowerLocalLabel() const
 
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
 
BOX2I GetBodyBoundingBox() const override
Return a bounding box for the symbol body but not the pins or fields.
 
virtual bool GetDNP(const SCH_SHEET_PATH *aInstance=nullptr, const wxString &aVariantName=wxEmptyString) const override
Set or clear the 'Do Not Populate' flag.
 
std::vector< SCH_TABLECELL * > GetCells() const
 
void DrawBorders(const std::function< void(const VECTOR2I &aPt1, const VECTOR2I &aPt2, const STROKE_PARAMS &aStroke)> &aCallback) const
 
virtual wxString GetShownText(const RENDER_SETTINGS *aSettings, const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
VECTOR2I GetDrawPos() const override
 
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
 
bool IsHypertext() const override
Allow items to support hypertext actions when hovered/clicked.
 
VECTOR2I GetPosition() const override
 
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
 
virtual wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const
 
virtual VECTOR2I GetSchematicTextOffset(const RENDER_SETTINGS *aSettings) const
This offset depends on the orientation, the type of text, and the area required to draw the associate...
 
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
 
Represent a set of closed polygons.
 
int AddOutline(const SHAPE_LINE_CHAIN &aOutline)
Adds a new outline to the set and returns its index.
 
void Fracture()
Convert a set of polygons with holes to a single outline with "slits"/"fractures" connecting the oute...
 
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
 
int NewOutline()
Creates a new empty polygon in the set and returns its index.
 
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
 
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
 
const SEG & GetSeg() const
 
An abstract shape on 2D plane.
 
Simple container to manage line stroke parameters.
 
LINE_STYLE GetLineStyle() const
 
KIGFX::COLOR4D GetColor() const
 
static void Stroke(const SHAPE *aShape, LINE_STYLE aLineStyle, int aWidth, const KIGFX::RENDER_SETTINGS *aRenderSettings, const std::function< void(const VECTOR2I &a, const VECTOR2I &b)> &aStroker)
 
const TRANSFORM & GetTransform() const
 
GR_TEXT_H_ALIGN_T m_Halign
 
GR_TEXT_V_ALIGN_T m_Valign
 
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
 
#define DANGLING_SYMBOL_SIZE
The size of the rectangle indicating an unconnected wire or label.
 
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
 
#define UNSELECTED_END_SIZE
The size of the rectangle indicating the anchor of a text object (including fields)
 
#define TEXT_ANCHOR_SIZE
The default pin len value when creating pins(can be changed in preference menu)
 
static constexpr EDA_ANGLE ANGLE_0
 
static constexpr EDA_ANGLE ANGLE_90
 
static constexpr EDA_ANGLE ANGLE_VERTICAL
 
static constexpr EDA_ANGLE ANGLE_HORIZONTAL
 
static constexpr EDA_ANGLE ANGLE_270
 
static constexpr EDA_ANGLE ANGLE_180
 
#define IS_SHOWN_AS_BITMAP
 
#define ENDPOINT
ends. (Used to support dragging.)
 
#define IS_DANGLING
indicates a pin is dangling
 
#define STARTPOINT
When a line is selected, these flags indicate which.
 
@ RECTANGLE
Use RECTANGLE instead of RECT to avoid collision in a Windows header.
 
@ FILLED_WITH_BG_BODYCOLOR
 
@ FILLED_SHAPE
Fill with object color.
 
int GetPenSizeForDemiBold(int aTextSize)
 
int GetPenSizeForNormal(int aTextSize)
 
int ClampTextPenSize(int aPenSize, int aSize, bool aStrict)
Pen width should not allow characters to become cluttered up in their own fatness.
 
const wxChar *const traceSchPainter
Flag to enable debug output of schematic painter operations.
 
@ LAYER_DRAW_BITMAPS
Draw images.
 
SCH_LAYER_ID
Eeschema drawing layers.
 
@ LAYER_SHAPES_BACKGROUND
 
@ LAYER_EXCLUDED_FROM_SIM
 
@ LAYER_NET_COLOR_HIGHLIGHT
 
@ LAYER_DEVICE_BACKGROUND
 
@ LAYER_SELECTION_SHADOWS
 
@ LAYER_SCHEMATIC_BACKGROUND
 
#define UNIMPLEMENTED_FOR(type)
 
MATRIX3x3< double > MATRIX3x3D
 
The Cairo implementation of the graphics abstraction layer.
 
static void boxText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
 
static void bitmapText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs)
 
EESCHEMA_SETTINGS * eeconfig()
 
static void strokeText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
 
static void knockoutText(KIGFX::GAL &aGal, const wxString &aText, const VECTOR2D &aPosition, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
 
static void drawAltPinModesIcon(GAL &aGal, const VECTOR2D &aPos, double aSize, bool aBaseSelected, bool aRotate, int aExtraLineWidth, const COLOR4D &aColor)
Draw an alternate pin mode indicator icon.
 
static bool isFieldsLayer(int aLayer)
 
static BOX2I GetTextExtents(const wxString &aText, const VECTOR2D &aPosition, KIFONT::FONT &aFont, const TEXT_ATTRIBUTES &aAttrs, const KIFONT::METRICS &aFontMetrics)
 
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
 
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
 
@ PT_NC
not connected (must be left open)
 
#define TARGET_BUSENTRY_RADIUS
 
Class to handle a set of SCH_ITEMs.
 
#define BITMAP_FONT_SIZE_THRESHOLD
 
#define TARGET_PIN_RADIUS
 
Utility functions for working with shapes.
 
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
 
int PrintableCharCount(const wxString &aString)
Return the number of printable (ie: non-formatting) chars.
 
LINE_STYLE
Dashed line types.
 
int highlight_netclass_colors_thickness
 
bool highlight_netclass_colors
 
double highlight_netclass_colors_alpha
 
GR_TEXT_H_ALIGN_T m_HAlign
 
GR_TEXT_V_ALIGN_T m_VAlign
 
@ VALUE
Field Value of part, i.e. "3.3K".
 
@ GR_TEXT_H_ALIGN_INDETERMINATE
 
@ GR_TEXT_V_ALIGN_INDETERMINATE
 
wxLogTrace helper definitions.
 
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
 
const VECTOR2I CalcArcCenter(const VECTOR2I &aStart, const VECTOR2I &aMid, const VECTOR2I &aEnd)
Determine the center of an arc or circle given three points on its circumference.
 
constexpr int sign(T val)
 
VECTOR2< int32_t > VECTOR2I
 
VECTOR2< double > VECTOR2D