From 54946f46f7b55db5766445cf80a8d93a460c1ff1 Mon Sep 17 00:00:00 2001 From: Maciej Suminski Date: Wed, 2 Oct 2013 13:57:21 +0200 Subject: [PATCH] Fixed memory leak caused by ViewUpdate() with VIEW_ITEM::GEOMETRY/LAYER parameters. --- common/view/view.cpp | 12 +++++++----- include/view/view.h | 2 +- pcbnew/tools/move_tool.cpp | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/view/view.cpp b/common/view/view.cpp index 10d52c62d7..b8c54e3025 100644 --- a/common/view/view.cpp +++ b/common/view/view.cpp @@ -676,9 +676,9 @@ struct VIEW::unlinkItem }; -struct VIEW::recacheLayer +struct VIEW::recacheItem { - recacheLayer( VIEW* aView, GAL* aGal, int aLayer, bool aImmediately ) : + recacheItem( VIEW* aView, GAL* aGal, int aLayer, bool aImmediately ) : view( aView ), gal( aGal ), layer( aLayer ), immediately( aImmediately ) { } @@ -688,9 +688,7 @@ struct VIEW::recacheLayer // Remove previously cached group int prevGroup = aItem->getGroup( layer ); if( prevGroup >= 0 ) - { gal->DeleteGroup( prevGroup ); - } if( immediately ) { @@ -882,6 +880,10 @@ void VIEW::updateItemGeometry( VIEW_ITEM* aItem, int aLayer ) m_gal->SetLayerDepth( l.renderingOrder ); // Redraw the item from scratch + int prevGroup = aItem->getGroup( aLayer ); + if( prevGroup >= 0 ) + m_gal->DeleteGroup( prevGroup ); + int group = m_gal->BeginGroup(); aItem->setGroup( aLayer, group ); m_painter->Draw( static_cast( aItem ), aLayer ); @@ -966,7 +968,7 @@ void VIEW::RecacheAllItems( bool aImmediately ) { m_gal->SetTarget( l->target ); m_gal->SetLayerDepth( l->renderingOrder ); - recacheLayer visitor( this, m_gal, l->id, aImmediately ); + recacheItem visitor( this, m_gal, l->id, aImmediately ); l->items->Query( r, visitor ); MarkTargetDirty( l->target ); } diff --git a/include/view/view.h b/include/view/view.h index 0dd12e803a..9abf733f47 100644 --- a/include/view/view.h +++ b/include/view/view.h @@ -500,7 +500,7 @@ private: // Function objects that need to access VIEW/VIEW_ITEM private/protected members struct clearLayerCache; - struct recacheLayer; + struct recacheItem; struct drawItem; struct unlinkItem; struct updateItemsColor; diff --git a/pcbnew/tools/move_tool.cpp b/pcbnew/tools/move_tool.cpp index 39324538d1..6642984ca1 100644 --- a/pcbnew/tools/move_tool.cpp +++ b/pcbnew/tools/move_tool.cpp @@ -78,7 +78,7 @@ bool MOVE_TOOL::Init() int MOVE_TOOL::Main( TOOL_EVENT& aEvent ) { - const SELECTION_TOOL::SELECTION selection = m_selectionTool->GetSelection(); + const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection(); if( selection.Empty() ) return 0; // there are no items to operate on