X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad81651f00edc6f489d9b6a0839d316a964fd521..a4f4d548ce0d3533fe9e84d812643cc7c21dd580:/src/mac/carbon/metafile.cpp diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp index 5742ba4ce6..3dd6682e84 100644 --- a/src/mac/carbon/metafile.cpp +++ b/src/mac/carbon/metafile.cpp @@ -1,18 +1,14 @@ ///////////////////////////////////////////////////////////////////////////// // Name: metafile.cpp // Purpose: wxMetaFile, wxMetaFileDC etc. These classes are optional. -// Author: AUTHOR +// Author: Stefan Csomor // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) AUTHOR -// Licence: wxWindows licence +// Copyright: (c) Stefan Csomor +// 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 @@ -34,6 +26,8 @@ #include "wx/metafile.h" #include "wx/clipbrd.h" +#include "wx/mac/private.h" + #include #include @@ -42,6 +36,21 @@ 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); + +private: + PicHandle m_metafile; +#if wxMAC_USE_CORE_GRAPHICS + QDPictRef m_qdPictRef ; +#endif +}; + + /* * Metafiles * Currently, the only purpose for making a metafile is to put @@ -51,14 +60,21 @@ IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) wxMetafileRefData::wxMetafileRefData(void) { m_metafile = 0; +#if wxMAC_USE_CORE_GRAPHICS + m_qdPictRef = NULL ; +#endif } wxMetafileRefData::~wxMetafileRefData(void) { if (m_metafile) { - KillPicture( m_metafile ) ; + KillPicture( (PicHandle) m_metafile ) ; m_metafile = 0; +#if wxMAC_USE_CORE_GRAPHICS + QDPictRelease( m_qdPictRef ) ; + m_qdPictRef = NULL ; +#endif } } @@ -66,9 +82,8 @@ wxMetaFile::wxMetaFile(const wxString& file) { m_refData = new wxMetafileRefData; - M_METAFILEDATA->m_metafile = 0; - wxASSERT_MSG( file.IsEmpty() , "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); @@ -79,50 +94,105 @@ 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; -/* - bool alreadyOpen=wxClipboardOpen(); + return false; + + bool alreadyOpen=wxTheClipboard->IsOpened() ; if (!alreadyOpen) { - wxOpenClipboard(); - if (!wxEmptyClipboard()) return FALSE; + wxTheClipboard->Open(); + wxTheClipboard->Clear(); + } + wxDataObject *data = + new wxMetafileDataObject( *this) ; + success = wxTheClipboard->SetData(data); + if (!alreadyOpen) + wxTheClipboard->Close(); +#endif + + return success; +} + +void wxMetafile::SetHMETAFILE(WXHMETAFILE mf) +{ + UnRef() ; + + 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 ) ; } - bool success = wxSetClipboardData(wxDF_METAFILE, this, width,height); - if (!alreadyOpen) wxCloseClipboard(); - return (bool) success; - */ - return TRUE ; +#endif } bool wxMetaFile::Play(wxDC *dc) { - if (!m_refData) - return FALSE; - - if (!dc->Ok() ) - return FALSE; - - dc->MacVerifySetup() ; - - { - PicHandle pict = GetHMETAFILE() ; - DrawPicture( pict , &(**pict).picFrame ) ; - } -/* if (!m_refData) - return FALSE; + return false; - dc->BeginDrawing(); + 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 ) ; +#else + PicHandle pict = (PicHandle) GetHMETAFILE() ; + wxMacPortSetter helper( dc ) ; + DrawPicture( pict , &(**pict).picFrame ) ; +#endif + } + return true; +} - if (dc->GetHDC() && M_METAFILEDATA->m_metafile) - PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile); +wxSize wxMetaFile::GetSize() const +{ + wxSize size = wxDefaultSize ; + if ( Ok() ) + { + PicHandle pict = (PicHandle) GetHMETAFILE() ; + Rect &r = (**pict).picFrame ; + size.x = r.right - r.left ; + size.y = r.bottom - r.top ; + } - dc->EndDrawing(); -*/ - return TRUE; + return size; } /* @@ -130,59 +200,71 @@ bool wxMetaFile::Play(wxDC *dc) * */ -// Original constructor that does not takes origin and extent. If you use this, -// *DO* give origin/extent arguments to wxMakeMetaFilePlaceable. -wxMetaFileDC::wxMetaFileDC(const wxString& file) +// 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) ) { - m_metaFile = NULL; - m_minX = 10000; - m_minY = 10000; - m_maxX = -10000; - m_maxY = -10000; + 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( file.IsEmpty() , "no file based metafile support yet") ; + m_metaFile = new wxMetaFile(filename) ; +#if wxMAC_USE_CORE_GRAPHICS +#else + Rect r={0,0,height,width} ; - m_metaFile = new wxMetaFile("") ; - Rect r={0,0,100,100} ; - - m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ; - ::GetPort( &m_macPort ) ; - m_ok = TRUE ; + RectRgn( (RgnHandle) m_macBoundaryClipRgn , &r ) ; + CopyRgn( (RgnHandle) m_macBoundaryClipRgn , (RgnHandle) m_macCurrentClipRgn ) ; - SetMapMode(wxMM_TEXT); + m_metaFile->SetHMETAFILE( (WXHMETAFILE) OpenPicture( &r ) ) ; + ::GetPort( (GrafPtr*) &m_macPort ) ; + m_ok = true ; +#endif + SetMapMode(wxMM_TEXT); } -// New constructor that takes origin and extent. If you use this, don't -// give origin/extent arguments to wxMakeMetaFilePlaceable. - -wxMetaFileDC::wxMetaFileDC(const wxString& file, int xext, int yext, int xorg, int yorg) +wxMetaFileDC::~wxMetaFileDC() { - m_minX = 10000; - m_minY = 10000; - m_maxX = -10000; - m_maxY = -10000; +} - wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ; +void wxMetaFileDC::DoGetSize(int *width, int *height) const +{ + wxCHECK_RET( m_metaFile , _T("GetSize() doesn't work without a metafile") ); - m_metaFile = new wxMetaFile("") ; - Rect r={yorg,xorg,yorg+yext,xorg+xext} ; - - m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ; - ::GetPort( &m_macPort ) ; - m_ok = TRUE ; + wxSize sz = m_metaFile->GetSize() ; + if (width) (*width) = sz.x; + if (height) (*height) = sz.y; +} - SetMapMode(wxMM_TEXT); +wxMetaFile *wxMetaFileDC::Close() +{ + ClosePicture() ; + return m_metaFile; } -wxMetaFileDC::~wxMetaFileDC() +#if wxUSE_DATAOBJ +size_t wxMetafileDataObject::GetDataSize() const { + return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ; } -wxMetaFile *wxMetaFileDC::Close() +bool wxMetafileDataObject::GetDataHere(void *buf) const { - ClosePicture() ; - return m_metaFile; + memcpy( buf , (*(PicHandle)(*((wxMetafile*)&m_metafile)).GetHMETAFILE()) , + GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ) ) ; + return true ; } +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 ; +} +#endif #endif