X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/519cb848a8f4c91c73421bb75314754284e593a4..1934a64e10df502a7930e97767e213e235fe551b:/src/mac/carbon/metafile.cpp diff --git a/src/mac/carbon/metafile.cpp b/src/mac/carbon/metafile.cpp index 97e31948bf..a99899b188 100644 --- a/src/mac/carbon/metafile.cpp +++ b/src/mac/carbon/metafile.cpp @@ -1,66 +1,76 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: metafile.cpp +// Name: src/mac/carbon/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 ///////////////////////////////////////////////////////////////////////////// +// +// Currently, the only purpose for making a metafile +// is to put it on the clipboard. -#ifdef __GNUG__ -#pragma implementation "metafile.h" -#endif -// For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#ifndef WX_PRECOMP -#include "wx/setup.h" -#endif - #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 "wx/graphics.h" #include #include -extern bool wxClipboardIsOpen; - -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxMetafile, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxMetafileDC, wxDC) -#endif -/* - * Metafiles - * Currently, the only purpose for making a metafile is to put - * it on the clipboard. - */ +class wxMetafileRefData: public wxGDIRefData +{ + friend class WXDLLEXPORT wxMetafile; + +public: + wxMetafileRefData(); + virtual ~wxMetafileRefData(); -wxMetafileRefData::wxMetafileRefData(void) +private: + PicHandle m_metafile; + +#if wxMAC_USE_CORE_GRAPHICS + QDPictRef m_qdPictRef; +#endif +}; + +wxMetafileRefData::wxMetafileRefData() { - m_metafile = 0; + m_metafile = NULL; + +#if wxMAC_USE_CORE_GRAPHICS + m_qdPictRef = NULL; +#endif } -wxMetafileRefData::~wxMetafileRefData(void) +wxMetafileRefData::~wxMetafileRefData() { if (m_metafile) { - KillPicture( m_metafile ) ; - m_metafile = 0; +#ifndef __LP64__ + KillPicture( (PicHandle)m_metafile ); + m_metafile = NULL; + +#if wxMAC_USE_CORE_GRAPHICS + QDPictRelease( m_qdPictRef ); + m_qdPictRef = NULL; +#endif +#endif } } @@ -68,123 +78,213 @@ wxMetaFile::wxMetaFile(const wxString& file) { m_refData = new wxMetafileRefData; + M_METAFILEDATA->m_metafile = NULL; + wxASSERT_MSG( file.empty(), wxT("no file-based metafile support yet") ); - M_METAFILEDATA->m_metafile = 0; - wxASSERT_MSG( file.IsEmpty() , "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::IsOk() const +{ + return (M_METAFILEDATA && (M_METAFILEDATA->m_metafile != NULL)); +} + +WXHMETAFILE wxMetaFile::GetHMETAFILE() const +{ + return (WXHMETAFILE) M_METAFILEDATA->m_metafile; +} + bool wxMetaFile::SetClipboard(int width, int height) { - if (!m_refData) - return FALSE; -/* - bool alreadyOpen=wxClipboardOpen(); + bool success = true; + +#if wxUSE_DRAG_AND_DROP + // TODO: to finish this port, we need the data object first + if (m_refData == NULL) + 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; + +#ifndef __LP64__ + 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 +#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 (dc->GetHDC() && M_METAFILEDATA->m_metafile) - PlayMetaFile((HDC) dc->GetHDC(), (HMETAFILE) M_METAFILEDATA->m_metafile); + { +#if wxMAC_USE_CORE_GRAPHICS +#ifndef __LP64__ + QDPictRef cgPictRef = M_METAFILEDATA->m_qdPictRef; + CGContextRef cg = (CGContextRef) dc->GetGraphicsContext()->GetNativeContext(); + CGRect bounds = QDPictGetBounds( cgPictRef ); + + CGContextSaveGState( cg ); + CGContextTranslateCTM( cg, 0, bounds.size.width ); + CGContextScaleCTM( cg, 1, -1 ); + QDPictDrawToCGContext( cg, bounds, cgPictRef ); + CGContextRestoreGState( cg ); +#endif +#else + PicHandle pict = (PicHandle)GetHMETAFILE(); + wxMacPortSetter helper( dc ); + Rect picFrame; + DrawPicture( pict, wxMacGetPictureBounds( pict, &picFrame ) ); +#endif + } - dc->EndDrawing(); -*/ - return TRUE; + return true; } -/* - * Metafile device context - * - */ - -// 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) +wxSize wxMetaFile::GetSize() const { - m_metaFile = NULL; - m_minX = 10000; - m_minY = 10000; - m_maxX = -10000; - m_maxY = -10000; - - wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ; + wxSize dataSize = wxDefaultSize; - m_metaFile = new wxMetaFile("") ; - Rect r={0,0,100,100} ; - - m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ; - ::GetPort( &m_macPort ) ; - m_ok = TRUE ; + if (Ok()) + { +#ifndef __LP64__ + PicHandle pict = (PicHandle)GetHMETAFILE(); + Rect r; + wxMacGetPictureBounds( pict, &r ); + dataSize.x = r.right - r.left; + dataSize.y = r.bottom - r.top; +#endif + } - SetMapMode(wxMM_TEXT); + return dataSize; } +// 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& file, int xext, int yext, int xorg, int yorg) +wxMetaFileDC::wxMetaFileDC( + const wxString& filename, + int width, int height, + const wxString& WXUNUSED(description) ) { - m_minX = 10000; - m_minY = 10000; - m_maxX = -10000; - m_maxY = -10000; + 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 ); + +#if wxMAC_USE_CORE_GRAPHICS +#else + Rect r = { 0, 0, height, width }; - wxASSERT_MSG( file.IsEmpty() , "no file based metafile support yet") ; + RectRgn( (RgnHandle)m_macBoundaryClipRgn, &r ); + CopyRgn( (RgnHandle)m_macBoundaryClipRgn, (RgnHandle)m_macCurrentClipRgn ); - m_metaFile = new wxMetaFile("") ; - Rect r={yorg,xorg,yorg+yext,xorg+xext} ; - - m_metaFile->SetHMETAFILE( OpenPicture( &r ) ) ; - ::GetPort( &m_macPort ) ; - m_ok = TRUE ; + m_metaFile->SetHMETAFILE( (WXHMETAFILE)OpenPicture( &r ) ); + ::GetPort( (GrafPtr*)&m_macPort ); - SetMapMode(wxMM_TEXT); + m_ok = true; +#endif + + SetMapMode( wxMM_TEXT ); } wxMetaFileDC::~wxMetaFileDC() { } +void wxMetaFileDC::DoGetSize(int *width, int *height) const +{ + 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; +} + wxMetaFile *wxMetaFileDC::Close() { - ClosePicture() ; - return m_metaFile; +#ifndef __LP64__ + ClosePicture(); +#endif + return m_metaFile; +} + +#if wxUSE_DATAOBJ +size_t wxMetafileDataObject::GetDataSize() const +{ + return GetHandleSize( (Handle) (*((wxMetafile*)&m_metafile)).GetHMETAFILE() ); } +bool wxMetafileDataObject::GetDataHere(void *buf) const +{ + 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; +} +#endif #endif