adding metafile and clipboard support

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31980 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2005-02-13 05:59:04 +00:00
parent 79c5fe4be8
commit 71cc158eaa
7 changed files with 193 additions and 75 deletions

View File

@@ -68,18 +68,18 @@ public:
int GetBytesPerRow() const { return m_bytesPerRow ; } int GetBytesPerRow() const { return m_bytesPerRow ; }
// renders/updates native representation when necessary // renders/updates native representation when necessary
void RealizeNative() ; void RealizeNative() ;
#if !wxMAC_USE_CORE_GRAPHICS
WXHBITMAP GetHBITMAP() const ; WXHBITMAP GetHBITMAP() const ;
#endif
private: private:
wxMemoryBuffer m_memBuf ; wxMemoryBuffer m_memBuf ;
int m_bytesPerRow ; int m_bytesPerRow ;
int m_width ; int m_width ;
int m_height ; int m_height ;
#if !wxMAC_USE_CORE_GRAPHICS
WXHBITMAP m_maskBitmap ; WXHBITMAP m_maskBitmap ;
#endif
}; };
class WXDLLEXPORT wxBitmapHandler: public wxBitmapHandlerBase class WXDLLEXPORT wxBitmapHandler: public wxBitmapHandlerBase
@@ -193,10 +193,8 @@ public:
bool HasAlpha() const; bool HasAlpha() const;
void UseAlpha(); void UseAlpha();
#if !wxMAC_USE_CORE_GRAPHICS
// returns the 'native' implementation, a GWorldPtr for the content and one for the mask // returns the 'native' implementation, a GWorldPtr for the content and one for the mask
WXHBITMAP GetHBITMAP( WXHBITMAP * mask = NULL ) const; WXHBITMAP GetHBITMAP( WXHBITMAP * mask = NULL ) const;
#endif
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
// returns a CGImageRef which must released after usage with CGImageRelease // returns a CGImageRef which must released after usage with CGImageRelease

View File

@@ -222,7 +222,9 @@ class WXDLLEXPORT wxDC: public wxDCBase
else else
return (wxCoord)((double)(new_y) * m_scaleY - 0.5) * m_signY + m_deviceOriginY + m_macLocalOrigin.y ; return (wxCoord)((double)(new_y) * m_scaleY - 0.5) * m_signY + m_deviceOriginY + m_macLocalOrigin.y ;
} }
#if !wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
wxGraphicContext* GetGraphicContext() { return m_graphicContext ; }
#else
WXHRGN MacGetCurrentClipRgn() { return m_macCurrentClipRgn ; } WXHRGN MacGetCurrentClipRgn() { return m_macCurrentClipRgn ; }
static void MacSetupBackgroundForCurrentPort(const wxBrush& background ) ; static void MacSetupBackgroundForCurrentPort(const wxBrush& background ) ;
#endif #endif

View File

@@ -32,17 +32,7 @@
#define wxMetaFileDC wxMetafileDC #define wxMetaFileDC wxMetafileDC
class WXDLLEXPORT wxMetafile; class WXDLLEXPORT wxMetafile;
class wxMetafileRefData ;
class WXDLLEXPORT wxMetafileRefData: public wxGDIRefData
{
friend class WXDLLEXPORT wxMetafile;
public:
wxMetafileRefData(void);
~wxMetafileRefData(void);
public:
WXHMETAFILE m_metafile;
};
#define M_METAFILEDATA ((wxMetafileRefData *)m_refData) #define M_METAFILEDATA ((wxMetafileRefData *)m_refData)
@@ -63,14 +53,14 @@ public:
virtual bool SetClipboard(int width = 0, int height = 0); virtual bool SetClipboard(int width = 0, int height = 0);
virtual bool Play(wxDC *dc); virtual bool Play(wxDC *dc);
inline bool Ok(void) const { return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != 0)); }; bool Ok() const ;
wxSize GetSize() const; wxSize GetSize() const;
int GetWidth() const { return GetSize().x; } int GetWidth() const { return GetSize().x; }
int GetHeight() const { return GetSize().y; } int GetHeight() const { return GetSize().y; }
// Implementation // Implementation
inline WXHMETAFILE GetHMETAFILE() const { return M_METAFILEDATA->m_metafile; } WXHMETAFILE GetHMETAFILE() const ;
void SetHMETAFILE(WXHMETAFILE mf) ; void SetHMETAFILE(WXHMETAFILE mf) ;
// Operators // Operators

