Functions for direct item drawing.
This commit is contained in:
parent
aabd2a46d0
commit
e697a2c41c
|
@ -89,6 +89,53 @@ void VIEW::Remove( VIEW_ITEM* aItem )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VIEW::Draw( VIEW_ITEM* aItem, int aLayer ) const
|
||||||
|
{
|
||||||
|
if( isCached( aLayer ) )
|
||||||
|
{
|
||||||
|
// Draw using cached information or create one
|
||||||
|
int group = aItem->getGroup( aLayer );
|
||||||
|
|
||||||
|
if( group >= 0 )
|
||||||
|
{
|
||||||
|
m_gal->DrawGroup( group );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
group = m_gal->BeginGroup();
|
||||||
|
aItem->setGroup( aLayer, group );
|
||||||
|
if( !m_painter->Draw( aItem, aLayer ) )
|
||||||
|
aItem->ViewDraw( aLayer, m_gal, BOX2I() ); // Alternative drawing method
|
||||||
|
m_gal->EndGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Immediate mode
|
||||||
|
if( !m_painter->Draw( aItem, aLayer ) )
|
||||||
|
aItem->ViewDraw( aLayer, m_gal, BOX2I() ); // Alternative drawing method
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draws a bright contour around the item
|
||||||
|
if( static_cast<const EDA_ITEM*>( aItem )->IsBrightened() )
|
||||||
|
{
|
||||||
|
m_painter->DrawBrightened( aItem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void VIEW::Draw( VIEW_ITEM* aItem ) const
|
||||||
|
{
|
||||||
|
int layers[VIEW_MAX_LAYERS], layers_count;
|
||||||
|
aItem->ViewGetLayers( layers, layers_count );
|
||||||
|
|
||||||
|
for( int i = 0; i < layers_count; ++i )
|
||||||
|
{
|
||||||
|
Draw( aItem, layers[i] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void VIEW::SetRequired( int aLayerId, int aRequiredId, bool aRequired )
|
void VIEW::SetRequired( int aLayerId, int aRequiredId, bool aRequired )
|
||||||
{
|
{
|
||||||
wxASSERT( (unsigned) aLayerId < m_layers.size() );
|
wxASSERT( (unsigned) aLayerId < m_layers.size() );
|
||||||
|
@ -337,7 +384,7 @@ struct VIEW::updateItemsColor
|
||||||
void VIEW::UpdateLayerColor( int aLayer )
|
void VIEW::UpdateLayerColor( int aLayer )
|
||||||
{
|
{
|
||||||
// There is no point in updating non-cached layers
|
// There is no point in updating non-cached layers
|
||||||
if( m_layers[aLayer].target != TARGET_CACHED )
|
if( !isCached( aLayer ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BOX2I r;
|
BOX2I r;
|
||||||
|
@ -360,7 +407,7 @@ void VIEW::UpdateAllLayersColor()
|
||||||
VIEW_LAYER* l = &( ( *i ).second );
|
VIEW_LAYER* l = &( ( *i ).second );
|
||||||
|
|
||||||
// There is no point in updating non-cached layers
|
// There is no point in updating non-cached layers
|
||||||
if( l->target != TARGET_CACHED )
|
if( !isCached( l->id ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
updateItemsColor visitor( l->id, m_painter, m_gal );
|
updateItemsColor visitor( l->id, m_painter, m_gal );
|
||||||
|
@ -392,7 +439,7 @@ struct VIEW::changeItemsDepth
|
||||||
void VIEW::ChangeLayerDepth( int aLayer, int aDepth )
|
void VIEW::ChangeLayerDepth( int aLayer, int aDepth )
|
||||||
{
|
{
|
||||||
// There is no point in updating non-cached layers
|
// There is no point in updating non-cached layers
|
||||||
if( m_layers[aLayer].target != TARGET_CACHED )
|
if( !isCached( aLayer ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
BOX2I r;
|
BOX2I r;
|
||||||
|
@ -488,43 +535,13 @@ struct VIEW::drawItem
|
||||||
|
|
||||||
void operator()( VIEW_ITEM* aItem )
|
void operator()( VIEW_ITEM* aItem )
|
||||||
{
|
{
|
||||||
GAL* gal = view->GetGAL();
|
|
||||||
|
|
||||||
// Conditions that have te be fulfilled for an item to be drawn
|
// Conditions that have te be fulfilled for an item to be drawn
|
||||||
bool drawCondition = aItem->ViewIsVisible() &&
|
bool drawCondition = aItem->ViewIsVisible() &&
|
||||||
aItem->ViewGetLOD( currentLayer->id ) < view->m_scale;
|
aItem->ViewGetLOD( currentLayer->id ) < view->m_scale;
|
||||||
if( !drawCondition )
|
if( !drawCondition )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( currentLayer->target == TARGET_CACHED )
|
view->Draw( aItem, currentLayer->id );
|
||||||
{
|
|
||||||
// Draw using cached information or create one
|
|
||||||
int group = aItem->getGroup( currentLayer->id );
|
|
||||||
|
|
||||||
if( group >= 0 )
|
|
||||||
{
|
|
||||||
gal->DrawGroup( group );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
group = gal->BeginGroup();
|
|
||||||
aItem->setGroup( currentLayer->id, group );
|
|
||||||
if( !view->m_painter->Draw( aItem, currentLayer->id ) )
|
|
||||||
aItem->ViewDraw( currentLayer->id, gal, BOX2I() ); // Alternative drawing method
|
|
||||||
gal->EndGroup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Immediate mode
|
|
||||||
if( !view->m_painter->Draw( aItem, currentLayer->id ) )
|
|
||||||
aItem->ViewDraw( currentLayer->id, gal, BOX2I() ); // Alternative drawing method
|
|
||||||
}
|
|
||||||
|
|
||||||
if( static_cast<const EDA_ITEM*>( aItem )->IsBrightened() )
|
|
||||||
{
|
|
||||||
view->m_painter->DrawBrightened( aItem );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const VIEW_LAYER* currentLayer;
|
const VIEW_LAYER* currentLayer;
|
||||||
|
@ -691,7 +708,10 @@ void VIEW::invalidateItem( VIEW_ITEM* aItem, int aUpdateFlags )
|
||||||
}
|
}
|
||||||
else if( aUpdateFlags == VIEW_ITEM::GEOMETRY )
|
else if( aUpdateFlags == VIEW_ITEM::GEOMETRY )
|
||||||
{
|
{
|
||||||
updateItemGeometry( aItem, layers[i]);
|
// Reinsert item
|
||||||
|
Remove( aItem );
|
||||||
|
Add( aItem );
|
||||||
|
updateItemGeometry( aItem, layers[i]); /// TODO is it still necessary?
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark those layers as dirty, so the VIEW will be refreshed
|
// Mark those layers as dirty, so the VIEW will be refreshed
|
||||||
|
@ -766,7 +786,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
|
||||||
VIEW_LAYER* l = & ( ( *i ).second );
|
VIEW_LAYER* l = & ( ( *i ).second );
|
||||||
|
|
||||||
// Obviously, there is only one cached target that has to be recomputed
|
// Obviously, there is only one cached target that has to be recomputed
|
||||||
if( l->target == TARGET_CACHED )
|
if( isCached( l->id ) )
|
||||||
{
|
{
|
||||||
m_gal->SetTarget( l->target );
|
m_gal->SetTarget( l->target );
|
||||||
m_gal->SetLayerDepth( l->renderingOrder );
|
m_gal->SetLayerDepth( l->renderingOrder );
|
||||||
|
|
|
@ -89,11 +89,25 @@ public:
|
||||||
* Finds all visible items that touch or are within the rectangle aRect.
|
* Finds all visible items that touch or are within the rectangle aRect.
|
||||||
* @param aRect area to search for items
|
* @param aRect area to search for items
|
||||||
* @param aResult result of the search, containing VIEW_ITEMs associated with their layers.
|
* @param aResult result of the search, containing VIEW_ITEMs associated with their layers.
|
||||||
* Sorted according to the rendering order (items that are on top of the rendering stack as first).
|
* Sorted according to the rendering order (items that are on top of the rendering stack as
|
||||||
|
* first).
|
||||||
* @return Number of found items.
|
* @return Number of found items.
|
||||||
*/
|
*/
|
||||||
int Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult );
|
int Query( const BOX2I& aRect, std::vector<LayerItemPair>& aResult );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Draw()
|
||||||
|
* Draws an item, but on a specified layers. It has to be marked that some of drawing settings
|
||||||
|
* are based on the layer on which an item is drawn.
|
||||||
|
*/
|
||||||
|
void Draw( VIEW_ITEM* aItem, int aLayer ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Draw()
|
||||||
|
* Draws an item on all layers that the item uses.
|
||||||
|
*/
|
||||||
|
void Draw( VIEW_ITEM* aItem ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function SetRequired()
|
* Function SetRequired()
|
||||||
* Marks the aRequiredId layer as required for the aLayerId layer. In order to display the
|
* Marks the aRequiredId layer as required for the aLayerId layer. In order to display the
|
||||||
|
@ -442,6 +456,12 @@ private:
|
||||||
/// Checks if every layer required by the aLayerId layer is enabled.
|
/// Checks if every layer required by the aLayerId layer is enabled.
|
||||||
bool areRequiredLayersEnabled( int aLayerId ) const;
|
bool areRequiredLayersEnabled( int aLayerId ) const;
|
||||||
|
|
||||||
|
/// Returns true if the layer is cached
|
||||||
|
inline bool isCached( int aLayer ) const
|
||||||
|
{
|
||||||
|
return ( m_layers.at( aLayer ).target == TARGET_CACHED );
|
||||||
|
}
|
||||||
|
|
||||||
/// Contains set of possible displayed layers and its properties
|
/// Contains set of possible displayed layers and its properties
|
||||||
LayerMap m_layers;
|
LayerMap m_layers;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue