Loading common/view/view.cpp +56 −36 Original line number Original line Diff line number Diff line Loading @@ -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() ); Loading Loading @@ -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; Loading @@ -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 ); Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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 ); Loading include/view/view.h +21 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
common/view/view.cpp +56 −36 Original line number Original line Diff line number Diff line Loading @@ -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() ); Loading Loading @@ -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; Loading @@ -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 ); Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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 ); Loading
include/view/view.h +21 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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