View File

@@ -354,6 +354,7 @@ CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDep
void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ; void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ;
CTabHandle wxMacCreateColorTable( int numColors ) ; CTabHandle wxMacCreateColorTable( int numColors ) ;
*/ */
PicHandle wxMacCreatePicHandle( const wxBitmap &bmp ) ;
IconRef wxMacCreateIconRef(const wxBitmap& bmp) ; IconRef wxMacCreateIconRef(const wxBitmap& bmp) ;
void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 ) ; void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 ) ;
void wxMacReleaseBitmapButton( ControlButtonContentInfo*info ) ; void wxMacReleaseBitmapButton( ControlButtonContentInfo*info ) ;
@@ -597,6 +598,7 @@ private:
} ; } ;
CGColorSpaceRef wxMacGetGenericRGBColorSpace(void) ; CGColorSpaceRef wxMacGetGenericRGBColorSpace(void) ;
void wxMacMemoryBufferReleaseProc(void *info, const void *data, size_t size) ;
#endif // wxMAC_USE_CORE_GRAPHICS #endif // wxMAC_USE_CORE_GRAPHICS
@@ -638,10 +640,10 @@ public:
wxMask * m_bitmapMask; // Optional mask wxMask * m_bitmapMask; // Optional mask
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
CGImageRef CGImageCreate() const ; CGImageRef CGImageCreate() const ;
#else #endif
GWorldPtr GetHBITMAP(GWorldPtr * mask = NULL ) const ; GWorldPtr GetHBITMAP(GWorldPtr * mask = NULL ) const ;
void UpdateAlphaMask() const ; void UpdateAlphaMask() const ;
#endif
private : private :
bool Create(int width , int height , int depth) ; bool Create(int width , int height , int depth) ;
void Init() ; void Init() ;
@@ -656,12 +658,11 @@ private :
bool m_ok; bool m_ok;
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
mutable CGImageRef m_cgImageRef ; mutable CGImageRef m_cgImageRef ;
#else #endif
GWorldPtr m_hBitmap; GWorldPtr m_hBitmap;
GWorldPtr m_hMaskBitmap ; GWorldPtr m_hMaskBitmap ;
wxMemoryBuffer m_maskMemBuf ; wxMemoryBuffer m_maskMemBuf ;
int m_maskBytesPerRow ; int m_maskBytesPerRow ;
#endif
}; };
#define M_BITMAPDATA ((wxBitmapRefData *)m_refData) #define M_BITMAPDATA ((wxBitmapRefData *)m_refData)

View File

@@ -49,7 +49,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject )
// we don't dare premultiplied alpha yet // we don't dare premultiplied alpha yet
#define wxMAC_USE_PREMULTIPLIED_ALPHA 0 #define wxMAC_USE_PREMULTIPLIED_ALPHA 0
IconRef wxMacCreateIconRef(const wxBitmap& bmp) IconFamilyHandle wxMacCreateIconFamily(const wxBitmap& bmp)
{ {
// setup the header properly // setup the header properly
@@ -151,11 +151,16 @@ IconRef wxMacCreateIconRef(const wxBitmap& bmp)
HUnlock( maskdata ) ; HUnlock( maskdata ) ;
DisposeHandle( data ) ; DisposeHandle( data ) ;
DisposeHandle( maskdata ) ; DisposeHandle( maskdata ) ;
return iconFamily ;
}
IconRef wxMacCreateIconRef(const wxBitmap& bmp)
{
IconFamilyHandle iconFamily = wxMacCreateIconFamily( bmp ) ;
IconRef iconRef ; IconRef iconRef ;
static int iconCounter = 2 ; static int iconCounter = 2 ;
err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) iconCounter, iconFamily, &iconRef ) ; OSStatus err = RegisterIconRefFromIconFamily( 'WXNG' , (OSType) iconCounter, iconFamily, &iconRef ) ;
UInt16 owners ; UInt16 owners ;
err = GetIconRefOwners(iconRef , &owners ) ; err = GetIconRefOwners(iconRef , &owners ) ;
@@ -169,6 +174,44 @@ IconRef wxMacCreateIconRef(const wxBitmap& bmp)
return iconRef ; return iconRef ;
} }
PicHandle wxMacCreatePicHandle( const wxBitmap &bmp )
{
CGrafPtr origPort = NULL ;
GDHandle origDev = NULL ;
PicHandle pict = NULL ;
GWorldPtr wp = NULL ;
GWorldPtr mask = NULL ;
GetGWorld( &origPort , &origDev ) ;
wp = (GWorldPtr) bmp.GetHBITMAP( (WXHBITMAP*) &mask ) ;
SetGWorld( wp , NULL ) ;
Rect portRect ;
GetPortBounds( wp , &portRect ) ;
pict = OpenPicture(&portRect);
if(pict)
{
RGBColor white = { 0xffff ,0xffff , 0xffff } ;
RGBColor black = { 0x0000 ,0x0000 , 0x0000 } ;
RGBForeColor( &black ) ;
RGBBackColor( &white ) ;
LockPixels( GetGWorldPixMap( wp ) ) ;
CopyBits(GetPortBitMapForCopyBits(wp),
GetPortBitMapForCopyBits(wp),
&portRect,
&portRect,
srcCopy,NULL);
UnlockPixels( GetGWorldPixMap( wp ) ) ;
ClosePicture();
}
SetGWorld( origPort , origDev ) ;
return pict;
}
void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType ) void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType )
{ {
memset( info , 0 , sizeof(ControlButtonContentInfo) ) ; memset( info , 0 , sizeof(ControlButtonContentInfo) ) ;
@@ -219,11 +262,11 @@ void wxBitmapRefData::Init()
m_bitmapMask = NULL ; m_bitmapMask = NULL ;
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
m_cgImageRef = NULL ; m_cgImageRef = NULL ;
#else #endif
m_hBitmap = NULL ; m_hBitmap = NULL ;
m_hMaskBitmap = NULL; m_hMaskBitmap = NULL;
m_maskBytesPerRow = NULL ; m_maskBytesPerRow = NULL ;
#endif
m_rawAccessCount = 0 ; m_rawAccessCount = 0 ;
m_hasAlpha = false; m_hasAlpha = false;
} }
@@ -250,16 +293,14 @@ bool wxBitmapRefData::Create( int w , int h , int d )
void* data = m_memBuf.GetWriteBuf(size) ; void* data = m_memBuf.GetWriteBuf(size) ;
memset( data , 0 , size) ; memset( data , 0 , size) ;
m_memBuf.UngetWriteBuf(size) ; m_memBuf.UngetWriteBuf(size) ;
#if wxMAC_USE_CORE_GRAPHICS
m_ok = true ;
#else
m_hBitmap = NULL ; m_hBitmap = NULL ;
Rect rect = { 0 , 0 , m_height , m_width } ; Rect rect = { 0 , 0 , m_height , m_width } ;
verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_hBitmap , k32ARGBPixelFormat , &rect , NULL , NULL , 0 , verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_hBitmap , k32ARGBPixelFormat , &rect , NULL , NULL , 0 ,
(char*) data , m_bytesPerRow ) ) ; (char*) data , m_bytesPerRow ) ) ;
wxASSERT_MSG( m_hBitmap , wxT("Unable to create GWorld context") ) ; wxASSERT_MSG( m_hBitmap , wxT("Unable to create GWorld context") ) ;
m_ok = ( m_hBitmap != NULL ) ; m_ok = ( m_hBitmap != NULL ) ;
#endif
return m_ok ; return m_ok ;
} }
@@ -269,7 +310,6 @@ void wxBitmapRefData::UseAlpha( bool use )
return ; return ;
m_hasAlpha = use ; m_hasAlpha = use ;
#if !wxMAC_USE_CORE_GRAPHICS
if ( m_hasAlpha ) if ( m_hasAlpha )
{ {
int width = GetWidth() ; int width = GetWidth() ;
@@ -284,7 +324,9 @@ void wxBitmapRefData::UseAlpha( bool use )
(char*) data , m_maskBytesPerRow ) ) ; (char*) data , m_maskBytesPerRow ) ) ;
wxASSERT_MSG( m_hMaskBitmap , wxT("Unable to create GWorld context for alpha mask") ) ; wxASSERT_MSG( m_hMaskBitmap , wxT("Unable to create GWorld context for alpha mask") ) ;
m_maskMemBuf.UngetWriteBuf(size) ; m_maskMemBuf.UngetWriteBuf(size) ;
#if !wxMAC_USE_CORE_GRAPHICS
UpdateAlphaMask() ; UpdateAlphaMask() ;
#endif
} }
else else
{ {
@@ -292,7 +334,6 @@ void wxBitmapRefData::UseAlpha( bool use )
m_hMaskBitmap = NULL ; m_hMaskBitmap = NULL ;
m_maskBytesPerRow = 0 ; m_maskBytesPerRow = 0 ;
} }
#endif
} }
void *wxBitmapRefData::GetRawAccess() const void *wxBitmapRefData::GetRawAccess() const
@@ -330,9 +371,11 @@ void wxBitmapRefData::EndRawAccess()
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
static void FreeImageMemoryBufferInstance(void *info, const void *data, size_t size) void wxMacMemoryBufferReleaseProc(void *info, const void *data, size_t size)
{ {
delete ((wxMemoryBuffer*)info) ; wxMemoryBuffer* membuf = (wxMemoryBuffer*) info ;
wxASSERT( data == membuf->GetData() ) ;
delete membuf ;
} }
CGImageRef wxBitmapRefData::CGImageCreate() const CGImageRef wxBitmapRefData::CGImageCreate() const
@@ -381,7 +424,8 @@ CGImageRef wxBitmapRefData::CGImageCreate() const
} }
CGColorSpaceRef colorSpace = wxMacGetGenericRGBColorSpace(); CGColorSpaceRef colorSpace = wxMacGetGenericRGBColorSpace();
CGDataProviderRef dataProvider = CGDataProviderRef dataProvider =
CGDataProviderCreateWithData( membuf , (const void *)membuf->GetData() , imageSize, FreeImageMemoryBufferInstance ); CGDataProviderCreateWithData( membuf , (const void *)membuf->GetData() , imageSize,
wxMacMemoryBufferReleaseProc );
image = image =
::CGImageCreate( w, h, 8 , 32 , 4 * m_width , colorSpace, alphaInfo , ::CGImageCreate( w, h, 8 , 32 , 4 * m_width , colorSpace, alphaInfo ,
dataProvider, NULL , false , kCGRenderingIntentDefault ); dataProvider, NULL , false , kCGRenderingIntentDefault );
@@ -402,7 +446,6 @@ CGImageRef wxBitmapRefData::CGImageCreate() const
} }
#endif #endif
#if !wxMAC_USE_CORE_GRAPHICS
GWorldPtr wxBitmapRefData::GetHBITMAP(GWorldPtr* mask) const GWorldPtr wxBitmapRefData::GetHBITMAP(GWorldPtr* mask) const
{ {
wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") ); wxCHECK_MSG( Ok(), NULL, wxT("invalid bitmap") );
@@ -413,8 +456,14 @@ GWorldPtr wxBitmapRefData::GetHBITMAP(GWorldPtr* mask) const
*mask = (GWorldPtr) m_bitmapMask->GetHBITMAP() ; *mask = (GWorldPtr) m_bitmapMask->GetHBITMAP() ;
else if ( m_hasAlpha ) else if ( m_hasAlpha )
{ {
#if !wxMAC_USE_CORE_GRAPHICS
if ( m_rawAccessCount > 0 ) if ( m_rawAccessCount > 0 )
UpdateAlphaMask() ; UpdateAlphaMask() ;
#else
// this structure is not kept in synch when using CG, so if someone
// is really accessing the Graphports, we have to sync it
UpdateAlphaMask() ;
#endif
*mask = m_hMaskBitmap ; *mask = m_hMaskBitmap ;
} }
} }
@@ -442,8 +491,6 @@ void wxBitmapRefData::UpdateAlphaMask() const
} }
} }
#endif
void wxBitmapRefData::Free() void wxBitmapRefData::Free()
{ {
wxASSERT_MSG( m_rawAccessCount == 0 , wxT("Bitmap still selected when destroyed") ) ; wxASSERT_MSG( m_rawAccessCount == 0 , wxT("Bitmap still selected when destroyed") ) ;
@@ -454,7 +501,7 @@ void wxBitmapRefData::Free()
CGImageRelease( m_cgImageRef ) ; CGImageRelease( m_cgImageRef ) ;
m_cgImageRef = NULL ; m_cgImageRef = NULL ;
} }
#else #endif
if ( m_hBitmap ) if ( m_hBitmap )
{ {
DisposeGWorld( MAC_WXHBITMAP(m_hBitmap) ) ; DisposeGWorld( MAC_WXHBITMAP(m_hBitmap) ) ;
@@ -465,7 +512,6 @@ void wxBitmapRefData::Free()
DisposeGWorld( MAC_WXHBITMAP(m_hMaskBitmap) ) ; DisposeGWorld( MAC_WXHBITMAP(m_hMaskBitmap) ) ;
m_hMaskBitmap = NULL ; m_hMaskBitmap = NULL ;
} }
#endif
if (m_bitmapMask) if (m_bitmapMask)
{ {
@@ -485,14 +531,49 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon)
int h = icon.GetHeight() ; int h = icon.GetHeight() ;
Create( icon.GetWidth() , icon.GetHeight() ) ; Create( icon.GetWidth() , icon.GetHeight() ) ;
if ( w == h && w == 32 ) if ( w == h && ( w == 16 || w == 32 || w == 48 || w == 128 ) )
{ {
IconFamilyHandle iconFamily = NULL ; IconFamilyHandle iconFamily = NULL ;
Handle imagehandle = NewHandle(0) ; Handle imagehandle = NewHandle(0) ;
Handle maskhandle = NewHandle(0) ; Handle maskhandle = NewHandle(0) ;
OSStatus err = ( IconRefToIconFamily( MAC_WXHICON(icon.GetHICON()) , kSelectorLarge32Bit | kSelectorLarge8BitMask , &iconFamily ) ) ;
err =( GetIconFamilyData( iconFamily , kLarge32BitData , imagehandle ) ) ; OSType maskType ;
err =( GetIconFamilyData( iconFamily , kLarge8BitMask , maskhandle ) ) ; OSType dataType ;
IconSelectorValue selector ;
if ( w == 128 )
{
dataType = kThumbnail32BitData ;
maskType = kThumbnail8BitMask ;
selector = kSelectorAllAvailableData ;
}
else if ( w == 48 )
{
dataType = kHuge32BitData ;
maskType = kHuge8BitMask ;
selector = kSelectorHuge32Bit | kSelectorHuge8BitMask ;
}
else if ( w == 32 )
{
dataType = kLarge32BitData ;
maskType = kLarge8BitMask ;
selector = kSelectorLarge32Bit | kSelectorLarge8BitMask ;
}
else if ( w == 16 )
{
dataType = kSmall32BitData ;
maskType = kSmall8BitMask ;
selector = kSelectorSmall32Bit | kSelectorSmall8BitMask ;
}
else
{
wxFAIL_MSG(wxT("Illegal icon size for conversion") ) ;
}
OSStatus err = ( IconRefToIconFamily( MAC_WXHICON(icon.GetHICON()) , selector , &iconFamily ) ) ;
err =( GetIconFamilyData( iconFamily , dataType , imagehandle ) ) ;
err =( GetIconFamilyData( iconFamily , maskType , maskhandle ) ) ;
wxASSERT( GetHandleSize( imagehandle ) == w * 4 * h ) ; wxASSERT( GetHandleSize( imagehandle ) == w * 4 * h ) ;
wxASSERT( GetHandleSize( maskhandle ) == w * h ) ; wxASSERT( GetHandleSize( maskhandle ) == w * h ) ;
UseAlpha() ; UseAlpha() ;
@@ -1024,12 +1105,10 @@ void wxBitmap::SetMask(wxMask *mask)
M_BITMAPDATA->m_bitmapMask = mask ; M_BITMAPDATA->m_bitmapMask = mask ;
} }
#if !wxMAC_USE_CORE_GRAPHICS
WXHBITMAP wxBitmap::GetHBITMAP(WXHBITMAP* mask) const WXHBITMAP wxBitmap::GetHBITMAP(WXHBITMAP* mask) const
{ {
return WXHBITMAP(M_BITMAPDATA->GetHBITMAP((GWorldPtr*)mask)); return WXHBITMAP(M_BITMAPDATA->GetHBITMAP((GWorldPtr*)mask));
} }
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxMask // wxMask
@@ -1064,22 +1143,17 @@ wxMask::wxMask(const wxMemoryBuffer& data, int width , int height , int bytesPer
wxMask::~wxMask() wxMask::~wxMask()
{ {
#if !wxMAC_USE_CORE_GRAPHICS
if ( m_maskBitmap ) if ( m_maskBitmap )
{ {
DisposeGWorld( (GWorldPtr) m_maskBitmap ) ; DisposeGWorld( (GWorldPtr) m_maskBitmap ) ;
m_maskBitmap = NULL ; m_maskBitmap = NULL ;
} }
#endif
} }
void wxMask::Init() void wxMask::Init()
{ {
m_width = m_height = m_bytesPerRow = 0 ; m_width = m_height = m_bytesPerRow = 0 ;
#if !wxMAC_USE_CORE_GRAPHICS
m_maskBitmap = NULL ; m_maskBitmap = NULL ;
#endif
} }
void *wxMask::GetRawAccess() const void *wxMask::GetRawAccess() const
@@ -1089,7 +1163,6 @@ void *wxMask::GetRawAccess() const
void wxMask::RealizeNative() void wxMask::RealizeNative()
{ {
#if !wxMAC_USE_CORE_GRAPHICS
if ( m_maskBitmap ) if ( m_maskBitmap )
{ {
DisposeGWorld( (GWorldPtr) m_maskBitmap ) ; DisposeGWorld( (GWorldPtr) m_maskBitmap ) ;
@@ -1098,7 +1171,6 @@ void wxMask::RealizeNative()
Rect rect = { 0 , 0 , m_height , m_width } ; Rect rect = { 0 , 0 , m_height , m_width } ;
verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_maskBitmap , k8IndexedGrayPixelFormat , &rect , NULL , NULL , 0 , verify_noerr( NewGWorldFromPtr( (GWorldPtr*) &m_maskBitmap , k8IndexedGrayPixelFormat , &rect , NULL , NULL , 0 ,
(char*) m_memBuf.GetData() , m_bytesPerRow ) ) ; (char*) m_memBuf.GetData() , m_bytesPerRow ) ) ;
#endif
} }
// Create a mask from a mono bitmap (copies the bitmap). // Create a mask from a mono bitmap (copies the bitmap).
@@ -1175,12 +1247,10 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour)
return TRUE; return TRUE;
} }
#if !wxMAC_USE_CORE_GRAPHICS
WXHBITMAP wxMask::GetHBITMAP() const WXHBITMAP wxMask::GetHBITMAP() const
{ {
return m_maskBitmap ; return m_maskBitmap ;
} }
#endif
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxBitmapHandler // wxBitmapHandler

