Commit e050133c authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Simplified color computation.

parent 8ab98ae6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ RENDER_SETTINGS::~RENDER_SETTINGS()
}


void RENDER_SETTINGS::Update()
void RENDER_SETTINGS::update()
{
    m_hiContrastColor = COLOR4D( m_hiContrastFactor, m_hiContrastFactor, m_highlightFactor,
                                 m_layerOpacity );
+8 −19
Original line number Diff line number Diff line
@@ -59,13 +59,6 @@ public:
    RENDER_SETTINGS();
    virtual ~RENDER_SETTINGS();

    /**
     * Function Update
     * Precalculates extra colors for layers (eg. highlighted, darkened and any needed version
     * of base colors).
     */
    virtual void Update();

    /**
     * Function ImportLegacyColors
     * Loads a list of color settings for layers.
@@ -122,6 +115,13 @@ public:
    }

protected:
    /**
     * Function update
     * Precalculates extra colors for layers (eg. highlighted, darkened and any needed version
     * of base colors).
     */
    virtual void update();

    std::set<unsigned int> m_activeLayers; /// Stores active layers number

    /// Parameters for display modes
@@ -138,8 +138,7 @@ protected:
    COLOR4D m_selectionBorderColor; /// Color of selection box border

    float   m_selectFactor;         /// Specifies how color of selected items is changed
    float   m_layerOpacity;         /// Determines opacity of all layers, so every can be seen
                                    /// at the same time
    float   m_layerOpacity;         /// Determines opacity of all layers
    float   m_outlineWidth;         /// Line width used when drawing outlines

    /// Map of colors that were usually used for display
@@ -226,16 +225,6 @@ public:
    virtual const COLOR4D& GetColor( const VIEW_ITEM* aItem, int aLayer ) = 0;

protected:
    /**
     * Function getLayerColor
     * is used for obtaining color that should be used for specific layer/net
     * combination using stored color settings.
     * @param aLayer is the layer number that is being drawn.
     * @param aNetCode is a number of the net that is being drawn.
     * @param aHighlighted says if the item is marked as highlighted.
     */
    virtual const COLOR4D& getLayerColor( int aLayer, int aNetCode, bool aHighlighted ) const = 0;

    /// Instance of graphic abstraction layer that gives an interface to call
    /// commands used to draw (eg. DrawLine, DrawCircle, etc.)
    GAL*                m_gal;
+46 −81
Original line number Diff line number Diff line
@@ -51,7 +51,7 @@ PCB_RENDER_SETTINGS::PCB_RENDER_SETTINGS()
        m_sketchModeSelect[i] = false;
    }

    Update();
    update();
}


@@ -64,26 +64,26 @@ void PCB_RENDER_SETTINGS::ImportLegacyColors( COLORS_DESIGN_SETTINGS* aSettings

    for( int i = 0; i < END_PCB_VISIBLE_LIST; i++ )
    {
        m_itemColors[i] = m_legacyColorMap[aSettings->GetItemColor( i )];
        m_layerColors[ITEM_GAL_LAYER( i )] = m_legacyColorMap[aSettings->GetItemColor( i )];
    }

    // Default colors for specific layers
    m_itemColors[VIAS_HOLES_VISIBLE]        = COLOR4D( 0.5, 0.4, 0.0, 1.0 );
    m_itemColors[PADS_HOLES_VISIBLE]        = COLOR4D( 0.0, 0.5, 0.5, 1.0 );
    m_itemColors[VIAS_VISIBLE]              = COLOR4D( 0.7, 0.7, 0.7, 1.0 );
    m_itemColors[PADS_VISIBLE]              = COLOR4D( 0.7, 0.7, 0.7, 1.0 );
    m_itemColors[PADS_NETNAMES_VISIBLE]     = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    m_itemColors[PAD_FR_NETNAMES_VISIBLE]   = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    m_itemColors[PAD_BK_NETNAMES_VISIBLE]   = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    m_layerColors[ITEM_GAL_LAYER( VIAS_HOLES_VISIBLE )]         = COLOR4D( 0.5, 0.4, 0.0, 1.0 );
    m_layerColors[ITEM_GAL_LAYER( PADS_HOLES_VISIBLE )]         = COLOR4D( 0.0, 0.5, 0.5, 1.0 );
    m_layerColors[ITEM_GAL_LAYER( VIAS_VISIBLE )]               = COLOR4D( 0.7, 0.7, 0.7, 1.0 );
    m_layerColors[ITEM_GAL_LAYER( PADS_VISIBLE )]               = COLOR4D( 0.7, 0.7, 0.7, 1.0 );
    m_layerColors[ITEM_GAL_LAYER( PADS_NETNAMES_VISIBLE )]      = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    m_layerColors[ITEM_GAL_LAYER( PAD_FR_NETNAMES_VISIBLE )]    = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    m_layerColors[ITEM_GAL_LAYER( PAD_BK_NETNAMES_VISIBLE )]    = COLOR4D( 0.8, 0.8, 0.8, 0.7 );

    // Netnames for copper layers
    for( LAYER_NUM layer = FIRST_COPPER_LAYER; layer <= LAST_COPPER_LAYER; ++layer )
    {
        // Quick, dirty hack, netnames layers should be stored in usual layers
        m_itemColors[GetNetnameLayer( layer ) - NB_LAYERS] = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
        m_layerColors[GetNetnameLayer( layer )] = COLOR4D( 0.8, 0.8, 0.8, 0.7 );
    }


    Update();
    update();
}


