Added possibility to change cached layer color (for the purpose of high contrast display).

This commit is contained in:
Maciej Suminski 2013-06-25 17:12:54 +02:00
parent 0bac4a1e07
commit db74de74f5
12 changed files with 161 additions and 33 deletions

View File

@ -801,6 +801,24 @@ void CAIRO_GAL::DrawGroup( int aGroupNumber )
} }
void CAIRO_GAL::ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor )
{
storePath();
for( Group::iterator it = groups[aGroupNumber].begin();
it != groups[aGroupNumber].end(); ++it )
{
if( it->command == CMD_SET_FILLCOLOR || it->command == CMD_SET_STROKECOLOR )
{
it->arguments[0] = aNewColor.r;
it->arguments[1] = aNewColor.g;
it->arguments[2] = aNewColor.b;
it->arguments[3] = aNewColor.a;
}
}
}
void CAIRO_GAL::Flush() void CAIRO_GAL::Flush()
{ {
storePath(); storePath();

View File

@ -1628,6 +1628,13 @@ void OPENGL_GAL::DrawGroup( int aGroupNumber )
} }
void OPENGL_GAL::ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor )
{
vboItems[aGroupNumber]->ChangeColor( aNewColor );
vboNeedsUpdate = true;
}
void OPENGL_GAL::computeUnitCircle() void OPENGL_GAL::computeUnitCircle()
{ {
displayListCircle = glGenLists( 1 ); displayListCircle = glGenLists( 1 );

View File

@ -79,18 +79,17 @@ VBO_VERTEX* VBO_ITEM::GetVertices()
void VBO_ITEM::ChangeColor( const COLOR4D& aColor ) void VBO_ITEM::ChangeColor( const COLOR4D& aColor )
{ {
wxASSERT_MSG( false, wxT( "This was not tested yet" ) );
if( m_isDirty ) if( m_isDirty )
Finish(); Finish();
// Point to color of vertices
VBO_VERTEX* vertexPtr = GetVertices(); VBO_VERTEX* vertexPtr = GetVertices();
const GLfloat newColor[] = { aColor.r, aColor.g, aColor.b, aColor.a };
for( unsigned int i = 0; i < m_size; ++i ) for( unsigned int i = 0; i < m_size; ++i )
{ {
memcpy( &vertexPtr->r, newColor, ColorByteSize ); vertexPtr->r = aColor.r;
vertexPtr->g = aColor.g;
vertexPtr->b = aColor.b;
vertexPtr->a = aColor.a;
// Move on to the next vertex // Move on to the next vertex
vertexPtr++; vertexPtr++;

View File

@ -307,6 +307,55 @@ void VIEW::SetLayerOrder( int aLayer, int aRenderingOrder )
} }
struct VIEW::updateItemsColor
{
updateItemsColor( int aLayer, PAINTER* aPainter, GAL* aGal ) :
layer( aLayer ), painter( aPainter), gal( aGal )
{
}
void operator()( VIEW_ITEM* aItem )
{
// Obtain the color that should be used for coloring the item
const COLOR4D color = painter->GetColor( aItem, layer );
int group = aItem->getGroup( layer );
gal->ChangeGroupColor( group, color );
}
int layer;
PAINTER* painter;
GAL* gal;
};
void VIEW::UpdateLayerColor( int aLayer )
{
BOX2I r;
r.SetMaximum();
updateItemsColor visitor( aLayer, m_painter, m_gal );
m_layers[aLayer].items->Query( r, visitor );
}
void VIEW::UpdateAllLayersColor()
{
BOX2I r;
r.SetMaximum();
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = &( ( *i ).second );
updateItemsColor visitor( l->id, m_painter, m_gal );
l->items->Query( r, visitor );
}
}
void VIEW::SetTopLayer( int aLayer ) void VIEW::SetTopLayer( int aLayer )
{ {
// Restore previous order // Restore previous order
@ -561,13 +610,13 @@ void VIEW::clearGroupCache()
BOX2I r; BOX2I r;
r.SetMaximum(); r.SetMaximum();
clearItemCache visitor( this );
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i ) for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
{ {
VIEW_LAYER* l = & ( ( *i ).second ); VIEW_LAYER* l = & ( ( *i ).second );
clearItemCache visitor( this );
l->items->Query( r, visitor ); l->items->Query( r, visitor );
}; }
} }

View File

@ -209,6 +209,9 @@ public:
/// @copydoc GAL::DrawGroup() /// @copydoc GAL::DrawGroup()
virtual void DrawGroup( int aGroupNumber ); virtual void DrawGroup( int aGroupNumber );
/// @copydoc GAL::ChangeGroupColor()
virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor );
/// @copydoc GAL::DeleteGroup() /// @copydoc GAL::DeleteGroup()
virtual void DeleteGroup( int aGroupNumber ); virtual void DeleteGroup( int aGroupNumber );

View File

@ -363,6 +363,14 @@ public:
*/ */
virtual void DrawGroup( int aGroupNumber ) = 0; virtual void DrawGroup( int aGroupNumber ) = 0;
/**
* @brief Changes the color used to draw the group.
*
* @param aGroupNumber is the group number.
* @param aNewColor is the new color.
*/
virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ) = 0;
/** /**
* @brief Delete the group from the memory. * @brief Delete the group from the memory.
* *

View File

@ -234,6 +234,9 @@ public:
/// @copydoc GAL::DrawGroup() /// @copydoc GAL::DrawGroup()
virtual void DrawGroup( int aGroupNumber ); virtual void DrawGroup( int aGroupNumber );
/// @copydoc GAL::ChangeGroupColor()
virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor );
/// @copydoc GAL::DeleteGroup() /// @copydoc GAL::DeleteGroup()
virtual void DeleteGroup( int aGroupNumber ); virtual void DeleteGroup( int aGroupNumber );

View File

@ -82,7 +82,7 @@ public:
* (eg. highlighted, so it differs from other layers). * (eg. highlighted, so it differs from other layers).
* @param aLayerId is a layer number that should be displayed in a specific mode. * @param aLayerId is a layer number that should be displayed in a specific mode.
*/ */
void SetActiveLayer( int aLayerId ) inline void SetActiveLayer( int aLayerId )
{ {
m_activeLayer = aLayerId; m_activeLayer = aLayerId;
} }
@ -94,7 +94,7 @@ public:
* @param aNetCode is optional and if specified, turns on higlighting only for the net with * @param aNetCode is optional and if specified, turns on higlighting only for the net with
* number given as the parameter. * number given as the parameter.
*/ */
void SetHighlight( bool aEnabled, int aNetcode = -1 ) inline void SetHighlight( bool aEnabled, int aNetcode = -1 )
{ {
m_highlightEnabled = aEnabled; m_highlightEnabled = aEnabled;
@ -107,7 +107,7 @@ public:
* Turns on/off high contrast display mode. * Turns on/off high contrast display mode.
* @param aEnabled determines if high contrast display mode should be enabled or not. * @param aEnabled determines if high contrast display mode should be enabled or not.
*/ */
void SetHighContrast( bool aEnabled ) inline void SetHighContrast( bool aEnabled )
{ {
m_hiContrastEnabled = aEnabled; m_hiContrastEnabled = aEnabled;
} }
@ -200,7 +200,7 @@ public:
/** /**
* Function Draw * Function Draw
* Takes an instance of EDA_ITEM and passes it to a function that know how to draw the item. * Takes an instance of VIEW_ITEM and passes it to a function that know how to draw the item.
* @param aItem is an item to be drawn. * @param aItem is an item to be drawn.
* @param aLayer tells which layer is currently rendered so that draw functions * @param aLayer tells which layer is currently rendered so that draw functions
* may know what to draw (eg. for pads there are separate layers for holes, because they * may know what to draw (eg. for pads there are separate layers for holes, because they
@ -208,8 +208,17 @@ public:
*/ */
virtual bool Draw( const VIEW_ITEM* aItem, int aLayer ) = 0; virtual bool Draw( const VIEW_ITEM* aItem, int aLayer ) = 0;
protected: /**
* Function GetColor
* Returns the color that should be used to draw the specific VIEW_ITEM on the specific layer
* using currently used render settings.
* @param aItem is the VIEW_ITEM.
* @param aLayer is the layer.
* @return The color.
*/
virtual const COLOR4D& GetColor( const VIEW_ITEM* aItem, int aLayer ) = 0;
protected:
/** /**
* Function getLayerColor * Function getLayerColor
* is used for obtaining color that should be used for specific layer/net * is used for obtaining color that should be used for specific layer/net

View File

@ -61,8 +61,8 @@ public:
/** /**
* Constructor. * Constructor.
* @param aIsDynamic: decides whether we are creating a static or a dynamic VIEW. * @param aIsDynamic decides whether we are creating a static or a dynamic VIEW.
* @param aUseGroups: fixme * @param aUseGroups tells if items added to the VIEW should be stored in groups.
*/ */
VIEW( bool aIsDynamic = true, bool aUseGroups = false ); VIEW( bool aIsDynamic = true, bool aUseGroups = false );
@ -264,6 +264,21 @@ public:
*/ */
void SetLayerOrder( int aLayer, int aRenderingOrder ); void SetLayerOrder( int aLayer, int aRenderingOrder );
/**
* Function UpdateLayerColor()
* Applies the new coloring scheme held by RENDER_SETTINGS in case that it has changed.
* @param aLayer is a number of the layer to be updated.
* @see RENDER_SETTINGS
*/
void UpdateLayerColor( int aLayer );
/**
* Function UpdateAllLayersColor()
* Applies the new coloring scheme to all layers. The used scheme is held by RENDER_SETTINGS.
* @see RENDER_SETTINGS
*/
void UpdateAllLayersColor();
/** /**
* Function SetTopLayer() * Function SetTopLayer()
* Sets given layer to be displayed on the top or sets back the default order of layers. * Sets given layer to be displayed on the top or sets back the default order of layers.
@ -313,7 +328,6 @@ public:
static const int TOP_LAYER; ///* layer number for displaying items on the top static const int TOP_LAYER; ///* layer number for displaying items on the top
private: private:
struct VIEW_LAYER struct VIEW_LAYER
{ {
bool enabled; ///* is the layer to be rendered? bool enabled; ///* is the layer to be rendered?
@ -338,6 +352,7 @@ private:
struct unlinkItem; struct unlinkItem;
struct recacheItem; struct recacheItem;
struct drawItem; struct drawItem;
struct updateItemsColor;
///* Saves current top layer settings in order to restore it when it's not top anymore ///* Saves current top layer settings in order to restore it when it's not top anymore
VIEW_LAYER m_topLayer; VIEW_LAYER m_topLayer;

View File

@ -161,6 +161,12 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
{ {
int id = event.GetId(); int id = event.GetId();
bool state = event.IsChecked(); bool state = event.IsChecked();
#ifdef KICAD_GAL
KiGfx::PCB_PAINTER* painter =
static_cast<KiGfx::PCB_PAINTER*> ( m_galCanvas->GetView()->GetPainter() );
KiGfx::PCB_RENDER_SETTINGS* settings =
static_cast<KiGfx::PCB_RENDER_SETTINGS*> ( painter->GetSettings() );
#endif /* KICAD_GAL */
switch( id ) switch( id )
{ {
@ -221,7 +227,12 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
case ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE: case ID_TB_OPTIONS_SHOW_HIGH_CONTRAST_MODE:
DisplayOpt.ContrastModeDisplay = state; DisplayOpt.ContrastModeDisplay = state;
#ifdef KICAD_GAL #ifdef KICAD_GAL
// Apply new display options to the GAL canvas
settings->LoadDisplayOptions( DisplayOpt );
m_galCanvas->GetView()->EnableTopLayer( state ); m_galCanvas->GetView()->EnableTopLayer( state );
m_galCanvas->GetView()->UpdateAllLayersColor();
if( !IsGalCanvasActive() )
#endif /* KICAD_GAL */ #endif /* KICAD_GAL */
m_canvas->Refresh(); m_canvas->Refresh();
break; break;
@ -250,16 +261,7 @@ void PCB_EDIT_FRAME::OnSelectOptionToolbar( wxCommandEvent& event )
} }
#ifdef KICAD_GAL #ifdef KICAD_GAL
// Apply new display options to the GAL canvas
KiGfx::PCB_PAINTER* painter =
static_cast<KiGfx::PCB_PAINTER*> ( m_galCanvas->GetView()->GetPainter() );
KiGfx::PCB_RENDER_SETTINGS* settings =
static_cast<KiGfx::PCB_RENDER_SETTINGS*> ( painter->GetSettings() );
settings->LoadDisplayOptions( DisplayOpt );
if( IsGalCanvasActive() ) if( IsGalCanvasActive() )
{
m_galCanvas->Refresh(); m_galCanvas->Refresh();
} #endif /* KICAD_GAL */
#endif
} }

View File

@ -117,6 +117,19 @@ PCB_PAINTER::PCB_PAINTER( GAL* aGal ) :
} }
const COLOR4D& PCB_PAINTER::GetColor( const VIEW_ITEM* aItem, int aLayer )
{
int netCode = 0;
// 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 );
}
const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode ) const const COLOR4D& PCB_PAINTER::getLayerColor( int aLayer, int aNetCode ) const
{ {
if( m_pcbSettings->m_hiContrastEnabled && m_pcbSettings->m_activeLayer != aLayer ) if( m_pcbSettings->m_hiContrastEnabled && m_pcbSettings->m_activeLayer != aLayer )
@ -211,7 +224,7 @@ bool PCB_PAINTER::Draw( const VIEW_ITEM* aItem, int aLayer )
break; break;
default: default:
// Painter does not knowNetwork: how to draw the object // Painter does not know how to draw the object
return false; return false;
break; break;
} }

View File

@ -126,8 +126,10 @@ public:
m_pcbSettings = dynamic_cast<PCB_RENDER_SETTINGS*> ( aSettings ); m_pcbSettings = dynamic_cast<PCB_RENDER_SETTINGS*> ( aSettings );
} }
protected: /// @copydoc PAINTER::GetColor()
virtual const COLOR4D& GetColor( const VIEW_ITEM* aItem, int aLayer );
protected:
PCB_RENDER_SETTINGS* m_pcbSettings; PCB_RENDER_SETTINGS* m_pcbSettings;
/// @copydoc PAINTER::getLayerColor() /// @copydoc PAINTER::getLayerColor()