View File

@@ -32,6 +32,7 @@
#include "wx/dataobj.h" #include "wx/dataobj.h"
#include "wx/mstream.h" #include "wx/mstream.h"
#include "wx/image.h" #include "wx/image.h"
#include "wx/metafile.h"
#include "wx/mac/private.h" #include "wx/mac/private.h"
#include <Scrap.h> #include <Scrap.h>
@@ -250,9 +251,8 @@ wxBitmapDataObject::wxBitmapDataObject(
Init(); Init();
if ( m_bitmap.Ok() ) if ( m_bitmap.Ok() )
{ {
/* m_pictHandle = wxMacCreatePicHandle( rBitmap ) ;
m_pictHandle = m_bitmap.GetBitmapData()->GetPict( &m_pictCreated ) ; m_pictCreated = true ;
*/
} }
} }
@@ -269,9 +269,8 @@ void wxBitmapDataObject::SetBitmap(
wxBitmapDataObjectBase::SetBitmap(rBitmap); wxBitmapDataObjectBase::SetBitmap(rBitmap);
if ( m_bitmap.Ok() ) if ( m_bitmap.Ok() )
{ {
/* m_pictHandle = wxMacCreatePicHandle( rBitmap ) ;
m_pictHandle = m_bitmap.GetBitmapData()->GetPict( &m_pictCreated ) ; m_pictCreated = true ;
*/
} }
} }
@@ -320,10 +319,14 @@ bool wxBitmapDataObject::SetData(
// ownership is transferred to the bitmap // ownership is transferred to the bitmap
m_pictCreated = false ; m_pictCreated = false ;
Rect frame = (**picHandle).picFrame ; Rect frame = (**picHandle).picFrame ;
/*
m_bitmap.GetBitmapData()->SetPict( (WXHMETAFILE) picHandle ) ; wxMetafile mf ;
m_bitmap.SetWidth( frame.right - frame.left ) ; mf.SetHMETAFILE( (WXHMETAFILE) m_pictHandle ) ;
m_bitmap.SetHeight( frame.bottom - frame.top ) ; wxMemoryDC mdc ;
*/ m_bitmap.Create( frame.right - frame.left ,frame.bottom - frame.top ) ;
mdc.SelectObject(m_bitmap ) ;
mf.Play( &mdc ) ;
mdc.SelectObject( wxNullBitmap ) ;
return m_bitmap.Ok(); return m_bitmap.Ok();
} }

