diff --git a/pcbnew/pcb_base_frame.cpp b/pcbnew/pcb_base_frame.cpp index 114c476d2c..c5eaa81378 100644 --- a/pcbnew/pcb_base_frame.cpp +++ b/pcbnew/pcb_base_frame.cpp @@ -755,6 +755,7 @@ void PCB_BASE_FRAME::ActivateGalCanvas() void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions ) { + bool hcChanged = m_displayOptions.m_ContrastModeDisplay != aOptions.m_ContrastModeDisplay; m_displayOptions = aOptions; EDA_DRAW_PANEL_GAL* canvas = GetCanvas(); @@ -764,5 +765,19 @@ void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions ) canvas->SetHighContrastLayer( GetActiveLayer() ); OnDisplayOptionsChanged(); + // Vias on a restricted layer set must be redrawn when high contrast mode is changed + if( hcChanged ) + { + GetCanvas()->GetView()->UpdateAllItemsConditionally( KIGFX::REPAINT, + []( KIGFX::VIEW_ITEM* aItem ) -> bool + { + if( VIA* via = dynamic_cast( aItem ) ) + return ( via->GetViaType() == VIATYPE::BLIND_BURIED || + via->GetViaType() == VIATYPE::MICROVIA ); + + return false; + } ); + } + canvas->Refresh(); } diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp index 0785304daa..799d240dd2 100644 --- a/pcbnew/pcb_edit_frame.cpp +++ b/pcbnew/pcb_edit_frame.cpp @@ -982,6 +982,17 @@ void PCB_EDIT_FRAME::SetActiveLayer( PCB_LAYER_ID aLayer ) GetCanvas()->SetFocus(); // allow capture of hotkeys GetCanvas()->SetHighContrastLayer( aLayer ); + // Vias on a restricted layer set must be redrawn when the active layer is changed + GetCanvas()->GetView()->UpdateAllItemsConditionally( KIGFX::REPAINT, + []( KIGFX::VIEW_ITEM* aItem ) -> bool + { + if( VIA* via = dynamic_cast( aItem ) ) + return ( via->GetViaType() == VIATYPE::BLIND_BURIED || + via->GetViaType() == VIATYPE::MICROVIA ); + + return false; + } ); + // Clearances could be layer-dependent so redraw them when the active layer is changed if( GetDisplayOptions().m_DisplayPadIsol ) { diff --git a/pcbnew/pcb_painter.cpp b/pcbnew/pcb_painter.cpp index 29151cceaf..aa28ffda61 100644 --- a/pcbnew/pcb_painter.cpp +++ b/pcbnew/pcb_painter.cpp @@ -320,7 +320,8 @@ COLOR4D PCB_RENDER_SETTINGS::GetColor( const VIEW_ITEM* aItem, int aLayer ) cons ( aLayer == LAYER_VIAS_HOLES || aLayer == LAYER_VIA_THROUGH || aLayer == LAYER_VIA_MICROVIA || - aLayer == LAYER_VIA_BBLIND ) ) + aLayer == LAYER_VIA_BBLIND || + aLayer == LAYER_VIAS_NETNAMES ) ) { const VIA* via = static_cast( item ); const BOARD* pcb = static_cast( item->GetParent() ); @@ -332,6 +333,9 @@ COLOR4D PCB_RENDER_SETTINGS::GetColor( const VIEW_ITEM* aItem, int aLayer ) cons viaActiveLayer |= via->IsOnLayer( lay_id ) && pcb->IsLayerVisible( lay_id ); } + if( !viaActiveLayer && m_contrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN ) + return COLOR4D::CLEAR; + if( !viaActiveLayer ) color.Darken( 1.0 - m_highlightFactor ); } @@ -592,45 +596,59 @@ void PCB_PAINTER::draw( const VIA* aVia, int aLayer ) VECTOR2D position( center ); // Is anything that we can display enabled? - if( m_pcbSettings.m_netNamesOnVias ) + if( !m_pcbSettings.m_netNamesOnVias || aVia->GetNetname().empty() ) + return; + + // We won't get CLEAR from GetColor below for a non-through via on an inactive layer in + // high contrast mode because LAYER_VIAS_NETNAMES will always be part of the high-contrast + // set. So we do another check here to prevent drawing netnames for these vias. + if( m_pcbSettings.GetHighContrast() ) { - bool displayNetname = ( !aVia->GetNetname().empty() ); - double maxSize = PCB_RENDER_SETTINGS::MAX_FONT_SIZE; - double size = aVia->GetWidth(); + bool draw = false; - // Font size limits - if( size > maxSize ) - size = maxSize; - - m_gal->Save(); - m_gal->Translate( position ); - - // Default font settings - m_gal->ResetTextAttributes(); - m_gal->SetStrokeColor( m_pcbSettings.GetColor( NULL, aLayer ) ); - - // Set the text position to the pad shape position (the pad position is not the best place) - VECTOR2D textpos( 0.0, 0.0 ); - - if( displayNetname ) + for( unsigned int layer : m_pcbSettings.GetHighContrastLayers() ) { - wxString netname = UnescapeString( aVia->GetShortNetname() ); - // calculate the size of net name text: - double tsize = 1.5 * size / netname.Length(); - tsize = std::min( tsize, size ); - // Use a smaller text size to handle interline, pen size.. - tsize *= 0.7; - VECTOR2D namesize( tsize, tsize ); - - m_gal->SetGlyphSize( namesize ); - m_gal->SetLineWidth( namesize.x / 12.0 ); - m_gal->BitmapText( netname, textpos, 0.0 ); + if( aVia->IsOnLayer( static_cast( layer ) ) ) + { + draw = true; + break; + } } - - m_gal->Restore(); + if( !draw ) + return; } - return; + + double maxSize = PCB_RENDER_SETTINGS::MAX_FONT_SIZE; + double size = aVia->GetWidth(); + + // Font size limits + if( size > maxSize ) + size = maxSize; + + m_gal->Save(); + m_gal->Translate( position ); + + // Default font settings + m_gal->ResetTextAttributes(); + m_gal->SetStrokeColor( m_pcbSettings.GetColor( NULL, aLayer ) ); + + // Set the text position to the pad shape position (the pad position is not the best place) + VECTOR2D textpos( 0.0, 0.0 ); + + wxString netname = UnescapeString( aVia->GetShortNetname() ); + // calculate the size of net name text: + double tsize = 1.5 * size / netname.Length(); + tsize = std::min( tsize, size ); + // Use a smaller text size to handle interline, pen size.. + tsize *= 0.7; + VECTOR2D namesize( tsize, tsize ); + + m_gal->SetGlyphSize( namesize ); + m_gal->SetLineWidth( namesize.x / 12.0 ); + m_gal->BitmapText( netname, textpos, 0.0 ); + + m_gal->Restore(); } // Choose drawing settings depending on if we are drawing via's pad or hole @@ -647,6 +665,9 @@ void PCB_PAINTER::draw( const VIA* aVia, int aLayer ) bool sketchMode = false; COLOR4D color = m_pcbSettings.GetColor( aVia, aLayer ); + if( color == COLOR4D::CLEAR ) + return; + switch( aVia->GetViaType() ) { case VIATYPE::THROUGH: diff --git a/pcbnew/widgets/appearance_controls.cpp b/pcbnew/widgets/appearance_controls.cpp index d95eecfd2b..f21bb54618 100644 --- a/pcbnew/widgets/appearance_controls.cpp +++ b/pcbnew/widgets/appearance_controls.cpp @@ -447,8 +447,6 @@ APPEARANCE_CONTROLS::APPEARANCE_CONTROLS( PCB_BASE_FRAME* aParent, wxWindow* aFo opts.m_ContrastModeDisplay = aMode; m_frame->SetDisplayOptions( opts ); - m_frame->GetCanvas()->SetHighContrastLayer( m_frame->GetActiveLayer() ); - m_frame->GetCanvas()->Refresh(); passOnFocus(); };