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:
Stefan Csomor
2003-02-02 13:22:00 +00:00
parent 531a2584c6
commit 2cdd43432e
6 changed files with 238 additions and 326 deletions

View File

@@ -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);
}