X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8907154c1a8a6882c6797d1f16393ddfb23e7f3a..3193b86f29845b6e72f891400117879e6b97b112:/src/mac/carbon/metafile.cpp diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp index 3dd6682e84..8bb2a11842 100644 --- a/src/mac/carbon/metafile.cpp +++ b/src/mac/carbon/metafile.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: metafile.cpp +// Name: src/mac/carbon/metafile.cpp // Purpose: wxMetaFile, wxMetaFileDC etc. These classes are optional. // Author: Stefan Csomor // Modified by: @@ -8,72 +8,65 @@ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// +// +// Currently, the only purpose for making a metafile +// is to put it on the clipboard. -// For compilers that support precompilation, includes "wx.h". -#include "wx/wxprec.h" -#ifdef __BORLANDC__ -#pragma hdrstop -#endif +#include "wx/wxprec.h" #if wxUSE_METAFILE #ifndef WX_PRECOMP -#include "wx/utils.h" -#include "wx/app.h" + #include "wx/utils.h" + #include "wx/app.h" #endif #include "wx/metafile.h" #include "wx/clipbrd.h" - #include "wx/mac/private.h" #include #include -extern bool wxClipboardIsOpen; - IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) class wxMetafileRefData: public wxGDIRefData { friend class WXDLLEXPORT wxMetafile; + public: - wxMetafileRefData(void); - ~wxMetafileRefData(void); + wxMetafileRefData(); + virtual ~wxMetafileRefData(); private: PicHandle m_metafile; + #if wxMAC_USE_CORE_GRAPHICS - QDPictRef m_qdPictRef ; + QDPictRef m_qdPictRef; #endif }; - -/* - * Metafiles - * Currently, the only purpose for making a metafile is to put - * it on the clipboard. - */ - -wxMetafileRefData::wxMetafileRefData(void) +wxMetafileRefData::wxMetafileRefData() { - m_metafile = 0; + m_metafile = NULL; + #if wxMAC_USE_CORE_GRAPHICS - m_qdPictRef = NULL ; + m_qdPictRef = NULL; #endif } -wxMetafileRefData::~wxMetafileRefData(void) +wxMetafileRefData::~wxMetafileRefData() { if (m_metafile) { - KillPicture( (PicHandle) m_metafile ) ; - m_metafile = 0; + KillPicture( (PicHandle)m_metafile ); + m_metafile = NULL; + #if wxMAC_USE_CORE_GRAPHICS - QDPictRelease( m_qdPictRef ) ; - m_qdPictRef = NULL ; + QDPictRelease( m_qdPictRef ); + m_qdPictRef = NULL; #endif } } @@ -82,21 +75,22 @@ wxMetaFile::wxMetaFile(const wxString& file) { m_refData = new wxMetafileRefData; - M_METAFILEDATA->m_metafile = 0; - wxASSERT_MSG( file.empty() , wxT("no file based metafile support yet") ) ; -/* + M_METAFILEDATA->m_metafile = NULL; + wxASSERT_MSG( file.empty(), wxT("no file-based metafile support yet") ); + +#if 0 if (!file.IsNull() && (file.Cmp("") == 0)) - M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile(file); -*/ + M_METAFILEDATA->m_metafile = (WXHANDLE) GetMetaFile( file ); +#endif } wxMetaFile::~wxMetaFile() { } -bool wxMetaFile::Ok() const +bool wxMetaFile::IsOk() const { - return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != 0)); + return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != NULL)); } WXHMETAFILE wxMetaFile::GetHMETAFILE() const @@ -109,19 +103,19 @@ 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) + // TODO: to finish this port, we need the data object first + if (m_refData == NULL) return false; - bool alreadyOpen=wxTheClipboard->IsOpened() ; + bool alreadyOpen = wxTheClipboard->IsOpened(); if (!alreadyOpen) { wxTheClipboard->Open(); wxTheClipboard->Clear(); } - wxDataObject *data = - new wxMetafileDataObject( *this) ; - success = wxTheClipboard->SetData(data); + + wxDataObject *data = new wxMetafileDataObject( *this ); + success = wxTheClipboard->SetData( data ); if (!alreadyOpen) wxTheClipboard->Close(); #endif @@ -131,24 +125,27 @@ bool wxMetaFile::SetClipboard(int width, int height) void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) { - UnRef() ; + UnRef(); m_refData = new wxMetafileRefData; - M_METAFILEDATA->m_metafile = (PicHandle) 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 ) + 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 ) ; + M_METAFILEDATA->m_qdPictRef = QDPictCreateWithProvider( provider ); + CGDataProviderRelease( provider ); } #endif } @@ -158,71 +155,76 @@ bool wxMetaFile::Play(wxDC *dc) if (!m_refData) return false; - if (!dc->Ok() ) + if (!dc->Ok()) return false; { #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 ) ; + 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 ) ; + PicHandle pict = (PicHandle)GetHMETAFILE(); + wxMacPortSetter helper( dc ); + Rect picFrame; + DrawPicture( pict, wxMacGetPictureBounds( pict, &picFrame ) ); #endif } + return true; } wxSize wxMetaFile::GetSize() const { - wxSize size = wxDefaultSize ; - if ( Ok() ) + wxSize dataSize = wxDefaultSize; + + if (Ok()) { - PicHandle pict = (PicHandle) GetHMETAFILE() ; - Rect &r = (**pict).picFrame ; - size.x = r.right - r.left ; - size.y = r.bottom - r.top ; + PicHandle pict = (PicHandle)GetHMETAFILE(); + Rect r; + wxMacGetPictureBounds( pict, &r ); + dataSize.x = r.right - r.left; + dataSize.y = r.bottom - r.top; } - return size; + return dataSize; } -/* - * Metafile device context - * - */ +// Metafile device context // New constructor that takes origin and extent. If you use this, don't // give origin/extent arguments to wxMakeMetaFilePlaceable. -wxMetaFileDC::wxMetaFileDC(const wxString& filename , - int width , int height , - const wxString& WXUNUSED(description) ) +wxMetaFileDC::wxMetaFileDC( + const wxString& filename, + int width, int height, + const wxString& WXUNUSED(description) ) { - wxASSERT_MSG( width == 0 || height == 0 , _T("no arbitration of metafilesize supported") ) ; - wxASSERT_MSG( filename.empty() , _T("no file based metafile support yet")) ; + wxASSERT_MSG( width <= 0 || height <= 0, wxT("no arbitration of metafile size supported") ); + wxASSERT_MSG( filename.empty(), wxT("no file based metafile support yet")); + + m_metaFile = new wxMetaFile( filename ); - m_metaFile = new wxMetaFile(filename) ; #if wxMAC_USE_CORE_GRAPHICS #else - Rect r={0,0,height,width} ; + Rect r = { 0, 0, height, width }; - RectRgn( (RgnHandle) m_macBoundaryClipRgn , &r ) ; - CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; + RectRgn( (RgnHandle)m_macBoundaryClipRgn, &r ); + CopyRgn( (RgnHandle)m_macBoundaryClipRgn, (RgnHandle)m_macCurrentClipRgn ); - m_metaFile->SetHMETAFILE( (WXHMETAFILE) OpenPicture( &r ) ) ; - ::GetPort( (GrafPtr*) &m_macPort ) ; - m_ok = true ; + m_metaFile->SetHMETAFILE( (WXHMETAFILE)OpenPicture( &r ) ); + ::GetPort( (GrafPtr*)&m_macPort ); + + m_ok = true; #endif - SetMapMode(wxMM_TEXT); + + SetMapMode( wxMM_TEXT ); } wxMetaFileDC::~wxMetaFileDC() @@ -231,39 +233,47 @@ wxMetaFileDC::~wxMetaFileDC() void wxMetaFileDC::DoGetSize(int *width, int *height) const { - wxCHECK_RET( m_metaFile , _T("GetSize() doesn't work without a metafile") ); + wxCHECK_RET( m_metaFile, wxT("GetSize() doesn't work without a metafile") ); - wxSize sz = m_metaFile->GetSize() ; - if (width) (*width) = sz.x; - if (height) (*height) = sz.y; + wxSize sz = m_metaFile->GetSize(); + if (width) + (*width) = sz.x; + if (height) + (*height) = sz.y; } wxMetaFile *wxMetaFileDC::Close() { - ClosePicture() ; + ClosePicture(); + return m_metaFile; } #if wxUSE_DATAOBJ size_t wxMetafileDataObject::GetDataSize() const { - return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ; + return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ); } bool wxMetafileDataObject::GetDataHere(void *buf) const { - memcpy( buf , (*(PicHandle)(*((wxMetafile*)&m_metafile)).GetHMETAFILE()) , - GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ) ; - return true ; + Handle pictH = (Handle)(*((wxMetafile*)&m_metafile)).GetHMETAFILE(); + bool result = (pictH != NULL); + + if (result) + memcpy( buf, *pictH, GetHandleSize( pictH ) ); + + return result; } bool wxMetafileDataObject::SetData(size_t len, const void *buf) { - Handle handle = NewHandle( len ) ; - SetHandleSize( handle , len ) ; - memcpy( *handle , buf , len ) ; - m_metafile.SetHMETAFILE( (WXHMETAFILE) handle ) ; - return true ; + Handle handle = NewHandle( len ); + SetHandleSize( handle, len ); + memcpy( *handle, buf, len ); + m_metafile.SetHMETAFILE( (WXHMETAFILE) handle ); + + return true; } #endif