native picture clipboard support improved
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@19064 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -230,34 +230,51 @@ wxBitmapDataObject::wxBitmapDataObject(
|
||||
: wxBitmapDataObjectBase(rBitmap)
|
||||
{
|
||||
Init();
|
||||
|
||||
DoConvertToPng();
|
||||
if ( m_bitmap.Ok() )
|
||||
{
|
||||
m_pngData = m_bitmap.GetPict() ;
|
||||
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
|
||||
}
|
||||
}
|
||||
|
||||
wxBitmapDataObject::~wxBitmapDataObject()
|
||||
{
|
||||
Clear();
|
||||
if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
|
||||
{
|
||||
KillPicture( (PicHandle) m_pngData ) ;
|
||||
}
|
||||
m_pngData = NULL ;
|
||||
m_pngSize = 0 ;
|
||||
}
|
||||
|
||||
void wxBitmapDataObject::SetBitmap(
|
||||
const wxBitmap& rBitmap
|
||||
)
|
||||
{
|
||||
ClearAll();
|
||||
if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
|
||||
{
|
||||
KillPicture( (PicHandle) m_pngData ) ;
|
||||
}
|
||||
m_pngData = NULL ;
|
||||
m_pngSize = 0 ;
|
||||
wxBitmapDataObjectBase::SetBitmap(rBitmap);
|
||||
DoConvertToPng();
|
||||
if ( m_bitmap.Ok() )
|
||||
{
|
||||
m_pngData = m_bitmap.GetPict() ;
|
||||
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
|
||||
}
|
||||
}
|
||||
|
||||
bool wxBitmapDataObject::GetDataHere(
|
||||
void* pBuf
|
||||
) const
|
||||
{
|
||||
if (!m_pngSize)
|
||||
if (!m_pngData)
|
||||
{
|
||||
wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
|
||||
return FALSE;
|
||||
}
|
||||
memcpy(pBuf, m_pngData, m_pngSize);
|
||||
memcpy(pBuf, *(Handle)m_pngData, GetHandleSize((Handle)m_pngData));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -267,41 +284,14 @@ bool wxBitmapDataObject::SetData(
|
||||
)
|
||||
{
|
||||
Clear();
|
||||
m_pngSize = nSize;
|
||||
m_pngData = malloc(m_pngSize);
|
||||
|
||||
memcpy(m_pngData, pBuf, m_pngSize);
|
||||
|
||||
wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
|
||||
wxImage vImage;
|
||||
wxPNGHandler vHandler;
|
||||
|
||||
if (!vHandler.LoadFile(&vImage, vMstream))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_bitmap = wxBitmap( vImage ) ;
|
||||
PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
|
||||
memcpy( *picHandle , pBuf , nSize ) ;
|
||||
m_pngData = picHandle ;
|
||||
m_pngSize = GetHandleSize( (Handle) picHandle ) ;
|
||||
Rect frame = (**picHandle).picFrame ;
|
||||
|
||||
m_bitmap.SetPict( m_pngData ) ;
|
||||
m_bitmap.SetWidth( frame.right - frame.left ) ;
|
||||
m_bitmap.SetHeight( frame.bottom - frame.top ) ;
|
||||
return m_bitmap.Ok();
|
||||
}
|
||||
|
||||
void wxBitmapDataObject::DoConvertToPng()
|
||||
{
|
||||
if (!m_bitmap.Ok())
|
||||
return;
|
||||
|
||||
wxCHECK_RET( wxImage::FindHandler(wxBITMAP_TYPE_PNG) != NULL,
|
||||
wxT("You must call wxImage::AddHandler(new wxPNGHandler); to be able to use clipboard with bitmaps!") );
|
||||
|
||||
wxImage image = m_bitmap.ConvertToImage();
|
||||
|
||||
wxCountingOutputStream count;
|
||||
image.SaveFile(count, wxBITMAP_TYPE_PNG);
|
||||
|
||||
m_pngSize = count.GetSize() + 100; // sometimes the size seems to vary ???
|
||||
m_pngData = malloc(m_pngSize);
|
||||
|
||||
wxMemoryOutputStream mstream((char*) m_pngData, m_pngSize);
|
||||
image.SaveFile(mstream, wxBITMAP_TYPE_PNG);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user