View File

@@ -42,6 +42,21 @@ IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject)
IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
#endif #endif
class wxMetafileRefData: public wxGDIRefData
{
friend class WXDLLEXPORT wxMetafile;
public:
wxMetafileRefData(void);
~wxMetafileRefData(void);
private:
PicHandle m_metafile;
#if wxMAC_USE_CORE_GRAPHICS
QDPictRef m_qdPictRef ;
#endif
};
/* /*
* Metafiles * Metafiles
* Currently, the only purpose for making a metafile is to put * Currently, the only purpose for making a metafile is to put
@@ -51,6 +66,9 @@ IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC)
wxMetafileRefData::wxMetafileRefData(void) wxMetafileRefData::wxMetafileRefData(void)
{ {
m_metafile = 0; m_metafile = 0;
#if wxMAC_USE_CORE_GRAPHICS
m_qdPictRef = NULL ;
#endif
} }
wxMetafileRefData::~wxMetafileRefData(void) wxMetafileRefData::~wxMetafileRefData(void)
@@ -59,6 +77,10 @@ wxMetafileRefData::~wxMetafileRefData(void)
{ {
KillPicture( (PicHandle) m_metafile ) ; KillPicture( (PicHandle) m_metafile ) ;
m_metafile = 0; m_metafile = 0;
#if wxMAC_USE_CORE_GRAPHICS
QDPictRelease( m_qdPictRef ) ;
m_qdPictRef = NULL ;
#endif
} }
} }
@@ -66,7 +88,6 @@ wxMetaFile::wxMetaFile(const wxString& file)
{ {
m_refData = new wxMetafileRefData; m_refData = new wxMetafileRefData;
M_METAFILEDATA->m_metafile = 0; M_METAFILEDATA->m_metafile = 0;
wxASSERT_MSG( file.IsEmpty() , wxT("no file based metafile support yet") ) ; wxASSERT_MSG( file.IsEmpty() , wxT("no file based metafile support yet") ) ;
/* /*
@@ -79,6 +100,16 @@ wxMetaFile::~wxMetaFile()
{ {
} }
bool wxMetaFile::Ok() const
{
return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != 0));
}
WXHMETAFILE wxMetaFile::GetHMETAFILE() const
{
return (WXHMETAFILE) M_METAFILEDATA->m_metafile;
}
bool wxMetaFile::SetClipboard(int width, int height) bool wxMetaFile::SetClipboard(int width, int height)
{ {
#if wxUSE_DRAG_AND_DROP #if wxUSE_DRAG_AND_DROP
@@ -104,12 +135,26 @@ bool wxMetaFile::SetClipboard(int width, int height)
void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) void wxMetafile::SetHMETAFILE(WXHMETAFILE mf)
{ {
if (!m_refData) UnRef() ;
m_refData = new wxMetafileRefData;
if ( M_METAFILEDATA->m_metafile ) m_refData = new wxMetafileRefData;
KillPicture( (PicHandle) M_METAFILEDATA->m_metafile ) ;
M_METAFILEDATA->m_metafile = mf; M_METAFILEDATA->m_metafile = (PicHandle) mf;
#if wxMAC_USE_CORE_GRAPHICS
size_t sz = GetHandleSize( (Handle) M_METAFILEDATA->m_metafile ) ;
wxMemoryBuffer* membuf = new wxMemoryBuffer( sz ) ;
void * data = membuf->GetWriteBuf(sz) ;
memcpy( data , *M_METAFILEDATA->m_metafile , sz ) ;
membuf->UngetWriteBuf(sz) ;
CGDataProviderRef provider = CGDataProviderCreateWithData( membuf , data , sz ,
wxMacMemoryBufferReleaseProc ) ;
M_METAFILEDATA->m_qdPictRef = NULL ;
if ( provider != NULL )
{
M_METAFILEDATA->m_qdPictRef = QDPictCreateWithProvider( provider ) ;
CGDataProviderRelease( provider ) ;
}
#endif
} }
bool wxMetaFile::Play(wxDC *dc) bool wxMetaFile::Play(wxDC *dc)
@@ -121,10 +166,19 @@ bool wxMetaFile::Play(wxDC *dc)
return FALSE; return FALSE;
{ {
PicHandle pict = (PicHandle) GetHMETAFILE() ;
#if wxMAC_USE_CORE_GRAPHICS #if wxMAC_USE_CORE_GRAPHICS
QDPictRef cgPictRef = M_METAFILEDATA->m_qdPictRef ;
CGContextRef cg = dynamic_cast<wxMacCGContext*>(dc->GetGraphicContext())->GetNativeContext() ;
CGRect bounds = QDPictGetBounds( cgPictRef ) ;
CGContextSaveGState(cg);
CGContextTranslateCTM(cg, 0 , bounds.size.width );
CGContextScaleCTM(cg, 1, -1);
QDPictDrawToCGContext( cg , bounds , cgPictRef ) ;
CGContextRestoreGState( cg ) ;
#else #else
wxMacPortSetter helper( dc ) ; wxMacPortSetter helper( dc ) ;
PicHandle pict = (PicHandle) GetHMETAFILE() ;
DrawPicture( pict , &(**pict).picFrame ) ; DrawPicture( pict , &(**pict).picFrame ) ;
#endif #endif
} }