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

@@ -369,6 +369,9 @@ wxBitmapRefData::wxBitmapRefData()
// TODO move this to a public function of Bitmap Ref // TODO move this to a public function of Bitmap Ref
static void DisposeBitmapRefData(wxBitmapRefData *data) static void DisposeBitmapRefData(wxBitmapRefData *data)
{ {
if ( !data )
return ;
switch (data->m_bitmapType) switch (data->m_bitmapType)
{ {
case kMacBitmapTypePict : case kMacBitmapTypePict :
@@ -637,11 +640,38 @@ int wxBitmap::GetBitmapType() const
void wxBitmap::SetHBITMAP(WXHBITMAP bmp) void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
{ {
DisposeBitmapRefData( M_BITMAPDATA ) ; if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
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 ) ;
}
void wxBitmap::SetHICON(WXHICON ico)
{
if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeIcon ;
M_BITMAPDATA->m_hIcon = ico ;
M_BITMAPDATA->m_ok = ( M_BITMAPDATA->m_hIcon != NULL ) ;
}
void wxBitmap::SetPict(WXHMETAFILE pict)
{
if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypePict ;
M_BITMAPDATA->m_hPict = pict ;
M_BITMAPDATA->m_ok = ( M_BITMAPDATA->m_hPict != NULL ) ;
} }
bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)
@@ -1008,94 +1038,30 @@ WXHBITMAP wxBitmap::GetHBITMAP() const
WXHMETAFILE wxBitmap::GetPict() const WXHMETAFILE wxBitmap::GetPict() const
{ {
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") ); wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
PicHandle picture; // This is the returned picture PicHandle picture = NULL ; // This is the returned picture
// If bitmap already in Pict format return pointer // If bitmap already in Pict format return pointer
if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) { if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) {
return M_BITMAPDATA->m_hPict; return M_BITMAPDATA->m_hPict;
} }
else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) { else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) {
// Invalid bitmap // Invalid bitmap
return NULL; return NULL;
} }
else
RGBColor gray = { 0xCCCC ,0xCCCC , 0xCCCC } ; {
RGBColor white = { 0xffff ,0xffff , 0xffff } ; if ( GetMask() )
RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ; {
CGrafPtr origPort; picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , MAC_WXHBITMAP(GetMask()->GetMaskBitmap() ) ) ;
GDHandle origDev ; }
wxMask *mask; else
Rect portRect ; {
picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , NULL ) ;
GetPortBounds( (GWorldPtr) GetHBITMAP() , &portRect ) ; }
int width = portRect.right - portRect.left ; }
int height = portRect.bottom - portRect.top ; return picture ;
LockPixels( GetGWorldPixMap( (GWorldPtr) GetHBITMAP() ) ) ;
GetGWorld( &origPort , &origDev ) ;
mask = GetMask();
SetGWorld( (GWorldPtr) GetHBITMAP() , NULL ) ;
picture = OpenPicture(&portRect); // open a picture, this disables drawing
if(!picture) {
return NULL;
}
if( mask )
{
#ifdef __DARWIN__
RGBColor trans = white;
#else
RGBBackColor( &gray );
EraseRect( &portRect );
RGBColor trans = gray;
#endif
RGBForeColor( &black ) ;
RGBBackColor( &white ) ;
PenMode(transparent);
for ( int y = 0 ; y < height ; ++y )
{
for( int x = 0 ; x < width ; ++x )
{
if ( !mask->PointMasked(x,y) )
{
RGBColor col ;
GetCPixel( x + portRect.left , y + portRect.top , &col ) ;
SetCPixel( x + portRect.left , y + portRect.top , &col ) ;
}
else {
// With transparency this sets a blank pixel
SetCPixel( x + portRect.left , y + portRect.top , &trans);
}
}
}
}
else
{
RGBBackColor( &gray ) ;
EraseRect(&portRect);
RGBForeColor( &black ) ;
RGBBackColor( &white ) ;
CopyBits(GetPortBitMapForCopyBits( (GWorldPtr) GetHBITMAP()),
// src PixMap - we copy image over itself -
GetPortBitMapForCopyBits( (GWorldPtr) GetHBITMAP()),
// dst PixMap - no drawing occurs
&portRect, // srcRect - it will be recorded and compressed -
&portRect, // dstRect - into the picture that is open -
srcCopy,NULL); // copyMode and no clip region
}
ClosePicture(); // We are done recording the picture
UnlockPixels( GetGWorldPixMap( (GWorldPtr) GetHBITMAP() ) ) ;
SetGWorld( origPort , origDev ) ;
return picture; // return our groovy pict handle
} }
/* /*

View File

@@ -369,6 +369,9 @@ wxBitmapRefData::wxBitmapRefData()
// TODO move this to a public function of Bitmap Ref // TODO move this to a public function of Bitmap Ref
static void DisposeBitmapRefData(wxBitmapRefData *data) static void DisposeBitmapRefData(wxBitmapRefData *data)
{ {
if ( !data )
return ;
switch (data->m_bitmapType) switch (data->m_bitmapType)
{ {
case kMacBitmapTypePict : case kMacBitmapTypePict :
@@ -637,11 +640,38 @@ int wxBitmap::GetBitmapType() const
void wxBitmap::SetHBITMAP(WXHBITMAP bmp) void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
{ {
DisposeBitmapRefData( M_BITMAPDATA ) ; if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
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 ) ;
}
void wxBitmap::SetHICON(WXHICON ico)
{
if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypeIcon ;
M_BITMAPDATA->m_hIcon = ico ;
M_BITMAPDATA->m_ok = ( M_BITMAPDATA->m_hIcon != NULL ) ;
}
void wxBitmap::SetPict(WXHMETAFILE pict)
{
if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
else
DisposeBitmapRefData( M_BITMAPDATA ) ;
M_BITMAPDATA->m_bitmapType = kMacBitmapTypePict ;
M_BITMAPDATA->m_hPict = pict ;
M_BITMAPDATA->m_ok = ( M_BITMAPDATA->m_hPict != NULL ) ;
} }
bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type) bool wxBitmap::LoadFile(const wxString& filename, wxBitmapType type)
@@ -1008,94 +1038,30 @@ WXHBITMAP wxBitmap::GetHBITMAP() const
WXHMETAFILE wxBitmap::GetPict() const WXHMETAFILE wxBitmap::GetPict() const
{ {
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") ); wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
PicHandle picture; // This is the returned picture PicHandle picture = NULL ; // This is the returned picture
// If bitmap already in Pict format return pointer // If bitmap already in Pict format return pointer
if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) { if(M_BITMAPDATA->m_bitmapType == kMacBitmapTypePict) {
return M_BITMAPDATA->m_hPict; return M_BITMAPDATA->m_hPict;
} }
else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) { else if(M_BITMAPDATA->m_bitmapType != kMacBitmapTypeGrafWorld) {
// Invalid bitmap // Invalid bitmap
return NULL; return NULL;
} }
else
RGBColor gray = { 0xCCCC ,0xCCCC , 0xCCCC } ; {
RGBColor white = { 0xffff ,0xffff , 0xffff } ; if ( GetMask() )
RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ; {
CGrafPtr origPort; picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , MAC_WXHBITMAP(GetMask()->GetMaskBitmap() ) ) ;
GDHandle origDev ; }
wxMask *mask; else
Rect portRect ; {
picture = wxMacCreatePict( MAC_WXHBITMAP(M_BITMAPDATA->m_hBitmap) , NULL ) ;
GetPortBounds( (GWorldPtr) GetHBITMAP() , &portRect ) ; }
int width = portRect.right - portRect.left ; }
int height = portRect.bottom - portRect.top ; return picture ;
LockPixels( GetGWorldPixMap( (GWorldPtr) GetHBITMAP() ) ) ;
GetGWorld( &origPort , &origDev ) ;
mask = GetMask();
SetGWorld( (GWorldPtr) GetHBITMAP() , NULL ) ;
picture = OpenPicture(&portRect); // open a picture, this disables drawing
if(!picture) {
return NULL;
}
if( mask )
{
#ifdef __DARWIN__
RGBColor trans = white;
#else
RGBBackColor( &gray );
EraseRect( &portRect );
RGBColor trans = gray;
#endif
RGBForeColor( &black ) ;
RGBBackColor( &white ) ;
PenMode(transparent);
for ( int y = 0 ; y < height ; ++y )
{
for( int x = 0 ; x < width ; ++x )
{
if ( !mask->PointMasked(x,y) )
{
RGBColor col ;
GetCPixel( x + portRect.left , y + portRect.top , &col ) ;
SetCPixel( x + portRect.left , y + portRect.top , &col ) ;
}
else {
// With transparency this sets a blank pixel
SetCPixel( x + portRect.left , y + portRect.top , &trans);
}
}
}
}
else
{
RGBBackColor( &gray ) ;
EraseRect(&portRect);
RGBForeColor( &black ) ;
RGBBackColor( &white ) ;
CopyBits(GetPortBitMapForCopyBits( (GWorldPtr) GetHBITMAP()),
// src PixMap - we copy image over itself -
GetPortBitMapForCopyBits( (GWorldPtr) GetHBITMAP()),
// dst PixMap - no drawing occurs
&portRect, // srcRect - it will be recorded and compressed -
&portRect, // dstRect - into the picture that is open -
srcCopy,NULL); // copyMode and no clip region
}
ClosePicture(); // We are done recording the picture
UnlockPixels( GetGWorldPixMap( (GWorldPtr) GetHBITMAP() ) ) ;
SetGWorld( origPort , origDev ) ;
return picture; // return our groovy pict handle
} }
/* /*

View File

@@ -23,7 +23,7 @@
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/mac/private.h" #include "wx/mac/uma.h"
#ifndef __DARWIN__ #ifndef __DARWIN__
#include <Scrap.h> #include <Scrap.h>
#endif #endif
@@ -44,7 +44,8 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
#else #else
OSStatus err = noErr ; OSStatus err = noErr ;
#endif #endif
void * data = NULL ; void * data = NULL ;
Size byteCount;
switch (dataFormat.GetType()) switch (dataFormat.GetType())
{ {
@@ -54,6 +55,9 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
case wxDF_TEXT: case wxDF_TEXT:
break; break;
case wxDF_BITMAP :
case wxDF_METAFILE :
break ;
default: default:
{ {
wxLogError(_("Unsupported clipboard format.")); wxLogError(_("Unsupported clipboard format."));
@@ -68,7 +72,6 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
if ( err != noTypeErr && err != memFullErr ) if ( err != noTypeErr && err != memFullErr )
{ {
ScrapFlavorFlags flavorFlags; ScrapFlavorFlags flavorFlags;
Size byteCount;
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr) if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
{ {
@@ -101,7 +104,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
HUnlock( datahandle ) ; HUnlock( datahandle ) ;
if ( GetHandleSize( datahandle ) > 0 ) if ( GetHandleSize( datahandle ) > 0 )
{ {
long byteCount = GetHandleSize( datahandle ) ; byteCount = GetHandleSize( datahandle ) ;
if ( dataFormat.GetType() == wxDF_TEXT ) if ( dataFormat.GetType() == wxDF_TEXT )
data = new char[ byteCount + 1] ; data = new char[ byteCount + 1] ;
else else
@@ -122,7 +125,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
} }
if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC ) if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC )
{ {
wxMacConvertToPC((char*)data) ; wxMacConvertToPC((char*)data,(char*)data,byteCount) ;
} }
return data; return data;
} }
@@ -240,43 +243,38 @@ bool wxClipboard::AddData( wxDataObject *data )
{ {
mac = textDataObject->GetText() ; mac = textDataObject->GetText() ;
} }
#if !TARGET_CARBON err = UMAPutScrap( mac.Length() , 'TEXT' , (void*) mac.c_str() ) ;
err = PutScrap( mac.Length() , 'TEXT' , mac.c_str() ) ;
#else
ScrapRef scrap;
err = GetCurrentScrap (&scrap);
if ( !err )
{
err = PutScrapFlavor (scrap, 'TEXT', 0, mac.Length(), mac.c_str());
}
#endif
} }
break ; break ;
#if wxUSE_DRAG_AND_DROP #if wxUSE_DRAG_AND_DROP
case wxDF_METAFILE: case wxDF_METAFILE:
{ {
wxMetafileDataObject* metaFileDataObject = wxMetafileDataObject* metaFileDataObject =
(wxMetafileDataObject*) data; (wxMetafileDataObject*) data;
wxMetafile metaFile = metaFileDataObject->GetMetafile(); wxMetafile metaFile = metaFileDataObject->GetMetafile();
PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ; PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ;
HLock( (Handle) pict ) ; HLock( (Handle) pict ) ;
#if !TARGET_CARBON err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
err = PutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ; HUnlock( (Handle) pict ) ;
#else
ScrapRef scrap;
err = GetCurrentScrap (&scrap);
if ( !err )
{
err = PutScrapFlavor (scrap, 'PICT', 0, GetHandleSize((Handle) pict), *pict);
}
#endif
HUnlock( (Handle) pict ) ;
} }
break ; break ;
#endif #endif
case wxDF_BITMAP: case wxDF_BITMAP:
case wxDF_DIB: case wxDF_DIB:
{
PicHandle pict = NULL ;
wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data ;
bool created = bitmapDataObject->GetBitmap().GetBitmapType() != kMacBitmapTypePict ;
pict = (PicHandle) bitmapDataObject->GetBitmap().GetPict() ;
HLock( (Handle) pict ) ;
err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
HUnlock( (Handle) pict ) ;
if ( created && pict)
KillPicture( pict ) ;
}
default: default:
break ; break ;
} }
@@ -375,8 +373,10 @@ bool wxClipboard::GetData( wxDataObject& data )
switch ( format.GetType() ) switch ( format.GetType() )
{ {
case wxDF_TEXT: case wxDF_TEXT :
case wxDF_OEMTEXT: case wxDF_OEMTEXT :
case wxDF_BITMAP :
case wxDF_METAFILE :
{ {
long len ; long len ;
char* s = (char*)wxGetClipboardData(format, &len ); char* s = (char*)wxGetClipboardData(format, &len );

View File

@@ -230,34 +230,51 @@ wxBitmapDataObject::wxBitmapDataObject(
: wxBitmapDataObjectBase(rBitmap) : wxBitmapDataObjectBase(rBitmap)
{ {
Init(); Init();
if ( m_bitmap.Ok() )
DoConvertToPng(); {
m_pngData = m_bitmap.GetPict() ;
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
}
} }
wxBitmapDataObject::~wxBitmapDataObject() wxBitmapDataObject::~wxBitmapDataObject()
{ {
Clear(); if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
{
KillPicture( (PicHandle) m_pngData ) ;
}
m_pngData = NULL ;
m_pngSize = 0 ;
} }
void wxBitmapDataObject::SetBitmap( void wxBitmapDataObject::SetBitmap(
const wxBitmap& rBitmap const wxBitmap& rBitmap
) )
{ {
ClearAll(); if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
{
KillPicture( (PicHandle) m_pngData ) ;
}
m_pngData = NULL ;
m_pngSize = 0 ;
wxBitmapDataObjectBase::SetBitmap(rBitmap); wxBitmapDataObjectBase::SetBitmap(rBitmap);
DoConvertToPng(); if ( m_bitmap.Ok() )
{
m_pngData = m_bitmap.GetPict() ;
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
}
} }
bool wxBitmapDataObject::GetDataHere( bool wxBitmapDataObject::GetDataHere(
void* pBuf void* pBuf
) const ) const
{ {
if (!m_pngSize) if (!m_pngData)
{ {
wxFAIL_MSG(wxT("attempt to copy empty bitmap failed")); wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
return FALSE; return FALSE;
} }
memcpy(pBuf, m_pngData, m_pngSize); memcpy(pBuf, *(Handle)m_pngData, GetHandleSize((Handle)m_pngData));
return TRUE; return TRUE;
} }
@@ -267,41 +284,14 @@ bool wxBitmapDataObject::SetData(
) )
{ {
Clear(); Clear();
m_pngSize = nSize; PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
m_pngData = malloc(m_pngSize); memcpy( *picHandle , pBuf , nSize ) ;
m_pngData = picHandle ;
memcpy(m_pngData, pBuf, m_pngSize); m_pngSize = GetHandleSize( (Handle) picHandle ) ;
Rect frame = (**picHandle).picFrame ;
wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
wxImage vImage; m_bitmap.SetPict( m_pngData ) ;
wxPNGHandler vHandler; m_bitmap.SetWidth( frame.right - frame.left ) ;
m_bitmap.SetHeight( frame.bottom - frame.top ) ;
if (!vHandler.LoadFile(&vImage, vMstream))
{
return FALSE;
}
m_bitmap = wxBitmap( vImage ) ;
return m_bitmap.Ok(); 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);
}

View File

@@ -23,7 +23,7 @@
#include "wx/intl.h" #include "wx/intl.h"
#include "wx/log.h" #include "wx/log.h"
#include "wx/mac/private.h" #include "wx/mac/uma.h"
#ifndef __DARWIN__ #ifndef __DARWIN__
#include <Scrap.h> #include <Scrap.h>
#endif #endif
@@ -44,7 +44,8 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
#else #else
OSStatus err = noErr ; OSStatus err = noErr ;
#endif #endif
void * data = NULL ; void * data = NULL ;
Size byteCount;
switch (dataFormat.GetType()) switch (dataFormat.GetType())
{ {
@@ -54,6 +55,9 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
case wxDF_TEXT: case wxDF_TEXT:
break; break;
case wxDF_BITMAP :
case wxDF_METAFILE :
break ;
default: default:
{ {
wxLogError(_("Unsupported clipboard format.")); wxLogError(_("Unsupported clipboard format."));
@@ -68,7 +72,6 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
if ( err != noTypeErr && err != memFullErr ) if ( err != noTypeErr && err != memFullErr )
{ {
ScrapFlavorFlags flavorFlags; ScrapFlavorFlags flavorFlags;
Size byteCount;
if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr) if (( err = GetScrapFlavorFlags( scrapRef, dataFormat.GetFormatId(), &flavorFlags )) == noErr)
{ {
@@ -101,7 +104,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
HUnlock( datahandle ) ; HUnlock( datahandle ) ;
if ( GetHandleSize( datahandle ) > 0 ) if ( GetHandleSize( datahandle ) > 0 )
{ {
long byteCount = GetHandleSize( datahandle ) ; byteCount = GetHandleSize( datahandle ) ;
if ( dataFormat.GetType() == wxDF_TEXT ) if ( dataFormat.GetType() == wxDF_TEXT )
data = new char[ byteCount + 1] ; data = new char[ byteCount + 1] ;
else else
@@ -122,7 +125,7 @@ void *wxGetClipboardData(wxDataFormat dataFormat, long *len)
} }
if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC ) if ( dataFormat.GetType() == wxDF_TEXT && wxApp::s_macDefaultEncodingIsPC )
{ {
wxMacConvertToPC((char*)data) ; wxMacConvertToPC((char*)data,(char*)data,byteCount) ;
} }
return data; return data;
} }
@@ -240,43 +243,38 @@ bool wxClipboard::AddData( wxDataObject *data )
{ {
mac = textDataObject->GetText() ; mac = textDataObject->GetText() ;
} }
#if !TARGET_CARBON err = UMAPutScrap( mac.Length() , 'TEXT' , (void*) mac.c_str() ) ;
err = PutScrap( mac.Length() , 'TEXT' , mac.c_str() ) ;
#else
ScrapRef scrap;
err = GetCurrentScrap (&scrap);
if ( !err )
{
err = PutScrapFlavor (scrap, 'TEXT', 0, mac.Length(), mac.c_str());
}
#endif
} }
break ; break ;
#if wxUSE_DRAG_AND_DROP #if wxUSE_DRAG_AND_DROP
case wxDF_METAFILE: case wxDF_METAFILE:
{ {
wxMetafileDataObject* metaFileDataObject = wxMetafileDataObject* metaFileDataObject =
(wxMetafileDataObject*) data; (wxMetafileDataObject*) data;
wxMetafile metaFile = metaFileDataObject->GetMetafile(); wxMetafile metaFile = metaFileDataObject->GetMetafile();
PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ; PicHandle pict = (PicHandle) metaFile.GetHMETAFILE() ;
HLock( (Handle) pict ) ; HLock( (Handle) pict ) ;
#if !TARGET_CARBON err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
err = PutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ; HUnlock( (Handle) pict ) ;
#else
ScrapRef scrap;
err = GetCurrentScrap (&scrap);
if ( !err )
{
err = PutScrapFlavor (scrap, 'PICT', 0, GetHandleSize((Handle) pict), *pict);
}
#endif
HUnlock( (Handle) pict ) ;
} }
break ; break ;
#endif #endif
case wxDF_BITMAP: case wxDF_BITMAP:
case wxDF_DIB: case wxDF_DIB:
{
PicHandle pict = NULL ;
wxBitmapDataObject* bitmapDataObject = (wxBitmapDataObject*) data ;
bool created = bitmapDataObject->GetBitmap().GetBitmapType() != kMacBitmapTypePict ;
pict = (PicHandle) bitmapDataObject->GetBitmap().GetPict() ;
HLock( (Handle) pict ) ;
err = UMAPutScrap( GetHandleSize( (Handle) pict ) , 'PICT' , *pict ) ;
HUnlock( (Handle) pict ) ;
if ( created && pict)
KillPicture( pict ) ;
}
default: default:
break ; break ;
} }
@@ -375,8 +373,10 @@ bool wxClipboard::GetData( wxDataObject& data )
switch ( format.GetType() ) switch ( format.GetType() )
{ {
case wxDF_TEXT: case wxDF_TEXT :
case wxDF_OEMTEXT: case wxDF_OEMTEXT :
case wxDF_BITMAP :
case wxDF_METAFILE :
{ {
long len ; long len ;
char* s = (char*)wxGetClipboardData(format, &len ); char* s = (char*)wxGetClipboardData(format, &len );

View File

@@ -230,34 +230,51 @@ wxBitmapDataObject::wxBitmapDataObject(
: wxBitmapDataObjectBase(rBitmap) : wxBitmapDataObjectBase(rBitmap)
{ {
Init(); Init();
if ( m_bitmap.Ok() )
DoConvertToPng(); {
m_pngData = m_bitmap.GetPict() ;
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
}
} }
wxBitmapDataObject::~wxBitmapDataObject() wxBitmapDataObject::~wxBitmapDataObject()
{ {
Clear(); if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
{
KillPicture( (PicHandle) m_pngData ) ;
}
m_pngData = NULL ;
m_pngSize = 0 ;
} }
void wxBitmapDataObject::SetBitmap( void wxBitmapDataObject::SetBitmap(
const wxBitmap& rBitmap const wxBitmap& rBitmap
) )
{ {
ClearAll(); if ( m_pngData && m_bitmap.GetBitmapType() != kMacBitmapTypePict )
{
KillPicture( (PicHandle) m_pngData ) ;
}
m_pngData = NULL ;
m_pngSize = 0 ;
wxBitmapDataObjectBase::SetBitmap(rBitmap); wxBitmapDataObjectBase::SetBitmap(rBitmap);
DoConvertToPng(); if ( m_bitmap.Ok() )
{
m_pngData = m_bitmap.GetPict() ;
m_pngSize = GetHandleSize( (Handle) m_pngData ) ;
}
} }
bool wxBitmapDataObject::GetDataHere( bool wxBitmapDataObject::GetDataHere(
void* pBuf void* pBuf
) const ) const
{ {
if (!m_pngSize) if (!m_pngData)
{ {
wxFAIL_MSG(wxT("attempt to copy empty bitmap failed")); wxFAIL_MSG(wxT("attempt to copy empty bitmap failed"));
return FALSE; return FALSE;
} }
memcpy(pBuf, m_pngData, m_pngSize); memcpy(pBuf, *(Handle)m_pngData, GetHandleSize((Handle)m_pngData));
return TRUE; return TRUE;
} }
@@ -267,41 +284,14 @@ bool wxBitmapDataObject::SetData(
) )
{ {
Clear(); Clear();
m_pngSize = nSize; PicHandle picHandle = (PicHandle) NewHandle( nSize ) ;
m_pngData = malloc(m_pngSize); memcpy( *picHandle , pBuf , nSize ) ;
m_pngData = picHandle ;
memcpy(m_pngData, pBuf, m_pngSize); m_pngSize = GetHandleSize( (Handle) picHandle ) ;
Rect frame = (**picHandle).picFrame ;
wxMemoryInputStream vMstream((char*)m_pngData, m_pngSize);
wxImage vImage; m_bitmap.SetPict( m_pngData ) ;
wxPNGHandler vHandler; m_bitmap.SetWidth( frame.right - frame.left ) ;
m_bitmap.SetHeight( frame.bottom - frame.top ) ;
if (!vHandler.LoadFile(&vImage, vMstream))
{
return FALSE;
}
m_bitmap = wxBitmap( vImage ) ;
return m_bitmap.Ok(); 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);
}