@@ -137,10 +137,10 @@ void PCB_RENDER_SETTINGS::LoadDisplayOptions( const DISPLAY_OPTIONS& aOptions )
}


void PCB_RENDER_SETTINGS::Update()
void PCB_RENDER_SETTINGS::update()
{
    // Calculate darkened/highlighted variants of layer colors
    for( int i = 0; i < NB_LAYERS; i++ )
    for( int i = 0; i < TOTAL_LAYER_COUNT; i++ )
    {
        m_layerColors[i].a   = m_layerOpacity;
        m_layerColorsHi[i]   = m_layerColors[i].Brightened( m_highlightFactor );
@@ -148,14 +148,6 @@ void PCB_RENDER_SETTINGS::Update()
        m_layerColorsSel[i]  = m_layerColors[i].Brightened( m_selectFactor );
    }

    for( int i = 0; i < END_PCB_VISIBLE_LIST; i++ )
    {
        m_itemColors[i].a   = m_layerOpacity;
        m_itemColorsHi[i]   = m_itemColors[i].Brightened( m_highlightFactor );
        m_itemColorsDark[i] = m_itemColors[i].Darkened( 1.0 - m_highlightFactor );
        m_itemColorsSel[i]  = m_itemColors[i].Brightened( m_selectFactor );
    }

    m_hiContrastColor = COLOR4D( m_hiContrastFactor, m_hiContrastFactor, m_hiContrastFactor,
                                 m_layerOpacity );
}
@@ -169,36 +161,29 @@ PCB_PAINTER::PCB_PAINTER( GAL* aGal ) :

