Sort VIEW_GROUP drawing by layer order
Fixes: lp:1757146 * https://bugs.launchpad.net/kicad/+bug/1757146
This commit is contained in:
parent
1cd64778d6
commit
1dd4af2972
|
@ -105,28 +105,54 @@ void VIEW_GROUP::ViewDraw( int aLayer, VIEW* aView ) const
|
||||||
|
|
||||||
const auto drawList = updateDrawList();
|
const auto drawList = updateDrawList();
|
||||||
|
|
||||||
// Draw all items immediately (without caching)
|
std::unordered_map<int, std::vector<VIEW_ITEM*>> layer_item_map;
|
||||||
|
|
||||||
|
// Build a list of layers used by the items in the group
|
||||||
for( auto item : drawList )
|
for( auto item : drawList )
|
||||||
{
|
{
|
||||||
gal->PushDepth();
|
int item_layers[VIEW::VIEW_MAX_LAYERS], item_layers_count;
|
||||||
|
item->ViewGetLayers( item_layers, item_layers_count );
|
||||||
|
|
||||||
int layers[VIEW::VIEW_MAX_LAYERS], layers_count;
|
for( int i = 0; i < item_layers_count; i++ )
|
||||||
item->ViewGetLayers( layers, layers_count );
|
|
||||||
aView->SortLayers( layers, layers_count );
|
|
||||||
|
|
||||||
for( int i = 0; i < layers_count; i++ )
|
|
||||||
{
|
{
|
||||||
if( aView->IsLayerVisible( layers[i] ) )
|
if( layer_item_map.count( item_layers[i] ) == 0 )
|
||||||
{
|
{
|
||||||
gal->AdvanceDepth();
|
layer_item_map.emplace( std::make_pair( item_layers[i],
|
||||||
|
std::vector<VIEW_ITEM*>() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
layer_item_map[ item_layers[i] ].push_back( item );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int layers[VIEW::VIEW_MAX_LAYERS], layers_count = 0;
|
||||||
|
|
||||||
|
for( const auto& entry : layer_item_map )
|
||||||
|
{
|
||||||
|
layers[ layers_count++ ] = entry.first;
|
||||||
|
}
|
||||||
|
|
||||||
|
aView->SortLayers( layers, layers_count );
|
||||||
|
|
||||||
|
// Now draw the layers in sorted order
|
||||||
|
|
||||||
|
gal->PushDepth();
|
||||||
|
|
||||||
|
for( int i = 0; i < layers_count; i++ )
|
||||||
|
{
|
||||||
|
if( aView->IsLayerVisible( layers[i] ) )
|
||||||
|
{
|
||||||
|
gal->AdvanceDepth();
|
||||||
|
|
||||||
|
for( auto item : layer_item_map[ layers[i] ] )
|
||||||
|
{
|
||||||
if( !painter->Draw( item, layers[i] ) )
|
if( !painter->Draw( item, layers[i] ) )
|
||||||
item->ViewDraw( layers[i], aView ); // Alternative drawing method
|
item->ViewDraw( layers[i], aView ); // Alternative drawing method
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gal->PopDepth();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gal->PopDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue