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