const COLOR4D& PCB_PAINTER::GetColor( const VIEW_ITEM* aItem, int aLayer )
{
    int netCode = 0;
    int netCode = -1;

    if( aItem )
    {
        if( static_cast<const EDA_ITEM*>( aItem )->IsSelected() )
        {
            return m_pcbSettings->m_layerColorsSel[aLayer];
        }

        // Try to obtain the netcode for the item
        const BOARD_CONNECTED_ITEM* item = dynamic_cast<const BOARD_CONNECTED_ITEM*>( aItem );
        if( item )
            netCode = item->GetNet();

    return getLayerColor( aLayer, netCode,
            static_cast<const BOARD_ITEM*>( aItem )->IsSelected() );
    }


const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode, bool aSelected ) const
{
    // Return grayish color for non-highlighted layers in the high contrast mode
    if( m_pcbSettings->m_hiContrastEnabled && m_pcbSettings->m_activeLayers.count( aLayer ) == 0 )
        return m_pcbSettings->m_hiContrastColor;

    // For item layers (vias, texts, and so on)
    if( aLayer >= NB_LAYERS )
        return getItemColor( aLayer - NB_LAYERS, aNetCode, aSelected );

    // Highlight per item basis
    if( aSelected )
        return m_pcbSettings->m_layerColorsHi[aLayer];

    // Single net highlight mode
    if( m_pcbSettings->m_highlightEnabled )
    {
        if( aNetCode == m_pcbSettings->m_highlightNetcode )
        if( netCode == m_pcbSettings->m_highlightNetcode )
            return m_pcbSettings->m_layerColorsHi[aLayer];
        else
            return m_pcbSettings->m_layerColorsDark[aLayer];
@@ -209,29 +194,12 @@ const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode, bool aSelec
}


const COLOR4D& PCB_PAINTER::getItemColor( int aItemType, int aNetCode, bool aSelected ) const
{
    // Highlight per item basis
    if( aSelected )
        return m_pcbSettings->m_itemColorsHi[aItemType];

    if( m_pcbSettings->m_highlightEnabled )
    {
        if( aNetCode == m_pcbSettings->m_highlightNetcode )
            return m_pcbSettings->m_itemColorsHi[aItemType];
        else
            return m_pcbSettings->m_itemColorsDark[aItemType];
    }

    // No special modificators enabled
    return m_pcbSettings->m_itemColors[aItemType];
}


bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer )
{
    const BOARD_ITEM* item = static_cast<const BOARD_ITEM*>( aItem );

    // the "cast" applied in here clarifies which overloaded draw() is called
    switch( static_cast<const BOARD_ITEM*>( aItem )->Type() )
    switch( item->Type() )
    {
    case PCB_ZONE_T:
    case PCB_TRACE_T:
@@ -308,9 +276,8 @@ void PCB_PAINTER::draw( const TRACK* aTrack, int aLayer )
            double textSize = std::min( static_cast<double>( width ), length / netName.length() );

            // Set a proper color for the label
            color = getLayerColor( aTrack->GetLayer(), aTrack->GetNet(),
                                   aTrack->IsSelected() );
            COLOR4D labelColor = getLayerColor( aLayer, 0, aTrack->IsSelected() );
            color = GetColor( aTrack, aTrack->GetLayer() );
            COLOR4D labelColor = GetColor( NULL, aLayer );

            if( color.GetBrightness() > 0.5 )
                m_gal->SetStrokeColor( labelColor.Inverted() );
@@ -330,7 +297,7 @@ void PCB_PAINTER::draw( const TRACK* aTrack, int aLayer )
    else if( IsCopperLayer( aLayer ))
    {
        // Draw a regular track
        color = getLayerColor( aLayer, netNumber, aTrack->IsSelected() );
        color = GetColor( aTrack, aLayer );
        m_gal->SetStrokeColor( color );
        m_gal->SetIsStroke( true );

@@ -369,7 +336,7 @@ void PCB_PAINTER::draw( const SEGVIA* aVia, int aLayer )
    else
        return;

    color = getLayerColor( aLayer, aVia->GetNet(), aVia->IsSelected() );
    color = GetColor( aVia, aLayer );

    if( m_pcbSettings->m_sketchModeSelect[VIAS_VISIBLE] )
    {
@@ -448,9 +415,8 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
            m_gal->SetMirrored( false );

            // Set a proper color for the label
            color = getLayerColor( aPad->GetParent()->GetLayer(), aPad->GetNet(),
                                   aPad->IsSelected() );
            COLOR4D labelColor = getLayerColor( aLayer, 0, aPad->IsSelected() );
            color = GetColor( aPad, aPad->GetLayer() );
            COLOR4D labelColor = GetColor( NULL, aLayer );

            if( color.GetBrightness() > 0.5 )
                m_gal->SetStrokeColor( labelColor.Inverted() );
@@ -495,7 +461,8 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )
        return;
    }

    color = getLayerColor( aLayer, aPad->GetNet(), aPad->IsSelected() );
    // Pad drawing
    color = GetColor( aPad, aLayer );
    if( m_pcbSettings->m_sketchModeSelect[PADS_VISIBLE] )
    {
        // Outline mode
@@ -618,7 +585,7 @@ void PCB_PAINTER::draw( const D_PAD* aPad, int aLayer )

void PCB_PAINTER::draw( const DRAWSEGMENT* aSegment )
{
    COLOR4D color = getLayerColor( aSegment->GetLayer(), 0, aSegment->IsSelected() );
    COLOR4D color = GetColor( NULL, aSegment->GetLayer() );

    m_gal->SetIsFill( false );
    m_gal->SetIsStroke( true );
@@ -692,7 +659,7 @@ void PCB_PAINTER::draw( const TEXTE_PCB* aText )
    if( aText->GetText().Length() == 0 )
        return;

    COLOR4D  strokeColor = getLayerColor( aText->GetLayer(), 0, aText->IsSelected() );
    COLOR4D  strokeColor = GetColor( NULL, aText->GetLayer() );
    VECTOR2D position( aText->GetTextPosition().x, aText->GetTextPosition().y );
    double   orientation = aText->GetOrientation() * M_PI / 1800.0;

@@ -708,13 +675,13 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer )
    if( aText->GetLength() == 0 )
        return;

    COLOR4D  strokeColor = getLayerColor( aLayer, 0, aText->IsSelected() );
    COLOR4D  strokeColor = GetColor( NULL, aLayer );
    VECTOR2D position( aText->GetTextPosition().x, aText->GetTextPosition().y);
    double   orientation = aText->GetDrawRotation() * M_PI / 1800.0;

    m_gal->PushDepth();

    if(aText->IsSelected())
    /*if(aText->IsSelected())
    {
        EDA_RECT bb (aText->GetBoundingBox());
        VECTOR2D s (bb.GetOrigin());
@@ -725,7 +692,7 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer )
        m_gal->SetIsStroke(true);
        m_gal->SetLineWidth(0);
        m_gal->DrawRectangle(s, e);
    }
    }*/
    
    m_gal->AdvanceDepth();

@@ -741,8 +708,7 @@ void PCB_PAINTER::draw( const TEXTE_MODULE* aText, int aLayer )

void PCB_PAINTER::draw( const ZONE_CONTAINER* aZone )
{
    COLOR4D color = getLayerColor( aZone->GetLayer(), aZone->GetNet(),
                                   aZone->IsSelected() );
    COLOR4D color = GetColor( NULL, aZone->GetLayer() );
    std::deque<VECTOR2D> corners;
    PCB_RENDER_SETTINGS::DisplayZonesMode displayMode = m_pcbSettings->m_displayZoneMode;

@@ -811,8 +777,7 @@ void PCB_PAINTER::draw( const ZONE_CONTAINER* aZone )

void PCB_PAINTER::draw( const DIMENSION* aDimension )
{
    COLOR4D strokeColor = getLayerColor( aDimension->GetLayer(), 0,
                                         aDimension->IsSelected() );
    COLOR4D strokeColor = GetColor( NULL, aDimension->GetLayer() );

    m_gal->SetStrokeColor( strokeColor );
    m_gal->SetIsFill( false );
@@ -835,7 +800,7 @@ void PCB_PAINTER::draw( const DIMENSION* aDimension )

void PCB_PAINTER::draw( const PCB_TARGET* aTarget )
{
    COLOR4D  strokeColor = getLayerColor( aTarget->GetLayer(), 0, aTarget->IsSelected() );
    COLOR4D  strokeColor = GetColor( NULL, aTarget->GetLayer() );
    VECTOR2D position( aTarget->GetPosition() );
    double   size, radius;

+12 −27
Original line number Diff line number Diff line
@@ -27,10 +27,8 @@
#define __CLASS_PCB_PAINTER_H

#include <layers_id_colors_and_visibility.h>

#include <painter.h>


class EDA_ITEM;
class COLORS_DESIGN_SETTINGS;
class DISPLAY_OPTIONS;
@@ -76,9 +74,6 @@ public:

    PCB_RENDER_SETTINGS();

    /// @copydoc RENDER_SETTINGS::Update()
    void Update();

    /// @copydoc RENDER_SETTINGS::ImportLegacyColors()
    void ImportLegacyColors( COLORS_DESIGN_SETTINGS* aSettings );

@@ -91,23 +86,24 @@ public:
    void LoadDisplayOptions( const DISPLAY_OPTIONS& aOptions );

protected:
    /// @copydoc RENDER_SETTINGS::Update()
    void update();

    /// Colors for all layers (including special, highlighted & darkened versions)
    COLOR4D m_layerColors    [NB_LAYERS];
    COLOR4D m_layerColorsHi  [NB_LAYERS];
    COLOR4D m_layerColorsSel [NB_LAYERS];
    COLOR4D m_layerColorsDark[NB_LAYERS];
    COLOR4D m_itemColors     [END_PCB_VISIBLE_LIST];
    COLOR4D m_itemColorsHi   [END_PCB_VISIBLE_LIST];
    COLOR4D m_itemColorsSel  [END_PCB_VISIBLE_LIST];
    COLOR4D m_itemColorsDark [END_PCB_VISIBLE_LIST];

    bool    m_sketchModeSelect[END_PCB_VISIBLE_LIST];
    COLOR4D m_layerColors    [TOTAL_LAYER_COUNT];
    COLOR4D m_layerColorsHi  [TOTAL_LAYER_COUNT];
    COLOR4D m_layerColorsSel [TOTAL_LAYER_COUNT];
    COLOR4D m_layerColorsDark[TOTAL_LAYER_COUNT];

    bool    m_sketchModeSelect[TOTAL_LAYER_COUNT];
    bool    m_padNumbers;
    bool    m_netNamesOnPads;
    bool    m_netNamesOnTracks;

    /// Maximum font size for netnames (and other dynamically shown strings)
    static const double MAX_FONT_SIZE = 100000000;

    /// Option for different display modes for zones
    DisplayZonesMode m_displayZoneMode;
};

@@ -140,17 +136,6 @@ public:
protected:
    PCB_RENDER_SETTINGS* m_pcbSettings;

    /// @copydoc PAINTER::getLayerColor()
    const COLOR4D& getLayerColor( int aLayer, int aNetCode, bool aHighlighted ) const;

    /**
     * Function getItemColor
     * Returns color for a special layer (eg. vias/pads holes, texts on front/bottom layer, etc.)
     * @param aItemType Layer number of the item to be drawn.
     * @param aNetCode Net number of the item to be drawn.
     */
    const COLOR4D& getItemColor( int aItemType, int aNetCode, bool aHighlighted ) const;

    // Drawing functions for various types of PCB-specific items
    void draw( const TRACK*, int );
    void draw( const SEGVIA*, int );