fixed memory leak and optimized GetSubBitmap (Kudos to Eric Lavigne)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11955 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2001-10-12 16:11:12 +00:00
parent 4cd411faee
commit 85f296a342
2 changed files with 48 additions and 34 deletions

View File

@@ -199,33 +199,34 @@ wxBitmapRefData::wxBitmapRefData()
m_bitmapType = kMacBitmapTypeUnknownType ; m_bitmapType = kMacBitmapTypeUnknownType ;
} }
wxBitmapRefData::~wxBitmapRefData() // TODO move this do a public function of Bitmap Ref
static void DisposeBitmapRefData(wxBitmapRefData *data)
{ {
switch (m_bitmapType) switch (data->m_bitmapType)
{ {
case kMacBitmapTypePict : case kMacBitmapTypePict :
{ {
if ( m_hPict ) if ( data->m_hPict )
{ {
KillPicture( m_hPict ) ; KillPicture( data->m_hPict ) ;
m_hPict = NULL ; data->m_hPict = NULL ;
} }
} }
break ; break ;
case kMacBitmapTypeGrafWorld : case kMacBitmapTypeGrafWorld :
{ {
if ( m_hBitmap ) if ( data->m_hBitmap )
{ {
wxMacDestroyGWorld( m_hBitmap ) ; wxMacDestroyGWorld( data->m_hBitmap ) ;
m_hBitmap = NULL ; data->m_hBitmap = NULL ;
} }
} }
break ; break ;
case kMacBitmapTypeIcon : case kMacBitmapTypeIcon :
if ( m_hIcon ) if ( data->m_hIcon )
{ {
DisposeCIcon( m_hIcon ) ; DisposeCIcon( data->m_hIcon ) ;
m_hIcon = NULL ; data->m_hIcon = NULL ;
} }
default : default :
@@ -233,13 +234,18 @@ wxBitmapRefData::~wxBitmapRefData()
break ; break ;
} }
if (m_bitmapMask) if (data->m_bitmapMask)
{ {
delete m_bitmapMask; delete data->m_bitmapMask;
m_bitmapMask = NULL; data->m_bitmapMask = NULL;
} }
} }
wxBitmapRefData::~wxBitmapRefData()
{
DisposeBitmapRefData( this ) ;
}
wxList wxBitmapBase::sm_handlers; wxList wxBitmapBase::sm_handlers;
@@ -438,7 +444,7 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
RGBColor color; RGBColor color;
bitmap = GetHBITMAP(); bitmap = GetHBITMAP();
subbitmap = wxMacCreateGWorld(rect.width, rect.height, GetDepth()); subbitmap = ref->m_hBitmap ;
LockPixels(GetGWorldPixMap(bitmap)); LockPixels(GetGWorldPixMap(bitmap));
LockPixels(GetGWorldPixMap(subbitmap)); LockPixels(GetGWorldPixMap(subbitmap));
@@ -454,7 +460,6 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
} }
UnlockPixels(GetGWorldPixMap(bitmap)); UnlockPixels(GetGWorldPixMap(bitmap));
UnlockPixels(GetGWorldPixMap(subbitmap)); UnlockPixels(GetGWorldPixMap(subbitmap));
ret.SetHBITMAP(subbitmap);
} }
} }
SetGWorld( origPort, origDevice ); SetGWorld( origPort, origDevice );
@@ -487,9 +492,11 @@ int wxBitmap::GetBitmapType() const
void wxBitmap::SetHBITMAP(WXHBITMAP bmp) void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
{ {
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
M_BITMAPDATA->m_hBitmap = bmp ; M_BITMAPDATA->m_hBitmap = bmp ;
M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
} }
bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)

View File

@@ -199,33 +199,34 @@ wxBitmapRefData::wxBitmapRefData()
m_bitmapType = kMacBitmapTypeUnknownType ; m_bitmapType = kMacBitmapTypeUnknownType ;
} }
wxBitmapRefData::~wxBitmapRefData() // TODO move this do a public function of Bitmap Ref
static void DisposeBitmapRefData(wxBitmapRefData *data)
{ {
switch (m_bitmapType) switch (data->m_bitmapType)
{ {
case kMacBitmapTypePict : case kMacBitmapTypePict :
{ {
if ( m_hPict ) if ( data->m_hPict )
{ {
KillPicture( m_hPict ) ; KillPicture( data->m_hPict ) ;
m_hPict = NULL ; data->m_hPict = NULL ;
} }
} }
break ; break ;
case kMacBitmapTypeGrafWorld : case kMacBitmapTypeGrafWorld :
{ {
if ( m_hBitmap ) if ( data->m_hBitmap )
{ {
wxMacDestroyGWorld( m_hBitmap ) ; wxMacDestroyGWorld( data->m_hBitmap ) ;
m_hBitmap = NULL ; data->m_hBitmap = NULL ;
} }
} }
break ; break ;
case kMacBitmapTypeIcon : case kMacBitmapTypeIcon :
if ( m_hIcon ) if ( data->m_hIcon )
{ {
DisposeCIcon( m_hIcon ) ; DisposeCIcon( data->m_hIcon ) ;
m_hIcon = NULL ; data->m_hIcon = NULL ;
} }
default : default :
@@ -233,13 +234,18 @@ wxBitmapRefData::~wxBitmapRefData()
break ; break ;
} }
if (m_bitmapMask) if (data->m_bitmapMask)
{ {
delete m_bitmapMask; delete data->m_bitmapMask;
m_bitmapMask = NULL; data->m_bitmapMask = NULL;
} }
} }
wxBitmapRefData::~wxBitmapRefData()
{
DisposeBitmapRefData( this ) ;
}
wxList wxBitmapBase::sm_handlers; wxList wxBitmapBase::sm_handlers;
@@ -438,7 +444,7 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
RGBColor color; RGBColor color;
bitmap = GetHBITMAP(); bitmap = GetHBITMAP();
subbitmap = wxMacCreateGWorld(rect.width, rect.height, GetDepth()); subbitmap = ref->m_hBitmap ;
LockPixels(GetGWorldPixMap(bitmap)); LockPixels(GetGWorldPixMap(bitmap));
LockPixels(GetGWorldPixMap(subbitmap)); LockPixels(GetGWorldPixMap(subbitmap));
@@ -454,7 +460,6 @@ wxBitmap wxBitmap::GetSubBitmap(const wxRect &rect) const
} }
UnlockPixels(GetGWorldPixMap(bitmap)); UnlockPixels(GetGWorldPixMap(bitmap));
UnlockPixels(GetGWorldPixMap(subbitmap)); UnlockPixels(GetGWorldPixMap(subbitmap));
ret.SetHBITMAP(subbitmap);
} }
} }
SetGWorld( origPort, origDevice ); SetGWorld( origPort, origDevice );
@@ -487,9 +492,11 @@ int wxBitmap::GetBitmapType() const
void wxBitmap::SetHBITMAP(WXHBITMAP bmp) void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
{ {
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ; M_BITMAPDATA->m_bitmapType = kMacBitmapTypeGrafWorld ;
M_BITMAPDATA->m_hBitmap = bmp ; M_BITMAPDATA->m_hBitmap = bmp ;
M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ; M_BITMAPDATA->m_ok = (M_BITMAPDATA->m_hBitmap != NULL ) ;
} }
bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)