Different approach to item recaching.

This commit is contained in:
Maciej Suminski 2013-08-07 17:20:01 +02:00
parent ee80c7f674
commit 8c37e70889
3 changed files with 65 additions and 48 deletions

View File

@ -324,7 +324,7 @@ struct VIEW::updateItemsColor
const COLOR4D color = painter->GetColor( aItem, layer ); const COLOR4D color = painter->GetColor( aItem, layer );
int group = aItem->getGroup( layer ); int group = aItem->getGroup( layer );
if( group > 0) if( group >= 0 )
gal->ChangeGroupColor( group, color ); gal->ChangeGroupColor( group, color );
} }
@ -539,8 +539,8 @@ void VIEW::redrawRect( const BOX2I& aRect )
m_gal->SetTarget( l->target ); m_gal->SetTarget( l->target );
m_gal->SetLayerDepth( l->renderingOrder ); m_gal->SetLayerDepth( l->renderingOrder );
l->items->Query( aRect, drawFunc ); l->items->Query( aRect, drawFunc );
l->isDirty = false;
} }
l->isDirty = false;
} }
} }
@ -638,49 +638,6 @@ VECTOR2D VIEW::GetScreenPixelSize() const
} }
void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
{
int layer_indices[VIEW_MAX_LAYERS], layer_count;
aItem->ViewGetLayers( layer_indices, layer_count );
for( int i = 0; i < layer_count; i++ )
{
// Iterate through the layers used by the item
if( m_layers.find( layer_indices[i] ) != m_layers.end() )
{
VIEW_LAYER* l = &m_layers[layer_indices[i]];
// Mark the area occupied by the item as dirty
l->dirtyExtents =
l->isDirty ? aItem->ViewBBox() : l->dirtyExtents.Merge( aItem->ViewBBox() );
l->isDirty = true;
// If geometry has to be updated, then we need to reinsert the item
if( aUpdateFlags & VIEW_ITEM::GEOMETRY )
{
l->items->Remove( aItem );
l->items->Insert( aItem );
}
}
}
// Remove all the groups, so the item will be recached
if( aItem->storesGroups() )
{
// Clear the cached groups stored in GAL
std::vector<int> groups = aItem->getAllGroups();
for( std::vector<int>::iterator i = groups.begin(); i != groups.end(); i++ )
{
m_gal->DeleteGroup( *i );
}
aItem->deleteGroups();
}
}
struct VIEW::clearLayerCache struct VIEW::clearLayerCache
{ {
clearLayerCache( VIEW* aView ) : clearLayerCache( VIEW* aView ) :
@ -715,14 +672,67 @@ void VIEW::clearGroupCache()
} }
void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
{
int layers[VIEW_MAX_LAYERS], layers_count;
aItem->ViewGetLayers( layers, layers_count );
// Iterate through layers used by the item and recache it immediately
for( int i = 0; i < layers_count; i++ )
{
if( aUpdateFlags == VIEW_ITEM::APPEARANCE )
{
updateItemAppearance( aItem, layers[i] );
}
else if( aUpdateFlags == VIEW_ITEM::GEOMETRY )
{
updateItemGeometry( aItem, layers[i]);
}
// Mark those layers as dirty, so the VIEW will be refreshed
m_layers[layers[i]].isDirty = true;
}
}
void VIEW::updateItemAppearance( VIEW_ITEM* aItem, int aLayer )
{
wxASSERT( (unsigned) aLayer < m_layers.size() );
// Obtain the color that should be used for coloring the item on the specific layerId
const COLOR4D color = m_painter->GetColor( aItem, aLayer );
int group = aItem->getGroup( aLayer );
// Change the color, only if it has group assigned
if( group >= 0 )
m_gal->ChangeGroupColor( group, color );
}
void VIEW::updateItemGeometry( VIEW_ITEM* aItem, int aLayer )
{
wxASSERT( (unsigned) aLayer < m_layers.size() );
VIEW_LAYER& l = m_layers.at( aLayer );
m_gal->SetTarget( l.target );
m_gal->SetLayerDepth( l.renderingOrder );
// Redraw the item from scratch
int group = m_gal->BeginGroup();
aItem->setGroup( aLayer, group );
m_painter->Draw( static_cast<EDA_ITEM*>( aItem ), aLayer );
m_gal->EndGroup();
}
bool VIEW::areRequiredLayersEnabled( int aLayerId ) const bool VIEW::areRequiredLayersEnabled( int aLayerId ) const
{ {
wxASSERT( (unsigned) aLayerId < m_layers.size() ); wxASSERT( (unsigned) aLayerId < m_layers.size() );
std::set<int>::iterator it, it_end; std::set<int>::iterator it, it_end;
for( it = m_layers.at( aLayerId ).requiredLayers.begin(), it_end = m_layers.at( aLayerId ).requiredLayers.end(); for( it = m_layers.at( aLayerId ).requiredLayers.begin(),
it != it_end; ++it ) it_end = m_layers.at( aLayerId ).requiredLayers.end(); it != it_end; ++it )
{ {
// That is enough if just one layer is not enabled // That is enough if just one layer is not enabled
if( !m_layers.at( *it ).enabled ) if( !m_layers.at( *it ).enabled )

View File

@ -125,6 +125,7 @@ void VIEW_ITEM::setGroup( int aLayer, int aId )
void VIEW_ITEM::deleteGroups() void VIEW_ITEM::deleteGroups()
{ {
delete[] m_groups; delete[] m_groups;
m_groups = NULL;
m_groupsSize = 0; m_groupsSize = 0;
} }

View File

@ -369,7 +369,7 @@ public:
* Tells if the VIEW is dynamic (ie. can be changed, for example displaying PCBs in a window) * Tells if the VIEW is dynamic (ie. can be changed, for example displaying PCBs in a window)
* or static (that cannot be modified, eg. displaying image/PDF). * or static (that cannot be modified, eg. displaying image/PDF).
*/ */
bool IsDynamic() const { return m_dynamic; } bool IsDynamic() const { return m_dynamic; }
/** /**
* Function IsDirty() * Function IsDirty()
@ -427,6 +427,12 @@ private:
///* used by GAL) ///* used by GAL)
void clearGroupCache(); void clearGroupCache();
/// Updates colors that are used for an item to be drawn
void updateItemAppearance( VIEW_ITEM* aItem, int aLayer );
/// Updates all informations needed to draw an item
void updateItemGeometry( VIEW_ITEM* aItem, int aLayer );
/// 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 )
{ {