Turned on group recaching on GAL change.

This commit is contained in:
Maciej Suminski 2013-04-18 17:10:02 +02:00
parent a96c5379b3
commit 5d704c9692
2 changed files with 35 additions and 8 deletions

View File

@ -143,7 +143,7 @@ VIEW::VIEW( bool aIsDynamic, bool aUseGroups ) :
m_dynamic( aIsDynamic ), m_dynamic( aIsDynamic ),
m_useGroups( aUseGroups ) m_useGroups( aUseGroups )
{ {
// By default there is not layer on the top // By default there is no layer on the top
m_topLayer.enabled = false; m_topLayer.enabled = false;
} }
@ -201,6 +201,10 @@ void VIEW::SetGAL( GAL* aGal )
{ {
m_gal = aGal; m_gal = aGal;
// items need to be recached after changing GAL
if( m_useGroups )
itemsRecache();
// force the new GAL to display the current viewport. // force the new GAL to display the current viewport.
SetCenter( m_center ); SetCenter( m_center );
SetScale( m_scale ); SetScale( m_scale );
@ -374,19 +378,14 @@ struct VIEW::drawItem
{ {
group = gal->BeginGroup(); group = gal->BeginGroup();
aItem->m_cachedGroup = group; aItem->m_cachedGroup = group;
aItem->ViewDraw( 0, gal, tmp ); view->m_painter->Draw( static_cast<EDA_ITEM*>( aItem ), currentLayer );
gal->EndGroup(); gal->EndGroup();
gal->DrawGroup( group ); gal->DrawGroup( group );
} }
} }
else if( aItem->ViewIsVisible() ) else if( aItem->ViewIsVisible() )
{ {
if( !( view->m_painter view->m_painter->Draw( static_cast<EDA_ITEM*>( aItem ), currentLayer );
&& view->m_painter->Draw( static_cast<EDA_ITEM*>( aItem ), currentLayer ) ) )
{
// Fallback, if there is no painter or painter does not know how to draw aItem
aItem->ViewDraw( currentLayer, gal, tmp );
}
} }
time += rdtsc() - ts; time += rdtsc() - ts;
@ -445,6 +444,15 @@ struct VIEW::unlinkItem
}; };
struct VIEW::recacheItem
{
void operator()( VIEW_ITEM* aItem )
{
aItem->m_cachedGroup = -1;
}
};
void VIEW::Clear() void VIEW::Clear()
{ {
BOX2I r; BOX2I r;
@ -544,3 +552,18 @@ void VIEW::clearGroupCache()
l->items->Query( r, visitor ); l->items->Query( r, visitor );
}; };
} }
void VIEW::itemsRecache()
{
BOX2I r;
r.SetMaximum();
for( LayerMapIter i = m_layers.begin(); i != m_layers.end(); ++i )
{
VIEW_LAYER* l = & ( ( *i ).second );
recacheItem visitor;
l->items->Query( r, visitor );
};
}

View File

@ -328,6 +328,7 @@ private:
// 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 clearItemCache; struct clearItemCache;
struct unlinkItem; struct unlinkItem;
struct recacheItem;
struct drawItem; struct drawItem;
///* 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
@ -349,6 +350,9 @@ private:
///* Clears cached GAL display lists ///* Clears cached GAL display lists
void clearGroupCache(); void clearGroupCache();
///* Rebuilds GAL display lists
void itemsRecache();
/// Determines rendering order of layers. Used in display order sorting function. /// Determines rendering order of layers. Used in display order sorting function.
static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j ) static bool compareRenderingOrder( VIEW_LAYER* i, VIEW_LAYER* j )
{ {