Performance enhancements for PCBNew scrolling and zooming.
Fixes https://gitlab.com/kicad/code/kicad/issues/5136
This commit is contained in:
parent
e1c449902d
commit
9716c62e32
|
@ -412,9 +412,11 @@ LSEQ LSET::Seq() const
|
||||||
{
|
{
|
||||||
LSEQ ret;
|
LSEQ ret;
|
||||||
|
|
||||||
for( unsigned i=0; i<size(); ++i )
|
ret.reserve( size() );
|
||||||
|
|
||||||
|
for( unsigned i = 0; i < size(); ++i )
|
||||||
{
|
{
|
||||||
if( test(i) )
|
if( test( i ) )
|
||||||
ret.push_back( PCB_LAYER_ID( i ) );
|
ret.push_back( PCB_LAYER_ID( i ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -312,12 +312,22 @@ VIEW::VIEW( bool aIsDynamic ) :
|
||||||
// Redraw everything at the beginning
|
// Redraw everything at the beginning
|
||||||
MarkDirty();
|
MarkDirty();
|
||||||
|
|
||||||
|
m_layers.reserve( VIEW_MAX_LAYERS );
|
||||||
|
|
||||||
// View uses layers to display EDA_ITEMs (item may be displayed on several layers, for example
|
// View uses layers to display EDA_ITEMs (item may be displayed on several layers, for example
|
||||||
// pad may be shown on pad, pad hole and solder paste layers). There are usual copper layers
|
// pad may be shown on pad, pad hole and solder paste layers). There are usual copper layers
|
||||||
// (eg. F.Cu, B.Cu, internal and so on) and layers for displaying objects such as texts,
|
// (eg. F.Cu, B.Cu, internal and so on) and layers for displaying objects such as texts,
|
||||||
// silkscreen, pads, vias, etc.
|
// silkscreen, pads, vias, etc.
|
||||||
for( int i = 0; i < VIEW_MAX_LAYERS; i++ )
|
for( int ii = 0; ii < VIEW_MAX_LAYERS; ++ii )
|
||||||
AddLayer( i );
|
{
|
||||||
|
m_layers.emplace_back();
|
||||||
|
m_layers[ii].items = std::make_shared<VIEW_RTREE>();
|
||||||
|
m_layers[ii].id = ii;
|
||||||
|
m_layers[ii].renderingOrder = ii;
|
||||||
|
m_layers[ii].visible = true;
|
||||||
|
m_layers[ii].displayOnly = false;
|
||||||
|
m_layers[ii].target = TARGET_CACHED;
|
||||||
|
}
|
||||||
|
|
||||||
sortLayers();
|
sortLayers();
|
||||||
|
|
||||||
|
@ -332,21 +342,6 @@ VIEW::~VIEW()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void VIEW::AddLayer( int aLayer, bool aDisplayOnly )
|
|
||||||
{
|
|
||||||
if( m_layers.find( aLayer ) == m_layers.end() )
|
|
||||||
{
|
|
||||||
m_layers[aLayer] = VIEW_LAYER();
|
|
||||||
m_layers[aLayer].items.reset( new VIEW_RTREE() );
|
|
||||||
m_layers[aLayer].id = aLayer;
|
|
||||||
m_layers[aLayer].renderingOrder = aLayer;
|
|
||||||
m_layers[aLayer].visible = true;
|
|
||||||
m_layers[aLayer].displayOnly = aDisplayOnly;
|
|
||||||
m_layers[aLayer].target = TARGET_CACHED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void VIEW::Add( VIEW_ITEM* aItem, int aDrawPriority )
|
void VIEW::Add( VIEW_ITEM* aItem, int aDrawPriority )
|
||||||
{
|
{
|
||||||
int layers[VIEW_MAX_LAYERS], layers_count;
|
int layers[VIEW_MAX_LAYERS], layers_count;
|
||||||
|
@ -709,25 +704,22 @@ void VIEW::SortLayers( int aLayers[], int& aCount ) const
|
||||||
|
|
||||||
void VIEW::ReorderLayerData( std::unordered_map<int, int> aReorderMap )
|
void VIEW::ReorderLayerData( std::unordered_map<int, int> aReorderMap )
|
||||||
{
|
{
|
||||||
LAYER_MAP new_map;
|
std::vector<VIEW_LAYER> new_map;
|
||||||
|
new_map.reserve( m_layers.size() );
|
||||||
|
|
||||||
for( const auto& it : m_layers )
|
for( int ii = 0; ii < VIEW_MAX_LAYERS; ++ii )
|
||||||
|
new_map.emplace_back();
|
||||||
|
|
||||||
|
for( const VIEW_LAYER& layer : m_layers )
|
||||||
{
|
{
|
||||||
int orig_idx = it.first;
|
int orig_idx = layer.id;
|
||||||
VIEW_LAYER layer = it.second;
|
int new_idx = orig_idx;
|
||||||
int new_idx;
|
|
||||||
|
|
||||||
try
|
if( aReorderMap.count( orig_idx ) )
|
||||||
{
|
|
||||||
new_idx = aReorderMap.at( orig_idx );
|
new_idx = aReorderMap.at( orig_idx );
|
||||||
}
|
|
||||||
catch( const std::out_of_range& )
|
|
||||||
{
|
|
||||||
new_idx = orig_idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
layer.id = new_idx;
|
|
||||||
new_map[new_idx] = layer;
|
new_map[new_idx] = layer;
|
||||||
|
new_map[new_idx].id = new_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_layers = new_map;
|
m_layers = new_map;
|
||||||
|
@ -1118,8 +1110,8 @@ void VIEW::Clear()
|
||||||
r.SetMaximum();
|
r.SetMaximum();
|
||||||
m_allItems->clear();
|
m_allItems->clear();
|
||||||
|
|
||||||
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
|
for( VIEW_LAYER& layer : m_layers )
|
||||||
i->second.items->RemoveAll();
|
layer.items->RemoveAll();
|
||||||
|
|
||||||
m_nextDrawPriority = 0;
|
m_nextDrawPriority = 0;
|
||||||
|
|
||||||
|
@ -1209,11 +1201,8 @@ void VIEW::clearGroupCache()
|
||||||
r.SetMaximum();
|
r.SetMaximum();
|
||||||
clearLayerCache visitor( this );
|
clearLayerCache visitor( this );
|
||||||
|
|
||||||
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
|
for( VIEW_LAYER& layer : m_layers )
|
||||||
{
|
layer.items->Query( r, visitor );
|
||||||
VIEW_LAYER* l = &( ( *i ).second );
|
|
||||||
l->items->Query( r, visitor );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1268,8 +1257,8 @@ void VIEW::sortLayers()
|
||||||
|
|
||||||
m_orderedLayers.resize( m_layers.size() );
|
m_orderedLayers.resize( m_layers.size() );
|
||||||
|
|
||||||
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
|
for( VIEW_LAYER& layer : m_layers )
|
||||||
m_orderedLayers[n++] = &i->second;
|
m_orderedLayers[n++] = &layer;
|
||||||
|
|
||||||
sort( m_orderedLayers.begin(), m_orderedLayers.end(), compareRenderingOrder );
|
sort( m_orderedLayers.begin(), m_orderedLayers.end(), compareRenderingOrder );
|
||||||
|
|
||||||
|
@ -1409,14 +1398,12 @@ void VIEW::RecacheAllItems()
|
||||||
|
|
||||||
r.SetMaximum();
|
r.SetMaximum();
|
||||||
|
|
||||||
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
|
for( const VIEW_LAYER& l : m_layers )
|
||||||
{
|
{
|
||||||
VIEW_LAYER* l = &( ( *i ).second );
|
if( IsCached( l.id ) )
|
||||||
|
|
||||||
if( IsCached( l->id ) )
|
|
||||||
{
|
{
|
||||||
recacheItem visitor( this, m_gal, l->id );
|
recacheItem visitor( this, m_gal, l.id );
|
||||||
l->items->Query( r, visitor );
|
l.items->Query( r, visitor );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -368,22 +368,6 @@ public:
|
||||||
*/
|
*/
|
||||||
const VECTOR2I& GetScreenPixelSize() const;
|
const VECTOR2I& GetScreenPixelSize() const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Function AddLayer()
|
|
||||||
* Adds a new layer to the view.
|
|
||||||
* @param aLayer: unique ID of the layer to be added.
|
|
||||||
* @param aDisplayOnly: layer is display-only (example: selection boxes, floating hints/menus).
|
|
||||||
* Objects belonging to this layer are not taken into account by Query() method.
|
|
||||||
*/
|
|
||||||
void AddLayer( int aLayer, bool aDisplayOnly = false );
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Function ClearLayer()
|
|
||||||
* Removes all items from a given layer.
|
|
||||||
* @param aLayer: ID of the layer to be cleared
|
|
||||||
*/
|
|
||||||
void ClearLayer( int aLayer );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function Clear()
|
* Function Clear()
|
||||||
* Removes all items from the view.
|
* Removes all items from the view.
|
||||||
|
@ -717,12 +701,6 @@ protected:
|
||||||
std::set<int> requiredLayers; ///< layers that have to be enabled to show the layer
|
std::set<int> requiredLayers; ///< layers that have to be enabled to show the layer
|
||||||
};
|
};
|
||||||
|
|
||||||
// Convenience typedefs
|
|
||||||
typedef std::unordered_map<int, VIEW_LAYER> LAYER_MAP;
|
|
||||||
typedef LAYER_MAP::iterator LAYER_MAP_ITER;
|
|
||||||
typedef std::vector<VIEW_LAYER*> LAYER_ORDER;
|
|
||||||
typedef std::vector<VIEW_LAYER*>::iterator LAYER_ORDER_ITER;
|
|
||||||
|
|
||||||
// Function objects that need to access VIEW/VIEW_ITEM private/protected members
|
// Function objects that need to access VIEW/VIEW_ITEM private/protected members
|
||||||
struct clearLayerCache;
|
struct clearLayerCache;
|
||||||
struct recacheItem;
|
struct recacheItem;
|
||||||
|
@ -816,14 +794,14 @@ protected:
|
||||||
bool m_enableOrderModifier;
|
bool m_enableOrderModifier;
|
||||||
|
|
||||||
/// Contains set of possible displayed layers and its properties
|
/// Contains set of possible displayed layers and its properties
|
||||||
LAYER_MAP m_layers;
|
std::vector<VIEW_LAYER> m_layers;
|
||||||
|
|
||||||
|
/// Sorted list of pointers to members of m_layers
|
||||||
|
std::vector<VIEW_LAYER*> m_orderedLayers;
|
||||||
|
|
||||||
/// Flat list of all items
|
/// Flat list of all items
|
||||||
std::shared_ptr<std::vector<VIEW_ITEM*>> m_allItems;
|
std::shared_ptr<std::vector<VIEW_ITEM*>> m_allItems;
|
||||||
|
|
||||||
/// Sorted list of pointers to members of m_layers
|
|
||||||
LAYER_ORDER m_orderedLayers;
|
|
||||||
|
|
||||||
/// Stores set of layers that are displayed on the top
|
/// Stores set of layers that are displayed on the top
|
||||||
std::set<unsigned int> m_topLayers;
|
std::set<unsigned int> m_topLayers;
|
||||||
|
|
||||||
|
|
|
@ -604,16 +604,23 @@ unsigned int VIA::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
|
||||||
if( IsNetnameLayer( aLayer ) )
|
if( IsNetnameLayer( aLayer ) )
|
||||||
return m_Width == 0 ? HIDE : ( Millimeter2iu( 10 ) / m_Width );
|
return m_Width == 0 ? HIDE : ( Millimeter2iu( 10 ) / m_Width );
|
||||||
|
|
||||||
LSET visibleLayers;
|
bool onVisibleLayer = false;
|
||||||
|
|
||||||
for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
|
PCB_LAYER_ID top;
|
||||||
|
PCB_LAYER_ID bottom;
|
||||||
|
LayerPair( &top, &bottom );
|
||||||
|
|
||||||
|
for( int layer = top; layer <= bottom; ++layer )
|
||||||
{
|
{
|
||||||
if( aView->IsLayerVisible( i ) )
|
if( aView->IsLayerVisible( layer ) )
|
||||||
visibleLayers.set( i );
|
{
|
||||||
|
onVisibleLayer = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only draw the via if at least one of the layers it crosses is being displayed
|
// Only draw the via if at least one of the layers it crosses is being displayed
|
||||||
if( ( visibleLayers & GetLayerSet() ).any() && aView->IsLayerVisible( LAYER_VIAS ) )
|
if( onVisibleLayer && aView->IsLayerVisible( LAYER_VIAS ) )
|
||||||
{
|
{
|
||||||
switch( m_ViaType )
|
switch( m_ViaType )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue