X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..a8d2fb31cbf09dcc4683c9566ff4bc89580f268c:/src/mac/carbon/metafile.cpp?ds=sidebyside diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp index 594fe43af5..3dd6682e84 100644 --- a/src/mac/carbon/metafile.cpp +++ b/src/mac/carbon/metafile.cpp @@ -9,10 +9,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "metafile.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -20,10 +16,6 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP -#include "wx/setup.h" -#endif - #if wxUSE_METAFILE #ifndef WX_PRECOMP @@ -41,10 +33,23 @@ extern bool wxClipboardIsOpen; -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) + +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 @@ -55,6 +60,9 @@ IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) wxMetafileRefData::wxMetafileRefData(void) { m_metafile = 0; +#if wxMAC_USE_CORE_GRAPHICS + m_qdPictRef = NULL ; +#endif } wxMetafileRefData::~wxMetafileRefData(void) @@ -63,6 +71,10 @@ wxMetafileRefData::~wxMetafileRefData(void) { KillPicture( (PicHandle) m_metafile ) ; m_metafile = 0; +#if wxMAC_USE_CORE_GRAPHICS + QDPictRelease( m_qdPictRef ) ; + m_qdPictRef = NULL ; +#endif } } @@ -70,9 +82,8 @@ wxMetaFile::wxMetaFile(const wxString& file) { m_refData = new wxMetafileRefData; - M_METAFILEDATA->m_metafile = 0; - wxASSERT_MSG( file.IsEmpty() , wxT("no file based metafile support yet") ) ; + wxASSERT_MSG( file.empty() , wxT("no file based metafile support yet") ) ; /* if (!file.IsNull() && (file.Cmp("") == 0)) M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile(file); @@ -83,13 +94,25 @@ 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 success = true; + #if wxUSE_DRAG_AND_DROP //TODO finishi this port , we need the data obj first if (!m_refData) - return FALSE; - + return false; + bool alreadyOpen=wxTheClipboard->IsOpened() ; if (!alreadyOpen) { @@ -98,38 +121,64 @@ bool wxMetaFile::SetClipboard(int width, int height) } wxDataObject *data = new wxMetafileDataObject( *this) ; - bool success = wxTheClipboard->SetData(data); - if (!alreadyOpen) + success = wxTheClipboard->SetData(data); + if (!alreadyOpen) wxTheClipboard->Close(); - return (bool) success; #endif - return TRUE ; + + return success; } void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) { - if (!m_refData) - m_refData = new wxMetafileRefData; - if ( M_METAFILEDATA->m_metafile ) - KillPicture( (PicHandle) M_METAFILEDATA->m_metafile ) ; + UnRef() ; - M_METAFILEDATA->m_metafile = mf; + m_refData = new wxMetafileRefData; + + 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) { if (!m_refData) - return FALSE; - + return false; + if (!dc->Ok() ) - return FALSE; - + return false; + { - wxMacPortSetter helper( dc ) ; +#if wxMAC_USE_CORE_GRAPHICS + QDPictRef cgPictRef = M_METAFILEDATA->m_qdPictRef ; + CGContextRef cg = ((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 PicHandle pict = (PicHandle) GetHMETAFILE() ; + wxMacPortSetter helper( dc ) ; DrawPicture( pict , &(**pict).picFrame ) ; +#endif } - return TRUE; + return true; } wxSize wxMetaFile::GetSize() const @@ -159,19 +208,21 @@ wxMetaFileDC::wxMetaFileDC(const wxString& filename , const wxString& WXUNUSED(description) ) { wxASSERT_MSG( width == 0 || height == 0 , _T("no arbitration of metafilesize supported") ) ; - wxASSERT_MSG( filename.IsEmpty() , _T("no file based metafile support yet")) ; - + wxASSERT_MSG( filename.empty() , _T("no file based metafile support yet")) ; + m_metaFile = new wxMetaFile(filename) ; +#if wxMAC_USE_CORE_GRAPHICS +#else Rect r={0,0,height,width} ; - + RectRgn( (RgnHandle) m_macBoundaryClipRgn , &r ) ; CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; - m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ; - ::GetPort( (GrafPtr*) &m_macPort ) ; - m_ok = TRUE ; - - SetMapMode(wxMM_TEXT); + m_metaFile->SetHMETAFILE( (WXHMETAFILE) OpenPicture( &r ) ) ; + ::GetPort( (GrafPtr*) &m_macPort ) ; + m_ok = true ; +#endif + SetMapMode(wxMM_TEXT); } wxMetaFileDC::~wxMetaFileDC() @@ -211,7 +262,7 @@ bool wxMetafileDataObject::SetData(size_t len, const void *buf) Handle handle = NewHandle( len ) ; SetHandleSize( handle , len ) ; memcpy( *handle , buf , len ) ; - m_metafile.SetHMETAFILE( handle ) ; + m_metafile.SetHMETAFILE( (WXHMETAFILE) handle ) ; return true ; } #endif