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:
@@ -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)
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user