Kaydet (Commit) 2b19544e authored tarafından Noel Grandin's avatar Noel Grandin

use std::unique_ptr in vcl::Animation and vcl::MenuItemList

Change-Id: I0d682bcf3bd9d5f4852675fd0d6b61f10ea4f7de
Reviewed-on: https://gerrit.libreoffice.org/43455Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
Tested-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 4e9ebc6d
...@@ -169,8 +169,8 @@ public: ...@@ -169,8 +169,8 @@ public:
private: private:
SAL_DLLPRIVATE static sal_uLong mnAnimCount; SAL_DLLPRIVATE static sal_uLong mnAnimCount;
std::vector< AnimationBitmap* > maList; std::vector< std::unique_ptr<AnimationBitmap> > maList;
std::vector< ImplAnimView* > maViewList; std::vector< std::unique_ptr<ImplAnimView> > maViewList;
Link<Animation*,void> maNotifyLink; Link<Animation*,void> maNotifyLink;
BitmapEx maBitmapEx; BitmapEx maBitmapEx;
......
...@@ -66,11 +66,12 @@ private: ...@@ -66,11 +66,12 @@ private:
bool mbHMirr; bool mbHMirr;
bool mbVMirr; bool mbVMirr;
public:
~ImplAnimView();
private: private:
ImplAnimView( Animation* pParent, OutputDevice* pOut, ImplAnimView( Animation* pParent, OutputDevice* pOut,
const Point& rPt, const Size& rSz, sal_uLong nExtraData, const Point& rPt, const Size& rSz, sal_uLong nExtraData,
OutputDevice* pFirstFrameOutDev = nullptr ); OutputDevice* pFirstFrameOutDev = nullptr );
~ImplAnimView();
bool matches( OutputDevice* pOut, long nExtraData ) const; bool matches( OutputDevice* pOut, long nExtraData ) const;
void drawToPos( sal_uLong nPos ); void drawToPos( sal_uLong nPos );
......
...@@ -79,8 +79,8 @@ Animation::Animation( const Animation& rAnimation ) : ...@@ -79,8 +79,8 @@ Animation::Animation( const Animation& rAnimation ) :
mbLoopTerminated ( rAnimation.mbLoopTerminated ) mbLoopTerminated ( rAnimation.mbLoopTerminated )
{ {
for(const AnimationBitmap* i : rAnimation.maList) for(auto const & i : rAnimation.maList)
maList.push_back( new AnimationBitmap( *i ) ); maList.emplace_back( new AnimationBitmap( *i ) );
maTimer.SetInvokeHandler( LINK( this, Animation, ImplTimeoutHdl ) ); maTimer.SetInvokeHandler( LINK( this, Animation, ImplTimeoutHdl ) );
mnLoops = mbLoopTerminated ? 0 : mnLoopCount; mnLoops = mbLoopTerminated ? 0 : mnLoopCount;
...@@ -88,23 +88,16 @@ Animation::Animation( const Animation& rAnimation ) : ...@@ -88,23 +88,16 @@ Animation::Animation( const Animation& rAnimation ) :
Animation::~Animation() Animation::~Animation()
{ {
if( mbIsInAnimation ) if( mbIsInAnimation )
Stop(); Stop();
for(AnimationBitmap* i : maList)
delete i;
for(ImplAnimView* i : maViewList)
delete i;
} }
Animation& Animation::operator=( const Animation& rAnimation ) Animation& Animation::operator=( const Animation& rAnimation )
{ {
Clear(); Clear();
for(const AnimationBitmap* i : rAnimation.maList) for(auto const & i : rAnimation.maList)
maList.push_back( new AnimationBitmap( *i ) ); maList.emplace_back( new AnimationBitmap( *i ) );
maGlobalSize = rAnimation.maGlobalSize; maGlobalSize = rAnimation.maGlobalSize;
maBitmapEx = rAnimation.maBitmapEx; maBitmapEx = rAnimation.maBitmapEx;
...@@ -147,13 +140,7 @@ void Animation::Clear() ...@@ -147,13 +140,7 @@ void Animation::Clear()
mbIsInAnimation = false; mbIsInAnimation = false;
maGlobalSize = Size(); maGlobalSize = Size();
maBitmapEx.SetEmpty(); maBitmapEx.SetEmpty();
for(AnimationBitmap* i : maList)
delete i;
maList.clear(); maList.clear();
for(ImplAnimView* i : maViewList)
delete i;
maViewList.clear(); maViewList.clear();
} }
...@@ -167,7 +154,7 @@ bool Animation::IsTransparent() const ...@@ -167,7 +154,7 @@ bool Animation::IsTransparent() const
// we need to be transparent, in order to be displayed correctly // we need to be transparent, in order to be displayed correctly
// as the application (?) does not invalidate on non-transparent // as the application (?) does not invalidate on non-transparent
// graphics due to performance reasons. // graphics due to performance reasons.
for(const AnimationBitmap* pAnimBmp : maList) for(auto const & pAnimBmp : maList)
{ {
if( Disposal::Back == pAnimBmp->eDisposal if( Disposal::Back == pAnimBmp->eDisposal
&& tools::Rectangle( pAnimBmp->aPosPix, pAnimBmp->aSizePix ) != aRect && tools::Rectangle( pAnimBmp->aPosPix, pAnimBmp->aSizePix ) != aRect
...@@ -188,7 +175,7 @@ sal_uLong Animation::GetSizeBytes() const ...@@ -188,7 +175,7 @@ sal_uLong Animation::GetSizeBytes() const
{ {
sal_uLong nSizeBytes = GetBitmapEx().GetSizeBytes(); sal_uLong nSizeBytes = GetBitmapEx().GetSizeBytes();
for(const AnimationBitmap* pAnimBmp : maList) for(auto const & pAnimBmp : maList)
{ {
nSizeBytes += pAnimBmp->aBmpEx.GetSizeBytes(); nSizeBytes += pAnimBmp->aBmpEx.GetSizeBytes();
} }
...@@ -211,7 +198,7 @@ BitmapChecksum Animation::GetChecksum() const ...@@ -211,7 +198,7 @@ BitmapChecksum Animation::GetChecksum() const
UInt32ToSVBT32( maGlobalSize.Height(), aBT32 ); UInt32ToSVBT32( maGlobalSize.Height(), aBT32 );
nCrc = vcl_get_checksum( nCrc, aBT32, 4 ); nCrc = vcl_get_checksum( nCrc, aBT32, 4 );
for(const AnimationBitmap* i : maList) for(auto const & i : maList)
{ {
BCToBCOA( i->GetChecksum(), aBCOA ); BCToBCOA( i->GetChecksum(), aBCOA );
nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE ); nCrc = vcl_get_checksum( nCrc, aBCOA, BITMAP_CHECKSUM_SIZE );
...@@ -237,7 +224,7 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe ...@@ -237,7 +224,7 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe
for( size_t i = 0; i < maViewList.size(); ++i ) for( size_t i = 0; i < maViewList.size(); ++i )
{ {
pView = maViewList[ i ]; pView = maViewList[ i ].get();
if( pView->matches( pOut, nExtraData ) ) if( pView->matches( pOut, nExtraData ) )
{ {
if( pView->getOutPos() == rDestPt && if( pView->getOutPos() == rDestPt &&
...@@ -248,7 +235,6 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe ...@@ -248,7 +235,6 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe
} }
else else
{ {
delete maViewList[ i ];
maViewList.erase( maViewList.begin() + i ); maViewList.erase( maViewList.begin() + i );
pView = nullptr; pView = nullptr;
} }
...@@ -265,7 +251,7 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe ...@@ -265,7 +251,7 @@ bool Animation::Start( OutputDevice* pOut, const Point& rDestPt, const Size& rDe
} }
if( !pMatch ) if( !pMatch )
maViewList.push_back( new ImplAnimView( this, pOut, rDestPt, rDestSz, nExtraData, pFirstFrameOutDev ) ); maViewList.emplace_back( new ImplAnimView( this, pOut, rDestPt, rDestSz, nExtraData, pFirstFrameOutDev ) );
if( !mbIsInAnimation ) if( !mbIsInAnimation )
{ {
...@@ -286,11 +272,9 @@ void Animation::Stop( OutputDevice* pOut, long nExtraData ) ...@@ -286,11 +272,9 @@ void Animation::Stop( OutputDevice* pOut, long nExtraData )
{ {
for( size_t i = 0; i < maViewList.size(); ) for( size_t i = 0; i < maViewList.size(); )
{ {
ImplAnimView* pView = maViewList[ i ].get();
ImplAnimView* pView = maViewList[ i ];
if( pView->matches( pOut, nExtraData ) ) if( pView->matches( pOut, nExtraData ) )
{ {
delete pView;
maViewList.erase( maViewList.begin() + i ); maViewList.erase( maViewList.begin() + i );
} }
else else
...@@ -315,7 +299,7 @@ void Animation::Draw( OutputDevice* pOut, const Point& rDestPt, const Size& rDes ...@@ -315,7 +299,7 @@ void Animation::Draw( OutputDevice* pOut, const Point& rDestPt, const Size& rDes
if( nCount ) if( nCount )
{ {
AnimationBitmap* pObj = maList[ std::min( mnPos, nCount - 1 ) ]; AnimationBitmap* pObj = maList[ std::min( mnPos, nCount - 1 ) ].get();
if( pOut->GetConnectMetaFile() if( pOut->GetConnectMetaFile()
|| ( pOut->GetOutDevType() == OUTDEV_PRINTER ) || ( pOut->GetOutDevType() == OUTDEV_PRINTER )
...@@ -352,7 +336,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -352,7 +336,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
if( maNotifyLink.IsSet() ) if( maNotifyLink.IsSet() )
{ {
// create AInfo-List // create AInfo-List
for(ImplAnimView* i : maViewList) for(auto const & i : maViewList)
aAInfoList.push_back( i->createAInfo() ); aAInfoList.push_back( i->createAInfo() );
maNotifyLink.Call( this ); maNotifyLink.Call( this );
...@@ -365,7 +349,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -365,7 +349,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
pView = new ImplAnimView( this, pAInfo->pOutDev, pView = new ImplAnimView( this, pAInfo->pOutDev,
pAInfo->aStartOrg, pAInfo->aStartSize, pAInfo->nExtraData ); pAInfo->aStartOrg, pAInfo->aStartSize, pAInfo->nExtraData );
maViewList.push_back( pView ); maViewList.push_back( std::unique_ptr<ImplAnimView>(pView) );
} }
else else
pView = static_cast<ImplAnimView*>(pAInfo->pViewData); pView = static_cast<ImplAnimView*>(pAInfo->pViewData);
...@@ -382,10 +366,9 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -382,10 +366,9 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
// delete all unmarked views and reset marked state // delete all unmarked views and reset marked state
for( size_t i = 0; i < maViewList.size(); ) for( size_t i = 0; i < maViewList.size(); )
{ {
pView = maViewList[ i ]; pView = maViewList[ i ].get();
if( !pView->isMarked() ) if( !pView->isMarked() )
{ {
delete pView;
maViewList.erase( maViewList.begin() + i ); maViewList.erase( maViewList.begin() + i );
} }
else else
...@@ -407,7 +390,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -407,7 +390,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
ImplRestartTimer( 10 ); ImplRestartTimer( 10 );
else else
{ {
AnimationBitmap* pStepBmp = (++mnPos < maList.size()) ? maList[ mnPos ] : nullptr; AnimationBitmap* pStepBmp = (++mnPos < maList.size()) ? maList[ mnPos ].get() : nullptr;
if( !pStepBmp ) if( !pStepBmp )
{ {
...@@ -425,7 +408,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -425,7 +408,7 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
mnLoops--; mnLoops--;
mnPos = 0; mnPos = 0;
pStepBmp = maList[ mnPos ]; pStepBmp = maList[ mnPos ].get();
} }
} }
...@@ -435,12 +418,11 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void) ...@@ -435,12 +418,11 @@ IMPL_LINK_NOARG(Animation, ImplTimeoutHdl, Timer *, void)
// set from view itself // set from view itself
for( size_t i = 0; i < maViewList.size(); ) for( size_t i = 0; i < maViewList.size(); )
{ {
pView = maViewList[ i ]; pView = maViewList[ i ].get();
pView->draw( mnPos ); pView->draw( mnPos );
if( pView->isMarked() ) if( pView->isMarked() )
{ {
delete pView;
maViewList.erase( maViewList.begin() + i ); maViewList.erase( maViewList.begin() + i );
} }
else else
...@@ -468,7 +450,7 @@ bool Animation::Insert( const AnimationBitmap& rStepBmp ) ...@@ -468,7 +450,7 @@ bool Animation::Insert( const AnimationBitmap& rStepBmp )
tools::Rectangle aGlobalRect( aPoint, maGlobalSize ); tools::Rectangle aGlobalRect( aPoint, maGlobalSize );
maGlobalSize = aGlobalRect.Union( tools::Rectangle( rStepBmp.aPosPix, rStepBmp.aSizePix ) ).GetSize(); maGlobalSize = aGlobalRect.Union( tools::Rectangle( rStepBmp.aPosPix, rStepBmp.aSizePix ) ).GetSize();
maList.push_back( new AnimationBitmap( rStepBmp ) ); maList.emplace_back( new AnimationBitmap( rStepBmp ) );
// As a start, we make the first BitmapEx the replacement BitmapEx // As a start, we make the first BitmapEx the replacement BitmapEx
if( maList.size() == 1 ) if( maList.size() == 1 )
...@@ -490,8 +472,7 @@ void Animation::Replace( const AnimationBitmap& rNewAnimationBitmap, sal_uInt16 ...@@ -490,8 +472,7 @@ void Animation::Replace( const AnimationBitmap& rNewAnimationBitmap, sal_uInt16
{ {
SAL_WARN_IF( ( nAnimation >= maList.size() ), "vcl", "No object at this position" ); SAL_WARN_IF( ( nAnimation >= maList.size() ), "vcl", "No object at this position" );
delete maList[ nAnimation ]; maList[ nAnimation ].reset( new AnimationBitmap( rNewAnimationBitmap ) );
maList[ nAnimation ] = new AnimationBitmap( rNewAnimationBitmap );
// If we insert at first position we also need to // If we insert at first position we also need to
// update the replacement BitmapEx // update the replacement BitmapEx
...@@ -599,7 +580,7 @@ bool Animation::Mirror( BmpMirrorFlags nMirrorFlags ) ...@@ -599,7 +580,7 @@ bool Animation::Mirror( BmpMirrorFlags nMirrorFlags )
{ {
for( size_t i = 0, n = maList.size(); ( i < n ) && bRet; ++i ) for( size_t i = 0, n = maList.size(); ( i < n ) && bRet; ++i )
{ {
AnimationBitmap* pStepBmp = maList[ i ]; AnimationBitmap* pStepBmp = maList[ i ].get();
bRet = pStepBmp->aBmpEx.Mirror( nMirrorFlags ); bRet = pStepBmp->aBmpEx.Mirror( nMirrorFlags );
if( bRet ) if( bRet )
{ {
......
...@@ -41,8 +41,6 @@ MenuItemData::~MenuItemData() ...@@ -41,8 +41,6 @@ MenuItemData::~MenuItemData()
MenuItemList::~MenuItemList() MenuItemList::~MenuItemList()
{ {
for(MenuItemData* i : maItemList)
delete i;
} }
MenuItemData* MenuItemList::Insert( MenuItemData* MenuItemList::Insert(
...@@ -78,9 +76,9 @@ MenuItemData* MenuItemList::Insert( ...@@ -78,9 +76,9 @@ MenuItemData* MenuItemList::Insert(
pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData ); pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData );
if( nPos < maItemList.size() ) { if( nPos < maItemList.size() ) {
maItemList.insert( maItemList.begin() + nPos, pData ); maItemList.insert( maItemList.begin() + nPos, std::unique_ptr<MenuItemData>(pData) );
} else { } else {
maItemList.push_back( pData ); maItemList.emplace_back( pData );
} }
return pData; return pData;
} }
...@@ -111,9 +109,9 @@ void MenuItemList::InsertSeparator(const OString &rIdent, size_t nPos) ...@@ -111,9 +109,9 @@ void MenuItemList::InsertSeparator(const OString &rIdent, size_t nPos)
pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData ); pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData );
if( nPos < maItemList.size() ) { if( nPos < maItemList.size() ) {
maItemList.insert( maItemList.begin() + nPos, pData ); maItemList.insert( maItemList.begin() + nPos, std::unique_ptr<MenuItemData>(pData) );
} else { } else {
maItemList.push_back( pData ); maItemList.emplace_back( pData );
} }
} }
...@@ -121,16 +119,13 @@ void MenuItemList::Remove( size_t nPos ) ...@@ -121,16 +119,13 @@ void MenuItemList::Remove( size_t nPos )
{ {
if( nPos < maItemList.size() ) if( nPos < maItemList.size() )
{ {
delete maItemList[ nPos ];
maItemList.erase( maItemList.begin() + nPos ); maItemList.erase( maItemList.begin() + nPos );
} }
} }
void MenuItemList::Clear() void MenuItemList::Clear()
{ {
for (MenuItemData* i : maItemList) maItemList.clear();
delete i;
maItemList.resize(0);
} }
MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const
...@@ -140,7 +135,7 @@ MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const ...@@ -140,7 +135,7 @@ MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const
if ( maItemList[ i ]->nId == nSVId ) if ( maItemList[ i ]->nId == nSVId )
{ {
rPos = i; rPos = i;
return maItemList[ i ]; return maItemList[ i ].get();
} }
} }
return nullptr; return nullptr;
...@@ -164,7 +159,7 @@ MenuItemData* MenuItemList::SearchItem( ...@@ -164,7 +159,7 @@ MenuItemData* MenuItemList::SearchItem(
{ {
for ( rPos = 0; rPos < nListCount; rPos++) for ( rPos = 0; rPos < nListCount; rPos++)
{ {
MenuItemData* pData = maItemList[ rPos ]; MenuItemData* pData = maItemList[ rPos ].get();
if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) ) if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) )
{ {
if( nDuplicates > 1 && rPos == nCurrentPos ) if( nDuplicates > 1 && rPos == nCurrentPos )
...@@ -186,7 +181,7 @@ MenuItemData* MenuItemList::SearchItem( ...@@ -186,7 +181,7 @@ MenuItemData* MenuItemList::SearchItem(
for ( rPos = 0; rPos < nListCount; rPos++) for ( rPos = 0; rPos < nListCount; rPos++)
{ {
MenuItemData* pData = maItemList[ rPos ]; MenuItemData* pData = maItemList[ rPos ].get();
if ( pData->bEnabled ) if ( pData->bEnabled )
{ {
sal_Int32 n = pData->aText.indexOf('~'); sal_Int32 n = pData->aText.indexOf('~');
...@@ -226,7 +221,7 @@ size_t MenuItemList::GetItemCount( sal_Unicode cSelectChar ) const ...@@ -226,7 +221,7 @@ size_t MenuItemList::GetItemCount( sal_Unicode cSelectChar ) const
size_t nItems = 0; size_t nItems = 0;
for ( size_t nPos = maItemList.size(); nPos; ) for ( size_t nPos = maItemList.size(); nPos; )
{ {
MenuItemData* pData = maItemList[ --nPos ]; MenuItemData* pData = maItemList[ --nPos ].get();
if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) ) if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) )
nItems++; nItems++;
} }
...@@ -246,7 +241,7 @@ size_t MenuItemList::GetItemCount( KeyCode aKeyCode ) const ...@@ -246,7 +241,7 @@ size_t MenuItemList::GetItemCount( KeyCode aKeyCode ) const
size_t nItems = 0; size_t nItems = 0;
for ( size_t nPos = maItemList.size(); nPos; ) for ( size_t nPos = maItemList.size(); nPos; )
{ {
MenuItemData* pData = maItemList[ --nPos ]; MenuItemData* pData = maItemList[ --nPos ].get();
if ( pData->bEnabled ) if ( pData->bEnabled )
{ {
sal_Int32 n = pData->aText.indexOf('~'); sal_Int32 n = pData->aText.indexOf('~');
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <com/sun/star/i18n/XCharacterClassification.hpp> #include <com/sun/star/i18n/XCharacterClassification.hpp>
#include <memory>
#include <vector> #include <vector>
class SalMenuItem; class SalMenuItem;
...@@ -94,7 +95,7 @@ struct MenuItemData ...@@ -94,7 +95,7 @@ struct MenuItemData
class MenuItemList class MenuItemList
{ {
private: private:
typedef ::std::vector< MenuItemData* > MenuItemDataList_impl; typedef ::std::vector< std::unique_ptr<MenuItemData> > MenuItemDataList_impl;
MenuItemDataList_impl maItemList; MenuItemDataList_impl maItemList;
public: public:
...@@ -122,7 +123,7 @@ public: ...@@ -122,7 +123,7 @@ public:
} }
MenuItemData* GetDataFromPos( size_t nPos ) const MenuItemData* GetDataFromPos( size_t nPos ) const
{ {
return ( nPos < maItemList.size() ) ? maItemList[ nPos ] : nullptr; return ( nPos < maItemList.size() ) ? maItemList[ nPos ].get() : nullptr;
} }
MenuItemData* SearchItem( MenuItemData* SearchItem(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment